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.
Files changed (400) hide show
  1. intendant-4.0.0/.gitattributes +1 -0
  2. intendant-4.0.0/.github/workflows/ci.yml +65 -0
  3. intendant-4.0.0/.github/workflows/release-please.yml +18 -0
  4. intendant-4.0.0/.gitignore +48 -0
  5. intendant-4.0.0/.intendant.toml +6 -0
  6. intendant-4.0.0/.pre-commit-config.yaml +30 -0
  7. intendant-4.0.0/.python-version +1 -0
  8. intendant-4.0.0/.release-please-manifest.json +3 -0
  9. intendant-4.0.0/CHANGELOG.md +412 -0
  10. intendant-4.0.0/CLAUDE.md +43 -0
  11. intendant-4.0.0/LICENSE +21 -0
  12. intendant-4.0.0/PKG-INFO +259 -0
  13. intendant-4.0.0/README.md +238 -0
  14. intendant-4.0.0/docs/adr/0000-record-architecture-decisions.md +42 -0
  15. intendant-4.0.0/docs/adr/0001-layout-src-vs-flat.md +47 -0
  16. intendant-4.0.0/docs/adr/0002-uv-as-dependency-manager.md +48 -0
  17. intendant-4.0.0/docs/adr/0003-ty-with-pyright-fallback.md +51 -0
  18. intendant-4.0.0/docs/adr/0004-conventional-commits-strict.md +47 -0
  19. intendant-4.0.0/docs/adr/0005-release-please.md +50 -0
  20. intendant-4.0.0/docs/adr/0006-python-harness-pyo3-escape-hatch.md +50 -0
  21. intendant-4.0.0/docs/adr/0007-adopt-suzerain.md +38 -0
  22. intendant-4.0.0/docs/adr/0008-rename-suzerain-to-intendant.md +38 -0
  23. intendant-4.0.0/docs/handbook/00-charter.md +47 -0
  24. intendant-4.0.0/docs/handbook/01-layout.md +28 -0
  25. intendant-4.0.0/docs/handbook/02-packaging.md +34 -0
  26. intendant-4.0.0/docs/handbook/03-ci.md +49 -0
  27. intendant-4.0.0/docs/handbook/04-quality.md +39 -0
  28. intendant-4.0.0/docs/handbook/05-tests.md +28 -0
  29. intendant-4.0.0/docs/handbook/06-sanitizing.md +50 -0
  30. intendant-4.0.0/docs/handbook/07-releases.md +67 -0
  31. intendant-4.0.0/docs/handbook/08-docs-and-agent.md +48 -0
  32. intendant-4.0.0/docs/handbook/09-claude-skill.md +64 -0
  33. intendant-4.0.0/docs/handbook/10-node.md +59 -0
  34. intendant-4.0.0/docs/handbook/11-rust.md +71 -0
  35. intendant-4.0.0/docs/handbook/12-go.md +67 -0
  36. intendant-4.0.0/docs/handbook/13-swift.md +69 -0
  37. intendant-4.0.0/docs/handbook/14-multi-stack.md +168 -0
  38. intendant-4.0.0/docs/migrations/0.2.0-rule-prefix-rename.md +83 -0
  39. intendant-4.0.0/pyproject.toml +81 -0
  40. intendant-4.0.0/release-please-config.json +14 -0
  41. intendant-4.0.0/src/intendant/__init__.py +3 -0
  42. intendant-4.0.0/src/intendant/__main__.py +6 -0
  43. intendant-4.0.0/src/intendant/adapters/__init__.py +0 -0
  44. intendant-4.0.0/src/intendant/adapters/claude_skill/__init__.py +26 -0
  45. intendant-4.0.0/src/intendant/adapters/claude_skill/ci.py +34 -0
  46. intendant-4.0.0/src/intendant/adapters/claude_skill/inspectors.py +62 -0
  47. intendant-4.0.0/src/intendant/adapters/claude_skill/sk.py +287 -0
  48. intendant-4.0.0/src/intendant/adapters/go/__init__.py +18 -0
  49. intendant-4.0.0/src/intendant/adapters/go/ci.py +43 -0
  50. intendant-4.0.0/src/intendant/adapters/go/inspectors.py +58 -0
  51. intendant-4.0.0/src/intendant/adapters/go/pk.py +65 -0
  52. intendant-4.0.0/src/intendant/adapters/go/qu.py +30 -0
  53. intendant-4.0.0/src/intendant/adapters/go/sa.py +33 -0
  54. intendant-4.0.0/src/intendant/adapters/go/ts.py +31 -0
  55. intendant-4.0.0/src/intendant/adapters/node/__init__.py +19 -0
  56. intendant-4.0.0/src/intendant/adapters/node/ci.py +44 -0
  57. intendant-4.0.0/src/intendant/adapters/node/inspectors.py +37 -0
  58. intendant-4.0.0/src/intendant/adapters/node/pk.py +63 -0
  59. intendant-4.0.0/src/intendant/adapters/node/qu.py +60 -0
  60. intendant-4.0.0/src/intendant/adapters/node/sa.py +33 -0
  61. intendant-4.0.0/src/intendant/adapters/node/ts.py +46 -0
  62. intendant-4.0.0/src/intendant/adapters/python/__init__.py +36 -0
  63. intendant-4.0.0/src/intendant/adapters/python/ci.py +43 -0
  64. intendant-4.0.0/src/intendant/adapters/python/inspectors.py +29 -0
  65. intendant-4.0.0/src/intendant/adapters/python/lo.py +47 -0
  66. intendant-4.0.0/src/intendant/adapters/python/pk.py +178 -0
  67. intendant-4.0.0/src/intendant/adapters/python/qu.py +167 -0
  68. intendant-4.0.0/src/intendant/adapters/python/sa.py +33 -0
  69. intendant-4.0.0/src/intendant/adapters/python/ts.py +68 -0
  70. intendant-4.0.0/src/intendant/adapters/rust/__init__.py +18 -0
  71. intendant-4.0.0/src/intendant/adapters/rust/ci.py +41 -0
  72. intendant-4.0.0/src/intendant/adapters/rust/inspectors.py +38 -0
  73. intendant-4.0.0/src/intendant/adapters/rust/pk.py +76 -0
  74. intendant-4.0.0/src/intendant/adapters/rust/qu.py +23 -0
  75. intendant-4.0.0/src/intendant/adapters/rust/sa.py +33 -0
  76. intendant-4.0.0/src/intendant/adapters/rust/ts.py +31 -0
  77. intendant-4.0.0/src/intendant/adapters/swift/__init__.py +18 -0
  78. intendant-4.0.0/src/intendant/adapters/swift/ci.py +42 -0
  79. intendant-4.0.0/src/intendant/adapters/swift/inspectors.py +75 -0
  80. intendant-4.0.0/src/intendant/adapters/swift/pk.py +69 -0
  81. intendant-4.0.0/src/intendant/adapters/swift/qu.py +29 -0
  82. intendant-4.0.0/src/intendant/adapters/swift/sa.py +33 -0
  83. intendant-4.0.0/src/intendant/adapters/swift/ts.py +34 -0
  84. intendant-4.0.0/src/intendant/audit/__init__.py +0 -0
  85. intendant-4.0.0/src/intendant/audit/diff.py +115 -0
  86. intendant-4.0.0/src/intendant/audit/discovery.py +23 -0
  87. intendant-4.0.0/src/intendant/audit/fix.py +53 -0
  88. intendant-4.0.0/src/intendant/audit/output/__init__.py +0 -0
  89. intendant-4.0.0/src/intendant/audit/output/_html_assets.py +273 -0
  90. intendant-4.0.0/src/intendant/audit/output/human.py +84 -0
  91. intendant-4.0.0/src/intendant/audit/output/json_format.py +71 -0
  92. intendant-4.0.0/src/intendant/audit/output/md.py +79 -0
  93. intendant-4.0.0/src/intendant/audit/output/report_diff_html.py +144 -0
  94. intendant-4.0.0/src/intendant/audit/output/report_diff_human.py +79 -0
  95. intendant-4.0.0/src/intendant/audit/output/report_diff_json.py +31 -0
  96. intendant-4.0.0/src/intendant/audit/output/report_html.py +208 -0
  97. intendant-4.0.0/src/intendant/audit/output/report_human.py +110 -0
  98. intendant-4.0.0/src/intendant/audit/output/report_json.py +83 -0
  99. intendant-4.0.0/src/intendant/audit/registry.py +97 -0
  100. intendant-4.0.0/src/intendant/audit/runner.py +197 -0
  101. intendant-4.0.0/src/intendant/audit/snapshot.py +109 -0
  102. intendant-4.0.0/src/intendant/checks/__init__.py +52 -0
  103. intendant-4.0.0/src/intendant/checks/ci.py +88 -0
  104. intendant-4.0.0/src/intendant/checks/dg.py +185 -0
  105. intendant-4.0.0/src/intendant/checks/lo.py +19 -0
  106. intendant-4.0.0/src/intendant/checks/rl.py +254 -0
  107. intendant-4.0.0/src/intendant/checks/rl005.py +123 -0
  108. intendant-4.0.0/src/intendant/checks/sa.py +250 -0
  109. intendant-4.0.0/src/intendant/checks/ts.py +33 -0
  110. intendant-4.0.0/src/intendant/cli.py +59 -0
  111. intendant-4.0.0/src/intendant/commands/__init__.py +0 -0
  112. intendant-4.0.0/src/intendant/commands/audit.py +98 -0
  113. intendant-4.0.0/src/intendant/commands/doctor.py +28 -0
  114. intendant-4.0.0/src/intendant/commands/explain.py +123 -0
  115. intendant-4.0.0/src/intendant/commands/init.py +123 -0
  116. intendant-4.0.0/src/intendant/commands/mcp.py +27 -0
  117. intendant-4.0.0/src/intendant/commands/new.py +152 -0
  118. intendant-4.0.0/src/intendant/commands/report.py +241 -0
  119. intendant-4.0.0/src/intendant/core/__init__.py +0 -0
  120. intendant-4.0.0/src/intendant/core/config.py +174 -0
  121. intendant-4.0.0/src/intendant/core/handbook.py +115 -0
  122. intendant-4.0.0/src/intendant/core/patch.py +56 -0
  123. intendant-4.0.0/src/intendant/core/paths.py +38 -0
  124. intendant-4.0.0/src/intendant/core/repo.py +67 -0
  125. intendant-4.0.0/src/intendant/core/report.py +73 -0
  126. intendant-4.0.0/src/intendant/core/rule.py +46 -0
  127. intendant-4.0.0/src/intendant/core/subproject.py +14 -0
  128. intendant-4.0.0/src/intendant/mcp_server/__init__.py +6 -0
  129. intendant-4.0.0/src/intendant/mcp_server/handlers.py +158 -0
  130. intendant-4.0.0/src/intendant/mcp_server/server.py +59 -0
  131. intendant-4.0.0/src/intendant/scaffold/__init__.py +0 -0
  132. intendant-4.0.0/src/intendant/scaffold/engine.py +290 -0
  133. intendant-4.0.0/src/intendant/scaffold/substitutions.py +86 -0
  134. intendant-4.0.0/templates/_common/.editorconfig +18 -0
  135. intendant-4.0.0/templates/_common/.gitignore.template +49 -0
  136. intendant-4.0.0/templates/_common/.intendant.toml.template +10 -0
  137. intendant-4.0.0/templates/_common/0000-record-architecture-decisions.md.template +38 -0
  138. intendant-4.0.0/templates/_common/CHANGELOG.skeleton.md +9 -0
  139. intendant-4.0.0/templates/_common/CLAUDE.md.template +35 -0
  140. intendant-4.0.0/templates/_common/LICENSE.template +21 -0
  141. intendant-4.0.0/templates/_common/README.skeleton.md +29 -0
  142. intendant-4.0.0/templates/_common/adr.md +30 -0
  143. intendant-4.0.0/templates/claude-skill/.github/workflows/ci.yml +15 -0
  144. intendant-4.0.0/templates/claude-skill/.gitignore.template +5 -0
  145. intendant-4.0.0/templates/claude-skill/.intendant.toml.template +9 -0
  146. intendant-4.0.0/templates/claude-skill/.pre-commit-config.yaml.template +11 -0
  147. intendant-4.0.0/templates/claude-skill/.release-please-manifest.json.template +1 -0
  148. intendant-4.0.0/templates/claude-skill/README.md.template +19 -0
  149. intendant-4.0.0/templates/claude-skill/SKILL.md.template +16 -0
  150. intendant-4.0.0/templates/claude-skill/evals/case-1.md.template +6 -0
  151. intendant-4.0.0/templates/claude-skill/release-please-config.json.template +7 -0
  152. intendant-4.0.0/templates/github/.release-please-manifest.json.template +3 -0
  153. intendant-4.0.0/templates/github/ci.yml +59 -0
  154. intendant-4.0.0/templates/github/release-please-config.json.template +14 -0
  155. intendant-4.0.0/templates/github/release-please.yml +19 -0
  156. intendant-4.0.0/templates/go/.github/workflows/ci.yml.template +46 -0
  157. intendant-4.0.0/templates/go/.gitignore.template +13 -0
  158. intendant-4.0.0/templates/go/.golangci.yml.template +10 -0
  159. intendant-4.0.0/templates/go/.intendant.toml.template +7 -0
  160. intendant-4.0.0/templates/go/.pre-commit-config.yaml.template +16 -0
  161. intendant-4.0.0/templates/go/.release-please-manifest.json.template +3 -0
  162. intendant-4.0.0/templates/go/README.md.template +21 -0
  163. intendant-4.0.0/templates/go/go.mod.template +3 -0
  164. intendant-4.0.0/templates/go/release-please-config.json.template +7 -0
  165. intendant-4.0.0/templates/node/.github/workflows/ci.yml.template +52 -0
  166. intendant-4.0.0/templates/node/.gitignore.template +7 -0
  167. intendant-4.0.0/templates/node/.intendant.toml.template +7 -0
  168. intendant-4.0.0/templates/node/.pre-commit-config.yaml.template +11 -0
  169. intendant-4.0.0/templates/node/.release-please-manifest.json.template +1 -0
  170. intendant-4.0.0/templates/node/README.md.template +19 -0
  171. intendant-4.0.0/templates/node/eslint.config.js.template +9 -0
  172. intendant-4.0.0/templates/node/package.json.template +24 -0
  173. intendant-4.0.0/templates/node/release-please-config.json.template +7 -0
  174. intendant-4.0.0/templates/node/tsconfig.json.template +13 -0
  175. intendant-4.0.0/templates/python/.pre-commit-config.yaml +31 -0
  176. intendant-4.0.0/templates/python/commitizen.toml +7 -0
  177. intendant-4.0.0/templates/python/pyproject.toml.template +58 -0
  178. intendant-4.0.0/templates/python/ruff.toml +13 -0
  179. intendant-4.0.0/templates/python/ty.toml +10 -0
  180. intendant-4.0.0/templates/rust/.github/workflows/ci.yml.template +43 -0
  181. intendant-4.0.0/templates/rust/.gitignore.template +6 -0
  182. intendant-4.0.0/templates/rust/.intendant.toml.template +7 -0
  183. intendant-4.0.0/templates/rust/.pre-commit-config.yaml.template +17 -0
  184. intendant-4.0.0/templates/rust/.release-please-manifest.json.template +3 -0
  185. intendant-4.0.0/templates/rust/Cargo.toml.template +8 -0
  186. intendant-4.0.0/templates/rust/README.md.template +20 -0
  187. intendant-4.0.0/templates/rust/release-please-config.json.template +7 -0
  188. intendant-4.0.0/templates/rust/rust-toolchain.toml.template +3 -0
  189. intendant-4.0.0/templates/rust/rustfmt.toml.template +2 -0
  190. intendant-4.0.0/templates/swift/.github/workflows/ci.yml.template +48 -0
  191. intendant-4.0.0/templates/swift/.gitignore.template +10 -0
  192. intendant-4.0.0/templates/swift/.intendant.toml.template +7 -0
  193. intendant-4.0.0/templates/swift/.pre-commit-config.yaml.template +16 -0
  194. intendant-4.0.0/templates/swift/.release-please-manifest.json.template +3 -0
  195. intendant-4.0.0/templates/swift/.swiftlint.yml.template +12 -0
  196. intendant-4.0.0/templates/swift/README.md.template +20 -0
  197. intendant-4.0.0/templates/swift/release-please-config.json.template +7 -0
  198. intendant-4.0.0/tests/__init__.py +0 -0
  199. intendant-4.0.0/tests/conftest.py +11 -0
  200. intendant-4.0.0/tests/e2e/__init__.py +0 -0
  201. intendant-4.0.0/tests/e2e/test_audit_subprojects_e2e.py +54 -0
  202. intendant-4.0.0/tests/e2e/test_claude_skill_e2e.py +24 -0
  203. intendant-4.0.0/tests/e2e/test_report_e2e.py +135 -0
  204. intendant-4.0.0/tests/e2e/test_report_html_diff_e2e.py +44 -0
  205. intendant-4.0.0/tests/e2e/test_report_html_e2e.py +78 -0
  206. intendant-4.0.0/tests/e2e/test_report_html_from_snapshot_e2e.py +57 -0
  207. intendant-4.0.0/tests/e2e/test_scaffold_e2e.py +236 -0
  208. intendant-4.0.0/tests/fixtures/conformant_python_repo/.github/workflows/ci.yml +24 -0
  209. intendant-4.0.0/tests/fixtures/conformant_python_repo/.gitignore +4 -0
  210. intendant-4.0.0/tests/fixtures/conformant_python_repo/.intendant.toml +6 -0
  211. intendant-4.0.0/tests/fixtures/conformant_python_repo/.pre-commit-config.yaml +12 -0
  212. intendant-4.0.0/tests/fixtures/conformant_python_repo/.python-version +1 -0
  213. intendant-4.0.0/tests/fixtures/conformant_python_repo/.release-please-manifest.json +1 -0
  214. intendant-4.0.0/tests/fixtures/conformant_python_repo/CHANGELOG.md +5 -0
  215. intendant-4.0.0/tests/fixtures/conformant_python_repo/LICENSE +2 -0
  216. intendant-4.0.0/tests/fixtures/conformant_python_repo/README.md +3 -0
  217. intendant-4.0.0/tests/fixtures/conformant_python_repo/docs/adr/0001-init.md +2 -0
  218. intendant-4.0.0/tests/fixtures/conformant_python_repo/pyproject.toml +28 -0
  219. intendant-4.0.0/tests/fixtures/conformant_python_repo/release-please-config.json +1 -0
  220. intendant-4.0.0/tests/fixtures/conformant_python_repo/src/conformant/__init__.py +0 -0
  221. intendant-4.0.0/tests/fixtures/conformant_python_repo/tests/conftest.py +0 -0
  222. intendant-4.0.0/tests/fixtures/conformant_python_repo/uv.lock +1 -0
  223. intendant-4.0.0/tests/fixtures/empty_repo/.gitkeep +0 -0
  224. intendant-4.0.0/tests/fixtures/handbook_mini/adr/9999-test-decision.md +25 -0
  225. intendant-4.0.0/tests/fixtures/handbook_mini/handbook/99-test.md +24 -0
  226. intendant-4.0.0/tests/fixtures/multi_subproject_repo/.github/workflows/ci.yml +12 -0
  227. intendant-4.0.0/tests/fixtures/multi_subproject_repo/.gitignore +3 -0
  228. intendant-4.0.0/tests/fixtures/multi_subproject_repo/.intendant.toml +18 -0
  229. intendant-4.0.0/tests/fixtures/multi_subproject_repo/.pre-commit-config.yaml +11 -0
  230. intendant-4.0.0/tests/fixtures/multi_subproject_repo/.python-version +1 -0
  231. intendant-4.0.0/tests/fixtures/multi_subproject_repo/.release-please-manifest.json +1 -0
  232. intendant-4.0.0/tests/fixtures/multi_subproject_repo/CHANGELOG.md +4 -0
  233. intendant-4.0.0/tests/fixtures/multi_subproject_repo/CLAUDE.md +2 -0
  234. intendant-4.0.0/tests/fixtures/multi_subproject_repo/LICENSE +1 -0
  235. intendant-4.0.0/tests/fixtures/multi_subproject_repo/README.md +2 -0
  236. intendant-4.0.0/tests/fixtures/multi_subproject_repo/backend/.python-version +1 -0
  237. intendant-4.0.0/tests/fixtures/multi_subproject_repo/backend/pyproject.toml +15 -0
  238. intendant-4.0.0/tests/fixtures/multi_subproject_repo/backend/src/backend/__init__.py +1 -0
  239. intendant-4.0.0/tests/fixtures/multi_subproject_repo/backend/tests/test_placeholder.py +2 -0
  240. intendant-4.0.0/tests/fixtures/multi_subproject_repo/backend/uv.lock +2 -0
  241. intendant-4.0.0/tests/fixtures/multi_subproject_repo/pyproject.toml +19 -0
  242. intendant-4.0.0/tests/fixtures/multi_subproject_repo/release-please-config.json +1 -0
  243. intendant-4.0.0/tests/fixtures/multi_subproject_repo/src/multi_subproject_repo/__init__.py +1 -0
  244. intendant-4.0.0/tests/fixtures/multi_subproject_repo/tests/test_placeholder.py +2 -0
  245. intendant-4.0.0/tests/fixtures/multi_subproject_repo/uv.lock +2 -0
  246. intendant-4.0.0/tests/fixtures/node_repo/package.json +4 -0
  247. intendant-4.0.0/tests/fixtures/nonconformant_python_repo/.intendant.toml +6 -0
  248. intendant-4.0.0/tests/fixtures/nonconformant_python_repo/pyproject.toml +3 -0
  249. intendant-4.0.0/tests/fixtures/portfolio_mini/repo_a_clean/.github/workflows/ci.yml +11 -0
  250. intendant-4.0.0/tests/fixtures/portfolio_mini/repo_a_clean/.gitignore +3 -0
  251. intendant-4.0.0/tests/fixtures/portfolio_mini/repo_a_clean/.intendant.toml +6 -0
  252. intendant-4.0.0/tests/fixtures/portfolio_mini/repo_a_clean/.pre-commit-config.yaml +11 -0
  253. intendant-4.0.0/tests/fixtures/portfolio_mini/repo_a_clean/.python-version +1 -0
  254. intendant-4.0.0/tests/fixtures/portfolio_mini/repo_a_clean/.release-please-manifest.json +1 -0
  255. intendant-4.0.0/tests/fixtures/portfolio_mini/repo_a_clean/CHANGELOG.md +4 -0
  256. intendant-4.0.0/tests/fixtures/portfolio_mini/repo_a_clean/CLAUDE.md +2 -0
  257. intendant-4.0.0/tests/fixtures/portfolio_mini/repo_a_clean/LICENSE +1 -0
  258. intendant-4.0.0/tests/fixtures/portfolio_mini/repo_a_clean/README.md +2 -0
  259. intendant-4.0.0/tests/fixtures/portfolio_mini/repo_a_clean/pyproject.toml +16 -0
  260. intendant-4.0.0/tests/fixtures/portfolio_mini/repo_a_clean/release-please-config.json +1 -0
  261. intendant-4.0.0/tests/fixtures/portfolio_mini/repo_a_clean/src/repo_a_clean/__init__.py +1 -0
  262. intendant-4.0.0/tests/fixtures/portfolio_mini/repo_a_clean/tests/test_placeholder.py +2 -0
  263. intendant-4.0.0/tests/fixtures/portfolio_mini/repo_a_clean/uv.lock +2 -0
  264. intendant-4.0.0/tests/fixtures/portfolio_mini/repo_b_partial/.github/workflows/ci.yml +11 -0
  265. intendant-4.0.0/tests/fixtures/portfolio_mini/repo_b_partial/.gitignore +3 -0
  266. intendant-4.0.0/tests/fixtures/portfolio_mini/repo_b_partial/.intendant.toml +6 -0
  267. intendant-4.0.0/tests/fixtures/portfolio_mini/repo_b_partial/.python-version +1 -0
  268. intendant-4.0.0/tests/fixtures/portfolio_mini/repo_b_partial/LICENSE +1 -0
  269. intendant-4.0.0/tests/fixtures/portfolio_mini/repo_b_partial/README.md +1 -0
  270. intendant-4.0.0/tests/fixtures/portfolio_mini/repo_b_partial/pyproject.toml +10 -0
  271. intendant-4.0.0/tests/fixtures/portfolio_mini/repo_b_partial/src/repo_b_partial/__init__.py +1 -0
  272. intendant-4.0.0/tests/fixtures/portfolio_mini/repo_b_partial/tests/test_placeholder.py +2 -0
  273. intendant-4.0.0/tests/fixtures/portfolio_mini/repo_b_partial/uv.lock +2 -0
  274. intendant-4.0.0/tests/fixtures/portfolio_mini/repo_c_no_marker/README.md +2 -0
  275. intendant-4.0.0/tests/fixtures/python_repo/pyproject.toml +3 -0
  276. intendant-4.0.0/tests/fixtures/rust_repo/Cargo.toml +4 -0
  277. intendant-4.0.0/tests/fixtures/swift_repo/Package.swift +4 -0
  278. intendant-4.0.0/tests/fixtures/valid_claude_skill_repo/README.md +7 -0
  279. intendant-4.0.0/tests/fixtures/valid_claude_skill_repo/my-skill/SKILL.md +8 -0
  280. intendant-4.0.0/tests/fixtures/valid_claude_skill_repo/my-skill/evals/case-1.md +1 -0
  281. intendant-4.0.0/tests/fixtures/valid_claude_skill_repo/my-skill/references/api.md +1 -0
  282. intendant-4.0.0/tests/fixtures/valid_claude_skill_repo/my-skill/scripts/helper.py +1 -0
  283. intendant-4.0.0/tests/fixtures/valid_go_repo/.github/workflows/ci.yml +13 -0
  284. intendant-4.0.0/tests/fixtures/valid_go_repo/.gitignore +3 -0
  285. intendant-4.0.0/tests/fixtures/valid_go_repo/.golangci.yml +6 -0
  286. intendant-4.0.0/tests/fixtures/valid_go_repo/go.mod +3 -0
  287. intendant-4.0.0/tests/fixtures/valid_go_repo/go.sum +0 -0
  288. intendant-4.0.0/tests/fixtures/valid_go_repo/main.go +11 -0
  289. intendant-4.0.0/tests/fixtures/valid_go_repo/main_test.go +9 -0
  290. intendant-4.0.0/tests/fixtures/valid_rust_repo/.github/workflows/ci.yml +10 -0
  291. intendant-4.0.0/tests/fixtures/valid_rust_repo/.gitignore +2 -0
  292. intendant-4.0.0/tests/fixtures/valid_rust_repo/Cargo.lock +7 -0
  293. intendant-4.0.0/tests/fixtures/valid_rust_repo/Cargo.toml +4 -0
  294. intendant-4.0.0/tests/fixtures/valid_rust_repo/rust-toolchain.toml +3 -0
  295. intendant-4.0.0/tests/fixtures/valid_rust_repo/src/lib.rs +13 -0
  296. intendant-4.0.0/tests/fixtures/valid_swift_repo/.build/index-build/arm64-apple-macosx/debug/index/db/v13/saved/data.mdb +0 -0
  297. intendant-4.0.0/tests/fixtures/valid_swift_repo/.build/index-build/arm64-apple-macosx/debug/index/db/v13/saved/lock.mdb +0 -0
  298. intendant-4.0.0/tests/fixtures/valid_swift_repo/.build/index-build/workspace-state.json +14 -0
  299. intendant-4.0.0/tests/fixtures/valid_swift_repo/.github/workflows/ci.yml +10 -0
  300. intendant-4.0.0/tests/fixtures/valid_swift_repo/.gitignore +3 -0
  301. intendant-4.0.0/tests/fixtures/valid_swift_repo/.swiftlint.yml +2 -0
  302. intendant-4.0.0/tests/fixtures/valid_swift_repo/Package.resolved +4 -0
  303. intendant-4.0.0/tests/fixtures/valid_swift_repo/Package.swift +13 -0
  304. intendant-4.0.0/tests/fixtures/valid_swift_repo/Sources/MyLib/MyLib.swift +4 -0
  305. intendant-4.0.0/tests/fixtures/valid_swift_repo/Tests/MyLibTests/MyLibTests.swift +8 -0
  306. intendant-4.0.0/tests/unit/__init__.py +0 -0
  307. intendant-4.0.0/tests/unit/adapters/__init__.py +0 -0
  308. intendant-4.0.0/tests/unit/adapters/claude_skill/__init__.py +0 -0
  309. intendant-4.0.0/tests/unit/adapters/claude_skill/test_ci.py +68 -0
  310. intendant-4.0.0/tests/unit/adapters/go/__init__.py +0 -0
  311. intendant-4.0.0/tests/unit/adapters/go/test_ci.py +60 -0
  312. intendant-4.0.0/tests/unit/adapters/go/test_fixture_passes.py +36 -0
  313. intendant-4.0.0/tests/unit/adapters/go/test_inspectors.py +56 -0
  314. intendant-4.0.0/tests/unit/adapters/go/test_pk.py +74 -0
  315. intendant-4.0.0/tests/unit/adapters/go/test_qu_ts_sa.py +78 -0
  316. intendant-4.0.0/tests/unit/adapters/node/__init__.py +0 -0
  317. intendant-4.0.0/tests/unit/adapters/node/test_ci.py +147 -0
  318. intendant-4.0.0/tests/unit/adapters/node/test_inspectors.py +63 -0
  319. intendant-4.0.0/tests/unit/adapters/node/test_pk.py +130 -0
  320. intendant-4.0.0/tests/unit/adapters/node/test_qu.py +120 -0
  321. intendant-4.0.0/tests/unit/adapters/node/test_sa.py +53 -0
  322. intendant-4.0.0/tests/unit/adapters/node/test_ts.py +91 -0
  323. intendant-4.0.0/tests/unit/adapters/python/__init__.py +0 -0
  324. intendant-4.0.0/tests/unit/adapters/python/test_ci.py +158 -0
  325. intendant-4.0.0/tests/unit/adapters/python/test_inspectors.py +46 -0
  326. intendant-4.0.0/tests/unit/adapters/python/test_lo.py +43 -0
  327. intendant-4.0.0/tests/unit/adapters/python/test_pk.py +197 -0
  328. intendant-4.0.0/tests/unit/adapters/python/test_qu.py +151 -0
  329. intendant-4.0.0/tests/unit/adapters/python/test_sa.py +53 -0
  330. intendant-4.0.0/tests/unit/adapters/python/test_ts.py +78 -0
  331. intendant-4.0.0/tests/unit/adapters/rust/__init__.py +0 -0
  332. intendant-4.0.0/tests/unit/adapters/rust/test_ci.py +67 -0
  333. intendant-4.0.0/tests/unit/adapters/rust/test_fixture_passes.py +36 -0
  334. intendant-4.0.0/tests/unit/adapters/rust/test_inspectors.py +51 -0
  335. intendant-4.0.0/tests/unit/adapters/rust/test_pk.py +91 -0
  336. intendant-4.0.0/tests/unit/adapters/rust/test_qu.py +34 -0
  337. intendant-4.0.0/tests/unit/adapters/rust/test_sa.py +35 -0
  338. intendant-4.0.0/tests/unit/adapters/rust/test_ts.py +46 -0
  339. intendant-4.0.0/tests/unit/adapters/swift/__init__.py +0 -0
  340. intendant-4.0.0/tests/unit/adapters/swift/test_ci.py +61 -0
  341. intendant-4.0.0/tests/unit/adapters/swift/test_fixture_passes.py +36 -0
  342. intendant-4.0.0/tests/unit/adapters/swift/test_inspectors.py +96 -0
  343. intendant-4.0.0/tests/unit/adapters/swift/test_pk.py +84 -0
  344. intendant-4.0.0/tests/unit/adapters/swift/test_qu_ts_sa.py +80 -0
  345. intendant-4.0.0/tests/unit/audit/__init__.py +0 -0
  346. intendant-4.0.0/tests/unit/audit/output/__init__.py +0 -0
  347. intendant-4.0.0/tests/unit/audit/output/test_html_assets.py +137 -0
  348. intendant-4.0.0/tests/unit/audit/output/test_human_subprojects.py +72 -0
  349. intendant-4.0.0/tests/unit/audit/output/test_json_subprojects.py +55 -0
  350. intendant-4.0.0/tests/unit/audit/output/test_report_diff_html.py +144 -0
  351. intendant-4.0.0/tests/unit/audit/output/test_report_html.py +208 -0
  352. intendant-4.0.0/tests/unit/audit/output/test_report_html_edge_cases.py +121 -0
  353. intendant-4.0.0/tests/unit/audit/output/test_report_human.py +141 -0
  354. intendant-4.0.0/tests/unit/audit/output/test_report_json.py +168 -0
  355. intendant-4.0.0/tests/unit/audit/test_diff.py +347 -0
  356. intendant-4.0.0/tests/unit/audit/test_discovery.py +67 -0
  357. intendant-4.0.0/tests/unit/audit/test_runner_subprojects.py +118 -0
  358. intendant-4.0.0/tests/unit/audit/test_snapshot.py +347 -0
  359. intendant-4.0.0/tests/unit/checks/__init__.py +0 -0
  360. intendant-4.0.0/tests/unit/checks/test_ci.py +220 -0
  361. intendant-4.0.0/tests/unit/checks/test_dg.py +182 -0
  362. intendant-4.0.0/tests/unit/checks/test_lo.py +26 -0
  363. intendant-4.0.0/tests/unit/checks/test_rl.py +271 -0
  364. intendant-4.0.0/tests/unit/checks/test_rl005.py +166 -0
  365. intendant-4.0.0/tests/unit/checks/test_sa.py +309 -0
  366. intendant-4.0.0/tests/unit/checks/test_ts.py +32 -0
  367. intendant-4.0.0/tests/unit/commands/__init__.py +0 -0
  368. intendant-4.0.0/tests/unit/commands/test_mcp_command.py +27 -0
  369. intendant-4.0.0/tests/unit/commands/test_report_command.py +467 -0
  370. intendant-4.0.0/tests/unit/core/__init__.py +0 -0
  371. intendant-4.0.0/tests/unit/core/test_config_subprojects.py +194 -0
  372. intendant-4.0.0/tests/unit/core/test_subproject.py +21 -0
  373. intendant-4.0.0/tests/unit/mcp_server/__init__.py +0 -0
  374. intendant-4.0.0/tests/unit/mcp_server/test_handlers.py +102 -0
  375. intendant-4.0.0/tests/unit/scaffold/__init__.py +0 -0
  376. intendant-4.0.0/tests/unit/scaffold/test_engine.py +243 -0
  377. intendant-4.0.0/tests/unit/scaffold/test_substitutions.py +87 -0
  378. intendant-4.0.0/tests/unit/test_audit_command.py +73 -0
  379. intendant-4.0.0/tests/unit/test_audit_fix.py +48 -0
  380. intendant-4.0.0/tests/unit/test_claude_skill_adapter_skeleton.py +8 -0
  381. intendant-4.0.0/tests/unit/test_claude_skill_detection.py +39 -0
  382. intendant-4.0.0/tests/unit/test_claude_skill_inspectors.py +120 -0
  383. intendant-4.0.0/tests/unit/test_claude_skill_rules.py +395 -0
  384. intendant-4.0.0/tests/unit/test_cli.py +20 -0
  385. intendant-4.0.0/tests/unit/test_config.py +66 -0
  386. intendant-4.0.0/tests/unit/test_doctor_command.py +19 -0
  387. intendant-4.0.0/tests/unit/test_explain_command.py +79 -0
  388. intendant-4.0.0/tests/unit/test_handbook.py +120 -0
  389. intendant-4.0.0/tests/unit/test_init_command.py +93 -0
  390. intendant-4.0.0/tests/unit/test_new_command.py +502 -0
  391. intendant-4.0.0/tests/unit/test_output_human.py +57 -0
  392. intendant-4.0.0/tests/unit/test_output_json.py +51 -0
  393. intendant-4.0.0/tests/unit/test_output_md.py +81 -0
  394. intendant-4.0.0/tests/unit/test_patch.py +94 -0
  395. intendant-4.0.0/tests/unit/test_registry.py +159 -0
  396. intendant-4.0.0/tests/unit/test_repo.py +54 -0
  397. intendant-4.0.0/tests/unit/test_report.py +150 -0
  398. intendant-4.0.0/tests/unit/test_rule.py +89 -0
  399. intendant-4.0.0/tests/unit/test_runner.py +280 -0
  400. 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,6 @@
1
+ [intendant]
2
+ version = "1"
3
+ stack = "python"
4
+ enforcement = "strict"
5
+
6
+ [exemptions]
@@ -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,3 @@
1
+ {
2
+ ".": "4.0.0"
3
+ }
@@ -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).
@@ -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.