@getarbiter/cli 0.5.0

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 (989) hide show
  1. package/CHANGELOG.md +713 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +31 -0
  4. package/PRIVACY.md +111 -0
  5. package/README.md +237 -0
  6. package/THIRD_PARTY_LICENSES.md +472 -0
  7. package/dist/.src-manifest.json +1 -0
  8. package/dist/capabilities/host-probe.js +3 -0
  9. package/dist/cli.d.ts +2 -0
  10. package/dist/cli.js +87 -0
  11. package/dist/commands/adopt-policy.js +3 -0
  12. package/dist/commands/configure-interactive.js +3 -0
  13. package/dist/commands/configure.js +5 -0
  14. package/dist/commands/cross-model-review.js +3 -0
  15. package/dist/commands/diff.js +20 -0
  16. package/dist/commands/doc-set.js +3 -0
  17. package/dist/commands/doctor/clean.js +2 -0
  18. package/dist/commands/doctor/fail-open-census.js +12 -0
  19. package/dist/commands/doctor/health.js +11 -0
  20. package/dist/commands/doctor/prove-gates.js +13 -0
  21. package/dist/commands/doctor/recover-lock.js +12 -0
  22. package/dist/commands/doctor/repair-state.js +6 -0
  23. package/dist/commands/doctor/tool-pin-extract.js +4 -0
  24. package/dist/commands/doctor/tool-pins.js +9 -0
  25. package/dist/commands/doctor-interactive.js +2 -0
  26. package/dist/commands/doctor.js +2 -0
  27. package/dist/commands/explain.js +19 -0
  28. package/dist/commands/gate-exec.js +4 -0
  29. package/dist/commands/gold-audit.js +14 -0
  30. package/dist/commands/graph.js +5 -0
  31. package/dist/commands/init/build-arbiter-config.js +1 -0
  32. package/dist/commands/init/generate.js +42 -0
  33. package/dist/commands/init/github-setup.js +5 -0
  34. package/dist/commands/init/maturity-gates.js +10 -0
  35. package/dist/commands/init/resolve-config.js +3 -0
  36. package/dist/commands/init/toolchain.js +10 -0
  37. package/dist/commands/init/types.js +1 -0
  38. package/dist/commands/init.js +17 -0
  39. package/dist/commands/method-interactive.js +4 -0
  40. package/dist/commands/method.js +11 -0
  41. package/dist/commands/obsidian.js +2 -0
  42. package/dist/commands/plugin.js +8 -0
  43. package/dist/commands/pr-merged.js +2 -0
  44. package/dist/commands/retire-policy.js +3 -0
  45. package/dist/commands/review-diff.js +3 -0
  46. package/dist/commands/settings.js +7 -0
  47. package/dist/commands/ship-config.js +2 -0
  48. package/dist/commands/ship-profile.js +2 -0
  49. package/dist/commands/ship-review.js +1 -0
  50. package/dist/commands/ship-tier.js +2 -0
  51. package/dist/commands/ship-train.js +2 -0
  52. package/dist/commands/task-mark.js +2 -0
  53. package/dist/commands/task-note.js +3 -0
  54. package/dist/commands/task-record-red.js +2 -0
  55. package/dist/commands/task-record-tech-debt.js +4 -0
  56. package/dist/commands/task-ship.js +3 -0
  57. package/dist/commands/task-state.js +6 -0
  58. package/dist/commands/task.js +59 -0
  59. package/dist/commands/update.js +60 -0
  60. package/dist/commands/upgrade-level-interactive.js +2 -0
  61. package/dist/commands/upgrade-level.js +7 -0
  62. package/dist/commands/verify-plan.js +8 -0
  63. package/dist/commands/verify-tdd.js +2 -0
  64. package/dist/commands/verify.js +7 -0
  65. package/dist/commands/wizard/coherence.js +1 -0
  66. package/dist/commands/worktree-prune.js +4 -0
  67. package/dist/commands/worktree.js +39 -0
  68. package/dist/compatibility/cross-language-matrix.json +540 -0
  69. package/dist/compatibility/index.d.ts +4 -0
  70. package/dist/compatibility/index.js +2 -0
  71. package/dist/compatibility/matcher.js +1 -0
  72. package/dist/compatibility/matrix.json +27 -0
  73. package/dist/compatibility/parsers.d.ts +38 -0
  74. package/dist/compatibility/parsers.js +1 -0
  75. package/dist/compatibility/probe.d.ts +41 -0
  76. package/dist/compatibility/probe.js +4 -0
  77. package/dist/compatibility/report.js +2 -0
  78. package/dist/compatibility/schema.d.ts +80 -0
  79. package/dist/compatibility/schema.js +1 -0
  80. package/dist/compatibility/skills-matrix.json +98 -0
  81. package/dist/compatibility/skills-validator.d.ts +30 -0
  82. package/dist/compatibility/skills-validator.js +4 -0
  83. package/dist/compatibility/tooling-proposals.json +5 -0
  84. package/dist/config/arbiter-ignore.js +3 -0
  85. package/dist/config/collaboration-mode-defaults.js +1 -0
  86. package/dist/config/diff.js +1 -0
  87. package/dist/config/env-overrides.js +3 -0
  88. package/dist/config/env-registry.js +2 -0
  89. package/dist/config/levels.js +1 -0
  90. package/dist/config/migrations/index.js +2 -0
  91. package/dist/config/migrations/v0-to-v1.js +2 -0
  92. package/dist/config/migrations/v1-to-v2.js +2 -0
  93. package/dist/config/migrations/v2-to-v3.js +2 -0
  94. package/dist/config/migrations/v3-to-v4.js +2 -0
  95. package/dist/config/override-resolver.js +2 -0
  96. package/dist/config/resolve-project-config.js +2 -0
  97. package/dist/config/resolve-project-name.js +2 -0
  98. package/dist/config/schema.d.ts +480 -0
  99. package/dist/config/schema.js +1 -0
  100. package/dist/config/test-pyramid-profiles.js +1 -0
  101. package/dist/config/thresholds.js +2 -0
  102. package/dist/conformance/dimensions.js +3 -0
  103. package/dist/conformance/engine.js +7 -0
  104. package/dist/conformance/gate-proofs.js +4 -0
  105. package/dist/conformance/shared.js +2 -0
  106. package/dist/detectors/axis.js +1 -0
  107. package/dist/detectors/build.js +2 -0
  108. package/dist/detectors/existing.js +2 -0
  109. package/dist/detectors/external-model.js +2 -0
  110. package/dist/detectors/framework.js +2 -0
  111. package/dist/detectors/git.js +11 -0
  112. package/dist/detectors/github.js +2 -0
  113. package/dist/detectors/lanes.js +5 -0
  114. package/dist/detectors/language-hooks.js +117 -0
  115. package/dist/detectors/language.js +2 -0
  116. package/dist/detectors/package-manager.js +2 -0
  117. package/dist/detectors/package.js +2 -0
  118. package/dist/detectors/scaffold-wiring.js +2 -0
  119. package/dist/detectors/workflow-collision.js +4 -0
  120. package/dist/evidence/gate-binding.js +4 -0
  121. package/dist/evidence/git-checks.js +3 -0
  122. package/dist/evidence/load.js +2 -0
  123. package/dist/evidence/provenance.js +2 -0
  124. package/dist/evidence/summary.js +2 -0
  125. package/dist/evidence/tdd-reexecute.js +2 -0
  126. package/dist/evidence/tdd.js +4 -0
  127. package/dist/experimental/index.js +2 -0
  128. package/dist/experimental/parse-argv.js +2 -0
  129. package/dist/experimental/registry.js +2 -0
  130. package/dist/generators/agents-claude.js +2 -0
  131. package/dist/generators/agents-md.js +2 -0
  132. package/dist/generators/anti-drift-validators.js +3 -0
  133. package/dist/generators/anti-proforma.js +2 -0
  134. package/dist/generators/api-e2e.js +2 -0
  135. package/dist/generators/api-middleware.js +2 -0
  136. package/dist/generators/archunit.js +2 -0
  137. package/dist/generators/audit-toolchain.js +2 -0
  138. package/dist/generators/auth.js +2 -0
  139. package/dist/generators/behavioral-tests.js +2 -0
  140. package/dist/generators/boundaries.js +2 -0
  141. package/dist/generators/check-all.js +2 -0
  142. package/dist/generators/check-stack-conformity.js +2 -0
  143. package/dist/generators/ci-five-lane.js +2 -0
  144. package/dist/generators/ci-tier.js +2 -0
  145. package/dist/generators/claude.js +3 -0
  146. package/dist/generators/codex-hooks.js +2 -0
  147. package/dist/generators/codex-known-limitations.js +2 -0
  148. package/dist/generators/codex.js +15 -0
  149. package/dist/generators/commit-footer.js +2 -0
  150. package/dist/generators/compliance-menu.js +2 -0
  151. package/dist/generators/compliance.js +2 -0
  152. package/dist/generators/conformance.js +2 -0
  153. package/dist/generators/contract-testing.js +2 -0
  154. package/dist/generators/coverage.js +2 -0
  155. package/dist/generators/debt-gates.js +24 -0
  156. package/dist/generators/debt-ratchet.js +2 -0
  157. package/dist/generators/derived-class.js +2 -0
  158. package/dist/generators/doc-set.js +4 -0
  159. package/dist/generators/docs.js +2 -0
  160. package/dist/generators/duplication.js +2 -0
  161. package/dist/generators/e2e-constitution.js +2 -0
  162. package/dist/generators/env-template.js +2 -0
  163. package/dist/generators/evidence-retention.js +2 -0
  164. package/dist/generators/feature-matrix.js +2 -0
  165. package/dist/generators/frontend-governance.js +2 -0
  166. package/dist/generators/frontend-quality.js +2 -0
  167. package/dist/generators/gap.js +2 -0
  168. package/dist/generators/gdpr.js +2 -0
  169. package/dist/generators/githooks.js +2 -0
  170. package/dist/generators/github-setup.js +2 -0
  171. package/dist/generators/github.js +2 -0
  172. package/dist/generators/gitignore.js +2 -0
  173. package/dist/generators/global-invariants.js +3 -0
  174. package/dist/generators/go-boundaries.js +2 -0
  175. package/dist/generators/gold-kit.js +2 -0
  176. package/dist/generators/infra.js +2 -0
  177. package/dist/generators/integration-testing.js +7 -0
  178. package/dist/generators/iso27001.js +2 -0
  179. package/dist/generators/iso9001.js +2 -0
  180. package/dist/generators/labels.js +2 -0
  181. package/dist/generators/local-wrapper.js +2 -0
  182. package/dist/generators/modulith.js +2 -0
  183. package/dist/generators/mutation.js +2 -0
  184. package/dist/generators/observability.js +2 -0
  185. package/dist/generators/operations.js +2 -0
  186. package/dist/generators/perf-k6.js +2 -0
  187. package/dist/generators/pharma.js +2 -0
  188. package/dist/generators/playwright-python.js +2 -0
  189. package/dist/generators/playwright-ts.js +2 -0
  190. package/dist/generators/pr-tooling.js +2 -0
  191. package/dist/generators/python-boundaries.js +2 -0
  192. package/dist/generators/quality.js +2 -0
  193. package/dist/generators/registry.js +2 -0
  194. package/dist/generators/regulated.js +2 -0
  195. package/dist/generators/resilience.js +2 -0
  196. package/dist/generators/risk-register.js +2 -0
  197. package/dist/generators/root.js +2 -0
  198. package/dist/generators/rust-boundaries.js +2 -0
  199. package/dist/generators/safety-class.js +2 -0
  200. package/dist/generators/security.js +2 -0
  201. package/dist/generators/seed.js +2 -0
  202. package/dist/generators/self-validation.js +2 -0
  203. package/dist/generators/ship-driver.js +2 -0
  204. package/dist/generators/skill-names.json +17 -0
  205. package/dist/generators/skills.js +2 -0
  206. package/dist/generators/smoke-journeys.js +2 -0
  207. package/dist/generators/solo-exception.js +2 -0
  208. package/dist/generators/ssot.js +2 -0
  209. package/dist/generators/stride-enforcement.js +2 -0
  210. package/dist/generators/suppressions.js +2 -0
  211. package/dist/generators/test-pyramid-manifest.js +3 -0
  212. package/dist/generators/test-taxonomy.js +2 -0
  213. package/dist/generators/wiki.js +2 -0
  214. package/dist/github/branch-protection.js +2 -0
  215. package/dist/github/classify-gh-error.js +2 -0
  216. package/dist/github/labels.js +2 -0
  217. package/dist/github/project-board.js +2 -0
  218. package/dist/graph/builders/adr.js +4 -0
  219. package/dist/graph/builders/ast.js +3 -0
  220. package/dist/graph/builders/canon.js +2 -0
  221. package/dist/graph/builders/evidence.js +2 -0
  222. package/dist/graph/builders/inv.js +1 -0
  223. package/dist/graph/builders/req.js +3 -0
  224. package/dist/graph/builders/test-nodes.js +3 -0
  225. package/dist/graph/builders/utils.js +2 -0
  226. package/dist/graph/load.js +2 -0
  227. package/dist/graph/model.js +2 -0
  228. package/dist/graph/query.js +3 -0
  229. package/dist/graph/store.js +1 -0
  230. package/dist/i18n/en.json +293 -0
  231. package/dist/i18n/index.js +4 -0
  232. package/dist/i18n/types.js +2 -0
  233. package/dist/integrations/companions.js +2 -0
  234. package/dist/integrations/external-review.js +10 -0
  235. package/dist/integrations/plugin-schema.js +2 -0
  236. package/dist/integrations/skill-detector.js +7 -0
  237. package/dist/integrations/skills-matrix.js +2 -0
  238. package/dist/integrations/types.d.ts +23 -0
  239. package/dist/integrations/types.js +2 -0
  240. package/dist/internal/cli-deprecation-registry.js +2 -0
  241. package/dist/internal/deprecate.js +3 -0
  242. package/dist/internal/experimental-warn.js +3 -0
  243. package/dist/invariants/catalog.d.ts +2 -0
  244. package/dist/invariants/catalog.js +1 -0
  245. package/dist/invariants/filter.d.ts +28 -0
  246. package/dist/invariants/filter.js +1 -0
  247. package/dist/invariants/index.d.ts +4 -0
  248. package/dist/invariants/index.js +2 -0
  249. package/dist/invariants/tiers.js +1 -0
  250. package/dist/invariants/types.d.ts +1 -0
  251. package/dist/invariants/types.js +1 -0
  252. package/dist/kit/applicability.js +3 -0
  253. package/dist/kit/audit-report.js +3 -0
  254. package/dist/kit/brownfield-detect.js +4 -0
  255. package/dist/kit/canonical-mapping.json +1 -0
  256. package/dist/kit/catalog.js +2 -0
  257. package/dist/kit/catalog.json +1 -0
  258. package/dist/kit/derived.json +1 -0
  259. package/dist/kit/emit-issues.js +8 -0
  260. package/dist/kit/measure.js +5 -0
  261. package/dist/kit/redaction.js +3 -0
  262. package/dist/kit/schema.js +2 -0
  263. package/dist/kit/taxonomy.js +2 -0
  264. package/dist/kit/thresholds.d.ts +12 -0
  265. package/dist/kit/thresholds.js +2 -0
  266. package/dist/kit/wave-engine.js +1 -0
  267. package/dist/recipes/loader.js +6 -0
  268. package/dist/recipes/schema.js +2 -0
  269. package/dist/risk/classifier.js +2 -0
  270. package/dist/risk/sha-check.js +2 -0
  271. package/dist/state/backups.js +2 -0
  272. package/dist/state/envelope.js +2 -0
  273. package/dist/state/generated-manifest.js +3 -0
  274. package/dist/state/manifest-key.js +2 -0
  275. package/dist/state/migrations/index.js +1 -0
  276. package/dist/state/migrations/v0-to-v1.js +2 -0
  277. package/dist/state/retired-renders.js +2 -0
  278. package/dist/templates/.nvmrc.ejs +1 -0
  279. package/dist/templates/HANDOFF.template.md +45 -0
  280. package/dist/templates/__tests__/contract/error-shape.contract.test.ts.ejs +47 -0
  281. package/dist/templates/agents-md/AGENTS.md.ejs +517 -0
  282. package/dist/templates/api-e2e/README.md.ejs +33 -0
  283. package/dist/templates/api-e2e/go-httptest.go.ejs +43 -0
  284. package/dist/templates/api-e2e/java-restassured.java.ejs +28 -0
  285. package/dist/templates/api-e2e/kotlin-restassured.kt.ejs +30 -0
  286. package/dist/templates/api-e2e/manifest.json.ejs +8 -0
  287. package/dist/templates/api-e2e/postman.collection.json.ejs +30 -0
  288. package/dist/templates/api-e2e/python-httpx.py.ejs +17 -0
  289. package/dist/templates/api-e2e/run.sh.ejs +61 -0
  290. package/dist/templates/api-e2e/ts-supertest.test.ts.ejs +18 -0
  291. package/dist/templates/archunit/AntiCyclicTest.java.ejs +29 -0
  292. package/dist/templates/archunit/AntiProformaExempt.java.ejs +35 -0
  293. package/dist/templates/archunit/AntiProformaTest.java.ejs +104 -0
  294. package/dist/templates/archunit/ArchitectureTest.java.ejs +87 -0
  295. package/dist/templates/archunit/DependencyFlowTest.java.ejs +55 -0
  296. package/dist/templates/archunit/DomainPurityTest.java.ejs +47 -0
  297. package/dist/templates/archunit/NamingConventionsTest.java.ejs +54 -0
  298. package/dist/templates/archunit/NoH2ArchTest.java.ejs +30 -0
  299. package/dist/templates/archunit/NoMockMvcTest.java.ejs +71 -0
  300. package/dist/templates/archunit/PortsIndependenceTest.java.ejs +55 -0
  301. package/dist/templates/archunit/RestAssuredArchTest.java.ejs +32 -0
  302. package/dist/templates/archunit/RestAssuredBaseIT.java.ejs +66 -0
  303. package/dist/templates/archunit/TestCoverageArchTest.java.ejs +29 -0
  304. package/dist/templates/archunit/arch-test-deps-maven.md.ejs +42 -0
  305. package/dist/templates/archunit/arch-test-deps.gradle.ejs +14 -0
  306. package/dist/templates/audit/gdpr/check-gdpr-controls.mjs.ejs +102 -0
  307. package/dist/templates/audit/gdpr/controls-to-gates.md.ejs +42 -0
  308. package/dist/templates/audit/gdpr/data-flow-map.md.ejs +30 -0
  309. package/dist/templates/audit/gdpr/dpia.md.ejs +45 -0
  310. package/dist/templates/audit/generic/audit-gate-rules.md.ejs +24 -0
  311. package/dist/templates/audit/generic/audit-trail-policy.md.ejs +38 -0
  312. package/dist/templates/audit/iso27001/iso27001-controls-gate-map.md.ejs +60 -0
  313. package/dist/templates/auth/setup.md.ejs +661 -0
  314. package/dist/templates/behavioral-tests/ExampleBehavioralTest.java.ejs +67 -0
  315. package/dist/templates/behavioral-tests/TESTING_POLICY.md.ejs +116 -0
  316. package/dist/templates/behavioral-tests/bdd/ExampleBddIT.java.ejs +19 -0
  317. package/dist/templates/behavioral-tests/bdd/ExampleSteps.java.ejs +61 -0
  318. package/dist/templates/behavioral-tests/bdd/example.feature.ejs +14 -0
  319. package/dist/templates/behavioral-tests/bdd/example.steps.ts.ejs +37 -0
  320. package/dist/templates/behavioral-tests/bdd/example_bdd_test.rs.ejs +64 -0
  321. package/dist/templates/behavioral-tests/bdd/example_test.go.ejs +80 -0
  322. package/dist/templates/behavioral-tests/bdd/test_example_bdd.py.ejs +47 -0
  323. package/dist/templates/behavioral-tests/eslint-playwright.json.ejs +10 -0
  324. package/dist/templates/behavioral-tests/eslint.config.playwright.mjs.ejs +29 -0
  325. package/dist/templates/behavioral-tests/example.behavioral.test.ts.ejs +47 -0
  326. package/dist/templates/behavioral-tests/example_behavioral_test.go.ejs +51 -0
  327. package/dist/templates/behavioral-tests/example_behavioral_test.rs.ejs +47 -0
  328. package/dist/templates/behavioral-tests/test_example_behavioral.py.ejs +40 -0
  329. package/dist/templates/boundaries/.eslintrc-boundaries.cjs.ejs +81 -0
  330. package/dist/templates/boundaries/.eslintrc-frontend-spa.cjs.ejs +79 -0
  331. package/dist/templates/boundaries/.importlinter.ejs +48 -0
  332. package/dist/templates/boundaries/check-boundaries-go.mjs.ejs +94 -0
  333. package/dist/templates/boundaries/check-boundaries-python.mjs.ejs +118 -0
  334. package/dist/templates/boundaries/check-boundaries-rust.mjs.ejs +111 -0
  335. package/dist/templates/boundaries/check-boundaries.mjs.ejs +34 -0
  336. package/dist/templates/boundaries/clippy.toml.ejs +50 -0
  337. package/dist/templates/boundaries/deny.toml.ejs +56 -0
  338. package/dist/templates/boundaries/eslint.config.boundaries.mjs.ejs +112 -0
  339. package/dist/templates/boundaries/eslint.config.frontend-spa.mjs.ejs +93 -0
  340. package/dist/templates/boundaries/golangci-boundaries.yml.ejs +70 -0
  341. package/dist/templates/boundaries/ruff-boundaries.toml.ejs +32 -0
  342. package/dist/templates/claude/CLAUDE.md.ejs +78 -0
  343. package/dist/templates/claude/agents/agent-write-classes.json +30 -0
  344. package/dist/templates/claude/agents/bridge-reviewer.md.ejs +68 -0
  345. package/dist/templates/claude/agents/codebase-scanner.md.ejs +69 -0
  346. package/dist/templates/claude/agents/context-checker.md.ejs +73 -0
  347. package/dist/templates/claude/agents/red-team.md.ejs +134 -0
  348. package/dist/templates/claude/commands/close-gold-gap.md.ejs +43 -0
  349. package/dist/templates/claude/commands/drain.md.ejs +81 -0
  350. package/dist/templates/claude/commands/gold-audit.md.ejs +43 -0
  351. package/dist/templates/claude/commands/impact.md.ejs +39 -0
  352. package/dist/templates/claude/commands/levelup.md.ejs +61 -0
  353. package/dist/templates/claude/commands/ship.md.ejs +902 -0
  354. package/dist/templates/claude/commands/tabletop.md.ejs +46 -0
  355. package/dist/templates/claude/commands/task.md.ejs +87 -0
  356. package/dist/templates/claude/commands/wt-close.md.ejs +58 -0
  357. package/dist/templates/claude/commands/wt-list.md.ejs +48 -0
  358. package/dist/templates/claude/commands/wt-open.md.ejs +61 -0
  359. package/dist/templates/claude/commands/wt-prune.md.ejs +38 -0
  360. package/dist/templates/claude/hooks/check-circular-deps.mjs.ejs +56 -0
  361. package/dist/templates/claude/hooks/check-no-orphan-todo.mjs.ejs +45 -0
  362. package/dist/templates/claude/hooks/check-no-pii.mjs.ejs +121 -0
  363. package/dist/templates/claude/hooks/check-no-placeholders.mjs.ejs +71 -0
  364. package/dist/templates/claude/hooks/check-no-skipped-tests.mjs +80 -0
  365. package/dist/templates/claude/hooks/check-no-unused-exports.mjs +62 -0
  366. package/dist/templates/claude/hooks/closer-mode-guard.mjs.ejs +102 -0
  367. package/dist/templates/claude/hooks/debug-state-on-failure.mjs.ejs +98 -0
  368. package/dist/templates/claude/hooks/enforce-gate-before-pr.mjs +142 -0
  369. package/dist/templates/claude/hooks/enforce-read-only.mjs +28 -0
  370. package/dist/templates/claude/hooks/exitplanmode-banner.mjs.ejs +43 -0
  371. package/dist/templates/claude/hooks/guard-done-evidence.mjs.ejs +85 -0
  372. package/dist/templates/claude/hooks/guard-task-completion.mjs.ejs +56 -0
  373. package/dist/templates/claude/hooks/hooks.mjs.ejs +127 -0
  374. package/dist/templates/claude/hooks/lib.mjs.ejs +523 -0
  375. package/dist/templates/claude/hooks/post-brainstorm-stop.mjs +48 -0
  376. package/dist/templates/claude/hooks/post-commit-check.mjs.ejs +65 -0
  377. package/dist/templates/claude/hooks/post-commit-checklists/go/backend.ejs +4 -0
  378. package/dist/templates/claude/hooks/post-commit-checklists/go/docs.ejs +4 -0
  379. package/dist/templates/claude/hooks/post-commit-checklists/go/frontend.ejs +4 -0
  380. package/dist/templates/claude/hooks/post-commit-checklists/java/backend.ejs +4 -0
  381. package/dist/templates/claude/hooks/post-commit-checklists/java/docs.ejs +4 -0
  382. package/dist/templates/claude/hooks/post-commit-checklists/java/frontend.ejs +4 -0
  383. package/dist/templates/claude/hooks/post-commit-checklists/python/backend.ejs +4 -0
  384. package/dist/templates/claude/hooks/post-commit-checklists/python/docs.ejs +4 -0
  385. package/dist/templates/claude/hooks/post-commit-checklists/python/frontend.ejs +4 -0
  386. package/dist/templates/claude/hooks/post-commit-checklists/rust/backend.ejs +5 -0
  387. package/dist/templates/claude/hooks/post-commit-checklists/rust/docs.ejs +4 -0
  388. package/dist/templates/claude/hooks/post-commit-checklists/rust/frontend.ejs +4 -0
  389. package/dist/templates/claude/hooks/post-commit-checklists/ts/backend.ejs +4 -0
  390. package/dist/templates/claude/hooks/post-commit-checklists/ts/docs.ejs +4 -0
  391. package/dist/templates/claude/hooks/post-commit-checklists/ts/frontend.ejs +5 -0
  392. package/dist/templates/claude/hooks/post-edit-dispatch.mjs.ejs +73 -0
  393. package/dist/templates/claude/hooks/post-subagent-release.mjs +80 -0
  394. package/dist/templates/claude/hooks/pre-compact.mjs.ejs +79 -0
  395. package/dist/templates/claude/hooks/pre-edit-plan-anchor.mjs.ejs +225 -0
  396. package/dist/templates/claude/hooks/pre-edit-ssot-guard.mjs +204 -0
  397. package/dist/templates/claude/hooks/pre-spawn-worktree-guard.mjs +129 -0
  398. package/dist/templates/claude/hooks/skill-forced-eval.mjs.ejs +281 -0
  399. package/dist/templates/claude/hooks/stop-dangerous.mjs +86 -0
  400. package/dist/templates/claude/hooks/stop-evidence-guard.mjs.ejs +245 -0
  401. package/dist/templates/claude/hooks/stop-finding-loss.mjs.ejs +168 -0
  402. package/dist/templates/claude/hooks/wiki-on-commit.mjs.ejs +38 -0
  403. package/dist/templates/claude/knowledge-map.json.ejs +26 -0
  404. package/dist/templates/claude/rules/05-agent-lifecycle.md +7 -0
  405. package/dist/templates/claude/rules/25-todo-folder-policy.md +5 -0
  406. package/dist/templates/claude/rules/40-context-economy.md +32 -0
  407. package/dist/templates/claude/rules/45-mcp-fallback.md +25 -0
  408. package/dist/templates/claude/rules/50-batch-execution.md +75 -0
  409. package/dist/templates/claude/rules/55-brainstorm-terminal-state.md +44 -0
  410. package/dist/templates/claude/rules/60-incidental-capture.md +43 -0
  411. package/dist/templates/claude/rules/75-impact-vault-reading.md +43 -0
  412. package/dist/templates/claude/rules/90-exec-protocol.md.ejs +40 -0
  413. package/dist/templates/claude/rules/95-closer-mode.md +45 -0
  414. package/dist/templates/claude/settings.json.ejs +165 -0
  415. package/dist/templates/claude/skills/architect-review/SKILL.md.ejs +82 -0
  416. package/dist/templates/claude/skills/brainstorming/SKILL.md.ejs +86 -0
  417. package/dist/templates/claude/skills/clean-code/SKILL.md.ejs +39 -0
  418. package/dist/templates/claude/skills/close-gold-gap/SKILL.md.ejs +58 -0
  419. package/dist/templates/claude/skills/codebase-audit/SKILL.md.ejs +88 -0
  420. package/dist/templates/claude/skills/configure/SKILL.md.ejs +72 -0
  421. package/dist/templates/claude/skills/epic-decompose/SKILL.md.ejs +86 -0
  422. package/dist/templates/claude/skills/gold-audit/SKILL.md.ejs +91 -0
  423. package/dist/templates/claude/skills/impact/SKILL.md.ejs +104 -0
  424. package/dist/templates/claude/skills/levelup/SKILL.md.ejs +146 -0
  425. package/dist/templates/claude/skills/tabletop/SKILL.md.ejs +118 -0
  426. package/dist/templates/claude/skills/tdd/SKILL.md.ejs +157 -0
  427. package/dist/templates/claude/skills/understand-code/SKILL.md.ejs +93 -0
  428. package/dist/templates/claude/skills/verification/SKILL.md.ejs +68 -0
  429. package/dist/templates/claude/skills/wave-drain/SKILL.md.ejs +491 -0
  430. package/dist/templates/codex/CODEX.md.ejs +140 -0
  431. package/dist/templates/codex/codex-adapter.mjs +132 -0
  432. package/dist/templates/codex/config.toml.ejs +189 -0
  433. package/dist/templates/compliance/compliance-mapping.md.ejs +124 -0
  434. package/dist/templates/compliance/compliance-menu.md.ejs +89 -0
  435. package/dist/templates/contract-testing/CONTRACTS_POLICY.md.ejs +30 -0
  436. package/dist/templates/contract-testing/api-snapshots/config-keys-baseline.json.ejs +1 -0
  437. package/dist/templates/contract-testing/api-snapshots/config-response-baseline.json.ejs +1 -0
  438. package/dist/templates/contract-testing/api-snapshots/enum-values-baseline.json.ejs +1 -0
  439. package/dist/templates/contract-testing/api-snapshots/error-shape-baseline.json.ejs +6 -0
  440. package/dist/templates/contract-testing/api-snapshots/openapi-baseline.json.ejs +12 -0
  441. package/dist/templates/contract-testing/api-snapshots/openapi-content-types-baseline.json.ejs +3 -0
  442. package/dist/templates/contract-testing/api-snapshots/openapi-paths-baseline.json.ejs +1 -0
  443. package/dist/templates/contract-testing/api-snapshots/openapi-required-fields-baseline.json.ejs +1 -0
  444. package/dist/templates/contract-testing/api-snapshots/openapi-response-status-baseline.json.ejs +3 -0
  445. package/dist/templates/contract-testing/api-snapshots/test-snapshot.json.ejs +4 -0
  446. package/dist/templates/contract-testing/env/.env.pact.ejs +4 -0
  447. package/dist/templates/contract-testing/graphql/GraphqlSchemaTest.java.ejs +29 -0
  448. package/dist/templates/contract-testing/graphql/graphql-inspector.test.ts.ejs +20 -0
  449. package/dist/templates/contract-testing/graphql/graphql_schema_test.go.ejs +27 -0
  450. package/dist/templates/contract-testing/graphql/graphql_schema_test.rs.ejs +27 -0
  451. package/dist/templates/contract-testing/graphql/test_graphql_schema.py.ejs +21 -0
  452. package/dist/templates/contract-testing/grpc/GrpcContractTest.java.ejs +23 -0
  453. package/dist/templates/contract-testing/grpc/buf-breaking.yml.ejs +6 -0
  454. package/dist/templates/contract-testing/grpc/buf.yaml.ejs +11 -0
  455. package/dist/templates/contract-testing/grpc/grpc-contract.test.ts.ejs +16 -0
  456. package/dist/templates/contract-testing/grpc/grpc_contract_test.go.ejs +22 -0
  457. package/dist/templates/contract-testing/grpc/grpc_contract_test.rs.ejs +22 -0
  458. package/dist/templates/contract-testing/grpc/test_grpc_contract.py.ejs +18 -0
  459. package/dist/templates/contract-testing/message-queue/SchemaRegistryCheckIT.java.ejs +44 -0
  460. package/dist/templates/contract-testing/message-queue/schema-registry-check.ts.ejs +42 -0
  461. package/dist/templates/contract-testing/message-queue/schema_registry_test.go.ejs +71 -0
  462. package/dist/templates/contract-testing/message-queue/schema_registry_test.rs.ejs +61 -0
  463. package/dist/templates/contract-testing/message-queue/test_schema_registry.py.ejs +31 -0
  464. package/dist/templates/contract-testing/pact-samples/assignment-response.json.ejs +7 -0
  465. package/dist/templates/contract-testing/pact-samples/availability-response.json.ejs +13 -0
  466. package/dist/templates/contract-testing/pact-samples/availability-rule-response.json.ejs +8 -0
  467. package/dist/templates/contract-testing/pact-samples/capacity-response.json.ejs +11 -0
  468. package/dist/templates/contract-testing/pact-samples/fully-booked-response.json.ejs +6 -0
  469. package/dist/templates/contract-testing/pact-samples/schedule-override-response.json.ejs +7 -0
  470. package/dist/templates/contract-testing/rest-owned/PactVerificationIT.java.ejs +31 -0
  471. package/dist/templates/contract-testing/rest-owned/pact-consumer.test.ts.ejs +36 -0
  472. package/dist/templates/contract-testing/rest-owned/pact-deps.gradle.ejs +15 -0
  473. package/dist/templates/contract-testing/rest-owned/pact_consumer_test.go.ejs +48 -0
  474. package/dist/templates/contract-testing/rest-owned/pact_consumer_test.rs.ejs +23 -0
  475. package/dist/templates/contract-testing/rest-owned/test_pact_consumer.py.ejs +35 -0
  476. package/dist/templates/contract-testing/rest-public/OpenApiDiffIT.java.ejs +44 -0
  477. package/dist/templates/contract-testing/rest-public/export-openapi-java.gradle.ejs +13 -0
  478. package/dist/templates/contract-testing/rest-public/export-openapi.mjs.ejs +21 -0
  479. package/dist/templates/contract-testing/rest-public/export_openapi.go.ejs +30 -0
  480. package/dist/templates/contract-testing/rest-public/export_openapi.py.ejs +27 -0
  481. package/dist/templates/contract-testing/rest-public/export_openapi.rs.ejs +32 -0
  482. package/dist/templates/contract-testing/rest-public/openapi-diff.ts.ejs +42 -0
  483. package/dist/templates/contract-testing/rest-public/openapi_diff_test.go.ejs +35 -0
  484. package/dist/templates/contract-testing/rest-public/openapi_diff_test.rs.ejs +36 -0
  485. package/dist/templates/contract-testing/rest-public/test_openapi_diff.py.ejs +32 -0
  486. package/dist/templates/coverage/.coveragerc.ejs +26 -0
  487. package/dist/templates/coverage/.tarpaulin.toml.ejs +30 -0
  488. package/dist/templates/coverage/Cargo.toml.profile.release.ejs +24 -0
  489. package/dist/templates/coverage/jacoco-maven-setup.md.ejs +72 -0
  490. package/dist/templates/coverage/jacoco.gradle.ejs +49 -0
  491. package/dist/templates/coverage/kover.gradle.ejs +35 -0
  492. package/dist/templates/coverage/vitest.browser.config.ts.ejs +47 -0
  493. package/dist/templates/coverage/vitest.config.ts.ejs +47 -0
  494. package/dist/templates/docs/CODING_STANDARDS.md.ejs +81 -0
  495. package/dist/templates/docs/FEATURE_MATRIX.md.ejs +84 -0
  496. package/dist/templates/docs/GAP.md.ejs +58 -0
  497. package/dist/templates/docs/ISO27001_ANNEX_A.md.ejs +144 -0
  498. package/dist/templates/docs/MASTER_TEST_PLAN.md.ejs +52 -0
  499. package/dist/templates/docs/POST_MERGE_REVIEW_TEMPLATE.md.ejs +63 -0
  500. package/dist/templates/docs/SECURE_CODING_CHECKLIST.md.ejs +61 -0
  501. package/dist/templates/docs/adr/ADR-000_template.md.ejs +28 -0
  502. package/dist/templates/docs/bugs/bug-analysis.md.ejs +47 -0
  503. package/dist/templates/docs/bugs/bug-report.md.ejs +51 -0
  504. package/dist/templates/docs/bugs/bug-verification.md.ejs +42 -0
  505. package/dist/templates/docs/runbooks/deployment.md.ejs +119 -0
  506. package/dist/templates/docs/runbooks/prod-checklist.md.ejs +90 -0
  507. package/dist/templates/docs/runbooks/rollback.md.ejs +124 -0
  508. package/dist/templates/docs/runbooks/troubleshooting.md.ejs +130 -0
  509. package/dist/templates/docs/skeletons/arc42-canvas.md.ejs +46 -0
  510. package/dist/templates/docs/skeletons/arc42-full.md.ejs +59 -0
  511. package/dist/templates/docs/skeletons/decision-registry.md.ejs +38 -0
  512. package/dist/templates/docs/skeletons/er-model.md.ejs +19 -0
  513. package/dist/templates/docs/skeletons/glossary.md.ejs +8 -0
  514. package/dist/templates/docs/skeletons/governance.md.ejs +13 -0
  515. package/dist/templates/docs/skeletons/slo.md.ejs +21 -0
  516. package/dist/templates/docs/skeletons/technical-debt.md.ejs +8 -0
  517. package/dist/templates/docs/skeletons/test-strategy.md.ejs +14 -0
  518. package/dist/templates/docs/skeletons/threat-model-4q.md.ejs +20 -0
  519. package/dist/templates/docs/skeletons/threat-model-stride.md.ejs +22 -0
  520. package/dist/templates/docs/specs/atomic-task-list.md.ejs +57 -0
  521. package/dist/templates/docs/steering/product.md.ejs +44 -0
  522. package/dist/templates/docs/steering/structure.md.ejs +49 -0
  523. package/dist/templates/docs/steering/tech.md.ejs +53 -0
  524. package/dist/templates/documentation/cli-catalog.md.ejs +21 -0
  525. package/dist/templates/e2e/E2E_CONSTITUTION.md.ejs +77 -0
  526. package/dist/templates/e2e/playwright-python/conftest.py.ejs +22 -0
  527. package/dist/templates/e2e/playwright-python/run_axe.py.ejs +99 -0
  528. package/dist/templates/e2e/playwright-python/test_a11y.py.ejs +38 -0
  529. package/dist/templates/e2e/playwright-python/test_smoke.py.ejs +28 -0
  530. package/dist/templates/e2e/playwright-ts/a11y.spec.ts.ejs +20 -0
  531. package/dist/templates/e2e/playwright-ts/render-smoke.spec.ts.ejs +90 -0
  532. package/dist/templates/e2e/playwright-ts/run-axe.ts.ejs +74 -0
  533. package/dist/templates/e2e/smoke-journeys/journeys.spec.ts.ejs +53 -0
  534. package/dist/templates/evidence-files.json.ejs +13 -0
  535. package/dist/templates/frontend/FE_DESIGN_PRINCIPLES.md.ejs +115 -0
  536. package/dist/templates/frontend/FRONTEND_CONSTITUTION.md.ejs +170 -0
  537. package/dist/templates/frontend/design-tokens.json.ejs +107 -0
  538. package/dist/templates/frontend/vrt-setup.md.ejs +83 -0
  539. package/dist/templates/githooks/commit-msg.ejs +60 -0
  540. package/dist/templates/githooks/pre-commit.ejs +95 -0
  541. package/dist/templates/githooks/pre-push.ejs +251 -0
  542. package/dist/templates/githooks/setup-hooks.sh.ejs +8 -0
  543. package/dist/templates/github/PULL_REQUEST_TEMPLATE.md +37 -0
  544. package/dist/templates/github/PULL_REQUEST_TEMPLATE.md.ejs +52 -0
  545. package/dist/templates/github/actions/build-cache/action.yml.ejs +84 -0
  546. package/dist/templates/github/actions/nas-ssh/action.yml.ejs +53 -0
  547. package/dist/templates/github/actions/setup-java-maven/action.yml.ejs +53 -0
  548. package/dist/templates/github/actions/setup-node-pnpm/action.yml.ejs +39 -0
  549. package/dist/templates/github/actions/sign-and-attest/action.yml.ejs +53 -0
  550. package/dist/templates/github/dependabot.yml.ejs +66 -0
  551. package/dist/templates/github/extended-ci-paths.txt.ejs +38 -0
  552. package/dist/templates/github/issue-templates/bug-report.yml +72 -0
  553. package/dist/templates/github/issue-templates/compliance-item.yml.ejs +75 -0
  554. package/dist/templates/github/issue-templates/config.yml +2 -0
  555. package/dist/templates/github/issue-templates/epic.yml +66 -0
  556. package/dist/templates/github/issue-templates/feature-request.yml +24 -0
  557. package/dist/templates/github/issue-templates/task-brief.yml.ejs +125 -0
  558. package/dist/templates/github/labels.yml.ejs +161 -0
  559. package/dist/templates/github/scripts/sticky-failure-issue.sh.ejs +61 -0
  560. package/dist/templates/github/workflows/01-pr-fast.yml.ejs +1089 -0
  561. package/dist/templates/github/workflows/02-pr-extended.yml.ejs +512 -0
  562. package/dist/templates/github/workflows/03-human-approval.yml.ejs +76 -0
  563. package/dist/templates/github/workflows/04-deploy-test.yml.ejs +425 -0
  564. package/dist/templates/github/workflows/05-release.yml.ejs +813 -0
  565. package/dist/templates/github/workflows/06-nightly-lite.yml.ejs +125 -0
  566. package/dist/templates/github/workflows/06-nightly.yml.ejs +25 -0
  567. package/dist/templates/github/workflows/07-weekly-lite.yml.ejs +221 -0
  568. package/dist/templates/github/workflows/07-weekly.yml.ejs +23 -0
  569. package/dist/templates/github/workflows/08-monthly.yml.ejs +23 -0
  570. package/dist/templates/github/workflows/09-heartbeat.yml.ejs +268 -0
  571. package/dist/templates/github/workflows/10-deploy-prod.yml.ejs +144 -0
  572. package/dist/templates/github/workflows/11-k6-on-demand.yml.ejs +43 -0
  573. package/dist/templates/github/workflows/12-mutation-scheduled.yml.ejs +100 -0
  574. package/dist/templates/github/workflows/13-archunit-extended.yml.ejs +33 -0
  575. package/dist/templates/github/workflows/14-license-scan.yml.ejs +45 -0
  576. package/dist/templates/github/workflows/15-codeql.yml.ejs +117 -0
  577. package/dist/templates/github/workflows/16-frontend-quality.yml.ejs +154 -0
  578. package/dist/templates/github/workflows/17-ossf-scorecard.yml.ejs +46 -0
  579. package/dist/templates/github/workflows/18-frontend-lane.yml.ejs +50 -0
  580. package/dist/templates/github/workflows/_ai-draft-check.yml.ejs +44 -0
  581. package/dist/templates/github/workflows/_contract-postman.yml.ejs +93 -0
  582. package/dist/templates/github/workflows/_cosign-copy/aws-ecs.ejs +90 -0
  583. package/dist/templates/github/workflows/_cosign-copy/azure-container-app.ejs +97 -0
  584. package/dist/templates/github/workflows/_cosign-copy/gcp-cloud-run.ejs +102 -0
  585. package/dist/templates/github/workflows/_cosign-copy/ghcr.ejs +76 -0
  586. package/dist/templates/github/workflows/_cosign-copy/nas-compose.ejs +69 -0
  587. package/dist/templates/github/workflows/_deploy/aws-ecs.ejs +78 -0
  588. package/dist/templates/github/workflows/_deploy/azure-container-app.ejs +59 -0
  589. package/dist/templates/github/workflows/_deploy/gcp-cloud-run.ejs +71 -0
  590. package/dist/templates/github/workflows/_deploy/ghcr.ejs +19 -0
  591. package/dist/templates/github/workflows/_deploy/nas-compose.ejs +45 -0
  592. package/dist/templates/github/workflows/_k6-runner.yml.ejs +107 -0
  593. package/dist/templates/github/workflows/_label-on-approve.yml.ejs +44 -0
  594. package/dist/templates/github/workflows/_label-sync.yml.ejs +58 -0
  595. package/dist/templates/github/workflows/_monthly.yml.ejs +343 -0
  596. package/dist/templates/github/workflows/_nightly.yml.ejs +826 -0
  597. package/dist/templates/github/workflows/_notify.yml.ejs +96 -0
  598. package/dist/templates/github/workflows/_partials/macos-keychain-bypass.ejs +6 -0
  599. package/dist/templates/github/workflows/_partials/macos-keychain-restore.ejs +6 -0
  600. package/dist/templates/github/workflows/_partials/scheduled-heavy-jobs.ejs +117 -0
  601. package/dist/templates/github/workflows/_partials/sigstore-preflight.ejs +8 -0
  602. package/dist/templates/github/workflows/_partials/trivy-fs-java.ejs +27 -0
  603. package/dist/templates/github/workflows/_post-merge-notify.yml.ejs +228 -0
  604. package/dist/templates/github/workflows/_pr-staleness.yml.ejs +85 -0
  605. package/dist/templates/github/workflows/_shared-security.yml.ejs +132 -0
  606. package/dist/templates/github/workflows/_sigstore-retry-sign.yml.ejs +102 -0
  607. package/dist/templates/github/workflows/_weekly.yml.ejs +313 -0
  608. package/dist/templates/github/workflows/drift-shadow.yml.ejs +51 -0
  609. package/dist/templates/github/workflows/five-lane/ci.yml.ejs +54 -0
  610. package/dist/templates/github/workflows/five-lane/nightly.yml.ejs +70 -0
  611. package/dist/templates/github/workflows/five-lane/release.yml.ejs +53 -0
  612. package/dist/templates/github/workflows/five-lane/weekly.yml.ejs +72 -0
  613. package/dist/templates/github/workflows/issue-state.yml.ejs +93 -0
  614. package/dist/templates/global-invariants/GLOBAL_INVARIANTS.md.ejs +34 -0
  615. package/dist/templates/governance/RACI.md.ejs +21 -0
  616. package/dist/templates/governance/ci-mental-model.md.ejs +268 -0
  617. package/dist/templates/governance/contract-integrity-policy.md.ejs +116 -0
  618. package/dist/templates/governance/enterprise-compliance-baseline.md.ejs +111 -0
  619. package/dist/templates/governance/evidence-retention.md.ejs +43 -0
  620. package/dist/templates/governance/gdpr-erasure-runbook.md.ejs +165 -0
  621. package/dist/templates/governance/qa-audit-phases.md.ejs +129 -0
  622. package/dist/templates/governance/risk-assessment-template.md.ejs +105 -0
  623. package/dist/templates/governance/risk-register.md.ejs +76 -0
  624. package/dist/templates/governance/solo-dev-exception.md.ejs +96 -0
  625. package/dist/templates/governance/validation-evidence.md.ejs +131 -0
  626. package/dist/templates/infra/azure/containerapp.tpl.yaml.ejs +74 -0
  627. package/dist/templates/infra/nas-compose/deploy.sh.ejs +114 -0
  628. package/dist/templates/integration-testing/AbstractIntegrationTest.java.ejs +36 -0
  629. package/dist/templates/integration-testing/NoH2ArchTest.java.ejs +24 -0
  630. package/dist/templates/integration-testing/conftest.py.ejs +20 -0
  631. package/dist/templates/integration-testing/db_fixture.rs.ejs +48 -0
  632. package/dist/templates/integration-testing/eslint-no-fake-db.json.ejs +19 -0
  633. package/dist/templates/integration-testing/eslint.config.no-fake-db.mjs.ejs +46 -0
  634. package/dist/templates/integration-testing/main_test.go.ejs +53 -0
  635. package/dist/templates/integration-testing/main_test_sqlite.go.ejs +37 -0
  636. package/dist/templates/integration-testing/test-setup.ts.ejs +26 -0
  637. package/dist/templates/integration-testing/testcontainers-deps.gradle.ejs +9 -0
  638. package/dist/templates/java/DeprecationInterceptor.java.ejs +50 -0
  639. package/dist/templates/java/archunit-hexagonal.ejs +69 -0
  640. package/dist/templates/java/modulith/ApplicationModulesTest.java.ejs +21 -0
  641. package/dist/templates/java/modulith/modulith-deps.gradle.ejs +13 -0
  642. package/dist/templates/java/modulith/modulith-maven-setup.md.ejs +21 -0
  643. package/dist/templates/java/pharma/AuditEvent.java.ejs +138 -0
  644. package/dist/templates/java/pharma/AuditMapper.java.ejs +60 -0
  645. package/dist/templates/java/pharma/archunit-pharma.ejs +128 -0
  646. package/dist/templates/kit/GLOBAL_KIT.md.ejs +11 -0
  647. package/dist/templates/kit/dim.md.ejs +33 -0
  648. package/dist/templates/llms-txt.config.json.ejs +22 -0
  649. package/dist/templates/local-wrapper/.env.example.ejs +15 -0
  650. package/dist/templates/local-wrapper/Makefile.ejs +44 -0
  651. package/dist/templates/local-wrapper/run.sh.ejs +5 -0
  652. package/dist/templates/middleware/410-gone-handler.ts.ejs +41 -0
  653. package/dist/templates/middleware/correlation-id.ts.ejs +32 -0
  654. package/dist/templates/middleware/deprecation.ts.ejs +45 -0
  655. package/dist/templates/middleware/error-handler.ts.ejs +73 -0
  656. package/dist/templates/middleware/payload-size-limit.ts.ejs +51 -0
  657. package/dist/templates/mutation/README.md.ejs +67 -0
  658. package/dist/templates/mutation/cargo-mutants.toml.ejs +9 -0
  659. package/dist/templates/mutation/mutmut-config.toml.ejs +7 -0
  660. package/dist/templates/mutation/parse-mutants.mjs.ejs +44 -0
  661. package/dist/templates/mutation/parse-mutmut.py.ejs +44 -0
  662. package/dist/templates/mutation/pitest-l2-setup.md.ejs +66 -0
  663. package/dist/templates/mutation/pitest-maven-setup.md.ejs +64 -0
  664. package/dist/templates/mutation/pitest.gradle.ejs +23 -0
  665. package/dist/templates/mutation/stryker.conf.json.ejs +17 -0
  666. package/dist/templates/observability/setup.md.ejs +495 -0
  667. package/dist/templates/operations/handbook.md.ejs +217 -0
  668. package/dist/templates/perf/bundle-budget.json.ejs +29 -0
  669. package/dist/templates/perf/k6/reports/csv-report.py.ejs +91 -0
  670. package/dist/templates/perf/k6/reports/html-report.py.ejs +114 -0
  671. package/dist/templates/perf/k6/reports/json-report.py.ejs +74 -0
  672. package/dist/templates/perf/k6/scenarios/breakpoint.js.ejs +26 -0
  673. package/dist/templates/perf/k6/scenarios/burst.js.ejs +43 -0
  674. package/dist/templates/perf/k6/scenarios/endurance.js.ejs +36 -0
  675. package/dist/templates/perf/k6/scenarios/load.js.ejs +26 -0
  676. package/dist/templates/perf/k6/scenarios/ramp-down.js.ejs +29 -0
  677. package/dist/templates/perf/k6/scenarios/ramp-up.js.ejs +32 -0
  678. package/dist/templates/perf/k6/scenarios/smoke.js.ejs +23 -0
  679. package/dist/templates/perf/k6/scenarios/soak.js.ejs +26 -0
  680. package/dist/templates/perf/k6/scenarios/spike.js.ejs +29 -0
  681. package/dist/templates/perf/k6/scenarios/steady-state.js.ejs +31 -0
  682. package/dist/templates/perf/k6/scenarios/stress.js.ejs +29 -0
  683. package/dist/templates/perf/k6/scenarios/volume.js.ejs +36 -0
  684. package/dist/templates/perf/k6/seed/test-data.sql.ejs +59 -0
  685. package/dist/templates/perf/lighthouserc.json.ejs +41 -0
  686. package/dist/templates/quality/iso9001/CAPA_LOG.md.ejs +36 -0
  687. package/dist/templates/quality/iso9001/DOCUMENT_CONTROL.md.ejs +36 -0
  688. package/dist/templates/quality/iso9001/REQUIREMENTS_TRACEABILITY.md.ejs +61 -0
  689. package/dist/templates/regulated/overlay.json.ejs +26 -0
  690. package/dist/templates/regulated/regulated-overlay.md.ejs +40 -0
  691. package/dist/templates/resilience/RESILIENCE.md.ejs +310 -0
  692. package/dist/templates/root/.gitignore.ejs +85 -0
  693. package/dist/templates/root/CODEOWNERS.ejs +18 -0
  694. package/dist/templates/root/CONTRIBUTING.md.ejs +62 -0
  695. package/dist/templates/root/SECURITY.md.ejs +19 -0
  696. package/dist/templates/root/TEST_TAXONOMY.md.ejs +100 -0
  697. package/dist/templates/root/commitlint.config.js.ejs +4 -0
  698. package/dist/templates/root/docs/METHOD/CANONICAL_PATHS.md.ejs +24 -0
  699. package/dist/templates/root/docs/METHOD/ENGINEERING_DEFAULTS.md.ejs +136 -0
  700. package/dist/templates/root/docs/METHOD/KNOWLEDGE_MAP.md.ejs +90 -0
  701. package/dist/templates/root/docs/METHOD/PATTERNS_CATALOG.md.ejs +51 -0
  702. package/dist/templates/root/docs/METHOD/REUSE_REGISTRY.md.ejs +26 -0
  703. package/dist/templates/root/docs/METHOD/REUSE_REGISTRY_SPEC.md.ejs +80 -0
  704. package/dist/templates/root/docs/METHOD/SSOT_CORE_SET.md.ejs +62 -0
  705. package/dist/templates/root/docs/METHOD/TRACK_ROUTER.md.ejs +39 -0
  706. package/dist/templates/root/docs/SYSTEM/CANON.md.ejs +359 -0
  707. package/dist/templates/root/docs/SYSTEM/FAIL_CLOSED.md.ejs +171 -0
  708. package/dist/templates/root/editorconfig.ejs +39 -0
  709. package/dist/templates/root/tsconfig.json.ejs +21 -0
  710. package/dist/templates/rust/clippy.toml.ejs +14 -0
  711. package/dist/templates/schemas/milestone.schema.json.ejs +164 -0
  712. package/dist/templates/schemas/rtm-verdict.schema.json.ejs +52 -0
  713. package/dist/templates/schemas/source-record.schema.json.ejs +91 -0
  714. package/dist/templates/schemas/tabletop-evidence.schema.json.ejs +53 -0
  715. package/dist/templates/schemas/use-case.schema.json.ejs +59 -0
  716. package/dist/templates/scripts/apply-branch-protection.mjs.ejs +70 -0
  717. package/dist/templates/scripts/audit-toolchain.mjs.ejs +112 -0
  718. package/dist/templates/scripts/bg-run.sh.ejs +59 -0
  719. package/dist/templates/scripts/capacity-probe.mjs.ejs +147 -0
  720. package/dist/templates/scripts/capture-debt-baseline.mjs.ejs +99 -0
  721. package/dist/templates/scripts/check-acceptance.mjs.ejs +298 -0
  722. package/dist/templates/scripts/check-action-pins.mjs.ejs +215 -0
  723. package/dist/templates/scripts/check-agent-return.mjs.ejs +177 -0
  724. package/dist/templates/scripts/check-all.mjs.ejs +1746 -0
  725. package/dist/templates/scripts/check-anti-fake-green.mjs.ejs +80 -0
  726. package/dist/templates/scripts/check-anti-proforma.mjs.ejs +547 -0
  727. package/dist/templates/scripts/check-api-e2e.mjs.ejs +106 -0
  728. package/dist/templates/scripts/check-arc42-slots.mjs.ejs +25 -0
  729. package/dist/templates/scripts/check-assertion-delta.mjs.ejs +287 -0
  730. package/dist/templates/scripts/check-audit-dry-pass.mjs.ejs +176 -0
  731. package/dist/templates/scripts/check-bundle-size.mjs.ejs +151 -0
  732. package/dist/templates/scripts/check-canonical-paths.mjs.ejs +39 -0
  733. package/dist/templates/scripts/check-ci-tiers.mjs.ejs +111 -0
  734. package/dist/templates/scripts/check-claude-md-lint.mjs.ejs +142 -0
  735. package/dist/templates/scripts/check-collab-mode-wired.mjs.ejs +60 -0
  736. package/dist/templates/scripts/check-commit-footer-rationale.mjs.ejs +170 -0
  737. package/dist/templates/scripts/check-constraint-scan.mjs.ejs +681 -0
  738. package/dist/templates/scripts/check-consumer-audit.mjs.ejs +414 -0
  739. package/dist/templates/scripts/check-continue-on-error.mjs.ejs +227 -0
  740. package/dist/templates/scripts/check-cross-model-review.mjs.ejs +458 -0
  741. package/dist/templates/scripts/check-decision-registry.mjs.ejs +101 -0
  742. package/dist/templates/scripts/check-doc-freshness.mjs.ejs +17 -0
  743. package/dist/templates/scripts/check-doc-links.mjs.ejs +98 -0
  744. package/dist/templates/scripts/check-doc-set.mjs.ejs +18 -0
  745. package/dist/templates/scripts/check-docs.mjs.ejs +71 -0
  746. package/dist/templates/scripts/check-domain-api-surface.mjs.ejs +80 -0
  747. package/dist/templates/scripts/check-drift.mjs.ejs +167 -0
  748. package/dist/templates/scripts/check-duplication.mjs.ejs +45 -0
  749. package/dist/templates/scripts/check-e2e-escalation.mjs.ejs +199 -0
  750. package/dist/templates/scripts/check-e2e-quarantine.mjs.ejs +68 -0
  751. package/dist/templates/scripts/check-emission-parity.mjs.ejs +91 -0
  752. package/dist/templates/scripts/check-exit-code-contract.mjs.ejs +138 -0
  753. package/dist/templates/scripts/check-fail-closed-audit.mjs.ejs +389 -0
  754. package/dist/templates/scripts/check-fe-boundaries.mjs.ejs +184 -0
  755. package/dist/templates/scripts/check-feature-matrix.mjs.ejs +835 -0
  756. package/dist/templates/scripts/check-frontend-lane.mjs.ejs +73 -0
  757. package/dist/templates/scripts/check-grace-window.mjs.ejs +102 -0
  758. package/dist/templates/scripts/check-handoff-doc.mjs.ejs +192 -0
  759. package/dist/templates/scripts/check-hook-routing.mjs.ejs +224 -0
  760. package/dist/templates/scripts/check-image-pins.mjs.ejs +90 -0
  761. package/dist/templates/scripts/check-inline-suppressions.mjs.ejs +153 -0
  762. package/dist/templates/scripts/check-iso9001.mjs.ejs +146 -0
  763. package/dist/templates/scripts/check-knowledge-map.mjs.ejs +49 -0
  764. package/dist/templates/scripts/check-local-ci-parity.mjs.ejs +382 -0
  765. package/dist/templates/scripts/check-m16-handoff.mjs.ejs +112 -0
  766. package/dist/templates/scripts/check-merge-method.mjs.ejs +92 -0
  767. package/dist/templates/scripts/check-milestones.mjs.ejs +678 -0
  768. package/dist/templates/scripts/check-min-test-execution.mjs.ejs +225 -0
  769. package/dist/templates/scripts/check-muted-test.mjs.ejs +270 -0
  770. package/dist/templates/scripts/check-no-stub-redirects.mjs.ejs +154 -0
  771. package/dist/templates/scripts/check-no-tracked-artifacts.mjs.ejs +134 -0
  772. package/dist/templates/scripts/check-oracle-discrimination.mjs.ejs +244 -0
  773. package/dist/templates/scripts/check-pii-scan.mjs.ejs +67 -0
  774. package/dist/templates/scripts/check-pipe-tee-hazard.mjs.ejs +85 -0
  775. package/dist/templates/scripts/check-pr-size-gate.mjs.ejs +85 -0
  776. package/dist/templates/scripts/check-refutation-verdicts.mjs.ejs +256 -0
  777. package/dist/templates/scripts/check-regulated-overlay.mjs.ejs +158 -0
  778. package/dist/templates/scripts/check-render-smoke.mjs.ejs +100 -0
  779. package/dist/templates/scripts/check-reuse-registry.mjs.ejs +44 -0
  780. package/dist/templates/scripts/check-review-completion.mjs.ejs +708 -0
  781. package/dist/templates/scripts/check-safety-adopt-ratchet.mjs.ejs +142 -0
  782. package/dist/templates/scripts/check-secret-presence.mjs.ejs +191 -0
  783. package/dist/templates/scripts/check-secret-scan.mjs.ejs +82 -0
  784. package/dist/templates/scripts/check-skip-critical-e2e.mjs.ejs +142 -0
  785. package/dist/templates/scripts/check-smoke-journeys.mjs.ejs +272 -0
  786. package/dist/templates/scripts/check-solo-reactivation.mjs.ejs +102 -0
  787. package/dist/templates/scripts/check-sources.mjs.ejs +245 -0
  788. package/dist/templates/scripts/check-ssot-core.mjs.ejs +45 -0
  789. package/dist/templates/scripts/check-stack-conformity.mjs.ejs +160 -0
  790. package/dist/templates/scripts/check-stride-traceability.mjs.ejs +101 -0
  791. package/dist/templates/scripts/check-suppression-expiry.mjs.ejs +79 -0
  792. package/dist/templates/scripts/check-suppression-rationale.mjs.ejs +76 -0
  793. package/dist/templates/scripts/check-suppressions.mjs.ejs +150 -0
  794. package/dist/templates/scripts/check-tabletop-evidence.mjs.ejs +499 -0
  795. package/dist/templates/scripts/check-tdd-evidence.mjs.ejs +381 -0
  796. package/dist/templates/scripts/check-test-naming.mjs.ejs +151 -0
  797. package/dist/templates/scripts/check-test-pyramid.mjs.ejs +170 -0
  798. package/dist/templates/scripts/check-test-scope-tier.mjs.ejs +208 -0
  799. package/dist/templates/scripts/check-tier-coverage.mjs.ejs +71 -0
  800. package/dist/templates/scripts/check-todo-max-age.mjs.ejs +205 -0
  801. package/dist/templates/scripts/check-touched-vs-manifest.mjs.ejs +179 -0
  802. package/dist/templates/scripts/check-unwired-guards.mjs.ejs +367 -0
  803. package/dist/templates/scripts/check-use-cases.mjs.ejs +345 -0
  804. package/dist/templates/scripts/check-validator-helptext.mjs.ejs +80 -0
  805. package/dist/templates/scripts/check-wiki-lint.mjs.ejs +162 -0
  806. package/dist/templates/scripts/check-workflow-docs-sync.mjs.ejs +91 -0
  807. package/dist/templates/scripts/check-workflow-job-naming.mjs.ejs +102 -0
  808. package/dist/templates/scripts/check-workflow-perms.mjs.ejs +54 -0
  809. package/dist/templates/scripts/check-workflow-runners.mjs.ejs +87 -0
  810. package/dist/templates/scripts/check-workflow-sha-pinning.mjs.ejs +89 -0
  811. package/dist/templates/scripts/check-workflow-test-integrity.mjs.ejs +235 -0
  812. package/dist/templates/scripts/checks/check-rust-no-unsafe.mjs.ejs +58 -0
  813. package/dist/templates/scripts/checks/check-rust-no-unwrap.mjs.ejs +61 -0
  814. package/dist/templates/scripts/ci-classify-changes.mjs.ejs +119 -0
  815. package/dist/templates/scripts/conformance.mjs.ejs +37 -0
  816. package/dist/templates/scripts/constraint-map.json.ejs +25 -0
  817. package/dist/templates/scripts/debt-lib.mjs.ejs +1015 -0
  818. package/dist/templates/scripts/debt-report.mjs.ejs +199 -0
  819. package/dist/templates/scripts/domain-api-surface.json.ejs +23 -0
  820. package/dist/templates/scripts/done-evidence.mjs.ejs +359 -0
  821. package/dist/templates/scripts/evidence-collect.mjs.ejs +264 -0
  822. package/dist/templates/scripts/evidence-prune.mjs.ejs +96 -0
  823. package/dist/templates/scripts/evidence-rotate.mjs.ejs +53 -0
  824. package/dist/templates/scripts/evidence-writer.sh.ejs +220 -0
  825. package/dist/templates/scripts/gate-registry.yml.ejs +286 -0
  826. package/dist/templates/scripts/gen-doc-index.mjs.ejs +19 -0
  827. package/dist/templates/scripts/gen-gap.mjs.ejs +153 -0
  828. package/dist/templates/scripts/gen-llms-txt.mjs.ejs +18 -0
  829. package/dist/templates/scripts/gen-wiki.mjs.ejs +196 -0
  830. package/dist/templates/scripts/gh-cleanup-expired-artifacts.mjs.ejs +134 -0
  831. package/dist/templates/scripts/gold-audit.mjs.ejs +19 -0
  832. package/dist/templates/scripts/i18n-literal-scanner.mjs.ejs +175 -0
  833. package/dist/templates/scripts/ingest-zap-report.mjs.ejs +107 -0
  834. package/dist/templates/scripts/inject-pact-samples.sh.ejs +96 -0
  835. package/dist/templates/scripts/issue-readiness.mjs.ejs +84 -0
  836. package/dist/templates/scripts/knowledge-map-update.mjs.ejs +32 -0
  837. package/dist/templates/scripts/lib/acceptance-criteria.mjs.ejs +213 -0
  838. package/dist/templates/scripts/lib/agent-return-validate.mjs.ejs +481 -0
  839. package/dist/templates/scripts/lib/coverage-gate.mjs.ejs +54 -0
  840. package/dist/templates/scripts/lib/e2e-reliability.mjs.ejs +207 -0
  841. package/dist/templates/scripts/lib/ephemeral-server.mjs.ejs +148 -0
  842. package/dist/templates/scripts/lib/evidence-binding.mjs.ejs +140 -0
  843. package/dist/templates/scripts/lib/exact-sha-policy.mjs.ejs +233 -0
  844. package/dist/templates/scripts/lib/gate-args.mjs.ejs +20 -0
  845. package/dist/templates/scripts/lib/gate-evidence.mjs.ejs +622 -0
  846. package/dist/templates/scripts/lib/gate-mutex.mjs.ejs +340 -0
  847. package/dist/templates/scripts/lib/glob-walk.mjs.ejs +148 -0
  848. package/dist/templates/scripts/lib/run-helpers.mjs.ejs +416 -0
  849. package/dist/templates/scripts/lib/seed-common.sh.ejs +105 -0
  850. package/dist/templates/scripts/lib/waiter-count.mjs.ejs +62 -0
  851. package/dist/templates/scripts/muted-tests-baseline.json.ejs +4 -0
  852. package/dist/templates/scripts/optional-emissions.json.ejs +117 -0
  853. package/dist/templates/scripts/oracle-discrimination-baseline.json.ejs +6 -0
  854. package/dist/templates/scripts/pid-watch.sh.ejs +78 -0
  855. package/dist/templates/scripts/pii-scan.mjs.ejs +125 -0
  856. package/dist/templates/scripts/pr-merge-watch.mjs.ejs +445 -0
  857. package/dist/templates/scripts/record-agent-return.mjs.ejs +279 -0
  858. package/dist/templates/scripts/record-journey-evidence.mjs.ejs +69 -0
  859. package/dist/templates/scripts/rework-log.mjs.ejs +172 -0
  860. package/dist/templates/scripts/run-postman-tests.sh.ejs +112 -0
  861. package/dist/templates/scripts/schemas/agent-return-external.schema.json +74 -0
  862. package/dist/templates/scripts/schemas/agent-return.schema.json.ejs +181 -0
  863. package/dist/templates/scripts/schemas/cross-model-dispatch.schema.json +95 -0
  864. package/dist/templates/scripts/seed-test-data.sh.ejs +99 -0
  865. package/dist/templates/scripts/self-validation.mjs.ejs +126 -0
  866. package/dist/templates/scripts/setup-repo.sh.ejs +78 -0
  867. package/dist/templates/scripts/spotbugs-baseline.json.ejs +4 -0
  868. package/dist/templates/scripts/test-gate-layering.mjs.ejs +92 -0
  869. package/dist/templates/scripts/validate-api-snapshots.mjs.ejs +86 -0
  870. package/dist/templates/scripts/validate-k6-scenarios.mjs.ejs +96 -0
  871. package/dist/templates/scripts/validate-openapi-field-types.mjs.ejs +124 -0
  872. package/dist/templates/scripts/validate-postman-collection.mjs.ejs +159 -0
  873. package/dist/templates/scripts/verify-fe-coverage.mjs.ejs +138 -0
  874. package/dist/templates/scripts/verify-i18n-parity.mjs.ejs +114 -0
  875. package/dist/templates/scripts/verify-module-coverage.mjs.ejs +207 -0
  876. package/dist/templates/scripts/verify-mutation-baseline.mjs.ejs +209 -0
  877. package/dist/templates/scripts/verify-spotbugs.mjs.ejs +216 -0
  878. package/dist/templates/scripts/verify-tokens.mjs.ejs +177 -0
  879. package/dist/templates/security/RISK_ASSESSMENT.md.ejs +35 -0
  880. package/dist/templates/security/STRIDE.md.ejs +24 -0
  881. package/dist/templates/security/gitleaks.toml.ejs +21 -0
  882. package/dist/templates/security/zap/baseline-auth.context.ejs +58 -0
  883. package/dist/templates/security/zap/rules.tsv.ejs +100 -0
  884. package/dist/templates/ship/TICK_PROMPT.md.ejs +55 -0
  885. package/dist/templates/ship/supervisor.sh.ejs +46 -0
  886. package/dist/templates/smoke-journeys/manifest.json.ejs +1 -0
  887. package/dist/templates/sonar-project.properties.ejs +25 -0
  888. package/dist/templates/standards/doc-profile.ejs +27 -0
  889. package/dist/templates/standards/gold-doc-set.yml.ejs +528 -0
  890. package/dist/templates/standards/gold-registry.java.yml.ejs +266 -0
  891. package/dist/templates/standards/gold-registry.typescript.yml.ejs +104 -0
  892. package/dist/templates/standards/gold-registry.yml.ejs +119 -0
  893. package/dist/templates/standards/thresholds.yml.ejs +86 -0
  894. package/dist/templates/static-analysis/.dependency-cruiser.cjs.ejs +78 -0
  895. package/dist/templates/static-analysis/.golangci.yml.ejs +70 -0
  896. package/dist/templates/static-analysis/.shellcheckrc.ejs +13 -0
  897. package/dist/templates/static-analysis/.yamllint.yml.ejs +41 -0
  898. package/dist/templates/static-analysis/checkstyle.xml.ejs +83 -0
  899. package/dist/templates/static-analysis/detekt.yml.ejs +26 -0
  900. package/dist/templates/static-analysis/eslint.config.mjs.ejs +54 -0
  901. package/dist/templates/static-analysis/eslint.config.static.mjs.ejs +38 -0
  902. package/dist/templates/static-analysis/eslintrc-static.json.ejs +30 -0
  903. package/dist/templates/static-analysis/jscpd.json.ejs +25 -0
  904. package/dist/templates/static-analysis/knip.json.ejs +26 -0
  905. package/dist/templates/static-analysis/pmd-ruleset.xml.ejs +92 -0
  906. package/dist/templates/static-analysis/prettierignore.ejs +59 -0
  907. package/dist/templates/static-analysis/prettierrc.json.ejs +10 -0
  908. package/dist/templates/static-analysis/requirements-dev.txt.ejs +11 -0
  909. package/dist/templates/static-analysis/ruff.toml.ejs +40 -0
  910. package/dist/templates/static-analysis/rustfmt.toml.ejs +3 -0
  911. package/dist/templates/static-analysis/spotbugs-exclude.xml.ejs +120 -0
  912. package/dist/templates/static-analysis/spotbugs.gradle.ejs +18 -0
  913. package/dist/templates/static-analysis/spotless.gradle.ejs +38 -0
  914. package/dist/templates/static-analysis/stylelintrc.json.ejs +16 -0
  915. package/dist/templates/suppressions/archunit-baseline.json.ejs +1 -0
  916. package/dist/templates/suppressions/consumer-audit-allowlist.json.ejs +1 -0
  917. package/dist/templates/suppressions/gitleaksignore.ejs +20 -0
  918. package/dist/templates/suppressions/pii-allowlist.json.ejs +1 -0
  919. package/dist/templates/suppressions/suppressions-schema.json.ejs +39 -0
  920. package/dist/templates/suppressions/trivyignore.ejs +17 -0
  921. package/dist/templates/testing/test-taxonomy.md.ejs +120 -0
  922. package/dist/test/example.behavioral.test.js +2 -0
  923. package/dist/types/memory.d.ts +19 -0
  924. package/dist/types/memory.js +1 -0
  925. package/dist/types/plan.d.ts +102 -0
  926. package/dist/types/plan.js +2 -0
  927. package/dist/types/plugin.d.ts +45 -0
  928. package/dist/types/plugin.js +1 -0
  929. package/dist/utils/canon-loader.js +2 -0
  930. package/dist/utils/channel.js +1 -0
  931. package/dist/utils/config.d.ts +79 -0
  932. package/dist/utils/config.js +5 -0
  933. package/dist/utils/confirm-downgrade.js +5 -0
  934. package/dist/utils/env.js +2 -0
  935. package/dist/utils/error-catalog.js +2 -0
  936. package/dist/utils/errors.js +2 -0
  937. package/dist/utils/evidence-log.js +3 -0
  938. package/dist/utils/file-lock.js +2 -0
  939. package/dist/utils/first-run.js +8 -0
  940. package/dist/utils/fs.js +3 -0
  941. package/dist/utils/github-issue-helper.js +4 -0
  942. package/dist/utils/gradle.js +21 -0
  943. package/dist/utils/json-output.js +2 -0
  944. package/dist/utils/logger-config.js +4 -0
  945. package/dist/utils/logger.js +3 -0
  946. package/dist/utils/maturity-check.js +2 -0
  947. package/dist/utils/pkg.js +3 -0
  948. package/dist/utils/platform.js +2 -0
  949. package/dist/utils/plugin-loader.js +2 -0
  950. package/dist/utils/plugin-worker.js +2 -0
  951. package/dist/utils/prettier-format.js +2 -0
  952. package/dist/utils/profiler.js +2 -0
  953. package/dist/utils/render.js +2 -0
  954. package/dist/utils/replay.js +3 -0
  955. package/dist/utils/run-cli.js +6 -0
  956. package/dist/utils/run-id.js +3 -0
  957. package/dist/utils/safe-read.js +2 -0
  958. package/dist/utils/task-id.js +2 -0
  959. package/dist/utils/today.js +2 -0
  960. package/dist/utils/tty.js +2 -0
  961. package/dist/utils/walk-dir.js +2 -0
  962. package/dist/verify/rules/drive-by-scope.js +1 -0
  963. package/dist/verify/rules/orphan-todos.js +1 -0
  964. package/dist/verify/rules/registry.js +1 -0
  965. package/dist/verify/rules/skip-patterns.js +1 -0
  966. package/dist/verify/rules/types.d.ts +15 -0
  967. package/dist/verify/rules/types.js +1 -0
  968. package/dist/verify/rules/ui-language.js +1 -0
  969. package/dist/verify/run.js +3 -0
  970. package/dist/wizard/archetype-defaults.js +1 -0
  971. package/dist/wizard/presets.js +1 -0
  972. package/dist/wizard/prompts.js +44 -0
  973. package/dist/wizard/types.d.ts +637 -0
  974. package/dist/wizard/types.js +1 -0
  975. package/dist/worktree/harvest.js +2 -0
  976. package/dist/worktree/links.js +2 -0
  977. package/dist/worktree/paths.js +2 -0
  978. package/dist/worktree/validate.js +3 -0
  979. package/package.json +124 -0
  980. package/scripts/check-arc42-slots.mjs +738 -0
  981. package/scripts/check-doc-freshness.mjs +236 -0
  982. package/scripts/check-doc-set.mjs +243 -0
  983. package/scripts/check-doc-style.mjs +228 -0
  984. package/scripts/gold-audit.mjs +319 -0
  985. package/scripts/lib/doc-gate-allowlist.mjs +123 -0
  986. package/scripts/lib/doc-set-resolve.mjs +274 -0
  987. package/scripts/lib/glob-walk.mjs +148 -0
  988. package/scripts/lib/gold-audit-lib.mjs +1260 -0
  989. package/scripts/lib/run-helpers.mjs +413 -0
