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