@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,106 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
// CATALOG: INV-126 enforcement. Reads api-e2e.json at repo root; for SERVICE archetypes
|
|
4
|
+
// CATALOG: (required:true) it FAILS when the live-API e2e suite is absent or empty —
|
|
5
|
+
// CATALOG: the suite must boot the real binary and assert on live HTTP responses.
|
|
6
|
+
// CATALOG: required:false (non-service) or absent manifest -> SKIP (exit 0). This is the
|
|
7
|
+
// CATALOG: INVERTED absent-semantics vs INV-124: a declared service MUST ship the suite.
|
|
8
|
+
// CATALOG: Boundary: file PRESENCE + non-empty only — live-run-pass is the CI/L2 runner
|
|
9
|
+
// CATALOG: (tests/api/run.sh), assertion quality is INV-118 (anti-proforma).
|
|
10
|
+
// Exit codes: 0=PASS/SKIP, 1=policy violation (absent/empty suite), 2=schema/path-traversal error
|
|
11
|
+
// Usage: node scripts/check-api-e2e.mjs [--help]
|
|
12
|
+
import { readFileSync, existsSync } from 'node:fs'
|
|
13
|
+
import { join, resolve } from 'node:path'
|
|
14
|
+
import { globMatch, validateGlob, walkRepo } from './lib/glob-walk.mjs'
|
|
15
|
+
|
|
16
|
+
const ROOT = resolve(process.cwd())
|
|
17
|
+
const MANIFEST_PATH = join(ROOT, 'api-e2e.json')
|
|
18
|
+
|
|
19
|
+
const HELP = `Usage: node scripts/check-api-e2e.mjs [--help]
|
|
20
|
+
|
|
21
|
+
Enforces that a SERVICE archetype (api-e2e.json required:true) ships a non-mocked
|
|
22
|
+
live-API e2e suite that boots the real binary/server (INV-126).
|
|
23
|
+
|
|
24
|
+
Rules:
|
|
25
|
+
required:true — the manifest glob must match >=1 NON-EMPTY suite file; otherwise FAIL.
|
|
26
|
+
required:false — SKIP (non-service archetype, e.g. library/cli/frontend).
|
|
27
|
+
manifest absent — SKIP (ungoverned repo). Re-init with arbiter init to generate it.
|
|
28
|
+
|
|
29
|
+
Exit codes:
|
|
30
|
+
0 — pass or SKIP
|
|
31
|
+
1 — policy violation (required suite absent or empty)
|
|
32
|
+
2 — schema error or path-traversal glob detected`
|
|
33
|
+
|
|
34
|
+
if (process.argv.includes('--help') || process.argv.includes('-h')) {
|
|
35
|
+
process.stdout.write(`${HELP}\n`)
|
|
36
|
+
process.exit(0)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function fileIsNonEmpty(abs) {
|
|
40
|
+
try {
|
|
41
|
+
return readFileSync(abs, 'utf-8').trim().length > 0
|
|
42
|
+
} catch {
|
|
43
|
+
return false
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async function main() {
|
|
48
|
+
if (!existsSync(MANIFEST_PATH)) {
|
|
49
|
+
process.stdout.write('[check-api-e2e] SKIP — api-e2e.json not found\n')
|
|
50
|
+
// #2052: recognized marker so runCheck surfaces SKIP, not PASS, in the gate summary.
|
|
51
|
+
process.stdout.write('[SKIP] api-e2e.json not found\n')
|
|
52
|
+
process.exit(0)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
let manifest
|
|
56
|
+
try {
|
|
57
|
+
manifest = JSON.parse(readFileSync(MANIFEST_PATH, 'utf-8'))
|
|
58
|
+
} catch (err) {
|
|
59
|
+
process.stderr.write(`[check-api-e2e] ERROR — invalid JSON: ${err.message}\n`)
|
|
60
|
+
process.exit(2)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (manifest.required !== true) {
|
|
64
|
+
process.stdout.write(
|
|
65
|
+
'[check-api-e2e] SKIP — required:false (non-service archetype, no live-API suite mandated)\n',
|
|
66
|
+
)
|
|
67
|
+
// #2052: recognized marker so runCheck surfaces SKIP, not PASS, in the gate summary.
|
|
68
|
+
process.stdout.write('[SKIP] required:false (non-service archetype)\n')
|
|
69
|
+
process.exit(0)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const glob = manifest.glob
|
|
73
|
+
if (typeof glob !== 'string' || glob.length === 0 || !validateGlob(glob)) {
|
|
74
|
+
process.stderr.write(
|
|
75
|
+
`[check-api-e2e] ERROR — manifest.glob "${glob}" is absent, absolute, or contains ` +
|
|
76
|
+
`path traversal — only relative, non-traversal globs are allowed\n`,
|
|
77
|
+
)
|
|
78
|
+
process.exit(2)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const allFiles = walkRepo(ROOT)
|
|
82
|
+
|
|
83
|
+
const matches = allFiles.filter((rel) => globMatch(glob, rel))
|
|
84
|
+
const nonEmpty = matches.filter((rel) => fileIsNonEmpty(join(ROOT, rel)))
|
|
85
|
+
|
|
86
|
+
if (nonEmpty.length === 0) {
|
|
87
|
+
const reason =
|
|
88
|
+
matches.length === 0 ? 'no suite file matched' : 'matched suite file(s) are empty'
|
|
89
|
+
process.stderr.write(
|
|
90
|
+
`[check-api-e2e] FAIL — service archetype "${manifest.archetype}" declares a required ` +
|
|
91
|
+
`live-API e2e suite but ${reason} (glob: ${glob}). A non-mocked suite that boots the ` +
|
|
92
|
+
`real binary and asserts on live HTTP responses is mandatory — see ${manifest.suiteDir}/.\n`,
|
|
93
|
+
)
|
|
94
|
+
process.exit(1)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
process.stdout.write(`[check-api-e2e] OK — ${nonEmpty.length} live-API suite file(s) present\n`)
|
|
98
|
+
process.exit(0)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
try {
|
|
102
|
+
await main()
|
|
103
|
+
} catch (err) {
|
|
104
|
+
process.stderr.write(`[check-api-e2e] ERROR — unexpected: ${err.message}\n`)
|
|
105
|
+
process.exit(2)
|
|
106
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
// scripts/check-arc42-slots.mjs — generated by arbiter (INV-144).
|
|
4
|
+
// arc42 slot-completeness runner for this project. Delegates to the root-local Arbiter CLI
|
|
5
|
+
// (no `yaml` dep — the engine runs inside the installed local Arbiter CLI against this
|
|
6
|
+
// repo, same shape as check-doc-set.mjs.ejs and check-doc-freshness.mjs.ejs).
|
|
7
|
+
//
|
|
8
|
+
// The skeletons the audit compares against live in arbiter, not here: this project is held to the
|
|
9
|
+
// arc42 skeleton its own tier column receives, so a section deleted from the architecture document
|
|
10
|
+
// is reported as the structural gap it is rather than passing unnoticed.
|
|
11
|
+
//
|
|
12
|
+
// Usage: node scripts/check-arc42-slots.mjs [--json] [--update-baseline]
|
|
13
|
+
//
|
|
14
|
+
// Exit codes (INV-53): 0=every required slot present and the hollow-section count within baseline,
|
|
15
|
+
// 1=violation, 2=ERROR. On the FIRST clean run, with no scripts/data/arc42-baseline.json, the gate
|
|
16
|
+
// WRITES the hollow-section count it measured (creating scripts/data/) instead of failing — a
|
|
17
|
+
// freshly generated arc42 is hollow by construction, and a gate that made `arbiter init` produce a
|
|
18
|
+
// red repo would only teach people to delete it. Every run after that is a ratchet: the count may
|
|
19
|
+
// fall, never rise. Persisting matters: an earlier version only tolerated the count in memory, so
|
|
20
|
+
// no generated project ever grew a baseline and the ratchet never armed anywhere.
|
|
21
|
+
import { runLocalArbiter } from './lib/run-helpers.mjs'
|
|
22
|
+
|
|
23
|
+
const args = process.argv.slice(2)
|
|
24
|
+
|
|
25
|
+
process.exit(runLocalArbiter(['doc-set', '--arc42', ...args]))
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
// scripts/check-assertion-delta.mjs — generated by arbiter (anti-fake-green, #2161).
|
|
4
|
+
//
|
|
5
|
+
// CATALOG: diffs the current commit range for test files that remove an assertion with none
|
|
6
|
+
// CATALOG: added, or raise the skip-marker count, without an Assertion-Delta-Override trailer.
|
|
7
|
+
// CATALOG: rejected fold-in into check-muted-test.mjs because that inspects the CURRENT tree for a
|
|
8
|
+
// CATALOG: skip marker; this inspects a DIFF for a removed assertion or a rising skip delta — a
|
|
9
|
+
// CATALOG: different axis (snapshot content vs change-over-range).
|
|
10
|
+
// CATALOG: rejected fold-in into check-commit-footer-rationale.mjs because that walks commit-touched
|
|
11
|
+
// CATALOG: FILE PATTERNS (trivyignore/suppressions/*); this walks DIFF CONTENT of test files —
|
|
12
|
+
// CATALOG: the trailer-override shape is reused, the detection surface is not.
|
|
13
|
+
//
|
|
14
|
+
// Assertion-delta guard. ImpossibleBench (arxiv 2510.20270) found that the reward-hacking exploit
|
|
15
|
+
// models reach for most often is editing the test itself — removing an assertion, or adding a
|
|
16
|
+
// skip — while the surrounding CI turns green. A regex over the diff is cheaper and harder to game
|
|
17
|
+
// than an LLM judge for this specific shape: on the current commit range, if a touched test file's
|
|
18
|
+
// diff REMOVES an assertion line with NO assertion line added anywhere in the same range, or the
|
|
19
|
+
// skip-marker count (@Disabled/.skip/xit/fixme) goes UP, that is reward-hacking-shaped and the gate
|
|
20
|
+
// fails asking for an explicit justification. A refactor that moves/rewrites assertions (net delta
|
|
21
|
+
// >= 0) is unaffected — this is a delta gate, not a line-count minimum.
|
|
22
|
+
//
|
|
23
|
+
// Override: an `Assertion-Delta-Override: <reason>` trailer on the tip commit of the range makes the
|
|
24
|
+
// gate pass (logged, not silent) — same commit-footer-trailer shape as INV-119, so the override
|
|
25
|
+
// lands in ordinary commit-message audit trail rather than a separate suppression file.
|
|
26
|
+
//
|
|
27
|
+
// Range determination mirrors check-commit-footer-rationale.mjs (INV-119): defaults to
|
|
28
|
+
// `origin/main..HEAD`, fails OPEN (exit 0, explicit WARN) only when the range itself cannot be
|
|
29
|
+
// resolved (e.g. no `origin` remote in a fresh clone) — never a silent swallow, always logged.
|
|
30
|
+
//
|
|
31
|
+
// Exit codes (INV-53): 0=PASS/override/vacuous/no-range, 1=FAIL, 2=ERROR (self).
|
|
32
|
+
// Usage: node scripts/check-assertion-delta.mjs [--range=<ref>] [--repo-root=<path>] [--evidence-dir=<path>] [--help]
|
|
33
|
+
import { execFileSync } from 'node:child_process'
|
|
34
|
+
import { writeFileSync, mkdirSync } from 'node:fs'
|
|
35
|
+
import { resolve, join } from 'node:path'
|
|
36
|
+
|
|
37
|
+
const HELP = [
|
|
38
|
+
'Usage: node scripts/check-assertion-delta.mjs [options]',
|
|
39
|
+
'',
|
|
40
|
+
'Fails when a diff removes test assertions with none added, or increases the skip-marker count,',
|
|
41
|
+
'without an Assertion-Delta-Override trailer on the tip commit.',
|
|
42
|
+
'',
|
|
43
|
+
'Options:',
|
|
44
|
+
' --range=<ref> Git range to scan (default: origin/main..HEAD)',
|
|
45
|
+
' --repo-root=<path> Repository root to run git in (default: cwd)',
|
|
46
|
+
' --evidence-dir=<path> Directory to write the evidence artifact',
|
|
47
|
+
' --help, -h Show this help and exit',
|
|
48
|
+
].join('\n')
|
|
49
|
+
|
|
50
|
+
// Assertion patterns per stack (AC-3: a data table, not hardcoded in the walk logic).
|
|
51
|
+
const ASSERTION_PATTERNS = [
|
|
52
|
+
{ stack: 'vitest-jest-playwright', re: /\bexpect\s*\(/ },
|
|
53
|
+
{
|
|
54
|
+
stack: 'junit-assertj',
|
|
55
|
+
re: /\bassert(?:That|Equals|True|False|Null|NotNull|ArrayEquals|Throws)\s*\(|\bAssertions\.\w+\s*\(/,
|
|
56
|
+
},
|
|
57
|
+
]
|
|
58
|
+
|
|
59
|
+
// Skip-marker patterns — a rising count is the other reward-hacking shape (increasing xit/@Disabled).
|
|
60
|
+
const SKIP_MARKER_RE = /@Disabled\b|\.skip\s*\(|\bxit\s*\(|\bxtest\s*\(|\bxdescribe\s*\(|\bfixme\b/
|
|
61
|
+
|
|
62
|
+
// Test files this guard considers in scope.
|
|
63
|
+
const TEST_FILE_RE = /\.(?:spec|test)\.(?:ts|tsx|js|jsx|mjs)$|(?:Test|Tests)\.java$/
|
|
64
|
+
|
|
65
|
+
// name -> [key in the parsed result, value transform]
|
|
66
|
+
const FLAG_SPECS = [
|
|
67
|
+
['--range', 'range', (v) => v],
|
|
68
|
+
['--repo-root', 'repoRoot', (v) => resolve(v)],
|
|
69
|
+
['--evidence-dir', 'evidenceDir', (v) => resolve(v)],
|
|
70
|
+
]
|
|
71
|
+
|
|
72
|
+
/** `--flag=value` or `--flag value` for one flag spec; returns null if `arg` doesn't match. */
|
|
73
|
+
function matchFlag(spec, arg, raw, i) {
|
|
74
|
+
const [name, key, transform] = spec
|
|
75
|
+
if (arg.startsWith(`${name}=`)) return { key, value: transform(arg.slice(name.length + 1)), consumed: 0 }
|
|
76
|
+
if (arg === name && i + 1 < raw.length) return { key, value: transform(raw[i + 1]), consumed: 1 }
|
|
77
|
+
return null
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function parseArgs() {
|
|
81
|
+
const raw = process.argv.slice(2)
|
|
82
|
+
const out = { range: 'origin/main..HEAD', repoRoot: process.cwd(), evidenceDir: null, help: false }
|
|
83
|
+
for (let i = 0; i < raw.length; i++) {
|
|
84
|
+
const arg = raw[i]
|
|
85
|
+
if (arg === '--help' || arg === '-h') {
|
|
86
|
+
out.help = true
|
|
87
|
+
continue
|
|
88
|
+
}
|
|
89
|
+
const hit = FLAG_SPECS.map((spec) => matchFlag(spec, arg, raw, i)).find(Boolean)
|
|
90
|
+
if (!hit) continue
|
|
91
|
+
out[hit.key] = hit.value
|
|
92
|
+
i += hit.consumed
|
|
93
|
+
}
|
|
94
|
+
if (!out.evidenceDir) out.evidenceDir = join(out.repoRoot, '.arbiter', 'evidence', 'assertion-delta')
|
|
95
|
+
return out
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function git(repoRoot, args) {
|
|
99
|
+
return execFileSync('git', args, { cwd: repoRoot, encoding: 'utf-8' })
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/** Test files touched in `range`, filtered to TEST_FILE_RE. Returns null if the range can't be resolved. */
|
|
103
|
+
function changedTestFiles(repoRoot, range) {
|
|
104
|
+
try {
|
|
105
|
+
return git(repoRoot, ['diff', '--name-only', range])
|
|
106
|
+
.trim()
|
|
107
|
+
.split('\n')
|
|
108
|
+
.filter(Boolean)
|
|
109
|
+
.filter((f) => TEST_FILE_RE.test(f))
|
|
110
|
+
// FAIL-OPEN-INTENT: range unresolvable (no origin remote) — caller logs a WARN + exits 0 (SKIP).
|
|
111
|
+
} catch {
|
|
112
|
+
return null
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const DIFF_HEADER_RE = /^(?:\+\+\+|---|@@)/
|
|
117
|
+
|
|
118
|
+
/** 'added' | 'removed' | null (header line or context line) for one unified-diff line. */
|
|
119
|
+
function classifyDiffLine(line) {
|
|
120
|
+
if (DIFF_HEADER_RE.test(line)) return null
|
|
121
|
+
if (line.startsWith('+')) return 'added'
|
|
122
|
+
if (line.startsWith('-')) return 'removed'
|
|
123
|
+
return null
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/** Count assertion/skip-marker lines added vs removed for one file's diff in `range`. */
|
|
127
|
+
function fileDelta(repoRoot, range, file) {
|
|
128
|
+
let diff
|
|
129
|
+
try {
|
|
130
|
+
diff = git(repoRoot, ['diff', '--unified=0', range, '--', file])
|
|
131
|
+
// FAIL-OPEN-INTENT: one file's diff failing degrades to a zero delta for THAT file only.
|
|
132
|
+
} catch {
|
|
133
|
+
return { assertionsAdded: 0, assertionsRemoved: 0, skipAdded: 0, skipRemoved: 0 }
|
|
134
|
+
}
|
|
135
|
+
const counts = { assertionsAdded: 0, assertionsRemoved: 0, skipAdded: 0, skipRemoved: 0 }
|
|
136
|
+
for (const line of diff.split('\n')) {
|
|
137
|
+
const kind = classifyDiffLine(line)
|
|
138
|
+
if (!kind) continue
|
|
139
|
+
const body = line.slice(1)
|
|
140
|
+
if (ASSERTION_PATTERNS.some((p) => p.re.test(body))) {
|
|
141
|
+
counts[kind === 'added' ? 'assertionsAdded' : 'assertionsRemoved']++
|
|
142
|
+
}
|
|
143
|
+
if (SKIP_MARKER_RE.test(body)) {
|
|
144
|
+
counts[kind === 'added' ? 'skipAdded' : 'skipRemoved']++
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return counts
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Every commit message in `range`, so an override trailer on ANY commit of the range is honored —
|
|
152
|
+
* not just the tip. Mirrors check-commit-footer-rationale.mjs (INV-119), which scans the whole
|
|
153
|
+
* range rather than only HEAD: a reviewer amending/rewording only the tip to add a trailer is not
|
|
154
|
+
* how commit history normally works, and requiring it would make the override impossible to use
|
|
155
|
+
* without a rebase.
|
|
156
|
+
*/
|
|
157
|
+
function rangeMessages(repoRoot, range) {
|
|
158
|
+
try {
|
|
159
|
+
return git(repoRoot, ['log', '--format=%B%x00', range])
|
|
160
|
+
// FAIL-OPEN-INTENT: unresolvable range → no messages read → no override found (fail-CLOSED).
|
|
161
|
+
} catch {
|
|
162
|
+
return ''
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
const OVERRIDE_RE = /^Assertion-Delta-Override:\s*\S.*$/m
|
|
167
|
+
|
|
168
|
+
function writeEvidence(evidenceDir, data) {
|
|
169
|
+
try {
|
|
170
|
+
mkdirSync(evidenceDir, { recursive: true })
|
|
171
|
+
const ts = new Date().toISOString().replace(/[:.]/g, '-')
|
|
172
|
+
writeFileSync(join(evidenceDir, `${ts}.json`), JSON.stringify(data, null, 2) + '\n')
|
|
173
|
+
} catch (err) {
|
|
174
|
+
process.stderr.write(
|
|
175
|
+
`check-assertion-delta: WARN — could not write evidence: ${err instanceof Error ? err.message : String(err)}\n`,
|
|
176
|
+
)
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function skipUnresolvedRange(evidenceDir, range) {
|
|
181
|
+
process.stderr.write(
|
|
182
|
+
`check-assertion-delta: WARN — range '${range}' could not be resolved (origin unreachable?). Skipping.\n`,
|
|
183
|
+
)
|
|
184
|
+
writeEvidence(evidenceDir, {
|
|
185
|
+
schema: 'arbiter-assertion-delta-v1',
|
|
186
|
+
generated_at: new Date().toISOString(),
|
|
187
|
+
range,
|
|
188
|
+
result: 'SKIP',
|
|
189
|
+
note: 'git range unavailable',
|
|
190
|
+
})
|
|
191
|
+
return 0
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
function passNoTestFilesTouched(evidenceDir, range) {
|
|
195
|
+
process.stdout.write('check-assertion-delta: OK — no test files touched in range.\n')
|
|
196
|
+
writeEvidence(evidenceDir, {
|
|
197
|
+
schema: 'arbiter-assertion-delta-v1',
|
|
198
|
+
generated_at: new Date().toISOString(),
|
|
199
|
+
range,
|
|
200
|
+
files_scanned: 0,
|
|
201
|
+
result: 'PASS',
|
|
202
|
+
})
|
|
203
|
+
return 0
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/** Sum per-file deltas across every changed test file. */
|
|
207
|
+
function collectDeltas(repoRoot, range, files) {
|
|
208
|
+
const totals = { assertionsAdded: 0, assertionsRemoved: 0, skipAdded: 0, skipRemoved: 0 }
|
|
209
|
+
for (const f of files) {
|
|
210
|
+
const d = fileDelta(repoRoot, range, f)
|
|
211
|
+
totals.assertionsAdded += d.assertionsAdded
|
|
212
|
+
totals.assertionsRemoved += d.assertionsRemoved
|
|
213
|
+
totals.skipAdded += d.skipAdded
|
|
214
|
+
totals.skipRemoved += d.skipRemoved
|
|
215
|
+
}
|
|
216
|
+
return totals
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
function detectViolations({ assertionsAdded, assertionsRemoved, skipAdded, skipRemoved }, fileCount) {
|
|
220
|
+
const violations = []
|
|
221
|
+
if (assertionsRemoved > 0 && assertionsAdded === 0) {
|
|
222
|
+
violations.push(`${assertionsRemoved} assertion(s) removed across ${fileCount} test file(s), none added`)
|
|
223
|
+
}
|
|
224
|
+
if (skipAdded > skipRemoved) {
|
|
225
|
+
violations.push(`skip-marker count increased (+${skipAdded} / -${skipRemoved})`)
|
|
226
|
+
}
|
|
227
|
+
return violations
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/** Emit the stdout/stderr verdict for a resolved (non-SKIP) run and return the process exit code. */
|
|
231
|
+
function reportResult(result, violations, fileCount) {
|
|
232
|
+
if (result === 'PASS') {
|
|
233
|
+
process.stdout.write(`check-assertion-delta: OK — ${fileCount} test file(s) scanned, no reward-hacking shape.\n`)
|
|
234
|
+
return 0
|
|
235
|
+
}
|
|
236
|
+
if (result === 'OVERRIDDEN') {
|
|
237
|
+
process.stdout.write(
|
|
238
|
+
`check-assertion-delta: OVERRIDDEN — ${violations.join('; ')} — Assertion-Delta-Override trailer present.\n`,
|
|
239
|
+
)
|
|
240
|
+
return 0
|
|
241
|
+
}
|
|
242
|
+
process.stderr.write(`check-assertion-delta: FAIL — ${violations.join('; ')}\n`)
|
|
243
|
+
process.stderr.write(
|
|
244
|
+
' If this is a legitimate refactor, add a trailer to the tip commit: ' +
|
|
245
|
+
'Assertion-Delta-Override: <reason>\n',
|
|
246
|
+
)
|
|
247
|
+
return 1
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
function main() {
|
|
251
|
+
const { range, repoRoot, evidenceDir, help } = parseArgs()
|
|
252
|
+
if (help) {
|
|
253
|
+
process.stdout.write(HELP + '\n')
|
|
254
|
+
return 0
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
const files = changedTestFiles(repoRoot, range)
|
|
258
|
+
if (files === null) return skipUnresolvedRange(evidenceDir, range)
|
|
259
|
+
if (files.length === 0) return passNoTestFilesTouched(evidenceDir, range)
|
|
260
|
+
|
|
261
|
+
const deltas = collectDeltas(repoRoot, range, files)
|
|
262
|
+
const violations = detectViolations(deltas, files.length)
|
|
263
|
+
const overridden = violations.length > 0 && OVERRIDE_RE.test(rangeMessages(repoRoot, range))
|
|
264
|
+
const result = violations.length === 0 ? 'PASS' : overridden ? 'OVERRIDDEN' : 'FAIL'
|
|
265
|
+
|
|
266
|
+
writeEvidence(evidenceDir, {
|
|
267
|
+
schema: 'arbiter-assertion-delta-v1',
|
|
268
|
+
generated_at: new Date().toISOString(),
|
|
269
|
+
range,
|
|
270
|
+
files_scanned: files.length,
|
|
271
|
+
assertions_added: deltas.assertionsAdded,
|
|
272
|
+
assertions_removed: deltas.assertionsRemoved,
|
|
273
|
+
skip_added: deltas.skipAdded,
|
|
274
|
+
skip_removed: deltas.skipRemoved,
|
|
275
|
+
violations,
|
|
276
|
+
result,
|
|
277
|
+
})
|
|
278
|
+
|
|
279
|
+
return reportResult(result, violations, files.length)
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
try {
|
|
283
|
+
process.exit(main())
|
|
284
|
+
} catch (e) {
|
|
285
|
+
process.stderr.write(`check-assertion-delta: ERROR — ${e?.message ?? e}\n`)
|
|
286
|
+
process.exit(2)
|
|
287
|
+
}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
// CATALOG: E3 (#1943, M14) — audit dry-pass termination gate. A discovery loop of unknown
|
|
4
|
+
// CATALOG: size (audit, backlog drain, dead-code hunt) may conclude only after TWO consecutive
|
|
5
|
+
// CATALOG: passes with zero new findings, produced by differently-seeded scans. Converts "I think
|
|
6
|
+
// CATALOG: we got everything" (a claim, R2) into a checkable predicate. Reads the pass-ledger
|
|
7
|
+
// CATALOG: (.arbiter/evidence/audit/<audit-id>/pass-ledger.jsonl) and refuses a conclusion
|
|
8
|
+
// CATALOG: artifact (report.md/concluded.json) present while the ledger is still wet.
|
|
9
|
+
// CATALOG: Rejected fold-in into check-evidence-bundle.mjs: that validates the per-task TDD
|
|
10
|
+
// CATALOG: bundle shape, a different envelope; the dry-pass ledger is a JSONL audit trail with a
|
|
11
|
+
// CATALOG: two-dry-pass termination rule that has no analog in the bundle validator.
|
|
12
|
+
//
|
|
13
|
+
// Exit codes (INV-53): 0 PASS, 1 FAIL (concluded-but-wet / same-seed double-dry / malformed), 2 ERROR.
|
|
14
|
+
// Vacuous pass when no audit dirs exist.
|
|
15
|
+
//
|
|
16
|
+
// Usage:
|
|
17
|
+
// node scripts/check-audit-dry-pass.mjs [--dir <auditDir>] [--all] [--root <dir>]
|
|
18
|
+
// --dir lint a single audit directory
|
|
19
|
+
// --all scan every .arbiter/evidence/audit/* under --root (default)
|
|
20
|
+
import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs'
|
|
21
|
+
import { join, resolve } from 'node:path'
|
|
22
|
+
import { fileURLToPath } from 'node:url'
|
|
23
|
+
import { arg } from './lib/gate-args.mjs'
|
|
24
|
+
|
|
25
|
+
const __dirname = fileURLToPath(new URL('.', import.meta.url))
|
|
26
|
+
const repoDefault = resolve(__dirname, '..')
|
|
27
|
+
|
|
28
|
+
const argv = process.argv.slice(2)
|
|
29
|
+
const DIR_ARG = arg('dir', argv)
|
|
30
|
+
const ALL = argv.includes('--all')
|
|
31
|
+
const ROOT = arg('root', argv) ? resolve(arg('root', argv)) : repoDefault
|
|
32
|
+
const AUDIT_ROOT = join(ROOT, '.arbiter', 'evidence', 'audit')
|
|
33
|
+
const CONCLUSION_FILES = ['report.md', 'concluded.json', 'REPORT.md']
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Parse a JSONL pass-ledger. Returns { passes: object[], malformed: string[] }.
|
|
37
|
+
* @param {string} ledgerPath
|
|
38
|
+
*/
|
|
39
|
+
function parseLedger(ledgerPath) {
|
|
40
|
+
/** @type {Record<string, unknown>[]} */
|
|
41
|
+
const passes = []
|
|
42
|
+
/** @type {string[]} */
|
|
43
|
+
const malformed = []
|
|
44
|
+
let raw
|
|
45
|
+
try {
|
|
46
|
+
raw = readFileSync(ledgerPath, 'utf-8')
|
|
47
|
+
// FAIL-OPEN-INTENT: readFileSync failure is surfaced via the returned `unreadable:true` flag; the caller emits a FAIL for it (fail-closed at the caller).
|
|
48
|
+
} catch {
|
|
49
|
+
return { passes, malformed, unreadable: true }
|
|
50
|
+
}
|
|
51
|
+
for (const line of raw.split('\n')) {
|
|
52
|
+
if (line.trim() === '') continue
|
|
53
|
+
try {
|
|
54
|
+
const obj = JSON.parse(line)
|
|
55
|
+
if (typeof obj !== 'object' || obj === null) {
|
|
56
|
+
malformed.push(`non-object line: ${line.slice(0, 60)}`)
|
|
57
|
+
continue
|
|
58
|
+
}
|
|
59
|
+
passes.push(/** @type {Record<string, unknown>} */ (obj))
|
|
60
|
+
// FAIL-OPEN-INTENT: JSON parse error is recorded into the malformed[] array, which the caller surfaces as a FAIL (fail-closed).
|
|
61
|
+
} catch (err) {
|
|
62
|
+
malformed.push(`unparseable line: ${err instanceof Error ? err.message : String(err)}`)
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return { passes, malformed, unreadable: false }
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Lint one audit dir. Returns array of violation messages (empty = pass).
|
|
70
|
+
* @param {string} auditDir
|
|
71
|
+
* @returns {string[]}
|
|
72
|
+
*/
|
|
73
|
+
function lintAudit(auditDir) {
|
|
74
|
+
/** @type {string[]} */
|
|
75
|
+
const violations = []
|
|
76
|
+
const concluded = CONCLUSION_FILES.some((f) => existsSync(join(auditDir, f)))
|
|
77
|
+
const ledgerPath = join(auditDir, 'pass-ledger.jsonl')
|
|
78
|
+
if (!existsSync(ledgerPath)) {
|
|
79
|
+
// No ledger: if no conclusion either → nothing to adjudicate (pass). If a conclusion
|
|
80
|
+
// exists with no ledger → fail (concluded with no dry-pass proof).
|
|
81
|
+
if (concluded) violations.push(`${auditDir}: conclusion present but no pass-ledger.jsonl`)
|
|
82
|
+
return violations
|
|
83
|
+
}
|
|
84
|
+
const { passes, malformed, unreadable } = parseLedger(ledgerPath)
|
|
85
|
+
if (unreadable) {
|
|
86
|
+
violations.push(`${auditDir}: cannot read pass-ledger.jsonl`)
|
|
87
|
+
return violations
|
|
88
|
+
}
|
|
89
|
+
if (malformed.length > 0) {
|
|
90
|
+
violations.push(`${auditDir}: malformed ledger — ${malformed.join('; ')}`)
|
|
91
|
+
return violations
|
|
92
|
+
}
|
|
93
|
+
// No conclusion → nothing to adjudicate yet (the skill invokes the gate before concluding,
|
|
94
|
+
// so a wet ledger with no conclusion is the normal in-flight state, not a fail).
|
|
95
|
+
if (!concluded) return violations
|
|
96
|
+
if (passes.length < 2) {
|
|
97
|
+
violations.push(`${auditDir}: conclusion present but ledger has <2 passes (${passes.length})`)
|
|
98
|
+
return violations
|
|
99
|
+
}
|
|
100
|
+
const last = passes[passes.length - 1]
|
|
101
|
+
const prev = passes[passes.length - 2]
|
|
102
|
+
const lastNew = Number(last['newFindings'] ?? -1)
|
|
103
|
+
const prevNew = Number(prev['newFindings'] ?? -1)
|
|
104
|
+
if (lastNew !== 0 || prevNew !== 0) {
|
|
105
|
+
violations.push(
|
|
106
|
+
`${auditDir}: concluded but last two passes are not both dry (newFindings: ${prevNew}, ${lastNew})`,
|
|
107
|
+
)
|
|
108
|
+
return violations
|
|
109
|
+
}
|
|
110
|
+
const lastSeed = String(last['seed'] ?? '')
|
|
111
|
+
const prevSeed = String(prev['seed'] ?? '')
|
|
112
|
+
if (lastSeed === prevSeed) {
|
|
113
|
+
violations.push(
|
|
114
|
+
`${auditDir}: two dry passes share the same seed "${lastSeed}" — one sample, not two`,
|
|
115
|
+
)
|
|
116
|
+
return violations
|
|
117
|
+
}
|
|
118
|
+
return violations
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function listAuditDirs() {
|
|
122
|
+
if (!existsSync(AUDIT_ROOT)) return []
|
|
123
|
+
/** @type {string[]} */
|
|
124
|
+
const out = []
|
|
125
|
+
for (const entry of readdirSync(AUDIT_ROOT)) {
|
|
126
|
+
const full = join(AUDIT_ROOT, entry)
|
|
127
|
+
try {
|
|
128
|
+
if (statSync(full).isDirectory()) out.push(full)
|
|
129
|
+
// FAIL-OPEN-INTENT: statSync ENOENT race (dir entry removed between readdir+stat) — rethrow all others; the entry is just skipped.
|
|
130
|
+
} catch {
|
|
131
|
+
/* skip */
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return out
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function main() {
|
|
138
|
+
/** @type {string[]} */
|
|
139
|
+
let dirs
|
|
140
|
+
if (DIR_ARG) {
|
|
141
|
+
dirs = [resolve(DIR_ARG)]
|
|
142
|
+
} else if (ALL || !DIR_ARG) {
|
|
143
|
+
// default behavior (no --dir) = scan all under --root
|
|
144
|
+
dirs = listAuditDirs()
|
|
145
|
+
}
|
|
146
|
+
if (!dirs) dirs = []
|
|
147
|
+
let checked = 0
|
|
148
|
+
let totalViolations = 0
|
|
149
|
+
for (const d of dirs) {
|
|
150
|
+
if (!existsSync(d)) {
|
|
151
|
+
process.stderr.write(`[check-audit-dry-pass] ERROR: dir not found: ${d}\n`)
|
|
152
|
+
return 2
|
|
153
|
+
}
|
|
154
|
+
checked++
|
|
155
|
+
const v = lintAudit(d)
|
|
156
|
+
for (const msg of v) process.stdout.write(`[check-audit-dry-pass] FAIL: ${msg}\n`)
|
|
157
|
+
totalViolations += v.length
|
|
158
|
+
}
|
|
159
|
+
if (totalViolations > 0) {
|
|
160
|
+
process.stdout.write(
|
|
161
|
+
`[check-audit-dry-pass] FAIL: ${totalViolations} violation(s) across ${checked} audit dir(s)\n`,
|
|
162
|
+
)
|
|
163
|
+
return 1
|
|
164
|
+
}
|
|
165
|
+
process.stdout.write(`[check-audit-dry-pass] OK — ${checked} audit dir(s) passed\n`)
|
|
166
|
+
return 0
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
try {
|
|
170
|
+
process.exit(main())
|
|
171
|
+
} catch (err) {
|
|
172
|
+
process.stderr.write(
|
|
173
|
+
`[check-audit-dry-pass] ERROR: ${err instanceof Error ? err.message : String(err)}\n`,
|
|
174
|
+
)
|
|
175
|
+
process.exit(2)
|
|
176
|
+
}
|