@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,107 @@
1
+ {
2
+ "$schema": "https://tr.designtokens.org/format/",
3
+ "$description": <%- JSON.stringify(`Design tokens for ${projectName} — W3C DTCG format (semantic layer only). Generated by arbiter #1127.`) %>,
4
+
5
+ "color": {
6
+ "$description": "Semantic color tokens. Components reference these only — never raw palette values (INV-105).",
7
+
8
+ "bg": {
9
+ "primary": { "$value": "#ffffff", "$type": "color" },
10
+ "secondary": { "$value": "#f5f5f5", "$type": "color" },
11
+ "elevated": { "$value": "#fafafa", "$type": "color" },
12
+ "overlay": { "$value": "rgba(0, 0, 0, 0.5)", "$type": "color" },
13
+ "inverse": { "$value": "#1a1a1a", "$type": "color" }
14
+ },
15
+
16
+ "text": {
17
+ "primary": { "$value": "#1a1a1a", "$type": "color" },
18
+ "secondary": { "$value": "#666666", "$type": "color" },
19
+ "disabled": { "$value": "#999999", "$type": "color" },
20
+ "inverse": { "$value": "#ffffff", "$type": "color" },
21
+ "link": { "$value": "#0066cc", "$type": "color" },
22
+ "error": { "$value": "#cc0000", "$type": "color" },
23
+ "success": { "$value": "#007700", "$type": "color" },
24
+ "warning": { "$value": "#cc7700", "$type": "color" }
25
+ },
26
+
27
+ "border": {
28
+ "default": { "$value": "#dddddd", "$type": "color" },
29
+ "strong": { "$value": "#aaaaaa", "$type": "color" },
30
+ "focus": { "$value": "#0066cc", "$type": "color" },
31
+ "error": { "$value": "#cc0000", "$type": "color" }
32
+ },
33
+
34
+ "interactive": {
35
+ "primary": { "$value": "#0066cc", "$type": "color" },
36
+ "primary-hover": { "$value": "#0052a3", "$type": "color" },
37
+ "primary-active": { "$value": "#004080", "$type": "color" },
38
+ "primary-text": { "$value": "#ffffff", "$type": "color" },
39
+ "secondary": { "$value": "#f5f5f5", "$type": "color" },
40
+ "secondary-hover": { "$value": "#e8e8e8", "$type": "color" },
41
+ "secondary-text": { "$value": "#1a1a1a", "$type": "color" },
42
+ "danger": { "$value": "#cc0000", "$type": "color" },
43
+ "danger-hover": { "$value": "#a30000", "$type": "color" },
44
+ "danger-text": { "$value": "#ffffff", "$type": "color" }
45
+ },
46
+
47
+ "surface": {
48
+ "card": { "$value": "#ffffff", "$type": "color" },
49
+ "card-hover": { "$value": "#f9f9f9", "$type": "color" },
50
+ "tooltip": { "$value": "#1a1a1a", "$type": "color" },
51
+ "tooltip-text": { "$value": "#ffffff", "$type": "color" }
52
+ },
53
+
54
+ "status": {
55
+ "error-bg": { "$value": "#fff0f0", "$type": "color" },
56
+ "success-bg": { "$value": "#f0fff0", "$type": "color" },
57
+ "warning-bg": { "$value": "#fffbf0", "$type": "color" },
58
+ "info-bg": { "$value": "#f0f8ff", "$type": "color" }
59
+ }
60
+ },
61
+
62
+ "space": {
63
+ "$description": "Spacing scale tokens.",
64
+ "xs": { "$value": "4px", "$type": "dimension" },
65
+ "sm": { "$value": "8px", "$type": "dimension" },
66
+ "md": { "$value": "16px", "$type": "dimension" },
67
+ "lg": { "$value": "24px", "$type": "dimension" },
68
+ "xl": { "$value": "32px", "$type": "dimension" },
69
+ "2xl": { "$value": "48px", "$type": "dimension" },
70
+ "3xl": { "$value": "64px", "$type": "dimension" }
71
+ },
72
+
73
+ "radius": {
74
+ "$description": "Border radius tokens.",
75
+ "sm": { "$value": "4px", "$type": "dimension" },
76
+ "md": { "$value": "8px", "$type": "dimension" },
77
+ "lg": { "$value": "12px", "$type": "dimension" },
78
+ "full": { "$value": "9999px", "$type": "dimension" }
79
+ },
80
+
81
+ "typography": {
82
+ "$description": "Font size and weight tokens.",
83
+ "size": {
84
+ "xs": { "$value": "12px", "$type": "dimension" },
85
+ "sm": { "$value": "14px", "$type": "dimension" },
86
+ "base": { "$value": "16px", "$type": "dimension" },
87
+ "lg": { "$value": "18px", "$type": "dimension" },
88
+ "xl": { "$value": "20px", "$type": "dimension" },
89
+ "2xl": { "$value": "24px", "$type": "dimension" },
90
+ "3xl": { "$value": "30px", "$type": "dimension" }
91
+ },
92
+ "weight": {
93
+ "normal": { "$value": 400, "$type": "number" },
94
+ "medium": { "$value": 500, "$type": "number" },
95
+ "semibold": { "$value": 600, "$type": "number" },
96
+ "bold": { "$value": 700, "$type": "number" }
97
+ }
98
+ },
99
+
100
+ "shadow": {
101
+ "$description": "Elevation shadow tokens.",
102
+ "sm": { "$value": "0 1px 2px rgba(0,0,0,0.1)", "$type": "shadow" },
103
+ "md": { "$value": "0 4px 6px rgba(0,0,0,0.1)", "$type": "shadow" },
104
+ "lg": { "$value": "0 10px 15px rgba(0,0,0,0.1)", "$type": "shadow" },
105
+ "xl": { "$value": "0 20px 25px rgba(0,0,0,0.15)", "$type": "shadow" }
106
+ }
107
+ }
@@ -0,0 +1,83 @@
1
+ # Visual Regression Testing — Setup Guide
2
+
3
+ <!-- arbiter-managed: frontend-quality (#1127) -->
4
+
5
+ **Framework:** <%= (typeof frontend !== 'undefined' && frontend && frontend.framework) ? frontend.framework : 'the frontend framework' %>
6
+ **Tool:** Vitest Browser Mode + Playwright (`toMatchScreenshot`)
7
+ **Baseline location:** `__tests__/screenshots/`
8
+
9
+ ---
10
+
11
+ ## Quick Start
12
+
13
+ ### 1. Install peer dependencies
14
+
15
+ ```bash
16
+ npm install -D @vitest/browser playwright
17
+ npx playwright install chromium
18
+ ```
19
+
20
+ ### 2. Write a component test
21
+
22
+ Create `src/components/MyComponent.browser.test.ts`:
23
+
24
+ ```typescript
25
+ import { test, expect } from 'vitest'
26
+ import { render } from '@testing-library/dom' // or vue / svelte / react equivalent
27
+
28
+ test('MyComponent — visual snapshot', async () => {
29
+ const { container } = render('<my-component title="Hello" />')
30
+ await expect(container).toMatchScreenshot('my-component-default')
31
+ })
32
+ ```
33
+
34
+ ### 3. Capture baselines (first run)
35
+
36
+ ```bash
37
+ npx vitest --config vitest.browser.config.ts --update-snapshots
38
+ ```
39
+
40
+ Baselines are written to `__tests__/screenshots/`. Commit them.
41
+
42
+ ### 4. Run VRT in CI
43
+
44
+ ```bash
45
+ npx vitest --config vitest.browser.config.ts
46
+ ```
47
+
48
+ Fails if any component's rendered output differs from its baseline by more than the pixelmatch threshold.
49
+
50
+ ---
51
+
52
+ ## Configuration
53
+
54
+ The VRT threshold and baseline directory are set in `vitest.browser.setup.ts`:
55
+
56
+ ```typescript
57
+ // vitest.browser.setup.ts
58
+ import { expect } from 'vitest'
59
+ expect.extend({
60
+ toMatchScreenshot: (el, name) =>
61
+ // pixelmatch threshold: 0.1 = 10% pixel difference tolerance
62
+ screenshotMatcher(el, name, { threshold: 0.1, baselineDir: '__tests__/screenshots' }),
63
+ })
64
+ ```
65
+
66
+ ---
67
+
68
+ ## Governance
69
+
70
+ - VRT is triggered by the `16-frontend-quality.yml` CI workflow on PR.
71
+ - No baseline pre-generated at arbiter init — you must capture baselines after first render.
72
+ - A failing VRT is a **blocking** gate: do not merge visual regressions without intentional baseline update.
73
+ - For layout/visual changes: update baselines and include screenshots in the PR description.
74
+
75
+ ---
76
+
77
+ ## Troubleshooting
78
+
79
+ | Problem | Fix |
80
+ |---|---|
81
+ | Screenshot diffs on CI font rendering | Pin to a specific Playwright version; use `--headless=new` |
82
+ | Flaky layout shifts | Add `await page.waitForLoadState('networkidle')` before snapshot |
83
+ | Baseline stale after design change | Run `--update-snapshots` and commit the new baselines |
@@ -0,0 +1,60 @@
1
+ #!/usr/bin/env bash
2
+ # commit-msg: validates the commit message against Conventional Commits.
3
+ # Two layers:
4
+ # 1. Universal regex (works on every stack, no Node required) — #355
5
+ # 2. Richer commitlint validation when Node + commitlint are available
6
+ #
7
+ # Bypass: messages starting with "Merge " or "Revert " (auto-generated by
8
+ # git for merge commits and `git revert`) skip both layers.
9
+ set -e
10
+
11
+ # Read first line using bash builtin (avoids dependency on `head`).
12
+ IFS= read -r MSG < "$1" || true
13
+
14
+ # Bypass for merge/revert commits (auto-generated by git)
15
+ if [[ "$MSG" =~ ^(Merge|Revert)\ ]]; then
16
+ exit 0
17
+ fi
18
+
19
+ # Layer 1: Conventional Commits regex enforcement.
20
+ # Types match @commitlint/config-conventional (11) plus 'cluster' for
21
+ # arbiter's batch-merge convention. Scope is permissive ([^)]+) so things
22
+ # like (#123), (W3A), (deps-dev), (#262-#270) all pass; Layer 2 enforces
23
+ # stricter scope rules where commitlint is installed.
24
+ if [[ ! "$MSG" =~ ^(build|chore|ci|cluster|docs|feat|fix|perf|refactor|revert|style|test)(\([^\)]+\))?!?:[[:space:]].+ ]]; then
25
+ echo "commit-msg rejected: subject must look like 'type(scope): description'"
26
+ echo " types: build|chore|ci|cluster|docs|feat|fix|perf|refactor|revert|style|test"
27
+ echo " scope: optional, parenthesized free text"
28
+ echo " Got: $MSG"
29
+ exit 1
30
+ fi
31
+
32
+ # Layer 2: richer commitlint validation is optional on every stack. Only run it
33
+ # when this repository supplies both a configuration and a local executable.
34
+ COMMITLINT_CONFIG_FOUND=false
35
+ for COMMITLINT_CONFIG in \
36
+ commitlint.config.js commitlint.config.cjs commitlint.config.mjs commitlint.config.ts \
37
+ .commitlintrc .commitlintrc.json .commitlintrc.yml .commitlintrc.yaml \
38
+ .commitlintrc.js .commitlintrc.cjs .commitlintrc.mjs .commitlintrc.ts; do
39
+ if [ -f "$COMMITLINT_CONFIG" ]; then
40
+ COMMITLINT_CONFIG_FOUND=true
41
+ break
42
+ fi
43
+ done
44
+
45
+ if [ "$COMMITLINT_CONFIG_FOUND" = false ] && [ -f package.json ] && \
46
+ grep -Eq '"commitlint"[[:space:]]*:' package.json; then
47
+ COMMITLINT_CONFIG_FOUND=true
48
+ fi
49
+
50
+ if [ "$COMMITLINT_CONFIG_FOUND" = false ]; then
51
+ echo "commit-msg layer 2 skipped: commitlint config missing"
52
+ exit 0
53
+ fi
54
+
55
+ if [ ! -x node_modules/.bin/commitlint ]; then
56
+ echo "commit-msg layer 2 skipped: commitlint not installed"
57
+ exit 0
58
+ fi
59
+
60
+ node_modules/.bin/commitlint --edit "$1"
@@ -0,0 +1,95 @@
1
+ #!/usr/bin/env bash
2
+ # pre-commit: runs L1 gate before each commit
3
+ set -e
4
+
5
+ # Phase guard: refuse commits during preflight or plan phases. Distinguish an absent document
6
+ # (fresh tree → allow) from a corrupt one (→ fail closed) so corruption can't silently bypass.
7
+ _phase=$(node -e "const f=require('fs'),p='.claude/.task/status.json';if(!f.existsSync(p)){process.stdout.write('unknown')}else{try{process.stdout.write(JSON.parse(f.readFileSync(p,'utf-8')).phase||'unknown')}catch{process.stdout.write('corrupt')}}" 2>/dev/null || echo "unknown")
8
+ case "$_phase" in
9
+ preflight|plan)
10
+ echo "ERROR: cannot commit during phase=$_phase. Run: arbiter task advance --to red" >&2
11
+ exit 1
12
+ ;;
13
+ corrupt)
14
+ echo "ERROR: .claude/.task/status.json is corrupt — fix or delete it before committing." >&2
15
+ exit 1
16
+ ;;
17
+ red)
18
+ # #2051: a genuine RED commit contains a test that FAILS — the L1 gate blocks
19
+ # exactly the commit `arbiter task record-red` must point at. The deadlock is
20
+ # resolved for that one commit shape only: phase=red AND every staged path is a
21
+ # test. Anything else (source staged alongside, or any other phase) still runs the
22
+ # gate, and the GREEN commit that follows runs it over the whole tree.
23
+ # ponytail: path-name heuristic for "is a test" — language-agnostic, and tight enough
24
+ # to reject latest/protest/testing, but a genuine source file named src/.../test.ts
25
+ # would ride along gate-free in this one commit. Upgrade path: ask the project's test
26
+ # config for its test globs. Bounded by the GREEN commit's whole-tree gate.
27
+ _staged_red=$(git diff --cached --name-only)
28
+ if [ -n "$_staged_red" ] && ! printf '%s\n' "$_staged_red" |
29
+ grep -qivE '(^|[^[:alpha:]])(tests?|specs?)([^[:alpha:]]|$)'; then
30
+ echo "[pre-commit] phase=red, staged paths are tests only — L1 gate skipped so the failing RED test can land (#2051)."
31
+ _skip_gate=1
32
+ fi
33
+ ;;
34
+ esac
35
+
36
+ <% if (language === 'typescript') { %>
37
+ if [ ! -d "node_modules" ]; then
38
+ echo "Skipping pre-commit: node_modules not installed. Run npm install."
39
+ exit 0
40
+ fi
41
+ <% } else { %>
42
+ if ! command -v node >/dev/null 2>&1; then
43
+ echo "Skipping pre-commit: node not found. Install Node.js to enable git hooks."
44
+ exit 0
45
+ fi
46
+ <% } %>
47
+
48
+ # Unset git hook env vars so nested git calls in scripts work correctly.
49
+ unset GIT_DIR GIT_INDEX_FILE GIT_WORK_TREE GIT_OBJECT_DIRECTORY GIT_COMMON_DIR
50
+
51
+ # gold-align (#1506 yamllint / #1507 shellcheck): mirror the CI config-lint lane
52
+ # locally so YAML/shell style defects fail before CI, not after a round-trip. Each
53
+ # linter is best-effort-on-absence (skip with a note when the tool isn't installed,
54
+ # matching the node/node_modules guards above) but BLOCKING when present.
55
+ _staged=$(git diff --cached --name-only --diff-filter=ACM)
56
+ if command -v shellcheck >/dev/null 2>&1; then
57
+ _sh=$(echo "$_staged" | grep -E '\.sh$' || true)
58
+ if [ -n "$_sh" ]; then
59
+ echo "$_sh" | xargs shellcheck --severity=warning || exit 1
60
+ fi
61
+ fi
62
+ if command -v yamllint >/dev/null 2>&1; then
63
+ _yml=$(echo "$_staged" | grep -E '\.ya?ml$' | grep -v '^\.github/workflows/' || true)
64
+ if [ -n "$_yml" ]; then
65
+ if [ -f .yamllint.yml ] || [ -f .yamllint.yaml ] || [ -f .yamllint ]; then
66
+ echo "$_yml" | xargs yamllint || exit 1
67
+ else
68
+ echo "$_yml" | xargs yamllint -d relaxed || exit 1
69
+ fi
70
+ fi
71
+ fi
72
+ # #2051: the RED commit is exempt from the gate only — lint and secret scanning above
73
+ # still applied to it.
74
+ if [ "${_skip_gate:-0}" = "1" ]; then
75
+ exit 0
76
+ fi
77
+ <% if (language === 'typescript') { %>
78
+
79
+ # Vite/vitest (v5+) cannot handle '#' in the project root path — it treats '#'
80
+ # as a URL fragment and mangles all module IDs. Worktrees named '#NNN' trigger
81
+ # this. Rsync to a temporary '#'-free path and run the gate from there.
82
+ if [[ "$PWD" == *"#"* ]]; then
83
+ ORIG_DIR="$(pwd)"
84
+ TMP_DIR=$(mktemp -d /tmp/arbiter-hook-XXXXXX)
85
+ trap 'rm -rf "$TMP_DIR"' EXIT
86
+ rsync -a --exclude .git --exclude node_modules --exclude dist . "$TMP_DIR/"
87
+ ln -sfn "$ORIG_DIR/node_modules" "$TMP_DIR/node_modules"
88
+ cd "$TMP_DIR"
89
+ # Reserved: consumed by check-all when worktree-aware gate lands
90
+ ARBITER_HOOK_GIT_CWD="$ORIG_DIR" node scripts/check-all.mjs L1
91
+ exit $?
92
+ fi
93
+ <% } %>
94
+
95
+ node scripts/check-all.mjs L1
@@ -0,0 +1,251 @@
1
+ #!/usr/bin/env bash
2
+ # pre-push: checks clean working tree, evidence freshness, and runs gate (T1+T2) before push
3
+ set -e
4
+
5
+ <% if (language === 'typescript') { %>
6
+ if [ ! -d "node_modules" ]; then
7
+ echo "Skipping pre-push: node_modules not installed. Run npm install."
8
+ exit 0
9
+ fi
10
+ <% } else { %>
11
+ if ! command -v node >/dev/null 2>&1; then
12
+ echo "Skipping pre-push: node not found. Install Node.js to enable git hooks."
13
+ exit 0
14
+ fi
15
+ <% } %>
16
+
17
+ # Assert Node version matches .nvmrc (INV-53)
18
+ if [ -f ".nvmrc" ]; then
19
+ NVMRC_MAJOR=$(cut -d. -f1 .nvmrc)
20
+ RUNTIME_MAJOR=$(node -e "process.stdout.write(process.version.slice(1).split('.')[0])")
21
+ if [ "$RUNTIME_MAJOR" != "$NVMRC_MAJOR" ]; then
22
+ echo "Error: Node major mismatch — runtime v${RUNTIME_MAJOR}.x, .nvmrc requires v${NVMRC_MAJOR}.x. Run: nvm use"
23
+ exit 1
24
+ fi
25
+ fi
26
+
27
+ # Unset git hook env vars so nested git calls in scripts work correctly.
28
+ unset GIT_DIR GIT_INDEX_FILE GIT_WORK_TREE GIT_OBJECT_DIRECTORY GIT_COMMON_DIR
29
+
30
+ if [ -n "$(git status --porcelain | grep -v '^??')" ]; then
31
+ echo "Error: working tree has uncommitted changes. Commit or stash before pushing."
32
+ exit 1
33
+ fi
34
+
35
+ # ─── arbiter pre-push evidence-freshness gate (Port #4) ──────────────────────
36
+ # Reject pushes whose .arbiter/evidence/ is older than the budget. Bypassable
37
+ # via ARBITER_PREPUSH_BYPASS=true (exact match — loudly logged). Soften to
38
+ # warn-only when the diff vs upstream is docs-only or low-risk.
39
+ #
40
+ # Env contract (TODO: parametrise prefix once `projectEnvPrefix` template var
41
+ # lands; for now scaffolded projects inherit the ARBITER_ prefix):
42
+ # ARBITER_PREPUSH_MAX_AGE_MIN integer minutes (default 240 = 4 h)
43
+ # ARBITER_PREPUSH_BYPASS exact string 'true' bypasses; other truthy
44
+ # values warn and the gate still runs
45
+ # ARBITER_PREPUSH_BYPASS_REASON free-form string, recorded in bypass log
46
+ # ARBITER_PREPUSH_SKIP exact string 'true' skips the freshness gate
47
+ # entirely (for nested hook invocations + tests)
48
+ ARBITER_PREPUSH_EVIDENCE_DIR="${ARBITER_PREPUSH_EVIDENCE_DIR:-.arbiter/evidence}"
49
+ ARBITER_PREPUSH_MAX_AGE_MIN="${ARBITER_PREPUSH_MAX_AGE_MIN:-240}"
50
+
51
+ if [ "${ARBITER_PREPUSH_SKIP:-}" = "true" ]; then
52
+ : # explicit skip — no warning; used by nested hook recursion
53
+ elif [ -d "$ARBITER_PREPUSH_EVIDENCE_DIR" ]; then
54
+ # bypass-log.jsonl excluded so a successful bypass doesn't self-reset the freshness window.
55
+ NEWEST_EPOCH=$(find "$ARBITER_PREPUSH_EVIDENCE_DIR" -type f \
56
+ -not -name 'bypass-log.jsonl' \
57
+ -printf '%T@\n' 2>/dev/null \
58
+ | sort -nr | head -n1 | cut -d. -f1)
59
+
60
+ if [ -z "$NEWEST_EPOCH" ]; then
61
+ : # empty evidence tree → treat as missing, skip the gate
62
+ else
63
+ NOW_EPOCH=$(date +%s)
64
+ AGE_MIN=$(( (NOW_EPOCH - NEWEST_EPOCH) / 60 ))
65
+
66
+ if [ "$AGE_MIN" -gt "$ARBITER_PREPUSH_MAX_AGE_MIN" ]; then
67
+ BYPASS_RAW="${ARBITER_PREPUSH_BYPASS:-}"
68
+ BYPASSED=false
69
+ if [ "$BYPASS_RAW" = "true" ]; then
70
+ # Loud bypass — exact 'true' only (mirrors scripts/lib/loud-bypass.mjs).
71
+ BR="$(git branch --show-current 2>/dev/null || echo unknown)"
72
+ TS="$(date -u +%FT%TZ)"
73
+ REASON="${ARBITER_PREPUSH_BYPASS_REASON:-unspecified}"
74
+ echo "arbiter-bypass env=ARBITER_PREPUSH_BYPASS branch=${BR} at=${TS} reason=\"${REASON}\"" >&2
75
+ mkdir -p "$ARBITER_PREPUSH_EVIDENCE_DIR"
76
+ BR="$BR" TS="$TS" REASON="$REASON" AGE_MIN="$AGE_MIN" BUDGET="$ARBITER_PREPUSH_MAX_AGE_MIN" \
77
+ node -e 'const e=process.env;process.stdout.write(JSON.stringify({env:"ARBITER_PREPUSH_BYPASS",branch:e.BR,ts:e.TS,value:"true",bypassed:true,reason:e.REASON,age_min:Number(e.AGE_MIN),budget_min:Number(e.BUDGET)})+"\n")' \
78
+ >> "$ARBITER_PREPUSH_EVIDENCE_DIR/bypass-log.jsonl"
79
+ BYPASSED=true
80
+ elif [ -n "$BYPASS_RAW" ]; then
81
+ echo "Warning: ARBITER_PREPUSH_BYPASS='${BYPASS_RAW}' is ambiguous; only the exact string 'true' bypasses. Proceeding with gate." >&2
82
+ fi
83
+
84
+ if [ "$BYPASSED" = "false" ]; then
85
+ UPSTREAM="$(git rev-parse --abbrev-ref --symbolic-full-name '@{u}' 2>/dev/null || echo '')"
86
+ if [ -z "$UPSTREAM" ]; then
87
+ if git rev-parse --verify --quiet origin/main >/dev/null 2>&1; then
88
+ UPSTREAM="origin/main"
89
+ fi
90
+ fi
91
+
92
+ DOCS_ONLY=false
93
+ BACKEND_CHANGED=true
94
+ HIGH_RISK=true
95
+ if [ -n "$UPSTREAM" ] && [ -x "$(command -v node)" ] && [ -f "scripts/ci-classify-changes.mjs" ]; then
96
+ CLASSIFY_OUT=$(BASE_SHA="$UPSTREAM" HEAD_SHA=HEAD node scripts/ci-classify-changes.mjs 2>/dev/null || echo '')
97
+ if echo "$CLASSIFY_OUT" | grep -q '^ classify: docs_only=true'; then DOCS_ONLY=true; fi
98
+ if echo "$CLASSIFY_OUT" | grep -q '^ classify: backend_changed=false'; then BACKEND_CHANGED=false; fi
99
+ if echo "$CLASSIFY_OUT" | grep -q '^ classify: high_risk=false'; then HIGH_RISK=false; fi
100
+ fi
101
+
102
+ if [ "$DOCS_ONLY" = "true" ] || { [ "$BACKEND_CHANGED" = "false" ] && [ "$HIGH_RISK" = "false" ]; }; then
103
+ echo "Warning: .arbiter/evidence/ is ${AGE_MIN} min old (budget ${ARBITER_PREPUSH_MAX_AGE_MIN}). Low-risk change set → proceeding." >&2
104
+ else
105
+ echo "Error: .arbiter/evidence/ is ${AGE_MIN} min old (budget ${ARBITER_PREPUSH_MAX_AGE_MIN} min). Re-run the gate to refresh evidence, or set ARBITER_PREPUSH_BYPASS=true with ARBITER_PREPUSH_BYPASS_REASON='…' to force-push." >&2
106
+ exit 1
107
+ fi
108
+ fi
109
+ fi
110
+ fi
111
+ fi
112
+ # ─── end evidence-freshness gate ─────────────────────────────────────────────
113
+
114
+ # ─── arbiter pre-push chain-batching gate (#2102) ────────────────────────────
115
+ # Enforced half of the chain-batching advisory (`is_unbatched`): when
116
+ # `.claude/.task/status.json` declares a non-empty `chainIds` (via
117
+ # `arbiter task init --chain <id>` / `arbiter ship --chain <id>`), every id in
118
+ # [taskId, ...chainIds] must have a commit in the push range before the push
119
+ # is allowed. Fails CLOSED only on a genuine missing id — any other condition
120
+ # (no status file, empty/absent chainIds, unreadable JSON, no push-range base)
121
+ # is a silent no-op so this gate can never block an unrelated push.
122
+ # Own push range, unconditional: the secret-scan PUSH_RANGE is computed inside an
123
+ # EJS-conditional block, so this gate must derive its own range independently.
124
+ if CHAIN_IDS="$(node -e '
125
+ try {
126
+ const s = JSON.parse(require("fs").readFileSync(".claude/.task/status.json", "utf8"))
127
+ const c = Array.isArray(s.chainIds) ? s.chainIds : []
128
+ if (c.length === 0) process.exit(0)
129
+ const ids = [s.taskId, ...c].filter(Boolean).map((x) => String(x).replace(/^#/, ""))
130
+ process.stdout.write(ids.join(" "))
131
+ } catch (e) { process.exit(0) }
132
+ ' 2>/dev/null)"; then
133
+ : # status read (the one-liner exits 0 on every fail-open path above)
134
+ else
135
+ # FAIL-OPEN-INTENT: node unavailable — the chain gate is a silent no-op
136
+ CHAIN_IDS=""
137
+ fi
138
+
139
+ if [ -n "$CHAIN_IDS" ]; then
140
+ # #2334 — the BASE range, not the incremental one. This gate asks "does every chained id
141
+ # have a commit on this branch", which is a property of the branch, not of one push. With
142
+ # `@{u}..HEAD` preferred, the first push passes and every later push sees only the new
143
+ # commits — so it demands each id be named AGAIN in that increment, which cannot be
144
+ # satisfied. That made the chain feature unusable on any branch pushed more than once.
145
+ # `@{u}..HEAD` remains the fallback for a branch that has no base ref to compare against.
146
+ CHAIN_PUSH_RANGE=""
147
+ if git rev-parse --verify --quiet origin/main >/dev/null 2>&1; then
148
+ CHAIN_PUSH_RANGE="origin/main..HEAD"
149
+ elif git rev-parse --abbrev-ref --symbolic-full-name '@{u}' >/dev/null 2>&1; then
150
+ CHAIN_PUSH_RANGE="@{u}..HEAD"
151
+ fi
152
+
153
+ # FAIL-OPEN-INTENT: an unresolvable range must not block an unrelated push — the whole
154
+ # scan (including the hard-fail) only runs when the range log actually succeeds.
155
+ if [ -n "$CHAIN_PUSH_RANGE" ] && CHAIN_SUBJECTS="$(git log --format=%s "$CHAIN_PUSH_RANGE" 2>/dev/null)"; then
156
+ CHAIN_MISSING=""
157
+ for id in $CHAIN_IDS; do
158
+ printf '%s\n' "$CHAIN_SUBJECTS" | grep -Eq "#${id}([^0-9]|$)" || CHAIN_MISSING="$CHAIN_MISSING #${id}"
159
+ done
160
+ if [ -n "$CHAIN_MISSING" ]; then
161
+ echo "Error: chain batching (#2102) — no commit in the push range (${CHAIN_PUSH_RANGE}) references:${CHAIN_MISSING}" >&2
162
+ echo "Every id declared via --chain needs a commit naming it, e.g. a commit subject containing \"#1234\"." >&2
163
+ exit 1
164
+ fi
165
+ fi
166
+ fi
167
+ # ─── end chain-batching gate ─────────────────────────────────────────────────
168
+ <% if (enableSecurityScanning) { %>
169
+ # ─── pre-push secret scan (gitleaks, push-range scoped, #1319.9) ──────────────
170
+ # Scope gitleaks to the commits actually being pushed (origin/<base>..HEAD or the
171
+ # tracked upstream @{u}..HEAD) via --log-opts, NOT a full-tree `detect --source .`
172
+ # scan. pre-commit already vetted staged content full-tree; the push gate only
173
+ # needs to vet the new history. Skips with a warning when gitleaks is absent.
174
+ if command -v gitleaks >/dev/null 2>&1; then
175
+ PUSH_RANGE=""
176
+ if git rev-parse --abbrev-ref --symbolic-full-name '@{u}' >/dev/null 2>&1; then
177
+ PUSH_RANGE="@{u}..HEAD"
178
+ elif git rev-parse --verify --quiet origin/main >/dev/null 2>&1; then
179
+ PUSH_RANGE="origin/main..HEAD"
180
+ fi
181
+ if [ -n "$PUSH_RANGE" ]; then
182
+ gitleaks detect --log-opts "$PUSH_RANGE" \
183
+ --config .gitleaks.toml \
184
+ --gitleaks-ignore-path suppressions/.gitleaksignore \
185
+ --no-banner --exit-code 1 \
186
+ || { echo "gitleaks: secrets detected in push range ${PUSH_RANGE} — push blocked"; exit 1; }
187
+ else
188
+ echo "gitleaks: no upstream/origin base to diff against — skipping push-range scan (pre-commit covers staged content)"
189
+ fi
190
+ else
191
+ echo "WARNING: gitleaks not installed — skipping push-range secret scan (CI enforces it)"
192
+ fi
193
+ <% } %>
194
+
195
+ # ─── reuse fresh green gate evidence (skip redundant rerun) ───────────────────
196
+ # The heavy gate below is otherwise UNCONDITIONAL. If check-all.mjs already
197
+ # stamped a GREEN L2 marker (.arbiter/gate-pass.json) that still BINDS this exact
198
+ # tree, reuse it and skip the rerun. The decision lives in the shared verifier
199
+ # (scripts/lib/gate-evidence.mjs), so this hook demands the same axes as every
200
+ # other consumer: schema, level, TTL, commit, branch, checkout root, toolchain
201
+ # fingerprint and working-tree content hash.
202
+ # Fail-closed: a missing verifier / missing / malformed / non-binding stamp, or
203
+ # any error at all → fall through and run the full gate exactly as before.
204
+ #
205
+ # TRUST BOUNDARY: local convenience, NOT a security control. The stamp is a plain
206
+ # JSON file a local process could forge; it only gates whether a developer's own
207
+ # machine reruns its own gate. CI re-runs the full gate independently and stays
208
+ # authoritative regardless.
209
+ if [ -f ".arbiter/gate-pass.json" ] && [ -f "scripts/lib/gate-evidence.mjs" ]; then
210
+ if REUSE_MSG=$(node scripts/lib/gate-evidence.mjs verify \
211
+ --min-level L2 --max-age-min "$ARBITER_PREPUSH_MAX_AGE_MIN" 2>/dev/null); then
212
+ echo "PRE-PUSH: reusing green $REUSE_MSG, skipping rerun"
213
+ exit 0
214
+ fi
215
+ fi
216
+ # ─── end green-evidence reuse ────────────────────────────────────────────────
217
+
218
+ # ─── one gate per repo, foreground (#2427) ───────────────────────────────────
219
+ # Both branches below launch the heavy gate through scripts/lib/gate-mutex.mjs,
220
+ # which takes the SAME per-repo flock `arbiter gate-exec` takes. Two pushes (or a
221
+ # push and an agent's gate) in one repo therefore serialise instead of trampling
222
+ # each other's temp files and starving each other's test workers.
223
+ #
224
+ # The wrapper runs the gate in THIS process group — no setsid, no `&`, no detach
225
+ # — so a Ctrl-C on the push reaches the gate, and a pid-targeted signal is
226
+ # forwarded down the descendant tree. The gate additionally watches the pid that
227
+ # launched it and aborts between checks if it is gone, which covers the one
228
+ # signal nothing can forward: SIGKILL. That is the orphan that finished long
229
+ # after its push died and stamped a green marker for a tree it never tested.
230
+ ORIG_DIR="$(pwd -P)"
231
+ <% if (language === 'typescript') { %>
232
+
233
+ # Vite/vitest (v5+) cannot handle '#' in the project root path.
234
+ # Use pwd -P (physical path) to detect symlink-based worktrees where $PWD
235
+ # may not contain '#' even though the real path does.
236
+ # Rsync to a '#'-free temp dir and run the gate from there.
237
+ if [[ "$ORIG_DIR" == *"#"* ]]; then
238
+ TMP_DIR=$(mktemp -d /tmp/arbiter-hook-XXXXXX)
239
+ trap 'rm -rf "$TMP_DIR"' EXIT
240
+ rsync -a --exclude .git --exclude node_modules --exclude dist . "$TMP_DIR/"
241
+ ln -sfn "$ORIG_DIR/node_modules" "$TMP_DIR/node_modules"
242
+ cd "$TMP_DIR"
243
+ # --dir "$ORIG_DIR": the mutex key derives from the REAL repo's git-common-dir.
244
+ # Keying it off this rsync'd /tmp copy would mint a fresh key per push — a null
245
+ # mutex that serialises nothing.
246
+ ARBITER_HOOK_GIT_CWD="$ORIG_DIR" node scripts/lib/gate-mutex.mjs run --dir "$ORIG_DIR" -- node scripts/check-all.mjs gate --json "$ORIG_DIR/.arbiter/gate/local-result.json"
247
+ exit $?
248
+ fi
249
+ <% } %>
250
+
251
+ node scripts/lib/gate-mutex.mjs run --dir "$ORIG_DIR" -- node scripts/check-all.mjs gate --json .arbiter/gate/local-result.json
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ # setup-hooks.sh: configure git to use .githooks/ directory
3
+ # Run once after cloning: bash scripts/setup-hooks.sh
4
+ set -e
5
+
6
+ git config core.hooksPath .githooks
7
+ chmod +x .githooks/*
8
+ echo "Git hooks installed from .githooks/ directory."
@@ -0,0 +1,37 @@
1
+ ## Summary
2
+
3
+ <!-- What does this PR do? Why? (1-3 bullets) -->
4
+
5
+ ## Changes
6
+
7
+ <!-- Bullet list of what changed -->
8
+
9
+ ## Gate Checklist
10
+
11
+ - [ ] `node scripts/check-all.mjs L1` passes
12
+ - [ ] `node scripts/check-all.mjs L2` passes
13
+ - [ ] No orphan TODOs (all TODO have task IDs)
14
+ - [ ] No invariant violations (see AGENTS.md)
15
+ - [ ] Tests added/updated for changed code
16
+ - [ ] Commit messages follow convention: `type(scope): summary`
17
+
18
+ ## Pipeline Artifacts
19
+
20
+ <!-- Optional: link relevant artifacts from CI pipeline -->
21
+
22
+ | Artifact | Link |
23
+ | ------------ | ---- |
24
+ | Spec / Plan | |
25
+ | Review score | |
26
+ | Log | |
27
+
28
+ ## Test Plan
29
+
30
+ <!-- How was this tested? What scenarios were covered? -->
31
+
32
+ ## Security Checklist
33
+
34
+ <!-- L2/L3 projects: verify SECURE_CODING_CHECKLIST.md before merging -->
35
+
36
+ - [ ] Reviewed `docs/SECURE_CODING_CHECKLIST.md` (if present in this project)
37
+ - [ ] No deprecated endpoints added without `Sunset` header (RFC 8594) — N/A if no public API changes