@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.
- package/CHANGELOG.md +713 -0
- package/LICENSE +202 -0
- package/NOTICE +31 -0
- package/PRIVACY.md +111 -0
- package/README.md +237 -0
- package/THIRD_PARTY_LICENSES.md +472 -0
- package/dist/.src-manifest.json +1 -0
- package/dist/capabilities/host-probe.js +3 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +87 -0
- package/dist/commands/adopt-policy.js +3 -0
- package/dist/commands/configure-interactive.js +3 -0
- package/dist/commands/configure.js +5 -0
- package/dist/commands/cross-model-review.js +3 -0
- package/dist/commands/diff.js +20 -0
- package/dist/commands/doc-set.js +3 -0
- package/dist/commands/doctor/clean.js +2 -0
- package/dist/commands/doctor/fail-open-census.js +12 -0
- package/dist/commands/doctor/health.js +11 -0
- package/dist/commands/doctor/prove-gates.js +13 -0
- package/dist/commands/doctor/recover-lock.js +12 -0
- package/dist/commands/doctor/repair-state.js +6 -0
- package/dist/commands/doctor/tool-pin-extract.js +4 -0
- package/dist/commands/doctor/tool-pins.js +9 -0
- package/dist/commands/doctor-interactive.js +2 -0
- package/dist/commands/doctor.js +2 -0
- package/dist/commands/explain.js +19 -0
- package/dist/commands/gate-exec.js +4 -0
- package/dist/commands/gold-audit.js +14 -0
- package/dist/commands/graph.js +5 -0
- package/dist/commands/init/build-arbiter-config.js +1 -0
- package/dist/commands/init/generate.js +42 -0
- package/dist/commands/init/github-setup.js +5 -0
- package/dist/commands/init/maturity-gates.js +10 -0
- package/dist/commands/init/resolve-config.js +3 -0
- package/dist/commands/init/toolchain.js +10 -0
- package/dist/commands/init/types.js +1 -0
- package/dist/commands/init.js +17 -0
- package/dist/commands/method-interactive.js +4 -0
- package/dist/commands/method.js +11 -0
- package/dist/commands/obsidian.js +2 -0
- package/dist/commands/plugin.js +8 -0
- package/dist/commands/pr-merged.js +2 -0
- package/dist/commands/retire-policy.js +3 -0
- package/dist/commands/review-diff.js +3 -0
- package/dist/commands/settings.js +7 -0
- package/dist/commands/ship-config.js +2 -0
- package/dist/commands/ship-profile.js +2 -0
- package/dist/commands/ship-review.js +1 -0
- package/dist/commands/ship-tier.js +2 -0
- package/dist/commands/ship-train.js +2 -0
- package/dist/commands/task-mark.js +2 -0
- package/dist/commands/task-note.js +3 -0
- package/dist/commands/task-record-red.js +2 -0
- package/dist/commands/task-record-tech-debt.js +4 -0
- package/dist/commands/task-ship.js +3 -0
- package/dist/commands/task-state.js +6 -0
- package/dist/commands/task.js +59 -0
- package/dist/commands/update.js +60 -0
- package/dist/commands/upgrade-level-interactive.js +2 -0
- package/dist/commands/upgrade-level.js +7 -0
- package/dist/commands/verify-plan.js +8 -0
- package/dist/commands/verify-tdd.js +2 -0
- package/dist/commands/verify.js +7 -0
- package/dist/commands/wizard/coherence.js +1 -0
- package/dist/commands/worktree-prune.js +4 -0
- package/dist/commands/worktree.js +39 -0
- package/dist/compatibility/cross-language-matrix.json +540 -0
- package/dist/compatibility/index.d.ts +4 -0
- package/dist/compatibility/index.js +2 -0
- package/dist/compatibility/matcher.js +1 -0
- package/dist/compatibility/matrix.json +27 -0
- package/dist/compatibility/parsers.d.ts +38 -0
- package/dist/compatibility/parsers.js +1 -0
- package/dist/compatibility/probe.d.ts +41 -0
- package/dist/compatibility/probe.js +4 -0
- package/dist/compatibility/report.js +2 -0
- package/dist/compatibility/schema.d.ts +80 -0
- package/dist/compatibility/schema.js +1 -0
- package/dist/compatibility/skills-matrix.json +98 -0
- package/dist/compatibility/skills-validator.d.ts +30 -0
- package/dist/compatibility/skills-validator.js +4 -0
- package/dist/compatibility/tooling-proposals.json +5 -0
- package/dist/config/arbiter-ignore.js +3 -0
- package/dist/config/collaboration-mode-defaults.js +1 -0
- package/dist/config/diff.js +1 -0
- package/dist/config/env-overrides.js +3 -0
- package/dist/config/env-registry.js +2 -0
- package/dist/config/levels.js +1 -0
- package/dist/config/migrations/index.js +2 -0
- package/dist/config/migrations/v0-to-v1.js +2 -0
- package/dist/config/migrations/v1-to-v2.js +2 -0
- package/dist/config/migrations/v2-to-v3.js +2 -0
- package/dist/config/migrations/v3-to-v4.js +2 -0
- package/dist/config/override-resolver.js +2 -0
- package/dist/config/resolve-project-config.js +2 -0
- package/dist/config/resolve-project-name.js +2 -0
- package/dist/config/schema.d.ts +480 -0
- package/dist/config/schema.js +1 -0
- package/dist/config/test-pyramid-profiles.js +1 -0
- package/dist/config/thresholds.js +2 -0
- package/dist/conformance/dimensions.js +3 -0
- package/dist/conformance/engine.js +7 -0
- package/dist/conformance/gate-proofs.js +4 -0
- package/dist/conformance/shared.js +2 -0
- package/dist/detectors/axis.js +1 -0
- package/dist/detectors/build.js +2 -0
- package/dist/detectors/existing.js +2 -0
- package/dist/detectors/external-model.js +2 -0
- package/dist/detectors/framework.js +2 -0
- package/dist/detectors/git.js +11 -0
- package/dist/detectors/github.js +2 -0
- package/dist/detectors/lanes.js +5 -0
- package/dist/detectors/language-hooks.js +117 -0
- package/dist/detectors/language.js +2 -0
- package/dist/detectors/package-manager.js +2 -0
- package/dist/detectors/package.js +2 -0
- package/dist/detectors/scaffold-wiring.js +2 -0
- package/dist/detectors/workflow-collision.js +4 -0
- package/dist/evidence/gate-binding.js +4 -0
- package/dist/evidence/git-checks.js +3 -0
- package/dist/evidence/load.js +2 -0
- package/dist/evidence/provenance.js +2 -0
- package/dist/evidence/summary.js +2 -0
- package/dist/evidence/tdd-reexecute.js +2 -0
- package/dist/evidence/tdd.js +4 -0
- package/dist/experimental/index.js +2 -0
- package/dist/experimental/parse-argv.js +2 -0
- package/dist/experimental/registry.js +2 -0
- package/dist/generators/agents-claude.js +2 -0
- package/dist/generators/agents-md.js +2 -0
- package/dist/generators/anti-drift-validators.js +3 -0
- package/dist/generators/anti-proforma.js +2 -0
- package/dist/generators/api-e2e.js +2 -0
- package/dist/generators/api-middleware.js +2 -0
- package/dist/generators/archunit.js +2 -0
- package/dist/generators/audit-toolchain.js +2 -0
- package/dist/generators/auth.js +2 -0
- package/dist/generators/behavioral-tests.js +2 -0
- package/dist/generators/boundaries.js +2 -0
- package/dist/generators/check-all.js +2 -0
- package/dist/generators/check-stack-conformity.js +2 -0
- package/dist/generators/ci-five-lane.js +2 -0
- package/dist/generators/ci-tier.js +2 -0
- package/dist/generators/claude.js +3 -0
- package/dist/generators/codex-hooks.js +2 -0
- package/dist/generators/codex-known-limitations.js +2 -0
- package/dist/generators/codex.js +15 -0
- package/dist/generators/commit-footer.js +2 -0
- package/dist/generators/compliance-menu.js +2 -0
- package/dist/generators/compliance.js +2 -0
- package/dist/generators/conformance.js +2 -0
- package/dist/generators/contract-testing.js +2 -0
- package/dist/generators/coverage.js +2 -0
- package/dist/generators/debt-gates.js +24 -0
- package/dist/generators/debt-ratchet.js +2 -0
- package/dist/generators/derived-class.js +2 -0
- package/dist/generators/doc-set.js +4 -0
- package/dist/generators/docs.js +2 -0
- package/dist/generators/duplication.js +2 -0
- package/dist/generators/e2e-constitution.js +2 -0
- package/dist/generators/env-template.js +2 -0
- package/dist/generators/evidence-retention.js +2 -0
- package/dist/generators/feature-matrix.js +2 -0
- package/dist/generators/frontend-governance.js +2 -0
- package/dist/generators/frontend-quality.js +2 -0
- package/dist/generators/gap.js +2 -0
- package/dist/generators/gdpr.js +2 -0
- package/dist/generators/githooks.js +2 -0
- package/dist/generators/github-setup.js +2 -0
- package/dist/generators/github.js +2 -0
- package/dist/generators/gitignore.js +2 -0
- package/dist/generators/global-invariants.js +3 -0
- package/dist/generators/go-boundaries.js +2 -0
- package/dist/generators/gold-kit.js +2 -0
- package/dist/generators/infra.js +2 -0
- package/dist/generators/integration-testing.js +7 -0
- package/dist/generators/iso27001.js +2 -0
- package/dist/generators/iso9001.js +2 -0
- package/dist/generators/labels.js +2 -0
- package/dist/generators/local-wrapper.js +2 -0
- package/dist/generators/modulith.js +2 -0
- package/dist/generators/mutation.js +2 -0
- package/dist/generators/observability.js +2 -0
- package/dist/generators/operations.js +2 -0
- package/dist/generators/perf-k6.js +2 -0
- package/dist/generators/pharma.js +2 -0
- package/dist/generators/playwright-python.js +2 -0
- package/dist/generators/playwright-ts.js +2 -0
- package/dist/generators/pr-tooling.js +2 -0
- package/dist/generators/python-boundaries.js +2 -0
- package/dist/generators/quality.js +2 -0
- package/dist/generators/registry.js +2 -0
- package/dist/generators/regulated.js +2 -0
- package/dist/generators/resilience.js +2 -0
- package/dist/generators/risk-register.js +2 -0
- package/dist/generators/root.js +2 -0
- package/dist/generators/rust-boundaries.js +2 -0
- package/dist/generators/safety-class.js +2 -0
- package/dist/generators/security.js +2 -0
- package/dist/generators/seed.js +2 -0
- package/dist/generators/self-validation.js +2 -0
- package/dist/generators/ship-driver.js +2 -0
- package/dist/generators/skill-names.json +17 -0
- package/dist/generators/skills.js +2 -0
- package/dist/generators/smoke-journeys.js +2 -0
- package/dist/generators/solo-exception.js +2 -0
- package/dist/generators/ssot.js +2 -0
- package/dist/generators/stride-enforcement.js +2 -0
- package/dist/generators/suppressions.js +2 -0
- package/dist/generators/test-pyramid-manifest.js +3 -0
- package/dist/generators/test-taxonomy.js +2 -0
- package/dist/generators/wiki.js +2 -0
- package/dist/github/branch-protection.js +2 -0
- package/dist/github/classify-gh-error.js +2 -0
- package/dist/github/labels.js +2 -0
- package/dist/github/project-board.js +2 -0
- package/dist/graph/builders/adr.js +4 -0
- package/dist/graph/builders/ast.js +3 -0
- package/dist/graph/builders/canon.js +2 -0
- package/dist/graph/builders/evidence.js +2 -0
- package/dist/graph/builders/inv.js +1 -0
- package/dist/graph/builders/req.js +3 -0
- package/dist/graph/builders/test-nodes.js +3 -0
- package/dist/graph/builders/utils.js +2 -0
- package/dist/graph/load.js +2 -0
- package/dist/graph/model.js +2 -0
- package/dist/graph/query.js +3 -0
- package/dist/graph/store.js +1 -0
- package/dist/i18n/en.json +293 -0
- package/dist/i18n/index.js +4 -0
- package/dist/i18n/types.js +2 -0
- package/dist/integrations/companions.js +2 -0
- package/dist/integrations/external-review.js +10 -0
- package/dist/integrations/plugin-schema.js +2 -0
- package/dist/integrations/skill-detector.js +7 -0
- package/dist/integrations/skills-matrix.js +2 -0
- package/dist/integrations/types.d.ts +23 -0
- package/dist/integrations/types.js +2 -0
- package/dist/internal/cli-deprecation-registry.js +2 -0
- package/dist/internal/deprecate.js +3 -0
- package/dist/internal/experimental-warn.js +3 -0
- package/dist/invariants/catalog.d.ts +2 -0
- package/dist/invariants/catalog.js +1 -0
- package/dist/invariants/filter.d.ts +28 -0
- package/dist/invariants/filter.js +1 -0
- package/dist/invariants/index.d.ts +4 -0
- package/dist/invariants/index.js +2 -0
- package/dist/invariants/tiers.js +1 -0
- package/dist/invariants/types.d.ts +1 -0
- package/dist/invariants/types.js +1 -0
- package/dist/kit/applicability.js +3 -0
- package/dist/kit/audit-report.js +3 -0
- package/dist/kit/brownfield-detect.js +4 -0
- package/dist/kit/canonical-mapping.json +1 -0
- package/dist/kit/catalog.js +2 -0
- package/dist/kit/catalog.json +1 -0
- package/dist/kit/derived.json +1 -0
- package/dist/kit/emit-issues.js +8 -0
- package/dist/kit/measure.js +5 -0
- package/dist/kit/redaction.js +3 -0
- package/dist/kit/schema.js +2 -0
- package/dist/kit/taxonomy.js +2 -0
- package/dist/kit/thresholds.d.ts +12 -0
- package/dist/kit/thresholds.js +2 -0
- package/dist/kit/wave-engine.js +1 -0
- package/dist/recipes/loader.js +6 -0
- package/dist/recipes/schema.js +2 -0
- package/dist/risk/classifier.js +2 -0
- package/dist/risk/sha-check.js +2 -0
- package/dist/state/backups.js +2 -0
- package/dist/state/envelope.js +2 -0
- package/dist/state/generated-manifest.js +3 -0
- package/dist/state/manifest-key.js +2 -0
- package/dist/state/migrations/index.js +1 -0
- package/dist/state/migrations/v0-to-v1.js +2 -0
- package/dist/state/retired-renders.js +2 -0
- package/dist/templates/.nvmrc.ejs +1 -0
- package/dist/templates/HANDOFF.template.md +45 -0
- package/dist/templates/__tests__/contract/error-shape.contract.test.ts.ejs +47 -0
- package/dist/templates/agents-md/AGENTS.md.ejs +517 -0
- package/dist/templates/api-e2e/README.md.ejs +33 -0
- package/dist/templates/api-e2e/go-httptest.go.ejs +43 -0
- package/dist/templates/api-e2e/java-restassured.java.ejs +28 -0
- package/dist/templates/api-e2e/kotlin-restassured.kt.ejs +30 -0
- package/dist/templates/api-e2e/manifest.json.ejs +8 -0
- package/dist/templates/api-e2e/postman.collection.json.ejs +30 -0
- package/dist/templates/api-e2e/python-httpx.py.ejs +17 -0
- package/dist/templates/api-e2e/run.sh.ejs +61 -0
- package/dist/templates/api-e2e/ts-supertest.test.ts.ejs +18 -0
- package/dist/templates/archunit/AntiCyclicTest.java.ejs +29 -0
- package/dist/templates/archunit/AntiProformaExempt.java.ejs +35 -0
- package/dist/templates/archunit/AntiProformaTest.java.ejs +104 -0
- package/dist/templates/archunit/ArchitectureTest.java.ejs +87 -0
- package/dist/templates/archunit/DependencyFlowTest.java.ejs +55 -0
- package/dist/templates/archunit/DomainPurityTest.java.ejs +47 -0
- package/dist/templates/archunit/NamingConventionsTest.java.ejs +54 -0
- package/dist/templates/archunit/NoH2ArchTest.java.ejs +30 -0
- package/dist/templates/archunit/NoMockMvcTest.java.ejs +71 -0
- package/dist/templates/archunit/PortsIndependenceTest.java.ejs +55 -0
- package/dist/templates/archunit/RestAssuredArchTest.java.ejs +32 -0
- package/dist/templates/archunit/RestAssuredBaseIT.java.ejs +66 -0
- package/dist/templates/archunit/TestCoverageArchTest.java.ejs +29 -0
- package/dist/templates/archunit/arch-test-deps-maven.md.ejs +42 -0
- package/dist/templates/archunit/arch-test-deps.gradle.ejs +14 -0
- package/dist/templates/audit/gdpr/check-gdpr-controls.mjs.ejs +102 -0
- package/dist/templates/audit/gdpr/controls-to-gates.md.ejs +42 -0
- package/dist/templates/audit/gdpr/data-flow-map.md.ejs +30 -0
- package/dist/templates/audit/gdpr/dpia.md.ejs +45 -0
- package/dist/templates/audit/generic/audit-gate-rules.md.ejs +24 -0
- package/dist/templates/audit/generic/audit-trail-policy.md.ejs +38 -0
- package/dist/templates/audit/iso27001/iso27001-controls-gate-map.md.ejs +60 -0
- package/dist/templates/auth/setup.md.ejs +661 -0
- package/dist/templates/behavioral-tests/ExampleBehavioralTest.java.ejs +67 -0
- package/dist/templates/behavioral-tests/TESTING_POLICY.md.ejs +116 -0
- package/dist/templates/behavioral-tests/bdd/ExampleBddIT.java.ejs +19 -0
- package/dist/templates/behavioral-tests/bdd/ExampleSteps.java.ejs +61 -0
- package/dist/templates/behavioral-tests/bdd/example.feature.ejs +14 -0
- package/dist/templates/behavioral-tests/bdd/example.steps.ts.ejs +37 -0
- package/dist/templates/behavioral-tests/bdd/example_bdd_test.rs.ejs +64 -0
- package/dist/templates/behavioral-tests/bdd/example_test.go.ejs +80 -0
- package/dist/templates/behavioral-tests/bdd/test_example_bdd.py.ejs +47 -0
- package/dist/templates/behavioral-tests/eslint-playwright.json.ejs +10 -0
- package/dist/templates/behavioral-tests/eslint.config.playwright.mjs.ejs +29 -0
- package/dist/templates/behavioral-tests/example.behavioral.test.ts.ejs +47 -0
- package/dist/templates/behavioral-tests/example_behavioral_test.go.ejs +51 -0
- package/dist/templates/behavioral-tests/example_behavioral_test.rs.ejs +47 -0
- package/dist/templates/behavioral-tests/test_example_behavioral.py.ejs +40 -0
- package/dist/templates/boundaries/.eslintrc-boundaries.cjs.ejs +81 -0
- package/dist/templates/boundaries/.eslintrc-frontend-spa.cjs.ejs +79 -0
- package/dist/templates/boundaries/.importlinter.ejs +48 -0
- package/dist/templates/boundaries/check-boundaries-go.mjs.ejs +94 -0
- package/dist/templates/boundaries/check-boundaries-python.mjs.ejs +118 -0
- package/dist/templates/boundaries/check-boundaries-rust.mjs.ejs +111 -0
- package/dist/templates/boundaries/check-boundaries.mjs.ejs +34 -0
- package/dist/templates/boundaries/clippy.toml.ejs +50 -0
- package/dist/templates/boundaries/deny.toml.ejs +56 -0
- package/dist/templates/boundaries/eslint.config.boundaries.mjs.ejs +112 -0
- package/dist/templates/boundaries/eslint.config.frontend-spa.mjs.ejs +93 -0
- package/dist/templates/boundaries/golangci-boundaries.yml.ejs +70 -0
- package/dist/templates/boundaries/ruff-boundaries.toml.ejs +32 -0
- package/dist/templates/claude/CLAUDE.md.ejs +78 -0
- package/dist/templates/claude/agents/agent-write-classes.json +30 -0
- package/dist/templates/claude/agents/bridge-reviewer.md.ejs +68 -0
- package/dist/templates/claude/agents/codebase-scanner.md.ejs +69 -0
- package/dist/templates/claude/agents/context-checker.md.ejs +73 -0
- package/dist/templates/claude/agents/red-team.md.ejs +134 -0
- package/dist/templates/claude/commands/close-gold-gap.md.ejs +43 -0
- package/dist/templates/claude/commands/drain.md.ejs +81 -0
- package/dist/templates/claude/commands/gold-audit.md.ejs +43 -0
- package/dist/templates/claude/commands/impact.md.ejs +39 -0
- package/dist/templates/claude/commands/levelup.md.ejs +61 -0
- package/dist/templates/claude/commands/ship.md.ejs +902 -0
- package/dist/templates/claude/commands/tabletop.md.ejs +46 -0
- package/dist/templates/claude/commands/task.md.ejs +87 -0
- package/dist/templates/claude/commands/wt-close.md.ejs +58 -0
- package/dist/templates/claude/commands/wt-list.md.ejs +48 -0
- package/dist/templates/claude/commands/wt-open.md.ejs +61 -0
- package/dist/templates/claude/commands/wt-prune.md.ejs +38 -0
- package/dist/templates/claude/hooks/check-circular-deps.mjs.ejs +56 -0
- package/dist/templates/claude/hooks/check-no-orphan-todo.mjs.ejs +45 -0
- package/dist/templates/claude/hooks/check-no-pii.mjs.ejs +121 -0
- package/dist/templates/claude/hooks/check-no-placeholders.mjs.ejs +71 -0
- package/dist/templates/claude/hooks/check-no-skipped-tests.mjs +80 -0
- package/dist/templates/claude/hooks/check-no-unused-exports.mjs +62 -0
- package/dist/templates/claude/hooks/closer-mode-guard.mjs.ejs +102 -0
- package/dist/templates/claude/hooks/debug-state-on-failure.mjs.ejs +98 -0
- package/dist/templates/claude/hooks/enforce-gate-before-pr.mjs +142 -0
- package/dist/templates/claude/hooks/enforce-read-only.mjs +28 -0
- package/dist/templates/claude/hooks/exitplanmode-banner.mjs.ejs +43 -0
- package/dist/templates/claude/hooks/guard-done-evidence.mjs.ejs +85 -0
- package/dist/templates/claude/hooks/guard-task-completion.mjs.ejs +56 -0
- package/dist/templates/claude/hooks/hooks.mjs.ejs +127 -0
- package/dist/templates/claude/hooks/lib.mjs.ejs +523 -0
- package/dist/templates/claude/hooks/post-brainstorm-stop.mjs +48 -0
- package/dist/templates/claude/hooks/post-commit-check.mjs.ejs +65 -0
- package/dist/templates/claude/hooks/post-commit-checklists/go/backend.ejs +4 -0
- package/dist/templates/claude/hooks/post-commit-checklists/go/docs.ejs +4 -0
- package/dist/templates/claude/hooks/post-commit-checklists/go/frontend.ejs +4 -0
- package/dist/templates/claude/hooks/post-commit-checklists/java/backend.ejs +4 -0
- package/dist/templates/claude/hooks/post-commit-checklists/java/docs.ejs +4 -0
- package/dist/templates/claude/hooks/post-commit-checklists/java/frontend.ejs +4 -0
- package/dist/templates/claude/hooks/post-commit-checklists/python/backend.ejs +4 -0
- package/dist/templates/claude/hooks/post-commit-checklists/python/docs.ejs +4 -0
- package/dist/templates/claude/hooks/post-commit-checklists/python/frontend.ejs +4 -0
- package/dist/templates/claude/hooks/post-commit-checklists/rust/backend.ejs +5 -0
- package/dist/templates/claude/hooks/post-commit-checklists/rust/docs.ejs +4 -0
- package/dist/templates/claude/hooks/post-commit-checklists/rust/frontend.ejs +4 -0
- package/dist/templates/claude/hooks/post-commit-checklists/ts/backend.ejs +4 -0
- package/dist/templates/claude/hooks/post-commit-checklists/ts/docs.ejs +4 -0
- package/dist/templates/claude/hooks/post-commit-checklists/ts/frontend.ejs +5 -0
- package/dist/templates/claude/hooks/post-edit-dispatch.mjs.ejs +73 -0
- package/dist/templates/claude/hooks/post-subagent-release.mjs +80 -0
- package/dist/templates/claude/hooks/pre-compact.mjs.ejs +79 -0
- package/dist/templates/claude/hooks/pre-edit-plan-anchor.mjs.ejs +225 -0
- package/dist/templates/claude/hooks/pre-edit-ssot-guard.mjs +204 -0
- package/dist/templates/claude/hooks/pre-spawn-worktree-guard.mjs +129 -0
- package/dist/templates/claude/hooks/skill-forced-eval.mjs.ejs +281 -0
- package/dist/templates/claude/hooks/stop-dangerous.mjs +86 -0
- package/dist/templates/claude/hooks/stop-evidence-guard.mjs.ejs +245 -0
- package/dist/templates/claude/hooks/stop-finding-loss.mjs.ejs +168 -0
- package/dist/templates/claude/hooks/wiki-on-commit.mjs.ejs +38 -0
- package/dist/templates/claude/knowledge-map.json.ejs +26 -0
- package/dist/templates/claude/rules/05-agent-lifecycle.md +7 -0
- package/dist/templates/claude/rules/25-todo-folder-policy.md +5 -0
- package/dist/templates/claude/rules/40-context-economy.md +32 -0
- package/dist/templates/claude/rules/45-mcp-fallback.md +25 -0
- package/dist/templates/claude/rules/50-batch-execution.md +75 -0
- package/dist/templates/claude/rules/55-brainstorm-terminal-state.md +44 -0
- package/dist/templates/claude/rules/60-incidental-capture.md +43 -0
- package/dist/templates/claude/rules/75-impact-vault-reading.md +43 -0
- package/dist/templates/claude/rules/90-exec-protocol.md.ejs +40 -0
- package/dist/templates/claude/rules/95-closer-mode.md +45 -0
- package/dist/templates/claude/settings.json.ejs +165 -0
- package/dist/templates/claude/skills/architect-review/SKILL.md.ejs +82 -0
- package/dist/templates/claude/skills/brainstorming/SKILL.md.ejs +86 -0
- package/dist/templates/claude/skills/clean-code/SKILL.md.ejs +39 -0
- package/dist/templates/claude/skills/close-gold-gap/SKILL.md.ejs +58 -0
- package/dist/templates/claude/skills/codebase-audit/SKILL.md.ejs +88 -0
- package/dist/templates/claude/skills/configure/SKILL.md.ejs +72 -0
- package/dist/templates/claude/skills/epic-decompose/SKILL.md.ejs +86 -0
- package/dist/templates/claude/skills/gold-audit/SKILL.md.ejs +91 -0
- package/dist/templates/claude/skills/impact/SKILL.md.ejs +104 -0
- package/dist/templates/claude/skills/levelup/SKILL.md.ejs +146 -0
- package/dist/templates/claude/skills/tabletop/SKILL.md.ejs +118 -0
- package/dist/templates/claude/skills/tdd/SKILL.md.ejs +157 -0
- package/dist/templates/claude/skills/understand-code/SKILL.md.ejs +93 -0
- package/dist/templates/claude/skills/verification/SKILL.md.ejs +68 -0
- package/dist/templates/claude/skills/wave-drain/SKILL.md.ejs +491 -0
- package/dist/templates/codex/CODEX.md.ejs +140 -0
- package/dist/templates/codex/codex-adapter.mjs +132 -0
- package/dist/templates/codex/config.toml.ejs +189 -0
- package/dist/templates/compliance/compliance-mapping.md.ejs +124 -0
- package/dist/templates/compliance/compliance-menu.md.ejs +89 -0
- package/dist/templates/contract-testing/CONTRACTS_POLICY.md.ejs +30 -0
- package/dist/templates/contract-testing/api-snapshots/config-keys-baseline.json.ejs +1 -0
- package/dist/templates/contract-testing/api-snapshots/config-response-baseline.json.ejs +1 -0
- package/dist/templates/contract-testing/api-snapshots/enum-values-baseline.json.ejs +1 -0
- package/dist/templates/contract-testing/api-snapshots/error-shape-baseline.json.ejs +6 -0
- package/dist/templates/contract-testing/api-snapshots/openapi-baseline.json.ejs +12 -0
- package/dist/templates/contract-testing/api-snapshots/openapi-content-types-baseline.json.ejs +3 -0
- package/dist/templates/contract-testing/api-snapshots/openapi-paths-baseline.json.ejs +1 -0
- package/dist/templates/contract-testing/api-snapshots/openapi-required-fields-baseline.json.ejs +1 -0
- package/dist/templates/contract-testing/api-snapshots/openapi-response-status-baseline.json.ejs +3 -0
- package/dist/templates/contract-testing/api-snapshots/test-snapshot.json.ejs +4 -0
- package/dist/templates/contract-testing/env/.env.pact.ejs +4 -0
- package/dist/templates/contract-testing/graphql/GraphqlSchemaTest.java.ejs +29 -0
- package/dist/templates/contract-testing/graphql/graphql-inspector.test.ts.ejs +20 -0
- package/dist/templates/contract-testing/graphql/graphql_schema_test.go.ejs +27 -0
- package/dist/templates/contract-testing/graphql/graphql_schema_test.rs.ejs +27 -0
- package/dist/templates/contract-testing/graphql/test_graphql_schema.py.ejs +21 -0
- package/dist/templates/contract-testing/grpc/GrpcContractTest.java.ejs +23 -0
- package/dist/templates/contract-testing/grpc/buf-breaking.yml.ejs +6 -0
- package/dist/templates/contract-testing/grpc/buf.yaml.ejs +11 -0
- package/dist/templates/contract-testing/grpc/grpc-contract.test.ts.ejs +16 -0
- package/dist/templates/contract-testing/grpc/grpc_contract_test.go.ejs +22 -0
- package/dist/templates/contract-testing/grpc/grpc_contract_test.rs.ejs +22 -0
- package/dist/templates/contract-testing/grpc/test_grpc_contract.py.ejs +18 -0
- package/dist/templates/contract-testing/message-queue/SchemaRegistryCheckIT.java.ejs +44 -0
- package/dist/templates/contract-testing/message-queue/schema-registry-check.ts.ejs +42 -0
- package/dist/templates/contract-testing/message-queue/schema_registry_test.go.ejs +71 -0
- package/dist/templates/contract-testing/message-queue/schema_registry_test.rs.ejs +61 -0
- package/dist/templates/contract-testing/message-queue/test_schema_registry.py.ejs +31 -0
- package/dist/templates/contract-testing/pact-samples/assignment-response.json.ejs +7 -0
- package/dist/templates/contract-testing/pact-samples/availability-response.json.ejs +13 -0
- package/dist/templates/contract-testing/pact-samples/availability-rule-response.json.ejs +8 -0
- package/dist/templates/contract-testing/pact-samples/capacity-response.json.ejs +11 -0
- package/dist/templates/contract-testing/pact-samples/fully-booked-response.json.ejs +6 -0
- package/dist/templates/contract-testing/pact-samples/schedule-override-response.json.ejs +7 -0
- package/dist/templates/contract-testing/rest-owned/PactVerificationIT.java.ejs +31 -0
- package/dist/templates/contract-testing/rest-owned/pact-consumer.test.ts.ejs +36 -0
- package/dist/templates/contract-testing/rest-owned/pact-deps.gradle.ejs +15 -0
- package/dist/templates/contract-testing/rest-owned/pact_consumer_test.go.ejs +48 -0
- package/dist/templates/contract-testing/rest-owned/pact_consumer_test.rs.ejs +23 -0
- package/dist/templates/contract-testing/rest-owned/test_pact_consumer.py.ejs +35 -0
- package/dist/templates/contract-testing/rest-public/OpenApiDiffIT.java.ejs +44 -0
- package/dist/templates/contract-testing/rest-public/export-openapi-java.gradle.ejs +13 -0
- package/dist/templates/contract-testing/rest-public/export-openapi.mjs.ejs +21 -0
- package/dist/templates/contract-testing/rest-public/export_openapi.go.ejs +30 -0
- package/dist/templates/contract-testing/rest-public/export_openapi.py.ejs +27 -0
- package/dist/templates/contract-testing/rest-public/export_openapi.rs.ejs +32 -0
- package/dist/templates/contract-testing/rest-public/openapi-diff.ts.ejs +42 -0
- package/dist/templates/contract-testing/rest-public/openapi_diff_test.go.ejs +35 -0
- package/dist/templates/contract-testing/rest-public/openapi_diff_test.rs.ejs +36 -0
- package/dist/templates/contract-testing/rest-public/test_openapi_diff.py.ejs +32 -0
- package/dist/templates/coverage/.coveragerc.ejs +26 -0
- package/dist/templates/coverage/.tarpaulin.toml.ejs +30 -0
- package/dist/templates/coverage/Cargo.toml.profile.release.ejs +24 -0
- package/dist/templates/coverage/jacoco-maven-setup.md.ejs +72 -0
- package/dist/templates/coverage/jacoco.gradle.ejs +49 -0
- package/dist/templates/coverage/kover.gradle.ejs +35 -0
- package/dist/templates/coverage/vitest.browser.config.ts.ejs +47 -0
- package/dist/templates/coverage/vitest.config.ts.ejs +47 -0
- package/dist/templates/docs/CODING_STANDARDS.md.ejs +81 -0
- package/dist/templates/docs/FEATURE_MATRIX.md.ejs +84 -0
- package/dist/templates/docs/GAP.md.ejs +58 -0
- package/dist/templates/docs/ISO27001_ANNEX_A.md.ejs +144 -0
- package/dist/templates/docs/MASTER_TEST_PLAN.md.ejs +52 -0
- package/dist/templates/docs/POST_MERGE_REVIEW_TEMPLATE.md.ejs +63 -0
- package/dist/templates/docs/SECURE_CODING_CHECKLIST.md.ejs +61 -0
- package/dist/templates/docs/adr/ADR-000_template.md.ejs +28 -0
- package/dist/templates/docs/bugs/bug-analysis.md.ejs +47 -0
- package/dist/templates/docs/bugs/bug-report.md.ejs +51 -0
- package/dist/templates/docs/bugs/bug-verification.md.ejs +42 -0
- package/dist/templates/docs/runbooks/deployment.md.ejs +119 -0
- package/dist/templates/docs/runbooks/prod-checklist.md.ejs +90 -0
- package/dist/templates/docs/runbooks/rollback.md.ejs +124 -0
- package/dist/templates/docs/runbooks/troubleshooting.md.ejs +130 -0
- package/dist/templates/docs/skeletons/arc42-canvas.md.ejs +46 -0
- package/dist/templates/docs/skeletons/arc42-full.md.ejs +59 -0
- package/dist/templates/docs/skeletons/decision-registry.md.ejs +38 -0
- package/dist/templates/docs/skeletons/er-model.md.ejs +19 -0
- package/dist/templates/docs/skeletons/glossary.md.ejs +8 -0
- package/dist/templates/docs/skeletons/governance.md.ejs +13 -0
- package/dist/templates/docs/skeletons/slo.md.ejs +21 -0
- package/dist/templates/docs/skeletons/technical-debt.md.ejs +8 -0
- package/dist/templates/docs/skeletons/test-strategy.md.ejs +14 -0
- package/dist/templates/docs/skeletons/threat-model-4q.md.ejs +20 -0
- package/dist/templates/docs/skeletons/threat-model-stride.md.ejs +22 -0
- package/dist/templates/docs/specs/atomic-task-list.md.ejs +57 -0
- package/dist/templates/docs/steering/product.md.ejs +44 -0
- package/dist/templates/docs/steering/structure.md.ejs +49 -0
- package/dist/templates/docs/steering/tech.md.ejs +53 -0
- package/dist/templates/documentation/cli-catalog.md.ejs +21 -0
- package/dist/templates/e2e/E2E_CONSTITUTION.md.ejs +77 -0
- package/dist/templates/e2e/playwright-python/conftest.py.ejs +22 -0
- package/dist/templates/e2e/playwright-python/run_axe.py.ejs +99 -0
- package/dist/templates/e2e/playwright-python/test_a11y.py.ejs +38 -0
- package/dist/templates/e2e/playwright-python/test_smoke.py.ejs +28 -0
- package/dist/templates/e2e/playwright-ts/a11y.spec.ts.ejs +20 -0
- package/dist/templates/e2e/playwright-ts/render-smoke.spec.ts.ejs +90 -0
- package/dist/templates/e2e/playwright-ts/run-axe.ts.ejs +74 -0
- package/dist/templates/e2e/smoke-journeys/journeys.spec.ts.ejs +53 -0
- package/dist/templates/evidence-files.json.ejs +13 -0
- package/dist/templates/frontend/FE_DESIGN_PRINCIPLES.md.ejs +115 -0
- package/dist/templates/frontend/FRONTEND_CONSTITUTION.md.ejs +170 -0
- package/dist/templates/frontend/design-tokens.json.ejs +107 -0
- package/dist/templates/frontend/vrt-setup.md.ejs +83 -0
- package/dist/templates/githooks/commit-msg.ejs +60 -0
- package/dist/templates/githooks/pre-commit.ejs +95 -0
- package/dist/templates/githooks/pre-push.ejs +251 -0
- package/dist/templates/githooks/setup-hooks.sh.ejs +8 -0
- package/dist/templates/github/PULL_REQUEST_TEMPLATE.md +37 -0
- package/dist/templates/github/PULL_REQUEST_TEMPLATE.md.ejs +52 -0
- package/dist/templates/github/actions/build-cache/action.yml.ejs +84 -0
- package/dist/templates/github/actions/nas-ssh/action.yml.ejs +53 -0
- package/dist/templates/github/actions/setup-java-maven/action.yml.ejs +53 -0
- package/dist/templates/github/actions/setup-node-pnpm/action.yml.ejs +39 -0
- package/dist/templates/github/actions/sign-and-attest/action.yml.ejs +53 -0
- package/dist/templates/github/dependabot.yml.ejs +66 -0
- package/dist/templates/github/extended-ci-paths.txt.ejs +38 -0
- package/dist/templates/github/issue-templates/bug-report.yml +72 -0
- package/dist/templates/github/issue-templates/compliance-item.yml.ejs +75 -0
- package/dist/templates/github/issue-templates/config.yml +2 -0
- package/dist/templates/github/issue-templates/epic.yml +66 -0
- package/dist/templates/github/issue-templates/feature-request.yml +24 -0
- package/dist/templates/github/issue-templates/task-brief.yml.ejs +125 -0
- package/dist/templates/github/labels.yml.ejs +161 -0
- package/dist/templates/github/scripts/sticky-failure-issue.sh.ejs +61 -0
- package/dist/templates/github/workflows/01-pr-fast.yml.ejs +1089 -0
- package/dist/templates/github/workflows/02-pr-extended.yml.ejs +512 -0
- package/dist/templates/github/workflows/03-human-approval.yml.ejs +76 -0
- package/dist/templates/github/workflows/04-deploy-test.yml.ejs +425 -0
- package/dist/templates/github/workflows/05-release.yml.ejs +813 -0
- package/dist/templates/github/workflows/06-nightly-lite.yml.ejs +125 -0
- package/dist/templates/github/workflows/06-nightly.yml.ejs +25 -0
- package/dist/templates/github/workflows/07-weekly-lite.yml.ejs +221 -0
- package/dist/templates/github/workflows/07-weekly.yml.ejs +23 -0
- package/dist/templates/github/workflows/08-monthly.yml.ejs +23 -0
- package/dist/templates/github/workflows/09-heartbeat.yml.ejs +268 -0
- package/dist/templates/github/workflows/10-deploy-prod.yml.ejs +144 -0
- package/dist/templates/github/workflows/11-k6-on-demand.yml.ejs +43 -0
- package/dist/templates/github/workflows/12-mutation-scheduled.yml.ejs +100 -0
- package/dist/templates/github/workflows/13-archunit-extended.yml.ejs +33 -0
- package/dist/templates/github/workflows/14-license-scan.yml.ejs +45 -0
- package/dist/templates/github/workflows/15-codeql.yml.ejs +117 -0
- package/dist/templates/github/workflows/16-frontend-quality.yml.ejs +154 -0
- package/dist/templates/github/workflows/17-ossf-scorecard.yml.ejs +46 -0
- package/dist/templates/github/workflows/18-frontend-lane.yml.ejs +50 -0
- package/dist/templates/github/workflows/_ai-draft-check.yml.ejs +44 -0
- package/dist/templates/github/workflows/_contract-postman.yml.ejs +93 -0
- package/dist/templates/github/workflows/_cosign-copy/aws-ecs.ejs +90 -0
- package/dist/templates/github/workflows/_cosign-copy/azure-container-app.ejs +97 -0
- package/dist/templates/github/workflows/_cosign-copy/gcp-cloud-run.ejs +102 -0
- package/dist/templates/github/workflows/_cosign-copy/ghcr.ejs +76 -0
- package/dist/templates/github/workflows/_cosign-copy/nas-compose.ejs +69 -0
- package/dist/templates/github/workflows/_deploy/aws-ecs.ejs +78 -0
- package/dist/templates/github/workflows/_deploy/azure-container-app.ejs +59 -0
- package/dist/templates/github/workflows/_deploy/gcp-cloud-run.ejs +71 -0
- package/dist/templates/github/workflows/_deploy/ghcr.ejs +19 -0
- package/dist/templates/github/workflows/_deploy/nas-compose.ejs +45 -0
- package/dist/templates/github/workflows/_k6-runner.yml.ejs +107 -0
- package/dist/templates/github/workflows/_label-on-approve.yml.ejs +44 -0
- package/dist/templates/github/workflows/_label-sync.yml.ejs +58 -0
- package/dist/templates/github/workflows/_monthly.yml.ejs +343 -0
- package/dist/templates/github/workflows/_nightly.yml.ejs +826 -0
- package/dist/templates/github/workflows/_notify.yml.ejs +96 -0
- package/dist/templates/github/workflows/_partials/macos-keychain-bypass.ejs +6 -0
- package/dist/templates/github/workflows/_partials/macos-keychain-restore.ejs +6 -0
- package/dist/templates/github/workflows/_partials/scheduled-heavy-jobs.ejs +117 -0
- package/dist/templates/github/workflows/_partials/sigstore-preflight.ejs +8 -0
- package/dist/templates/github/workflows/_partials/trivy-fs-java.ejs +27 -0
- package/dist/templates/github/workflows/_post-merge-notify.yml.ejs +228 -0
- package/dist/templates/github/workflows/_pr-staleness.yml.ejs +85 -0
- package/dist/templates/github/workflows/_shared-security.yml.ejs +132 -0
- package/dist/templates/github/workflows/_sigstore-retry-sign.yml.ejs +102 -0
- package/dist/templates/github/workflows/_weekly.yml.ejs +313 -0
- package/dist/templates/github/workflows/drift-shadow.yml.ejs +51 -0
- package/dist/templates/github/workflows/five-lane/ci.yml.ejs +54 -0
- package/dist/templates/github/workflows/five-lane/nightly.yml.ejs +70 -0
- package/dist/templates/github/workflows/five-lane/release.yml.ejs +53 -0
- package/dist/templates/github/workflows/five-lane/weekly.yml.ejs +72 -0
- package/dist/templates/github/workflows/issue-state.yml.ejs +93 -0
- package/dist/templates/global-invariants/GLOBAL_INVARIANTS.md.ejs +34 -0
- package/dist/templates/governance/RACI.md.ejs +21 -0
- package/dist/templates/governance/ci-mental-model.md.ejs +268 -0
- package/dist/templates/governance/contract-integrity-policy.md.ejs +116 -0
- package/dist/templates/governance/enterprise-compliance-baseline.md.ejs +111 -0
- package/dist/templates/governance/evidence-retention.md.ejs +43 -0
- package/dist/templates/governance/gdpr-erasure-runbook.md.ejs +165 -0
- package/dist/templates/governance/qa-audit-phases.md.ejs +129 -0
- package/dist/templates/governance/risk-assessment-template.md.ejs +105 -0
- package/dist/templates/governance/risk-register.md.ejs +76 -0
- package/dist/templates/governance/solo-dev-exception.md.ejs +96 -0
- package/dist/templates/governance/validation-evidence.md.ejs +131 -0
- package/dist/templates/infra/azure/containerapp.tpl.yaml.ejs +74 -0
- package/dist/templates/infra/nas-compose/deploy.sh.ejs +114 -0
- package/dist/templates/integration-testing/AbstractIntegrationTest.java.ejs +36 -0
- package/dist/templates/integration-testing/NoH2ArchTest.java.ejs +24 -0
- package/dist/templates/integration-testing/conftest.py.ejs +20 -0
- package/dist/templates/integration-testing/db_fixture.rs.ejs +48 -0
- package/dist/templates/integration-testing/eslint-no-fake-db.json.ejs +19 -0
- package/dist/templates/integration-testing/eslint.config.no-fake-db.mjs.ejs +46 -0
- package/dist/templates/integration-testing/main_test.go.ejs +53 -0
- package/dist/templates/integration-testing/main_test_sqlite.go.ejs +37 -0
- package/dist/templates/integration-testing/test-setup.ts.ejs +26 -0
- package/dist/templates/integration-testing/testcontainers-deps.gradle.ejs +9 -0
- package/dist/templates/java/DeprecationInterceptor.java.ejs +50 -0
- package/dist/templates/java/archunit-hexagonal.ejs +69 -0
- package/dist/templates/java/modulith/ApplicationModulesTest.java.ejs +21 -0
- package/dist/templates/java/modulith/modulith-deps.gradle.ejs +13 -0
- package/dist/templates/java/modulith/modulith-maven-setup.md.ejs +21 -0
- package/dist/templates/java/pharma/AuditEvent.java.ejs +138 -0
- package/dist/templates/java/pharma/AuditMapper.java.ejs +60 -0
- package/dist/templates/java/pharma/archunit-pharma.ejs +128 -0
- package/dist/templates/kit/GLOBAL_KIT.md.ejs +11 -0
- package/dist/templates/kit/dim.md.ejs +33 -0
- package/dist/templates/llms-txt.config.json.ejs +22 -0
- package/dist/templates/local-wrapper/.env.example.ejs +15 -0
- package/dist/templates/local-wrapper/Makefile.ejs +44 -0
- package/dist/templates/local-wrapper/run.sh.ejs +5 -0
- package/dist/templates/middleware/410-gone-handler.ts.ejs +41 -0
- package/dist/templates/middleware/correlation-id.ts.ejs +32 -0
- package/dist/templates/middleware/deprecation.ts.ejs +45 -0
- package/dist/templates/middleware/error-handler.ts.ejs +73 -0
- package/dist/templates/middleware/payload-size-limit.ts.ejs +51 -0
- package/dist/templates/mutation/README.md.ejs +67 -0
- package/dist/templates/mutation/cargo-mutants.toml.ejs +9 -0
- package/dist/templates/mutation/mutmut-config.toml.ejs +7 -0
- package/dist/templates/mutation/parse-mutants.mjs.ejs +44 -0
- package/dist/templates/mutation/parse-mutmut.py.ejs +44 -0
- package/dist/templates/mutation/pitest-l2-setup.md.ejs +66 -0
- package/dist/templates/mutation/pitest-maven-setup.md.ejs +64 -0
- package/dist/templates/mutation/pitest.gradle.ejs +23 -0
- package/dist/templates/mutation/stryker.conf.json.ejs +17 -0
- package/dist/templates/observability/setup.md.ejs +495 -0
- package/dist/templates/operations/handbook.md.ejs +217 -0
- package/dist/templates/perf/bundle-budget.json.ejs +29 -0
- package/dist/templates/perf/k6/reports/csv-report.py.ejs +91 -0
- package/dist/templates/perf/k6/reports/html-report.py.ejs +114 -0
- package/dist/templates/perf/k6/reports/json-report.py.ejs +74 -0
- package/dist/templates/perf/k6/scenarios/breakpoint.js.ejs +26 -0
- package/dist/templates/perf/k6/scenarios/burst.js.ejs +43 -0
- package/dist/templates/perf/k6/scenarios/endurance.js.ejs +36 -0
- package/dist/templates/perf/k6/scenarios/load.js.ejs +26 -0
- package/dist/templates/perf/k6/scenarios/ramp-down.js.ejs +29 -0
- package/dist/templates/perf/k6/scenarios/ramp-up.js.ejs +32 -0
- package/dist/templates/perf/k6/scenarios/smoke.js.ejs +23 -0
- package/dist/templates/perf/k6/scenarios/soak.js.ejs +26 -0
- package/dist/templates/perf/k6/scenarios/spike.js.ejs +29 -0
- package/dist/templates/perf/k6/scenarios/steady-state.js.ejs +31 -0
- package/dist/templates/perf/k6/scenarios/stress.js.ejs +29 -0
- package/dist/templates/perf/k6/scenarios/volume.js.ejs +36 -0
- package/dist/templates/perf/k6/seed/test-data.sql.ejs +59 -0
- package/dist/templates/perf/lighthouserc.json.ejs +41 -0
- package/dist/templates/quality/iso9001/CAPA_LOG.md.ejs +36 -0
- package/dist/templates/quality/iso9001/DOCUMENT_CONTROL.md.ejs +36 -0
- package/dist/templates/quality/iso9001/REQUIREMENTS_TRACEABILITY.md.ejs +61 -0
- package/dist/templates/regulated/overlay.json.ejs +26 -0
- package/dist/templates/regulated/regulated-overlay.md.ejs +40 -0
- package/dist/templates/resilience/RESILIENCE.md.ejs +310 -0
- package/dist/templates/root/.gitignore.ejs +85 -0
- package/dist/templates/root/CODEOWNERS.ejs +18 -0
- package/dist/templates/root/CONTRIBUTING.md.ejs +62 -0
- package/dist/templates/root/SECURITY.md.ejs +19 -0
- package/dist/templates/root/TEST_TAXONOMY.md.ejs +100 -0
- package/dist/templates/root/commitlint.config.js.ejs +4 -0
- package/dist/templates/root/docs/METHOD/CANONICAL_PATHS.md.ejs +24 -0
- package/dist/templates/root/docs/METHOD/ENGINEERING_DEFAULTS.md.ejs +136 -0
- package/dist/templates/root/docs/METHOD/KNOWLEDGE_MAP.md.ejs +90 -0
- package/dist/templates/root/docs/METHOD/PATTERNS_CATALOG.md.ejs +51 -0
- package/dist/templates/root/docs/METHOD/REUSE_REGISTRY.md.ejs +26 -0
- package/dist/templates/root/docs/METHOD/REUSE_REGISTRY_SPEC.md.ejs +80 -0
- package/dist/templates/root/docs/METHOD/SSOT_CORE_SET.md.ejs +62 -0
- package/dist/templates/root/docs/METHOD/TRACK_ROUTER.md.ejs +39 -0
- package/dist/templates/root/docs/SYSTEM/CANON.md.ejs +359 -0
- package/dist/templates/root/docs/SYSTEM/FAIL_CLOSED.md.ejs +171 -0
- package/dist/templates/root/editorconfig.ejs +39 -0
- package/dist/templates/root/tsconfig.json.ejs +21 -0
- package/dist/templates/rust/clippy.toml.ejs +14 -0
- package/dist/templates/schemas/milestone.schema.json.ejs +164 -0
- package/dist/templates/schemas/rtm-verdict.schema.json.ejs +52 -0
- package/dist/templates/schemas/source-record.schema.json.ejs +91 -0
- package/dist/templates/schemas/tabletop-evidence.schema.json.ejs +53 -0
- package/dist/templates/schemas/use-case.schema.json.ejs +59 -0
- package/dist/templates/scripts/apply-branch-protection.mjs.ejs +70 -0
- package/dist/templates/scripts/audit-toolchain.mjs.ejs +112 -0
- package/dist/templates/scripts/bg-run.sh.ejs +59 -0
- package/dist/templates/scripts/capacity-probe.mjs.ejs +147 -0
- package/dist/templates/scripts/capture-debt-baseline.mjs.ejs +99 -0
- package/dist/templates/scripts/check-acceptance.mjs.ejs +298 -0
- package/dist/templates/scripts/check-action-pins.mjs.ejs +215 -0
- package/dist/templates/scripts/check-agent-return.mjs.ejs +177 -0
- package/dist/templates/scripts/check-all.mjs.ejs +1746 -0
- package/dist/templates/scripts/check-anti-fake-green.mjs.ejs +80 -0
- package/dist/templates/scripts/check-anti-proforma.mjs.ejs +547 -0
- package/dist/templates/scripts/check-api-e2e.mjs.ejs +106 -0
- package/dist/templates/scripts/check-arc42-slots.mjs.ejs +25 -0
- package/dist/templates/scripts/check-assertion-delta.mjs.ejs +287 -0
- package/dist/templates/scripts/check-audit-dry-pass.mjs.ejs +176 -0
- package/dist/templates/scripts/check-bundle-size.mjs.ejs +151 -0
- package/dist/templates/scripts/check-canonical-paths.mjs.ejs +39 -0
- package/dist/templates/scripts/check-ci-tiers.mjs.ejs +111 -0
- package/dist/templates/scripts/check-claude-md-lint.mjs.ejs +142 -0
- package/dist/templates/scripts/check-collab-mode-wired.mjs.ejs +60 -0
- package/dist/templates/scripts/check-commit-footer-rationale.mjs.ejs +170 -0
- package/dist/templates/scripts/check-constraint-scan.mjs.ejs +681 -0
- package/dist/templates/scripts/check-consumer-audit.mjs.ejs +414 -0
- package/dist/templates/scripts/check-continue-on-error.mjs.ejs +227 -0
- package/dist/templates/scripts/check-cross-model-review.mjs.ejs +458 -0
- package/dist/templates/scripts/check-decision-registry.mjs.ejs +101 -0
- package/dist/templates/scripts/check-doc-freshness.mjs.ejs +17 -0
- package/dist/templates/scripts/check-doc-links.mjs.ejs +98 -0
- package/dist/templates/scripts/check-doc-set.mjs.ejs +18 -0
- package/dist/templates/scripts/check-docs.mjs.ejs +71 -0
- package/dist/templates/scripts/check-domain-api-surface.mjs.ejs +80 -0
- package/dist/templates/scripts/check-drift.mjs.ejs +167 -0
- package/dist/templates/scripts/check-duplication.mjs.ejs +45 -0
- package/dist/templates/scripts/check-e2e-escalation.mjs.ejs +199 -0
- package/dist/templates/scripts/check-e2e-quarantine.mjs.ejs +68 -0
- package/dist/templates/scripts/check-emission-parity.mjs.ejs +91 -0
- package/dist/templates/scripts/check-exit-code-contract.mjs.ejs +138 -0
- package/dist/templates/scripts/check-fail-closed-audit.mjs.ejs +389 -0
- package/dist/templates/scripts/check-fe-boundaries.mjs.ejs +184 -0
- package/dist/templates/scripts/check-feature-matrix.mjs.ejs +835 -0
- package/dist/templates/scripts/check-frontend-lane.mjs.ejs +73 -0
- package/dist/templates/scripts/check-grace-window.mjs.ejs +102 -0
- package/dist/templates/scripts/check-handoff-doc.mjs.ejs +192 -0
- package/dist/templates/scripts/check-hook-routing.mjs.ejs +224 -0
- package/dist/templates/scripts/check-image-pins.mjs.ejs +90 -0
- package/dist/templates/scripts/check-inline-suppressions.mjs.ejs +153 -0
- package/dist/templates/scripts/check-iso9001.mjs.ejs +146 -0
- package/dist/templates/scripts/check-knowledge-map.mjs.ejs +49 -0
- package/dist/templates/scripts/check-local-ci-parity.mjs.ejs +382 -0
- package/dist/templates/scripts/check-m16-handoff.mjs.ejs +112 -0
- package/dist/templates/scripts/check-merge-method.mjs.ejs +92 -0
- package/dist/templates/scripts/check-milestones.mjs.ejs +678 -0
- package/dist/templates/scripts/check-min-test-execution.mjs.ejs +225 -0
- package/dist/templates/scripts/check-muted-test.mjs.ejs +270 -0
- package/dist/templates/scripts/check-no-stub-redirects.mjs.ejs +154 -0
- package/dist/templates/scripts/check-no-tracked-artifacts.mjs.ejs +134 -0
- package/dist/templates/scripts/check-oracle-discrimination.mjs.ejs +244 -0
- package/dist/templates/scripts/check-pii-scan.mjs.ejs +67 -0
- package/dist/templates/scripts/check-pipe-tee-hazard.mjs.ejs +85 -0
- package/dist/templates/scripts/check-pr-size-gate.mjs.ejs +85 -0
- package/dist/templates/scripts/check-refutation-verdicts.mjs.ejs +256 -0
- package/dist/templates/scripts/check-regulated-overlay.mjs.ejs +158 -0
- package/dist/templates/scripts/check-render-smoke.mjs.ejs +100 -0
- package/dist/templates/scripts/check-reuse-registry.mjs.ejs +44 -0
- package/dist/templates/scripts/check-review-completion.mjs.ejs +708 -0
- package/dist/templates/scripts/check-safety-adopt-ratchet.mjs.ejs +142 -0
- package/dist/templates/scripts/check-secret-presence.mjs.ejs +191 -0
- package/dist/templates/scripts/check-secret-scan.mjs.ejs +82 -0
- package/dist/templates/scripts/check-skip-critical-e2e.mjs.ejs +142 -0
- package/dist/templates/scripts/check-smoke-journeys.mjs.ejs +272 -0
- package/dist/templates/scripts/check-solo-reactivation.mjs.ejs +102 -0
- package/dist/templates/scripts/check-sources.mjs.ejs +245 -0
- package/dist/templates/scripts/check-ssot-core.mjs.ejs +45 -0
- package/dist/templates/scripts/check-stack-conformity.mjs.ejs +160 -0
- package/dist/templates/scripts/check-stride-traceability.mjs.ejs +101 -0
- package/dist/templates/scripts/check-suppression-expiry.mjs.ejs +79 -0
- package/dist/templates/scripts/check-suppression-rationale.mjs.ejs +76 -0
- package/dist/templates/scripts/check-suppressions.mjs.ejs +150 -0
- package/dist/templates/scripts/check-tabletop-evidence.mjs.ejs +499 -0
- package/dist/templates/scripts/check-tdd-evidence.mjs.ejs +381 -0
- package/dist/templates/scripts/check-test-naming.mjs.ejs +151 -0
- package/dist/templates/scripts/check-test-pyramid.mjs.ejs +170 -0
- package/dist/templates/scripts/check-test-scope-tier.mjs.ejs +208 -0
- package/dist/templates/scripts/check-tier-coverage.mjs.ejs +71 -0
- package/dist/templates/scripts/check-todo-max-age.mjs.ejs +205 -0
- package/dist/templates/scripts/check-touched-vs-manifest.mjs.ejs +179 -0
- package/dist/templates/scripts/check-unwired-guards.mjs.ejs +367 -0
- package/dist/templates/scripts/check-use-cases.mjs.ejs +345 -0
- package/dist/templates/scripts/check-validator-helptext.mjs.ejs +80 -0
- package/dist/templates/scripts/check-wiki-lint.mjs.ejs +162 -0
- package/dist/templates/scripts/check-workflow-docs-sync.mjs.ejs +91 -0
- package/dist/templates/scripts/check-workflow-job-naming.mjs.ejs +102 -0
- package/dist/templates/scripts/check-workflow-perms.mjs.ejs +54 -0
- package/dist/templates/scripts/check-workflow-runners.mjs.ejs +87 -0
- package/dist/templates/scripts/check-workflow-sha-pinning.mjs.ejs +89 -0
- package/dist/templates/scripts/check-workflow-test-integrity.mjs.ejs +235 -0
- package/dist/templates/scripts/checks/check-rust-no-unsafe.mjs.ejs +58 -0
- package/dist/templates/scripts/checks/check-rust-no-unwrap.mjs.ejs +61 -0
- package/dist/templates/scripts/ci-classify-changes.mjs.ejs +119 -0
- package/dist/templates/scripts/conformance.mjs.ejs +37 -0
- package/dist/templates/scripts/constraint-map.json.ejs +25 -0
- package/dist/templates/scripts/debt-lib.mjs.ejs +1015 -0
- package/dist/templates/scripts/debt-report.mjs.ejs +199 -0
- package/dist/templates/scripts/domain-api-surface.json.ejs +23 -0
- package/dist/templates/scripts/done-evidence.mjs.ejs +359 -0
- package/dist/templates/scripts/evidence-collect.mjs.ejs +264 -0
- package/dist/templates/scripts/evidence-prune.mjs.ejs +96 -0
- package/dist/templates/scripts/evidence-rotate.mjs.ejs +53 -0
- package/dist/templates/scripts/evidence-writer.sh.ejs +220 -0
- package/dist/templates/scripts/gate-registry.yml.ejs +286 -0
- package/dist/templates/scripts/gen-doc-index.mjs.ejs +19 -0
- package/dist/templates/scripts/gen-gap.mjs.ejs +153 -0
- package/dist/templates/scripts/gen-llms-txt.mjs.ejs +18 -0
- package/dist/templates/scripts/gen-wiki.mjs.ejs +196 -0
- package/dist/templates/scripts/gh-cleanup-expired-artifacts.mjs.ejs +134 -0
- package/dist/templates/scripts/gold-audit.mjs.ejs +19 -0
- package/dist/templates/scripts/i18n-literal-scanner.mjs.ejs +175 -0
- package/dist/templates/scripts/ingest-zap-report.mjs.ejs +107 -0
- package/dist/templates/scripts/inject-pact-samples.sh.ejs +96 -0
- package/dist/templates/scripts/issue-readiness.mjs.ejs +84 -0
- package/dist/templates/scripts/knowledge-map-update.mjs.ejs +32 -0
- package/dist/templates/scripts/lib/acceptance-criteria.mjs.ejs +213 -0
- package/dist/templates/scripts/lib/agent-return-validate.mjs.ejs +481 -0
- package/dist/templates/scripts/lib/coverage-gate.mjs.ejs +54 -0
- package/dist/templates/scripts/lib/e2e-reliability.mjs.ejs +207 -0
- package/dist/templates/scripts/lib/ephemeral-server.mjs.ejs +148 -0
- package/dist/templates/scripts/lib/evidence-binding.mjs.ejs +140 -0
- package/dist/templates/scripts/lib/exact-sha-policy.mjs.ejs +233 -0
- package/dist/templates/scripts/lib/gate-args.mjs.ejs +20 -0
- package/dist/templates/scripts/lib/gate-evidence.mjs.ejs +622 -0
- package/dist/templates/scripts/lib/gate-mutex.mjs.ejs +340 -0
- package/dist/templates/scripts/lib/glob-walk.mjs.ejs +148 -0
- package/dist/templates/scripts/lib/run-helpers.mjs.ejs +416 -0
- package/dist/templates/scripts/lib/seed-common.sh.ejs +105 -0
- package/dist/templates/scripts/lib/waiter-count.mjs.ejs +62 -0
- package/dist/templates/scripts/muted-tests-baseline.json.ejs +4 -0
- package/dist/templates/scripts/optional-emissions.json.ejs +117 -0
- package/dist/templates/scripts/oracle-discrimination-baseline.json.ejs +6 -0
- package/dist/templates/scripts/pid-watch.sh.ejs +78 -0
- package/dist/templates/scripts/pii-scan.mjs.ejs +125 -0
- package/dist/templates/scripts/pr-merge-watch.mjs.ejs +445 -0
- package/dist/templates/scripts/record-agent-return.mjs.ejs +279 -0
- package/dist/templates/scripts/record-journey-evidence.mjs.ejs +69 -0
- package/dist/templates/scripts/rework-log.mjs.ejs +172 -0
- package/dist/templates/scripts/run-postman-tests.sh.ejs +112 -0
- package/dist/templates/scripts/schemas/agent-return-external.schema.json +74 -0
- package/dist/templates/scripts/schemas/agent-return.schema.json.ejs +181 -0
- package/dist/templates/scripts/schemas/cross-model-dispatch.schema.json +95 -0
- package/dist/templates/scripts/seed-test-data.sh.ejs +99 -0
- package/dist/templates/scripts/self-validation.mjs.ejs +126 -0
- package/dist/templates/scripts/setup-repo.sh.ejs +78 -0
- package/dist/templates/scripts/spotbugs-baseline.json.ejs +4 -0
- package/dist/templates/scripts/test-gate-layering.mjs.ejs +92 -0
- package/dist/templates/scripts/validate-api-snapshots.mjs.ejs +86 -0
- package/dist/templates/scripts/validate-k6-scenarios.mjs.ejs +96 -0
- package/dist/templates/scripts/validate-openapi-field-types.mjs.ejs +124 -0
- package/dist/templates/scripts/validate-postman-collection.mjs.ejs +159 -0
- package/dist/templates/scripts/verify-fe-coverage.mjs.ejs +138 -0
- package/dist/templates/scripts/verify-i18n-parity.mjs.ejs +114 -0
- package/dist/templates/scripts/verify-module-coverage.mjs.ejs +207 -0
- package/dist/templates/scripts/verify-mutation-baseline.mjs.ejs +209 -0
- package/dist/templates/scripts/verify-spotbugs.mjs.ejs +216 -0
- package/dist/templates/scripts/verify-tokens.mjs.ejs +177 -0
- package/dist/templates/security/RISK_ASSESSMENT.md.ejs +35 -0
- package/dist/templates/security/STRIDE.md.ejs +24 -0
- package/dist/templates/security/gitleaks.toml.ejs +21 -0
- package/dist/templates/security/zap/baseline-auth.context.ejs +58 -0
- package/dist/templates/security/zap/rules.tsv.ejs +100 -0
- package/dist/templates/ship/TICK_PROMPT.md.ejs +55 -0
- package/dist/templates/ship/supervisor.sh.ejs +46 -0
- package/dist/templates/smoke-journeys/manifest.json.ejs +1 -0
- package/dist/templates/sonar-project.properties.ejs +25 -0
- package/dist/templates/standards/doc-profile.ejs +27 -0
- package/dist/templates/standards/gold-doc-set.yml.ejs +528 -0
- package/dist/templates/standards/gold-registry.java.yml.ejs +266 -0
- package/dist/templates/standards/gold-registry.typescript.yml.ejs +104 -0
- package/dist/templates/standards/gold-registry.yml.ejs +119 -0
- package/dist/templates/standards/thresholds.yml.ejs +86 -0
- package/dist/templates/static-analysis/.dependency-cruiser.cjs.ejs +78 -0
- package/dist/templates/static-analysis/.golangci.yml.ejs +70 -0
- package/dist/templates/static-analysis/.shellcheckrc.ejs +13 -0
- package/dist/templates/static-analysis/.yamllint.yml.ejs +41 -0
- package/dist/templates/static-analysis/checkstyle.xml.ejs +83 -0
- package/dist/templates/static-analysis/detekt.yml.ejs +26 -0
- package/dist/templates/static-analysis/eslint.config.mjs.ejs +54 -0
- package/dist/templates/static-analysis/eslint.config.static.mjs.ejs +38 -0
- package/dist/templates/static-analysis/eslintrc-static.json.ejs +30 -0
- package/dist/templates/static-analysis/jscpd.json.ejs +25 -0
- package/dist/templates/static-analysis/knip.json.ejs +26 -0
- package/dist/templates/static-analysis/pmd-ruleset.xml.ejs +92 -0
- package/dist/templates/static-analysis/prettierignore.ejs +59 -0
- package/dist/templates/static-analysis/prettierrc.json.ejs +10 -0
- package/dist/templates/static-analysis/requirements-dev.txt.ejs +11 -0
- package/dist/templates/static-analysis/ruff.toml.ejs +40 -0
- package/dist/templates/static-analysis/rustfmt.toml.ejs +3 -0
- package/dist/templates/static-analysis/spotbugs-exclude.xml.ejs +120 -0
- package/dist/templates/static-analysis/spotbugs.gradle.ejs +18 -0
- package/dist/templates/static-analysis/spotless.gradle.ejs +38 -0
- package/dist/templates/static-analysis/stylelintrc.json.ejs +16 -0
- package/dist/templates/suppressions/archunit-baseline.json.ejs +1 -0
- package/dist/templates/suppressions/consumer-audit-allowlist.json.ejs +1 -0
- package/dist/templates/suppressions/gitleaksignore.ejs +20 -0
- package/dist/templates/suppressions/pii-allowlist.json.ejs +1 -0
- package/dist/templates/suppressions/suppressions-schema.json.ejs +39 -0
- package/dist/templates/suppressions/trivyignore.ejs +17 -0
- package/dist/templates/testing/test-taxonomy.md.ejs +120 -0
- package/dist/test/example.behavioral.test.js +2 -0
- package/dist/types/memory.d.ts +19 -0
- package/dist/types/memory.js +1 -0
- package/dist/types/plan.d.ts +102 -0
- package/dist/types/plan.js +2 -0
- package/dist/types/plugin.d.ts +45 -0
- package/dist/types/plugin.js +1 -0
- package/dist/utils/canon-loader.js +2 -0
- package/dist/utils/channel.js +1 -0
- package/dist/utils/config.d.ts +79 -0
- package/dist/utils/config.js +5 -0
- package/dist/utils/confirm-downgrade.js +5 -0
- package/dist/utils/env.js +2 -0
- package/dist/utils/error-catalog.js +2 -0
- package/dist/utils/errors.js +2 -0
- package/dist/utils/evidence-log.js +3 -0
- package/dist/utils/file-lock.js +2 -0
- package/dist/utils/first-run.js +8 -0
- package/dist/utils/fs.js +3 -0
- package/dist/utils/github-issue-helper.js +4 -0
- package/dist/utils/gradle.js +21 -0
- package/dist/utils/json-output.js +2 -0
- package/dist/utils/logger-config.js +4 -0
- package/dist/utils/logger.js +3 -0
- package/dist/utils/maturity-check.js +2 -0
- package/dist/utils/pkg.js +3 -0
- package/dist/utils/platform.js +2 -0
- package/dist/utils/plugin-loader.js +2 -0
- package/dist/utils/plugin-worker.js +2 -0
- package/dist/utils/prettier-format.js +2 -0
- package/dist/utils/profiler.js +2 -0
- package/dist/utils/render.js +2 -0
- package/dist/utils/replay.js +3 -0
- package/dist/utils/run-cli.js +6 -0
- package/dist/utils/run-id.js +3 -0
- package/dist/utils/safe-read.js +2 -0
- package/dist/utils/task-id.js +2 -0
- package/dist/utils/today.js +2 -0
- package/dist/utils/tty.js +2 -0
- package/dist/utils/walk-dir.js +2 -0
- package/dist/verify/rules/drive-by-scope.js +1 -0
- package/dist/verify/rules/orphan-todos.js +1 -0
- package/dist/verify/rules/registry.js +1 -0
- package/dist/verify/rules/skip-patterns.js +1 -0
- package/dist/verify/rules/types.d.ts +15 -0
- package/dist/verify/rules/types.js +1 -0
- package/dist/verify/rules/ui-language.js +1 -0
- package/dist/verify/run.js +3 -0
- package/dist/wizard/archetype-defaults.js +1 -0
- package/dist/wizard/presets.js +1 -0
- package/dist/wizard/prompts.js +44 -0
- package/dist/wizard/types.d.ts +637 -0
- package/dist/wizard/types.js +1 -0
- package/dist/worktree/harvest.js +2 -0
- package/dist/worktree/links.js +2 -0
- package/dist/worktree/paths.js +2 -0
- package/dist/worktree/validate.js +3 -0
- package/package.json +124 -0
- package/scripts/check-arc42-slots.mjs +738 -0
- package/scripts/check-doc-freshness.mjs +236 -0
- package/scripts/check-doc-set.mjs +243 -0
- package/scripts/check-doc-style.mjs +228 -0
- package/scripts/gold-audit.mjs +319 -0
- package/scripts/lib/doc-gate-allowlist.mjs +123 -0
- package/scripts/lib/doc-set-resolve.mjs +274 -0
- package/scripts/lib/glob-walk.mjs +148 -0
- package/scripts/lib/gold-audit-lib.mjs +1260 -0
- package/scripts/lib/run-helpers.mjs +413 -0
|
@@ -0,0 +1,517 @@
|
|
|
1
|
+
# <%= projectName %> — AGENTS.md
|
|
2
|
+
|
|
3
|
+
> **Canonical governance for AI coding agents.**
|
|
4
|
+
> All tools read this file. Tool-specific extensions: `.claude/CLAUDE.md`, `.agents/CODEX.md`
|
|
5
|
+
>
|
|
6
|
+
> Standard: [AGENTS.md — AAIF / Linux Foundation](https://agents.md/)
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Project
|
|
11
|
+
|
|
12
|
+
| Fact | Value |
|
|
13
|
+
|------|-------|
|
|
14
|
+
| **What** | <%= description %> |
|
|
15
|
+
| **Stack** | <%= language %><% if (framework) { %> / <%= framework %><% } %> |
|
|
16
|
+
| **Build** | `<%= buildCommand %>` |
|
|
17
|
+
| **Test** | `<%= testCommand %>` |
|
|
18
|
+
| **Gate** | `node scripts/check-all.mjs` (mandatory before commit) |
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Authority Hierarchy
|
|
23
|
+
|
|
24
|
+
When documents conflict, higher level wins. No debate.
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
Level 1: AGENTS.md — invariants + governance (this file)
|
|
28
|
+
Level 2: Architecture docs (docs/SYSTEM/ARCHITECTURE.md, PROJECT_STATUS.md)
|
|
29
|
+
Level 2.5: DECISION_REGISTRY.md — blocked project decisions (D-NN, #2036)
|
|
30
|
+
Level 3: Source code + tests — implementation truth
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Blocked decisions live in `DECISION_REGISTRY.md` (D-NN — one rule lives in ONE
|
|
34
|
+
registry; a decision that matures into a permanent rule promotes to a PROJ-NN
|
|
35
|
+
invariant). The decision-registry gate fails on orphan D-NN decisions.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Iron Laws
|
|
40
|
+
|
|
41
|
+
Behavioral protocol rules that sit above the invariant catalog — process discipline,
|
|
42
|
+
not a checkable gate. Violation protocol: **STOP → REFUSE → cite the law**.
|
|
43
|
+
|
|
44
|
+
### Worktree Isolation Is Mandatory For Parallel Agents
|
|
45
|
+
|
|
46
|
+
Concurrent agents must each work in an isolated git worktree. Shared-tree parallel
|
|
47
|
+
editing — two or more agents writing into the same working tree at once — is
|
|
48
|
+
prohibited: git index state, lockfiles, and in-flight diffs corrupt under
|
|
49
|
+
concurrent writers, with no clean recovery path. One agent, one worktree, one
|
|
50
|
+
branch.
|
|
51
|
+
|
|
52
|
+
### Complete Means Merged To Main
|
|
53
|
+
|
|
54
|
+
No task, PR, or issue may be reported complete before its PR is merged green on
|
|
55
|
+
`main`. Open is not done. A PR is owned until merged: follow it through CI and fix
|
|
56
|
+
each red by root cause (read the failing job's log, fix the underlying cause,
|
|
57
|
+
push, re-verify), repeated until every check passes and it merges. Handing back or
|
|
58
|
+
abandoning a red PR, or reporting a task complete while its PR is still open, is a
|
|
59
|
+
process violation.
|
|
60
|
+
|
|
61
|
+
### Root-Cause-First After Any Failure
|
|
62
|
+
|
|
63
|
+
On an error, stop the patch-spiral. Do not attempt a second fix before performing
|
|
64
|
+
structural analysis: read the actual failure, trace it to its origin, and only
|
|
65
|
+
then apply the fix that addresses the root cause. A patch applied without
|
|
66
|
+
diagnosis is a guess, not a fix, and tends to compound rather than resolve.
|
|
67
|
+
|
|
68
|
+
### Verification-Before-Victory
|
|
69
|
+
|
|
70
|
+
Run targeted local verification — an end-to-end exercise of the changed behavior,
|
|
71
|
+
not just a green typecheck or unit-test run — before every push. This is the
|
|
72
|
+
dominant agent failure mode: of observed real agent errors, the majority (5 of 8)
|
|
73
|
+
were claims of success without the change ever having been exercised. Review
|
|
74
|
+
layers do not prevent this; only verification does.
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Invariants
|
|
79
|
+
|
|
80
|
+
Violation protocol: **STOP → REFUSE → cite INV-XX**.
|
|
81
|
+
|
|
82
|
+
<% for (const [tier, tierInvariants] of invariantsByTier.entries()) { -%>
|
|
83
|
+
### <%- tierLabels[tier] %>
|
|
84
|
+
|
|
85
|
+
<% for (const inv of tierInvariants) { -%>- **<%- inv.id %>:** <%- (inv.languageDetail && inv.languageDetail[language]) ? inv.languageDetail[language] : inv.title %>
|
|
86
|
+
<% } -%>
|
|
87
|
+
|
|
88
|
+
<% } -%>
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Coding Standards
|
|
92
|
+
|
|
93
|
+
<% if (language === 'typescript') { %>### TypeScript
|
|
94
|
+
|
|
95
|
+
- Strict mode always on (`"strict": true` in tsconfig)
|
|
96
|
+
- No `any` — use `unknown` and narrow, or create proper types
|
|
97
|
+
- Prefer `const` over `let`, never `var`
|
|
98
|
+
- Async/await over callbacks or raw Promises
|
|
99
|
+
- Named exports preferred over default exports
|
|
100
|
+
- File naming: `kebab-case.ts`<% if (architectureStyle === 'hexagonal') { %>
|
|
101
|
+
|
|
102
|
+
### Architecture Verification (M22a)
|
|
103
|
+
|
|
104
|
+
Generated `eslint-plugin-boundaries` config enforces hexagonal layer isolation (hard gate, L2+).
|
|
105
|
+
|
|
106
|
+
**Peer deps**: `npm i -D eslint@^9 eslint-plugin-boundaries @typescript-eslint/parser`
|
|
107
|
+
|
|
108
|
+
**Setup**: in your root ESLint config, add:
|
|
109
|
+
```js
|
|
110
|
+
extends: ['./.eslintrc-boundaries.cjs']
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
**Rules enforced**:
|
|
114
|
+
|
|
115
|
+
| Layer | Allowed dependencies | Notes |
|
|
116
|
+
|-------|---------------------|-------|
|
|
117
|
+
| `src/domain/**` | none | No framework imports; no Node built-ins; no browser globals |
|
|
118
|
+
| `src/application/**` | `domain` | Ports defined here |
|
|
119
|
+
| `src/adapters/**` | `application`, `domain` | Inbound + outbound adapters |
|
|
120
|
+
| `src/infrastructure/**` | `application`, `domain` | Bootstrap + config |
|
|
121
|
+
|
|
122
|
+
**Suppressions**: add exemptions to `suppressions/boundaries-baseline.json` with `scope` (file-pattern glob) + `expiresAt` (wave-migration date). Enforced by `check-suppressions.mjs` L1 gate.
|
|
123
|
+
<% } %><% } %><% if (language === 'rust') { %>### Rust
|
|
124
|
+
|
|
125
|
+
- All public items must have documentation comments
|
|
126
|
+
- Error handling: use `?` operator and typed `Result<T, E>`
|
|
127
|
+
- No `.unwrap()` or `.expect()` in library code; test code may use `.expect("...")`
|
|
128
|
+
- Use `clippy::pedantic` lint level
|
|
129
|
+
- Prefer `&str` over `String` in function parameters<% if (architectureStyle === 'hexagonal') { %>
|
|
130
|
+
|
|
131
|
+
### Architecture Verification (M22b)
|
|
132
|
+
|
|
133
|
+
Generated `cargo-deny` + `clippy.toml` + domain-purity grep enforce hexagonal layer isolation (hard gate, L2+).
|
|
134
|
+
|
|
135
|
+
**Peer deps**: `cargo install cargo-deny`
|
|
136
|
+
|
|
137
|
+
**Setup**: the generated `deny.toml` and `clippy.toml` are placed at the project root. No `Cargo.toml` changes needed.
|
|
138
|
+
|
|
139
|
+
**Rules enforced**:
|
|
140
|
+
|
|
141
|
+
| Layer | Mechanism | What it bans |
|
|
142
|
+
|-------|-----------|-------------|
|
|
143
|
+
| Project (all layers) | cargo-deny `[bans]` | Framework crates as direct dependencies (sqlx, axum, reqwest, …) |
|
|
144
|
+
| Project (all layers) | `clippy.toml` `disallowed_types` | Framework types anywhere in code (sqlx::Pool, axum::Router, …) |
|
|
145
|
+
| `src/domain/**` | grep scan in `check-boundaries.mjs` | `use sqlx`, `use axum`, `use diesel`, … — module-level enforcer |
|
|
146
|
+
|
|
147
|
+
**Suppressions**: add exemptions to `suppressions/boundaries-baseline.json` with `scope` (file-pattern glob) + `expiresAt` (wave-migration date). Enforced by `check-suppressions.mjs` L1 gate.
|
|
148
|
+
<% } %><% } %><% if (language === 'java') { %>### Java
|
|
149
|
+
|
|
150
|
+
- Hexagonal architecture: domain → no framework imports
|
|
151
|
+
- Use constructor injection exclusively (no field injection)
|
|
152
|
+
- Records for immutable data transfer objects
|
|
153
|
+
- No nullable fields without explicit `@Nullable` annotation
|
|
154
|
+
- Method length ≤ 65 LOC, cyclomatic complexity ≤ 15
|
|
155
|
+
- **Integration testing: RestAssured mandatory** — MockMvc is forbidden (INV-29)
|
|
156
|
+
- Use `@SpringBootTest(webEnvironment = RANDOM_PORT)` with RestAssured
|
|
157
|
+
- MockMvc bypasses real HTTP serialization, filters, and exception handlers
|
|
158
|
+
- `@AutoConfigureMockMvc` is prohibited; use a real embedded server<% if (architectureStyle === 'hexagonal' && basePackage) { %>
|
|
159
|
+
|
|
160
|
+
### Architecture Verification (M22)
|
|
161
|
+
|
|
162
|
+
Generated ArchUnit test suite enforces hexagonal boundaries (hard gate, L2+).
|
|
163
|
+
|
|
164
|
+
**Setup**: add to `build.gradle`:
|
|
165
|
+
```groovy
|
|
166
|
+
apply from: 'gradle/arch-test-deps.gradle'
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
**Rules enforced** (`src/test/java/<%= basePackage.replace(/\./g, '/') %>/architecture/`):
|
|
170
|
+
|
|
171
|
+
| Class | Rules |
|
|
172
|
+
|-------|-------|
|
|
173
|
+
| `DomainPurityTest` | No Spring/JPA/Hibernate imports in `domain.**` |
|
|
174
|
+
| `DependencyFlowTest` | Adapters → ports only; application → domain only; domain has no outbound deps |
|
|
175
|
+
| `PortsIndependenceTest` | `application.port.in/out` must not depend on adapters or infrastructure |
|
|
176
|
+
| `TestCoverageArchTest` | `*ControllerIT` classes must reside in `adapter.in.web` |<% if (hasDatabase && hasPublicApi) { %>
|
|
177
|
+
| `RestAssuredArchTest` | All `*ControllerIT` must extend `RestAssuredBaseIT` |<% } %>
|
|
178
|
+
|
|
179
|
+
**Suppressions**: add exemptions to `suppressions/archunit-baseline.json` with `scope` (class-pattern glob) + `expiresAt` (wave-migration date).
|
|
180
|
+
<% } %><% if (basePackage) { %>
|
|
181
|
+
|
|
182
|
+
### Module Boundaries (Spring Modulith)
|
|
183
|
+
|
|
184
|
+
If this is a Spring Boot project, the generated `ApplicationModulesTest` (`src/test/java/<%= basePackage.replace(/\./g, '/') %>/modulith/`) verifies module boundaries via `ApplicationModules.of(...).verify()` (#1886).
|
|
185
|
+
|
|
186
|
+
**Setup** (Gradle): add to `build.gradle`:
|
|
187
|
+
```groovy
|
|
188
|
+
apply from: 'gradle/modulith-deps.gradle'
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
**Setup** (Maven): see `docs/modulith-maven-setup.md` for the `<dependency>` snippet.
|
|
192
|
+
<% } %><% if (enableDebtGates && buildTool === 'gradle') { %>
|
|
193
|
+
|
|
194
|
+
### Coverage Gate (JaCoCo)
|
|
195
|
+
|
|
196
|
+
Generated `gradle/jacoco.gradle` wires `jacocoTestCoverageVerification` as a hard gate on `check` (#1887-F).
|
|
197
|
+
|
|
198
|
+
**Setup**: add to `build.gradle`:
|
|
199
|
+
```groovy
|
|
200
|
+
apply from: 'gradle/jacoco.gradle'
|
|
201
|
+
```
|
|
202
|
+
<% } %><% if (contractType === 'rest-owned' && buildTool === 'gradle') { %>
|
|
203
|
+
|
|
204
|
+
### Contract Testing (Pact provider verification)
|
|
205
|
+
|
|
206
|
+
Generated `config/pact-deps.gradle` wires the Pact provider-verification dependencies + broker system properties (#1887-F).
|
|
207
|
+
|
|
208
|
+
**Setup**: add to `build.gradle`:
|
|
209
|
+
```groovy
|
|
210
|
+
apply from: 'config/pact-deps.gradle'
|
|
211
|
+
```
|
|
212
|
+
<% } %><% if (contractType === 'rest-public' && buildTool === 'gradle') { %>
|
|
213
|
+
|
|
214
|
+
### Contract Testing (OpenAPI exporter)
|
|
215
|
+
|
|
216
|
+
Generated `config/export-openapi-java.gradle` wires the `org.springdoc.openapi-gradle-plugin` + `generateOpenApiDocs` task, producing `contracts/openapi-current.yaml` for the diff test (INV-43, #1887-F).
|
|
217
|
+
|
|
218
|
+
**Setup**: add to `build.gradle`:
|
|
219
|
+
```groovy
|
|
220
|
+
plugins {
|
|
221
|
+
id 'org.springdoc.openapi-gradle-plugin' version '1.8.0'
|
|
222
|
+
}
|
|
223
|
+
```
|
|
224
|
+
```groovy
|
|
225
|
+
apply from: 'config/export-openapi-java.gradle'
|
|
226
|
+
```
|
|
227
|
+
<% } %><% if (hasDatabase && governanceLevel !== 'L1' && buildTool === 'gradle') { %>
|
|
228
|
+
|
|
229
|
+
### Integration Testing (Testcontainers)
|
|
230
|
+
|
|
231
|
+
Generated `config/testcontainers-deps.gradle` wires the Testcontainers + PostgreSQL test dependencies (M26, #1887-F).
|
|
232
|
+
|
|
233
|
+
**Setup**: add to `build.gradle`:
|
|
234
|
+
```groovy
|
|
235
|
+
apply from: 'config/testcontainers-deps.gradle'
|
|
236
|
+
```
|
|
237
|
+
<% } %><% } %><% if (language === 'kotlin' && enableDebtGates && buildTool === 'gradle') { %>### Coverage Gate (Kover)
|
|
238
|
+
|
|
239
|
+
Generated `kover.gradle` wires `koverVerify`/`koverXmlReport` as a hard gate (#1887-F).
|
|
240
|
+
|
|
241
|
+
**Setup**: add to `build.gradle`:
|
|
242
|
+
```groovy
|
|
243
|
+
plugins {
|
|
244
|
+
id 'org.jetbrains.kotlinx.kover' version '0.9.8'
|
|
245
|
+
}
|
|
246
|
+
```
|
|
247
|
+
```groovy
|
|
248
|
+
apply from: 'kover.gradle'
|
|
249
|
+
```
|
|
250
|
+
<% } %><% if (language === 'go') { %>### Go
|
|
251
|
+
|
|
252
|
+
- All exported functions must have documentation comments
|
|
253
|
+
- Error handling: check every returned error — no `_ = err` patterns
|
|
254
|
+
- Use `gofmt` for formatting (enforced by CI)
|
|
255
|
+
- Use `golangci-lint` with project-level config
|
|
256
|
+
- Prefer table-driven tests
|
|
257
|
+
- File naming: `snake_case.go`<% if (architectureStyle === 'hexagonal') { %>
|
|
258
|
+
|
|
259
|
+
### Architecture Verification (M22c)
|
|
260
|
+
|
|
261
|
+
Generated depguard config + domain-purity grep enforce hexagonal layer isolation (hard gate, L2+).
|
|
262
|
+
|
|
263
|
+
**Peer deps**: `golangci-lint >= 2.0`
|
|
264
|
+
|
|
265
|
+
**Setup**: the generated `.golangci-boundaries.yml` is placed at the project root. No `go.mod` changes needed.
|
|
266
|
+
|
|
267
|
+
**Rules enforced**:
|
|
268
|
+
|
|
269
|
+
| Layer | Mechanism | What it bans |
|
|
270
|
+
|-------|-----------|-------------|
|
|
271
|
+
| Project (all layers) | depguard `main` rule in `.golangci-boundaries.yml` | Framework imports in business logic (gorm, gin, echo, fiber, …) |
|
|
272
|
+
| `internal/domain/**` | depguard `domain-purity` rule | Framework imports in domain packages |
|
|
273
|
+
| `internal/domain/**` | grep scan in `scripts/check-boundaries.mjs` | `"gorm.io/…"`, `"github.com/gin-gonic/…"`, … — toolchain-free enforcer |
|
|
274
|
+
|
|
275
|
+
**Suppressions**: add exemptions to `suppressions/boundaries-baseline.json` with `scope` (file-pattern glob) + `expiresAt` (wave-migration date). Enforced by `check-suppressions.mjs` L1 gate.
|
|
276
|
+
<% } %><% } %><% if (language === 'python') { %>### Python
|
|
277
|
+
|
|
278
|
+
- Type annotations required on all public function signatures
|
|
279
|
+
- Use `ruff` for linting and formatting
|
|
280
|
+
- Use `pytest` for testing with fixtures over setUp/tearDown
|
|
281
|
+
- No bare `except:` — always specify exception type
|
|
282
|
+
- File naming: `snake_case.py`
|
|
283
|
+
- Prefer dataclasses or Pydantic models for structured data<% if (architectureStyle === 'hexagonal') { %>
|
|
284
|
+
|
|
285
|
+
### Architecture Verification (M22d)
|
|
286
|
+
|
|
287
|
+
Generated `import-linter` + `ruff` banned-api + domain-purity grep enforce hexagonal layer isolation (hard gate, L2+).
|
|
288
|
+
|
|
289
|
+
**Peer deps**: `pip install import-linter` (ruff assumed — required for L1 lint).
|
|
290
|
+
|
|
291
|
+
**Setup**: the generated `.importlinter` and `ruff-boundaries.toml` sit at the project root. **One-time action**: open `.importlinter` and replace `yourpkg` with your actual top-level package name. No `pyproject.toml` changes are made.
|
|
292
|
+
|
|
293
|
+
**Assumed layout**: `src/<pkg>/domain/`, `src/<pkg>/application/`, `src/<pkg>/adapters/`, `src/<pkg>/infrastructure/`. Flat-layout projects must adapt the `src/domain/` path in `scripts/check-boundaries.mjs` and `ruff-boundaries.toml`.
|
|
294
|
+
|
|
295
|
+
**Rules enforced**:
|
|
296
|
+
|
|
297
|
+
| Layer | Mechanism | What it bans |
|
|
298
|
+
|-------|-----------|-------------|
|
|
299
|
+
| `<pkg>.domain` | import-linter `forbidden` contract | Framework modules (django, flask, fastapi, sqlalchemy, httpx, …) |
|
|
300
|
+
| All layers | import-linter `layers` contract | Upward imports (domain cannot import application; application cannot import adapters; …) |
|
|
301
|
+
| `src/domain/**/*.py` | ruff `TID251` banned-api via `ruff-boundaries.toml` | Same framework module list — caught at file granularity with line numbers |
|
|
302
|
+
| `src/domain/**/*.py` | pure-Node grep scan in `check-boundaries.mjs` | `import X`, `from X import …` — enforces L1 without Python deps installed |
|
|
303
|
+
|
|
304
|
+
**Suppressions**: add exemptions to `suppressions/boundaries-baseline.json` with `scope` (file-pattern glob) + `expiresAt` (wave-migration date). Enforced by `check-suppressions.mjs` L1 gate.
|
|
305
|
+
<% } %><% } %>
|
|
306
|
+
|
|
307
|
+
---
|
|
308
|
+
|
|
309
|
+
## Testing Policy
|
|
310
|
+
|
|
311
|
+
<% if (governanceLevel === 'L1') { %>### L1 (Minimal)
|
|
312
|
+
|
|
313
|
+
- Unit tests for all business logic
|
|
314
|
+
- No mocking of internal modules (only external boundaries)
|
|
315
|
+
- Coverage target: 70%<% } %><% if (governanceLevel === 'L2') { %>### L2 (Standard)
|
|
316
|
+
|
|
317
|
+
- Unit tests: 80% coverage minimum
|
|
318
|
+
- Integration tests for all external boundaries (database, APIs)
|
|
319
|
+
- No mocking of internal modules — only boundary mocks
|
|
320
|
+
- TDD preferred: test first, then implement<% } %><% if (governanceLevel === 'L3') { %>### L3 (Full Audit)
|
|
321
|
+
|
|
322
|
+
- Unit tests: 85% coverage minimum
|
|
323
|
+
- Integration tests: all external boundaries covered
|
|
324
|
+
- E2E tests: critical user journeys covered
|
|
325
|
+
- Mutation testing: required (85% score minimum)
|
|
326
|
+
- TDD required: test first is non-negotiable<% } %><% if (governanceLevel === 'L4') { %>### L4 (Audit/Compliance)
|
|
327
|
+
|
|
328
|
+
- Unit tests: 85% coverage minimum
|
|
329
|
+
- Integration tests: all external boundaries covered
|
|
330
|
+
- E2E tests: critical user journeys covered
|
|
331
|
+
- Mutation testing: required (85% score minimum)
|
|
332
|
+
- Evidence harness: all test runs captured, retained, and auditable
|
|
333
|
+
- STRIDE risk assessment: required for auth/external boundary changes
|
|
334
|
+
- TDD required: test first is non-negotiable<% } %>
|
|
335
|
+
|
|
336
|
+
---
|
|
337
|
+
|
|
338
|
+
## Commit Convention
|
|
339
|
+
|
|
340
|
+
```
|
|
341
|
+
type(scope): summary
|
|
342
|
+
|
|
343
|
+
Types: feat, fix, refactor, test, docs, ci, chore, perf
|
|
344
|
+
Scope: optional — module or area affected
|
|
345
|
+
Summary: imperative, lowercase, ≤ 72 chars
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
Examples:
|
|
349
|
+
- `feat(auth): add OAuth2 token refresh`
|
|
350
|
+
- `fix(#123): resolve null pointer in payment flow`
|
|
351
|
+
- `test: add integration tests for user registration`
|
|
352
|
+
|
|
353
|
+
---
|
|
354
|
+
|
|
355
|
+
## Branch Strategy
|
|
356
|
+
|
|
357
|
+
- Main branch: `main` — protected, requires PR + passing CI
|
|
358
|
+
- Task branches: `task/#NNN-short-description`
|
|
359
|
+
- No direct commits to `main`
|
|
360
|
+
|
|
361
|
+
---
|
|
362
|
+
|
|
363
|
+
## Gate System
|
|
364
|
+
|
|
365
|
+
```
|
|
366
|
+
L1 (fast, pre-commit): <%= lintCommand %>
|
|
367
|
+
<%= formatCommand %>
|
|
368
|
+
<%= testCommand %>
|
|
369
|
+
|
|
370
|
+
L2 (full, pre-push): L1 + coverage + audit + integration tests
|
|
371
|
+
|
|
372
|
+
L3 (deep, nightly/CI): L2 + E2E + mutation testing
|
|
373
|
+
|
|
374
|
+
L4 (compliance): L3 + evidence harness + STRIDE risk + TRACK_ROUTER
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
Run locally:
|
|
378
|
+
```bash
|
|
379
|
+
node scripts/check-all.mjs L1 # before commit
|
|
380
|
+
node scripts/check-all.mjs L2 # before push
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
---
|
|
384
|
+
|
|
385
|
+
## Enforcement Chain
|
|
386
|
+
|
|
387
|
+
Changes pass through five enforcement layers:
|
|
388
|
+
|
|
389
|
+
| Layer | Mechanism | Coverage |
|
|
390
|
+
|-------|-----------|----------|
|
|
391
|
+
| Edit-time | Claude Code hooks (`.claude/hooks/`) | Claude Code edits only |
|
|
392
|
+
| Pre-commit | `.githooks/pre-commit` — runs L1 gate | All editors (`git commit`) |
|
|
393
|
+
| Pre-push | `.githooks/pre-push` — runs L2 gate | All pushes |
|
|
394
|
+
| CI | GitHub Actions / equivalent | All PRs |
|
|
395
|
+
| Branch protection | See ADR-007 | Force-push, direct merge |
|
|
396
|
+
|
|
397
|
+
<% if (language === 'typescript') { %>Install hooks: `git config core.hooksPath .githooks` (auto-applied via `npm install` — see `package.json` `prepare` script).
|
|
398
|
+
<% } else { %>Install hooks: `git config core.hooksPath .githooks` (or run `./scripts/setup-hooks.sh`).
|
|
399
|
+
<% } %>Bypass surface: only `git commit --no-verify` (documented, audited at PR review).
|
|
400
|
+
|
|
401
|
+
---
|
|
402
|
+
<% if (enableDebtGates) { -%>
|
|
403
|
+
<% const threshold = isL3Plus ? 85 : 80; -%>
|
|
404
|
+
|
|
405
|
+
## Tech Debt Gates
|
|
406
|
+
|
|
407
|
+
Enforced at L2+ (automated, runs in CI and locally via `node scripts/check-all.mjs L2`):
|
|
408
|
+
|
|
409
|
+
| Check | Tool | Threshold |
|
|
410
|
+
|-------|------|-----------|
|
|
411
|
+
<% if (language === 'typescript') { %>| Coverage | vitest / jest | <%= threshold %>% lines |
|
|
412
|
+
| Complexity | ESLint `complexity` rule | max 15 |
|
|
413
|
+
| Dead Code | Knip | zero unused exports |
|
|
414
|
+
| Circular Deps | madge | zero cycles |
|
|
415
|
+
<% if (isL3Plus) { %>| Mutation testing (Stryker) | @stryker-mutator/core | 85% mutation score |
|
|
416
|
+
<% } %><% } %><% if (language === 'rust') { %>| Coverage | cargo-tarpaulin / llvm-cov | <%= threshold %>% |
|
|
417
|
+
| Complexity | `clippy::pedantic` | enforced |
|
|
418
|
+
| Dead Code | `warn(dead_code)` (clippy) | zero warnings |
|
|
419
|
+
<% if (isL3Plus) { %>| Mutation testing (cargo-mutants) | cargo-mutants (beta) | 85% mutation score |
|
|
420
|
+
<% } %><% } %><% if (language === 'java') { %>| Coverage | JaCoCo | <%= threshold %>% |
|
|
421
|
+
| Complexity | PMD `CyclomaticComplexity` | max 15 |
|
|
422
|
+
| Dead/Unused Code | PMD UnusedCode rules | zero violations |
|
|
423
|
+
<% if (isL3Plus) { %>| Mutation testing (pitest) | PIT 1.15+ | 85% mutation score |
|
|
424
|
+
<% } %><% } %><% if (language === 'go') { %>| Coverage | go test -coverprofile | <%= threshold %>% |
|
|
425
|
+
| Complexity | golangci-lint `gocyclo` | max 15 |
|
|
426
|
+
| Dead Code | golangci-lint `deadcode,unused` | zero findings |
|
|
427
|
+
<% } %><% if (language === 'python') { %>| Coverage | pytest-cov | <%= threshold %>% |
|
|
428
|
+
| Complexity | ruff `C901,PLR` rules | max 15 |
|
|
429
|
+
| Unused Imports | ruff `F401,F811` | zero findings |
|
|
430
|
+
<% if (isL3Plus) { %>| Mutation testing (mutmut) | mutmut (beta) | 85% mutation score |
|
|
431
|
+
<% } %><% } %>
|
|
432
|
+
---
|
|
433
|
+
|
|
434
|
+
## Debt Ratchet
|
|
435
|
+
|
|
436
|
+
Proactive debt regression prevention. Baseline metrics stored in `debt-baseline.json` (commit this file).
|
|
437
|
+
|
|
438
|
+
**Commands:**
|
|
439
|
+
- `node scripts/capture-debt-baseline.mjs` — Capture current metrics as baseline
|
|
440
|
+
- `node scripts/capture-debt-baseline.mjs --update` — Tighten baseline (only accepts improvements, never loosens)
|
|
441
|
+
- `node scripts/debt-report.mjs` — Print current vs baseline comparison report
|
|
442
|
+
- `node scripts/debt-report.mjs --gate` — Fail if any metric regressed (used in L2 gate)
|
|
443
|
+
|
|
444
|
+
**Tracked:** coverage, complexity violations, dead code count, TODO count
|
|
445
|
+
|
|
446
|
+
**Rule:** Never manually edit `debt-baseline.json` to loosen metrics — that defeats the ratchet. Only run `--update` after genuine improvements.
|
|
447
|
+
|
|
448
|
+
---
|
|
449
|
+
<% } %><% if (enableSecurityScanning) { %>
|
|
450
|
+
## Security Scanning (INV-11/12/13)
|
|
451
|
+
|
|
452
|
+
Security gates run as L2+ hard requirements. PII scan is HARD (no grace period) and runs before all other gates.
|
|
453
|
+
|
|
454
|
+
| Scanner | Tool | Gate Level | Trigger |
|
|
455
|
+
|---------|------|-----------|---------|
|
|
456
|
+
| Secrets detection | gitleaks | L2 HARD | `gitleaks detect --source . --baseline-path suppressions/.gitleaksignore` |
|
|
457
|
+
| PII scan | pii-scan.mjs | L2 HARD (no grace) | `node scripts/pii-scan.mjs` |
|
|
458
|
+
<% if (language === 'typescript') { %>| Dep audit | npm audit | L2 HARD | `npm audit --omit=dev --audit-level=high` |
|
|
459
|
+
<% } %><% if (language === 'rust') { %>| Dep audit | cargo audit | L2 HARD | `cargo audit` |
|
|
460
|
+
<% } %><% if (language === 'java' || language === 'kotlin') { %>| Dep audit | Trivy fs | L2 HARD | `trivy fs --scanners vuln --severity HIGH,CRITICAL --exit-code 1 --ignorefile .trivyignore .` |
|
|
461
|
+
<% } %><% if (language === 'go') { %>| Dep audit | govulncheck | L2 HARD | `govulncheck ./...` |
|
|
462
|
+
<% } %><% if (language === 'python') { %>| Dep audit | pip-audit | L2 HARD | `pip-audit` |
|
|
463
|
+
<% } %>
|
|
464
|
+
**Suppression files** (user-edited, not overwritten):
|
|
465
|
+
- `suppressions/.gitleaksignore` — allowlisted gitleaks findings
|
|
466
|
+
- `suppressions/pii-allowlist.json` — allowlisted PII patterns (format: `[{"pattern": "...", "reason": "..."}]`)
|
|
467
|
+
<% if (language === 'java' || language === 'kotlin') { %>
|
|
468
|
+
**Java/Kotlin dep audit**: Trivy fs suppression file: `.trivyignore` (root; format `CVE-ID exp:YYYY-MM-DD # reason=... owner=@handle`, INV-31).
|
|
469
|
+
<% } %>
|
|
470
|
+
**Claude hook**: `check-no-pii.mjs` (PostToolUse, Edit|Write) blocks PII from being written to source files.
|
|
471
|
+
|
|
472
|
+
---
|
|
473
|
+
<% } -%>
|
|
474
|
+
<% { const _lanes = Array.isArray(lanes) ? lanes : []; const _multiLane = _lanes.length >= 2; if (_multiLane) { -%>
|
|
475
|
+
---
|
|
476
|
+
|
|
477
|
+
## Lane Discipline
|
|
478
|
+
|
|
479
|
+
This project uses lane-isolated development. **Cross-stack rule:** if a task touches more than one lane, STOP and split into separate tasks/PRs.
|
|
480
|
+
|
|
481
|
+
| Lane | Scope | Role |
|
|
482
|
+
|------|-------|------|
|
|
483
|
+
<% if (_lanes.includes('frontend')) { %>| **frontend** | `frontend/` | UI — components, styles, client logic |
|
|
484
|
+
<% } %><% if (_lanes.includes('backend')) { %>| **backend** | `backend/` | Server — APIs, domain, persistence |
|
|
485
|
+
<% } %><% if (_lanes.includes('docs')) { %>| **docs** | `docs/` | Documentation (READ-ONLY src, WRITE-ONLY docs) |
|
|
486
|
+
<% } %>
|
|
487
|
+
**Single-lane task**: identify lane, run lane gate, PR touches only that lane's files.
|
|
488
|
+
**Cross-lane task**: STOP → split into N single-lane PRs, one per affected lane.
|
|
489
|
+
<% } } -%>
|
|
490
|
+
|
|
491
|
+
## Multi-Agent Tool Extensions
|
|
492
|
+
|
|
493
|
+
This project uses AGENTS.md as the canonical source. Tool-specific files add only what each tool uniquely needs:
|
|
494
|
+
|
|
495
|
+
| File | Tool | Purpose |
|
|
496
|
+
|------|------|---------|
|
|
497
|
+
| `.claude/CLAUDE.md` | Claude Code | Hook configuration, sub-agents, slash commands |
|
|
498
|
+
| `.agents/CODEX.md` | OpenAI Codex | Plan JSON schema, execution router |
|
|
499
|
+
|
|
500
|
+
When using Claude Code: read `.claude/CLAUDE.md` for Claude-specific configuration.
|
|
501
|
+
When using Codex: read `.agents/CODEX.md` for Codex-specific configuration.
|
|
502
|
+
<% if (typeof installedSkills !== 'undefined' && installedSkills.length > 0) { %>
|
|
503
|
+
|
|
504
|
+
---
|
|
505
|
+
|
|
506
|
+
## Integrations
|
|
507
|
+
|
|
508
|
+
Installed Claude Code skills detected at init time. These replace the corresponding built-in arbiter skill generators — do not regenerate the listed files.
|
|
509
|
+
|
|
510
|
+
| Skill ID | Owner | Role | Replaces |
|
|
511
|
+
|----------|-------|------|---------|
|
|
512
|
+
<% for (const skill of installedSkills) { %>| `<%= skill.skillId %>` | <%= skill.pluginOwner %> | <%= skill.role || '—' %> | <% const skipped = (skippedGenerators || []).filter(s => s.replacedBy === skill.skillId).map(s => '`' + s.generator + '`').join(', '); %><%= skipped || '—' %> |
|
|
513
|
+
<% } %>
|
|
514
|
+
|
|
515
|
+
**Note:** Skill SKILL.md files listed under "Replaces" are not generated — the installed plugin provides superior coverage. Reference the plugin's documentation directly.
|
|
516
|
+
<% } %>
|
|
517
|
+
All governance rules are in **this file**.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Live API e2e (`tests/api/`)
|
|
2
|
+
|
|
3
|
+
Non-mocked end-to-end tests that run against the **real booted binary** over real HTTP.
|
|
4
|
+
Required for service archetypes by **INV-126** (`api-e2e.json` `required:true`).
|
|
5
|
+
|
|
6
|
+
## Why this layer exists
|
|
7
|
+
|
|
8
|
+
Unit and integration tests can be fully green while the running product is broken: a
|
|
9
|
+
field present in the domain/DB but never wired into the HTTP input struct returns `400`,
|
|
10
|
+
and nothing in the mocked test pyramid catches it. This suite closes that gap by asserting
|
|
11
|
+
on responses from the actual server.
|
|
12
|
+
|
|
13
|
+
## Running
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
./tests/api/run.sh
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
`run.sh` builds the binary, boots it (use a throwaway DB and a harness auth-bypass — never
|
|
20
|
+
production credentials), waits for `/health`, runs the suite against `API_BASE_URL`, and
|
|
21
|
+
tears the server down on exit.
|
|
22
|
+
|
|
23
|
+
## The gate
|
|
24
|
+
|
|
25
|
+
`scripts/check-api-e2e.mjs` (INV-126) fails the gate if this suite is **absent or empty**
|
|
26
|
+
for a service archetype. It checks presence + non-emptiness only; the live run happens in
|
|
27
|
+
CI/L2 via `run.sh`. Assertion quality is covered separately by the anti-proforma gate
|
|
28
|
+
(INV-118).
|
|
29
|
+
|
|
30
|
+
## Customising
|
|
31
|
+
|
|
32
|
+
Adapt the boot command in `run.sh` and add real request/response assertions to the starter
|
|
33
|
+
suite file. Keep at least one assertion against a live HTTP response so the gate stays green.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
//go:build apie2e
|
|
2
|
+
// +build apie2e
|
|
3
|
+
|
|
4
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
// Live-API e2e (INV-126): runs against the REAL booted server, no mocks.
|
|
6
|
+
// API_BASE_URL points at the running binary (tests/api/run.sh boots it).
|
|
7
|
+
// Tagged `apie2e` (#1840 F4 tranche-3) so it is excluded from the default
|
|
8
|
+
// `go test ./...` / `go vet ./...` — the generated L1 gate's unit-test step
|
|
9
|
+
// must never require a live server on :8080. tests/api/run.sh passes
|
|
10
|
+
// `-tags apie2e` to run it for real, after booting the binary. Mirrors the
|
|
11
|
+
// `bdd`-tagged suite's isolation pattern (internal/bdd/example_test.go).
|
|
12
|
+
package api_test
|
|
13
|
+
|
|
14
|
+
import (
|
|
15
|
+
"net/http"
|
|
16
|
+
"os"
|
|
17
|
+
"testing"
|
|
18
|
+
"time"
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
func baseURL() string {
|
|
22
|
+
if v := os.Getenv("API_BASE_URL"); v != "" {
|
|
23
|
+
return v
|
|
24
|
+
}
|
|
25
|
+
return "http://127.0.0.1:8080"
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// TestLiveHealth hits the running binary over real HTTP.
|
|
29
|
+
func TestLiveHealth(t *testing.T) {
|
|
30
|
+
client := &http.Client{Timeout: 5 * time.Second}
|
|
31
|
+
resp, err := client.Get(baseURL() + "/health")
|
|
32
|
+
if err != nil {
|
|
33
|
+
t.Fatalf("live request failed (is the binary running?): %v", err)
|
|
34
|
+
}
|
|
35
|
+
defer resp.Body.Close()
|
|
36
|
+
if resp.StatusCode != http.StatusOK {
|
|
37
|
+
t.Fatalf("GET /health: want 200, got %d", resp.StatusCode)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Add real request/response assertions exercising the live HTTP surface here —
|
|
41
|
+
// this layer catches "domain green, HTTP wiring broken" bugs (e.g. a field in
|
|
42
|
+
// the domain/DB never wired into the request input struct).
|
|
43
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Live-API e2e (INV-126): runs against the REAL booted server, no mocks.
|
|
3
|
+
// API_BASE_URL points at the running binary (tests/api/run.sh boots it).
|
|
4
|
+
package <%- basePackage || 'com.example' %>.api;
|
|
5
|
+
|
|
6
|
+
import static io.restassured.RestAssured.given;
|
|
7
|
+
import static org.hamcrest.Matchers.notNullValue;
|
|
8
|
+
|
|
9
|
+
import io.restassured.RestAssured;
|
|
10
|
+
import org.junit.jupiter.api.BeforeAll;
|
|
11
|
+
import org.junit.jupiter.api.Test;
|
|
12
|
+
|
|
13
|
+
class ApiE2ETest {
|
|
14
|
+
|
|
15
|
+
@BeforeAll
|
|
16
|
+
static void configureBaseUri() {
|
|
17
|
+
String base = System.getenv("API_BASE_URL");
|
|
18
|
+
RestAssured.baseURI = (base != null && !base.isEmpty()) ? base : "http://127.0.0.1:8080";
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
@Test
|
|
22
|
+
void healthEndpointReturns200FromRunningBinary() {
|
|
23
|
+
given().when().get("/health").then().statusCode(200).body(notNullValue());
|
|
24
|
+
|
|
25
|
+
// Add real request/response assertions exercising the live HTTP surface here —
|
|
26
|
+
// this layer catches "domain green, HTTP wiring broken" bugs.
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Live-API e2e (INV-126): runs against the REAL booted server, no mocks.
|
|
3
|
+
// API_BASE_URL points at the running binary (tests/api/run.sh boots it).
|
|
4
|
+
package <%- basePackage || 'com.example' %>.api
|
|
5
|
+
|
|
6
|
+
import io.restassured.RestAssured
|
|
7
|
+
import io.restassured.RestAssured.given
|
|
8
|
+
import org.hamcrest.Matchers.notNullValue
|
|
9
|
+
import org.junit.jupiter.api.BeforeAll
|
|
10
|
+
import org.junit.jupiter.api.Test
|
|
11
|
+
|
|
12
|
+
class ApiE2ETest {
|
|
13
|
+
|
|
14
|
+
companion object {
|
|
15
|
+
@JvmStatic
|
|
16
|
+
@BeforeAll
|
|
17
|
+
fun configureBaseUri() {
|
|
18
|
+
val base = System.getenv("API_BASE_URL")
|
|
19
|
+
RestAssured.baseURI = if (!base.isNullOrEmpty()) base else "http://127.0.0.1:8080"
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@Test
|
|
24
|
+
fun healthEndpointReturns200FromRunningBinary() {
|
|
25
|
+
given().`when`().get("/health").then().statusCode(200).body(notNullValue())
|
|
26
|
+
|
|
27
|
+
// Add real request/response assertions exercising the live HTTP surface here —
|
|
28
|
+
// this layer catches "domain green, HTTP wiring broken" bugs.
|
|
29
|
+
}
|
|
30
|
+
}
|