@@ -0,0 +1,286 @@
1
+ # gate-registry.yml.ejs — the DECLARATIVE gate registry (#2041, AC-2041.4).
2
+ #
3
+ # Every gate the generated check-all.mjs runs is declared here: id, display
4
+ # name, lane level, kind, and spawn command. The generator
5
+ # (src/generators/check-all.ts) renders this manifest with the project config
6
+ # (EJS expressions in `cmd` resolve at generation time), validates the shape,
7
+ # and consumes it to emit the gate sections of check-all.mjs — replacing the
8
+ # hardcoded runCheck(...) calls that used to live inline in the template.
9
+ #
10
+ # Entry fields:
11
+ # id kebab-case identifier — used by `--gate <id>` and the layering
12
+ # contract test (scripts/test-gate-layering.mjs).
13
+ # name display name (the runCheck first argument; also accepted by
14
+ # `--gate <name>` for backward compatibility with #2078).
15
+ # level L1 | L2 | L3 — the lane this gate belongs to. Structural
16
+ # containment L1 ⊂ L2 ⊂ L3: `check-all.mjs <level>` runs every
17
+ # gate whose level is <= the requested level.
18
+ # kind check (hard) | warn (advisory) | tool (CI-aware) | inline
19
+ # (custom JS body in the template, declared here for manifest
20
+ # completeness — see the INLINE_BLOCKS section of check-all.mjs).
21
+ # cmd [binary, ...args] — EJS expressions are allowed; rendered at
22
+ # generation time (e.g. `<%%= packageManager %>`).
23
+ # language optional — wraps the gate in `if (language === '<lang>')`.
24
+ # condition optional — raw expression wrapped in `if (<expr>) { ... }`.
25
+ # else optional — raw body emitted in the `else` branch (used by the
26
+ # SKIP-report gates: audit, npm-ci drift, playwright rules).
27
+ # soft true → the gate runs with `{ soft: graceActive }`.
28
+ # promotes_to optional — id of a gate this one REPLACES at runtime once its
29
+ # own level is reached (e.g. an L3 `harness-full` entry with
30
+ # `promotes_to: harness-fast` skips `harness-fast` once the run
31
+ # level is L3+). #9003.
32
+ # audit optional true — an audit-only gate, a second axis orthogonal
33
+ # to level; skipped at runtime when the consumer sets
34
+ # `ARBITER_AUDIT_MODE=off`. #9003.
35
+ #
36
+ # ORDER IS MEANINGFUL: the emitted script runs gates in registry order within
37
+ # each level (the pre-#2041 inline order is preserved).
38
+ #
39
+ # Existing Code Survey (CANON-16): the de-facto registry was the inline
40
+ # runCheck(...) surface of check-all.mjs.ejs (191 calls) — no separate registry
41
+ # file existed; this manifest REPLACES that inline surface (justified by
42
+ # AC-2041.4), it does not duplicate it.
43
+
44
+ gates:
45
+ # ── L1 ─────────────────────────────────────────────────────────────────────
46
+ - { id: pii-scan, name: 'PII scan', level: L1, kind: check, cmd: ['node', ['scripts/pii-scan.mjs']] }
47
+ - { id: secret-scan, name: 'secret scan', level: L1, kind: check, cmd: ['node', ['scripts/check-secret-scan.mjs']] }
48
+ - { id: typecheck, name: typecheck, level: L1, kind: check, language: typescript, cmd: ['npx', ['tsc', '--noEmit']] }
49
+ - { id: format, name: format, level: L1, kind: check, language: typescript, cmd: ['npx', ['prettier', '--check', '.']] }
50
+ - { id: lint, name: lint, level: L1, kind: check, language: typescript, cmd: ['npx', ['eslint', '.']] }
51
+ - { id: static-analysis, name: 'static analysis', level: L1, kind: check, language: typescript, condition: "gateFilePresent('eslint.config.static.mjs', 'static analysis', '[CHECK] static analysis ... SKIP (run: arbiter update)')", cmd: ['npx', ['eslint', '--config', 'eslint.config.static.mjs', '--no-config-lookup', '--no-error-on-unmatched-pattern', 'src']] }
52
+ - { id: no-fake-db-imports, name: 'no-fake-db imports (INV-34)', level: L1, kind: check, language: typescript, condition: "gateFilePresent('eslint.config.no-fake-db.mjs', 'no-fake-db imports (INV-34)')", cmd: ['npx', ['eslint', '--config', 'eslint.config.no-fake-db.mjs', '--no-config-lookup', '--no-error-on-unmatched-pattern', '.']] }
53
+ - { id: unit-tests, name: 'unit tests', level: L1, kind: check, language: typescript, cmd: ['<%= packageManager %>', ['run', 'test:unit']] }
54
+ - { id: npm-ci-drift, name: 'npm-ci drift', level: L1, kind: inline, language: typescript, emitIf: "packageManager === 'npm'", else: "console.log('[CHECK] npm-ci drift ... SKIP (project uses <%= packageManager %>)');\npushResult('npm-ci drift', 'SKIP', 0);" }
55
+ - { id: rust-fmt, name: fmt, level: L1, kind: check, language: rust, cmd: ['cargo', ['fmt', '--check']] }
56
+ - { id: clippy, name: clippy, level: L1, kind: check, language: rust, cmd: ['cargo', ['clippy', '--', '-D', 'warnings']] }
57
+ - { id: rust-unit-tests, name: 'unit tests', level: L1, kind: check, language: rust, cmd: ['cargo', ['test']] }
58
+ - { id: no-unwrap, name: 'no .unwrap()/.expect()', level: L1, kind: check, language: rust, cmd: ['node', ['scripts/checks/check-rust-no-unwrap.mjs']] }
59
+ - { id: no-unsafe, name: 'no unsafe', level: L1, kind: check, language: rust, cmd: ['node', ['scripts/checks/check-rust-no-unsafe.mjs']] }
60
+ - { id: gradle-checkstyle, name: checkstyle, level: L1, kind: check, emitIf: "language === 'java' && buildTool === 'gradle'", cmd: ['./gradlew', ['checkstyleMain', '-q']] }
61
+ - { id: gradle-spotless, name: 'format (spotless)', level: L1, kind: check, emitIf: "language === 'java' && buildTool === 'gradle'", cmd: ['./gradlew', ['spotlessCheck', '-q']] }
62
+ - { id: gradle-unit-tests, name: 'unit tests', level: L1, kind: check, emitIf: "language === 'java' && buildTool === 'gradle'", cmd: ['./gradlew', ['test', '-q']] }
63
+ - { id: maven-checkstyle, name: checkstyle, level: L1, kind: check, emitIf: "language === 'java' && buildTool === 'maven'", cmd: ['mvn', ['checkstyle:check', '-q']] }
64
+ - { id: maven-spotless, name: 'format (spotless)', level: L1, kind: check, emitIf: "language === 'java' && buildTool === 'maven'", cmd: ['mvn', ['spotless:check', '-q']] }
65
+ - { id: maven-unit-tests, name: 'unit tests', level: L1, kind: check, emitIf: "language === 'java' && buildTool === 'maven'", cmd: ['mvn', ['test', '-q']] }
66
+ - { id: go-vet, name: vet, level: L1, kind: check, language: go, cmd: ['go', ['vet', './...']] }
67
+ - { id: golangci-lint, name: lint, level: L1, kind: check, language: go, cmd: ['golangci-lint', ['run']] }
68
+ - { id: gofmt, name: 'fmt (gofmt)', level: L1, kind: inline, language: go }
69
+ - { id: go-unit-tests, name: 'unit tests', level: L1, kind: check, language: go, cmd: ['go', ['test', './...']] }
70
+ - { id: ruff-lint, name: lint, level: L1, kind: check, language: python, cmd: ['ruff', ['check', '.']] }
71
+ - { id: ruff-format, name: format, level: L1, kind: check, language: python, cmd: ['ruff', ['format', '--check', '.']] }
72
+ - { id: pytest-unit-tests, name: 'unit tests', level: L1, kind: check, language: python, cmd: ['pytest', []] }
73
+ - { id: kotlin-unit-tests, name: 'unit tests', level: L1, kind: check, emitIf: "language === 'kotlin' && buildTool === 'gradle'", cmd: ['./gradlew', ['test', '-q']] }
74
+ - { id: detekt, name: 'detekt (beta)', level: L1, kind: check, emitIf: "language === 'kotlin' && buildTool === 'gradle'", soft: true, cmd: ['./gradlew', ['detekt']] }
75
+ - { id: no-tracked-artifacts, name: 'no tracked artifacts (INV-129)', level: L1, kind: check, cmd: ['node', ['scripts/check-no-tracked-artifacts.mjs']] }
76
+ - { id: image-pins, name: 'image pins (#1442)', level: L1, kind: check, cmd: ['node', ['scripts/check-image-pins.mjs']] }
77
+ - { id: e2e-quarantine, name: 'e2e quarantine (INV-130)', level: L1, kind: check, cmd: ['node', ['scripts/check-e2e-quarantine.mjs']] }
78
+ - { id: test-naming, name: 'test naming', level: L1, kind: check, cmd: ['node', ['scripts/check-test-naming.mjs']] }
79
+ - { id: min-test-execution, name: 'min test execution (INV-25)', level: L1, kind: check, cmd: ['node', ['scripts/check-min-test-execution.mjs']] }
80
+ - { id: exit-code-contract, name: 'exit code contract', level: L1, kind: check, cmd: ['node', ['scripts/check-exit-code-contract.mjs']] }
81
+ - { id: pipe-tee-hazard, name: 'pipe/tee hazard', level: L1, kind: check, cmd: ['node', ['scripts/check-pipe-tee-hazard.mjs']] }
82
+ - { id: self-validation-drill, name: 'self-validation drill', level: L1, kind: check, emitIf: "typeof enableSelfValidationHarness === 'undefined' || enableSelfValidationHarness !== false", cmd: ['node', ['scripts/self-validation.mjs']] }
83
+ - { id: config-drift, name: 'config drift', level: L1, kind: check, cmd: ['node', ['scripts/check-drift.mjs']] }
84
+ - { id: validator-helptext, name: 'validator help text', level: L1, kind: check, cmd: ['node', ['scripts/check-validator-helptext.mjs']] }
85
+ - { id: audit-toolchain, name: 'audit toolchain', level: L1, kind: warn, emitIf: "typeof enableAuditToolchain !== 'undefined' && enableAuditToolchain", cmd: ['node', ['scripts/audit-toolchain.mjs']] }
86
+ - { id: frontend-lane, name: 'frontend lane', level: L1, kind: check, emitIf: "_isSubtreeFE", cmd: ['node', ['scripts/check-frontend-lane.mjs']] }
87
+ - { id: lint-css, name: 'lint:css', level: L1, kind: tool, emitIf: "_isFE && language === 'typescript'", condition: "gateFilePresent('.stylelintrc.json', 'lint:css', null, ['.stylelintrc'])", cmd: ['npx', ['stylelint', '--allow-empty-input', 'src/**/*.css']] }
88
+ - { id: fsd-boundaries, name: 'fsd boundaries', level: L1, kind: check, emitIf: "_isFE && language === 'typescript'", condition: "gateFilePresent('eslint.config.frontend-spa.mjs', 'fsd boundaries')", cmd: ['npx', ['eslint', '--config', 'eslint.config.frontend-spa.mjs', '--no-config-lookup', '<%= _feGlob %>']] }
89
+ - { id: playwright-rules, name: 'playwright rules', level: L1, kind: inline, emitIf: "_isFE && language === 'typescript'" }
90
+ - { id: suppressions-expiry, name: 'suppressions expiry', level: L1, kind: check, emitIf: "enableSuppressions", cmd: ['node', ['scripts/check-suppressions.mjs']] }
91
+ - { id: suppression-rationale, name: 'suppression rationale', level: L1, kind: check, emitIf: "enableSuppressions", cmd: ['node', ['scripts/check-suppression-rationale.mjs']] }
92
+ - { id: suppression-expiry-antidrift, name: 'suppression expiry (anti-drift)', level: L1, kind: check, emitIf: "enableSuppressions", cmd: ['node', ['scripts/check-suppression-expiry.mjs']] }
93
+ - { id: inline-suppressions, name: 'inline suppressions', level: L1, kind: check, cmd: ['node', ['scripts/check-inline-suppressions.mjs']] }
94
+ - { id: claude-md-lint, name: 'claude-md lint', level: L1, kind: check, cmd: ['node', ['scripts/check-claude-md-lint.mjs']] }
95
+ - { id: unwired-guards, name: 'unwired guards', level: L1, kind: check, cmd: ['node', ['scripts/check-unwired-guards.mjs']] }
96
+ - { id: workflow-runners-inline, name: 'workflow runners', level: L1, kind: inline }
97
+ - { id: ci-alignment, name: 'ci alignment', level: L1, kind: inline }
98
+ - { id: ssot-core-set, name: 'ssot core set', level: L1, kind: check, cmd: ['node', ['scripts/check-ssot-core.mjs']] }
99
+ - { id: doc-links, name: 'doc links', level: L1, kind: check, cmd: ['node', ['scripts/check-doc-links.mjs']] }
100
+ - { id: knowledge-map, name: 'knowledge map', level: L1, kind: check, cmd: ['node', ['scripts/check-knowledge-map.mjs']] }
101
+ - { id: canonical-paths, name: 'canonical paths', level: L1, kind: check, cmd: ['node', ['scripts/check-canonical-paths.mjs']] }
102
+ - { id: collab-mode-wired, name: 'collab mode wired (INV-100)', level: L1, kind: check, cmd: ['node', ['scripts/check-collab-mode-wired.mjs']] }
103
+ - { id: hook-routing, name: 'hook routing (#2129)', level: L1, kind: check, cmd: ['node', ['scripts/check-hook-routing.mjs']] }
104
+ - { id: safety-adopt-ratchet, name: 'safety adopt ratchet', level: L1, kind: check, cmd: ['node', ['scripts/check-safety-adopt-ratchet.mjs']] }
105
+ - { id: emission-parity, name: 'emission parity (#2110)', level: L1, kind: check, cmd: ['node', ['scripts/check-emission-parity.mjs']] }
106
+ - { id: constraint-scan, name: 'constraint scan (INV-115)', level: L1, kind: check, cmd: ['node', ['scripts/check-constraint-scan.mjs']] }
107
+ - { id: wiki-lint, name: 'wiki lint (INV-116)', level: L1, kind: check, emitIf: "governanceLevel !== 'L1'", cmd: ['node', ['scripts/check-wiki-lint.mjs']] }
108
+ - { id: doc-index-drift, name: 'documentation index drift', level: L1, kind: check, emitIf: "governanceLevel !== 'L1'", condition: "existsSync('docs/INDEX.md')", cmd: ['node', ['scripts/gen-doc-index.mjs', '--check']] }
109
+ - { id: llms-txt-drift, name: 'llms.txt drift', level: L1, kind: check, emitIf: "governanceLevel !== 'L1'", condition: "existsSync('llms.txt')", cmd: ['node', ['scripts/gen-llms-txt.mjs', '--check']] }
110
+ - { id: anti-proforma, name: 'anti-proforma (INV-118)', level: L1, kind: check, cmd: ['node', ['scripts/check-anti-proforma.mjs']] }
111
+ - { id: test-pyramid, name: 'test pyramid (INV-124)', level: L1, kind: check, cmd: ['node', ['scripts/check-test-pyramid.mjs']] }
112
+ - { id: test-scope-tier, name: 'test scope-tier (INV-124)', level: L1, kind: check, cmd: ['node', ['scripts/check-test-scope-tier.mjs']] }
113
+ - { id: api-e2e, name: 'api e2e (INV-126)', level: L1, kind: check, cmd: ['node', ['scripts/check-api-e2e.mjs']] }
114
+ - { id: domain-api-surface, name: 'domain-api surface (INV-125)', level: L1, kind: check, emitIf: "hasPublicApi", cmd: ['node', ['scripts/check-domain-api-surface.mjs']] }
115
+ - { id: render-smoke-presence, name: 'render smoke presence (INV-127)', level: L1, kind: check, cmd: ['node', ['scripts/check-render-smoke.mjs']] }
116
+ - { id: smoke-journeys, name: 'smoke journeys (INV-137)', level: L1, kind: check, cmd: ['node', ['scripts/check-smoke-journeys.mjs']] }
117
+ - { id: e2e-escalation, name: 'e2e escalation ladder (#2043)', level: L1, kind: check, cmd: ['node', ['scripts/check-e2e-escalation.mjs']] }
118
+ - { id: m16-handoff, name: 'M16 handoff-contract marker (#2103)', level: L1, kind: check, cmd: ['node', ['scripts/check-m16-handoff.mjs']] }
119
+ - { id: stack-conformity, name: 'stack conformity (INV-121)', level: L1, kind: check, emitIf: "language", cmd: ['node', ['scripts/check-stack-conformity.mjs']] }
120
+ - { id: iso9001, name: 'iso9001 QMS (RTM + doc-control + CAPA)', level: L1, kind: check, condition: "gateFilePresent('scripts/check-iso9001.mjs', 'iso9001 QMS (RTM + doc-control + CAPA)')", cmd: ['node', ['scripts/check-iso9001.mjs']] }
121
+ - { id: regulated-overlay, name: 'regulated overlay (SoD + retention + signing + mutation)', level: L1, kind: check, condition: "gateFilePresent('scripts/check-regulated-overlay.mjs', 'regulated overlay (SoD + retention + signing + mutation)')", cmd: ['node', ['scripts/check-regulated-overlay.mjs']] }
122
+ - { id: ci-tiers, name: 'ci tiers (INV-73)', level: L1, kind: check, emitIf: "_hasGitHubWorkflows", cmd: ['node', ['scripts/check-ci-tiers.mjs']] }
123
+ - { id: action-pins, name: 'action pins (INV-76)', level: L1, kind: check, emitIf: "_hasGitHubWorkflows", cmd: ['node', ['scripts/check-action-pins.mjs']] }
124
+ - { id: workflow-perms, name: 'workflow perms (INV-77)', level: L1, kind: check, emitIf: "_hasGitHubWorkflows", cmd: ['node', ['scripts/check-workflow-perms.mjs']] }
125
+ - { id: workflow-runners, name: 'workflow runners', level: L1, kind: check, emitIf: "_hasGitHubWorkflows", cmd: ['node', ['scripts/check-workflow-runners.mjs']] }
126
+ - { id: workflow-docs-sync, name: 'workflow docs sync', level: L1, kind: check, emitIf: "_hasGitHubWorkflows", cmd: ['node', ['scripts/check-workflow-docs-sync.mjs']] }
127
+ - { id: workflow-test-integrity, name: 'workflow test integrity', level: L1, kind: check, emitIf: "_hasGitHubWorkflows", cmd: ['node', ['scripts/check-workflow-test-integrity.mjs']] }
128
+ - { id: secret-presence, name: 'secret presence (fail-loud)', level: L1, kind: check, emitIf: "_hasGitHubWorkflows", cmd: ['node', ['scripts/check-secret-presence.mjs']] }
129
+ - { id: continue-on-error, name: 'continue-on-error (swallowed gate)', level: L1, kind: check, emitIf: "_hasGitHubWorkflows", cmd: ['node', ['scripts/check-continue-on-error.mjs']] }
130
+ - { id: workflow-sha-pinning, name: 'workflow sha pinning', level: L1, kind: check, emitIf: "_hasGitHubWorkflows", cmd: ['node', ['scripts/check-workflow-sha-pinning.mjs']] }
131
+ - { id: workflow-job-naming, name: 'workflow job naming', level: L1, kind: check, emitIf: "_hasGitHubWorkflows", cmd: ['node', ['scripts/check-workflow-job-naming.mjs']] }
132
+ - { id: pr-size-gate, name: 'pr size gate', level: L1, kind: check, emitIf: "_hasGitHubWorkflows", cmd: ['node', ['scripts/check-pr-size-gate.mjs']] }
133
+ - { id: merge-method-ff-only, name: 'merge method ff-only (INV-101)', level: L1, kind: check, emitIf: "_hasGitHubWorkflows && governanceLevel !== 'L1'", cmd: ['node', ['scripts/check-merge-method.mjs']] }
134
+ - { id: muted-test, name: 'muted gate test (anti-fake-green)', level: L1, kind: check, cmd: ['node', ['scripts/check-muted-test.mjs']] }
135
+ - { id: skip-critical-e2e, name: 'skipped critical e2e (anti-fake-green)', level: L1, kind: check, cmd: ['node', ['scripts/check-skip-critical-e2e.mjs']] }
136
+ - { id: stub-redirect-husk, name: 'stub redirect husk (anti-fake-green)', level: L1, kind: check, cmd: ['node', ['scripts/check-no-stub-redirects.mjs']] }
137
+ - { id: grace-window, name: 'grace window (anti-fake-green)', level: L1, kind: check, cmd: ['node', ['scripts/check-grace-window.mjs']] }
138
+ - { id: assertion-delta, name: 'assertion delta (anti-fake-green)', level: L1, kind: check, cmd: ['node', ['scripts/check-assertion-delta.mjs']] }
139
+ - { id: oracle-discrimination, name: 'oracle discrimination (anti-fake-green)', level: L1, kind: check, emitIf: "archetype === 'frontend-spa' || archetype === 'backend-web-db'", cmd: ['node', ['scripts/check-oracle-discrimination.mjs']] }
140
+
141
+ - { id: tabletop-evidence, name: 'tabletop evidence (#2429)', level: L1, kind: check, cmd: ['node', ['scripts/check-tabletop-evidence.mjs']] }
142
+ - { id: sources, name: 'source certification (INV-147)', level: L1, kind: check, cmd: ['node', ['scripts/check-sources.mjs']] }
143
+ - { id: use-cases, name: 'use cases (INV-149)', level: L1, kind: check, cmd: ['node', ['scripts/check-use-cases.mjs']] }
144
+ - { id: milestones, name: 'milestones (INV-146)', level: L1, kind: check, cmd: ['node', ['scripts/check-milestones.mjs']] }
145
+
146
+ # ── L2 ─────────────────────────────────────────────────────────────────────
147
+ - { id: gitleaks, name: gitleaks, level: L2, kind: check, emitIf: "enableSecurityScanning", soft: true, cmd: ['gitleaks', ['detect', '--source', '.', '--config', '.gitleaks.toml', '--gitleaks-ignore-path', 'suppressions/.gitleaksignore', '--exit-code', '1']] }
148
+ - { id: npm-audit, name: audit, level: L2, kind: inline, emitIf: "language === 'typescript' && enableSecurityScanning" }
149
+ - { id: consumer-audit, name: 'consumer audit', level: L2, kind: check, emitIf: "language === 'typescript' && archetype === 'library' && governanceLevel !== 'L1'", cmd: ['node', ['scripts/check-consumer-audit.mjs']] }
150
+ - { id: ts-boundaries, name: boundaries, level: L2, kind: check, emitIf: "language === 'typescript' && architectureStyle === 'hexagonal'", soft: true, cmd: ['node', ['scripts/check-boundaries.mjs']] }
151
+ - { id: contract-tests-ts, name: 'contract tests', level: L2, kind: check, emitIf: "language === 'typescript'", soft: true, cmd: ['<%= packageManager %>', ['run', 'test:contract']] }
152
+ - { id: integration-tests-ts, name: 'integration tests', level: L2, kind: check, emitIf: "language === 'typescript'", soft: true, cmd: ['<%= packageManager %>', ['run', 'test:integration']] }
153
+ - { id: behavioral-tests-ts, name: 'behavioral tests', level: L2, kind: check, emitIf: "language === 'typescript'", soft: true, cmd: ['<%= packageManager %>', ['run', 'test:behavioral']] }
154
+ - { id: db-integration-tests, name: 'db integration tests', level: L2, kind: check, emitIf: "language === 'typescript' && hasDatabase && governanceLevel !== 'L1'", soft: true, cmd: ['<%= packageManager %>', ['run', 'test:integration']] }
155
+ - { id: fe-boundaries, name: 'fe boundaries (INV-102/103/104)', level: L2, kind: check, emitIf: "_isFE && governanceLevel !== 'L1'", condition: "gateFilePresent('scripts/check-fe-boundaries.mjs', 'fe boundaries (INV-102/103/104)')", soft: true, cmd: ['node', ['scripts/check-fe-boundaries.mjs']] }
156
+ - { id: token-discipline, name: 'token discipline (INV-105)', level: L2, kind: check, emitIf: "_isFE && governanceLevel !== 'L1'", condition: "gateFilePresent('scripts/verify-tokens.mjs', 'token discipline (INV-105)')", soft: true, cmd: ['node', ['scripts/verify-tokens.mjs']] }
157
+ - { id: i18n-literals, name: 'i18n literals (INV-106)', level: L2, kind: check, emitIf: "_isFE && governanceLevel !== 'L1'", condition: "gateFilePresent('scripts/i18n-literal-scanner.mjs', 'i18n literals (INV-106)')", soft: true, cmd: ['node', ['scripts/i18n-literal-scanner.mjs']] }
158
+ - { id: i18n-parity, name: 'i18n parity (INV-106)', level: L2, kind: check, emitIf: "_isFE && governanceLevel !== 'L1'", condition: "gateFilePresent('scripts/verify-i18n-parity.mjs', 'i18n parity (INV-106)')", soft: true, cmd: ['node', ['scripts/verify-i18n-parity.mjs']] }
159
+ - { id: fe-coverage-ratchet, name: 'fe coverage ratchet', level: L2, kind: check, emitIf: "_isFE && governanceLevel !== 'L1'", condition: "gateFilePresent('scripts/verify-fe-coverage.mjs', 'fe coverage ratchet') && existsSync('fe-coverage-baseline.json')", soft: true, cmd: ['node', ['scripts/verify-fe-coverage.mjs']] }
160
+ - { id: bundle-size-budget, name: 'bundle size budget', level: L2, kind: check, emitIf: "_isFE && governanceLevel !== 'L1'", condition: "gateFilePresent('scripts/check-bundle-size.mjs', 'bundle size budget') && gateFilePresent('bundle-budget.json', 'bundle size budget')", soft: true, cmd: ['node', ['scripts/check-bundle-size.mjs']] }
161
+ - { id: playwright-e2e, name: 'playwright e2e', level: L2, kind: inline, emitIf: "language === 'typescript' && (archetype === 'frontend-spa' || archetype === 'backend-web-db') && governanceLevel !== 'L1'" }
162
+ - { id: cargo-audit, name: audit, level: L2, kind: check, emitIf: "language === 'rust' && enableSecurityScanning", soft: true, cmd: ['cargo', ['audit']] }
163
+ - { id: rust-boundaries, name: boundaries, level: L2, kind: check, emitIf: "language === 'rust' && architectureStyle === 'hexagonal'", soft: true, cmd: ['node', ['scripts/check-boundaries.mjs']] }
164
+ - { id: rust-integration-tests, name: 'integration tests', level: L2, kind: check, emitIf: "language === 'rust' && hasDatabase && governanceLevel !== 'L1'", soft: true, cmd: ['cargo', ['test', '--tests']] }
165
+ - { id: gradle-integration, name: integration, level: L2, kind: check, emitIf: "language === 'java' && buildTool === 'gradle' && hasDatabase && governanceLevel !== 'L1'", soft: true, cmd: ['./gradlew', ['integrationTest', '-q']] }
166
+ - { id: gradle-arch-tests, name: 'architecture tests', level: L2, kind: check, emitIf: "language === 'java' && buildTool === 'gradle' && architectureStyle !== 'none' && basePackage", soft: true, cmd: ['./gradlew', ['test', '--tests', '*.architecture.*', '-q']] }
167
+ - { id: trivy-gradle, name: 'dep audit (trivy fs)', level: L2, kind: check, emitIf: "language === 'java' && buildTool === 'gradle' && enableSecurityScanning", soft: true, cmd: ['trivy', ['fs', '--scanners', 'vuln', '--severity', 'HIGH,CRITICAL', '--exit-code', '1', '--ignorefile', '.trivyignore', '.']] }
168
+ - { id: maven-integration, name: integration, level: L2, kind: check, emitIf: "language === 'java' && buildTool === 'maven' && hasDatabase && governanceLevel !== 'L1'", soft: true, cmd: ['mvn', ['verify', '-q']] }
169
+ - { id: maven-arch-tests, name: 'architecture tests', level: L2, kind: check, emitIf: "language === 'java' && buildTool === 'maven' && architectureStyle !== 'none' && basePackage", soft: true, cmd: ['mvn', ['test', '-Dtest=*.architecture.*', '-q']] }
170
+ - { id: trivy-maven, name: 'dep audit (trivy fs)', level: L2, kind: check, emitIf: "language === 'java' && buildTool === 'maven' && enableSecurityScanning", soft: true, cmd: ['trivy', ['fs', '--scanners', 'vuln', '--severity', 'HIGH,CRITICAL', '--exit-code', '1', '--ignorefile', '.trivyignore', '.']] }
171
+ - { id: staticcheck, name: staticcheck, level: L2, kind: check, emitIf: "language === 'go'", soft: true, cmd: ['staticcheck', ['./...']] }
172
+ - { id: govulncheck, name: 'dep audit', level: L2, kind: check, emitIf: "language === 'go' && enableSecurityScanning", soft: true, cmd: ['govulncheck', ['./...']] }
173
+ - { id: go-boundaries, name: boundaries, level: L2, kind: check, emitIf: "language === 'go' && architectureStyle === 'hexagonal'", soft: true, cmd: ['node', ['scripts/check-boundaries.mjs']] }
174
+ - { id: go-integration-tests, name: 'integration tests', level: L2, kind: check, emitIf: "language === 'go' && hasDatabase && governanceLevel !== 'L1'", soft: true, cmd: ['go', ['test', '-tags', 'integration', '-run', 'Integration', './...']] }
175
+ - { id: pip-audit, name: audit, level: L2, kind: check, emitIf: "language === 'python' && enableSecurityScanning", soft: true, cmd: ['pip-audit', []] }
176
+ - { id: python-boundaries, name: boundaries, level: L2, kind: check, emitIf: "language === 'python' && architectureStyle === 'hexagonal'", soft: true, cmd: ['node', ['scripts/check-boundaries.mjs']] }
177
+ - { id: python-integration-tests, name: 'integration tests', level: L2, kind: check, emitIf: "language === 'python' && hasDatabase && governanceLevel !== 'L1'", soft: true, cmd: ['pytest', ['tests/integration/']] }
178
+ - { id: pytest-playwright-e2e, name: 'pytest-playwright e2e', level: L2, kind: inline, emitIf: "language === 'python' && (archetype === 'frontend-spa' || archetype === 'backend-web-db')" }
179
+ - { id: kotlin-arch-tests, name: 'architecture tests (beta)', level: L2, kind: check, emitIf: "language === 'kotlin' && buildTool === 'gradle' && architectureStyle !== 'none' && basePackage", soft: true, cmd: ['./gradlew', ['test', '--tests', '*.architecture.*', '-q']] }
180
+ - { id: trivy-kotlin, name: 'dep audit (trivy fs)', level: L2, kind: check, emitIf: "language === 'kotlin' && buildTool === 'gradle' && enableSecurityScanning", soft: true, cmd: ['trivy', ['fs', '--scanners', 'vuln', '--severity', 'HIGH,CRITICAL', '--exit-code', '1', '--ignorefile', '.trivyignore', '.']] }
181
+ - { id: coverage-threshold, name: 'coverage threshold', level: L2, kind: inline, emitIf: "language === 'typescript' && coverageEnabled && enableDebtGates" }
182
+ - { id: dead-code, name: 'dead code', level: L2, kind: check, emitIf: "language === 'typescript' && enableDebtGates", soft: true, cmd: ['npx', ['knip']] }
183
+ - { id: duplication, name: duplication, level: L2, kind: check, emitIf: "language === 'typescript' && enableDebtGates", soft: true, cmd: ['node', ['scripts/check-duplication.mjs']] }
184
+ - { id: circular-deps, name: 'circular deps', level: L2, kind: check, emitIf: "language === 'typescript' && enableDebtGates", soft: true, cmd: ['npx', ['madge', '--circular', '--extensions', 'ts,tsx,js,jsx', 'src']] }
185
+ - { id: arch-boundaries, name: 'arch boundaries', level: L2, kind: check, emitIf: "language === 'typescript' && enableDebtGates", soft: true, cmd: ['<%= packageManager %>', ['run', 'check:arch']] }
186
+ - { id: tarpaulin, name: 'coverage threshold', level: L2, kind: check, emitIf: "language === 'rust' && coverageEnabled && enableDebtGates", soft: true, cmd: ['cargo', ['tarpaulin', '--fail-under', '<%= coverageThreshold %>']] }
187
+ - { id: clippy-pedantic, name: 'clippy pedantic', level: L2, kind: check, emitIf: "language === 'rust' && enableDebtGates", soft: true, cmd: ['cargo', ['clippy', '--', '-W', 'clippy::pedantic', '-D', 'warnings']] }
188
+ - { id: binary-size, name: 'binary size', level: L2, kind: inline, emitIf: "language === 'rust' && (archetype === 'cli' || archetype === 'embedded')" }
189
+ - { id: jacoco, name: coverage, level: L2, kind: check, emitIf: "language === 'java' && buildTool === 'gradle' && coverageEnabled && enableDebtGates", soft: true, cmd: ['./gradlew', ['jacocoTestCoverageVerification', '-q']] }
190
+ - { id: pmd-gradle, name: pmd, level: L2, kind: check, emitIf: "language === 'java' && buildTool === 'gradle' && enableDebtGates", soft: true, cmd: ['./gradlew', ['pmdMain', '-q']] }
191
+ - { id: spotbugs, name: spotbugs, level: L2, kind: check, emitIf: "language === 'java' && buildTool === 'gradle' && enableDebtGates", soft: true, cmd: ['./gradlew', ['spotbugsMain', '-q']] }
192
+ - { id: spotbugs-baseline, name: 'spotbugs baseline (INV-44)', level: L2, kind: check, emitIf: "language === 'java' && (buildTool === 'gradle' || buildTool === 'maven') && enableDebtGates", soft: true, cmd: ['node', ['scripts/verify-spotbugs.mjs']] }
193
+ - { id: jacoco-maven, name: coverage, level: L2, kind: check, emitIf: "language === 'java' && buildTool === 'maven' && coverageEnabled && enableDebtGates", soft: true, cmd: ['mvn', ['verify', '-Pjacoco', '-q']] }
194
+ - { id: pmd-maven, name: pmd, level: L2, kind: check, emitIf: "language === 'java' && buildTool === 'maven' && enableDebtGates", soft: true, cmd: ['mvn', ['pmd:check', '-q']] }
195
+ - { id: spotbugs-maven, name: spotbugs, level: L2, kind: check, emitIf: "language === 'java' && buildTool === 'maven' && enableDebtGates", soft: true, cmd: ['mvn', ['com.github.spotbugs:spotbugs-maven-plugin:check', '-q']] }
196
+ - { id: go-coverage, name: 'coverage profile', level: L2, kind: inline, emitIf: "language === 'go' && coverageEnabled && enableDebtGates" }
197
+ - { id: gocyclo, name: 'complexity + dead code', level: L2, kind: check, emitIf: "language === 'go' && enableDebtGates", soft: true, cmd: ['golangci-lint', ['run', '--enable', 'gocyclo,gocognit,unused']] }
198
+ - { id: pytest-coverage, name: 'coverage threshold', level: L2, kind: check, emitIf: "language === 'python' && coverageEnabled && enableDebtGates", soft: true, cmd: ['pytest', ['--cov', '--cov-fail-under=<%= coverageThreshold %>', '--cov-report=html:coverage/html', '--cov-report=xml:coverage/coverage.xml']] }
199
+ - { id: ruff-complexity, name: complexity, level: L2, kind: check, emitIf: "language === 'python' && enableDebtGates", soft: true, cmd: ['ruff', ['check', '--select', 'C901,PLR0911,PLR0912,PLR0913,PLR0915', '.']] }
200
+ - { id: ruff-unused-imports, name: 'unused imports', level: L2, kind: check, emitIf: "language === 'python' && enableDebtGates", soft: true, cmd: ['ruff', ['check', '--select', 'F401,F811', '.']] }
201
+ - { id: kover, name: 'coverage (kover, beta)', level: L2, kind: check, emitIf: "language === 'kotlin' && buildTool === 'gradle' && coverageEnabled && enableDebtGates", soft: true, cmd: ['./gradlew', ['koverVerify', 'koverXmlReport']] }
202
+ - { id: mutation-stryker, name: 'mutation (stryker)', level: L2, kind: tool, emitIf: "(typeof mutationEnabled !== 'undefined' && mutationEnabled) && (typeof enableMutationTesting === 'undefined' || enableMutationTesting !== false) && language === 'typescript' && enableDebtGates", soft: true, cmd: ['npx', ['stryker', 'run']] }
203
+ - { id: mutation-pitest-gradle, name: 'mutation (pitest)', level: L2, kind: check, emitIf: "(typeof mutationEnabled !== 'undefined' && mutationEnabled) && (typeof enableMutationTesting === 'undefined' || enableMutationTesting !== false) && language === 'java' && buildTool === 'gradle' && enableDebtGates", soft: true, cmd: ['./gradlew', ['pitest', '-q']] }
204
+ - { id: mutation-pitest-maven, name: 'mutation (pitest)', level: L2, kind: check, emitIf: "(typeof mutationEnabled !== 'undefined' && mutationEnabled) && (typeof enableMutationTesting === 'undefined' || enableMutationTesting !== false) && language === 'java' && buildTool === 'maven' && enableDebtGates", soft: true, cmd: ['mvn', ['org.pitest:pitest-maven:mutationCoverage', '-q']] }
205
+ - { id: mutation-baseline, name: 'mutation baseline (#1508)', level: L2, kind: check, emitIf: "(typeof mutationEnabled !== 'undefined' && mutationEnabled) && (typeof enableMutationTesting === 'undefined' || enableMutationTesting !== false) && enableDebtGates", condition: "gateFilePresent('scripts/verify-mutation-baseline.mjs', 'mutation baseline (#1508)')", soft: true, cmd: ['node', ['scripts/verify-mutation-baseline.mjs']] }
206
+ - { id: stride-raci, name: 'STRIDE/RACI traceability', level: L2, kind: check, emitIf: "enableDebtGates", soft: true, cmd: ['node', ['scripts/check-stride-traceability.mjs']] }
207
+ - { id: contract-pact-ts, name: 'contract tests (Pact)', level: L2, kind: check, emitIf: "enableDebtGates && language === 'typescript' && (contractType === 'rest-owned' || contractType === 'rest-public')", condition: "process.env.PACT_BROKER_BASE_URL", else: "console.log('[CHECK] contract tests (Pact) ... SKIP — PACT_BROKER_BASE_URL unset');", soft: true, cmd: ['npx', ['pact-broker', 'can-i-deploy', '--pacticipant', '<%= projectName %>', '--latest']] }
208
+ - { id: contract-graphql-ts, name: 'contract tests (GraphQL schema)', level: L2, kind: check, emitIf: "enableDebtGates && language === 'typescript' && contractType === 'graphql'", soft: true, cmd: ['npx', ['graphql-inspector', 'diff', 'schema.graphql']] }
209
+ - { id: contract-grpc-ts, name: 'contract tests (gRPC)', level: L2, kind: check, emitIf: "enableDebtGates && language === 'typescript' && contractType === 'grpc'", soft: true, cmd: ['npx', ['buf', 'breaking', '--against', '.git#branch=main']] }
210
+ - { id: contract-schema-registry-ts, name: 'contract tests (Schema Registry)', level: L2, kind: check, emitIf: "enableDebtGates && language === 'typescript' && contractType === 'message-queue'", condition: "process.env.SCHEMA_REGISTRY_URL", else: "console.log('[CHECK] contract tests (Schema Registry) ... SKIP — SCHEMA_REGISTRY_URL unset');", soft: true, cmd: ['npx', ['vitest', 'run', '--testPathPattern=schema-registry']] }
211
+ - { id: contract-pact-gradle, name: 'contract tests (Pact)', level: L2, kind: check, emitIf: "enableDebtGates && language === 'java' && buildTool === 'gradle' && (contractType === 'rest-owned' || contractType === 'rest-public')", condition: "process.env.PACT_BROKER_BASE_URL", else: "console.log('[CHECK] contract tests (Pact) ... SKIP — PACT_BROKER_BASE_URL unset');", soft: true, cmd: ['./gradlew', ['pactPublish', 'pactVerify']] }
212
+ - { id: contract-pact-maven, name: 'contract tests (Pact)', level: L2, kind: check, emitIf: "enableDebtGates && language === 'java' && buildTool === 'maven' && (contractType === 'rest-owned' || contractType === 'rest-public')", condition: "process.env.PACT_BROKER_BASE_URL", else: "console.log('[CHECK] contract tests (Pact) ... SKIP — PACT_BROKER_BASE_URL unset');", soft: true, cmd: ['mvn', ['pact:publish', 'pact:verify']] }
213
+ - { id: contract-graphql-java, name: 'contract tests (GraphQL)', level: L2, kind: check, emitIf: "enableDebtGates && language === 'java' && (buildTool === 'gradle' || buildTool === 'maven') && contractType === 'graphql'", soft: true, cmd: ['<%= buildTool === "gradle" ? "./gradlew" : "mvn" %>', ['<%= buildTool === "gradle" ? "test --tests *.graphql.*" : "test -Dtest=*GraphQL*" %>']] }
214
+ - { id: contract-grpc-java, name: 'contract tests (gRPC)', level: L2, kind: check, emitIf: "enableDebtGates && language === 'java' && (buildTool === 'gradle' || buildTool === 'maven') && contractType === 'grpc'", soft: true, cmd: ['<%= buildTool === "gradle" ? "./gradlew" : "mvn" %>', ['<%= buildTool === "gradle" ? "test --tests *.grpc.*" : "test -Dtest=*Grpc*" %>']] }
215
+ - { id: contract-schema-registry-gradle, name: 'contract tests (Schema Registry)', level: L2, kind: check, emitIf: "enableDebtGates && language === 'java' && buildTool === 'gradle' && contractType === 'message-queue'", condition: "process.env.SCHEMA_REGISTRY_URL", else: "console.log('[CHECK] contract tests (Schema Registry) ... SKIP — SCHEMA_REGISTRY_URL unset');", soft: true, cmd: ['./gradlew', ['test', '--tests', '*SchemaRegistry*']] }
216
+ - { id: contract-schema-registry-maven, name: 'contract tests (Schema Registry)', level: L2, kind: check, emitIf: "enableDebtGates && language === 'java' && buildTool === 'maven' && contractType === 'message-queue'", condition: "process.env.SCHEMA_REGISTRY_URL", else: "console.log('[CHECK] contract tests (Schema Registry) ... SKIP — SCHEMA_REGISTRY_URL unset');", soft: true, cmd: ['mvn', ['test', '-Dtest=*SchemaRegistry*']] }
217
+ - { id: contract-pact-rust, name: 'contract tests (Pact)', level: L2, kind: check, emitIf: "enableDebtGates && language === 'rust' && (contractType === 'rest-owned' || contractType === 'rest-public')", condition: "process.env.PACT_BROKER_BASE_URL", else: "console.log('[CHECK] contract tests (Pact) ... SKIP — PACT_BROKER_BASE_URL unset');", soft: true, cmd: ['cargo', ['test', '--test', 'pact_consumer_test']] }
218
+ - { id: contract-openapi-rust, name: 'contract tests (OpenAPI)', level: L2, kind: check, emitIf: "enableDebtGates && language === 'rust' && (contractType === 'rest-owned' || contractType === 'rest-public')", soft: true, cmd: ['cargo', ['test', '--test', 'openapi_diff_test']] }
219
+ - { id: contract-graphql-rust, name: 'contract tests (GraphQL)', level: L2, kind: check, emitIf: "enableDebtGates && language === 'rust' && contractType === 'graphql'", soft: true, cmd: ['cargo', ['test', '--test', 'graphql_schema_test']] }
220
+ - { id: contract-grpc-rust, name: 'contract tests (gRPC)', level: L2, kind: check, emitIf: "enableDebtGates && language === 'rust' && contractType === 'grpc'", soft: true, cmd: ['cargo', ['test', '--test', 'grpc_contract_test']] }
221
+ - { id: contract-schema-registry-rust, name: 'contract tests (schema registry)', level: L2, kind: check, emitIf: "enableDebtGates && language === 'rust' && contractType === 'message-queue'", condition: "process.env.SCHEMA_REGISTRY_URL", else: "console.log('[CHECK] contract tests (Schema Registry) ... SKIP — SCHEMA_REGISTRY_URL unset');", soft: true, cmd: ['cargo', ['test', '--test', 'schema_registry_test']] }
222
+ - { id: contract-go, name: 'contract tests', level: L2, kind: check, emitIf: "enableDebtGates && language === 'go' && contractType !== 'none'", soft: true, cmd: ['go', ['test', '-tags', 'contract', '-run', 'Contract', './...']] }
223
+ - { id: contract-pact-python, name: 'contract tests (Pact)', level: L2, kind: check, emitIf: "enableDebtGates && language === 'python' && contractType !== 'none'", soft: true, cmd: ['pytest', ['tests/contract/']] }
224
+ - { id: bdd-ignore-check, name: 'BDD @ignore check', level: L2, kind: inline, emitIf: "enableDebtGates" }
225
+ - { id: gdpr-controls, name: 'gdpr controls (#1251)', level: L2, kind: check, emitIf: "enableDebtGates", condition: "gateFilePresent('scripts/check-gdpr-controls.mjs', 'gdpr controls (#1251)')", soft: true, cmd: ['node', ['scripts/check-gdpr-controls.mjs']] }
226
+ - { id: bdd-ts, name: bdd, level: L2, kind: check, emitIf: "language === 'typescript' && enableDebtGates", soft: true, cmd: ['npx', ['cucumber-js']] }
227
+ - { id: bdd-python, name: bdd, level: L2, kind: check, emitIf: "language === 'python' && enableDebtGates", soft: true, cmd: ['pytest', ['tests/bdd/']] }
228
+ - { id: bdd-go, name: bdd, level: L2, kind: inline, emitIf: "language === 'go' && enableDebtGates" }
229
+ - { id: bdd-gradle, name: bdd, level: L2, kind: check, emitIf: "language === 'java' && buildTool === 'gradle' && enableDebtGates", soft: true, cmd: ['./gradlew', ['cucumberTest']] }
230
+ - { id: bdd-maven, name: bdd, level: L2, kind: check, emitIf: "language === 'java' && buildTool === 'maven' && enableDebtGates", soft: true, cmd: ['mvn', ['test', '-Dtest=*BDD*']] }
231
+ - { id: bdd-rust, name: bdd, level: L2, kind: inline, emitIf: "language === 'rust' && enableDebtGates" }
232
+ - { id: debt-ratchet, name: 'debt ratchet', level: L2, kind: check, soft: true, emitIf: "enableDebtGates", cmd: ['node', ['scripts/debt-report.mjs', '<%= ratchetFlag %>']] }
233
+ - { id: commit-footer-rationale, name: 'commit-footer rationale (INV-119)', level: L2, kind: check, emitIf: "governanceLevel !== 'L1' && enableDebtGates", soft: true, cmd: ['node', ['scripts/check-commit-footer-rationale.mjs']] }
234
+ - { id: docs-updated, name: 'docs updated with code (#356)', level: L2, kind: warn, emitIf: "governanceLevel !== 'L1' && enableDebtGates", cmd: ['node', ['scripts/check-docs.mjs']] }
235
+ - { id: feature-matrix, name: 'feature matrix (INV-112)', level: L2, kind: check, emitIf: "governanceLevel !== 'L1' && enableDebtGates", cmd: ['node', ['scripts/check-feature-matrix.mjs']] }
236
+ - { id: gap-register, name: 'gap register', level: L2, kind: check, emitIf: "governanceLevel !== 'L1' && enableDebtGates", cmd: ['node', ['scripts/gen-gap.mjs', '--check']] }
237
+ - { id: conformance, name: conformance, level: L2, kind: warn, emitIf: "enableDebtGates", condition: "gateFilePresent('scripts/conformance.mjs', 'conformance')", cmd: ['node', ['scripts/conformance.mjs', '--check']] }
238
+ - { id: gold-audit, name: gold-audit, level: L2, kind: warn, emitIf: "enableDebtGates", condition: "gateFilePresent('scripts/gold-audit.mjs', 'gold-audit')", cmd: ['node', ['scripts/gold-audit.mjs', '--check']] }
239
+ # No emitIf (INV-144): the runner is emitted unconditionally, so a generation-time condition here
240
+ # would ship a script nothing references — a dead emission, which #1331's coherence gate rejects.
241
+ # The runtime gateFilePresent guard plus level L2 + kind warn is what keeps it non-disruptive.
242
+ - { id: arc42-slots, name: 'arc42 slots (INV-144)', level: L2, kind: warn, condition: "gateFilePresent('scripts/check-arc42-slots.mjs', 'arc42 slots (INV-144)')", cmd: ['node', ['scripts/check-arc42-slots.mjs']] }
243
+ - { id: doc-set, name: 'doc-set', level: L2, kind: warn, emitIf: "enableDebtGates", condition: "gateFilePresent('scripts/check-doc-set.mjs', 'doc-set')", cmd: ['node', ['scripts/check-doc-set.mjs', '--check']] }
244
+ - { id: decision-registry, name: 'decision registry', level: L2, kind: check, emitIf: "enableDebtGates", condition: "gateFilePresent('scripts/check-decision-registry.mjs', 'decision registry')", cmd: ['node', ['scripts/check-decision-registry.mjs']] }
245
+ - { id: reuse-registry, name: 'reuse registry', level: L2, kind: check, emitIf: "enableDebtGates && typeof includeExtendedInvariants !== 'undefined' && includeExtendedInvariants", condition: "gateFilePresent('scripts/check-reuse-registry.mjs', 'reuse registry')", cmd: ['node', ['scripts/check-reuse-registry.mjs']] }
246
+ - { id: anti-fake-green, name: anti-fake-green, level: L2, kind: warn, emitIf: "enableDebtGates", condition: "gateFilePresent('scripts/check-anti-fake-green.mjs', 'anti-fake-green')", cmd: ['node', ['scripts/check-anti-fake-green.mjs']] }
247
+ - { id: module-coverage-ratchet, name: 'module coverage ratchet', level: L2, kind: warn, emitIf: "enableDebtGates", condition: "gateFilePresent('scripts/verify-module-coverage.mjs', 'module coverage ratchet')", cmd: ['node', ['scripts/verify-module-coverage.mjs']] }
248
+ - { id: agent-return, name: 'agent-return envelope (E1 #1943)', level: L2, kind: warn, emitIf: "enableDebtGates", condition: "gateFilePresent('scripts/check-agent-return.mjs', 'agent-return envelope (E1 #1943)')", cmd: ['node', ['scripts/check-agent-return.mjs']] }
249
+ # #2435 AC-2: hard at L2. The `refactor` phase promises a code-review dispatch; as a `warn`
250
+ # this could not fail a build, so a ship reached `verification` with no review dispatched.
251
+ # It vacuous-passes when no sidecar binds to this task/branch, so it only refuses an owed review.
252
+ - { id: review-completion, name: 'review completion (#2177)', level: L2, kind: check, emitIf: "enableDebtGates", condition: "gateFilePresent('scripts/check-review-completion.mjs', 'review completion (#2177)')", cmd: ['node', ['scripts/check-review-completion.mjs']] }
253
+ - { id: refutation-majority, name: 'refutation majority (E2 #1943)', level: L2, kind: warn, emitIf: "enableDebtGates", condition: "gateFilePresent('scripts/check-refutation-verdicts.mjs', 'refutation majority (E2 #1943)')", cmd: ['node', ['scripts/check-refutation-verdicts.mjs']] }
254
+ - { id: audit-dry-pass, name: 'audit dry-pass (E3 #1943)', level: L2, kind: warn, emitIf: "enableDebtGates", condition: "gateFilePresent('scripts/check-audit-dry-pass.mjs', 'audit dry-pass (E3 #1943)')", cmd: ['node', ['scripts/check-audit-dry-pass.mjs', '--all']] }
255
+ - { id: handoff-lint, name: 'handoff lint (E6a #1943)', level: L2, kind: warn, emitIf: "enableDebtGates", condition: "gateFilePresent('scripts/check-handoff-doc.mjs', 'handoff lint (E6a #1943)')", cmd: ['node', ['scripts/check-handoff-doc.mjs']] }
256
+ - { id: cross-model-review, name: 'cross-model review (#2358)', level: L2, kind: warn, emitIf: "enableDebtGates", cmd: ['node', ['scripts/check-cross-model-review.mjs']] }
257
+ # #2405 (ADR-110 follow-up, INV-138): the acceptance-criteria anchor gate. Advisory
258
+ # (`warn`) because the anchor is opt-in per project — the script itself is inert unless
259
+ # `features.acceptanceAnchor` is on, and vacuous-passes with no active task.
260
+ - { id: acceptance-anchor, name: 'acceptance anchor (INV-138)', level: L2, kind: warn, condition: "gateFilePresent('scripts/check-acceptance.mjs', 'acceptance anchor (INV-138)')", cmd: ['node', ['scripts/check-acceptance.mjs']] }
261
+ - { id: tdd-evidence, name: 'tdd-evidence (INV-131)', level: L2, kind: check, soft: true, cmd: ['node', ['scripts/check-tdd-evidence.mjs']] }
262
+ - { id: todo-max-age, name: 'todo max-age (INV-133)', level: L2, kind: check, soft: true, cmd: ['node', ['scripts/check-todo-max-age.mjs']] }
263
+ - { id: evidence-gate, name: 'evidence gate (INV-33)', level: L3, kind: inline, emitIf: "isL3Plus" }
264
+ - { id: local-ci-parity, name: 'local-ci-parity (INV-59)', level: L2, kind: check, emitIf: "typeof collaborationMode !== 'undefined' && collaborationMode === 'trunk-solo'", cmd: ['node', ['scripts/check-local-ci-parity.mjs']] }
265
+
266
+ # ── L3 (nightly lane, AC-2041.1 — mirrors 06-nightly-lite.yml) ────────────
267
+ - { id: solo-reactivation, name: 'solo reactivation', level: L3, kind: check, emitIf: "typeof collaborationMode !== 'undefined' && collaborationMode === 'trunk-solo' && isL3Plus", cmd: ['node', ['scripts/check-solo-reactivation.mjs']] }
268
+ - { id: nightly-audit-prod, name: 'nightly audit (prod scope)', level: L3, kind: check, emitIf: "language === 'typescript' && packageManager === 'npm'", soft: true, cmd: ['npm', ['audit', '--omit=dev', '--audit-level=high']] }
269
+ # #2258: go's L3 content — solo-reactivation/evidence-gate both require
270
+ # isL3Plus (governanceLevel >= L3) and nightly-audit-prod is typescript-only,
271
+ # so a go project at any governanceLevel below L3 emitted ZERO L3 gates
272
+ # (the layering contract's "L3 lane declares zero gates" failure). `-race`
273
+ # is the standard non-TS-mutation-testing nightly-lane recipe (full run, not
274
+ # -short — see docs/PRODUCT research on Go/Rust nightly lanes). Requires a
275
+ # cgo-capable C toolchain (gcc/cc) on the runner; a race in the trunk-solo
276
+ # cgo-less path would need a runner-capability guard, not `soft` (soft binds
277
+ # to graceActive, an L1→L2 grace concept, inert at L3).
278
+ - { id: go-race, name: 'race detector (full)', level: L3, kind: check, language: go, cmd: ['go', ['test', '-race', './...']] }
279
+ # #2267: Cross-language L3 content must exist even when a consumer is generated
280
+ # at L2: test-gate-layering verifies the declared lane before its configured
281
+ # governance level advances. These are full, executable lifecycle commands;
282
+ # no benchmark threshold is implied.
283
+ - { id: rust-release-tests, name: 'release tests (all targets/features)', level: L3, kind: check, language: rust, cmd: ['cargo', ['test', '--release', '--all-targets', '--all-features']] }
284
+ - { id: python-doctest-strict, name: 'doctest + strict markers', level: L3, kind: check, language: python, cmd: ['pytest', ['--doctest-modules', '--strict-markers']] }
285
+ - { id: java-lifecycle, name: 'Java lifecycle build', level: L3, kind: check, emitIf: "language === 'java' && (buildTool === 'gradle' || buildTool === 'maven')", cmd: ['<%= buildTool === "gradle" ? "./gradlew" : "mvn" %>', ['<%= buildTool === "gradle" ? "build" : "verify" %>', '-q']] }
286
+ - { id: kotlin-gradle-build, name: 'Gradle lifecycle build', level: L3, kind: check, emitIf: "language === 'kotlin' && buildTool === 'gradle'", cmd: ['./gradlew', ['build', '-q']] }
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env node
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ // CATALOG: Generates docs/INDEX.md from frontmatter across the target documentation corpus.
4
+ // CATALOG: Stays separate from link validation because it writes the canonical inventory artifact.
5
+ // CATALOG: The --check mode makes documentation inventory drift a gate failure.
6
+ import { readFileSync, writeFileSync, existsSync, readdirSync, statSync } from 'node:fs';
7
+ import { join, relative, resolve, sep } from 'node:path';
8
+ import { fileURLToPath } from 'node:url';
9
+ import { execFileSync } from 'node:child_process';
10
+ const SKIP_SEGMENTS = new Set(['report']);
11
+ function gitTrackedDocPaths(root) { try { return new Set(execFileSync('git', ['ls-files', 'docs/'], { cwd: root, encoding: 'utf-8' }).split('\n').filter(Boolean)); } catch { return null; } }
12
+ function parseFrontmatter(content) { if (!content.startsWith('---\n')) return {}; const end = content.indexOf('\n---', 4); if (end === -1) return {}; const fm = {}; for (const line of content.slice(4, end).split('\n')) { const match = line.match(/^([a-z_]+):\s*(.*)$/); if (!match) continue; const raw = match[2].trim(); fm[match[1]] = raw.startsWith('[') ? [...raw.matchAll(/'([^']+)'|"([^"]+)"/g)].map((item) => item[1] ?? item[2]) : raw.replace(/^['"]|['"]$/g, ''); } return fm; }
13
+ function firstH1(content) { return content.match(/^#\s+(.+)$/m)?.[1].trim() ?? ''; }
14
+ function walkMarkdown(dir, indexPath) { const out = []; for (const entry of readdirSync(dir)) { const full = join(dir, entry); if (statSync(full).isDirectory()) { if (!SKIP_SEGMENTS.has(entry)) out.push(...walkMarkdown(full, indexPath)); } else if (entry.endsWith('.md') && full !== indexPath) out.push(full); } return out; }
15
+ function tableRow(record) { return `| [${record.title}](${record.relPath}) | ${record.id || '—'} | ${record.status} | ${record.kind || '—'} |`; }
16
+ export function collectDocs(docsDir, indexPath) { const root = resolve(docsDir, '..'); const tracked = gitTrackedDocPaths(root); return walkMarkdown(docsDir, indexPath).filter((file) => tracked === null || tracked.has(relative(root, file).split(sep).join('/'))).sort().map((file) => { const content = readFileSync(file, 'utf-8'); const fm = parseFrontmatter(content); const relPath = relative(docsDir, file).split(sep).join('/'); const tags = Array.isArray(fm.tags) ? fm.tags : []; return { relPath, title: (fm.title || firstH1(content) || relPath).replace(/\|/g, '\\|'), id: fm.canonical_id || '', status: fm.status || '—', kind: tags.find((tag) => tag.startsWith('kind/')) ?? '', tags }; }); }
17
+ export function buildIndex(records) { const groups = new Map(); for (const record of records) { const key = record.relPath.split('/').length > 1 ? record.relPath.split('/')[0] : ''; if (!groups.has(key)) groups.set(key, []); groups.get(key).push(record); } const header = `# Documentation Index\n\n> Generated by \`scripts/gen-doc-index.mjs\` from doc frontmatter. Do not edit by hand;\n> run \`node scripts/gen-doc-index.mjs\` after adding or relabeling a doc.\n\n${records.length} documents.\n\n`; const table = '| title | canonical_id | status | kind |\n|-------|--------------|--------|------|\n'; const rootDocs = groups.get('') ?? []; const dirs = [...groups.entries()].filter(([key]) => key !== '').sort(([a], [b]) => a.localeCompare(b)); const sections = []; if (rootDocs.length) sections.push(`## docs\n\n${table}${rootDocs.map(tableRow).join('\n')}\n`); for (const [dir, docs] of dirs) sections.push(`## ${dir}\n\n${table}${docs.map(tableRow).join('\n')}\n`); return header + sections.join('\n'); }
18
+ export async function runCli(docsDir, indexPath, check) { try { const generated = buildIndex(collectDocs(docsDir, indexPath)); if (check) { if ((existsSync(indexPath) ? readFileSync(indexPath, 'utf-8') : '') !== generated) { process.stderr.write('docs/INDEX.md is stale. Run `node scripts/gen-doc-index.mjs` and commit the result.\n'); return 1; } process.stdout.write('docs/INDEX.md is up to date.\n'); return 0; } writeFileSync(indexPath, generated); process.stdout.write(`Wrote ${indexPath}\n`); return 0; } catch (err) { process.stderr.write(`gen-doc-index: ${err instanceof Error ? err.message : String(err)}\n`); return 1; } }
19
+ if (process.argv[1] === fileURLToPath(import.meta.url)) { const root = resolve('.'); runCli(join(root, 'docs'), join(root, 'docs', 'INDEX.md'), process.argv.includes('--check')).then((code) => process.exit(code)).catch((err) => { process.stderr.write(`gen-doc-index: ${err instanceof Error ? err.message : String(err)}\n`); process.exit(1); }); }
@@ -0,0 +1,153 @@
1
+ #!/usr/bin/env node
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ // <%= projectName %> — docs/GAP.md gap-register gate (#1887-B)
4
+ // Generated by arbiter (src/templates/scripts/gen-gap.mjs.ejs)
5
+ //
6
+ // Portable, SCOPED-DOWN sibling of arbiter's own scripts/gen-gap.mjs. Arbiter's
7
+ // version cross-references constraint-scan output, CONVERGENCE-*.md reports, and
8
+ // .arbiter/evidence/*/tech-debt.json, then does an exact-byte regeneration diff
9
+ // (through prettier) — none of those extra sources have a stable equivalent in an
10
+ // arbitrary target project, and an exact-byte diff would be sensitive to that
11
+ // project's own prettier config (or absence of one). This version derives ONLY
12
+ // from docs/FEATURE_MATRIX.md and checks COVERAGE instead of exact regeneration:
13
+ // every Partial/Missing feature_id in FEATURE_MATRIX.md must still be mentioned
14
+ // in docs/GAP.md's Feature Gaps table — catching the actual defect class (a gap
15
+ // silently dropped from the register) without the byte-fragility.
16
+ //
17
+ // Modes:
18
+ // --check (default) fail if a Partial/Missing feature_id is missing from GAP.md
19
+ // --write regenerate the Feature Gaps table (sentinel-bounded)
20
+ //
21
+ // Exit codes (INV-53): 0 = PASS, 1 = FAIL (drift), 2 = ERROR (file missing/parse failure)
22
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs'
23
+ import { resolve } from 'node:path'
24
+
25
+ const ROOT = process.cwd()
26
+ const args = process.argv.slice(2)
27
+ const CHECK = !args.includes('--write')
28
+
29
+ const MATRIX_PATH = resolve(ROOT, 'docs', 'FEATURE_MATRIX.md')
30
+ const GAP_PATH = resolve(ROOT, 'docs', 'GAP.md')
31
+
32
+ const MATRIX_START = '<!-- FEATURE_MATRIX_START -->'
33
+ const MATRIX_END = '<!-- FEATURE_MATRIX_END -->'
34
+ const GAP_FEATURES_START = '<!-- GAP_FEATURES_START -->'
35
+ const GAP_FEATURES_END = '<!-- GAP_FEATURES_END -->'
36
+
37
+ /** Parse FEATURE_MATRIX.md's sentinel-bounded table into { featureId, capability, status, issueRef, note }[]. */
38
+ function parseMatrixRows(text) {
39
+ const start = text.indexOf(MATRIX_START)
40
+ const end = text.indexOf(MATRIX_END)
41
+ if (start === -1 || end === -1 || end <= start) return null
42
+
43
+ const block = text.slice(start + MATRIX_START.length, end)
44
+ const rows = []
45
+ for (const line of block.split('\n')) {
46
+ const trimmed = line.trim()
47
+ if (!trimmed.startsWith('|')) continue
48
+ const cells = trimmed
49
+ .split('|')
50
+ .map((c) => c.trim())
51
+ .filter((_, i) => i > 0)
52
+ if (cells.length < 10) continue
53
+ const [featureId, capability, , , status, , , , issueRef, note] = cells
54
+ if (!featureId || featureId === 'feature_id' || /^-+$/.test(featureId)) continue
55
+ if (!status) continue
56
+ rows.push({
57
+ featureId,
58
+ capability: capability ?? '',
59
+ status,
60
+ issueRef: issueRef ?? '',
61
+ note: note ?? '',
62
+ })
63
+ }
64
+ return rows
65
+ }
66
+
67
+ /** feature_id | capability | status | severity | blocks_v1 | issue | notes */
68
+ function buildFeatureGapsTable(gapRows) {
69
+ if (gapRows.length === 0) return '_No feature gaps._'
70
+ const lines = gapRows.map((g) => {
71
+ const severity = g.status === 'Missing' ? 'high' : 'medium'
72
+ const blocksV1 = g.status === 'Missing' ? 'yes' : 'no'
73
+ return `| ${g.featureId} | ${g.capability} | ${g.status} | ${severity} | ${blocksV1} | ${g.issueRef || '—'} | ${g.note || '—'} |`
74
+ })
75
+ return [
76
+ '| feature_id | capability | status | severity | blocks_v1 | issue | notes |',
77
+ '| --- | --- | --- | --- | --- | --- | --- |',
78
+ ...lines,
79
+ ].join('\n')
80
+ }
81
+
82
+ if (!existsSync(MATRIX_PATH)) {
83
+ process.stdout.write(` gen-gap: ERROR — FEATURE_MATRIX.md not found at ${MATRIX_PATH}\n`)
84
+ process.exit(2)
85
+ }
86
+
87
+ let matrixText
88
+ try {
89
+ matrixText = readFileSync(MATRIX_PATH, 'utf-8')
90
+ } catch (err) {
91
+ process.stdout.write(` gen-gap: ERROR — cannot read ${MATRIX_PATH}: ${err.message}\n`)
92
+ process.exit(2)
93
+ }
94
+
95
+ const allRows = parseMatrixRows(matrixText)
96
+ if (allRows === null) {
97
+ process.stdout.write(` gen-gap: ERROR — sentinel markers (${MATRIX_START}) not found\n`)
98
+ process.exit(2)
99
+ }
100
+
101
+ const gapRows = allRows.filter((r) => r.status === 'Partial' || r.status === 'Missing')
102
+
103
+ // ─── WRITE mode: regenerate the Feature Gaps table ────────────────────────────
104
+ if (!CHECK) {
105
+ if (!existsSync(GAP_PATH)) {
106
+ process.stdout.write(` gen-gap: ERROR — GAP.md not found at ${GAP_PATH}\n`)
107
+ process.exit(2)
108
+ }
109
+ const gapText = readFileSync(GAP_PATH, 'utf-8')
110
+ const startIdx = gapText.indexOf(GAP_FEATURES_START)
111
+ const endIdx = gapText.indexOf(GAP_FEATURES_END)
112
+ if (startIdx === -1 || endIdx === -1 || endIdx <= startIdx) {
113
+ process.stdout.write(` gen-gap: ERROR — sentinel markers (${GAP_FEATURES_START}) not found\n`)
114
+ process.exit(2)
115
+ }
116
+ const table = buildFeatureGapsTable(gapRows)
117
+ const replaced =
118
+ gapText.slice(0, startIdx + GAP_FEATURES_START.length) +
119
+ '\n\n' +
120
+ table +
121
+ '\n\n' +
122
+ gapText.slice(endIdx)
123
+ writeFileSync(GAP_PATH, replaced, 'utf-8')
124
+ process.stdout.write(` gen-gap: WROTE — Feature Gaps table updated (${gapRows.length} rows)\n`)
125
+ process.exit(0)
126
+ }
127
+
128
+ // ─── CHECK mode: coverage — every Partial/Missing id must be mentioned in GAP.md ──
129
+ if (!existsSync(GAP_PATH)) {
130
+ process.stdout.write(` gen-gap: ERROR — GAP.md not found at ${GAP_PATH}\n`)
131
+ process.exit(2)
132
+ }
133
+
134
+ let gapText
135
+ try {
136
+ gapText = readFileSync(GAP_PATH, 'utf-8')
137
+ } catch (err) {
138
+ process.stdout.write(` gen-gap: ERROR — cannot read ${GAP_PATH}: ${err.message}\n`)
139
+ process.exit(2)
140
+ }
141
+
142
+ const dropped = gapRows.filter((g) => !gapText.includes(g.featureId))
143
+ if (dropped.length > 0) {
144
+ for (const g of dropped) {
145
+ process.stdout.write(
146
+ ` gen-gap: FAIL — ${g.featureId} (${g.status}) is not mentioned in docs/GAP.md — run 'node scripts/gen-gap.mjs --write'\n`,
147
+ )
148
+ }
149
+ process.exit(1)
150
+ }
151
+
152
+ process.stdout.write(` gen-gap: OK — ${gapRows.length}/${gapRows.length} gaps tracked in docs/GAP.md\n`)
153
+ process.exit(0)
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ // CATALOG: Generates the agent-facing llms.txt index from its hand-maintained target config.
4
+ // CATALOG: Stays separate from the doc index because it validates curated public entry points.
5
+ // CATALOG: The --check mode detects drift without ever rewriting a target during a gate run.
6
+ import { readFileSync, writeFileSync, existsSync } from 'node:fs';
7
+ import { resolve } from 'node:path';
8
+ import { fileURLToPath } from 'node:url';
9
+ function renderEntry(entry) { const extra = (entry.extraLinks ?? []).map(([label, path]) => `, [${label}](${path})`).join(''); return `- [${entry.label}](${entry.path})${extra}: ${entry.description}`; }
10
+ export function buildLlmsTxt(config, { docCount }) { const sections = config.sections.map((section) => `## ${section.heading}\n\n${section.entries.map(renderEntry).join('\n')}`); return (`# ${config.title}\n\n> ${config.summary}\n\n${config.intro}\n\n${sections.join('\n\n')}`).replace(/\{\{docCount\}\}/g, String(docCount)); }
11
+ export function readDocCount(indexPath) { const match = readFileSync(indexPath, 'utf-8').match(/^(\d+) documents\.$/m); if (!match) throw new Error(`could not parse doc count ("N documents.") from ${indexPath}`); return Number(match[1]); }
12
+ function extractProseLinkTargets(text) { const targets = []; const re = /\[[^\]]*\]\(([^)]+)\)/g; let match; while ((match = re.exec(text))) if (!match[1].startsWith('#') && !/^[a-z]+:/i.test(match[1])) targets.push(match[1]); return targets; }
13
+ export function findMissingPaths(config, root) { const missing = []; for (const section of config.sections) for (const entry of section.entries) for (const path of [entry.path, ...(entry.extraLinks ?? []).map(([, extraPath]) => extraPath), ...extractProseLinkTargets(entry.description ?? '')]) if (!existsSync(resolve(root, path.replace(/\/$/, '')))) missing.push(path); return missing; }
14
+ function loadConfig(path) { if (!existsSync(path)) return { error: `config not found: ${path}` }; try { return { config: JSON.parse(readFileSync(path, 'utf-8')) }; } catch (err) { return { error: `invalid JSON in ${path}: ${err instanceof Error ? err.message : String(err)}` }; } }
15
+ function loadDocCount(path) { try { return { docCount: readDocCount(path) }; } catch (err) { return { error: err instanceof Error ? err.message : String(err) }; } }
16
+ function checkDrift(path, generated) { if ((existsSync(path) ? readFileSync(path, 'utf-8') : '') !== generated) { process.stderr.write('llms.txt is stale. Run `node scripts/gen-llms-txt.mjs` and commit the result.\n'); return 1; } process.stdout.write('llms.txt is up to date.\n'); return 0; }
17
+ export async function runCli(configPath, indexPath, outPath, check) { try { const { config, error: configErr } = loadConfig(configPath); if (configErr) { process.stderr.write(`gen-llms-txt: ${configErr}\n`); return 2; } const { docCount, error: countErr } = loadDocCount(indexPath); if (countErr) { process.stderr.write(`gen-llms-txt: ${countErr}\n`); return 2; } const missing = findMissingPaths(config, resolve(configPath, '..')); if (missing.length) { process.stderr.write(`gen-llms-txt: path(s) in ${configPath} do not exist: ${missing.join(', ')}. Update the config.\n`); return 2; } const generated = buildLlmsTxt(config, { docCount }); if (check) return checkDrift(outPath, generated); writeFileSync(outPath, generated); process.stdout.write(`Wrote ${outPath}\n`); return 0; } catch (err) { process.stderr.write(`gen-llms-txt: ${err instanceof Error ? err.message : String(err)}\n`); return 2; } }
18
+ if (process.argv[1] === fileURLToPath(import.meta.url)) { const arg = (flag) => process.argv.find((value) => value.startsWith(flag))?.split('=')[1]; const root = resolve('.'); const configPath = arg('--config=') ? resolve(arg('--config=')) : resolve(root, 'llms-txt.config.json'); const indexPath = arg('--index=') ? resolve(arg('--index=')) : resolve(root, 'docs/INDEX.md'); const outPath = arg('--out=') ? resolve(arg('--out=')) : resolve(root, 'llms.txt'); runCli(configPath, indexPath, outPath, process.argv.includes('--check')).then((code) => process.exit(code)).catch((err) => { process.stderr.write(`gen-llms-txt: ${err instanceof Error ? err.message : String(err)}\n`); process.exit(2); }); }