@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,286 @@
|
|
|
1
|
+
# gate-registry.yml.ejs — the DECLARATIVE gate registry (#2041, AC-2041.4).
|
|
2
|
+
#
|
|
3
|
+
# Every gate the generated check-all.mjs runs is declared here: id, display
|
|
4
|
+
# name, lane level, kind, and spawn command. The generator
|
|
5
|
+
# (src/generators/check-all.ts) renders this manifest with the project config
|
|
6
|
+
# (EJS expressions in `cmd` resolve at generation time), validates the shape,
|
|
7
|
+
# and consumes it to emit the gate sections of check-all.mjs — replacing the
|
|
8
|
+
# hardcoded runCheck(...) calls that used to live inline in the template.
|
|
9
|
+
#
|
|
10
|
+
# Entry fields:
|
|
11
|
+
# id kebab-case identifier — used by `--gate <id>` and the layering
|
|
12
|
+
# contract test (scripts/test-gate-layering.mjs).
|
|
13
|
+
# name display name (the runCheck first argument; also accepted by
|
|
14
|
+
# `--gate <name>` for backward compatibility with #2078).
|
|
15
|
+
# level L1 | L2 | L3 — the lane this gate belongs to. Structural
|
|
16
|
+
# containment L1 ⊂ L2 ⊂ L3: `check-all.mjs <level>` runs every
|
|
17
|
+
# gate whose level is <= the requested level.
|
|
18
|
+
# kind check (hard) | warn (advisory) | tool (CI-aware) | inline
|
|
19
|
+
# (custom JS body in the template, declared here for manifest
|
|
20
|
+
# completeness — see the INLINE_BLOCKS section of check-all.mjs).
|
|
21
|
+
# cmd [binary, ...args] — EJS expressions are allowed; rendered at
|
|
22
|
+
# generation time (e.g. `<%%= packageManager %>`).
|
|
23
|
+
# language optional — wraps the gate in `if (language === '<lang>')`.
|
|
24
|
+
# condition optional — raw expression wrapped in `if (<expr>) { ... }`.
|
|
25
|
+
# else optional — raw body emitted in the `else` branch (used by the
|
|
26
|
+
# SKIP-report gates: audit, npm-ci drift, playwright rules).
|
|
27
|
+
# soft true → the gate runs with `{ soft: graceActive }`.
|
|
28
|
+
# promotes_to optional — id of a gate this one REPLACES at runtime once its
|
|
29
|
+
# own level is reached (e.g. an L3 `harness-full` entry with
|
|
30
|
+
# `promotes_to: harness-fast` skips `harness-fast` once the run
|
|
31
|
+
# level is L3+). #9003.
|
|
32
|
+
# audit optional true — an audit-only gate, a second axis orthogonal
|
|
33
|
+
# to level; skipped at runtime when the consumer sets
|
|
34
|
+
# `ARBITER_AUDIT_MODE=off`. #9003.
|
|
35
|
+
#
|
|
36
|
+
# ORDER IS MEANINGFUL: the emitted script runs gates in registry order within
|
|
37
|
+
# each level (the pre-#2041 inline order is preserved).
|
|
38
|
+
#
|
|
39
|
+
# Existing Code Survey (CANON-16): the de-facto registry was the inline
|
|
40
|
+
# runCheck(...) surface of check-all.mjs.ejs (191 calls) — no separate registry
|
|
41
|
+
# file existed; this manifest REPLACES that inline surface (justified by
|
|
42
|
+
# AC-2041.4), it does not duplicate it.
|
|
43
|
+
|
|
44
|
+
gates:
|
|
45
|
+
# ── L1 ─────────────────────────────────────────────────────────────────────
|
|
46
|
+
- { id: pii-scan, name: 'PII scan', level: L1, kind: check, cmd: ['node', ['scripts/pii-scan.mjs']] }
|
|
47
|
+
- { id: secret-scan, name: 'secret scan', level: L1, kind: check, cmd: ['node', ['scripts/check-secret-scan.mjs']] }
|
|
48
|
+
- { id: typecheck, name: typecheck, level: L1, kind: check, language: typescript, cmd: ['npx', ['tsc', '--noEmit']] }
|
|
49
|
+
- { id: format, name: format, level: L1, kind: check, language: typescript, cmd: ['npx', ['prettier', '--check', '.']] }
|
|
50
|
+
- { id: lint, name: lint, level: L1, kind: check, language: typescript, cmd: ['npx', ['eslint', '.']] }
|
|
51
|
+
- { id: static-analysis, name: 'static analysis', level: L1, kind: check, language: typescript, condition: "gateFilePresent('eslint.config.static.mjs', 'static analysis', '[CHECK] static analysis ... SKIP (run: arbiter update)')", cmd: ['npx', ['eslint', '--config', 'eslint.config.static.mjs', '--no-config-lookup', '--no-error-on-unmatched-pattern', 'src']] }
|
|
52
|
+
- { id: no-fake-db-imports, name: 'no-fake-db imports (INV-34)', level: L1, kind: check, language: typescript, condition: "gateFilePresent('eslint.config.no-fake-db.mjs', 'no-fake-db imports (INV-34)')", cmd: ['npx', ['eslint', '--config', 'eslint.config.no-fake-db.mjs', '--no-config-lookup', '--no-error-on-unmatched-pattern', '.']] }
|
|
53
|
+
- { id: unit-tests, name: 'unit tests', level: L1, kind: check, language: typescript, cmd: ['<%= packageManager %>', ['run', 'test:unit']] }
|
|
54
|
+
- { id: npm-ci-drift, name: 'npm-ci drift', level: L1, kind: inline, language: typescript, emitIf: "packageManager === 'npm'", else: "console.log('[CHECK] npm-ci drift ... SKIP (project uses <%= packageManager %>)');\npushResult('npm-ci drift', 'SKIP', 0);" }
|
|
55
|
+
- { id: rust-fmt, name: fmt, level: L1, kind: check, language: rust, cmd: ['cargo', ['fmt', '--check']] }
|
|
56
|
+
- { id: clippy, name: clippy, level: L1, kind: check, language: rust, cmd: ['cargo', ['clippy', '--', '-D', 'warnings']] }
|
|
57
|
+
- { id: rust-unit-tests, name: 'unit tests', level: L1, kind: check, language: rust, cmd: ['cargo', ['test']] }
|
|
58
|
+
- { id: no-unwrap, name: 'no .unwrap()/.expect()', level: L1, kind: check, language: rust, cmd: ['node', ['scripts/checks/check-rust-no-unwrap.mjs']] }
|
|
59
|
+
- { id: no-unsafe, name: 'no unsafe', level: L1, kind: check, language: rust, cmd: ['node', ['scripts/checks/check-rust-no-unsafe.mjs']] }
|
|
60
|
+
- { id: gradle-checkstyle, name: checkstyle, level: L1, kind: check, emitIf: "language === 'java' && buildTool === 'gradle'", cmd: ['./gradlew', ['checkstyleMain', '-q']] }
|
|
61
|
+
- { id: gradle-spotless, name: 'format (spotless)', level: L1, kind: check, emitIf: "language === 'java' && buildTool === 'gradle'", cmd: ['./gradlew', ['spotlessCheck', '-q']] }
|
|
62
|
+
- { id: gradle-unit-tests, name: 'unit tests', level: L1, kind: check, emitIf: "language === 'java' && buildTool === 'gradle'", cmd: ['./gradlew', ['test', '-q']] }
|
|
63
|
+
- { id: maven-checkstyle, name: checkstyle, level: L1, kind: check, emitIf: "language === 'java' && buildTool === 'maven'", cmd: ['mvn', ['checkstyle:check', '-q']] }
|
|
64
|
+
- { id: maven-spotless, name: 'format (spotless)', level: L1, kind: check, emitIf: "language === 'java' && buildTool === 'maven'", cmd: ['mvn', ['spotless:check', '-q']] }
|
|
65
|
+
- { id: maven-unit-tests, name: 'unit tests', level: L1, kind: check, emitIf: "language === 'java' && buildTool === 'maven'", cmd: ['mvn', ['test', '-q']] }
|
|
66
|
+
- { id: go-vet, name: vet, level: L1, kind: check, language: go, cmd: ['go', ['vet', './...']] }
|
|
67
|
+
- { id: golangci-lint, name: lint, level: L1, kind: check, language: go, cmd: ['golangci-lint', ['run']] }
|
|
68
|
+
- { id: gofmt, name: 'fmt (gofmt)', level: L1, kind: inline, language: go }
|
|
69
|
+
- { id: go-unit-tests, name: 'unit tests', level: L1, kind: check, language: go, cmd: ['go', ['test', './...']] }
|
|
70
|
+
- { id: ruff-lint, name: lint, level: L1, kind: check, language: python, cmd: ['ruff', ['check', '.']] }
|
|
71
|
+
- { id: ruff-format, name: format, level: L1, kind: check, language: python, cmd: ['ruff', ['format', '--check', '.']] }
|
|
72
|
+
- { id: pytest-unit-tests, name: 'unit tests', level: L1, kind: check, language: python, cmd: ['pytest', []] }
|
|
73
|
+
- { id: kotlin-unit-tests, name: 'unit tests', level: L1, kind: check, emitIf: "language === 'kotlin' && buildTool === 'gradle'", cmd: ['./gradlew', ['test', '-q']] }
|
|
74
|
+
- { id: detekt, name: 'detekt (beta)', level: L1, kind: check, emitIf: "language === 'kotlin' && buildTool === 'gradle'", soft: true, cmd: ['./gradlew', ['detekt']] }
|
|
75
|
+
- { id: no-tracked-artifacts, name: 'no tracked artifacts (INV-129)', level: L1, kind: check, cmd: ['node', ['scripts/check-no-tracked-artifacts.mjs']] }
|
|
76
|
+
- { id: image-pins, name: 'image pins (#1442)', level: L1, kind: check, cmd: ['node', ['scripts/check-image-pins.mjs']] }
|
|
77
|
+
- { id: e2e-quarantine, name: 'e2e quarantine (INV-130)', level: L1, kind: check, cmd: ['node', ['scripts/check-e2e-quarantine.mjs']] }
|
|
78
|
+
- { id: test-naming, name: 'test naming', level: L1, kind: check, cmd: ['node', ['scripts/check-test-naming.mjs']] }
|
|
79
|
+
- { id: min-test-execution, name: 'min test execution (INV-25)', level: L1, kind: check, cmd: ['node', ['scripts/check-min-test-execution.mjs']] }
|
|
80
|
+
- { id: exit-code-contract, name: 'exit code contract', level: L1, kind: check, cmd: ['node', ['scripts/check-exit-code-contract.mjs']] }
|
|
81
|
+
- { id: pipe-tee-hazard, name: 'pipe/tee hazard', level: L1, kind: check, cmd: ['node', ['scripts/check-pipe-tee-hazard.mjs']] }
|
|
82
|
+
- { id: self-validation-drill, name: 'self-validation drill', level: L1, kind: check, emitIf: "typeof enableSelfValidationHarness === 'undefined' || enableSelfValidationHarness !== false", cmd: ['node', ['scripts/self-validation.mjs']] }
|
|
83
|
+
- { id: config-drift, name: 'config drift', level: L1, kind: check, cmd: ['node', ['scripts/check-drift.mjs']] }
|
|
84
|
+
- { id: validator-helptext, name: 'validator help text', level: L1, kind: check, cmd: ['node', ['scripts/check-validator-helptext.mjs']] }
|
|
85
|
+
- { id: audit-toolchain, name: 'audit toolchain', level: L1, kind: warn, emitIf: "typeof enableAuditToolchain !== 'undefined' && enableAuditToolchain", cmd: ['node', ['scripts/audit-toolchain.mjs']] }
|
|
86
|
+
- { id: frontend-lane, name: 'frontend lane', level: L1, kind: check, emitIf: "_isSubtreeFE", cmd: ['node', ['scripts/check-frontend-lane.mjs']] }
|
|
87
|
+
- { id: lint-css, name: 'lint:css', level: L1, kind: tool, emitIf: "_isFE && language === 'typescript'", condition: "gateFilePresent('.stylelintrc.json', 'lint:css', null, ['.stylelintrc'])", cmd: ['npx', ['stylelint', '--allow-empty-input', 'src/**/*.css']] }
|
|
88
|
+
- { id: fsd-boundaries, name: 'fsd boundaries', level: L1, kind: check, emitIf: "_isFE && language === 'typescript'", condition: "gateFilePresent('eslint.config.frontend-spa.mjs', 'fsd boundaries')", cmd: ['npx', ['eslint', '--config', 'eslint.config.frontend-spa.mjs', '--no-config-lookup', '<%= _feGlob %>']] }
|
|
89
|
+
- { id: playwright-rules, name: 'playwright rules', level: L1, kind: inline, emitIf: "_isFE && language === 'typescript'" }
|
|
90
|
+
- { id: suppressions-expiry, name: 'suppressions expiry', level: L1, kind: check, emitIf: "enableSuppressions", cmd: ['node', ['scripts/check-suppressions.mjs']] }
|
|
91
|
+
- { id: suppression-rationale, name: 'suppression rationale', level: L1, kind: check, emitIf: "enableSuppressions", cmd: ['node', ['scripts/check-suppression-rationale.mjs']] }
|
|
92
|
+
- { id: suppression-expiry-antidrift, name: 'suppression expiry (anti-drift)', level: L1, kind: check, emitIf: "enableSuppressions", cmd: ['node', ['scripts/check-suppression-expiry.mjs']] }
|
|
93
|
+
- { id: inline-suppressions, name: 'inline suppressions', level: L1, kind: check, cmd: ['node', ['scripts/check-inline-suppressions.mjs']] }
|
|
94
|
+
- { id: claude-md-lint, name: 'claude-md lint', level: L1, kind: check, cmd: ['node', ['scripts/check-claude-md-lint.mjs']] }
|
|
95
|
+
- { id: unwired-guards, name: 'unwired guards', level: L1, kind: check, cmd: ['node', ['scripts/check-unwired-guards.mjs']] }
|
|
96
|
+
- { id: workflow-runners-inline, name: 'workflow runners', level: L1, kind: inline }
|
|
97
|
+
- { id: ci-alignment, name: 'ci alignment', level: L1, kind: inline }
|
|
98
|
+
- { id: ssot-core-set, name: 'ssot core set', level: L1, kind: check, cmd: ['node', ['scripts/check-ssot-core.mjs']] }
|
|
99
|
+
- { id: doc-links, name: 'doc links', level: L1, kind: check, cmd: ['node', ['scripts/check-doc-links.mjs']] }
|
|
100
|
+
- { id: knowledge-map, name: 'knowledge map', level: L1, kind: check, cmd: ['node', ['scripts/check-knowledge-map.mjs']] }
|
|
101
|
+
- { id: canonical-paths, name: 'canonical paths', level: L1, kind: check, cmd: ['node', ['scripts/check-canonical-paths.mjs']] }
|
|
102
|
+
- { id: collab-mode-wired, name: 'collab mode wired (INV-100)', level: L1, kind: check, cmd: ['node', ['scripts/check-collab-mode-wired.mjs']] }
|
|
103
|
+
- { id: hook-routing, name: 'hook routing (#2129)', level: L1, kind: check, cmd: ['node', ['scripts/check-hook-routing.mjs']] }
|
|
104
|
+
- { id: safety-adopt-ratchet, name: 'safety adopt ratchet', level: L1, kind: check, cmd: ['node', ['scripts/check-safety-adopt-ratchet.mjs']] }
|
|
105
|
+
- { id: emission-parity, name: 'emission parity (#2110)', level: L1, kind: check, cmd: ['node', ['scripts/check-emission-parity.mjs']] }
|
|
106
|
+
- { id: constraint-scan, name: 'constraint scan (INV-115)', level: L1, kind: check, cmd: ['node', ['scripts/check-constraint-scan.mjs']] }
|
|
107
|
+
- { id: wiki-lint, name: 'wiki lint (INV-116)', level: L1, kind: check, emitIf: "governanceLevel !== 'L1'", cmd: ['node', ['scripts/check-wiki-lint.mjs']] }
|
|
108
|
+
- { id: doc-index-drift, name: 'documentation index drift', level: L1, kind: check, emitIf: "governanceLevel !== 'L1'", condition: "existsSync('docs/INDEX.md')", cmd: ['node', ['scripts/gen-doc-index.mjs', '--check']] }
|
|
109
|
+
- { id: llms-txt-drift, name: 'llms.txt drift', level: L1, kind: check, emitIf: "governanceLevel !== 'L1'", condition: "existsSync('llms.txt')", cmd: ['node', ['scripts/gen-llms-txt.mjs', '--check']] }
|
|
110
|
+
- { id: anti-proforma, name: 'anti-proforma (INV-118)', level: L1, kind: check, cmd: ['node', ['scripts/check-anti-proforma.mjs']] }
|
|
111
|
+
- { id: test-pyramid, name: 'test pyramid (INV-124)', level: L1, kind: check, cmd: ['node', ['scripts/check-test-pyramid.mjs']] }
|
|
112
|
+
- { id: test-scope-tier, name: 'test scope-tier (INV-124)', level: L1, kind: check, cmd: ['node', ['scripts/check-test-scope-tier.mjs']] }
|
|
113
|
+
- { id: api-e2e, name: 'api e2e (INV-126)', level: L1, kind: check, cmd: ['node', ['scripts/check-api-e2e.mjs']] }
|
|
114
|
+
- { id: domain-api-surface, name: 'domain-api surface (INV-125)', level: L1, kind: check, emitIf: "hasPublicApi", cmd: ['node', ['scripts/check-domain-api-surface.mjs']] }
|
|
115
|
+
- { id: render-smoke-presence, name: 'render smoke presence (INV-127)', level: L1, kind: check, cmd: ['node', ['scripts/check-render-smoke.mjs']] }
|
|
116
|
+
- { id: smoke-journeys, name: 'smoke journeys (INV-137)', level: L1, kind: check, cmd: ['node', ['scripts/check-smoke-journeys.mjs']] }
|
|
117
|
+
- { id: e2e-escalation, name: 'e2e escalation ladder (#2043)', level: L1, kind: check, cmd: ['node', ['scripts/check-e2e-escalation.mjs']] }
|
|
118
|
+
- { id: m16-handoff, name: 'M16 handoff-contract marker (#2103)', level: L1, kind: check, cmd: ['node', ['scripts/check-m16-handoff.mjs']] }
|
|
119
|
+
- { id: stack-conformity, name: 'stack conformity (INV-121)', level: L1, kind: check, emitIf: "language", cmd: ['node', ['scripts/check-stack-conformity.mjs']] }
|
|
120
|
+
- { id: iso9001, name: 'iso9001 QMS (RTM + doc-control + CAPA)', level: L1, kind: check, condition: "gateFilePresent('scripts/check-iso9001.mjs', 'iso9001 QMS (RTM + doc-control + CAPA)')", cmd: ['node', ['scripts/check-iso9001.mjs']] }
|
|
121
|
+
- { id: regulated-overlay, name: 'regulated overlay (SoD + retention + signing + mutation)', level: L1, kind: check, condition: "gateFilePresent('scripts/check-regulated-overlay.mjs', 'regulated overlay (SoD + retention + signing + mutation)')", cmd: ['node', ['scripts/check-regulated-overlay.mjs']] }
|
|
122
|
+
- { id: ci-tiers, name: 'ci tiers (INV-73)', level: L1, kind: check, emitIf: "_hasGitHubWorkflows", cmd: ['node', ['scripts/check-ci-tiers.mjs']] }
|
|
123
|
+
- { id: action-pins, name: 'action pins (INV-76)', level: L1, kind: check, emitIf: "_hasGitHubWorkflows", cmd: ['node', ['scripts/check-action-pins.mjs']] }
|
|
124
|
+
- { id: workflow-perms, name: 'workflow perms (INV-77)', level: L1, kind: check, emitIf: "_hasGitHubWorkflows", cmd: ['node', ['scripts/check-workflow-perms.mjs']] }
|
|
125
|
+
- { id: workflow-runners, name: 'workflow runners', level: L1, kind: check, emitIf: "_hasGitHubWorkflows", cmd: ['node', ['scripts/check-workflow-runners.mjs']] }
|
|
126
|
+
- { id: workflow-docs-sync, name: 'workflow docs sync', level: L1, kind: check, emitIf: "_hasGitHubWorkflows", cmd: ['node', ['scripts/check-workflow-docs-sync.mjs']] }
|
|
127
|
+
- { id: workflow-test-integrity, name: 'workflow test integrity', level: L1, kind: check, emitIf: "_hasGitHubWorkflows", cmd: ['node', ['scripts/check-workflow-test-integrity.mjs']] }
|
|
128
|
+
- { id: secret-presence, name: 'secret presence (fail-loud)', level: L1, kind: check, emitIf: "_hasGitHubWorkflows", cmd: ['node', ['scripts/check-secret-presence.mjs']] }
|
|
129
|
+
- { id: continue-on-error, name: 'continue-on-error (swallowed gate)', level: L1, kind: check, emitIf: "_hasGitHubWorkflows", cmd: ['node', ['scripts/check-continue-on-error.mjs']] }
|
|
130
|
+
- { id: workflow-sha-pinning, name: 'workflow sha pinning', level: L1, kind: check, emitIf: "_hasGitHubWorkflows", cmd: ['node', ['scripts/check-workflow-sha-pinning.mjs']] }
|
|
131
|
+
- { id: workflow-job-naming, name: 'workflow job naming', level: L1, kind: check, emitIf: "_hasGitHubWorkflows", cmd: ['node', ['scripts/check-workflow-job-naming.mjs']] }
|
|
132
|
+
- { id: pr-size-gate, name: 'pr size gate', level: L1, kind: check, emitIf: "_hasGitHubWorkflows", cmd: ['node', ['scripts/check-pr-size-gate.mjs']] }
|
|
133
|
+
- { id: merge-method-ff-only, name: 'merge method ff-only (INV-101)', level: L1, kind: check, emitIf: "_hasGitHubWorkflows && governanceLevel !== 'L1'", cmd: ['node', ['scripts/check-merge-method.mjs']] }
|
|
134
|
+
- { id: muted-test, name: 'muted gate test (anti-fake-green)', level: L1, kind: check, cmd: ['node', ['scripts/check-muted-test.mjs']] }
|
|
135
|
+
- { id: skip-critical-e2e, name: 'skipped critical e2e (anti-fake-green)', level: L1, kind: check, cmd: ['node', ['scripts/check-skip-critical-e2e.mjs']] }
|
|
136
|
+
- { id: stub-redirect-husk, name: 'stub redirect husk (anti-fake-green)', level: L1, kind: check, cmd: ['node', ['scripts/check-no-stub-redirects.mjs']] }
|
|
137
|
+
- { id: grace-window, name: 'grace window (anti-fake-green)', level: L1, kind: check, cmd: ['node', ['scripts/check-grace-window.mjs']] }
|
|
138
|
+
- { id: assertion-delta, name: 'assertion delta (anti-fake-green)', level: L1, kind: check, cmd: ['node', ['scripts/check-assertion-delta.mjs']] }
|
|
139
|
+
- { id: oracle-discrimination, name: 'oracle discrimination (anti-fake-green)', level: L1, kind: check, emitIf: "archetype === 'frontend-spa' || archetype === 'backend-web-db'", cmd: ['node', ['scripts/check-oracle-discrimination.mjs']] }
|
|
140
|
+
|
|
141
|
+
- { id: tabletop-evidence, name: 'tabletop evidence (#2429)', level: L1, kind: check, cmd: ['node', ['scripts/check-tabletop-evidence.mjs']] }
|
|
142
|
+
- { id: sources, name: 'source certification (INV-147)', level: L1, kind: check, cmd: ['node', ['scripts/check-sources.mjs']] }
|
|
143
|
+
- { id: use-cases, name: 'use cases (INV-149)', level: L1, kind: check, cmd: ['node', ['scripts/check-use-cases.mjs']] }
|
|
144
|
+
- { id: milestones, name: 'milestones (INV-146)', level: L1, kind: check, cmd: ['node', ['scripts/check-milestones.mjs']] }
|
|
145
|
+
|
|
146
|
+
# ── L2 ─────────────────────────────────────────────────────────────────────
|
|
147
|
+
- { id: gitleaks, name: gitleaks, level: L2, kind: check, emitIf: "enableSecurityScanning", soft: true, cmd: ['gitleaks', ['detect', '--source', '.', '--config', '.gitleaks.toml', '--gitleaks-ignore-path', 'suppressions/.gitleaksignore', '--exit-code', '1']] }
|
|
148
|
+
- { id: npm-audit, name: audit, level: L2, kind: inline, emitIf: "language === 'typescript' && enableSecurityScanning" }
|
|
149
|
+
- { id: consumer-audit, name: 'consumer audit', level: L2, kind: check, emitIf: "language === 'typescript' && archetype === 'library' && governanceLevel !== 'L1'", cmd: ['node', ['scripts/check-consumer-audit.mjs']] }
|
|
150
|
+
- { id: ts-boundaries, name: boundaries, level: L2, kind: check, emitIf: "language === 'typescript' && architectureStyle === 'hexagonal'", soft: true, cmd: ['node', ['scripts/check-boundaries.mjs']] }
|
|
151
|
+
- { id: contract-tests-ts, name: 'contract tests', level: L2, kind: check, emitIf: "language === 'typescript'", soft: true, cmd: ['<%= packageManager %>', ['run', 'test:contract']] }
|
|
152
|
+
- { id: integration-tests-ts, name: 'integration tests', level: L2, kind: check, emitIf: "language === 'typescript'", soft: true, cmd: ['<%= packageManager %>', ['run', 'test:integration']] }
|
|
153
|
+
- { id: behavioral-tests-ts, name: 'behavioral tests', level: L2, kind: check, emitIf: "language === 'typescript'", soft: true, cmd: ['<%= packageManager %>', ['run', 'test:behavioral']] }
|
|
154
|
+
- { id: db-integration-tests, name: 'db integration tests', level: L2, kind: check, emitIf: "language === 'typescript' && hasDatabase && governanceLevel !== 'L1'", soft: true, cmd: ['<%= packageManager %>', ['run', 'test:integration']] }
|
|
155
|
+
- { id: fe-boundaries, name: 'fe boundaries (INV-102/103/104)', level: L2, kind: check, emitIf: "_isFE && governanceLevel !== 'L1'", condition: "gateFilePresent('scripts/check-fe-boundaries.mjs', 'fe boundaries (INV-102/103/104)')", soft: true, cmd: ['node', ['scripts/check-fe-boundaries.mjs']] }
|
|
156
|
+
- { id: token-discipline, name: 'token discipline (INV-105)', level: L2, kind: check, emitIf: "_isFE && governanceLevel !== 'L1'", condition: "gateFilePresent('scripts/verify-tokens.mjs', 'token discipline (INV-105)')", soft: true, cmd: ['node', ['scripts/verify-tokens.mjs']] }
|
|
157
|
+
- { id: i18n-literals, name: 'i18n literals (INV-106)', level: L2, kind: check, emitIf: "_isFE && governanceLevel !== 'L1'", condition: "gateFilePresent('scripts/i18n-literal-scanner.mjs', 'i18n literals (INV-106)')", soft: true, cmd: ['node', ['scripts/i18n-literal-scanner.mjs']] }
|
|
158
|
+
- { id: i18n-parity, name: 'i18n parity (INV-106)', level: L2, kind: check, emitIf: "_isFE && governanceLevel !== 'L1'", condition: "gateFilePresent('scripts/verify-i18n-parity.mjs', 'i18n parity (INV-106)')", soft: true, cmd: ['node', ['scripts/verify-i18n-parity.mjs']] }
|
|
159
|
+
- { id: fe-coverage-ratchet, name: 'fe coverage ratchet', level: L2, kind: check, emitIf: "_isFE && governanceLevel !== 'L1'", condition: "gateFilePresent('scripts/verify-fe-coverage.mjs', 'fe coverage ratchet') && existsSync('fe-coverage-baseline.json')", soft: true, cmd: ['node', ['scripts/verify-fe-coverage.mjs']] }
|
|
160
|
+
- { id: bundle-size-budget, name: 'bundle size budget', level: L2, kind: check, emitIf: "_isFE && governanceLevel !== 'L1'", condition: "gateFilePresent('scripts/check-bundle-size.mjs', 'bundle size budget') && gateFilePresent('bundle-budget.json', 'bundle size budget')", soft: true, cmd: ['node', ['scripts/check-bundle-size.mjs']] }
|
|
161
|
+
- { id: playwright-e2e, name: 'playwright e2e', level: L2, kind: inline, emitIf: "language === 'typescript' && (archetype === 'frontend-spa' || archetype === 'backend-web-db') && governanceLevel !== 'L1'" }
|
|
162
|
+
- { id: cargo-audit, name: audit, level: L2, kind: check, emitIf: "language === 'rust' && enableSecurityScanning", soft: true, cmd: ['cargo', ['audit']] }
|
|
163
|
+
- { id: rust-boundaries, name: boundaries, level: L2, kind: check, emitIf: "language === 'rust' && architectureStyle === 'hexagonal'", soft: true, cmd: ['node', ['scripts/check-boundaries.mjs']] }
|
|
164
|
+
- { id: rust-integration-tests, name: 'integration tests', level: L2, kind: check, emitIf: "language === 'rust' && hasDatabase && governanceLevel !== 'L1'", soft: true, cmd: ['cargo', ['test', '--tests']] }
|
|
165
|
+
- { id: gradle-integration, name: integration, level: L2, kind: check, emitIf: "language === 'java' && buildTool === 'gradle' && hasDatabase && governanceLevel !== 'L1'", soft: true, cmd: ['./gradlew', ['integrationTest', '-q']] }
|
|
166
|
+
- { id: gradle-arch-tests, name: 'architecture tests', level: L2, kind: check, emitIf: "language === 'java' && buildTool === 'gradle' && architectureStyle !== 'none' && basePackage", soft: true, cmd: ['./gradlew', ['test', '--tests', '*.architecture.*', '-q']] }
|
|
167
|
+
- { id: trivy-gradle, name: 'dep audit (trivy fs)', level: L2, kind: check, emitIf: "language === 'java' && buildTool === 'gradle' && enableSecurityScanning", soft: true, cmd: ['trivy', ['fs', '--scanners', 'vuln', '--severity', 'HIGH,CRITICAL', '--exit-code', '1', '--ignorefile', '.trivyignore', '.']] }
|
|
168
|
+
- { id: maven-integration, name: integration, level: L2, kind: check, emitIf: "language === 'java' && buildTool === 'maven' && hasDatabase && governanceLevel !== 'L1'", soft: true, cmd: ['mvn', ['verify', '-q']] }
|
|
169
|
+
- { id: maven-arch-tests, name: 'architecture tests', level: L2, kind: check, emitIf: "language === 'java' && buildTool === 'maven' && architectureStyle !== 'none' && basePackage", soft: true, cmd: ['mvn', ['test', '-Dtest=*.architecture.*', '-q']] }
|
|
170
|
+
- { id: trivy-maven, name: 'dep audit (trivy fs)', level: L2, kind: check, emitIf: "language === 'java' && buildTool === 'maven' && enableSecurityScanning", soft: true, cmd: ['trivy', ['fs', '--scanners', 'vuln', '--severity', 'HIGH,CRITICAL', '--exit-code', '1', '--ignorefile', '.trivyignore', '.']] }
|
|
171
|
+
- { id: staticcheck, name: staticcheck, level: L2, kind: check, emitIf: "language === 'go'", soft: true, cmd: ['staticcheck', ['./...']] }
|
|
172
|
+
- { id: govulncheck, name: 'dep audit', level: L2, kind: check, emitIf: "language === 'go' && enableSecurityScanning", soft: true, cmd: ['govulncheck', ['./...']] }
|
|
173
|
+
- { id: go-boundaries, name: boundaries, level: L2, kind: check, emitIf: "language === 'go' && architectureStyle === 'hexagonal'", soft: true, cmd: ['node', ['scripts/check-boundaries.mjs']] }
|
|
174
|
+
- { id: go-integration-tests, name: 'integration tests', level: L2, kind: check, emitIf: "language === 'go' && hasDatabase && governanceLevel !== 'L1'", soft: true, cmd: ['go', ['test', '-tags', 'integration', '-run', 'Integration', './...']] }
|
|
175
|
+
- { id: pip-audit, name: audit, level: L2, kind: check, emitIf: "language === 'python' && enableSecurityScanning", soft: true, cmd: ['pip-audit', []] }
|
|
176
|
+
- { id: python-boundaries, name: boundaries, level: L2, kind: check, emitIf: "language === 'python' && architectureStyle === 'hexagonal'", soft: true, cmd: ['node', ['scripts/check-boundaries.mjs']] }
|
|
177
|
+
- { id: python-integration-tests, name: 'integration tests', level: L2, kind: check, emitIf: "language === 'python' && hasDatabase && governanceLevel !== 'L1'", soft: true, cmd: ['pytest', ['tests/integration/']] }
|
|
178
|
+
- { id: pytest-playwright-e2e, name: 'pytest-playwright e2e', level: L2, kind: inline, emitIf: "language === 'python' && (archetype === 'frontend-spa' || archetype === 'backend-web-db')" }
|
|
179
|
+
- { id: kotlin-arch-tests, name: 'architecture tests (beta)', level: L2, kind: check, emitIf: "language === 'kotlin' && buildTool === 'gradle' && architectureStyle !== 'none' && basePackage", soft: true, cmd: ['./gradlew', ['test', '--tests', '*.architecture.*', '-q']] }
|
|
180
|
+
- { id: trivy-kotlin, name: 'dep audit (trivy fs)', level: L2, kind: check, emitIf: "language === 'kotlin' && buildTool === 'gradle' && enableSecurityScanning", soft: true, cmd: ['trivy', ['fs', '--scanners', 'vuln', '--severity', 'HIGH,CRITICAL', '--exit-code', '1', '--ignorefile', '.trivyignore', '.']] }
|
|
181
|
+
- { id: coverage-threshold, name: 'coverage threshold', level: L2, kind: inline, emitIf: "language === 'typescript' && coverageEnabled && enableDebtGates" }
|
|
182
|
+
- { id: dead-code, name: 'dead code', level: L2, kind: check, emitIf: "language === 'typescript' && enableDebtGates", soft: true, cmd: ['npx', ['knip']] }
|
|
183
|
+
- { id: duplication, name: duplication, level: L2, kind: check, emitIf: "language === 'typescript' && enableDebtGates", soft: true, cmd: ['node', ['scripts/check-duplication.mjs']] }
|
|
184
|
+
- { id: circular-deps, name: 'circular deps', level: L2, kind: check, emitIf: "language === 'typescript' && enableDebtGates", soft: true, cmd: ['npx', ['madge', '--circular', '--extensions', 'ts,tsx,js,jsx', 'src']] }
|
|
185
|
+
- { id: arch-boundaries, name: 'arch boundaries', level: L2, kind: check, emitIf: "language === 'typescript' && enableDebtGates", soft: true, cmd: ['<%= packageManager %>', ['run', 'check:arch']] }
|
|
186
|
+
- { id: tarpaulin, name: 'coverage threshold', level: L2, kind: check, emitIf: "language === 'rust' && coverageEnabled && enableDebtGates", soft: true, cmd: ['cargo', ['tarpaulin', '--fail-under', '<%= coverageThreshold %>']] }
|
|
187
|
+
- { id: clippy-pedantic, name: 'clippy pedantic', level: L2, kind: check, emitIf: "language === 'rust' && enableDebtGates", soft: true, cmd: ['cargo', ['clippy', '--', '-W', 'clippy::pedantic', '-D', 'warnings']] }
|
|
188
|
+
- { id: binary-size, name: 'binary size', level: L2, kind: inline, emitIf: "language === 'rust' && (archetype === 'cli' || archetype === 'embedded')" }
|
|
189
|
+
- { id: jacoco, name: coverage, level: L2, kind: check, emitIf: "language === 'java' && buildTool === 'gradle' && coverageEnabled && enableDebtGates", soft: true, cmd: ['./gradlew', ['jacocoTestCoverageVerification', '-q']] }
|
|
190
|
+
- { id: pmd-gradle, name: pmd, level: L2, kind: check, emitIf: "language === 'java' && buildTool === 'gradle' && enableDebtGates", soft: true, cmd: ['./gradlew', ['pmdMain', '-q']] }
|
|
191
|
+
- { id: spotbugs, name: spotbugs, level: L2, kind: check, emitIf: "language === 'java' && buildTool === 'gradle' && enableDebtGates", soft: true, cmd: ['./gradlew', ['spotbugsMain', '-q']] }
|
|
192
|
+
- { id: spotbugs-baseline, name: 'spotbugs baseline (INV-44)', level: L2, kind: check, emitIf: "language === 'java' && (buildTool === 'gradle' || buildTool === 'maven') && enableDebtGates", soft: true, cmd: ['node', ['scripts/verify-spotbugs.mjs']] }
|
|
193
|
+
- { id: jacoco-maven, name: coverage, level: L2, kind: check, emitIf: "language === 'java' && buildTool === 'maven' && coverageEnabled && enableDebtGates", soft: true, cmd: ['mvn', ['verify', '-Pjacoco', '-q']] }
|
|
194
|
+
- { id: pmd-maven, name: pmd, level: L2, kind: check, emitIf: "language === 'java' && buildTool === 'maven' && enableDebtGates", soft: true, cmd: ['mvn', ['pmd:check', '-q']] }
|
|
195
|
+
- { id: spotbugs-maven, name: spotbugs, level: L2, kind: check, emitIf: "language === 'java' && buildTool === 'maven' && enableDebtGates", soft: true, cmd: ['mvn', ['com.github.spotbugs:spotbugs-maven-plugin:check', '-q']] }
|
|
196
|
+
- { id: go-coverage, name: 'coverage profile', level: L2, kind: inline, emitIf: "language === 'go' && coverageEnabled && enableDebtGates" }
|
|
197
|
+
- { id: gocyclo, name: 'complexity + dead code', level: L2, kind: check, emitIf: "language === 'go' && enableDebtGates", soft: true, cmd: ['golangci-lint', ['run', '--enable', 'gocyclo,gocognit,unused']] }
|
|
198
|
+
- { id: pytest-coverage, name: 'coverage threshold', level: L2, kind: check, emitIf: "language === 'python' && coverageEnabled && enableDebtGates", soft: true, cmd: ['pytest', ['--cov', '--cov-fail-under=<%= coverageThreshold %>', '--cov-report=html:coverage/html', '--cov-report=xml:coverage/coverage.xml']] }
|
|
199
|
+
- { id: ruff-complexity, name: complexity, level: L2, kind: check, emitIf: "language === 'python' && enableDebtGates", soft: true, cmd: ['ruff', ['check', '--select', 'C901,PLR0911,PLR0912,PLR0913,PLR0915', '.']] }
|
|
200
|
+
- { id: ruff-unused-imports, name: 'unused imports', level: L2, kind: check, emitIf: "language === 'python' && enableDebtGates", soft: true, cmd: ['ruff', ['check', '--select', 'F401,F811', '.']] }
|
|
201
|
+
- { id: kover, name: 'coverage (kover, beta)', level: L2, kind: check, emitIf: "language === 'kotlin' && buildTool === 'gradle' && coverageEnabled && enableDebtGates", soft: true, cmd: ['./gradlew', ['koverVerify', 'koverXmlReport']] }
|
|
202
|
+
- { id: mutation-stryker, name: 'mutation (stryker)', level: L2, kind: tool, emitIf: "(typeof mutationEnabled !== 'undefined' && mutationEnabled) && (typeof enableMutationTesting === 'undefined' || enableMutationTesting !== false) && language === 'typescript' && enableDebtGates", soft: true, cmd: ['npx', ['stryker', 'run']] }
|
|
203
|
+
- { id: mutation-pitest-gradle, name: 'mutation (pitest)', level: L2, kind: check, emitIf: "(typeof mutationEnabled !== 'undefined' && mutationEnabled) && (typeof enableMutationTesting === 'undefined' || enableMutationTesting !== false) && language === 'java' && buildTool === 'gradle' && enableDebtGates", soft: true, cmd: ['./gradlew', ['pitest', '-q']] }
|
|
204
|
+
- { id: mutation-pitest-maven, name: 'mutation (pitest)', level: L2, kind: check, emitIf: "(typeof mutationEnabled !== 'undefined' && mutationEnabled) && (typeof enableMutationTesting === 'undefined' || enableMutationTesting !== false) && language === 'java' && buildTool === 'maven' && enableDebtGates", soft: true, cmd: ['mvn', ['org.pitest:pitest-maven:mutationCoverage', '-q']] }
|
|
205
|
+
- { id: mutation-baseline, name: 'mutation baseline (#1508)', level: L2, kind: check, emitIf: "(typeof mutationEnabled !== 'undefined' && mutationEnabled) && (typeof enableMutationTesting === 'undefined' || enableMutationTesting !== false) && enableDebtGates", condition: "gateFilePresent('scripts/verify-mutation-baseline.mjs', 'mutation baseline (#1508)')", soft: true, cmd: ['node', ['scripts/verify-mutation-baseline.mjs']] }
|
|
206
|
+
- { id: stride-raci, name: 'STRIDE/RACI traceability', level: L2, kind: check, emitIf: "enableDebtGates", soft: true, cmd: ['node', ['scripts/check-stride-traceability.mjs']] }
|
|
207
|
+
- { id: contract-pact-ts, name: 'contract tests (Pact)', level: L2, kind: check, emitIf: "enableDebtGates && language === 'typescript' && (contractType === 'rest-owned' || contractType === 'rest-public')", condition: "process.env.PACT_BROKER_BASE_URL", else: "console.log('[CHECK] contract tests (Pact) ... SKIP — PACT_BROKER_BASE_URL unset');", soft: true, cmd: ['npx', ['pact-broker', 'can-i-deploy', '--pacticipant', '<%= projectName %>', '--latest']] }
|
|
208
|
+
- { id: contract-graphql-ts, name: 'contract tests (GraphQL schema)', level: L2, kind: check, emitIf: "enableDebtGates && language === 'typescript' && contractType === 'graphql'", soft: true, cmd: ['npx', ['graphql-inspector', 'diff', 'schema.graphql']] }
|
|
209
|
+
- { id: contract-grpc-ts, name: 'contract tests (gRPC)', level: L2, kind: check, emitIf: "enableDebtGates && language === 'typescript' && contractType === 'grpc'", soft: true, cmd: ['npx', ['buf', 'breaking', '--against', '.git#branch=main']] }
|
|
210
|
+
- { id: contract-schema-registry-ts, name: 'contract tests (Schema Registry)', level: L2, kind: check, emitIf: "enableDebtGates && language === 'typescript' && contractType === 'message-queue'", condition: "process.env.SCHEMA_REGISTRY_URL", else: "console.log('[CHECK] contract tests (Schema Registry) ... SKIP — SCHEMA_REGISTRY_URL unset');", soft: true, cmd: ['npx', ['vitest', 'run', '--testPathPattern=schema-registry']] }
|
|
211
|
+
- { id: contract-pact-gradle, name: 'contract tests (Pact)', level: L2, kind: check, emitIf: "enableDebtGates && language === 'java' && buildTool === 'gradle' && (contractType === 'rest-owned' || contractType === 'rest-public')", condition: "process.env.PACT_BROKER_BASE_URL", else: "console.log('[CHECK] contract tests (Pact) ... SKIP — PACT_BROKER_BASE_URL unset');", soft: true, cmd: ['./gradlew', ['pactPublish', 'pactVerify']] }
|
|
212
|
+
- { id: contract-pact-maven, name: 'contract tests (Pact)', level: L2, kind: check, emitIf: "enableDebtGates && language === 'java' && buildTool === 'maven' && (contractType === 'rest-owned' || contractType === 'rest-public')", condition: "process.env.PACT_BROKER_BASE_URL", else: "console.log('[CHECK] contract tests (Pact) ... SKIP — PACT_BROKER_BASE_URL unset');", soft: true, cmd: ['mvn', ['pact:publish', 'pact:verify']] }
|
|
213
|
+
- { id: contract-graphql-java, name: 'contract tests (GraphQL)', level: L2, kind: check, emitIf: "enableDebtGates && language === 'java' && (buildTool === 'gradle' || buildTool === 'maven') && contractType === 'graphql'", soft: true, cmd: ['<%= buildTool === "gradle" ? "./gradlew" : "mvn" %>', ['<%= buildTool === "gradle" ? "test --tests *.graphql.*" : "test -Dtest=*GraphQL*" %>']] }
|
|
214
|
+
- { id: contract-grpc-java, name: 'contract tests (gRPC)', level: L2, kind: check, emitIf: "enableDebtGates && language === 'java' && (buildTool === 'gradle' || buildTool === 'maven') && contractType === 'grpc'", soft: true, cmd: ['<%= buildTool === "gradle" ? "./gradlew" : "mvn" %>', ['<%= buildTool === "gradle" ? "test --tests *.grpc.*" : "test -Dtest=*Grpc*" %>']] }
|
|
215
|
+
- { id: contract-schema-registry-gradle, name: 'contract tests (Schema Registry)', level: L2, kind: check, emitIf: "enableDebtGates && language === 'java' && buildTool === 'gradle' && contractType === 'message-queue'", condition: "process.env.SCHEMA_REGISTRY_URL", else: "console.log('[CHECK] contract tests (Schema Registry) ... SKIP — SCHEMA_REGISTRY_URL unset');", soft: true, cmd: ['./gradlew', ['test', '--tests', '*SchemaRegistry*']] }
|
|
216
|
+
- { id: contract-schema-registry-maven, name: 'contract tests (Schema Registry)', level: L2, kind: check, emitIf: "enableDebtGates && language === 'java' && buildTool === 'maven' && contractType === 'message-queue'", condition: "process.env.SCHEMA_REGISTRY_URL", else: "console.log('[CHECK] contract tests (Schema Registry) ... SKIP — SCHEMA_REGISTRY_URL unset');", soft: true, cmd: ['mvn', ['test', '-Dtest=*SchemaRegistry*']] }
|
|
217
|
+
- { id: contract-pact-rust, name: 'contract tests (Pact)', level: L2, kind: check, emitIf: "enableDebtGates && language === 'rust' && (contractType === 'rest-owned' || contractType === 'rest-public')", condition: "process.env.PACT_BROKER_BASE_URL", else: "console.log('[CHECK] contract tests (Pact) ... SKIP — PACT_BROKER_BASE_URL unset');", soft: true, cmd: ['cargo', ['test', '--test', 'pact_consumer_test']] }
|
|
218
|
+
- { id: contract-openapi-rust, name: 'contract tests (OpenAPI)', level: L2, kind: check, emitIf: "enableDebtGates && language === 'rust' && (contractType === 'rest-owned' || contractType === 'rest-public')", soft: true, cmd: ['cargo', ['test', '--test', 'openapi_diff_test']] }
|
|
219
|
+
- { id: contract-graphql-rust, name: 'contract tests (GraphQL)', level: L2, kind: check, emitIf: "enableDebtGates && language === 'rust' && contractType === 'graphql'", soft: true, cmd: ['cargo', ['test', '--test', 'graphql_schema_test']] }
|
|
220
|
+
- { id: contract-grpc-rust, name: 'contract tests (gRPC)', level: L2, kind: check, emitIf: "enableDebtGates && language === 'rust' && contractType === 'grpc'", soft: true, cmd: ['cargo', ['test', '--test', 'grpc_contract_test']] }
|
|
221
|
+
- { id: contract-schema-registry-rust, name: 'contract tests (schema registry)', level: L2, kind: check, emitIf: "enableDebtGates && language === 'rust' && contractType === 'message-queue'", condition: "process.env.SCHEMA_REGISTRY_URL", else: "console.log('[CHECK] contract tests (Schema Registry) ... SKIP — SCHEMA_REGISTRY_URL unset');", soft: true, cmd: ['cargo', ['test', '--test', 'schema_registry_test']] }
|
|
222
|
+
- { id: contract-go, name: 'contract tests', level: L2, kind: check, emitIf: "enableDebtGates && language === 'go' && contractType !== 'none'", soft: true, cmd: ['go', ['test', '-tags', 'contract', '-run', 'Contract', './...']] }
|
|
223
|
+
- { id: contract-pact-python, name: 'contract tests (Pact)', level: L2, kind: check, emitIf: "enableDebtGates && language === 'python' && contractType !== 'none'", soft: true, cmd: ['pytest', ['tests/contract/']] }
|
|
224
|
+
- { id: bdd-ignore-check, name: 'BDD @ignore check', level: L2, kind: inline, emitIf: "enableDebtGates" }
|
|
225
|
+
- { id: gdpr-controls, name: 'gdpr controls (#1251)', level: L2, kind: check, emitIf: "enableDebtGates", condition: "gateFilePresent('scripts/check-gdpr-controls.mjs', 'gdpr controls (#1251)')", soft: true, cmd: ['node', ['scripts/check-gdpr-controls.mjs']] }
|
|
226
|
+
- { id: bdd-ts, name: bdd, level: L2, kind: check, emitIf: "language === 'typescript' && enableDebtGates", soft: true, cmd: ['npx', ['cucumber-js']] }
|
|
227
|
+
- { id: bdd-python, name: bdd, level: L2, kind: check, emitIf: "language === 'python' && enableDebtGates", soft: true, cmd: ['pytest', ['tests/bdd/']] }
|
|
228
|
+
- { id: bdd-go, name: bdd, level: L2, kind: inline, emitIf: "language === 'go' && enableDebtGates" }
|
|
229
|
+
- { id: bdd-gradle, name: bdd, level: L2, kind: check, emitIf: "language === 'java' && buildTool === 'gradle' && enableDebtGates", soft: true, cmd: ['./gradlew', ['cucumberTest']] }
|
|
230
|
+
- { id: bdd-maven, name: bdd, level: L2, kind: check, emitIf: "language === 'java' && buildTool === 'maven' && enableDebtGates", soft: true, cmd: ['mvn', ['test', '-Dtest=*BDD*']] }
|
|
231
|
+
- { id: bdd-rust, name: bdd, level: L2, kind: inline, emitIf: "language === 'rust' && enableDebtGates" }
|
|
232
|
+
- { id: debt-ratchet, name: 'debt ratchet', level: L2, kind: check, soft: true, emitIf: "enableDebtGates", cmd: ['node', ['scripts/debt-report.mjs', '<%= ratchetFlag %>']] }
|
|
233
|
+
- { id: commit-footer-rationale, name: 'commit-footer rationale (INV-119)', level: L2, kind: check, emitIf: "governanceLevel !== 'L1' && enableDebtGates", soft: true, cmd: ['node', ['scripts/check-commit-footer-rationale.mjs']] }
|
|
234
|
+
- { id: docs-updated, name: 'docs updated with code (#356)', level: L2, kind: warn, emitIf: "governanceLevel !== 'L1' && enableDebtGates", cmd: ['node', ['scripts/check-docs.mjs']] }
|
|
235
|
+
- { id: feature-matrix, name: 'feature matrix (INV-112)', level: L2, kind: check, emitIf: "governanceLevel !== 'L1' && enableDebtGates", cmd: ['node', ['scripts/check-feature-matrix.mjs']] }
|
|
236
|
+
- { id: gap-register, name: 'gap register', level: L2, kind: check, emitIf: "governanceLevel !== 'L1' && enableDebtGates", cmd: ['node', ['scripts/gen-gap.mjs', '--check']] }
|
|
237
|
+
- { id: conformance, name: conformance, level: L2, kind: warn, emitIf: "enableDebtGates", condition: "gateFilePresent('scripts/conformance.mjs', 'conformance')", cmd: ['node', ['scripts/conformance.mjs', '--check']] }
|
|
238
|
+
- { id: gold-audit, name: gold-audit, level: L2, kind: warn, emitIf: "enableDebtGates", condition: "gateFilePresent('scripts/gold-audit.mjs', 'gold-audit')", cmd: ['node', ['scripts/gold-audit.mjs', '--check']] }
|
|
239
|
+
# No emitIf (INV-144): the runner is emitted unconditionally, so a generation-time condition here
|
|
240
|
+
# would ship a script nothing references — a dead emission, which #1331's coherence gate rejects.
|
|
241
|
+
# The runtime gateFilePresent guard plus level L2 + kind warn is what keeps it non-disruptive.
|
|
242
|
+
- { id: arc42-slots, name: 'arc42 slots (INV-144)', level: L2, kind: warn, condition: "gateFilePresent('scripts/check-arc42-slots.mjs', 'arc42 slots (INV-144)')", cmd: ['node', ['scripts/check-arc42-slots.mjs']] }
|
|
243
|
+
- { id: doc-set, name: 'doc-set', level: L2, kind: warn, emitIf: "enableDebtGates", condition: "gateFilePresent('scripts/check-doc-set.mjs', 'doc-set')", cmd: ['node', ['scripts/check-doc-set.mjs', '--check']] }
|
|
244
|
+
- { id: decision-registry, name: 'decision registry', level: L2, kind: check, emitIf: "enableDebtGates", condition: "gateFilePresent('scripts/check-decision-registry.mjs', 'decision registry')", cmd: ['node', ['scripts/check-decision-registry.mjs']] }
|
|
245
|
+
- { id: reuse-registry, name: 'reuse registry', level: L2, kind: check, emitIf: "enableDebtGates && typeof includeExtendedInvariants !== 'undefined' && includeExtendedInvariants", condition: "gateFilePresent('scripts/check-reuse-registry.mjs', 'reuse registry')", cmd: ['node', ['scripts/check-reuse-registry.mjs']] }
|
|
246
|
+
- { id: anti-fake-green, name: anti-fake-green, level: L2, kind: warn, emitIf: "enableDebtGates", condition: "gateFilePresent('scripts/check-anti-fake-green.mjs', 'anti-fake-green')", cmd: ['node', ['scripts/check-anti-fake-green.mjs']] }
|
|
247
|
+
- { id: module-coverage-ratchet, name: 'module coverage ratchet', level: L2, kind: warn, emitIf: "enableDebtGates", condition: "gateFilePresent('scripts/verify-module-coverage.mjs', 'module coverage ratchet')", cmd: ['node', ['scripts/verify-module-coverage.mjs']] }
|
|
248
|
+
- { id: agent-return, name: 'agent-return envelope (E1 #1943)', level: L2, kind: warn, emitIf: "enableDebtGates", condition: "gateFilePresent('scripts/check-agent-return.mjs', 'agent-return envelope (E1 #1943)')", cmd: ['node', ['scripts/check-agent-return.mjs']] }
|
|
249
|
+
# #2435 AC-2: hard at L2. The `refactor` phase promises a code-review dispatch; as a `warn`
|
|
250
|
+
# this could not fail a build, so a ship reached `verification` with no review dispatched.
|
|
251
|
+
# It vacuous-passes when no sidecar binds to this task/branch, so it only refuses an owed review.
|
|
252
|
+
- { id: review-completion, name: 'review completion (#2177)', level: L2, kind: check, emitIf: "enableDebtGates", condition: "gateFilePresent('scripts/check-review-completion.mjs', 'review completion (#2177)')", cmd: ['node', ['scripts/check-review-completion.mjs']] }
|
|
253
|
+
- { id: refutation-majority, name: 'refutation majority (E2 #1943)', level: L2, kind: warn, emitIf: "enableDebtGates", condition: "gateFilePresent('scripts/check-refutation-verdicts.mjs', 'refutation majority (E2 #1943)')", cmd: ['node', ['scripts/check-refutation-verdicts.mjs']] }
|
|
254
|
+
- { id: audit-dry-pass, name: 'audit dry-pass (E3 #1943)', level: L2, kind: warn, emitIf: "enableDebtGates", condition: "gateFilePresent('scripts/check-audit-dry-pass.mjs', 'audit dry-pass (E3 #1943)')", cmd: ['node', ['scripts/check-audit-dry-pass.mjs', '--all']] }
|
|
255
|
+
- { id: handoff-lint, name: 'handoff lint (E6a #1943)', level: L2, kind: warn, emitIf: "enableDebtGates", condition: "gateFilePresent('scripts/check-handoff-doc.mjs', 'handoff lint (E6a #1943)')", cmd: ['node', ['scripts/check-handoff-doc.mjs']] }
|
|
256
|
+
- { id: cross-model-review, name: 'cross-model review (#2358)', level: L2, kind: warn, emitIf: "enableDebtGates", cmd: ['node', ['scripts/check-cross-model-review.mjs']] }
|
|
257
|
+
# #2405 (ADR-110 follow-up, INV-138): the acceptance-criteria anchor gate. Advisory
|
|
258
|
+
# (`warn`) because the anchor is opt-in per project — the script itself is inert unless
|
|
259
|
+
# `features.acceptanceAnchor` is on, and vacuous-passes with no active task.
|
|
260
|
+
- { id: acceptance-anchor, name: 'acceptance anchor (INV-138)', level: L2, kind: warn, condition: "gateFilePresent('scripts/check-acceptance.mjs', 'acceptance anchor (INV-138)')", cmd: ['node', ['scripts/check-acceptance.mjs']] }
|
|
261
|
+
- { id: tdd-evidence, name: 'tdd-evidence (INV-131)', level: L2, kind: check, soft: true, cmd: ['node', ['scripts/check-tdd-evidence.mjs']] }
|
|
262
|
+
- { id: todo-max-age, name: 'todo max-age (INV-133)', level: L2, kind: check, soft: true, cmd: ['node', ['scripts/check-todo-max-age.mjs']] }
|
|
263
|
+
- { id: evidence-gate, name: 'evidence gate (INV-33)', level: L3, kind: inline, emitIf: "isL3Plus" }
|
|
264
|
+
- { id: local-ci-parity, name: 'local-ci-parity (INV-59)', level: L2, kind: check, emitIf: "typeof collaborationMode !== 'undefined' && collaborationMode === 'trunk-solo'", cmd: ['node', ['scripts/check-local-ci-parity.mjs']] }
|
|
265
|
+
|
|
266
|
+
# ── L3 (nightly lane, AC-2041.1 — mirrors 06-nightly-lite.yml) ────────────
|
|
267
|
+
- { id: solo-reactivation, name: 'solo reactivation', level: L3, kind: check, emitIf: "typeof collaborationMode !== 'undefined' && collaborationMode === 'trunk-solo' && isL3Plus", cmd: ['node', ['scripts/check-solo-reactivation.mjs']] }
|
|
268
|
+
- { id: nightly-audit-prod, name: 'nightly audit (prod scope)', level: L3, kind: check, emitIf: "language === 'typescript' && packageManager === 'npm'", soft: true, cmd: ['npm', ['audit', '--omit=dev', '--audit-level=high']] }
|
|
269
|
+
# #2258: go's L3 content — solo-reactivation/evidence-gate both require
|
|
270
|
+
# isL3Plus (governanceLevel >= L3) and nightly-audit-prod is typescript-only,
|
|
271
|
+
# so a go project at any governanceLevel below L3 emitted ZERO L3 gates
|
|
272
|
+
# (the layering contract's "L3 lane declares zero gates" failure). `-race`
|
|
273
|
+
# is the standard non-TS-mutation-testing nightly-lane recipe (full run, not
|
|
274
|
+
# -short — see docs/PRODUCT research on Go/Rust nightly lanes). Requires a
|
|
275
|
+
# cgo-capable C toolchain (gcc/cc) on the runner; a race in the trunk-solo
|
|
276
|
+
# cgo-less path would need a runner-capability guard, not `soft` (soft binds
|
|
277
|
+
# to graceActive, an L1→L2 grace concept, inert at L3).
|
|
278
|
+
- { id: go-race, name: 'race detector (full)', level: L3, kind: check, language: go, cmd: ['go', ['test', '-race', './...']] }
|
|
279
|
+
# #2267: Cross-language L3 content must exist even when a consumer is generated
|
|
280
|
+
# at L2: test-gate-layering verifies the declared lane before its configured
|
|
281
|
+
# governance level advances. These are full, executable lifecycle commands;
|
|
282
|
+
# no benchmark threshold is implied.
|
|
283
|
+
- { id: rust-release-tests, name: 'release tests (all targets/features)', level: L3, kind: check, language: rust, cmd: ['cargo', ['test', '--release', '--all-targets', '--all-features']] }
|
|
284
|
+
- { id: python-doctest-strict, name: 'doctest + strict markers', level: L3, kind: check, language: python, cmd: ['pytest', ['--doctest-modules', '--strict-markers']] }
|
|
285
|
+
- { id: java-lifecycle, name: 'Java lifecycle build', level: L3, kind: check, emitIf: "language === 'java' && (buildTool === 'gradle' || buildTool === 'maven')", cmd: ['<%= buildTool === "gradle" ? "./gradlew" : "mvn" %>', ['<%= buildTool === "gradle" ? "build" : "verify" %>', '-q']] }
|
|
286
|
+
- { id: kotlin-gradle-build, name: 'Gradle lifecycle build', level: L3, kind: check, emitIf: "language === 'kotlin' && buildTool === 'gradle'", cmd: ['./gradlew', ['build', '-q']] }
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
// CATALOG: Generates docs/INDEX.md from frontmatter across the target documentation corpus.
|
|
4
|
+
// CATALOG: Stays separate from link validation because it writes the canonical inventory artifact.
|
|
5
|
+
// CATALOG: The --check mode makes documentation inventory drift a gate failure.
|
|
6
|
+
import { readFileSync, writeFileSync, existsSync, readdirSync, statSync } from 'node:fs';
|
|
7
|
+
import { join, relative, resolve, sep } from 'node:path';
|
|
8
|
+
import { fileURLToPath } from 'node:url';
|
|
9
|
+
import { execFileSync } from 'node:child_process';
|
|
10
|
+
const SKIP_SEGMENTS = new Set(['report']);
|
|
11
|
+
function gitTrackedDocPaths(root) { try { return new Set(execFileSync('git', ['ls-files', 'docs/'], { cwd: root, encoding: 'utf-8' }).split('\n').filter(Boolean)); } catch { return null; } }
|
|
12
|
+
function parseFrontmatter(content) { if (!content.startsWith('---\n')) return {}; const end = content.indexOf('\n---', 4); if (end === -1) return {}; const fm = {}; for (const line of content.slice(4, end).split('\n')) { const match = line.match(/^([a-z_]+):\s*(.*)$/); if (!match) continue; const raw = match[2].trim(); fm[match[1]] = raw.startsWith('[') ? [...raw.matchAll(/'([^']+)'|"([^"]+)"/g)].map((item) => item[1] ?? item[2]) : raw.replace(/^['"]|['"]$/g, ''); } return fm; }
|
|
13
|
+
function firstH1(content) { return content.match(/^#\s+(.+)$/m)?.[1].trim() ?? ''; }
|
|
14
|
+
function walkMarkdown(dir, indexPath) { const out = []; for (const entry of readdirSync(dir)) { const full = join(dir, entry); if (statSync(full).isDirectory()) { if (!SKIP_SEGMENTS.has(entry)) out.push(...walkMarkdown(full, indexPath)); } else if (entry.endsWith('.md') && full !== indexPath) out.push(full); } return out; }
|
|
15
|
+
function tableRow(record) { return `| [${record.title}](${record.relPath}) | ${record.id || '—'} | ${record.status} | ${record.kind || '—'} |`; }
|
|
16
|
+
export function collectDocs(docsDir, indexPath) { const root = resolve(docsDir, '..'); const tracked = gitTrackedDocPaths(root); return walkMarkdown(docsDir, indexPath).filter((file) => tracked === null || tracked.has(relative(root, file).split(sep).join('/'))).sort().map((file) => { const content = readFileSync(file, 'utf-8'); const fm = parseFrontmatter(content); const relPath = relative(docsDir, file).split(sep).join('/'); const tags = Array.isArray(fm.tags) ? fm.tags : []; return { relPath, title: (fm.title || firstH1(content) || relPath).replace(/\|/g, '\\|'), id: fm.canonical_id || '', status: fm.status || '—', kind: tags.find((tag) => tag.startsWith('kind/')) ?? '', tags }; }); }
|
|
17
|
+
export function buildIndex(records) { const groups = new Map(); for (const record of records) { const key = record.relPath.split('/').length > 1 ? record.relPath.split('/')[0] : ''; if (!groups.has(key)) groups.set(key, []); groups.get(key).push(record); } const header = `# Documentation Index\n\n> Generated by \`scripts/gen-doc-index.mjs\` from doc frontmatter. Do not edit by hand;\n> run \`node scripts/gen-doc-index.mjs\` after adding or relabeling a doc.\n\n${records.length} documents.\n\n`; const table = '| title | canonical_id | status | kind |\n|-------|--------------|--------|------|\n'; const rootDocs = groups.get('') ?? []; const dirs = [...groups.entries()].filter(([key]) => key !== '').sort(([a], [b]) => a.localeCompare(b)); const sections = []; if (rootDocs.length) sections.push(`## docs\n\n${table}${rootDocs.map(tableRow).join('\n')}\n`); for (const [dir, docs] of dirs) sections.push(`## ${dir}\n\n${table}${docs.map(tableRow).join('\n')}\n`); return header + sections.join('\n'); }
|
|
18
|
+
export async function runCli(docsDir, indexPath, check) { try { const generated = buildIndex(collectDocs(docsDir, indexPath)); if (check) { if ((existsSync(indexPath) ? readFileSync(indexPath, 'utf-8') : '') !== generated) { process.stderr.write('docs/INDEX.md is stale. Run `node scripts/gen-doc-index.mjs` and commit the result.\n'); return 1; } process.stdout.write('docs/INDEX.md is up to date.\n'); return 0; } writeFileSync(indexPath, generated); process.stdout.write(`Wrote ${indexPath}\n`); return 0; } catch (err) { process.stderr.write(`gen-doc-index: ${err instanceof Error ? err.message : String(err)}\n`); return 1; } }
|
|
19
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) { const root = resolve('.'); runCli(join(root, 'docs'), join(root, 'docs', 'INDEX.md'), process.argv.includes('--check')).then((code) => process.exit(code)).catch((err) => { process.stderr.write(`gen-doc-index: ${err instanceof Error ? err.message : String(err)}\n`); process.exit(1); }); }
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
// <%= projectName %> — docs/GAP.md gap-register gate (#1887-B)
|
|
4
|
+
// Generated by arbiter (src/templates/scripts/gen-gap.mjs.ejs)
|
|
5
|
+
//
|
|
6
|
+
// Portable, SCOPED-DOWN sibling of arbiter's own scripts/gen-gap.mjs. Arbiter's
|
|
7
|
+
// version cross-references constraint-scan output, CONVERGENCE-*.md reports, and
|
|
8
|
+
// .arbiter/evidence/*/tech-debt.json, then does an exact-byte regeneration diff
|
|
9
|
+
// (through prettier) — none of those extra sources have a stable equivalent in an
|
|
10
|
+
// arbitrary target project, and an exact-byte diff would be sensitive to that
|
|
11
|
+
// project's own prettier config (or absence of one). This version derives ONLY
|
|
12
|
+
// from docs/FEATURE_MATRIX.md and checks COVERAGE instead of exact regeneration:
|
|
13
|
+
// every Partial/Missing feature_id in FEATURE_MATRIX.md must still be mentioned
|
|
14
|
+
// in docs/GAP.md's Feature Gaps table — catching the actual defect class (a gap
|
|
15
|
+
// silently dropped from the register) without the byte-fragility.
|
|
16
|
+
//
|
|
17
|
+
// Modes:
|
|
18
|
+
// --check (default) fail if a Partial/Missing feature_id is missing from GAP.md
|
|
19
|
+
// --write regenerate the Feature Gaps table (sentinel-bounded)
|
|
20
|
+
//
|
|
21
|
+
// Exit codes (INV-53): 0 = PASS, 1 = FAIL (drift), 2 = ERROR (file missing/parse failure)
|
|
22
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs'
|
|
23
|
+
import { resolve } from 'node:path'
|
|
24
|
+
|
|
25
|
+
const ROOT = process.cwd()
|
|
26
|
+
const args = process.argv.slice(2)
|
|
27
|
+
const CHECK = !args.includes('--write')
|
|
28
|
+
|
|
29
|
+
const MATRIX_PATH = resolve(ROOT, 'docs', 'FEATURE_MATRIX.md')
|
|
30
|
+
const GAP_PATH = resolve(ROOT, 'docs', 'GAP.md')
|
|
31
|
+
|
|
32
|
+
const MATRIX_START = '<!-- FEATURE_MATRIX_START -->'
|
|
33
|
+
const MATRIX_END = '<!-- FEATURE_MATRIX_END -->'
|
|
34
|
+
const GAP_FEATURES_START = '<!-- GAP_FEATURES_START -->'
|
|
35
|
+
const GAP_FEATURES_END = '<!-- GAP_FEATURES_END -->'
|
|
36
|
+
|
|
37
|
+
/** Parse FEATURE_MATRIX.md's sentinel-bounded table into { featureId, capability, status, issueRef, note }[]. */
|
|
38
|
+
function parseMatrixRows(text) {
|
|
39
|
+
const start = text.indexOf(MATRIX_START)
|
|
40
|
+
const end = text.indexOf(MATRIX_END)
|
|
41
|
+
if (start === -1 || end === -1 || end <= start) return null
|
|
42
|
+
|
|
43
|
+
const block = text.slice(start + MATRIX_START.length, end)
|
|
44
|
+
const rows = []
|
|
45
|
+
for (const line of block.split('\n')) {
|
|
46
|
+
const trimmed = line.trim()
|
|
47
|
+
if (!trimmed.startsWith('|')) continue
|
|
48
|
+
const cells = trimmed
|
|
49
|
+
.split('|')
|
|
50
|
+
.map((c) => c.trim())
|
|
51
|
+
.filter((_, i) => i > 0)
|
|
52
|
+
if (cells.length < 10) continue
|
|
53
|
+
const [featureId, capability, , , status, , , , issueRef, note] = cells
|
|
54
|
+
if (!featureId || featureId === 'feature_id' || /^-+$/.test(featureId)) continue
|
|
55
|
+
if (!status) continue
|
|
56
|
+
rows.push({
|
|
57
|
+
featureId,
|
|
58
|
+
capability: capability ?? '',
|
|
59
|
+
status,
|
|
60
|
+
issueRef: issueRef ?? '',
|
|
61
|
+
note: note ?? '',
|
|
62
|
+
})
|
|
63
|
+
}
|
|
64
|
+
return rows
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** feature_id | capability | status | severity | blocks_v1 | issue | notes */
|
|
68
|
+
function buildFeatureGapsTable(gapRows) {
|
|
69
|
+
if (gapRows.length === 0) return '_No feature gaps._'
|
|
70
|
+
const lines = gapRows.map((g) => {
|
|
71
|
+
const severity = g.status === 'Missing' ? 'high' : 'medium'
|
|
72
|
+
const blocksV1 = g.status === 'Missing' ? 'yes' : 'no'
|
|
73
|
+
return `| ${g.featureId} | ${g.capability} | ${g.status} | ${severity} | ${blocksV1} | ${g.issueRef || '—'} | ${g.note || '—'} |`
|
|
74
|
+
})
|
|
75
|
+
return [
|
|
76
|
+
'| feature_id | capability | status | severity | blocks_v1 | issue | notes |',
|
|
77
|
+
'| --- | --- | --- | --- | --- | --- | --- |',
|
|
78
|
+
...lines,
|
|
79
|
+
].join('\n')
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (!existsSync(MATRIX_PATH)) {
|
|
83
|
+
process.stdout.write(` gen-gap: ERROR — FEATURE_MATRIX.md not found at ${MATRIX_PATH}\n`)
|
|
84
|
+
process.exit(2)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
let matrixText
|
|
88
|
+
try {
|
|
89
|
+
matrixText = readFileSync(MATRIX_PATH, 'utf-8')
|
|
90
|
+
} catch (err) {
|
|
91
|
+
process.stdout.write(` gen-gap: ERROR — cannot read ${MATRIX_PATH}: ${err.message}\n`)
|
|
92
|
+
process.exit(2)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const allRows = parseMatrixRows(matrixText)
|
|
96
|
+
if (allRows === null) {
|
|
97
|
+
process.stdout.write(` gen-gap: ERROR — sentinel markers (${MATRIX_START}) not found\n`)
|
|
98
|
+
process.exit(2)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const gapRows = allRows.filter((r) => r.status === 'Partial' || r.status === 'Missing')
|
|
102
|
+
|
|
103
|
+
// ─── WRITE mode: regenerate the Feature Gaps table ────────────────────────────
|
|
104
|
+
if (!CHECK) {
|
|
105
|
+
if (!existsSync(GAP_PATH)) {
|
|
106
|
+
process.stdout.write(` gen-gap: ERROR — GAP.md not found at ${GAP_PATH}\n`)
|
|
107
|
+
process.exit(2)
|
|
108
|
+
}
|
|
109
|
+
const gapText = readFileSync(GAP_PATH, 'utf-8')
|
|
110
|
+
const startIdx = gapText.indexOf(GAP_FEATURES_START)
|
|
111
|
+
const endIdx = gapText.indexOf(GAP_FEATURES_END)
|
|
112
|
+
if (startIdx === -1 || endIdx === -1 || endIdx <= startIdx) {
|
|
113
|
+
process.stdout.write(` gen-gap: ERROR — sentinel markers (${GAP_FEATURES_START}) not found\n`)
|
|
114
|
+
process.exit(2)
|
|
115
|
+
}
|
|
116
|
+
const table = buildFeatureGapsTable(gapRows)
|
|
117
|
+
const replaced =
|
|
118
|
+
gapText.slice(0, startIdx + GAP_FEATURES_START.length) +
|
|
119
|
+
'\n\n' +
|
|
120
|
+
table +
|
|
121
|
+
'\n\n' +
|
|
122
|
+
gapText.slice(endIdx)
|
|
123
|
+
writeFileSync(GAP_PATH, replaced, 'utf-8')
|
|
124
|
+
process.stdout.write(` gen-gap: WROTE — Feature Gaps table updated (${gapRows.length} rows)\n`)
|
|
125
|
+
process.exit(0)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// ─── CHECK mode: coverage — every Partial/Missing id must be mentioned in GAP.md ──
|
|
129
|
+
if (!existsSync(GAP_PATH)) {
|
|
130
|
+
process.stdout.write(` gen-gap: ERROR — GAP.md not found at ${GAP_PATH}\n`)
|
|
131
|
+
process.exit(2)
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
let gapText
|
|
135
|
+
try {
|
|
136
|
+
gapText = readFileSync(GAP_PATH, 'utf-8')
|
|
137
|
+
} catch (err) {
|
|
138
|
+
process.stdout.write(` gen-gap: ERROR — cannot read ${GAP_PATH}: ${err.message}\n`)
|
|
139
|
+
process.exit(2)
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const dropped = gapRows.filter((g) => !gapText.includes(g.featureId))
|
|
143
|
+
if (dropped.length > 0) {
|
|
144
|
+
for (const g of dropped) {
|
|
145
|
+
process.stdout.write(
|
|
146
|
+
` gen-gap: FAIL — ${g.featureId} (${g.status}) is not mentioned in docs/GAP.md — run 'node scripts/gen-gap.mjs --write'\n`,
|
|
147
|
+
)
|
|
148
|
+
}
|
|
149
|
+
process.exit(1)
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
process.stdout.write(` gen-gap: OK — ${gapRows.length}/${gapRows.length} gaps tracked in docs/GAP.md\n`)
|
|
153
|
+
process.exit(0)
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
// CATALOG: Generates the agent-facing llms.txt index from its hand-maintained target config.
|
|
4
|
+
// CATALOG: Stays separate from the doc index because it validates curated public entry points.
|
|
5
|
+
// CATALOG: The --check mode detects drift without ever rewriting a target during a gate run.
|
|
6
|
+
import { readFileSync, writeFileSync, existsSync } from 'node:fs';
|
|
7
|
+
import { resolve } from 'node:path';
|
|
8
|
+
import { fileURLToPath } from 'node:url';
|
|
9
|
+
function renderEntry(entry) { const extra = (entry.extraLinks ?? []).map(([label, path]) => `, [${label}](${path})`).join(''); return `- [${entry.label}](${entry.path})${extra}: ${entry.description}`; }
|
|
10
|
+
export function buildLlmsTxt(config, { docCount }) { const sections = config.sections.map((section) => `## ${section.heading}\n\n${section.entries.map(renderEntry).join('\n')}`); return (`# ${config.title}\n\n> ${config.summary}\n\n${config.intro}\n\n${sections.join('\n\n')}`).replace(/\{\{docCount\}\}/g, String(docCount)); }
|
|
11
|
+
export function readDocCount(indexPath) { const match = readFileSync(indexPath, 'utf-8').match(/^(\d+) documents\.$/m); if (!match) throw new Error(`could not parse doc count ("N documents.") from ${indexPath}`); return Number(match[1]); }
|
|
12
|
+
function extractProseLinkTargets(text) { const targets = []; const re = /\[[^\]]*\]\(([^)]+)\)/g; let match; while ((match = re.exec(text))) if (!match[1].startsWith('#') && !/^[a-z]+:/i.test(match[1])) targets.push(match[1]); return targets; }
|
|
13
|
+
export function findMissingPaths(config, root) { const missing = []; for (const section of config.sections) for (const entry of section.entries) for (const path of [entry.path, ...(entry.extraLinks ?? []).map(([, extraPath]) => extraPath), ...extractProseLinkTargets(entry.description ?? '')]) if (!existsSync(resolve(root, path.replace(/\/$/, '')))) missing.push(path); return missing; }
|
|
14
|
+
function loadConfig(path) { if (!existsSync(path)) return { error: `config not found: ${path}` }; try { return { config: JSON.parse(readFileSync(path, 'utf-8')) }; } catch (err) { return { error: `invalid JSON in ${path}: ${err instanceof Error ? err.message : String(err)}` }; } }
|
|
15
|
+
function loadDocCount(path) { try { return { docCount: readDocCount(path) }; } catch (err) { return { error: err instanceof Error ? err.message : String(err) }; } }
|
|
16
|
+
function checkDrift(path, generated) { if ((existsSync(path) ? readFileSync(path, 'utf-8') : '') !== generated) { process.stderr.write('llms.txt is stale. Run `node scripts/gen-llms-txt.mjs` and commit the result.\n'); return 1; } process.stdout.write('llms.txt is up to date.\n'); return 0; }
|
|
17
|
+
export async function runCli(configPath, indexPath, outPath, check) { try { const { config, error: configErr } = loadConfig(configPath); if (configErr) { process.stderr.write(`gen-llms-txt: ${configErr}\n`); return 2; } const { docCount, error: countErr } = loadDocCount(indexPath); if (countErr) { process.stderr.write(`gen-llms-txt: ${countErr}\n`); return 2; } const missing = findMissingPaths(config, resolve(configPath, '..')); if (missing.length) { process.stderr.write(`gen-llms-txt: path(s) in ${configPath} do not exist: ${missing.join(', ')}. Update the config.\n`); return 2; } const generated = buildLlmsTxt(config, { docCount }); if (check) return checkDrift(outPath, generated); writeFileSync(outPath, generated); process.stdout.write(`Wrote ${outPath}\n`); return 0; } catch (err) { process.stderr.write(`gen-llms-txt: ${err instanceof Error ? err.message : String(err)}\n`); return 2; } }
|
|
18
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) { const arg = (flag) => process.argv.find((value) => value.startsWith(flag))?.split('=')[1]; const root = resolve('.'); const configPath = arg('--config=') ? resolve(arg('--config=')) : resolve(root, 'llms-txt.config.json'); const indexPath = arg('--index=') ? resolve(arg('--index=')) : resolve(root, 'docs/INDEX.md'); const outPath = arg('--out=') ? resolve(arg('--out=')) : resolve(root, 'llms.txt'); runCli(configPath, indexPath, outPath, process.argv.includes('--check')).then((code) => process.exit(code)).catch((err) => { process.stderr.write(`gen-llms-txt: ${err instanceof Error ? err.message : String(err)}\n`); process.exit(2); }); }
|