From 08283880395a7f7e9095553be77551869a8f084e Mon Sep 17 00:00:00 2001 From: Marlon Costa Date: Sat, 29 Aug 2026 19:22:18 -0300 Subject: [PATCH] chore(codegen): adopt the pending regeneration and reach the generator fixed point MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The working tree carried an unfinished regeneration on the integration branch (`.github/workflows/ci.yml`, `.gitignore`, `.mise.toml`, `Makefile`, `mise.lock`, `pyproject.toml`, plus an untracked `.shellcheckrc`). Left uncommitted it makes every branch switch in this checkout unsafe and leaves the integration branch describing a generation state it does not have. This adopts that work and completes it against the current generator, so the repository is a fixed point again. Evidence: `make setup` → 0; `make gen WHAT=apply APPLY=Y` ×2 → 0; `make gen WHAT=check` → 0; `make fmt` → 0; `make fix` → 0; `make check` → 0. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_015KsQxff1Aa5SZ18cSron71 --- .github/workflows/ci.yml | 9 + .gitignore | 59 ++++- .mise.toml | 4 +- .shellcheckrc | 18 ++ Makefile | 216 ++++++++++-------- mise.lock | 84 +++++-- pyproject.toml | 18 +- .../_base/flextclimodelsbase_part_01.py | 12 +- .../_base/flextclimodelsbase_part_02.py | 8 +- src/flext_cli/_models/docx_document.py | 3 +- src/flext_cli/_models/pipeline.py | 11 +- src/flext_cli/_models/pptx_presentation.py | 3 +- src/flext_cli/_protocols/domain.py | 4 +- .../_xlxx/xlsx_snapshot_structure.py | 17 +- src/flext_cli/_utilities/pipeline.py | 6 +- uv.lock | 18 +- 16 files changed, 309 insertions(+), 181 deletions(-) create mode 100644 .shellcheckrc diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8051f128..becc1215 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -43,6 +43,9 @@ jobs: timeout-minutes: 60 env: CI: Y + # The credential helper installed below reads the token from the + # environment of every later step, so it is a job-level value. + GH_TOKEN: ${{ github.token }} steps: - name: Checkout uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 @@ -50,6 +53,12 @@ jobs: submodules: false fetch-depth: 0 + # Codegen refreshes the declared provider baseline before comparison. + # actions/checkout deliberately does not persist credentials, so install + # the runner's scoped token through the GitHub CLI's Git credential owner. + - name: Configure GitHub authentication + run: gh auth setup-git + - name: Install mise toolchain uses: jdx/mise-action@3c2e0cf82a5b2e5249f0d3635a4d83d0ae861518 # v4.2.5 with: diff --git a/.gitignore b/.gitignore index 15f5c2c0..283011f7 100644 --- a/.gitignore +++ b/.gitignore @@ -15,12 +15,6 @@ # BLOCK: AI/Agent Local Data (NEVER track these) .claude/* -# BLOCK: Agent surface outside the workspace root -.agents/ - -# Skill scan reports (transient, regenerated by skill_validate.py) -.agents/skills/*/report.json - # Aider AI data .aider/ .aider.conf.yml @@ -32,6 +26,55 @@ .copilot/ .codeium/ +# TRACK: agentsctl-governed project projections +!.agents/ +!.agents/projection.json +!.agents/.hooks.json.agents-governance.json +!.agents/hooks.json +!.agents/aihub-hooks/ +!.agents/aihub-hooks/** +!.agents/skills/ +!.agents/skills/** +.agents/skills/*/report.json +!.claude/ +!.claude/.settings.json.agents-governance.json +!.claude/settings.json +!.claude/aihub-hooks/ +!.claude/aihub-hooks/** +!.claude/agents/ +!.claude/agents/** +!.claude/commands/ +!.claude/commands/** +!.claude/rules/ +!.claude/rules/** +!.claude/skills/ +!.claude/skills/** +!.codex/ +!.codex/** +!.cursor/ +!.cursor/.hooks.json.agents-governance.json +!.cursor/hooks.json +!.cursor/aihub-hooks/ +!.cursor/aihub-hooks/** +!.cursor/commands/ +!.cursor/commands/** +!.cursor/rules/ +!.cursor/rules/** +!.cursor/skills/ +!.cursor/skills/** +!.gemini/ +!.gemini/** +!.github/agents/ +!.github/agents/** +!.github/hooks/ +!.github/hooks/** +!.github/instructions/ +!.github/instructions/** +!.github/skills/ +!.github/skills/** +!.opencode/ +!.opencode/** + # Oracle dump files **/*.dmp **/*.DMP @@ -237,7 +280,11 @@ legado/ .venv .venv/ .bin/ +.runtime/ .tools/ +bin/* +!bin/mise +!bin/mise.cmd __pycache__/ !.pre-commit-config.yaml diff --git a/.mise.toml b/.mise.toml index b36edc15..260f11df 100644 --- a/.mise.toml +++ b/.mise.toml @@ -16,7 +16,8 @@ locked = true # === SECTION: tools (managed) === # Source: config:python_version, config:codegen.scaffold.project.dev native toolchain floors # (kubectl_version, helm_version, kind_version, taplo_version, ast_grep_version, -# gitleaks_version, tokei_version, qlty_version, beads.selector, beads.version) +# gitleaks_version, tokei_version, kubeconform_version, qlty_version, +# beads.selector, beads.version) [tools] python = "3.13" uv = "0.12" @@ -28,6 +29,7 @@ taplo = "0.10" ast-grep = "0.45" gitleaks = "8.30" tokei = "14.0" +kubeconform = "0.8" # qlty ships no mise registry alias; the github backend selector is the only # resolvable form (bare 'qlty' fails mise install: 'not found in registry'). "github:qltysh/qlty" = "0.642" diff --git a/.shellcheckrc b/.shellcheckrc new file mode 100644 index 00000000..4e8301ae --- /dev/null +++ b/.shellcheckrc @@ -0,0 +1,18 @@ +# FLEXT shellcheck configuration +# SSOT for shell script static analysis in this physical repository. + +shell=bash +enable=add-default-case +enable=avoid-null-sha1 +enable=check-extra-masked-returns +enable=check-set-e-pipefail +enable=check-unassigned-uppercase +enable=deprecate-which +enable=ensure-find-exec-subst +enable=quote-safe-variables +enable=require-variable-braces + +# Disabled by design for repository scripts +disable=SC1090 # sourced files may be dynamic +disable=SC1091 # sourced files may be outside the repository +disable=SC2154 # variables may be assigned in sourced files diff --git a/Makefile b/Makefile index b046d3f0..e019766f 100644 --- a/Makefile +++ b/Makefile @@ -21,6 +21,7 @@ WORKSPACE_ROOT_REL := . # Source: config:workspace_subprojects (list), config:workspace_repositories (list) # Computed: MANAGED_GITLINKS mirrors the read-only local .gitmodules topology. WORKSPACE_SUBPROJECTS := +WORKSPACE_ROOT_PACKAGE := Y MANAGED_GITLINKS := WORKSPACE_EDITABLES := $(PROJECT_NAME):. UV_LINK_MODE := copy @@ -42,6 +43,15 @@ MATCH ?= COV ?= PROJECT ?= PROJECTS ?= +# Project selection is an invocation argument, not ambient process state. GNU +# Make exports command-line variables to recipe subprocesses; without this +# boundary, a nested generated Makefile adopts its caller's unrelated project. +ifeq ($(filter command line override,$(origin PROJECT)),) +override PROJECT := +endif +ifeq ($(filter command line override,$(origin PROJECTS)),) +override PROJECTS := +endif BASE ?= BRANCH ?= PYTEST_ARGS ?= @@ -183,13 +193,14 @@ _ALLOWED_WHATS_mod := check all apply $(_CUSTOM_WHATS_mod) CHECK_GATES_ALLOWED := lint pyrefly mypy pyright security markdown smells CHECK_GATES_DEFAULT := lint pyrefly mypy pyright security markdown smells +CHECK_GATES_FIXABLE := markdown,smells DOCS_ACTIONS := fix audit build validate # End SECTION: verb dispatch # === SECTION: lint/type paths (managed) === # Source: template + computed (script_dispatch conditional) -RUFF_PATHS := $(PROJECT_ROOT)/src $(PROJECT_ROOT)/tests -MYPY_PATHS := $(PROJECT_ROOT)/src $(PROJECT_ROOT)/tests +RUFF_PATHS := $(strip $(foreach d,src tests,$(if $(wildcard $(PROJECT_ROOT)/$(d)/.),$(PROJECT_ROOT)/$(d),))) +MYPY_PATHS := $(strip $(foreach d,src tests,$(if $(wildcard $(PROJECT_ROOT)/$(d)/.),$(PROJECT_ROOT)/$(d),))) # End SECTION: lint/type paths # === SECTION: infra bootstrap (managed) === @@ -203,11 +214,9 @@ CALLER_VIRTUAL_ENV := $(patsubst %/,%,$(VIRTUAL_ENV)) ifeq ($(GEN_INIT_ONLY),Y) FLEXT_INFRA_BOOTSTRAP_REQUIREMENT := FLEXT_INFRA_SOURCE_ROOT_REL := -UV_BOOTSTRAP_FLAGS := else FLEXT_INFRA_BOOTSTRAP_REQUIREMENT := flext-infra @ git+https://github.com/flext-sh/flext-infra.git@0.12.0-dev FLEXT_INFRA_SOURCE_ROOT_REL := -UV_BOOTSTRAP_FLAGS := --isolated --all-groups --all-extras endif # End SECTION: infra bootstrap @@ -315,14 +324,18 @@ _bootstrap_setup_tools: trap 'rm -rf -- "$$scratch"' EXIT HUP INT TERM; \ global_config="$$scratch/global-config.toml"; \ config_dir="$$scratch/config"; \ + config_ceiling=$$(dirname "$$project_root"); \ mkdir -p "$$config_dir"; \ : > "$$global_config"; \ MISE_CONFIG_DIR="$$config_dir" MISE_GLOBAL_CONFIG_FILE="$$global_config" \ + MISE_CEILING_PATHS="$$config_ceiling" \ "$$mise" trust "$$project_root/.mise.toml"; \ MISE_CONFIG_DIR="$$config_dir" MISE_GLOBAL_CONFIG_FILE="$$global_config" \ + MISE_CEILING_PATHS="$$config_ceiling" \ "$$mise" -C "$$project_root" install --locked --yes; \ uv_actual=$$(MISE_CONFIG_DIR="$$config_dir" \ MISE_GLOBAL_CONFIG_FILE="$$global_config" \ + MISE_CEILING_PATHS="$$config_ceiling" \ "$$mise" -C "$$project_root" \ exec -- uv --version | sed 's/uv //' | cut -d ' ' -f 1); \ case "$$uv_actual" in \ @@ -333,10 +346,10 @@ _bootstrap_setup_tools: ifneq ($(strip $(FLEXT_INFRA_SOURCE_ROOT_REL)),) FLEXT_INFRA_SOURCE_ROOT := $(abspath $(PROJECT_ROOT)/$(FLEXT_INFRA_SOURCE_ROOT_REL)) -FLEXT_INFRA_BOOTSTRAP := env -u PYTHONPATH -u MYPYPATH -u VIRTUAL_ENV -u UV_PROJECT -u UV_PROJECT_ENVIRONMENT PATH="$(SANITIZED_CALLER_PATH)" $(UV) run --project "$(PROJECT_ROOT)" $(UV_BOOTSTRAP_FLAGS) --with-editable "$(FLEXT_INFRA_SOURCE_ROOT)" python -m flext_infra +FLEXT_INFRA_BOOTSTRAP := env -u PYTHONPATH -u MYPYPATH -u VIRTUAL_ENV -u UV_PROJECT -u UV_PROJECT_ENVIRONMENT PATH="$(SANITIZED_CALLER_PATH)" $(UV) run --no-project --with-editable "$(FLEXT_INFRA_SOURCE_ROOT)" python -m flext_infra else FLEXT_INFRA_SOURCE_ROOT := -FLEXT_INFRA_BOOTSTRAP := env -u PYTHONPATH -u MYPYPATH -u VIRTUAL_ENV -u UV_PROJECT -u UV_PROJECT_ENVIRONMENT PATH="$(SANITIZED_CALLER_PATH)" $(UV) run --project "$(PROJECT_ROOT)" $(UV_BOOTSTRAP_FLAGS) --with "$(FLEXT_INFRA_BOOTSTRAP_REQUIREMENT)" python -m flext_infra +FLEXT_INFRA_BOOTSTRAP := env -u PYTHONPATH -u MYPYPATH -u VIRTUAL_ENV -u UV_PROJECT -u UV_PROJECT_ENVIRONMENT PATH="$(SANITIZED_CALLER_PATH)" $(UV) run --no-project --with "$(FLEXT_INFRA_BOOTSTRAP_REQUIREMENT)" python -m flext_infra endif ifeq ($(MAKE_PROFILE),workspace) @@ -369,14 +382,13 @@ SETUP_ENVIRONMENT_RECIPE = set -eu; \ WORKSPACE_ORCHESTRATE = $(UV_RUN) python -m flext_infra workspace orchestrate REQUESTED_PROJECTS := $(strip $(if $(PROJECT),$(PROJECT),$(PROJECTS))) -# A workspace root owns no local gate implementation: its verbs fan out to the -# declared subprojects. Selecting the root (PROJECT=.) would make it orchestrate -# itself forever; map `.` to WORKSPACE_SUBPROJECTS instead of failing closed mid-CI. -DEFAULT_PROJECTS := $(WORKSPACE_SUBPROJECTS) . +DEFAULT_PROJECTS := . SELECTED_PROJECTS := $(if $(strip $(REQUESTED_PROJECTS)),$(REQUESTED_PROJECTS),$(DEFAULT_PROJECTS)) -WORKSPACE_PROJECT_ARGS := $(foreach project,$(SELECTED_PROJECTS),--projects $(project)) +SELECTED_ROOT_PROJECT := $(filter .,$(SELECTED_PROJECTS)) +SELECTED_SUBPROJECTS := $(filter-out .,$(SELECTED_PROJECTS)) +WORKSPACE_PROJECT_ARGS := $(foreach project,$(SELECTED_SUBPROJECTS),--projects $(project)) WORKSPACE_CHECK_ARGS := $(if $(strip $(CHECK_GATES)),--make-arg "CHECK_GATES=$(strip $(CHECK_GATES))") WORKSPACE_TEST_ARGS := $(if $(strip $(FLEXT_PYTEST_FILE_RAW)),--file "$${FLEXT_PYTEST_FILE_RAW}") $(if $(strip $(FLEXT_PYTEST_MATCH_RAW)),--match "$${FLEXT_PYTEST_MATCH_RAW}") $(if $(strip $(FLEXT_PYTEST_WHAT_RAW)),--what "$${FLEXT_PYTEST_WHAT_RAW}") DOCS_PROJECT_ARGS := $(foreach project,$(REQUESTED_PROJECTS),--projects $(project)) @@ -385,7 +397,7 @@ ORCHESTRATED_VERBS := build check clean docs fmt fix scan test val # Prefer PROJECT_ROOT/src so the Makefile owner always wins over any stale # editable metadata inside its checkout-local environment (terminus T4 / # path-purity). -UV_RUN := env -u MYPYPATH -u VIRTUAL_ENV -u UV_PROJECT -u UV_PROJECT_ENVIRONMENT PYTHONPATH="$(PROJECT_ROOT)/src" $(UV) run --project "$(RUNTIME_ROOT)" --no-sync +UV_RUN := env -u MYPYPATH -u VIRTUAL_ENV -u UV_PROJECT -u UV_PROJECT_ENVIRONMENT UV_PROJECT_ENVIRONMENT="$(RUNTIME_VENV)" PYTHONPATH="$(PROJECT_ROOT)/src" $(UV) run --project "$(RUNTIME_ROOT)" --no-sync PROJECT_INFRA_PYTHONPATH ?= $(MAKEFILE_ROOT)/src PROJECT_FLEXT_INFRA := test -x "$(FLEXT_INFRA_PYTHON)" || { printf 'ERROR: FLEXT_INFRA_PYTHON must name an executable managed Python\n' >&2; exit 2; }; env -u PYTHONPATH -u MYPYPATH -u VIRTUAL_ENV -u UV_PROJECT -u UV_PROJECT_ENVIRONMENT PATH="$(dir $(FLEXT_INFRA_PYTHON)):$(SANITIZED_CALLER_PATH)" PYTHONPATH="$(PROJECT_INFRA_PYTHONPATH)" $(FLEXT_INFRA_PYTHON) -m flext_infra # Scaffold dev tools live in the validated optional dev @@ -864,6 +876,7 @@ _builtin_fix_check: _builtin_require_environment _builtin_fix_all: _builtin_require_environment $(call _require_apply) @$(UV_RUN) ruff check --fix $(RUFF_PATHS) + @$(PROJECT_FLEXT_INFRA) check run --workspace "$(PROJECT_ROOT)" --gates "$(CHECK_GATES_FIXABLE)" --projects . --fix _builtin_fix_apply: _builtin_fix_all @@ -930,105 +943,119 @@ _builtin_release_status: _builtin_require_environment @git -C "$(PROJECT_ROOT)" diff --quiet @git -C "$(PROJECT_ROOT)" diff --cached --quiet -# Generation has one owner. Conform preserves the caller's scope and applies -# the complete dependency/tooling projection before it verifies its fixed point. -# Dependency upgrades remain a separate explicit verb because they rewrite lock -# floors; gen must never run a second pyproject writer over conform's result. -define _mise_launcher_apply +# Generation stages every external/tool output before the first repository +# write. A failed launcher or lock preflight therefore leaves conform outputs, +# docs, launchers and lockfiles untouched; publication only consumes the fully +# validated transaction directory. +.PHONY: _builtin_gen_stage_mise _builtin_gen_publish_mise + +_builtin_gen_stage_mise: @set -eu; \ - scratch_parent="$(PROJECT_ROOT)/.test-tmp"; \ - mkdir -p "$$scratch_parent"; \ - scratch=$$(mktemp -d "$$scratch_parent/mise-launcher.XXXXXX"); \ - trap 'rm -rf -- "$$scratch"' EXIT HUP INT TERM; \ - mkdir -p "$$scratch/data" "$$scratch/cache" "$$scratch/state" "$$scratch/tmp"; \ - : > "$$scratch/global-config.toml"; \ - if MISE_GLOBAL_CONFIG_FILE="$$scratch/global-config.toml" \ - XDG_CACHE_HOME="$$scratch/cache" XDG_STATE_HOME="$$scratch/state" \ - MISE_DATA_DIR="$$scratch/data" MISE_CACHE_DIR="$$scratch/cache" \ - MISE_STATE_DIR="$$scratch/state" TMPDIR="$$scratch/tmp" \ - MISE_CEILING_PATHS="$$scratch_parent" MISE_TRUSTED_CONFIG_PATHS="$$scratch" \ - "$(SETUP_MISE)" -C "$$scratch" generate install-script \ + transaction="$(MISE_TRANSACTION_DIR)"; \ + [ -n "$$transaction" ] && [ -d "$$transaction" ] || { \ + printf 'ERROR: missing Mise transaction directory\n' >&2; exit 2; \ + }; \ + mkdir -p "$$transaction/launcher/data" "$$transaction/launcher/cache" \ + "$$transaction/launcher/state" "$$transaction/launcher/tmp" \ + "$$transaction/locks"; \ + : > "$$transaction/launcher/global-config.toml"; \ + if MISE_GLOBAL_CONFIG_FILE="$$transaction/launcher/global-config.toml" \ + XDG_CACHE_HOME="$$transaction/launcher/cache" \ + XDG_STATE_HOME="$$transaction/launcher/state" \ + MISE_DATA_DIR="$$transaction/launcher/data" \ + MISE_CACHE_DIR="$$transaction/launcher/cache" \ + MISE_STATE_DIR="$$transaction/launcher/state" \ + TMPDIR="$$transaction/launcher/tmp" \ + MISE_CEILING_PATHS="$$transaction" \ + MISE_TRUSTED_CONFIG_PATHS="$$transaction/launcher" \ + "$(SETUP_MISE)" -C "$$transaction/launcher" generate install-script \ --version "$(SETUP_MISE_VERSION)" \ - --write "$$scratch/mise" --windows \ - >"$$scratch/generate.log" 2>&1; then \ - cat "$$scratch/generate.log"; \ + --write "$$transaction/launcher/mise" --windows \ + >"$$transaction/launcher/generate.log" 2>&1; then \ + cat "$$transaction/launcher/generate.log"; \ else \ - status=$$?; cat "$$scratch/generate.log"; exit "$$status"; \ + status=$$?; cat "$$transaction/launcher/generate.log"; exit "$$status"; \ fi; \ - if grep -F 'mise WARN' "$$scratch/generate.log" >/dev/null; then \ + if grep -F 'mise WARN' "$$transaction/launcher/generate.log" >/dev/null; then \ printf 'ERROR: Mise launcher generation emitted warnings\n' >&2; exit 2; \ fi; \ + index=0; \ for project in $(MISE_LOCK_PROJECTS); do \ if [ "$$project" = . ]; then project_root="$(PROJECT_ROOT)"; \ else project_root="$(PROJECT_ROOT)/$$project"; fi; \ [ -f "$$project_root/.mise.toml" ] || { \ printf 'ERROR: missing generated .mise.toml in %s\n' "$$project_root" >&2; exit 2; \ }; \ - mkdir -p "$$project_root/bin"; \ - shell_tmp="$$project_root/bin/.mise.new.$$$$"; \ - windows_tmp="$$project_root/bin/.mise.cmd.new.$$$$"; \ - cp "$$scratch/mise" "$$shell_tmp"; \ - cp "$$scratch/mise.cmd" "$$windows_tmp"; \ - chmod +x "$$shell_tmp"; \ - mv -f "$$shell_tmp" "$$project_root/bin/mise"; \ - mv -f "$$windows_tmp" "$$project_root/bin/mise.cmd"; \ - done -endef - -define _mise_lock_apply - @set -eu; \ - credential_command="$${MISE_GITHUB_CREDENTIAL_COMMAND:-}"; \ - if [ -z "$${MISE_GITHUB_TOKEN:-}$${GITHUB_API_TOKEN:-}$${GITHUB_TOKEN:-}$$credential_command" ]; then \ - credential_command=$$("$(SETUP_MISE)" settings get github.credential_command); \ - fi; \ - for project in $(MISE_LOCK_PROJECTS); do \ - if [ "$$project" = . ]; then project_root="$(PROJECT_ROOT)"; \ - else project_root="$(PROJECT_ROOT)/$$project"; fi; \ - [ -f "$$project_root/.mise.toml" ] || { \ - printf 'ERROR: missing generated .mise.toml in %s\n' "$$project_root" >&2; exit 2; \ - }; \ - scratch_parent="$$project_root/.test-tmp"; mkdir -p "$$scratch_parent"; \ - scratch=$$(mktemp -d "$$scratch_parent/mise-lock.XXXXXX"); \ - trap 'rm -rf -- "$$scratch"' EXIT HUP INT TERM; \ - cp "$$project_root/.mise.toml" "$$scratch/.mise.toml"; \ - locked_count=$$(grep -Fxc 'locked = true' "$$scratch/.mise.toml"); \ + lock_root="$$transaction/locks/$$index"; \ + mkdir -p "$$lock_root/data" "$$lock_root/cache" \ + "$$lock_root/state" "$$lock_root/tmp"; \ + cp "$$project_root/.mise.toml" "$$lock_root/.mise.toml"; \ + locked_count=$$(grep -Fxc 'locked = true' "$$lock_root/.mise.toml"); \ [ "$$locked_count" -eq 1 ] || { \ printf 'ERROR: expected one locked tool_config setting in %s\n' "$$project_root/.mise.toml" >&2; exit 2; \ }; \ - sed -i 's/^locked = true$$/locked = false/' "$$scratch/.mise.toml"; \ - mkdir -p "$$scratch/data" "$$scratch/cache" \ - "$$scratch/state" "$$scratch/tmp"; \ - : > "$$scratch/global-config.toml"; \ - if MISE_GITHUB_CREDENTIAL_COMMAND="$$credential_command" \ - MISE_GLOBAL_CONFIG_FILE="$$scratch/global-config.toml" \ - XDG_CACHE_HOME="$$scratch/cache" XDG_STATE_HOME="$$scratch/state" \ - MISE_DATA_DIR="$$scratch/data" MISE_CACHE_DIR="$$scratch/cache" \ - MISE_STATE_DIR="$$scratch/state" TMPDIR="$$scratch/tmp" \ - MISE_CEILING_PATHS="$$scratch_parent" MISE_TRUSTED_CONFIG_PATHS="$$scratch" \ - "$(SETUP_MISE)" -C "$$scratch" lock \ - --platform "$(MISE_LOCK_PLATFORMS)" >"$$scratch/lock.log" 2>&1; then \ - cat "$$scratch/lock.log"; \ + sed -i 's/^locked = true$$/locked = false/' "$$lock_root/.mise.toml"; \ + : > "$$lock_root/global-config.toml"; \ + if MISE_GLOBAL_CONFIG_FILE="$$lock_root/global-config.toml" \ + XDG_CACHE_HOME="$$lock_root/cache" XDG_STATE_HOME="$$lock_root/state" \ + MISE_DATA_DIR="$$lock_root/data" MISE_CACHE_DIR="$$lock_root/cache" \ + MISE_STATE_DIR="$$lock_root/state" TMPDIR="$$lock_root/tmp" \ + MISE_CEILING_PATHS="$$transaction" MISE_TRUSTED_CONFIG_PATHS="$$lock_root" \ + "$(SETUP_MISE)" -C "$$lock_root" lock \ + --platform "$(MISE_LOCK_PLATFORMS)" >"$$lock_root/lock.log" 2>&1; then \ + cat "$$lock_root/lock.log"; \ else \ - status=$$?; cat "$$scratch/lock.log"; exit "$$status"; \ + status=$$?; cat "$$lock_root/lock.log"; exit "$$status"; \ fi; \ - if grep -F 'mise WARN' "$$scratch/lock.log" >/dev/null; then \ + if grep -F 'mise WARN' "$$lock_root/lock.log" >/dev/null; then \ printf 'ERROR: Mise lock generation emitted warnings for %s\n' "$$project_root" >&2; exit 2; \ fi; \ - $(PROJECT_FLEXT_INFRA) codegen mise-artifacts \ - --workspace "$$scratch" --apply; \ + $(FLEXT_INFRA_BOOTSTRAP) codegen mise-artifacts \ + --workspace "$$lock_root" --apply; \ + [ -f "$$lock_root/mise.lock" ] || { \ + printf 'ERROR: staged Mise lock is missing for %s\n' "$$project_root" >&2; exit 2; \ + }; \ + index=$$((index + 1)); \ + done + +_builtin_gen_publish_mise: + @set -eu; \ + transaction="$(MISE_TRANSACTION_DIR)"; \ + [ -f "$$transaction/launcher/mise" ] \ + && [ -f "$$transaction/launcher/mise.cmd" ] || { \ + printf 'ERROR: staged Mise launchers are incomplete\n' >&2; exit 2; \ + }; \ + index=0; \ + for project in $(MISE_LOCK_PROJECTS); do \ + [ -f "$$transaction/locks/$$index/mise.lock" ] || { \ + printf 'ERROR: staged Mise lock is missing for %s\n' "$$project" >&2; exit 2; \ + }; \ + index=$$((index + 1)); \ + done; \ + index=0; \ + for project in $(MISE_LOCK_PROJECTS); do \ + if [ "$$project" = . ]; then project_root="$(PROJECT_ROOT)"; \ + else project_root="$(PROJECT_ROOT)/$$project"; fi; \ + mkdir -p "$$project_root/bin"; \ + shell_tmp="$$project_root/bin/.mise.new.$$$$"; \ + windows_tmp="$$project_root/bin/.mise.cmd.new.$$$$"; \ lock_tmp="$$project_root/.mise.lock.new.$$$$"; \ - cp "$$scratch/mise.lock" "$$lock_tmp"; \ + cp "$$transaction/launcher/mise" "$$shell_tmp"; \ + cp "$$transaction/launcher/mise.cmd" "$$windows_tmp"; \ + cp "$$transaction/locks/$$index/mise.lock" "$$lock_tmp"; \ + chmod +x "$$shell_tmp"; \ + mv -f "$$shell_tmp" "$$project_root/bin/mise"; \ + mv -f "$$windows_tmp" "$$project_root/bin/mise.cmd"; \ mv -f "$$lock_tmp" "$$project_root/mise.lock"; \ - rm -rf -- "$$scratch"; trap - EXIT HUP INT TERM; \ + index=$$((index + 1)); \ done -endef define _mise_artifacts_check @set -eu; \ for project in $(MISE_LOCK_PROJECTS); do \ if [ "$$project" = . ]; then project_root="$(PROJECT_ROOT)"; \ else project_root="$(PROJECT_ROOT)/$$project"; fi; \ - $(PROJECT_FLEXT_INFRA) codegen mise-artifacts \ + $(FLEXT_INFRA_BOOTSTRAP) codegen mise-artifacts \ --workspace "$$project_root" --check; \ if [ "$$project" != . ]; then \ cmp -s "$(PROJECT_ROOT)/bin/mise" "$$project_root/bin/mise" || { \ @@ -1042,11 +1069,11 @@ define _mise_artifacts_check endef define _generated_docs - @$(PROJECT_FLEXT_INFRA) docs generate --workspace "$(PROJECT_ROOT)" --output-dir "$(PROJECT_ROOT)/.reports/docs" $(1) $(DOCS_PROJECT_ARGS) + @$(FLEXT_INFRA_BOOTSTRAP) docs generate --workspace "$(PROJECT_ROOT)" --output-dir "$(PROJECT_ROOT)/.reports/docs" $(1) $(DOCS_PROJECT_ARGS) endef -_builtin_gen_check: _builtin_require_environment - @$(PROJECT_FLEXT_INFRA) codegen conform --root "$(PROJECT_ROOT)" --scope "$(CODEGEN_SCOPE)" --mode check +_builtin_gen_check: + @$(FLEXT_INFRA_BOOTSTRAP) codegen conform --root "$(PROJECT_ROOT)" --scope "$(CODEGEN_SCOPE)" --mode check $(call _generated_docs,--check) $(call _mise_artifacts_check) @@ -1057,10 +1084,19 @@ _builtin_gen_init: _builtin_gen_all: $(call _require_apply) - @$(PROJECT_FLEXT_INFRA) codegen conform --root "$(PROJECT_ROOT)" --scope "$(CODEGEN_SCOPE)" --mode apply - $(call _generated_docs,--apply) - $(call _mise_launcher_apply) - $(call _mise_lock_apply) + @set -eu; \ + scratch_parent="$(PROJECT_ROOT)/.test-tmp"; \ + mkdir -p "$$scratch_parent"; \ + transaction=$$(mktemp -d "$$scratch_parent/mise-transaction.XXXXXX"); \ + trap 'rm -rf -- "$$transaction"' EXIT HUP INT TERM; \ + $(SELF_MAKE) _builtin_gen_stage_mise \ + MISE_TRANSACTION_DIR="$$transaction"; \ + $(FLEXT_INFRA_BOOTSTRAP) codegen conform --root "$(PROJECT_ROOT)" --scope "$(CODEGEN_SCOPE)" --mode apply; \ + $(FLEXT_INFRA_BOOTSTRAP) docs generate --workspace "$(PROJECT_ROOT)" \ + --output-dir "$(PROJECT_ROOT)/.reports/docs" \ + --apply $(DOCS_PROJECT_ARGS); \ + $(SELF_MAKE) _builtin_gen_publish_mise \ + MISE_TRANSACTION_DIR="$$transaction" $(call _generated_docs,--check) $(call _mise_artifacts_check) diff --git a/mise.lock b/mise.lock index 942d6c5d..dcfb44cf 100644 --- a/mise.lock +++ b/mise.lock @@ -274,6 +274,46 @@ checksum = "sha256:2c3a9ff954de16244380778683cf99e271bfc2fac9c6c4e797e4623c45e59 url = "https://github.com/kubernetes-sigs/kind/releases/download/v0.31.0/kind-windows-amd64" url_api = "https://api.github.com/repos/kubernetes-sigs/kind/releases/assets/330009913" +[[tools.kubeconform]] +version = "0.8.0" +backend = "aqua:yannh/kubeconform" +specifiers = ["0.8"] + +[tools.kubeconform."platforms.linux-arm64"] +checksum = "sha256:1f53fc8e81258197a35e8603054162a5af1de8c5af13746c71ab680d9534ed87" +url = "https://github.com/yannh/kubeconform/releases/download/v0.8.0/kubeconform-linux-arm64.tar.gz" +url_api = "https://api.github.com/repos/yannh/kubeconform/releases/assets/438612685" + +[tools.kubeconform."platforms.linux-arm64-musl"] +checksum = "sha256:1f53fc8e81258197a35e8603054162a5af1de8c5af13746c71ab680d9534ed87" +url = "https://github.com/yannh/kubeconform/releases/download/v0.8.0/kubeconform-linux-arm64.tar.gz" +url_api = "https://api.github.com/repos/yannh/kubeconform/releases/assets/438612685" + +[tools.kubeconform."platforms.linux-x64"] +checksum = "sha256:9bc2bffbf71f261128533edaf912153948b7ff238f9a531ae6d34466ec287883" +url = "https://github.com/yannh/kubeconform/releases/download/v0.8.0/kubeconform-linux-amd64.tar.gz" +url_api = "https://api.github.com/repos/yannh/kubeconform/releases/assets/438612666" + +[tools.kubeconform."platforms.linux-x64-musl"] +checksum = "sha256:9bc2bffbf71f261128533edaf912153948b7ff238f9a531ae6d34466ec287883" +url = "https://github.com/yannh/kubeconform/releases/download/v0.8.0/kubeconform-linux-amd64.tar.gz" +url_api = "https://api.github.com/repos/yannh/kubeconform/releases/assets/438612666" + +[tools.kubeconform."platforms.macos-arm64"] +checksum = "sha256:f84f4dfbebf4a6b0b230385fa065a39ea35e02608c2b50d025dcf64775a69d67" +url = "https://github.com/yannh/kubeconform/releases/download/v0.8.0/kubeconform-darwin-arm64.tar.gz" +url_api = "https://api.github.com/repos/yannh/kubeconform/releases/assets/438612680" + +[tools.kubeconform."platforms.macos-x64"] +checksum = "sha256:71dbc87ac9f24099a62b93570e65aa06312ba6ac8aea63b7f86e9d999edf5a92" +url = "https://github.com/yannh/kubeconform/releases/download/v0.8.0/kubeconform-darwin-amd64.tar.gz" +url_api = "https://api.github.com/repos/yannh/kubeconform/releases/assets/438612679" + +[tools.kubeconform."platforms.windows-x64"] +checksum = "sha256:e3f56102bcf4f50b034a567e2482a1c5330799983ddd655952310211aef73d93" +url = "https://github.com/yannh/kubeconform/releases/download/v0.8.0/kubeconform-windows-amd64.zip" +url_api = "https://api.github.com/repos/yannh/kubeconform/releases/assets/438612665" + [[tools.kubectl]] version = "1.32.13" backend = "aqua:kubernetes/kubernetes/kubectl" @@ -393,48 +433,48 @@ backend = "cargo:tokei" specifiers = ["14.0"] [[tools.uv]] -version = "0.12.6" +version = "0.12.7" backend = "aqua:astral-sh/uv" specifiers = ["0.12"] [tools.uv."platforms.linux-arm64"] -checksum = "sha256:d58030acd26159499ac82f32da12d1b3c12a3a1bfc414232d9082070c03e128d" -url = "https://github.com/astral-sh/uv/releases/download/0.12.6/uv-aarch64-unknown-linux-gnu.tar.gz" -url_api = "https://api.github.com/repos/astral-sh/uv/releases/assets/529690727" +checksum = "sha256:66393193038dd7eb108abd7a218d9cec04ac70ab98242b0720fa94de19223b7c" +url = "https://github.com/astral-sh/uv/releases/download/0.12.7/uv-aarch64-unknown-linux-gnu.tar.gz" +url_api = "https://api.github.com/repos/astral-sh/uv/releases/assets/532935189" provenance = "github-attestations" [tools.uv."platforms.linux-arm64-musl"] -checksum = "sha256:3719891de9ab41c878a84331e55826d2a46421976a346a65326513a6795b089a" -url = "https://github.com/astral-sh/uv/releases/download/0.12.6/uv-aarch64-unknown-linux-musl.tar.gz" -url_api = "https://api.github.com/repos/astral-sh/uv/releases/assets/529690733" +checksum = "sha256:6dcf60e3c085de88ace3671b949ca99f0652be561ff5627f0d21394140f041db" +url = "https://github.com/astral-sh/uv/releases/download/0.12.7/uv-aarch64-unknown-linux-musl.tar.gz" +url_api = "https://api.github.com/repos/astral-sh/uv/releases/assets/532935192" provenance = "github-attestations" [tools.uv."platforms.linux-x64"] -checksum = "sha256:8681d8921e7d520fb368991dcf5f9c1905b80f5bf2a265a0ed085c8d8e342477" -url = "https://github.com/astral-sh/uv/releases/download/0.12.6/uv-x86_64-unknown-linux-gnu.tar.gz" -url_api = "https://api.github.com/repos/astral-sh/uv/releases/assets/529690831" +checksum = "sha256:788f18abea7c5f55d6216e4f5613fd89d4d59b631efeec117b2b07fe72f1da21" +url = "https://github.com/astral-sh/uv/releases/download/0.12.7/uv-x86_64-unknown-linux-gnu.tar.gz" +url_api = "https://api.github.com/repos/astral-sh/uv/releases/assets/532935280" provenance = "github-attestations" [tools.uv."platforms.linux-x64-musl"] -checksum = "sha256:14e4172aace66a475062cebec7ca04f497d5619e95325dfcc9e4447b9c516846" -url = "https://github.com/astral-sh/uv/releases/download/0.12.6/uv-x86_64-unknown-linux-musl.tar.gz" -url_api = "https://api.github.com/repos/astral-sh/uv/releases/assets/529690844" +checksum = "sha256:3d64d44ed67da7908dc7f5c4d64ebb44bad326fa17f8a0a52fc9a7793017bbe1" +url = "https://github.com/astral-sh/uv/releases/download/0.12.7/uv-x86_64-unknown-linux-musl.tar.gz" +url_api = "https://api.github.com/repos/astral-sh/uv/releases/assets/532935287" provenance = "github-attestations" [tools.uv."platforms.macos-arm64"] -checksum = "sha256:14b459d51ea2e71eeba28c45a268c922bdf8607fc6455e3f40b4e082895d160d" -url = "https://github.com/astral-sh/uv/releases/download/0.12.6/uv-aarch64-apple-darwin.tar.gz" -url_api = "https://api.github.com/repos/astral-sh/uv/releases/assets/529690707" +checksum = "sha256:127ebdda7ad953cdf198e964b570ea5771b85467ea93eb7cb6d6f8e6f55408f3" +url = "https://github.com/astral-sh/uv/releases/download/0.12.7/uv-aarch64-apple-darwin.tar.gz" +url_api = "https://api.github.com/repos/astral-sh/uv/releases/assets/532935178" provenance = "github-attestations" [tools.uv."platforms.macos-x64"] -checksum = "sha256:2a26ea71bbeff1c7e12c2cc40245c96a041deff276bc921e7038e304d5d3e04c" -url = "https://github.com/astral-sh/uv/releases/download/0.12.6/uv-x86_64-apple-darwin.tar.gz" -url_api = "https://api.github.com/repos/astral-sh/uv/releases/assets/529690817" +checksum = "sha256:06b8ae1da8c2661c5434507a66f8c2b0b835933bf955b5958a9ac357a37d1959" +url = "https://github.com/astral-sh/uv/releases/download/0.12.7/uv-x86_64-apple-darwin.tar.gz" +url_api = "https://api.github.com/repos/astral-sh/uv/releases/assets/532935264" provenance = "github-attestations" [tools.uv."platforms.windows-x64"] -checksum = "sha256:df7cb9f243eae1621400d4fcf5b1b3d90f20e264ece91b64deb3b0078abca6ef" -url = "https://github.com/astral-sh/uv/releases/download/0.12.6/uv-x86_64-pc-windows-msvc.zip" -url_api = "https://api.github.com/repos/astral-sh/uv/releases/assets/529690826" +checksum = "sha256:bf1518af459a3915511a11fdc6e2f43ef9a2afa138b9d498eeb9642fe9d85218" +url = "https://github.com/astral-sh/uv/releases/download/0.12.7/uv-x86_64-pc-windows-msvc.zip" +url_api = "https://api.github.com/repos/astral-sh/uv/releases/assets/532935273" provenance = "github-attestations" diff --git a/pyproject.toml b/pyproject.toml index 8327ec77..ccd8a857 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -581,6 +581,7 @@ mypy = "2026-08-15T03:04:00Z" types-setuptools = "2026-08-13T00:00:00Z" [tool.uv.workspace] +members = [] [tool.vulture] exclude = ["*/_protocols/*"] @@ -615,24 +616,25 @@ dev = [ "hypothesis>=6.125", "isort>=6.0.1", "matplotlib-stubs>=0.3", - "mkdocs>=1.6", + "mkdocs>=1.6.1", + "mkdocs-autorefs>=1.4.4", "mkdocs-awesome-pages-plugin>=2.9", "mkdocs-encryptcontent-plugin>=2", "mkdocs-exclude>=1.0.2", "mkdocs-get-deps>=0.2", - "mkdocs-git-revision-date-localized-plugin>=1.2", + "mkdocs-git-revision-date-localized-plugin>=1.5.3", "mkdocs-literate-nav>=0.6", "mkdocs-macros-plugin>=1", - "mkdocs-material>=9.5", + "mkdocs-material>=9.7.7", "mkdocs-material-extensions>=1.3.1", - "mkdocs-mermaid2-plugin>=1.1", - "mkdocs-minify-plugin>=0.7", + "mkdocs-mermaid2-plugin>=1.2.3", + "mkdocs-minify-plugin>=0.8.0", "mkdocs-print-site-plugin>=0.8", - "mkdocs-redirects>=1.2", + "mkdocs-redirects>=1.2.3", "mkdocs-section-index>=0.3.12", "mkdocs-versioning>=0.2", - "mkdocstrings>=0.24", - "mkdocstrings-python>=1.7", + "mkdocstrings>=1.0.6", + "mkdocstrings-python>=2.0.5", "mypy>=2.3.0", "pip-audit>=2.7.3", "pre-commit>=4.6.1", diff --git a/src/flext_cli/_models/_base/flextclimodelsbase_part_01.py b/src/flext_cli/_models/_base/flextclimodelsbase_part_01.py index 82a07e13..852614ec 100644 --- a/src/flext_cli/_models/_base/flextclimodelsbase_part_01.py +++ b/src/flext_cli/_models/_base/flextclimodelsbase_part_01.py @@ -82,10 +82,7 @@ class DisplayData(m.BaseModel): extra="forbid", validate_assignment=True ) data: Annotated[ - t.JsonMapping, - m.Field( - description="Field-value pairs for display", - ), + t.JsonMapping, m.Field(description="Field-value pairs for display") ] = EMPTY_JSON_MAPPING @u.model_serializer @@ -102,7 +99,7 @@ class LoadedConfig(m.BaseModel): content: Annotated[ t.JsonMapping, m.Field( - description="Loaded configuration content (dict or other JSON value)", + description="Loaded configuration content (dict or other JSON value)" ), ] = EMPTY_JSON_MAPPING @@ -130,10 +127,7 @@ class NormalizedJsonList(m.BaseModel): m.Field(default_factory=dict, description="The normalized JSON value"), ] default: Annotated[ - t.JsonMapping, - m.Field( - description="Default mapping if value is not a dict", - ), + t.JsonMapping, m.Field(description="Default mapping if value is not a dict") ] = EMPTY_JSON_MAPPING @property diff --git a/src/flext_cli/_models/_base/flextclimodelsbase_part_02.py b/src/flext_cli/_models/_base/flextclimodelsbase_part_02.py index 8b17b3b8..dedb3533 100644 --- a/src/flext_cli/_models/_base/flextclimodelsbase_part_02.py +++ b/src/flext_cli/_models/_base/flextclimodelsbase_part_02.py @@ -52,15 +52,11 @@ class ProcessEnvironmentSpec(m.BaseModel): model_config: ClassVar[m.ConfigDict] = m.ConfigDict(extra="forbid", frozen=True) base_env: Annotated[ t.StrMapping, - m.Field( - description="Base environment inherited from the current process", - ), + m.Field(description="Base environment inherited from the current process"), ] = EMPTY_STR_MAPPING overrides: Annotated[ t.StrMapping, - m.Field( - description="Explicit environment overrides for the child process", - ), + m.Field(description="Explicit environment overrides for the child process"), ] = EMPTY_STR_MAPPING remove_keys: Annotated[ t.StrSequence, diff --git a/src/flext_cli/_models/docx_document.py b/src/flext_cli/_models/docx_document.py index 12a0720a..514ff1f5 100644 --- a/src/flext_cli/_models/docx_document.py +++ b/src/flext_cli/_models/docx_document.py @@ -100,8 +100,7 @@ class DocxDocumentPlan(m.FrozenModel): default=(), strict=False, description="Document sections." ) core_properties: t.JsonMapping = m.Field( - default=EMPTY_JSON_MAPPING, - description="Core document properties.", + default=EMPTY_JSON_MAPPING, description="Core document properties." ) class DocxRenderRequest(m.FrozenModel): diff --git a/src/flext_cli/_models/pipeline.py b/src/flext_cli/_models/pipeline.py index 9ef55014..0da2e52a 100644 --- a/src/flext_cli/_models/pipeline.py +++ b/src/flext_cli/_models/pipeline.py @@ -31,10 +31,7 @@ class PipelineStageContext(m.ContractModel): ), ] settings: Annotated[ - t.JsonMapping, - m.Field( - description="Immutable pipeline configuration", - ), + t.JsonMapping, m.Field(description="Immutable pipeline configuration") ] = EMPTY_JSON_MAPPING class PipelineStageSpec(m.ContractModel): @@ -66,6 +63,7 @@ class PipelineStageSpec(m.ContractModel): Callable[[FlextCliModelsPipeline.PipelineStageContext], bool] | None, m.Field(description="Predicate — skip stage if returns True"), ] = None + class PipelineStageResult(m.ContractModel): """What a stage produces after execution.""" @@ -76,10 +74,7 @@ class PipelineStageResult(m.ContractModel): t.Cli.PipelineStageStatus, m.Field(description="Execution outcome") ] output: Annotated[ - t.JsonMapping, - m.Field( - description="Stage output payload", - ), + t.JsonMapping, m.Field(description="Stage output payload") ] = EMPTY_JSON_MAPPING duration_ms: Annotated[ float, m.Field(description="Execution duration in milliseconds") diff --git a/src/flext_cli/_models/pptx_presentation.py b/src/flext_cli/_models/pptx_presentation.py index 04a1387a..df398f59 100644 --- a/src/flext_cli/_models/pptx_presentation.py +++ b/src/flext_cli/_models/pptx_presentation.py @@ -23,8 +23,7 @@ class PptxPresentationPlan(m.FrozenModel): default=(), strict=False, description="Presentation slides." ) core_properties: t.JsonMapping = m.Field( - default=EMPTY_JSON_MAPPING, - description="Core document properties.", + default=EMPTY_JSON_MAPPING, description="Core document properties." ) class PptxRenderRequest(m.FrozenModel): diff --git a/src/flext_cli/_protocols/domain.py b/src/flext_cli/_protocols/domain.py index ae2bd261..f8fb69d3 100644 --- a/src/flext_cli/_protocols/domain.py +++ b/src/flext_cli/_protocols/domain.py @@ -13,9 +13,7 @@ class FlextCliProtocolsDomain: """CLI domain protocols layered on top of base callable contracts.""" - type ResultRouteHandler = Callable[ - ..., FlextCliProtocolsBase.ErasedCommandResult - ] + type ResultRouteHandler = Callable[..., FlextCliProtocolsBase.ErasedCommandResult] @runtime_checkable class JsonValueProcessor(Protocol): diff --git a/src/flext_cli/_utilities/_xlxx/xlsx_snapshot_structure.py b/src/flext_cli/_utilities/_xlxx/xlsx_snapshot_structure.py index b7e2680d..44aede30 100644 --- a/src/flext_cli/_utilities/_xlxx/xlsx_snapshot_structure.py +++ b/src/flext_cli/_utilities/_xlxx/xlsx_snapshot_structure.py @@ -64,7 +64,9 @@ def _snapshot_tables( f"Table snapshot failed: {detail}" ) return r[tuple[m.Cli.XlsxTableSnapshot, ...]].ok( - tuple(sorted(tables, key=FlextCliUtilitiesXlsxSnapshotStructure._table_name)) + tuple( + sorted(tables, key=FlextCliUtilitiesXlsxSnapshotStructure._table_name) + ) ) @staticmethod @@ -90,10 +92,7 @@ def _snapshot_rows( ) return r[tuple[m.Cli.XlsxRowDimensionSnapshot, ...]].ok( tuple( - sorted( - rows, - key=FlextCliUtilitiesXlsxSnapshotStructure._row_position, - ) + sorted(rows, key=FlextCliUtilitiesXlsxSnapshotStructure._row_position) ) ) @@ -124,8 +123,7 @@ def _snapshot_columns( return r[tuple[m.Cli.XlsxColumnDimensionSnapshot, ...]].ok( tuple( sorted( - columns, - key=FlextCliUtilitiesXlsxSnapshotStructure._column_position, + columns, key=FlextCliUtilitiesXlsxSnapshotStructure._column_position ) ) ) @@ -162,10 +160,7 @@ def _snapshot_names( ) return r[tuple[m.Cli.XlsxDefinedNameSnapshot, ...]].ok( tuple( - sorted( - names, - key=FlextCliUtilitiesXlsxSnapshotStructure._defined_name, - ) + sorted(names, key=FlextCliUtilitiesXlsxSnapshotStructure._defined_name) ) ) diff --git a/src/flext_cli/_utilities/pipeline.py b/src/flext_cli/_utilities/pipeline.py index c2233de8..c3f496e2 100644 --- a/src/flext_cli/_utilities/pipeline.py +++ b/src/flext_cli/_utilities/pipeline.py @@ -149,11 +149,7 @@ def _run_stage( return stage_result.model_copy(update={"duration_ms": duration_ms}) error = result.error or f"stage {spec.stage_id} failed" - log.error( - "stage_failed", - stage_id=spec.stage_id, - error=error, - ) + log.error("stage_failed", stage_id=spec.stage_id, error=error) return m.Cli.PipelineStageResult( stage_id=spec.stage_id, status=c.Cli.PipelineStageStatus.FAILED, diff --git a/uv.lock b/uv.lock index 31bc4a0a..6323b7fd 100644 --- a/uv.lock +++ b/uv.lock @@ -765,6 +765,7 @@ dev = [ { name = "isort" }, { name = "matplotlib-stubs" }, { name = "mkdocs" }, + { name = "mkdocs-autorefs" }, { name = "mkdocs-awesome-pages-plugin" }, { name = "mkdocs-encryptcontent-plugin" }, { name = "mkdocs-exclude" }, @@ -874,24 +875,25 @@ dev = [ { name = "hypothesis", specifier = ">=6.125" }, { name = "isort", specifier = ">=6.0.1" }, { name = "matplotlib-stubs", specifier = ">=0.3" }, - { name = "mkdocs", specifier = ">=1.6" }, + { name = "mkdocs", specifier = ">=1.6.1" }, + { name = "mkdocs-autorefs", specifier = ">=1.4.4" }, { name = "mkdocs-awesome-pages-plugin", specifier = ">=2.9" }, { name = "mkdocs-encryptcontent-plugin", specifier = ">=2" }, { name = "mkdocs-exclude", specifier = ">=1.0.2" }, { name = "mkdocs-get-deps", specifier = ">=0.2" }, - { name = "mkdocs-git-revision-date-localized-plugin", specifier = ">=1.2" }, + { name = "mkdocs-git-revision-date-localized-plugin", specifier = ">=1.5.3" }, { name = "mkdocs-literate-nav", specifier = ">=0.6" }, { name = "mkdocs-macros-plugin", specifier = ">=1" }, - { name = "mkdocs-material", specifier = ">=9.5" }, + { name = "mkdocs-material", specifier = ">=9.7.7" }, { name = "mkdocs-material-extensions", specifier = ">=1.3.1" }, - { name = "mkdocs-mermaid2-plugin", specifier = ">=1.1" }, - { name = "mkdocs-minify-plugin", specifier = ">=0.7" }, + { name = "mkdocs-mermaid2-plugin", specifier = ">=1.2.3" }, + { name = "mkdocs-minify-plugin", specifier = ">=0.8.0" }, { name = "mkdocs-print-site-plugin", specifier = ">=0.8" }, - { name = "mkdocs-redirects", specifier = ">=1.2" }, + { name = "mkdocs-redirects", specifier = ">=1.2.3" }, { name = "mkdocs-section-index", specifier = ">=0.3.12" }, { name = "mkdocs-versioning", specifier = ">=0.2" }, - { name = "mkdocstrings", specifier = ">=0.24" }, - { name = "mkdocstrings-python", specifier = ">=1.7" }, + { name = "mkdocstrings", specifier = ">=1.0.6" }, + { name = "mkdocstrings-python", specifier = ">=2.0.5" }, { name = "mypy", specifier = ">=2.3.0" }, { name = "pip-audit", specifier = ">=2.7.3" }, { name = "pre-commit", specifier = ">=4.6.1" },