forge-template 0.3.2__tar.gz → 0.4.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 (355) hide show
  1. {forge_template-0.3.2 → forge_template-0.4.0}/.github/labels.toml +6 -1
  2. {forge_template-0.3.2 → forge_template-0.4.0}/.github/pull_request_template.md +2 -2
  3. {forge_template-0.3.2 → forge_template-0.4.0}/.github/workflows/release.yml +18 -6
  4. {forge_template-0.3.2 → forge_template-0.4.0}/.github/workflows/test-template.yml +4 -3
  5. forge_template-0.4.0/.markdownlint-cli2.jsonc +23 -0
  6. {forge_template-0.3.2 → forge_template-0.4.0}/.pre-commit-config.yaml +14 -3
  7. {forge_template-0.3.2 → forge_template-0.4.0}/AGENTS.md +2 -0
  8. forge_template-0.4.0/CLAUDE.md +526 -0
  9. {forge_template-0.3.2 → forge_template-0.4.0}/CONTRIBUTING.md +104 -10
  10. {forge_template-0.3.2 → forge_template-0.4.0}/PKG-INFO +75 -13
  11. {forge_template-0.3.2 → forge_template-0.4.0}/README.md +74 -12
  12. {forge_template-0.3.2 → forge_template-0.4.0}/docs/README.md +45 -0
  13. forge_template-0.4.0/docs/adr/0038-organisation-policy-selection-model.md +65 -0
  14. forge_template-0.4.0/docs/adr/0039-deny-policy-file-overrides.md +72 -0
  15. forge_template-0.4.0/docs/adr/0040-organisation-policy-reference-fixture.md +97 -0
  16. forge_template-0.4.0/docs/adr/0041-forge-blueprint-compatibility-policy.md +114 -0
  17. forge_template-0.4.0/docs/adr/0042-validate-no-copy-downstream-inheritance.md +71 -0
  18. forge_template-0.4.0/docs/adr/0043-split-invariants-out-of-claude-md.md +63 -0
  19. forge_template-0.4.0/docs/adr/0044-plan-data-science-as-the-third-archetype.md +60 -0
  20. forge_template-0.4.0/docs/adr/0045-data-science-project-shape.md +74 -0
  21. forge_template-0.4.0/docs/adr/0046-initial-data-science-capabilities.md +70 -0
  22. forge_template-0.4.0/docs/adr/0047-notebook-data-and-model-safeguards.md +114 -0
  23. forge_template-0.4.0/docs/adr/0048-data-science-compatibility-and-acceptance.md +104 -0
  24. forge_template-0.4.0/docs/adr/0049-foundation-capability-tooling-extension-points.md +107 -0
  25. forge_template-0.4.0/docs/adr/0050-production-jupyter-capability.md +88 -0
  26. forge_template-0.4.0/docs/adr/0051-production-scientific-python-capability.md +71 -0
  27. forge_template-0.4.0/docs/adr/0052-validate-production-capability-composition.md +93 -0
  28. forge_template-0.4.0/docs/adr/0053-production-data-science-archetype.md +94 -0
  29. forge_template-0.4.0/docs/adr/0054-data-science-notebook-and-artefact-layout.md +104 -0
  30. forge_template-0.4.0/docs/adr/0055-validate-data-science-generated-projects.md +130 -0
  31. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/README.md +18 -0
  32. forge_template-0.4.0/docs/capability-composition-validation.md +163 -0
  33. {forge_template-0.3.2 → forge_template-0.4.0}/docs/cli-application-archetype.md +5 -4
  34. forge_template-0.4.0/docs/compatibility-policy.md +244 -0
  35. {forge_template-0.3.2 → forge_template-0.4.0}/docs/component-manifests.md +24 -9
  36. {forge_template-0.3.2 → forge_template-0.4.0}/docs/composition-architecture-review.md +13 -0
  37. {forge_template-0.3.2 → forge_template-0.4.0}/docs/composition-fixtures.md +23 -5
  38. {forge_template-0.3.2 → forge_template-0.4.0}/docs/composition-order.md +6 -0
  39. forge_template-0.4.0/docs/data-science-archetype.md +187 -0
  40. forge_template-0.4.0/docs/data-science-capabilities.md +288 -0
  41. forge_template-0.4.0/docs/data-science-compatibility-and-acceptance.md +307 -0
  42. forge_template-0.4.0/docs/data-science-validation.md +132 -0
  43. forge_template-0.4.0/docs/extension-points.md +302 -0
  44. {forge_template-0.3.2 → forge_template-0.4.0}/docs/file-conflicts.md +10 -6
  45. {forge_template-0.3.2 → forge_template-0.4.0}/docs/foundation-scope.md +3 -1
  46. {forge_template-0.3.2 → forge_template-0.4.0}/docs/generated-project-validation.md +8 -1
  47. forge_template-0.4.0/docs/invariants.md +87 -0
  48. {forge_template-0.3.2 → forge_template-0.4.0}/docs/library-archetype.md +5 -4
  49. forge_template-0.4.0/docs/no-copy-inheritance.md +141 -0
  50. forge_template-0.4.0/docs/notebook-data-and-model-safeguards.md +436 -0
  51. forge_template-0.4.0/docs/organisation-policy-fixtures.md +149 -0
  52. forge_template-0.4.0/docs/organisation-policy.md +247 -0
  53. {forge_template-0.3.2 → forge_template-0.4.0}/docs/project-spec.md +7 -4
  54. {forge_template-0.3.2 → forge_template-0.4.0}/docs/python-support.md +10 -0
  55. {forge_template-0.3.2 → forge_template-0.4.0}/docs/roadmap-v1/ARCHITECTURE.md +25 -5
  56. {forge_template-0.3.2 → forge_template-0.4.0}/docs/roadmap-v1/README.md +31 -1
  57. {forge_template-0.3.2 → forge_template-0.4.0}/docs/roadmap-v1/REPOSITORY-OWNERSHIP.md +28 -5
  58. {forge_template-0.3.2 → forge_template-0.4.0}/docs/roadmap-v1/ROADMAP.md +5 -1
  59. {forge_template-0.3.2 → forge_template-0.4.0}/docs/roadmap-v1/github-issues/CROSS-REPO-DEPENDENCIES.md +10 -17
  60. {forge_template-0.3.2 → forge_template-0.4.0}/docs/roadmap-v1/github-issues/forge-template/ISSUE-INDEX.md +9 -9
  61. {forge_template-0.3.2 → forge_template-0.4.0}/docs/roadmap-v1/roadmap/00-governance-and-principles/README.md +10 -5
  62. {forge_template-0.3.2 → forge_template-0.4.0}/docs/roadmap-v1/roadmap/02-developer-experience/README.md +2 -1
  63. {forge_template-0.3.2 → forge_template-0.4.0}/docs/roadmap-v1/roadmap/06-extension-and-composition-contract/README.md +15 -15
  64. {forge_template-0.3.2 → forge_template-0.4.0}/docs/roadmap-v1/roadmap/08-reference-archetype-validation/README.md +21 -12
  65. forge_template-0.4.0/docs/roadmap-v1/roadmap/09-blueprint-compatibility/README.md +70 -0
  66. forge_template-0.4.0/docs/roadmap-v2/ARCHITECTURE.md +70 -0
  67. forge_template-0.4.0/docs/roadmap-v2/README.md +36 -0
  68. forge_template-0.4.0/docs/roadmap-v2/REPOSITORY-OWNERSHIP.md +72 -0
  69. forge_template-0.4.0/docs/roadmap-v2/ROADMAP.md +44 -0
  70. forge_template-0.4.0/docs/roadmap-v2/github-issues/CROSS-REPO-DEPENDENCIES.md +40 -0
  71. forge_template-0.4.0/docs/roadmap-v2/github-issues/GITHUB-SETUP.md +37 -0
  72. forge_template-0.4.0/docs/roadmap-v2/github-issues/forge-template/ISSUE-INDEX.md +33 -0
  73. forge_template-0.4.0/docs/roadmap-v2/roadmap/10-data-science-architecture-contract/README.md +65 -0
  74. forge_template-0.4.0/docs/roadmap-v2/roadmap/11-reusable-data-science-capabilities/README.md +66 -0
  75. forge_template-0.4.0/docs/roadmap-v2/roadmap/12-data-science-archetype/README.md +55 -0
  76. forge_template-0.4.0/docs/roadmap-v2/roadmap/13-data-science-cli-integration/README.md +53 -0
  77. forge_template-0.4.0/docs/roadmap-v2/roadmap/14-data-science-validation-and-rollout/README.md +64 -0
  78. {forge_template-0.3.2 → forge_template-0.4.0}/docs/secret-handling.md +4 -0
  79. {forge_template-0.3.2 → forge_template-0.4.0}/docs/template-engine-api.md +56 -10
  80. {forge_template-0.3.2 → forge_template-0.4.0}/docs/template-variables.md +3 -2
  81. {forge_template-0.3.2 → forge_template-0.4.0}/docs/terminology.md +41 -15
  82. {forge_template-0.3.2 → forge_template-0.4.0}/pyproject.toml +12 -3
  83. {forge_template-0.3.2 → forge_template-0.4.0}/scripts/check_wheel.py +25 -2
  84. forge_template-0.4.0/src/forge_template/components/data-science/component.toml +47 -0
  85. forge_template-0.4.0/src/forge_template/components/data-science/content/notebooks/getting-started.ipynb.jinja +84 -0
  86. forge_template-0.4.0/src/forge_template/components/data-science/extensions/archetype-metadata.toml.jinja +1 -0
  87. forge_template-0.4.0/src/forge_template/components/data-science/extensions/build-configuration.toml.jinja +3 -0
  88. forge_template-0.4.0/src/forge_template/components/data-science/extensions/build-system.toml.jinja +2 -0
  89. forge_template-0.4.0/src/forge_template/components/data-science/extensions/classifiers.toml.jinja +3 -0
  90. forge_template-0.4.0/src/forge_template/components/data-science/extensions/gitignore-project-shape.jinja +6 -0
  91. forge_template-0.4.0/src/forge_template/components/data-science/extensions/readme-project-shape.md.jinja +24 -0
  92. forge_template-0.4.0/src/forge_template/components/jupyter/component.toml +40 -0
  93. forge_template-0.4.0/src/forge_template/components/jupyter/content/scripts/check_notebooks.py +263 -0
  94. forge_template-0.4.0/src/forge_template/components/jupyter/extensions/aggregate-check.toml.jinja +1 -0
  95. forge_template-0.4.0/src/forge_template/components/jupyter/extensions/development-dependencies.toml.jinja +4 -0
  96. forge_template-0.4.0/src/forge_template/components/jupyter/extensions/gitignore-project-shape.jinja +1 -0
  97. forge_template-0.4.0/src/forge_template/components/jupyter/extensions/readme-project-shape.md.jinja +19 -0
  98. forge_template-0.4.0/src/forge_template/components/jupyter/extensions/task-definitions.toml.jinja +2 -0
  99. forge_template-0.4.0/src/forge_template/components/library/content/src/{{project.package_name}}/__init__.py.jinja +10 -0
  100. forge_template-0.4.0/src/forge_template/components/library/content/tests/test_smoke.py.jinja +7 -0
  101. forge_template-0.4.0/src/forge_template/components/scientific-python/component.toml +25 -0
  102. forge_template-0.4.0/src/forge_template/components/scientific-python/content/tests/test_scientific_python.py +18 -0
  103. forge_template-0.4.0/src/forge_template/components/scientific-python/extensions/readme-project-shape.md.jinja +8 -0
  104. forge_template-0.4.0/src/forge_template/components/scientific-python/extensions/runtime-dependencies.toml.jinja +4 -0
  105. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/foundation/content/pyproject.toml.jinja +10 -1
  106. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/foundation/foundation.toml +15 -0
  107. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/render.py +1 -1
  108. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/schema.py +2 -2
  109. forge_template-0.4.0/tests/__init__.py +0 -0
  110. {forge_template-0.3.2 → forge_template-0.4.0}/tests/conftest.py +39 -15
  111. forge_template-0.4.0/tests/fixtures/archetype_regression/digests.json +138 -0
  112. forge_template-0.4.0/tests/fixtures/capability_composition/conflicts-jupyter/component.toml +17 -0
  113. forge_template-0.4.0/tests/fixtures/capability_composition/conflicts-jupyter/content/conflicts_jupyter.md +3 -0
  114. forge_template-0.4.0/tests/fixtures/capability_composition/optioned-tooling/component.toml +25 -0
  115. forge_template-0.4.0/tests/fixtures/capability_composition/optioned-tooling/content/optioned_tooling.md +3 -0
  116. forge_template-0.4.0/tests/fixtures/capability_composition/optioned-tooling/extensions/task-definitions.toml.jinja +2 -0
  117. forge_template-0.4.0/tests/fixtures/capability_composition/optioned-tooling/options.schema.json +7 -0
  118. forge_template-0.4.0/tests/fixtures/capability_composition/requires-jupyter/component.toml +20 -0
  119. forge_template-0.4.0/tests/fixtures/capability_composition/requires-jupyter/content/requires_jupyter.md +3 -0
  120. forge_template-0.4.0/tests/fixtures/capability_tooling/alpha-tooling/component.toml +31 -0
  121. forge_template-0.4.0/tests/fixtures/capability_tooling/alpha-tooling/content/alpha-tooling.md +4 -0
  122. forge_template-0.4.0/tests/fixtures/capability_tooling/alpha-tooling/extensions/aggregate-check.toml.jinja +1 -0
  123. forge_template-0.4.0/tests/fixtures/capability_tooling/alpha-tooling/extensions/dependencies.toml.jinja +1 -0
  124. forge_template-0.4.0/tests/fixtures/capability_tooling/alpha-tooling/extensions/tasks.toml.jinja +1 -0
  125. forge_template-0.4.0/tests/fixtures/capability_tooling/beta-tooling/component.toml +31 -0
  126. forge_template-0.4.0/tests/fixtures/capability_tooling/beta-tooling/content/beta-tooling.md +4 -0
  127. forge_template-0.4.0/tests/fixtures/capability_tooling/beta-tooling/extensions/aggregate-check.toml.jinja +1 -0
  128. forge_template-0.4.0/tests/fixtures/capability_tooling/beta-tooling/extensions/dependencies.toml.jinja +1 -0
  129. forge_template-0.4.0/tests/fixtures/capability_tooling/beta-tooling/extensions/tasks.toml.jinja +1 -0
  130. forge_template-0.4.0/tests/fixtures/component_manifests/library-v2/content/src/{{project.package_name}}/py.typed +0 -0
  131. forge_template-0.4.0/tests/fixtures/organisation_policies/example-baseline.json +17 -0
  132. forge_template-0.4.0/tests/fixtures/organisation_policies/example-delivery-baseline.json +8 -0
  133. forge_template-0.4.0/tests/fixtures/organisation_policies/example-no-copy-inheritance.json +17 -0
  134. forge_template-0.4.0/tests/fixtures/organisation_policies/example-production-library.json +11 -0
  135. forge_template-0.4.0/tests/fixtures/organisation_policies/example-quality-baseline.json +11 -0
  136. forge_template-0.4.0/tests/fixtures/organisation_policies/example-restricted-delivery.json +8 -0
  137. forge_template-0.4.0/tests/no_copy_downstream.py +72 -0
  138. forge_template-0.4.0/tests/organisation_policy_contract.py +653 -0
  139. forge_template-0.4.0/tests/test_capability_composition.py +483 -0
  140. forge_template-0.4.0/tests/test_capability_extension_points.py +295 -0
  141. {forge_template-0.3.2 → forge_template-0.4.0}/tests/test_cli_archetype.py +8 -2
  142. forge_template-0.4.0/tests/test_compatibility_policy.py +166 -0
  143. forge_template-0.4.0/tests/test_data_science_archetype.py +413 -0
  144. forge_template-0.4.0/tests/test_data_science_build.py +180 -0
  145. forge_template-0.4.0/tests/test_data_science_composition.py +345 -0
  146. forge_template-0.4.0/tests/test_data_science_endpoints.py +221 -0
  147. forge_template-0.4.0/tests/test_data_science_notebook.py +200 -0
  148. {forge_template-0.3.2 → forge_template-0.4.0}/tests/test_engine.py +13 -6
  149. forge_template-0.4.0/tests/test_extension_points.py +243 -0
  150. forge_template-0.4.0/tests/test_jupyter_capability.py +175 -0
  151. forge_template-0.4.0/tests/test_jupyter_capability_build.py +84 -0
  152. {forge_template-0.3.2 → forge_template-0.4.0}/tests/test_library_archetype.py +8 -2
  153. forge_template-0.4.0/tests/test_no_copy_inheritance.py +235 -0
  154. forge_template-0.4.0/tests/test_notebook_validator.py +319 -0
  155. forge_template-0.4.0/tests/test_organisation_policy_fixture.py +491 -0
  156. forge_template-0.4.0/tests/test_scientific_python_capability.py +189 -0
  157. forge_template-0.4.0/tests/test_scientific_python_capability_build.py +98 -0
  158. {forge_template-0.3.2 → forge_template-0.4.0}/uv.lock +706 -1
  159. forge_template-0.3.2/CLAUDE.md +0 -379
  160. forge_template-0.3.2/docs/roadmap-v1/roadmap/09-blueprint-compatibility/README.md +0 -24
  161. {forge_template-0.3.2 → forge_template-0.4.0}/.gitattributes +0 -0
  162. {forge_template-0.3.2 → forge_template-0.4.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  163. {forge_template-0.3.2 → forge_template-0.4.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  164. {forge_template-0.3.2 → forge_template-0.4.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  165. {forge_template-0.3.2 → forge_template-0.4.0}/.github/dependabot.yml +0 -0
  166. {forge_template-0.3.2 → forge_template-0.4.0}/.gitignore +0 -0
  167. {forge_template-0.3.2 → forge_template-0.4.0}/LICENSE +0 -0
  168. {forge_template-0.3.2 → forge_template-0.4.0}/SECURITY.md +0 -0
  169. {forge_template-0.3.2 → forge_template-0.4.0}/copier.yml +0 -0
  170. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0001-record-architecture-decisions.md +0 -0
  171. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0002-copier-over-cookiecutter.md +0 -0
  172. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0003-two-repo-split.md +0 -0
  173. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0004-build-backend-and-versioning.md +0 -0
  174. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0005-git-cliff-for-changelogs.md +0 -0
  175. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0006-mypy-default-pyright-optional.md +0 -0
  176. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0007-mkdocs-pinned-below-2.md +0 -0
  177. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0008-remove-make-task-runner.md +0 -0
  178. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0009-branch-and-pr-workflow.md +0 -0
  179. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0010-forge-architectural-terminology.md +0 -0
  180. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0011-forge-foundation-guarantees.md +0 -0
  181. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0012-conservative-foundation-scope.md +0 -0
  182. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0013-python-support-policy.md +0 -0
  183. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0014-editor-neutral-foundation.md +0 -0
  184. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0015-owner-local-runtime-configuration.md +0 -0
  185. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0016-owner-local-environment-inputs.md +0 -0
  186. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0017-owner-local-structured-logging.md +0 -0
  187. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0018-owner-local-paths-and-resources.md +0 -0
  188. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0019-owner-local-exceptions.md +0 -0
  189. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0020-generated-project-secret-safeguards.md +0 -0
  190. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0021-defer-sbom-and-release-provenance.md +0 -0
  191. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0022-pin-github-actions-by-full-commit-sha.md +0 -0
  192. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0023-projectspec-protocol-v1.md +0 -0
  193. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0024-component-manifest-protocol-v1.md +0 -0
  194. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0025-deterministic-composition-order.md +0 -0
  195. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0026-file-conflict-and-override-rules.md +0 -0
  196. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0027-template-variable-contract.md +0 -0
  197. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0028-composition-contract-fixtures.md +0 -0
  198. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0029-stable-template-engine-api.md +0 -0
  199. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0030-generated-project-validation.md +0 -0
  200. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0031-library-archetype-contract.md +0 -0
  201. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0032-render-component-content-paths.md +0 -0
  202. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0033-migrate-library-production-catalogue.md +0 -0
  203. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0034-select-cli-application-reference-archetype.md +0 -0
  204. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0035-implement-cli-application-archetype.md +0 -0
  205. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0036-publish-the-engine-to-pypi.md +0 -0
  206. {forge_template-0.3.2 → forge_template-0.4.0}/docs/adr/0037-two-archetype-composition-review.md +0 -0
  207. {forge_template-0.3.2 → forge_template-0.4.0}/docs/configuration-ownership.md +0 -0
  208. {forge_template-0.3.2 → forge_template-0.4.0}/docs/editor-integration.md +0 -0
  209. {forge_template-0.3.2 → forge_template-0.4.0}/docs/environment-variables.md +0 -0
  210. {forge_template-0.3.2 → forge_template-0.4.0}/docs/exception-ownership.md +0 -0
  211. {forge_template-0.3.2 → forge_template-0.4.0}/docs/foundation-guarantees.md +0 -0
  212. {forge_template-0.3.2 → forge_template-0.4.0}/docs/github-action-pinning.md +0 -0
  213. {forge_template-0.3.2 → forge_template-0.4.0}/docs/paths-and-resources.md +0 -0
  214. {forge_template-0.3.2 → forge_template-0.4.0}/docs/roadmap-v1/github-issues/GITHUB-SETUP.md +0 -0
  215. {forge_template-0.3.2 → forge_template-0.4.0}/docs/roadmap-v1/roadmap/01-python-core/README.md +0 -0
  216. {forge_template-0.3.2 → forge_template-0.4.0}/docs/roadmap-v1/roadmap/03-quality-and-ci/README.md +0 -0
  217. {forge_template-0.3.2 → forge_template-0.4.0}/docs/roadmap-v1/roadmap/04-runtime-and-configuration/README.md +0 -0
  218. {forge_template-0.3.2 → forge_template-0.4.0}/docs/roadmap-v1/roadmap/05-security-and-supply-chain/README.md +0 -0
  219. {forge_template-0.3.2 → forge_template-0.4.0}/docs/roadmap-v1/roadmap/07-forge-cli-integration/README.md +0 -0
  220. {forge_template-0.3.2 → forge_template-0.4.0}/docs/structured-logging.md +0 -0
  221. {forge_template-0.3.2 → forge_template-0.4.0}/docs/supply-chain-provenance.md +0 -0
  222. {forge_template-0.3.2 → forge_template-0.4.0}/scripts/labels.py +0 -0
  223. {forge_template-0.3.2 → forge_template-0.4.0}/scripts/verify-ci.sh +0 -0
  224. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/__init__.py +0 -0
  225. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/adr.py +0 -0
  226. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/component_manifest.py +0 -0
  227. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/components/__init__.py +0 -0
  228. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/components/cli/component.toml +0 -0
  229. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/components/cli/content/src/{{project.package_name}}/__init__.py.jinja +0 -0
  230. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/components/cli/content/src/{{project.package_name}}/__main__.py.jinja +0 -0
  231. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/components/cli/content/src/{{project.package_name}}/cli.py.jinja +0 -0
  232. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/components/cli/content/src/{{project.package_name}}/py.typed +0 -0
  233. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/components/cli/content/tests/__init__.py +0 -0
  234. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/components/cli/content/tests/test_cli.py.jinja +0 -0
  235. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/components/cli/extensions/archetype-metadata.toml.jinja +0 -0
  236. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/components/cli/extensions/build-configuration.toml.jinja +0 -0
  237. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/components/cli/extensions/build-system.toml.jinja +0 -0
  238. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/components/cli/extensions/classifiers.toml.jinja +0 -0
  239. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/components/cli/extensions/entry-points.toml.jinja +0 -0
  240. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/components/cli/extensions/readme-project-shape.md.jinja +0 -0
  241. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/components/cli/extensions/runtime-dependencies.toml.jinja +0 -0
  242. {forge_template-0.3.2/src/forge_template/components/library → forge_template-0.4.0/src/forge_template/components/data-science}/content/src/{{project.package_name}}/__init__.py.jinja +0 -0
  243. {forge_template-0.3.2/src/forge_template/components/library → forge_template-0.4.0/src/forge_template/components/data-science}/content/src/{{project.package_name}}/py.typed +0 -0
  244. {forge_template-0.3.2/src/forge_template/components/library → forge_template-0.4.0/src/forge_template/components/data-science}/content/tests/__init__.py +0 -0
  245. {forge_template-0.3.2/src/forge_template/components/library → forge_template-0.4.0/src/forge_template/components/data-science}/content/tests/test_smoke.py.jinja +0 -0
  246. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/components/library/component.toml +0 -0
  247. {forge_template-0.3.2/src/forge_template → forge_template-0.4.0/src/forge_template/components/library/content/src/{{project.package_name}}}/py.typed +0 -0
  248. {forge_template-0.3.2/template → forge_template-0.4.0/src/forge_template/components/library/content}/tests/__init__.py +0 -0
  249. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/components/library/extensions/archetype-metadata.toml.jinja +0 -0
  250. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/components/library/extensions/build-configuration.toml.jinja +0 -0
  251. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/components/library/extensions/build-system.toml.jinja +0 -0
  252. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/components/library/extensions/classifiers.toml.jinja +0 -0
  253. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/components/library/extensions/gitignore-project-shape.jinja +0 -0
  254. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/components/library/extensions/readme-project-shape.md.jinja +0 -0
  255. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/components/library/options.schema.json +0 -0
  256. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/composition.py +0 -0
  257. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/engine.py +0 -0
  258. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/file_conflicts.py +0 -0
  259. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/foundation/__init__.py +0 -0
  260. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/foundation/content/.editorconfig +0 -0
  261. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/foundation/content/.gitattributes +0 -0
  262. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/foundation/content/.gitignore.jinja +0 -0
  263. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/foundation/content/.python-version.jinja +0 -0
  264. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/foundation/content/CONTRIBUTING.md.jinja +0 -0
  265. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/foundation/content/LICENSE.jinja +0 -0
  266. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/foundation/content/README.md.jinja +0 -0
  267. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/foundation/content/SECURITY.md.jinja +0 -0
  268. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/foundation_source.py +0 -0
  269. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/github_actions.py +0 -0
  270. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/project_spec.py +0 -0
  271. {forge_template-0.3.2/template/src/{{package_name}} → forge_template-0.4.0/src/forge_template}/py.typed +0 -0
  272. {forge_template-0.3.2 → forge_template-0.4.0}/src/forge_template/template_variables.py +0 -0
  273. {forge_template-0.3.2 → forge_template-0.4.0}/template/.copier-answers.yml.jinja +0 -0
  274. {forge_template-0.3.2 → forge_template-0.4.0}/template/.editorconfig +0 -0
  275. {forge_template-0.3.2 → forge_template-0.4.0}/template/.env.example.jinja +0 -0
  276. {forge_template-0.3.2 → forge_template-0.4.0}/template/.gitattributes +0 -0
  277. {forge_template-0.3.2 → forge_template-0.4.0}/template/.github/CODEOWNERS.jinja +0 -0
  278. {forge_template-0.3.2 → forge_template-0.4.0}/template/.github/ISSUE_TEMPLATE/bug_report.yml.jinja +0 -0
  279. {forge_template-0.3.2 → forge_template-0.4.0}/template/.github/ISSUE_TEMPLATE/config.yml +0 -0
  280. {forge_template-0.3.2 → forge_template-0.4.0}/template/.github/ISSUE_TEMPLATE/feature_request.yml.jinja +0 -0
  281. {forge_template-0.3.2 → forge_template-0.4.0}/template/.github/pull_request_template.md.jinja +0 -0
  282. {forge_template-0.3.2 → forge_template-0.4.0}/template/.github/workflows/ci.yml.jinja +0 -0
  283. {forge_template-0.3.2 → forge_template-0.4.0}/template/.github/{% if dependency_updates == 'dependabot' %}dependabot.yml{% endif %}.jinja +0 -0
  284. {forge_template-0.3.2 → forge_template-0.4.0}/template/.gitignore.jinja +0 -0
  285. {forge_template-0.3.2 → forge_template-0.4.0}/template/.pre-commit-config.yaml.jinja +0 -0
  286. {forge_template-0.3.2 → forge_template-0.4.0}/template/.python-version.jinja +0 -0
  287. {forge_template-0.3.2 → forge_template-0.4.0}/template/CHANGELOG.md.jinja +0 -0
  288. {forge_template-0.3.2 → forge_template-0.4.0}/template/CONTRIBUTING.md.jinja +0 -0
  289. {forge_template-0.3.2 → forge_template-0.4.0}/template/LICENSE.jinja +0 -0
  290. {forge_template-0.3.2 → forge_template-0.4.0}/template/README.md.jinja +0 -0
  291. {forge_template-0.3.2 → forge_template-0.4.0}/template/SECURITY.md.jinja +0 -0
  292. {forge_template-0.3.2 → forge_template-0.4.0}/template/pyproject.toml.jinja +0 -0
  293. {forge_template-0.3.2 → forge_template-0.4.0}/template/src/{{package_name}}/__init__.py.jinja +0 -0
  294. {forge_template-0.3.2/tests/fixtures/component_manifests/library-v2/content/src/{{project.package_name}} → forge_template-0.4.0/template/src/{{package_name}}}/py.typed +0 -0
  295. {forge_template-0.3.2 → forge_template-0.4.0/template}/tests/__init__.py +0 -0
  296. {forge_template-0.3.2 → forge_template-0.4.0}/template/tests/test_smoke.py.jinja +0 -0
  297. {forge_template-0.3.2 → forge_template-0.4.0}/template/{% if dependency_updates == 'renovate' %}renovate.json{% endif %}.jinja +0 -0
  298. {forge_template-0.3.2 → forge_template-0.4.0}/template/{% if use_docs %}docs{% endif %}/adr/0001-record-architecture-decisions.md.jinja +0 -0
  299. {forge_template-0.3.2 → forge_template-0.4.0}/template/{% if use_docs %}docs{% endif %}/adr/README.md.jinja +0 -0
  300. {forge_template-0.3.2 → forge_template-0.4.0}/template/{% if use_docs %}docs{% endif %}/index.md.jinja +0 -0
  301. {forge_template-0.3.2 → forge_template-0.4.0}/template/{% if use_docs %}docs{% endif %}/reference.md.jinja +0 -0
  302. {forge_template-0.3.2 → forge_template-0.4.0}/template/{% if use_docs %}mkdocs.yml{% endif %}.jinja +0 -0
  303. {forge_template-0.3.2 → forge_template-0.4.0}/tests/composition_contract.py +0 -0
  304. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/component_manifests/changelog/component.toml +0 -0
  305. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/component_manifests/changelog/content/a-top.txt +0 -0
  306. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/component_manifests/changelog/content/nested/a-deep.txt +0 -0
  307. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/component_manifests/changelog/content/z-top.txt +0 -0
  308. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/component_manifests/coverage/component.toml +0 -0
  309. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/component_manifests/coverage/content/.coveragerc +0 -0
  310. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/component_manifests/coverage/extensions/ci-step.yml.jinja +0 -0
  311. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/component_manifests/documentation/component.toml +0 -0
  312. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/component_manifests/documentation/content/mkdocs.yml.jinja +0 -0
  313. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/component_manifests/github/component.toml +0 -0
  314. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/component_manifests/github/content/ci.yml.jinja +0 -0
  315. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/component_manifests/github/options.schema.json +0 -0
  316. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/component_manifests/library/component.toml +0 -0
  317. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/component_manifests/library/content/pyproject.toml.jinja +0 -0
  318. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/component_manifests/library/options.schema.json +0 -0
  319. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/component_manifests/library-v2/component.toml +0 -0
  320. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/component_manifests/library-v2/extensions/pyproject-build-system.toml.jinja +0 -0
  321. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/component_manifests/library-v2/options.schema.json +0 -0
  322. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/foundation/content/pyproject.toml.jinja +0 -0
  323. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/foundation/foundation.toml +0 -0
  324. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/golden/extension.json +0 -0
  325. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/golden/full.json +0 -0
  326. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/golden/minimal.json +0 -0
  327. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/invalid_components/colliding-first/component.toml +0 -0
  328. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/invalid_components/colliding-first/content/shared.txt +0 -0
  329. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/invalid_components/colliding-second/component.toml +0 -0
  330. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/invalid_components/colliding-second/content/shared.txt +0 -0
  331. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/invalid_components/conflicting-first/component.toml +0 -0
  332. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/invalid_components/conflicting-first/content/placeholder.txt +0 -0
  333. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/invalid_components/conflicting-second/component.toml +0 -0
  334. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/invalid_components/conflicting-second/content/placeholder.txt +0 -0
  335. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/invalid_components/cycle-a/component.toml +0 -0
  336. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/invalid_components/cycle-a/content/placeholder.txt +0 -0
  337. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/invalid_components/cycle-b/component.toml +0 -0
  338. {forge_template-0.3.2 → forge_template-0.4.0}/tests/fixtures/invalid_components/cycle-b/content/placeholder.txt +0 -0
  339. {forge_template-0.3.2 → forge_template-0.4.0}/tests/test_adr.py +0 -0
  340. {forge_template-0.3.2 → forge_template-0.4.0}/tests/test_cli_build.py +0 -0
  341. {forge_template-0.3.2 → forge_template-0.4.0}/tests/test_combos.py +0 -0
  342. {forge_template-0.3.2 → forge_template-0.4.0}/tests/test_component_manifest.py +0 -0
  343. {forge_template-0.3.2 → forge_template-0.4.0}/tests/test_composition.py +0 -0
  344. {forge_template-0.3.2 → forge_template-0.4.0}/tests/test_composition_architecture_review.py +0 -0
  345. {forge_template-0.3.2 → forge_template-0.4.0}/tests/test_composition_contract.py +0 -0
  346. {forge_template-0.3.2 → forge_template-0.4.0}/tests/test_file_conflicts.py +0 -0
  347. {forge_template-0.3.2 → forge_template-0.4.0}/tests/test_foundation_source.py +0 -0
  348. {forge_template-0.3.2 → forge_template-0.4.0}/tests/test_generated_project_validation.py +0 -0
  349. {forge_template-0.3.2 → forge_template-0.4.0}/tests/test_github_actions.py +0 -0
  350. {forge_template-0.3.2 → forge_template-0.4.0}/tests/test_library_build.py +0 -0
  351. {forge_template-0.3.2 → forge_template-0.4.0}/tests/test_project_spec.py +0 -0
  352. {forge_template-0.3.2 → forge_template-0.4.0}/tests/test_render.py +0 -0
  353. {forge_template-0.3.2 → forge_template-0.4.0}/tests/test_schema.py +0 -0
  354. {forge_template-0.3.2 → forge_template-0.4.0}/tests/test_template_variables.py +0 -0
  355. {forge_template-0.3.2 → forge_template-0.4.0}/tests/test_update.py +0 -0
@@ -76,7 +76,7 @@ in-progress = { color = "8c959f", description = "Actively being worked on" }
76
76
  deferred = { color = "afb8c1", description = "Confirmed out of scope for now, not forgotten" }
77
77
 
78
78
  [groups.roadmap]
79
- description = "Which Forge Foundation roadmap stage owns the work."
79
+ description = "Which Forge roadmap stage owns the work."
80
80
  family = "orange"
81
81
 
82
82
  [groups.roadmap.labels]
@@ -90,6 +90,11 @@ family = "orange"
90
90
  "07" = { color = "d45d1a", description = "Forge roadmap Stage 07 — Forge CLI Integration" }
91
91
  "08" = { color = "bd4914", description = "Forge roadmap Stage 08 — Reference Archetype Validation" }
92
92
  "09" = { color = "9f3610", description = "Forge roadmap Stage 09 — Blueprint Compatibility" }
93
+ "10" = { color = "ffe2b7", description = "Forge roadmap Stage 10 — Data Science Architecture Contract" }
94
+ "11" = { color = "ffc680", description = "Forge roadmap Stage 11 — Reusable Data Science Capabilities" }
95
+ "12" = { color = "ffa657", description = "Forge roadmap Stage 12 — Data Science Archetype" }
96
+ "13" = { color = "e67700", description = "Forge roadmap Stage 13 — Data Science CLI Integration" }
97
+ "14" = { color = "b95000", description = "Forge roadmap Stage 14 — Data Science Validation and Rollout" }
93
98
 
94
99
  # Repository-wide metadata that is clearer without a namespace. GitHub
95
100
  # special-cases `good first issue` and `help wanted` in its discovery UI.
@@ -10,7 +10,7 @@
10
10
  released projects
11
11
  - [ ] An ADR is added under `docs/adr/`, if this makes a real architectural call
12
12
  - [ ] A `_migrations` block is added, if any `template/` path was renamed or
13
- deleted (see CLAUDE.md's invariant 3)
13
+ deleted (see docs/invariants.md's invariant 3)
14
14
  - [ ] Any conditional file I touched still ends in a real trailing newline
15
- (invariant 1)
15
+ (docs/invariants.md's invariant 1)
16
16
  - [ ] Commit messages follow [Conventional Commits](https://www.conventionalcommits.org/)
@@ -8,7 +8,7 @@ on:
8
8
  workflow_dispatch:
9
9
  inputs:
10
10
  dry_run:
11
- description: Print the tag without creating it
11
+ description: Print the tag and notes without creating anything
12
12
  type: boolean
13
13
  default: false
14
14
 
@@ -22,6 +22,12 @@ jobs:
22
22
  release:
23
23
  runs-on: ubuntu-latest
24
24
  steps:
25
+ - name: Refuse to release from anything but main
26
+ if: github.ref != 'refs/heads/main'
27
+ run: |
28
+ echo "::error::Releases must be dispatched from main, not ${{ github.ref }}."
29
+ exit 1
30
+
25
31
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
26
32
  with:
27
33
  fetch-depth: 0
@@ -55,15 +61,21 @@ jobs:
55
61
  id: notes
56
62
  run: |
57
63
  latest="${{ steps.version.outputs.latest }}"
64
+ if [ "$latest" = "none" ]; then
65
+ echo "Initial release." > release-notes.md
66
+ else
67
+ git log "${latest}..HEAD" --pretty='- %s' --no-merges > release-notes.md
68
+ fi
58
69
  {
59
70
  echo "notes<<EOF"
60
- if [ "$latest" = "none" ]; then
61
- echo "Initial release."
62
- else
63
- git log "${latest}..HEAD" --pretty='- %s' --no-merges
64
- fi
71
+ cat release-notes.md
65
72
  echo "EOF"
66
73
  } >> "$GITHUB_OUTPUT"
74
+ {
75
+ echo "## Release notes"
76
+ echo
77
+ cat release-notes.md
78
+ } >> "$GITHUB_STEP_SUMMARY"
67
79
 
68
80
  - name: Warn on breaking template changes
69
81
  run: |
@@ -40,7 +40,8 @@ jobs:
40
40
  run: uv sync --all-groups
41
41
 
42
42
  # Same gate as `uv run pre-commit run --all-files` locally: ruff,
43
- # shellcheck, and the whitespace/EOF hooks that guard invariant 1.
43
+ # shellcheck, markdownlint, and the whitespace/EOF hooks that guard
44
+ # invariant 1.
44
45
  - name: Pre-commit
45
46
  run: uv run pre-commit run --all-files --show-diff-on-failure
46
47
 
@@ -119,8 +120,8 @@ jobs:
119
120
  run: uv run pytest -m combos -k c1-uvbuild-static --from-git -v
120
121
 
121
122
  # ---------------------------------------------------------------------------
122
- # Real uv build/install/import proof for the production Library and CLI
123
- # archetypes -- tests/test_library_build.py, tests/test_cli_build.py.
123
+ # Real generated-project proof for production Library/CLI archetypes and
124
+ # capability compositions -- tests/*_build.py.
124
125
  # ---------------------------------------------------------------------------
125
126
  archetype:
126
127
  name: Archetype builds
@@ -0,0 +1,23 @@
1
+ {
2
+ "config": {
3
+ "MD013": {
4
+ "line_length": 80,
5
+ // A table row cannot be broken across lines; a heading cannot wrap;
6
+ // and CLAUDE.md's validation ladder relies on column alignment.
7
+ "tables": false,
8
+ "headings": false,
9
+ "code_blocks": false
10
+ }
11
+ },
12
+ "overrides": [
13
+ {
14
+ // CONTRIBUTING.md: ADR records are immutable. 0039's H1 title is 103
15
+ // chars and 0007:29 is a 93-char inline code span holding a Jinja
16
+ // conditional filename -- neither can wrap. Structural rules still
17
+ // apply, so new records are still checked for shape.
18
+ "filter": ["docs/adr/**"],
19
+ "config": { "MD013": false },
20
+ "combine": "merge"
21
+ }
22
+ ]
23
+ }
@@ -1,8 +1,8 @@
1
1
  # This repo's own lint gate -- also what CI runs (see the `lint` job in
2
2
  # .github/workflows/test-template.yml). Deliberately covers template/**: the
3
- # whitespace/EOF hooks are how invariant 1 in CLAUDE.md (generated output
4
- # must be pre-commit clean) gets enforced at the source, not just discovered
5
- # downstream when a scaffold's own pre-commit run fails.
3
+ # whitespace/EOF hooks are how invariant 1 in docs/invariants.md (generated
4
+ # output must be pre-commit clean) gets enforced at the source, not just
5
+ # discovered downstream when a scaffold's own pre-commit run fails.
6
6
  default_install_hook_types: [pre-commit, commit-msg]
7
7
 
8
8
  repos:
@@ -27,6 +27,17 @@ repos:
27
27
  - id: shellcheck
28
28
  files: ^scripts/.*\.sh$
29
29
 
30
+ # Not markdownlint-cli2-docker, for the same reason shellcheck-py is used
31
+ # above. Scope is root *.md and docs/** -- template/'s Markdown is all
32
+ # .md.jinja and must never be linted or auto-fixed: it is raw Jinja, and
33
+ # rewriting it would risk invariant 1 (docs/invariants.md).
34
+ - repo: https://github.com/DavidAnson/markdownlint-cli2
35
+ rev: v0.23.2
36
+ hooks:
37
+ - id: markdownlint-cli2
38
+ args: [--fix]
39
+ exclude: ^(template|\.github)/
40
+
30
41
  - repo: https://github.com/astral-sh/ruff-pre-commit
31
42
  rev: v0.14.0
32
43
  hooks:
@@ -1 +1,3 @@
1
+ # Agent guidance
2
+
1
3
  Please read `./CLAUDE.md` for context.