intendant 4.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- intendant-4.0.0/.gitattributes +1 -0
- intendant-4.0.0/.github/workflows/ci.yml +65 -0
- intendant-4.0.0/.github/workflows/release-please.yml +18 -0
- intendant-4.0.0/.gitignore +48 -0
- intendant-4.0.0/.intendant.toml +6 -0
- intendant-4.0.0/.pre-commit-config.yaml +30 -0
- intendant-4.0.0/.python-version +1 -0
- intendant-4.0.0/.release-please-manifest.json +3 -0
- intendant-4.0.0/CHANGELOG.md +412 -0
- intendant-4.0.0/CLAUDE.md +43 -0
- intendant-4.0.0/LICENSE +21 -0
- intendant-4.0.0/PKG-INFO +259 -0
- intendant-4.0.0/README.md +238 -0
- intendant-4.0.0/docs/adr/0000-record-architecture-decisions.md +42 -0
- intendant-4.0.0/docs/adr/0001-layout-src-vs-flat.md +47 -0
- intendant-4.0.0/docs/adr/0002-uv-as-dependency-manager.md +48 -0
- intendant-4.0.0/docs/adr/0003-ty-with-pyright-fallback.md +51 -0
- intendant-4.0.0/docs/adr/0004-conventional-commits-strict.md +47 -0
- intendant-4.0.0/docs/adr/0005-release-please.md +50 -0
- intendant-4.0.0/docs/adr/0006-python-harness-pyo3-escape-hatch.md +50 -0
- intendant-4.0.0/docs/adr/0007-adopt-suzerain.md +38 -0
- intendant-4.0.0/docs/adr/0008-rename-suzerain-to-intendant.md +38 -0
- intendant-4.0.0/docs/handbook/00-charter.md +47 -0
- intendant-4.0.0/docs/handbook/01-layout.md +28 -0
- intendant-4.0.0/docs/handbook/02-packaging.md +34 -0
- intendant-4.0.0/docs/handbook/03-ci.md +49 -0
- intendant-4.0.0/docs/handbook/04-quality.md +39 -0
- intendant-4.0.0/docs/handbook/05-tests.md +28 -0
- intendant-4.0.0/docs/handbook/06-sanitizing.md +50 -0
- intendant-4.0.0/docs/handbook/07-releases.md +67 -0
- intendant-4.0.0/docs/handbook/08-docs-and-agent.md +48 -0
- intendant-4.0.0/docs/handbook/09-claude-skill.md +64 -0
- intendant-4.0.0/docs/handbook/10-node.md +59 -0
- intendant-4.0.0/docs/handbook/11-rust.md +71 -0
- intendant-4.0.0/docs/handbook/12-go.md +67 -0
- intendant-4.0.0/docs/handbook/13-swift.md +69 -0
- intendant-4.0.0/docs/handbook/14-multi-stack.md +168 -0
- intendant-4.0.0/docs/migrations/0.2.0-rule-prefix-rename.md +83 -0
- intendant-4.0.0/pyproject.toml +81 -0
- intendant-4.0.0/release-please-config.json +14 -0
- intendant-4.0.0/src/intendant/__init__.py +3 -0
- intendant-4.0.0/src/intendant/__main__.py +6 -0
- intendant-4.0.0/src/intendant/adapters/__init__.py +0 -0
- intendant-4.0.0/src/intendant/adapters/claude_skill/__init__.py +26 -0
- intendant-4.0.0/src/intendant/adapters/claude_skill/ci.py +34 -0
- intendant-4.0.0/src/intendant/adapters/claude_skill/inspectors.py +62 -0
- intendant-4.0.0/src/intendant/adapters/claude_skill/sk.py +287 -0
- intendant-4.0.0/src/intendant/adapters/go/__init__.py +18 -0
- intendant-4.0.0/src/intendant/adapters/go/ci.py +43 -0
- intendant-4.0.0/src/intendant/adapters/go/inspectors.py +58 -0
- intendant-4.0.0/src/intendant/adapters/go/pk.py +65 -0
- intendant-4.0.0/src/intendant/adapters/go/qu.py +30 -0
- intendant-4.0.0/src/intendant/adapters/go/sa.py +33 -0
- intendant-4.0.0/src/intendant/adapters/go/ts.py +31 -0
- intendant-4.0.0/src/intendant/adapters/node/__init__.py +19 -0
- intendant-4.0.0/src/intendant/adapters/node/ci.py +44 -0
- intendant-4.0.0/src/intendant/adapters/node/inspectors.py +37 -0
- intendant-4.0.0/src/intendant/adapters/node/pk.py +63 -0
- intendant-4.0.0/src/intendant/adapters/node/qu.py +60 -0
- intendant-4.0.0/src/intendant/adapters/node/sa.py +33 -0
- intendant-4.0.0/src/intendant/adapters/node/ts.py +46 -0
- intendant-4.0.0/src/intendant/adapters/python/__init__.py +36 -0
- intendant-4.0.0/src/intendant/adapters/python/ci.py +43 -0
- intendant-4.0.0/src/intendant/adapters/python/inspectors.py +29 -0
- intendant-4.0.0/src/intendant/adapters/python/lo.py +47 -0
- intendant-4.0.0/src/intendant/adapters/python/pk.py +178 -0
- intendant-4.0.0/src/intendant/adapters/python/qu.py +167 -0
- intendant-4.0.0/src/intendant/adapters/python/sa.py +33 -0
- intendant-4.0.0/src/intendant/adapters/python/ts.py +68 -0
- intendant-4.0.0/src/intendant/adapters/rust/__init__.py +18 -0
- intendant-4.0.0/src/intendant/adapters/rust/ci.py +41 -0
- intendant-4.0.0/src/intendant/adapters/rust/inspectors.py +38 -0
- intendant-4.0.0/src/intendant/adapters/rust/pk.py +76 -0
- intendant-4.0.0/src/intendant/adapters/rust/qu.py +23 -0
- intendant-4.0.0/src/intendant/adapters/rust/sa.py +33 -0
- intendant-4.0.0/src/intendant/adapters/rust/ts.py +31 -0
- intendant-4.0.0/src/intendant/adapters/swift/__init__.py +18 -0
- intendant-4.0.0/src/intendant/adapters/swift/ci.py +42 -0
- intendant-4.0.0/src/intendant/adapters/swift/inspectors.py +75 -0
- intendant-4.0.0/src/intendant/adapters/swift/pk.py +69 -0
- intendant-4.0.0/src/intendant/adapters/swift/qu.py +29 -0
- intendant-4.0.0/src/intendant/adapters/swift/sa.py +33 -0
- intendant-4.0.0/src/intendant/adapters/swift/ts.py +34 -0
- intendant-4.0.0/src/intendant/audit/__init__.py +0 -0
- intendant-4.0.0/src/intendant/audit/diff.py +115 -0
- intendant-4.0.0/src/intendant/audit/discovery.py +23 -0
- intendant-4.0.0/src/intendant/audit/fix.py +53 -0
- intendant-4.0.0/src/intendant/audit/output/__init__.py +0 -0
- intendant-4.0.0/src/intendant/audit/output/_html_assets.py +273 -0
- intendant-4.0.0/src/intendant/audit/output/human.py +84 -0
- intendant-4.0.0/src/intendant/audit/output/json_format.py +71 -0
- intendant-4.0.0/src/intendant/audit/output/md.py +79 -0
- intendant-4.0.0/src/intendant/audit/output/report_diff_html.py +144 -0
- intendant-4.0.0/src/intendant/audit/output/report_diff_human.py +79 -0
- intendant-4.0.0/src/intendant/audit/output/report_diff_json.py +31 -0
- intendant-4.0.0/src/intendant/audit/output/report_html.py +208 -0
- intendant-4.0.0/src/intendant/audit/output/report_human.py +110 -0
- intendant-4.0.0/src/intendant/audit/output/report_json.py +83 -0
- intendant-4.0.0/src/intendant/audit/registry.py +97 -0
- intendant-4.0.0/src/intendant/audit/runner.py +197 -0
- intendant-4.0.0/src/intendant/audit/snapshot.py +109 -0
- intendant-4.0.0/src/intendant/checks/__init__.py +52 -0
- intendant-4.0.0/src/intendant/checks/ci.py +88 -0
- intendant-4.0.0/src/intendant/checks/dg.py +185 -0
- intendant-4.0.0/src/intendant/checks/lo.py +19 -0
- intendant-4.0.0/src/intendant/checks/rl.py +254 -0
- intendant-4.0.0/src/intendant/checks/rl005.py +123 -0
- intendant-4.0.0/src/intendant/checks/sa.py +250 -0
- intendant-4.0.0/src/intendant/checks/ts.py +33 -0
- intendant-4.0.0/src/intendant/cli.py +59 -0
- intendant-4.0.0/src/intendant/commands/__init__.py +0 -0
- intendant-4.0.0/src/intendant/commands/audit.py +98 -0
- intendant-4.0.0/src/intendant/commands/doctor.py +28 -0
- intendant-4.0.0/src/intendant/commands/explain.py +123 -0
- intendant-4.0.0/src/intendant/commands/init.py +123 -0
- intendant-4.0.0/src/intendant/commands/mcp.py +27 -0
- intendant-4.0.0/src/intendant/commands/new.py +152 -0
- intendant-4.0.0/src/intendant/commands/report.py +241 -0
- intendant-4.0.0/src/intendant/core/__init__.py +0 -0
- intendant-4.0.0/src/intendant/core/config.py +174 -0
- intendant-4.0.0/src/intendant/core/handbook.py +115 -0
- intendant-4.0.0/src/intendant/core/patch.py +56 -0
- intendant-4.0.0/src/intendant/core/paths.py +38 -0
- intendant-4.0.0/src/intendant/core/repo.py +67 -0
- intendant-4.0.0/src/intendant/core/report.py +73 -0
- intendant-4.0.0/src/intendant/core/rule.py +46 -0
- intendant-4.0.0/src/intendant/core/subproject.py +14 -0
- intendant-4.0.0/src/intendant/mcp_server/__init__.py +6 -0
- intendant-4.0.0/src/intendant/mcp_server/handlers.py +158 -0
- intendant-4.0.0/src/intendant/mcp_server/server.py +59 -0
- intendant-4.0.0/src/intendant/scaffold/__init__.py +0 -0
- intendant-4.0.0/src/intendant/scaffold/engine.py +290 -0
- intendant-4.0.0/src/intendant/scaffold/substitutions.py +86 -0
- intendant-4.0.0/templates/_common/.editorconfig +18 -0
- intendant-4.0.0/templates/_common/.gitignore.template +49 -0
- intendant-4.0.0/templates/_common/.intendant.toml.template +10 -0
- intendant-4.0.0/templates/_common/0000-record-architecture-decisions.md.template +38 -0
- intendant-4.0.0/templates/_common/CHANGELOG.skeleton.md +9 -0
- intendant-4.0.0/templates/_common/CLAUDE.md.template +35 -0
- intendant-4.0.0/templates/_common/LICENSE.template +21 -0
- intendant-4.0.0/templates/_common/README.skeleton.md +29 -0
- intendant-4.0.0/templates/_common/adr.md +30 -0
- intendant-4.0.0/templates/claude-skill/.github/workflows/ci.yml +15 -0
- intendant-4.0.0/templates/claude-skill/.gitignore.template +5 -0
- intendant-4.0.0/templates/claude-skill/.intendant.toml.template +9 -0
- intendant-4.0.0/templates/claude-skill/.pre-commit-config.yaml.template +11 -0
- intendant-4.0.0/templates/claude-skill/.release-please-manifest.json.template +1 -0
- intendant-4.0.0/templates/claude-skill/README.md.template +19 -0
- intendant-4.0.0/templates/claude-skill/SKILL.md.template +16 -0
- intendant-4.0.0/templates/claude-skill/evals/case-1.md.template +6 -0
- intendant-4.0.0/templates/claude-skill/release-please-config.json.template +7 -0
- intendant-4.0.0/templates/github/.release-please-manifest.json.template +3 -0
- intendant-4.0.0/templates/github/ci.yml +59 -0
- intendant-4.0.0/templates/github/release-please-config.json.template +14 -0
- intendant-4.0.0/templates/github/release-please.yml +19 -0
- intendant-4.0.0/templates/go/.github/workflows/ci.yml.template +46 -0
- intendant-4.0.0/templates/go/.gitignore.template +13 -0
- intendant-4.0.0/templates/go/.golangci.yml.template +10 -0
- intendant-4.0.0/templates/go/.intendant.toml.template +7 -0
- intendant-4.0.0/templates/go/.pre-commit-config.yaml.template +16 -0
- intendant-4.0.0/templates/go/.release-please-manifest.json.template +3 -0
- intendant-4.0.0/templates/go/README.md.template +21 -0
- intendant-4.0.0/templates/go/go.mod.template +3 -0
- intendant-4.0.0/templates/go/release-please-config.json.template +7 -0
- intendant-4.0.0/templates/node/.github/workflows/ci.yml.template +52 -0
- intendant-4.0.0/templates/node/.gitignore.template +7 -0
- intendant-4.0.0/templates/node/.intendant.toml.template +7 -0
- intendant-4.0.0/templates/node/.pre-commit-config.yaml.template +11 -0
- intendant-4.0.0/templates/node/.release-please-manifest.json.template +1 -0
- intendant-4.0.0/templates/node/README.md.template +19 -0
- intendant-4.0.0/templates/node/eslint.config.js.template +9 -0
- intendant-4.0.0/templates/node/package.json.template +24 -0
- intendant-4.0.0/templates/node/release-please-config.json.template +7 -0
- intendant-4.0.0/templates/node/tsconfig.json.template +13 -0
- intendant-4.0.0/templates/python/.pre-commit-config.yaml +31 -0
- intendant-4.0.0/templates/python/commitizen.toml +7 -0
- intendant-4.0.0/templates/python/pyproject.toml.template +58 -0
- intendant-4.0.0/templates/python/ruff.toml +13 -0
- intendant-4.0.0/templates/python/ty.toml +10 -0
- intendant-4.0.0/templates/rust/.github/workflows/ci.yml.template +43 -0
- intendant-4.0.0/templates/rust/.gitignore.template +6 -0
- intendant-4.0.0/templates/rust/.intendant.toml.template +7 -0
- intendant-4.0.0/templates/rust/.pre-commit-config.yaml.template +17 -0
- intendant-4.0.0/templates/rust/.release-please-manifest.json.template +3 -0
- intendant-4.0.0/templates/rust/Cargo.toml.template +8 -0
- intendant-4.0.0/templates/rust/README.md.template +20 -0
- intendant-4.0.0/templates/rust/release-please-config.json.template +7 -0
- intendant-4.0.0/templates/rust/rust-toolchain.toml.template +3 -0
- intendant-4.0.0/templates/rust/rustfmt.toml.template +2 -0
- intendant-4.0.0/templates/swift/.github/workflows/ci.yml.template +48 -0
- intendant-4.0.0/templates/swift/.gitignore.template +10 -0
- intendant-4.0.0/templates/swift/.intendant.toml.template +7 -0
- intendant-4.0.0/templates/swift/.pre-commit-config.yaml.template +16 -0
- intendant-4.0.0/templates/swift/.release-please-manifest.json.template +3 -0
- intendant-4.0.0/templates/swift/.swiftlint.yml.template +12 -0
- intendant-4.0.0/templates/swift/README.md.template +20 -0
- intendant-4.0.0/templates/swift/release-please-config.json.template +7 -0
- intendant-4.0.0/tests/__init__.py +0 -0
- intendant-4.0.0/tests/conftest.py +11 -0
- intendant-4.0.0/tests/e2e/__init__.py +0 -0
- intendant-4.0.0/tests/e2e/test_audit_subprojects_e2e.py +54 -0
- intendant-4.0.0/tests/e2e/test_claude_skill_e2e.py +24 -0
- intendant-4.0.0/tests/e2e/test_report_e2e.py +135 -0
- intendant-4.0.0/tests/e2e/test_report_html_diff_e2e.py +44 -0
- intendant-4.0.0/tests/e2e/test_report_html_e2e.py +78 -0
- intendant-4.0.0/tests/e2e/test_report_html_from_snapshot_e2e.py +57 -0
- intendant-4.0.0/tests/e2e/test_scaffold_e2e.py +236 -0
- intendant-4.0.0/tests/fixtures/conformant_python_repo/.github/workflows/ci.yml +24 -0
- intendant-4.0.0/tests/fixtures/conformant_python_repo/.gitignore +4 -0
- intendant-4.0.0/tests/fixtures/conformant_python_repo/.intendant.toml +6 -0
- intendant-4.0.0/tests/fixtures/conformant_python_repo/.pre-commit-config.yaml +12 -0
- intendant-4.0.0/tests/fixtures/conformant_python_repo/.python-version +1 -0
- intendant-4.0.0/tests/fixtures/conformant_python_repo/.release-please-manifest.json +1 -0
- intendant-4.0.0/tests/fixtures/conformant_python_repo/CHANGELOG.md +5 -0
- intendant-4.0.0/tests/fixtures/conformant_python_repo/LICENSE +2 -0
- intendant-4.0.0/tests/fixtures/conformant_python_repo/README.md +3 -0
- intendant-4.0.0/tests/fixtures/conformant_python_repo/docs/adr/0001-init.md +2 -0
- intendant-4.0.0/tests/fixtures/conformant_python_repo/pyproject.toml +28 -0
- intendant-4.0.0/tests/fixtures/conformant_python_repo/release-please-config.json +1 -0
- intendant-4.0.0/tests/fixtures/conformant_python_repo/src/conformant/__init__.py +0 -0
- intendant-4.0.0/tests/fixtures/conformant_python_repo/tests/conftest.py +0 -0
- intendant-4.0.0/tests/fixtures/conformant_python_repo/uv.lock +1 -0
- intendant-4.0.0/tests/fixtures/empty_repo/.gitkeep +0 -0
- intendant-4.0.0/tests/fixtures/handbook_mini/adr/9999-test-decision.md +25 -0
- intendant-4.0.0/tests/fixtures/handbook_mini/handbook/99-test.md +24 -0
- intendant-4.0.0/tests/fixtures/multi_subproject_repo/.github/workflows/ci.yml +12 -0
- intendant-4.0.0/tests/fixtures/multi_subproject_repo/.gitignore +3 -0
- intendant-4.0.0/tests/fixtures/multi_subproject_repo/.intendant.toml +18 -0
- intendant-4.0.0/tests/fixtures/multi_subproject_repo/.pre-commit-config.yaml +11 -0
- intendant-4.0.0/tests/fixtures/multi_subproject_repo/.python-version +1 -0
- intendant-4.0.0/tests/fixtures/multi_subproject_repo/.release-please-manifest.json +1 -0
- intendant-4.0.0/tests/fixtures/multi_subproject_repo/CHANGELOG.md +4 -0
- intendant-4.0.0/tests/fixtures/multi_subproject_repo/CLAUDE.md +2 -0
- intendant-4.0.0/tests/fixtures/multi_subproject_repo/LICENSE +1 -0
- intendant-4.0.0/tests/fixtures/multi_subproject_repo/README.md +2 -0
- intendant-4.0.0/tests/fixtures/multi_subproject_repo/backend/.python-version +1 -0
- intendant-4.0.0/tests/fixtures/multi_subproject_repo/backend/pyproject.toml +15 -0
- intendant-4.0.0/tests/fixtures/multi_subproject_repo/backend/src/backend/__init__.py +1 -0
- intendant-4.0.0/tests/fixtures/multi_subproject_repo/backend/tests/test_placeholder.py +2 -0
- intendant-4.0.0/tests/fixtures/multi_subproject_repo/backend/uv.lock +2 -0
- intendant-4.0.0/tests/fixtures/multi_subproject_repo/pyproject.toml +19 -0
- intendant-4.0.0/tests/fixtures/multi_subproject_repo/release-please-config.json +1 -0
- intendant-4.0.0/tests/fixtures/multi_subproject_repo/src/multi_subproject_repo/__init__.py +1 -0
- intendant-4.0.0/tests/fixtures/multi_subproject_repo/tests/test_placeholder.py +2 -0
- intendant-4.0.0/tests/fixtures/multi_subproject_repo/uv.lock +2 -0
- intendant-4.0.0/tests/fixtures/node_repo/package.json +4 -0
- intendant-4.0.0/tests/fixtures/nonconformant_python_repo/.intendant.toml +6 -0
- intendant-4.0.0/tests/fixtures/nonconformant_python_repo/pyproject.toml +3 -0
- intendant-4.0.0/tests/fixtures/portfolio_mini/repo_a_clean/.github/workflows/ci.yml +11 -0
- intendant-4.0.0/tests/fixtures/portfolio_mini/repo_a_clean/.gitignore +3 -0
- intendant-4.0.0/tests/fixtures/portfolio_mini/repo_a_clean/.intendant.toml +6 -0
- intendant-4.0.0/tests/fixtures/portfolio_mini/repo_a_clean/.pre-commit-config.yaml +11 -0
- intendant-4.0.0/tests/fixtures/portfolio_mini/repo_a_clean/.python-version +1 -0
- intendant-4.0.0/tests/fixtures/portfolio_mini/repo_a_clean/.release-please-manifest.json +1 -0
- intendant-4.0.0/tests/fixtures/portfolio_mini/repo_a_clean/CHANGELOG.md +4 -0
- intendant-4.0.0/tests/fixtures/portfolio_mini/repo_a_clean/CLAUDE.md +2 -0
- intendant-4.0.0/tests/fixtures/portfolio_mini/repo_a_clean/LICENSE +1 -0
- intendant-4.0.0/tests/fixtures/portfolio_mini/repo_a_clean/README.md +2 -0
- intendant-4.0.0/tests/fixtures/portfolio_mini/repo_a_clean/pyproject.toml +16 -0
- intendant-4.0.0/tests/fixtures/portfolio_mini/repo_a_clean/release-please-config.json +1 -0
- intendant-4.0.0/tests/fixtures/portfolio_mini/repo_a_clean/src/repo_a_clean/__init__.py +1 -0
- intendant-4.0.0/tests/fixtures/portfolio_mini/repo_a_clean/tests/test_placeholder.py +2 -0
- intendant-4.0.0/tests/fixtures/portfolio_mini/repo_a_clean/uv.lock +2 -0
- intendant-4.0.0/tests/fixtures/portfolio_mini/repo_b_partial/.github/workflows/ci.yml +11 -0
- intendant-4.0.0/tests/fixtures/portfolio_mini/repo_b_partial/.gitignore +3 -0
- intendant-4.0.0/tests/fixtures/portfolio_mini/repo_b_partial/.intendant.toml +6 -0
- intendant-4.0.0/tests/fixtures/portfolio_mini/repo_b_partial/.python-version +1 -0
- intendant-4.0.0/tests/fixtures/portfolio_mini/repo_b_partial/LICENSE +1 -0
- intendant-4.0.0/tests/fixtures/portfolio_mini/repo_b_partial/README.md +1 -0
- intendant-4.0.0/tests/fixtures/portfolio_mini/repo_b_partial/pyproject.toml +10 -0
- intendant-4.0.0/tests/fixtures/portfolio_mini/repo_b_partial/src/repo_b_partial/__init__.py +1 -0
- intendant-4.0.0/tests/fixtures/portfolio_mini/repo_b_partial/tests/test_placeholder.py +2 -0
- intendant-4.0.0/tests/fixtures/portfolio_mini/repo_b_partial/uv.lock +2 -0
- intendant-4.0.0/tests/fixtures/portfolio_mini/repo_c_no_marker/README.md +2 -0
- intendant-4.0.0/tests/fixtures/python_repo/pyproject.toml +3 -0
- intendant-4.0.0/tests/fixtures/rust_repo/Cargo.toml +4 -0
- intendant-4.0.0/tests/fixtures/swift_repo/Package.swift +4 -0
- intendant-4.0.0/tests/fixtures/valid_claude_skill_repo/README.md +7 -0
- intendant-4.0.0/tests/fixtures/valid_claude_skill_repo/my-skill/SKILL.md +8 -0
- intendant-4.0.0/tests/fixtures/valid_claude_skill_repo/my-skill/evals/case-1.md +1 -0
- intendant-4.0.0/tests/fixtures/valid_claude_skill_repo/my-skill/references/api.md +1 -0
- intendant-4.0.0/tests/fixtures/valid_claude_skill_repo/my-skill/scripts/helper.py +1 -0
- intendant-4.0.0/tests/fixtures/valid_go_repo/.github/workflows/ci.yml +13 -0
- intendant-4.0.0/tests/fixtures/valid_go_repo/.gitignore +3 -0
- intendant-4.0.0/tests/fixtures/valid_go_repo/.golangci.yml +6 -0
- intendant-4.0.0/tests/fixtures/valid_go_repo/go.mod +3 -0
- intendant-4.0.0/tests/fixtures/valid_go_repo/go.sum +0 -0
- intendant-4.0.0/tests/fixtures/valid_go_repo/main.go +11 -0
- intendant-4.0.0/tests/fixtures/valid_go_repo/main_test.go +9 -0
- intendant-4.0.0/tests/fixtures/valid_rust_repo/.github/workflows/ci.yml +10 -0
- intendant-4.0.0/tests/fixtures/valid_rust_repo/.gitignore +2 -0
- intendant-4.0.0/tests/fixtures/valid_rust_repo/Cargo.lock +7 -0
- intendant-4.0.0/tests/fixtures/valid_rust_repo/Cargo.toml +4 -0
- intendant-4.0.0/tests/fixtures/valid_rust_repo/rust-toolchain.toml +3 -0
- intendant-4.0.0/tests/fixtures/valid_rust_repo/src/lib.rs +13 -0
- intendant-4.0.0/tests/fixtures/valid_swift_repo/.build/index-build/arm64-apple-macosx/debug/index/db/v13/saved/data.mdb +0 -0
- intendant-4.0.0/tests/fixtures/valid_swift_repo/.build/index-build/arm64-apple-macosx/debug/index/db/v13/saved/lock.mdb +0 -0
- intendant-4.0.0/tests/fixtures/valid_swift_repo/.build/index-build/workspace-state.json +14 -0
- intendant-4.0.0/tests/fixtures/valid_swift_repo/.github/workflows/ci.yml +10 -0
- intendant-4.0.0/tests/fixtures/valid_swift_repo/.gitignore +3 -0
- intendant-4.0.0/tests/fixtures/valid_swift_repo/.swiftlint.yml +2 -0
- intendant-4.0.0/tests/fixtures/valid_swift_repo/Package.resolved +4 -0
- intendant-4.0.0/tests/fixtures/valid_swift_repo/Package.swift +13 -0
- intendant-4.0.0/tests/fixtures/valid_swift_repo/Sources/MyLib/MyLib.swift +4 -0
- intendant-4.0.0/tests/fixtures/valid_swift_repo/Tests/MyLibTests/MyLibTests.swift +8 -0
- intendant-4.0.0/tests/unit/__init__.py +0 -0
- intendant-4.0.0/tests/unit/adapters/__init__.py +0 -0
- intendant-4.0.0/tests/unit/adapters/claude_skill/__init__.py +0 -0
- intendant-4.0.0/tests/unit/adapters/claude_skill/test_ci.py +68 -0
- intendant-4.0.0/tests/unit/adapters/go/__init__.py +0 -0
- intendant-4.0.0/tests/unit/adapters/go/test_ci.py +60 -0
- intendant-4.0.0/tests/unit/adapters/go/test_fixture_passes.py +36 -0
- intendant-4.0.0/tests/unit/adapters/go/test_inspectors.py +56 -0
- intendant-4.0.0/tests/unit/adapters/go/test_pk.py +74 -0
- intendant-4.0.0/tests/unit/adapters/go/test_qu_ts_sa.py +78 -0
- intendant-4.0.0/tests/unit/adapters/node/__init__.py +0 -0
- intendant-4.0.0/tests/unit/adapters/node/test_ci.py +147 -0
- intendant-4.0.0/tests/unit/adapters/node/test_inspectors.py +63 -0
- intendant-4.0.0/tests/unit/adapters/node/test_pk.py +130 -0
- intendant-4.0.0/tests/unit/adapters/node/test_qu.py +120 -0
- intendant-4.0.0/tests/unit/adapters/node/test_sa.py +53 -0
- intendant-4.0.0/tests/unit/adapters/node/test_ts.py +91 -0
- intendant-4.0.0/tests/unit/adapters/python/__init__.py +0 -0
- intendant-4.0.0/tests/unit/adapters/python/test_ci.py +158 -0
- intendant-4.0.0/tests/unit/adapters/python/test_inspectors.py +46 -0
- intendant-4.0.0/tests/unit/adapters/python/test_lo.py +43 -0
- intendant-4.0.0/tests/unit/adapters/python/test_pk.py +197 -0
- intendant-4.0.0/tests/unit/adapters/python/test_qu.py +151 -0
- intendant-4.0.0/tests/unit/adapters/python/test_sa.py +53 -0
- intendant-4.0.0/tests/unit/adapters/python/test_ts.py +78 -0
- intendant-4.0.0/tests/unit/adapters/rust/__init__.py +0 -0
- intendant-4.0.0/tests/unit/adapters/rust/test_ci.py +67 -0
- intendant-4.0.0/tests/unit/adapters/rust/test_fixture_passes.py +36 -0
- intendant-4.0.0/tests/unit/adapters/rust/test_inspectors.py +51 -0
- intendant-4.0.0/tests/unit/adapters/rust/test_pk.py +91 -0
- intendant-4.0.0/tests/unit/adapters/rust/test_qu.py +34 -0
- intendant-4.0.0/tests/unit/adapters/rust/test_sa.py +35 -0
- intendant-4.0.0/tests/unit/adapters/rust/test_ts.py +46 -0
- intendant-4.0.0/tests/unit/adapters/swift/__init__.py +0 -0
- intendant-4.0.0/tests/unit/adapters/swift/test_ci.py +61 -0
- intendant-4.0.0/tests/unit/adapters/swift/test_fixture_passes.py +36 -0
- intendant-4.0.0/tests/unit/adapters/swift/test_inspectors.py +96 -0
- intendant-4.0.0/tests/unit/adapters/swift/test_pk.py +84 -0
- intendant-4.0.0/tests/unit/adapters/swift/test_qu_ts_sa.py +80 -0
- intendant-4.0.0/tests/unit/audit/__init__.py +0 -0
- intendant-4.0.0/tests/unit/audit/output/__init__.py +0 -0
- intendant-4.0.0/tests/unit/audit/output/test_html_assets.py +137 -0
- intendant-4.0.0/tests/unit/audit/output/test_human_subprojects.py +72 -0
- intendant-4.0.0/tests/unit/audit/output/test_json_subprojects.py +55 -0
- intendant-4.0.0/tests/unit/audit/output/test_report_diff_html.py +144 -0
- intendant-4.0.0/tests/unit/audit/output/test_report_html.py +208 -0
- intendant-4.0.0/tests/unit/audit/output/test_report_html_edge_cases.py +121 -0
- intendant-4.0.0/tests/unit/audit/output/test_report_human.py +141 -0
- intendant-4.0.0/tests/unit/audit/output/test_report_json.py +168 -0
- intendant-4.0.0/tests/unit/audit/test_diff.py +347 -0
- intendant-4.0.0/tests/unit/audit/test_discovery.py +67 -0
- intendant-4.0.0/tests/unit/audit/test_runner_subprojects.py +118 -0
- intendant-4.0.0/tests/unit/audit/test_snapshot.py +347 -0
- intendant-4.0.0/tests/unit/checks/__init__.py +0 -0
- intendant-4.0.0/tests/unit/checks/test_ci.py +220 -0
- intendant-4.0.0/tests/unit/checks/test_dg.py +182 -0
- intendant-4.0.0/tests/unit/checks/test_lo.py +26 -0
- intendant-4.0.0/tests/unit/checks/test_rl.py +271 -0
- intendant-4.0.0/tests/unit/checks/test_rl005.py +166 -0
- intendant-4.0.0/tests/unit/checks/test_sa.py +309 -0
- intendant-4.0.0/tests/unit/checks/test_ts.py +32 -0
- intendant-4.0.0/tests/unit/commands/__init__.py +0 -0
- intendant-4.0.0/tests/unit/commands/test_mcp_command.py +27 -0
- intendant-4.0.0/tests/unit/commands/test_report_command.py +467 -0
- intendant-4.0.0/tests/unit/core/__init__.py +0 -0
- intendant-4.0.0/tests/unit/core/test_config_subprojects.py +194 -0
- intendant-4.0.0/tests/unit/core/test_subproject.py +21 -0
- intendant-4.0.0/tests/unit/mcp_server/__init__.py +0 -0
- intendant-4.0.0/tests/unit/mcp_server/test_handlers.py +102 -0
- intendant-4.0.0/tests/unit/scaffold/__init__.py +0 -0
- intendant-4.0.0/tests/unit/scaffold/test_engine.py +243 -0
- intendant-4.0.0/tests/unit/scaffold/test_substitutions.py +87 -0
- intendant-4.0.0/tests/unit/test_audit_command.py +73 -0
- intendant-4.0.0/tests/unit/test_audit_fix.py +48 -0
- intendant-4.0.0/tests/unit/test_claude_skill_adapter_skeleton.py +8 -0
- intendant-4.0.0/tests/unit/test_claude_skill_detection.py +39 -0
- intendant-4.0.0/tests/unit/test_claude_skill_inspectors.py +120 -0
- intendant-4.0.0/tests/unit/test_claude_skill_rules.py +395 -0
- intendant-4.0.0/tests/unit/test_cli.py +20 -0
- intendant-4.0.0/tests/unit/test_config.py +66 -0
- intendant-4.0.0/tests/unit/test_doctor_command.py +19 -0
- intendant-4.0.0/tests/unit/test_explain_command.py +79 -0
- intendant-4.0.0/tests/unit/test_handbook.py +120 -0
- intendant-4.0.0/tests/unit/test_init_command.py +93 -0
- intendant-4.0.0/tests/unit/test_new_command.py +502 -0
- intendant-4.0.0/tests/unit/test_output_human.py +57 -0
- intendant-4.0.0/tests/unit/test_output_json.py +51 -0
- intendant-4.0.0/tests/unit/test_output_md.py +81 -0
- intendant-4.0.0/tests/unit/test_patch.py +94 -0
- intendant-4.0.0/tests/unit/test_registry.py +159 -0
- intendant-4.0.0/tests/unit/test_repo.py +54 -0
- intendant-4.0.0/tests/unit/test_report.py +150 -0
- intendant-4.0.0/tests/unit/test_rule.py +89 -0
- intendant-4.0.0/tests/unit/test_runner.py +280 -0
- intendant-4.0.0/uv.lock +1263 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
docs/superpowers/ export-ignore
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
concurrency:
|
|
10
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
11
|
+
cancel-in-progress: true
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
quality:
|
|
15
|
+
name: lint + type + test
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
steps:
|
|
18
|
+
- uses: actions/checkout@v4
|
|
19
|
+
with:
|
|
20
|
+
fetch-depth: 0
|
|
21
|
+
|
|
22
|
+
- name: Install uv
|
|
23
|
+
uses: astral-sh/setup-uv@v4
|
|
24
|
+
with:
|
|
25
|
+
enable-cache: true
|
|
26
|
+
|
|
27
|
+
- name: Install Python
|
|
28
|
+
run: uv python install 3.13
|
|
29
|
+
|
|
30
|
+
- name: Sync dependencies
|
|
31
|
+
run: uv sync --all-extras --dev
|
|
32
|
+
|
|
33
|
+
- name: Lint (ruff check)
|
|
34
|
+
run: uv run ruff check .
|
|
35
|
+
|
|
36
|
+
- name: Format check (ruff format)
|
|
37
|
+
run: uv run ruff format --check .
|
|
38
|
+
|
|
39
|
+
- name: Type check (ty)
|
|
40
|
+
run: uvx ty check
|
|
41
|
+
# If ty's CLI changed, update this line. See ADR-0003.
|
|
42
|
+
|
|
43
|
+
- name: Run tests
|
|
44
|
+
run: uv run pytest --cov --cov-report=term-missing
|
|
45
|
+
|
|
46
|
+
- name: Self-audit (intendant audit on itself)
|
|
47
|
+
run: |
|
|
48
|
+
uv run intendant audit . --format=json > intendant-self-audit.json
|
|
49
|
+
uv run intendant audit . --severity=required
|
|
50
|
+
|
|
51
|
+
commit-lint:
|
|
52
|
+
name: conventional commits
|
|
53
|
+
runs-on: ubuntu-latest
|
|
54
|
+
if: github.event_name == 'pull_request'
|
|
55
|
+
steps:
|
|
56
|
+
- uses: actions/checkout@v4
|
|
57
|
+
with:
|
|
58
|
+
fetch-depth: 0
|
|
59
|
+
|
|
60
|
+
- name: Install uv
|
|
61
|
+
uses: astral-sh/setup-uv@v4
|
|
62
|
+
|
|
63
|
+
- name: Validate commit messages
|
|
64
|
+
run: |
|
|
65
|
+
uvx --from commitizen cz check --rev-range origin/${{ github.base_ref }}..HEAD
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
name: release-please
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
contents: write
|
|
9
|
+
pull-requests: write
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
release-please:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- uses: googleapis/release-please-action@v4
|
|
16
|
+
with:
|
|
17
|
+
config-file: release-please-config.json
|
|
18
|
+
manifest-file: .release-please-manifest.json
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.so
|
|
6
|
+
.Python
|
|
7
|
+
build/
|
|
8
|
+
dist/
|
|
9
|
+
*.egg-info/
|
|
10
|
+
.eggs/
|
|
11
|
+
|
|
12
|
+
# Tests / coverage
|
|
13
|
+
.pytest_cache/
|
|
14
|
+
.coverage
|
|
15
|
+
.coverage.*
|
|
16
|
+
htmlcov/
|
|
17
|
+
.tox/
|
|
18
|
+
coverage.xml
|
|
19
|
+
*.cover
|
|
20
|
+
|
|
21
|
+
# Type checkers
|
|
22
|
+
.mypy_cache/
|
|
23
|
+
.pyright_cache/
|
|
24
|
+
.ty_cache/
|
|
25
|
+
|
|
26
|
+
# Tooling
|
|
27
|
+
.ruff_cache/
|
|
28
|
+
.venv/
|
|
29
|
+
venv/
|
|
30
|
+
|
|
31
|
+
# IDE
|
|
32
|
+
.vscode/
|
|
33
|
+
.idea/
|
|
34
|
+
*.swp
|
|
35
|
+
|
|
36
|
+
# OS
|
|
37
|
+
.DS_Store
|
|
38
|
+
Thumbs.db
|
|
39
|
+
|
|
40
|
+
# Suzerain runtime
|
|
41
|
+
.suzerain/proposed/
|
|
42
|
+
.suzerain/snapshots/
|
|
43
|
+
|
|
44
|
+
# Local-only design artifacts (archived outside the repo per DG005)
|
|
45
|
+
docs/superpowers/
|
|
46
|
+
|
|
47
|
+
# Test-generated fixtures (built at test time, not committed)
|
|
48
|
+
tests/fixtures/handbook_mini_root/
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
repos:
|
|
2
|
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
3
|
+
rev: v6.0.0
|
|
4
|
+
hooks:
|
|
5
|
+
- id: trailing-whitespace
|
|
6
|
+
- id: end-of-file-fixer
|
|
7
|
+
- id: check-yaml
|
|
8
|
+
- id: check-toml
|
|
9
|
+
- id: check-added-large-files
|
|
10
|
+
args: ['--maxkb=500']
|
|
11
|
+
- id: check-merge-conflict
|
|
12
|
+
- id: detect-private-key
|
|
13
|
+
|
|
14
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
15
|
+
rev: v0.15.12
|
|
16
|
+
hooks:
|
|
17
|
+
- id: ruff
|
|
18
|
+
args: [--fix, --exit-non-zero-on-fix]
|
|
19
|
+
- id: ruff-format
|
|
20
|
+
|
|
21
|
+
- repo: https://github.com/gitleaks/gitleaks
|
|
22
|
+
rev: v8.30.0
|
|
23
|
+
hooks:
|
|
24
|
+
- id: gitleaks
|
|
25
|
+
|
|
26
|
+
- repo: https://github.com/commitizen-tools/commitizen
|
|
27
|
+
rev: v4.13.10
|
|
28
|
+
hooks:
|
|
29
|
+
- id: commitizen
|
|
30
|
+
stages: [commit-msg]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.13
|
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [4.0.0](https://github.com/dgrauet/intendant/compare/v3.1.0...v4.0.0) (2026-05-14)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### ⚠ BREAKING CHANGES
|
|
12
|
+
|
|
13
|
+
* the CLI is now `intendant` (was `suzerain`), the Python package is `intendant`, the configuration filename is `.intendant.toml` (was `.suzerain.toml`), and the MCP server registers as `intendant`.
|
|
14
|
+
|
|
15
|
+
### Features
|
|
16
|
+
|
|
17
|
+
* rename project from suzerain to intendant ([24a6748](https://github.com/dgrauet/intendant/commit/24a674845a6ec5727632ea75799669e1b787a51f))
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
### Documentation
|
|
21
|
+
|
|
22
|
+
* document multi-stack repository declaration ([2a09053](https://github.com/dgrauet/intendant/commit/2a09053e0cd9581cd6d5d86afa348cbb03d2e67d))
|
|
23
|
+
|
|
24
|
+
## [3.1.0](https://github.com/dgrauet/suzerain/compare/v3.0.0...v3.1.0) (2026-05-05)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
### Features
|
|
28
|
+
|
|
29
|
+
* **scaffold:** add Swift scaffolder ([#45](https://github.com/dgrauet/suzerain/issues/45)) ([61f3964](https://github.com/dgrauet/suzerain/commit/61f39643cfcbd529354b29bbcd8f0b50d7947ef1))
|
|
30
|
+
|
|
31
|
+
## [3.0.0](https://github.com/dgrauet/suzerain/compare/v2.0.0...v3.0.0) (2026-05-05)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
### ⚠ BREAKING CHANGES
|
|
35
|
+
|
|
36
|
+
* the audit gate field is renamed both in code and in .suzerain.toml to free up `mode` for the new `auto`/`manual` semantics on Repo/Report:
|
|
37
|
+
|
|
38
|
+
### Code Refactoring
|
|
39
|
+
|
|
40
|
+
* rename SuzerainConfig.mode → enforcement ([#43](https://github.com/dgrauet/suzerain/issues/43)) ([50bcbd3](https://github.com/dgrauet/suzerain/commit/50bcbd3d82230ee31da53990d5c7c754e0591ae1))
|
|
41
|
+
|
|
42
|
+
## [2.0.0](https://github.com/dgrauet/suzerain/compare/v1.3.0...v2.0.0) (2026-05-04)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
### ⚠ BREAKING CHANGES
|
|
46
|
+
|
|
47
|
+
* rewrites the core data model to separate "how the stack composition was determined" from "what the stacks actually are":
|
|
48
|
+
|
|
49
|
+
### Code Refactoring
|
|
50
|
+
|
|
51
|
+
* replace stack sentinels with mode + stacks tuple ([#41](https://github.com/dgrauet/suzerain/issues/41)) ([daf268d](https://github.com/dgrauet/suzerain/commit/daf268d69a00040fbc81343a61e2a3c8a2d805a8))
|
|
52
|
+
|
|
53
|
+
## [1.3.0](https://github.com/dgrauet/suzerain/compare/v1.2.0...v1.3.0) (2026-05-04)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
### Features
|
|
57
|
+
|
|
58
|
+
* **adapters:** add Swift adapter (7 rules, SwiftPM) ([#39](https://github.com/dgrauet/suzerain/issues/39)) ([f165fce](https://github.com/dgrauet/suzerain/commit/f165fce613d0ac56c8e81068e9f7db9bafd6b74e))
|
|
59
|
+
|
|
60
|
+
## [1.2.0](https://github.com/dgrauet/suzerain/compare/v1.1.0...v1.2.0) (2026-05-04)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
### Features
|
|
64
|
+
|
|
65
|
+
* **report:** redesign HTML report with inline per-repo findings ([#37](https://github.com/dgrauet/suzerain/issues/37)) ([8a7db17](https://github.com/dgrauet/suzerain/commit/8a7db1742c820d46799401a4035f31be761af805))
|
|
66
|
+
|
|
67
|
+
## [1.1.0](https://github.com/dgrauet/suzerain/compare/v1.0.0...v1.1.0) (2026-05-04)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
### Features
|
|
71
|
+
|
|
72
|
+
* **rules:** add RL005 — main branch protected on GitHub ([#33](https://github.com/dgrauet/suzerain/issues/33)) ([534c6f9](https://github.com/dgrauet/suzerain/commit/534c6f99b6b705d9f0299bc20942f1a44ea09f3a))
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
### Bug Fixes
|
|
76
|
+
|
|
77
|
+
* **ci:** use uvx --from commitizen for cz check ([#35](https://github.com/dgrauet/suzerain/issues/35)) ([600ab13](https://github.com/dgrauet/suzerain/commit/600ab13e475c5b3e9259584ccc10fc93091d4e54))
|
|
78
|
+
|
|
79
|
+
## [1.0.0](https://github.com/dgrauet/suzerain/compare/v0.4.5...v1.0.0) (2026-05-04)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
### Features
|
|
83
|
+
|
|
84
|
+
* promote suzerain to 1.0 — production/stable ([64610ee](https://github.com/dgrauet/suzerain/commit/64610ee601e16f5a318196cc925da1462bd1bf4c))
|
|
85
|
+
|
|
86
|
+
## [0.4.5](https://github.com/dgrauet/suzerain/compare/v0.4.4...v0.4.5) (2026-05-04)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
### Features
|
|
90
|
+
|
|
91
|
+
* **scaffold:** add Go scaffolder (suzerain new --stack=go) ([#30](https://github.com/dgrauet/suzerain/issues/30)) ([b7bac8a](https://github.com/dgrauet/suzerain/commit/b7bac8a17335534e19889d440c315bca00e1287b))
|
|
92
|
+
|
|
93
|
+
## [0.4.4](https://github.com/dgrauet/suzerain/compare/v0.4.3...v0.4.4) (2026-05-04)
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
### Features
|
|
97
|
+
|
|
98
|
+
* **adapter:** add Go adapter with 7 rules ([#28](https://github.com/dgrauet/suzerain/issues/28)) ([0abe9f7](https://github.com/dgrauet/suzerain/commit/0abe9f7430e5e51b2a6f9566be14288f58062892))
|
|
99
|
+
|
|
100
|
+
## [0.4.3](https://github.com/dgrauet/suzerain/compare/v0.4.2...v0.4.3) (2026-05-04)
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
### Features
|
|
104
|
+
|
|
105
|
+
* **scaffold:** add Rust scaffolder (suzerain new --stack=rust) ([#26](https://github.com/dgrauet/suzerain/issues/26)) ([df2d397](https://github.com/dgrauet/suzerain/commit/df2d3971c63e86baf581dd1632e5f5f9ddac1d52))
|
|
106
|
+
|
|
107
|
+
## [0.4.2](https://github.com/dgrauet/suzerain/compare/v0.4.1...v0.4.2) (2026-05-04)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
### Features
|
|
111
|
+
|
|
112
|
+
* **adapter:** add Rust adapter with 7 rules (palier R0) ([#24](https://github.com/dgrauet/suzerain/issues/24)) ([99716e3](https://github.com/dgrauet/suzerain/commit/99716e3ba8ce65c434cf8b035e602bab3a679575))
|
|
113
|
+
|
|
114
|
+
## [0.4.1](https://github.com/dgrauet/suzerain/compare/v0.4.0...v0.4.1) (2026-05-04)
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
### Features
|
|
118
|
+
|
|
119
|
+
* **mcp:** expose suzerain over MCP via optional `mcp` extra ([#22](https://github.com/dgrauet/suzerain/issues/22)) ([19ace2b](https://github.com/dgrauet/suzerain/commit/19ace2b7461d3480fd8568dace182aa249c7f216))
|
|
120
|
+
|
|
121
|
+
## [0.4.0](https://github.com/dgrauet/suzerain/compare/v0.3.0...v0.4.0) (2026-05-04)
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
### ⚠ BREAKING CHANGES
|
|
125
|
+
|
|
126
|
+
* **commands:** add --output and --from-snapshot flags + validation
|
|
127
|
+
|
|
128
|
+
### Features
|
|
129
|
+
|
|
130
|
+
* **audit/output:** add render_diff_html for portfolio diffs ([c8cfa50](https://github.com/dgrauet/suzerain/commit/c8cfa505380ceb2ca29347e9791a16ae360a0c0a))
|
|
131
|
+
* **audit/output:** add render_html for portfolio snapshot view ([4e6d8f3](https://github.com/dgrauet/suzerain/commit/4e6d8f303e103969482798baecbd3772d5f38f17))
|
|
132
|
+
* **audit/output:** add shared HTML assets module ([6c9c6d5](https://github.com/dgrauet/suzerain/commit/6c9c6d5e1ed79b0661a74d2f7ba82ab1950df067))
|
|
133
|
+
* **audit/snapshot:** add load_snapshot_as_portfolio_report helper ([6b79830](https://github.com/dgrauet/suzerain/commit/6b79830a5fb28b27f89bde4bbe3463b760327e27))
|
|
134
|
+
* **commands:** add --output and --from-snapshot flags + validation ([d84a7e4](https://github.com/dgrauet/suzerain/commit/d84a7e41c4c1f10c08f2c27ec7b5b99ddd0f7a00))
|
|
135
|
+
* **commands:** wire --format=html for snapshot, diff, and --from-snapshot ([65a25ac](https://github.com/dgrauet/suzerain/commit/65a25acce843de8cf802a7fcdaa91ddfe9a91532))
|
|
136
|
+
* **html:** render bold and links in handbook bodies ([01dce08](https://github.com/dgrauet/suzerain/commit/01dce084a2e2f13dcdddcab7a763f0f1706f0fc5))
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
### Bug Fixes
|
|
140
|
+
|
|
141
|
+
* **audit:** preserve original score when rendering --from-snapshot ([aad0df4](https://github.com/dgrauet/suzerain/commit/aad0df4a15ebccbf713d01b14437fe51ecc5feb6))
|
|
142
|
+
|
|
143
|
+
## [0.3.0](https://github.com/dgrauet/suzerain/compare/v0.2.3...v0.3.0) (2026-05-04)
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
### ⚠ BREAKING CHANGES
|
|
147
|
+
|
|
148
|
+
* **cli:** `suzerain dashboard` → `suzerain report`. The `DashboardScan` dataclass becomes `PortfolioReport`. Module paths `suzerain.commands.dashboard` → `suzerain.commands.report` and `suzerain.audit.output.dashboard_*` → `report_*`. Snapshot directory layout (`.suzerain/snapshots/`) is unchanged.
|
|
149
|
+
|
|
150
|
+
### Code Refactoring
|
|
151
|
+
|
|
152
|
+
* **cli:** rename dashboard command to report ([b65acf7](https://github.com/dgrauet/suzerain/commit/b65acf7a5036ea53e8f09478efb93e4d6f976907))
|
|
153
|
+
|
|
154
|
+
## [0.2.3](https://github.com/dgrauet/suzerain/compare/v0.2.2...v0.2.3) (2026-05-04)
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
### Features
|
|
158
|
+
|
|
159
|
+
* **audit/output:** multi-subproject sections in human/JSON/markdown + e2e fixture ([c760742](https://github.com/dgrauet/suzerain/commit/c760742fae9b2eb11a570f058f229a6ab66a5e11))
|
|
160
|
+
* **audit:** orchestrate multi-subproject audit + per-subproject exemption resolution ([a40831a](https://github.com/dgrauet/suzerain/commit/a40831ace9dbd66c887118416ab20ed1421ffa91))
|
|
161
|
+
* **core:** add Subproject + extend SuzerainConfig/Repo/Finding for multi-subproject ([08babac](https://github.com/dgrauet/suzerain/commit/08babacca6fb517f3a426f211d48dd4ab3c2b6d7))
|
|
162
|
+
|
|
163
|
+
## [0.2.2](https://github.com/dgrauet/suzerain/compare/v0.2.1...v0.2.2) (2026-05-03)
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
### Features
|
|
167
|
+
|
|
168
|
+
* **commands:** suzerain explain --all lists every registered rule ([42dbcd9](https://github.com/dgrauet/suzerain/commit/42dbcd91769f36ae97c0c81b39029976ff779885))
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
### Documentation
|
|
172
|
+
|
|
173
|
+
* **readme:** refresh for v0.2.1 (3 stacks, dashboard, 44 rules) ([e5aa241](https://github.com/dgrauet/suzerain/commit/e5aa241d685c29a6bada65047992e7d7f4cc8782))
|
|
174
|
+
|
|
175
|
+
## [0.2.1](https://github.com/dgrauet/suzerain/compare/v0.2.0...v0.2.1) (2026-05-03)
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
### Features
|
|
179
|
+
|
|
180
|
+
* **checks:** CI002 is stack-aware (python/node/claude-skill); drop scaffolder exemptions ([ef13006](https://github.com/dgrauet/suzerain/commit/ef130063226b2cde11574ef999aeaec2405f0418))
|
|
181
|
+
* **checks:** RL004 reads version from .release-please-manifest.json fallback ([05dee83](https://github.com/dgrauet/suzerain/commit/05dee83e4618b3f1ea6ae114adc61d323fcec3c9))
|
|
182
|
+
* **checks:** SA004 baseline patterns are stack-aware (python/node/generic) ([79d5a40](https://github.com/dgrauet/suzerain/commit/79d5a40aa0e0dbc8d6518ceac1771759b4997ec7))
|
|
183
|
+
|
|
184
|
+
## [0.2.0](https://github.com/dgrauet/suzerain/compare/v0.1.15...v0.2.0) (2026-05-03)
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
### ⚠ BREAKING CHANGES
|
|
188
|
+
|
|
189
|
+
* Stack-specific rule IDs in the python and claude-skill adapters were renamed with explicit stack prefixes (PYTHON_*, CLAUDE_SKILL_*). This is a hard break — the old IDs are no longer recognized. Update any .suzerain.toml exemption keys per the rename table in docs/migrations/0.2.0-rule-prefix-rename.md.
|
|
190
|
+
|
|
191
|
+
### Documentation
|
|
192
|
+
|
|
193
|
+
* document v0.2.0 rule prefix rename migration ([3cc8484](https://github.com/dgrauet/suzerain/commit/3cc84843d1979fb3ef9d2a4c3e2c74c37394f303))
|
|
194
|
+
|
|
195
|
+
## [0.1.15](https://github.com/dgrauet/suzerain/compare/v0.1.14...v0.1.15) (2026-05-03)
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
### Features
|
|
199
|
+
|
|
200
|
+
* **scaffold:** add --stack=node scaffolder (eslint + ts + vitest) ([99996dc](https://github.com/dgrauet/suzerain/commit/99996dc20e86cd5cef67fce2bbcb982f1d8d411d))
|
|
201
|
+
|
|
202
|
+
## [0.1.14](https://github.com/dgrauet/suzerain/compare/v0.1.13...v0.1.14) (2026-05-03)
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
### Features
|
|
206
|
+
|
|
207
|
+
* **adapters/node:** add Node/TS adapter with 6 rules (NODE_PK001-003, NODE_QU001-002, NODE_TS001) ([e6abae7](https://github.com/dgrauet/suzerain/commit/e6abae7eb8ba442ce0215279367273af253411dc))
|
|
208
|
+
|
|
209
|
+
## [0.1.13](https://github.com/dgrauet/suzerain/compare/v0.1.12...v0.1.13) (2026-05-03)
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
### Features
|
|
213
|
+
|
|
214
|
+
* **audit:** add snapshot persistence + diff computation modules ([0f69fdc](https://github.com/dgrauet/suzerain/commit/0f69fdc375612967920d5a06a58114fd1dbcfc2e))
|
|
215
|
+
* **commands:** dashboard --save-snapshot, --diff, --against, --snapshot-dir ([fb52f6b](https://github.com/dgrauet/suzerain/commit/fb52f6ba1268765cb4312646052fc843dbbe9be0))
|
|
216
|
+
|
|
217
|
+
## [0.1.12](https://github.com/dgrauet/suzerain/compare/v0.1.11...v0.1.12) (2026-05-02)
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
### Features
|
|
221
|
+
|
|
222
|
+
* **scaffold:** add --stack=claude-skill scaffolder ([a711cd9](https://github.com/dgrauet/suzerain/commit/a711cd9501eb64f8238892499b92f6232769a7d7))
|
|
223
|
+
|
|
224
|
+
## [0.1.11](https://github.com/dgrauet/suzerain/compare/v0.1.10...v0.1.11) (2026-05-02)
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
### Features
|
|
228
|
+
|
|
229
|
+
* **audit:** dashboard shows req/rec/fix breakdown per repo ([4beffc2](https://github.com/dgrauet/suzerain/commit/4beffc2437cb8169d1ad500edd81486fd0c73158))
|
|
230
|
+
|
|
231
|
+
## [0.1.10](https://github.com/dgrauet/suzerain/compare/v0.1.9...v0.1.10) (2026-05-02)
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
### Features
|
|
235
|
+
|
|
236
|
+
* **adapters/python:** PK002 auto-fix runs sandboxed uv lock ([e5fc2d2](https://github.com/dgrauet/suzerain/commit/e5fc2d2cea47831a86277e315a071f5348145cb3))
|
|
237
|
+
|
|
238
|
+
## [0.1.9](https://github.com/dgrauet/suzerain/compare/v0.1.8...v0.1.9) (2026-05-02)
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
### Features
|
|
242
|
+
|
|
243
|
+
* **adapters/python:** add QU003 strict type-checker config rule ([99b3864](https://github.com/dgrauet/suzerain/commit/99b38644a39236a793ad2f82acda5335254f6afb))
|
|
244
|
+
* **checks:** add CI002 minimum CI steps rule ([92eff21](https://github.com/dgrauet/suzerain/commit/92eff217bd0d6f5880a24d3a63fea79c6bfc3cb4))
|
|
245
|
+
* **checks:** add CI003 commit message validation rule ([d55345d](https://github.com/dgrauet/suzerain/commit/d55345df20a5003a7b737cb993ea8b4f8c02ff00))
|
|
246
|
+
* **checks:** add LO003 docs/ directory rule (transverse) ([cc0e1b7](https://github.com/dgrauet/suzerain/commit/cc0e1b71e214f82697dcc87981494b64bfc6d7bc))
|
|
247
|
+
* **checks:** add RL004 strict SemVer rule ([c90ca5d](https://github.com/dgrauet/suzerain/commit/c90ca5de4d1164a809a384bdf4765553b4668a97))
|
|
248
|
+
* **checks:** add SA003 .env.example rule with safe auto-fix ([11be51e](https://github.com/dgrauet/suzerain/commit/11be51ed7f0f33286814627edb8ee770dbbb2cd6))
|
|
249
|
+
* **checks:** add TS002 regression_tests/ layout rule ([94775e2](https://github.com/dgrauet/suzerain/commit/94775e2a0cb0c4f4c49490e301aa225e1b45bad5))
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
### Bug Fixes
|
|
253
|
+
|
|
254
|
+
* **fixtures:** update conformant fixture and templates for new rules ([7548cd0](https://github.com/dgrauet/suzerain/commit/7548cd0000e7db168dbcce6eb7822e9ba672ee57))
|
|
255
|
+
|
|
256
|
+
## [0.1.8](https://github.com/dgrauet/suzerain/compare/v0.1.7...v0.1.8) (2026-05-02)
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
### Features
|
|
260
|
+
|
|
261
|
+
* **audit:** add dashboard_human formatter (A3 + legend) ([d6b5b14](https://github.com/dgrauet/suzerain/commit/d6b5b14ad65ba11e95cb88cdf068971998824cdf))
|
|
262
|
+
* **audit:** add dashboard_json formatter with schema_version=1 ([a3ead07](https://github.com/dgrauet/suzerain/commit/a3ead078738425a7bf9f8a375171c091f8948377))
|
|
263
|
+
* **audit:** add find_suzerain_repos for multi-repo discovery ([802cc19](https://github.com/dgrauet/suzerain/commit/802cc197b7ac5e70b06675035410fe411a454ac9))
|
|
264
|
+
* **checks:** DG005 requires both .gitignore and .gitattributes (2-pass fix) ([c8601ed](https://github.com/dgrauet/suzerain/commit/c8601ed0420b9ab951d9aa0545cd33889c4d07be))
|
|
265
|
+
* **commands:** add DashboardScan + scan helpers for dashboard command ([f54240d](https://github.com/dgrauet/suzerain/commit/f54240d77c8cecdbcbc137cd34dc2b3ad4829a2b))
|
|
266
|
+
* **commands:** add suzerain dashboard CLI command ([45a8669](https://github.com/dgrauet/suzerain/commit/45a8669182fb8ac7e595b8c79cb13d76b8e587d3))
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
### Bug Fixes
|
|
270
|
+
|
|
271
|
+
* **audit:** restore ✓/⚠ glyphs in dashboard_human per spec ([cc02d23](https://github.com/dgrauet/suzerain/commit/cc02d23d7909600592da1313e74aea80182bb72b))
|
|
272
|
+
* **tests:** silence ty invalid-assignment on intentional frozen test ([efaa434](https://github.com/dgrauet/suzerain/commit/efaa434cdaa03a673bd6a3e1eae53d7bd96c0084))
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
### Documentation
|
|
276
|
+
|
|
277
|
+
* redact local archive path references from public docs ([90e0def](https://github.com/dgrauet/suzerain/commit/90e0def8e74ba273f687d012af50a72b6219c1bf))
|
|
278
|
+
* redact remaining personal references from public files ([0c02a69](https://github.com/dgrauet/suzerain/commit/0c02a692cf18174cf1247d56c90103dbf3299c0a))
|
|
279
|
+
* translate handbook, ADRs, README, CLAUDE.md to English ([8342ddd](https://github.com/dgrauet/suzerain/commit/8342ddd6d98d505146979bcff6c824520bf3b985))
|
|
280
|
+
* update CLAUDE.md design reference for archived specs/plans ([dfa0100](https://github.com/dgrauet/suzerain/commit/dfa0100be7f530d20af17e8727f0293a3c29348b))
|
|
281
|
+
|
|
282
|
+
## [0.1.7](https://github.com/dgrauet/suzerain/compare/v0.1.6...v0.1.7) (2026-05-02)
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
### Features
|
|
286
|
+
|
|
287
|
+
* **audit:** register skill adapter in rule collector ([977fd15](https://github.com/dgrauet/suzerain/commit/977fd15ab9a4f9d9a41910341845d1fb6e163866))
|
|
288
|
+
* **core:** add CheckResult.skipped field for runtime preconditions ([7746c73](https://github.com/dgrauet/suzerain/commit/7746c73a77ab34bcaa8d36d7372845f8dbc8b438))
|
|
289
|
+
* **core:** detect skill stack with precedence over python ([f3066a8](https://github.com/dgrauet/suzerain/commit/f3066a887426954b390661dbafe0a0afb6b69d4b))
|
|
290
|
+
* **skill:** add find_skill_md inspector (depth limit + exclusions) ([bb62492](https://github.com/dgrauet/suzerain/commit/bb62492547d59e4cfca5e62908cbc4ab0f52bf71))
|
|
291
|
+
* **skill:** add parse_frontmatter inspector with BOM handling ([131788b](https://github.com/dgrauet/suzerain/commit/131788b181f75bca6d25b1e784d924ffb50e66b2))
|
|
292
|
+
* **skill:** add SK001 SKILL.md presence rule ([b1f2926](https://github.com/dgrauet/suzerain/commit/b1f2926f38af72c94eca3466e3d453ad98e7a5bb))
|
|
293
|
+
* **skill:** add SK002 frontmatter validity rule ([289decc](https://github.com/dgrauet/suzerain/commit/289deccc5ea1c21fa377b8a3c037a4c45b50f6d3))
|
|
294
|
+
* **skill:** add SK003 description length bounds rule ([67a5101](https://github.com/dgrauet/suzerain/commit/67a5101898ee5d343ca6a19023682dfd0fa1785d))
|
|
295
|
+
* **skill:** add SK004 name-matches-directory rule ([b3273cd](https://github.com/dgrauet/suzerain/commit/b3273cdccad9caa5f906db31a73c8aa3a4912b3c))
|
|
296
|
+
* **skill:** add SK005 evals/ presence rule ([8b0a87d](https://github.com/dgrauet/suzerain/commit/8b0a87d2f2ed6924588f4815841938ed885eef96))
|
|
297
|
+
* **skill:** add SK006 referenced dirs existence rule ([05cbb63](https://github.com/dgrauet/suzerain/commit/05cbb63dba79d7470372dcedb4033fb0dc4def8e))
|
|
298
|
+
* **skill:** add SK007 README install-path rule with safe fix ([a519271](https://github.com/dgrauet/suzerain/commit/a519271160c939e4f0b455071e685ed51ff50f85))
|
|
299
|
+
* **skill:** scaffold skill adapter package ([5933848](https://github.com/dgrauet/suzerain/commit/59338481f1378217b117686fcd5bf51133e9de28))
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
### Bug Fixes
|
|
303
|
+
|
|
304
|
+
* **skill:** tighten SK006 path regex + add missing SK003 skip test ([5f0a3c3](https://github.com/dgrauet/suzerain/commit/5f0a3c336aa6c424ac3921426df0942ed957424a))
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
### Documentation
|
|
308
|
+
|
|
309
|
+
* **core:** list "skill" in Repo.stack type comment ([fd63904](https://github.com/dgrauet/suzerain/commit/fd63904e6c61bd3a4297092b059fa998bece06a9))
|
|
310
|
+
* **handbook:** add 09-skill.md with SK001-SK007 entries ([7c020a5](https://github.com/dgrauet/suzerain/commit/7c020a5c66d807e8721d7684156849420daeed4c))
|
|
311
|
+
|
|
312
|
+
## [0.1.6](https://github.com/dgrauet/suzerain/compare/v0.1.5...v0.1.6) (2026-05-01)
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
### Features
|
|
316
|
+
|
|
317
|
+
* **adapters/python:** add QU004 ty-check rule (palier 2.7) ([295fd51](https://github.com/dgrauet/suzerain/commit/295fd51e1b13042a330be17e2139c92251297ce8))
|
|
318
|
+
|
|
319
|
+
## [0.1.5](https://github.com/dgrauet/suzerain/compare/v0.1.4...v0.1.5) (2026-05-01)
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
### Features
|
|
323
|
+
|
|
324
|
+
* **checks:** add .fix() for SA001/SA002/RL003 (palier 2.6) ([1ae0d66](https://github.com/dgrauet/suzerain/commit/1ae0d663e7eb33a90865bf9035cae955312cf140))
|
|
325
|
+
|
|
326
|
+
## [0.1.4](https://github.com/dgrauet/suzerain/compare/v0.1.3...v0.1.4) (2026-05-01)
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
### Bug Fixes
|
|
330
|
+
|
|
331
|
+
* **scaffold:** add placeholder test to avoid pytest exit 5 on fresh scaffolds ([2dc204d](https://github.com/dgrauet/suzerain/commit/2dc204defb3e1b33bc21154b660e57823ffd9b52))
|
|
332
|
+
|
|
333
|
+
## [0.1.3](https://github.com/dgrauet/suzerain/compare/v0.1.2...v0.1.3) (2026-05-01)
|
|
334
|
+
|
|
335
|
+
|
|
336
|
+
### Features
|
|
337
|
+
|
|
338
|
+
* **rules:** palier 2.5 — 7 new rules (DG002, SA002, SA004, RL003, CI004, PK004, TS003) ([8e0fca0](https://github.com/dgrauet/suzerain/commit/8e0fca0379184414b9a1f540119d20b8809443de))
|
|
339
|
+
|
|
340
|
+
## [0.1.2](https://github.com/dgrauet/suzerain/compare/v0.1.1...v0.1.2) (2026-05-01)
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
### Features
|
|
344
|
+
|
|
345
|
+
* **cli:** add 'suzerain new' scaffolder command ([5204cf7](https://github.com/dgrauet/suzerain/commit/5204cf7feba3ef95ac732590e057e6c9a67e3389))
|
|
346
|
+
* **scaffold:** add engine for copying + substituting templates ([488fec9](https://github.com/dgrauet/suzerain/commit/488fec9ad3b1f727a804d7ec0d17e91601a0af66))
|
|
347
|
+
* **scaffold:** add substitutions module with placeholder resolver ([07b25f2](https://github.com/dgrauet/suzerain/commit/07b25f2074e79b1bd820db3411d6575a0e472cb3))
|
|
348
|
+
* **templates:** add baseline ADR-0000 template for new repos ([beabb49](https://github.com/dgrauet/suzerain/commit/beabb496e03352e063c77f3857a13efdbc6f3cdf))
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
### Bug Fixes
|
|
352
|
+
|
|
353
|
+
* **cli:** inject git committer fallback for fresh environments ([475de6a](https://github.com/dgrauet/suzerain/commit/475de6a66382ce87d369b1f160a934aaee9a7547))
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
### Documentation
|
|
357
|
+
|
|
358
|
+
* document 'suzerain new' in README quickstart and roadmap ([72069c5](https://github.com/dgrauet/suzerain/commit/72069c505b9b7156427f91c745c96f180dbe59cd))
|
|
359
|
+
* update README for v0.1.1 (paliers 1+2 shipped, full CLI surface) ([6362146](https://github.com/dgrauet/suzerain/commit/636214628d0ae24de4b2d281a523fb03c696da52))
|
|
360
|
+
|
|
361
|
+
## [0.1.1](https://github.com/dgrauet/suzerain/compare/v0.1.0...v0.1.1) (2026-04-30)
|
|
362
|
+
|
|
363
|
+
|
|
364
|
+
### Features
|
|
365
|
+
|
|
366
|
+
* **adapters/python:** add inspectors (pyproject helpers) ([45df7e8](https://github.com/dgrauet/suzerain/commit/45df7e8eb8192ddaf641ffd0b9d394345993c2b7))
|
|
367
|
+
* **adapters/python:** add LO rules (LO001 src layout, LO002 tests at root) ([0a51576](https://github.com/dgrauet/suzerain/commit/0a515764b278280c627344d06375928e564a2b38))
|
|
368
|
+
* **adapters/python:** add PK rules (PK001-003) ([e633075](https://github.com/dgrauet/suzerain/commit/e6330756e7d1ca2f4c1d7b4676f6c0fd4bbac23f))
|
|
369
|
+
* **adapters/python:** add PK003.fix() to auto-create .python-version ([3917b5f](https://github.com/dgrauet/suzerain/commit/3917b5f7bf571f4f3a04509f314c19e29c1016d7))
|
|
370
|
+
* **adapters/python:** add QU rules (ruff, ty/pyright) ([c6de285](https://github.com/dgrauet/suzerain/commit/c6de2852ef74e38dcbc33e2e3d079e8ef99a81d1))
|
|
371
|
+
* **adapters/python:** add TS001 (pytest configured) ([9651ee2](https://github.com/dgrauet/suzerain/commit/9651ee2f0f77cf7c94de6bd7e4f20fc305f26483))
|
|
372
|
+
* **audit:** add --fix with safe/proposed boundary ([2a7e858](https://github.com/dgrauet/suzerain/commit/2a7e858ea5c4cabafe08c5d4af18c46986e8d506))
|
|
373
|
+
* **audit:** add human/json/markdown output formatters ([292182d](https://github.com/dgrauet/suzerain/commit/292182d4ec38b1046ef27135eb42b3de7a6c71a3))
|
|
374
|
+
* **audit:** add rule registry with stack and mode filtering ([a47e557](https://github.com/dgrauet/suzerain/commit/a47e557777c348e2533f48614026ab55d4713372))
|
|
375
|
+
* **audit:** add synchronous audit runner ([07d5f59](https://github.com/dgrauet/suzerain/commit/07d5f593628ac761c8f560da949cdefd1257a102))
|
|
376
|
+
* **checks:** add CI001 (CI workflow exists) ([756813c](https://github.com/dgrauet/suzerain/commit/756813c1eb5f82102450f9d2eb644f6960268ee7))
|
|
377
|
+
* **checks:** add DG transverse rules (DG001, DG003, DG004, DG005) ([24a53b2](https://github.com/dgrauet/suzerain/commit/24a53b21249203fab7fb14243aeedd10d0d0e9e6))
|
|
378
|
+
* **checks:** add RL transverse rules (RL001, RL002) ([ab8cf86](https://github.com/dgrauet/suzerain/commit/ab8cf8671c4e5062ee3bf4b1baf253292d184286))
|
|
379
|
+
* **checks:** add SA001 (pre-commit baseline) ([8a598e1](https://github.com/dgrauet/suzerain/commit/8a598e1b3c4a0015b07adfa04a04f36c4f2730aa))
|
|
380
|
+
* **cli:** add 'suzerain audit' command with multi-format output ([5f8cd5e](https://github.com/dgrauet/suzerain/commit/5f8cd5e3960f81f196b5917e0f361c92a470135f))
|
|
381
|
+
* **cli:** add 'suzerain doctor' command ([9119887](https://github.com/dgrauet/suzerain/commit/9119887f80abd847fb64034737ffac4b9b088a41))
|
|
382
|
+
* **cli:** add 'suzerain explain' command ([a51c19f](https://github.com/dgrauet/suzerain/commit/a51c19fe8edd3328ef55b684a7cafe7179a0b3c7))
|
|
383
|
+
* **cli:** add 'suzerain init' command ([dcc1bed](https://github.com/dgrauet/suzerain/commit/dcc1bed52d64640353b5ddde63c33126d0ad7428))
|
|
384
|
+
* **cli:** add typer entrypoint with --version flag ([defce03](https://github.com/dgrauet/suzerain/commit/defce033eade7dfa17767ba3ffa605a131849c16))
|
|
385
|
+
* **core:** add Finding and Report with weighted score ([7b4469e](https://github.com/dgrauet/suzerain/commit/7b4469e1266e63f211d9a5305d7db361e30cc725))
|
|
386
|
+
* **core:** add Handbook loader with rule + ADR parsing ([7276d21](https://github.com/dgrauet/suzerain/commit/7276d219daf58872053c8efecbb534539fe1213c))
|
|
387
|
+
* **core:** add Patch with safe-apply primitives ([bb887b0](https://github.com/dgrauet/suzerain/commit/bb887b04e52d460d82322bd854c14ce40d144486))
|
|
388
|
+
* **core:** add Repo and detect_stack ([c3888af](https://github.com/dgrauet/suzerain/commit/c3888af4b37c972c3152925fafbe3936fe2254e5))
|
|
389
|
+
* **core:** add Rule ABC and CheckResult ([c90c005](https://github.com/dgrauet/suzerain/commit/c90c00508ef8556f4b1943e1b12236c59a640c57))
|
|
390
|
+
* **core:** add SuzerainConfig with exemption parsing ([6058cf5](https://github.com/dgrauet/suzerain/commit/6058cf5e608653d08978ee26f8a9a1bf49f48c68))
|
|
391
|
+
* **templates:** add _common templates (ADR, CLAUDE.md, README, LICENSE, etc.) ([68b4d3e](https://github.com/dgrauet/suzerain/commit/68b4d3ecebce08a538e210bc0e9630cb6326f3ba))
|
|
392
|
+
* **templates:** add github/, python/ and node/ templates ([85ec2c5](https://github.com/dgrauet/suzerain/commit/85ec2c569d639f85008768b79928851c0dd4caa9))
|
|
393
|
+
|
|
394
|
+
|
|
395
|
+
### Bug Fixes
|
|
396
|
+
|
|
397
|
+
* **audit:** use Sequence[Rule] for covariant parameters (ty) ([0b238e3](https://github.com/dgrauet/suzerain/commit/0b238e3985b223ac9cc622c45eac93f59e5fd2dd))
|
|
398
|
+
* **checks:** RL002 accepts any lowercase CC type (per spec 1.0) ([9ac5f1e](https://github.com/dgrauet/suzerain/commit/9ac5f1eb367958a6b86015fe804240bb0b09d49e))
|
|
399
|
+
* **cli:** escape [exemptions] in init's Rich markup output ([6950d5c](https://github.com/dgrauet/suzerain/commit/6950d5c3d30ed54809773992209e0fc4be77aa23))
|
|
400
|
+
* **core:** make RuleSection.stacks immutable tuple ([ec61f6f](https://github.com/dgrauet/suzerain/commit/ec61f6f16750e7c8e695b7e6c10bded8341773fe))
|
|
401
|
+
* **tests:** narrow Optional dict before subscripting (ty) ([40e7f1b](https://github.com/dgrauet/suzerain/commit/40e7f1bf01f79ee5e40b249c136e8a86ce29e799))
|
|
402
|
+
|
|
403
|
+
|
|
404
|
+
### Documentation
|
|
405
|
+
|
|
406
|
+
* **adr:** add palier 1 ADRs 0000-0006 ([a79f056](https://github.com/dgrauet/suzerain/commit/a79f056c42ca8a36c2bd46b19af3b0a6679d6354))
|
|
407
|
+
* **handbook:** add palier 1 handbook (8 domains, 30 rules) ([38f66ca](https://github.com/dgrauet/suzerain/commit/38f66ca6935c879016bec05339e121f8ae9d6778))
|
|
408
|
+
|
|
409
|
+
## [Unreleased]
|
|
410
|
+
|
|
411
|
+
### Added
|
|
412
|
+
- Initial palier 1 scaffolding (handbook, ADRs, `init` and `explain` commands).
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# CLAUDE.md — intendant
|
|
2
|
+
|
|
3
|
+
Agent context for the intendant repo.
|
|
4
|
+
|
|
5
|
+
## What
|
|
6
|
+
|
|
7
|
+
Multi-stack governance framework. This repo defines, hosts, and enforces the standards
|
|
8
|
+
that govern the projects it is configured to scan.
|
|
9
|
+
|
|
10
|
+
## House rules
|
|
11
|
+
|
|
12
|
+
- **Specs and plans local-only**: `docs/superpowers/specs/` and `docs/superpowers/plans/` are NEVER pushed to the public remote. Rebase the branch onto `origin/main` before pushing.
|
|
13
|
+
- **Strict TDD** on the CLI Python code (`src/intendant/`). Every new engine component comes with its failing test first.
|
|
14
|
+
- **Strict conventional commits**. The `commit-msg` hook rejects non-conformant commits.
|
|
15
|
+
- **Intendant eats its own dog food**: intendant is governed by its own `.intendant.toml` (`mode = "strict"`).
|
|
16
|
+
- **Type-checker**: `ty` (Astral) in V1. `pyright` documented as fallback (ADR-0003).
|
|
17
|
+
|
|
18
|
+
## Stack
|
|
19
|
+
|
|
20
|
+
- Python 3.13, uv (deps + lockfile mandatory)
|
|
21
|
+
- ruff (lint+format), ty (type-check), pytest (tests)
|
|
22
|
+
- pre-commit, commitizen, release-please
|
|
23
|
+
|
|
24
|
+
## Tests
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
uv run pytest # all tests
|
|
28
|
+
uv run pytest tests/unit -v # unit only
|
|
29
|
+
uv run pytest --cov # with coverage
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Lint & type
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
uv run ruff check .
|
|
36
|
+
uv run ruff format --check .
|
|
37
|
+
uvx ty check # or: uv run ty check (depending on installation)
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Design reference
|
|
41
|
+
|
|
42
|
+
Specs and plans are local-only artifacts archived outside the repo. They
|
|
43
|
+
are intentionally not tracked here (per DG005).
|
intendant-4.0.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Damien Grauet
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|