@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,4 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import{existsSync}from"node:fs";import{join}from"node:path";import{runCli,CliError}from"../utils/run-cli.js";import{detectLanguage}from"../detectors/language.js";import{detectPackageManager}from"../detectors/package-manager.js";import{matches,UnparseableConstraintError,validateRanges}from"./matcher.js";import{parseNodeVersion,parseNpmVersion,parseJavaVersion,parseGradleVersion,parseMavenVersion,parseRustVersion,parseCargoVersion,parseGoVersion,parsePythonVersion,parsePipVersion,parseRuffVersion,parseLintImportsVersion,parseKotlinVersion}from"./parsers.js";import{makeVerifyReport}from"./schema.js";import matrixJson from"./matrix.json"with{type:"json"};const TOOL_SPECS={node:{args:["--version"],channel:"stdout",parse:parseNodeVersion},npm:{args:["--version"],channel:"stdout",parse:parseNpmVersion},java:{args:["-version"],channel:"stderr",parse:parseJavaVersion},gradle:{args:["--version"],channel:"stdout",parse:parseGradleVersion},mvn:{args:["--version"],channel:"stdout",parse:parseMavenVersion},rustc:{args:["--version"],channel:"stdout",parse:parseRustVersion},cargo:{args:["--version"],channel:"stdout",parse:parseCargoVersion},go:{args:["version"],channel:"stdout",parse:parseGoVersion},python3:{args:["--version"],channel:"stdout",parse:parsePythonVersion},pip:{args:["--version"],channel:"stdout",parse:parsePipVersion},ruff:{args:["--version"],channel:"stdout",parse:parseRuffVersion},"lint-imports":{args:["--version"],channel:"stdout",parse:parseLintImportsVersion},kotlinc:{args:["-version"],channel:"stderr",parse:parseKotlinVersion}};function parseTimeoutEnv(name,fallback){const raw=process.env[name];if(raw===void 0||raw==="")return fallback;const n=Number(raw);return Number.isFinite(n)&&n>0?n:fallback}const PROBE_TIMEOUT_MS=parseTimeoutEnv("ARBITER_PROBE_TIMEOUT_MS",1e4),BUILD_PROBE_TIMEOUT_MS=parseTimeoutEnv("ARBITER_BUILD_PROBE_TIMEOUT_MS",6e4),TSC_BUILD_PROBE={name:"tsc:noEmit",command:"npx",args:["tsc","--noEmit"],requires:"tsconfig.json"},GRADLEW_BUILD_PROBE={name:"gradlew:version",command:"./gradlew",args:["--version"],requires:"gradlew"},CARGO_BUILD_PROBE={name:"cargo:check",command:"cargo",args:["check"],requires:"Cargo.toml"},GO_BUILD_PROBE={name:"go:build",command:"go",args:["build","-n","./..."],requires:"go.mod"};function buildProbesFor(lang){switch(lang){case"typescript":return[TSC_BUILD_PROBE];case"java":case"kotlin":return[GRADLEW_BUILD_PROBE];case"rust":return[CARGO_BUILD_PROBE];case"go":return[GO_BUILD_PROBE];case"multi":return[TSC_BUILD_PROBE,GRADLEW_BUILD_PROBE];default:return[]}}const VERSION_FLAG_UNSUPPORTED=/(no such option|unrecognized arguments?|unknown option|invalid option)[^\n]*--version/i;export function probeTool(tool,args,range,channel){const spec=TOOL_SPECS[tool];if(!spec)return{tool,status:"failed",reason:`no spec for tool: ${tool}`};const parse=spec.parse;let raw;try{const result=runCli(tool,args,{timeoutMs:PROBE_TIMEOUT_MS});raw=channel==="stderr"?result.stderr:result.stdout}catch(err){if(err instanceof CliError){if(err.notFound)return{tool,status:"skipped",reason:"toolchain-missing"};if(err.timedOut)return{tool,status:"failed",reason:`probe timeout (${PROBE_TIMEOUT_MS}ms)`};const detail=(err.stderr||err.stdout||err.message).trim().slice(0,500);return VERSION_FLAG_UNSUPPORTED.test(detail)?{tool,status:"skipped",reason:"version-flag-unsupported: tool does not support --version (cannot probe version)"}:{tool,status:"failed",reason:`exit ${err.exitCode}: ${detail}`}}throw err}const version=parse(raw);if(version===null)return{tool,status:"failed",reason:`unrecognized version output: ${raw.trim().slice(0,60)}`};let inRange;try{inRange=matches(version,range)}catch(err){if(err instanceof UnparseableConstraintError)return{tool,status:"failed",version,reason:`matrix-bug: ${err.message}`};throw err}return inRange?{tool,status:"passed",version}:{tool,status:"failed",version,reason:`version ${version.major}.${version.minor} outside ${range}`}}const REQUIRED_MATRIX_KEYS=["typescript","java","kotlin","rust","go","python"];export function validateMatrix(raw){if(typeof raw!="object"||raw===null||Array.isArray(raw))throw new Error("matrix.json: root must be an object");const obj=raw;for(const key of REQUIRED_MATRIX_KEYS){const arr=obj[key];if(!Array.isArray(arr))throw new Error(`matrix.json: ${key} must be an array`);arr.forEach((entry,i)=>{if(typeof entry!="object"||entry===null)throw new Error(`matrix.json: ${key}[${i}] must be an object`);const e=entry;if(typeof e.tool!="string")throw new Error(`matrix.json: ${key}[${i}].tool expected string, got ${typeof e.tool}`);if(typeof e.range!="string")throw new Error(`matrix.json: ${key}[${i}].range expected string, got ${typeof e.range}`)})}return obj}const MATRIX=validateMatrix(matrixJson);function assertMatrixRangesParseable(matrix){const allEntries=[];for(const key of REQUIRED_MATRIX_KEYS)for(const entry of matrix[key])allEntries.push({tool:entry.tool,range:entry.range});const failures=validateRanges(allEntries);if(failures.length>0){const summary=failures.map(f=>` ${f.tool}: ${f.reason}`).join(`
|
|
3
|
+
`);throw new Error(`matrix.json contains ${failures.length} unparseable range(s):
|
|
4
|
+
${summary}`)}}assertMatrixRangesParseable(MATRIX);const CompilerErrorPatterns=[/\berror(\[E\d+\])?:/i,/\bTS\d{4,}:/,/\bFAILED\b/,/\bfatal error\b/i,/compilation (failed|error)/i];export function runBuildProbe(dir,spec){if(spec.requires!==""&&!existsSync(join(dir,spec.requires)))return{tool:spec.name,status:"skipped",kind:"build",reason:`build-file-not-found: ${spec.requires}`};if(spec.command==="npx"&&!existsSync(join(dir,"node_modules")))return{tool:spec.name,status:"skipped",kind:"build",reason:"node-modules-missing: run `npm install`, then `arbiter validate` to verify"};try{const stderr=runCli(spec.command,spec.args,{cwd:dir,timeoutMs:BUILD_PROBE_TIMEOUT_MS}).stderr.trim();return stderr!==""&&CompilerErrorPatterns.some(p=>p.test(stderr))?{tool:spec.name,status:"failed",kind:"build",reason:`exit 0 with compiler errors on stderr: ${stderr.slice(0,500)}`}:stderr!==""?{tool:spec.name,status:"passed",kind:"build",reason:`stderr warnings (exit 0): ${stderr.slice(0,200)}`}:{tool:spec.name,status:"passed",kind:"build"}}catch(err){if(err instanceof CliError){if(err.notFound)return{tool:spec.name,status:"skipped",kind:"build",reason:"toolchain-missing"};if(err.timedOut)return{tool:spec.name,status:"failed",kind:"build",reason:`build timeout (${BUILD_PROBE_TIMEOUT_MS}ms)`};const detail=(err.stderr||err.stdout||err.message).trim().slice(0,500);return{tool:spec.name,status:"failed",kind:"build",reason:`exit ${err.exitCode}: ${detail}`}}throw err}}function matrixEntriesFor(lang){switch(lang){case"typescript":return MATRIX.typescript;case"java":return MATRIX.java;case"kotlin":return MATRIX.kotlin;case"rust":return MATRIX.rust;case"go":return MATRIX.go;case"python":return MATRIX.python;case"multi":return[...MATRIX.typescript,...MATRIX.java];default:return[]}}export function runProbes(dir){const lang=detectLanguage(dir),packageManager=detectPackageManager(dir),entries=matrixEntriesFor(lang),probes=entries.map(({tool,range})=>{if(tool==="npm"&&packageManager.name!=="npm")return{tool:"npm",status:"skipped",reason:`package-manager: ${packageManager.name} is configured for this project \u2014 the npm probe does not apply`};const spec=TOOL_SPECS[tool];return spec?probeTool(tool,spec.args,range,spec.channel):{tool,status:"failed",reason:`no spec for tool: ${tool}`}});entries.length===0&&probes.push({tool:"matrix",status:"skipped",reason:`no matrix coverage for stack '${lang}'`});for(const buildSpec of buildProbesFor(lang))probes.push(runBuildProbe(dir,buildSpec));const hooksProbe=probeHooksPath(dir);return hooksProbe!==null&&probes.push(hooksProbe),makeVerifyReport(dir,lang,probes)}export function probeHooksPath(dir){const preCommitPath=join(dir,".githooks","pre-commit");if(!existsSync(preCommitPath))return null;let configuredPath;try{configuredPath=runCli("git",["config","--get","core.hooksPath"],{cwd:dir,timeoutMs:PROBE_TIMEOUT_MS}).stdout.trim()}catch{configuredPath=null}return configuredPath===".githooks"?{tool:"hooksPath",status:"passed"}:{tool:"hooksPath",status:"warning",reason:".githooks/pre-commit exists but core.hooksPath is not set to .githooks. Run: git config core.hooksPath .githooks (or ./scripts/setup-hooks.sh for non-Node projects)."}}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const REMEDIATION={node:"Upgrade Node.js: https://nodejs.org/en/download",npm:"Upgrade npm: npm install -g npm",java:"Upgrade JDK: https://adoptium.net",gradle:"Upgrade Gradle wrapper: ./gradlew wrapper --gradle-version=8.x",mvn:"Upgrade Maven: https://maven.apache.org/download.cgi",rustc:"Upgrade Rust: rustup update stable",cargo:"Upgrade Cargo (via rustup): rustup update stable",go:"Upgrade Go: https://go.dev/dl",python3:"Upgrade Python: https://python.org/downloads",pip:"Upgrade pip: python3 -m pip install --upgrade pip",ruff:"Install/upgrade ruff: pip install --upgrade ruff",kotlinc:"Upgrade Kotlin: https://kotlinlang.org/docs/releases.html","gradlew:version":"Check Gradle wrapper version: ./gradlew wrapper --gradle-version=X","tsc:noEmit":"Fix TypeScript errors or install: npm install --save-dev typescript","cargo:check":"Fix Rust compile errors: cargo check","go:build":"Fix Go build errors: go build ./..."};function versionStr(p){const v="version"in p?p.version:void 0;return v?`${v.major}.${v.minor}.${v.patch}`:""}export function formatText(report){const lines=[];lines.push(`arbiter verify \u2014 stack: ${report.stack} dir: ${report.dir}`),lines.push("");for(const p of report.probes){const ver=versionStr(p),detail=p.reason?` (${p.reason})`:ver?` ${ver}`:"",prefix=p.status==="warning"?"\u26A0 ":"";if(lines.push(` [${p.status}] ${prefix}${p.tool}${detail}`),p.status==="failed"){const hint=REMEDIATION[p.tool]??"See tool documentation";lines.push(` \u2192 ${hint}`)}p.status==="warning"&&p.reason&&lines.push(` \u2192 ${p.reason}`)}if(lines.push(""),report.hasFailures?lines.push("Result: FAIL"):lines.push("Result: OK"),report.hasWarnings){const warnCount=report.probes.filter(p=>p.status==="warning").length;lines.push(`\u26A0 ${warnCount} warning(s): run suggested commands above`)}return lines.join(`
|
|
2
|
+
`)}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { SemVer } from './parsers.js';
|
|
2
|
+
/** One tool probe entry within the matrix */
|
|
3
|
+
export interface MatrixEntry {
|
|
4
|
+
/** CLI tool name (e.g. "node", "java") */
|
|
5
|
+
tool: string;
|
|
6
|
+
/** Version range expression (e.g. ">=18 <22") */
|
|
7
|
+
range: string;
|
|
8
|
+
}
|
|
9
|
+
/** Per-language set of required tools */
|
|
10
|
+
export interface LanguageMatrix {
|
|
11
|
+
typescript: MatrixEntry[];
|
|
12
|
+
java: MatrixEntry[];
|
|
13
|
+
kotlin: MatrixEntry[];
|
|
14
|
+
rust: MatrixEntry[];
|
|
15
|
+
go: MatrixEntry[];
|
|
16
|
+
python: MatrixEntry[];
|
|
17
|
+
}
|
|
18
|
+
/** Result of probing a single tool */
|
|
19
|
+
export type ProbeStatus = 'passed' | 'skipped' | 'failed' | 'warning';
|
|
20
|
+
/** Whether probe checks installed tool version or invokes a build command */
|
|
21
|
+
type ProbeKind = 'version' | 'build';
|
|
22
|
+
/** Fields shared by every probe outcome regardless of `status`. */
|
|
23
|
+
interface ProbeResultBase {
|
|
24
|
+
tool: string;
|
|
25
|
+
/** Distinguishes version checks from build-invocation probes */
|
|
26
|
+
kind?: ProbeKind;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Result of probing a single tool, discriminated on `status` (#1533 item 3).
|
|
30
|
+
* Modelling the four outcomes as a union — rather than a flat record with three
|
|
31
|
+
* independent optionals — makes the real invariants compile-time facts: a
|
|
32
|
+
* `failed`/`skipped`/`warning` probe ALWAYS carries a `reason`, and only the
|
|
33
|
+
* version-bearing states expose `version`. Consumers no longer defensively
|
|
34
|
+
* null-check fields the type can prove present (or absent).
|
|
35
|
+
*/
|
|
36
|
+
export type ProbeResult = (ProbeResultBase & {
|
|
37
|
+
status: 'passed';
|
|
38
|
+
/** Parsed version when this was a version probe that found the tool. */
|
|
39
|
+
version?: SemVer;
|
|
40
|
+
/** Optional advisory trail (e.g. build stderr warnings on a zero exit). */
|
|
41
|
+
reason?: string;
|
|
42
|
+
}) | (ProbeResultBase & {
|
|
43
|
+
status: 'failed';
|
|
44
|
+
/** Present when a version probe found-but-rejected the tool. */
|
|
45
|
+
version?: SemVer;
|
|
46
|
+
/** Human-readable failure cause — always present for a failure. */
|
|
47
|
+
reason: string;
|
|
48
|
+
}) | (ProbeResultBase & {
|
|
49
|
+
status: 'skipped';
|
|
50
|
+
/** Why the probe was skipped (e.g. toolchain-missing). */
|
|
51
|
+
reason: string;
|
|
52
|
+
}) | (ProbeResultBase & {
|
|
53
|
+
status: 'warning';
|
|
54
|
+
/** Human-readable warning detail — always present for a warning. */
|
|
55
|
+
reason: string;
|
|
56
|
+
});
|
|
57
|
+
/**
|
|
58
|
+
* Aggregated report for all probed tools. `hasFailures`/`hasWarnings` are DERIVED from `probes`
|
|
59
|
+
* and `probes` is readonly, so the invariant cannot drift — always build one via
|
|
60
|
+
* {@link makeVerifyReport}, never by hand-setting the two booleans alongside a mutable array.
|
|
61
|
+
*/
|
|
62
|
+
export interface VerifyReport {
|
|
63
|
+
/** Target directory that was probed */
|
|
64
|
+
readonly dir: string;
|
|
65
|
+
/** Detected language stack */
|
|
66
|
+
readonly stack: string;
|
|
67
|
+
/** Results for each probed tool */
|
|
68
|
+
readonly probes: readonly ProbeResult[];
|
|
69
|
+
/** true if any probe has status "failed" (derived from `probes`) */
|
|
70
|
+
readonly hasFailures: boolean;
|
|
71
|
+
/** true if any probe has status "warning" (derived from `probes`) */
|
|
72
|
+
readonly hasWarnings: boolean;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Construct a {@link VerifyReport}, deriving `hasFailures`/`hasWarnings` from `probes` in the one
|
|
76
|
+
* place they are computed. This is the only sanctioned constructor — it keeps the two summary
|
|
77
|
+
* booleans in lock-step with the probe array so no producer can leave them out of sync (#1533).
|
|
78
|
+
*/
|
|
79
|
+
export declare function makeVerifyReport(dir: string, stack: string, probes: readonly ProbeResult[]): VerifyReport;
|
|
80
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function makeVerifyReport(dir,stack,probes){return{dir,stack,probes,hasFailures:probes.some(p=>p.status==="failed"),hasWarnings:probes.some(p=>p.status==="warning")}}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schemaVersion": 1,
|
|
3
|
+
"_lastUpdated": "2026-05-16",
|
|
4
|
+
"_refreshCadence": "monthly",
|
|
5
|
+
"_promotionCriteria": "proven = used in >=3 arbiter recipes + verified version range; beta = present but not exercised by CI fixtures; unknown = detected but no matrix entry yet",
|
|
6
|
+
"skills": [
|
|
7
|
+
{
|
|
8
|
+
"skillId": "superpowers:test-driven-development",
|
|
9
|
+
"pluginOwner": "superpowers",
|
|
10
|
+
"versionRange": ">=5.0.0",
|
|
11
|
+
"role": "TDD enforcement",
|
|
12
|
+
"integrationStatus": "proven",
|
|
13
|
+
"replaces": ["tdd"],
|
|
14
|
+
"referenceUrl": "https://github.com/obra/superpowers"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"skillId": "superpowers:verification-before-completion",
|
|
18
|
+
"pluginOwner": "superpowers",
|
|
19
|
+
"versionRange": ">=5.0.0",
|
|
20
|
+
"role": "completion-claim verification",
|
|
21
|
+
"integrationStatus": "proven",
|
|
22
|
+
"replaces": ["verification"],
|
|
23
|
+
"referenceUrl": "https://github.com/obra/superpowers"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"skillId": "superpowers:brainstorming",
|
|
27
|
+
"pluginOwner": "superpowers",
|
|
28
|
+
"versionRange": ">=5.0.0",
|
|
29
|
+
"role": "pre-implementation design",
|
|
30
|
+
"integrationStatus": "beta",
|
|
31
|
+
"replaces": [],
|
|
32
|
+
"referenceUrl": "https://github.com/obra/superpowers"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"skillId": "superpowers:writing-plans",
|
|
36
|
+
"pluginOwner": "superpowers",
|
|
37
|
+
"versionRange": ">=5.0.0",
|
|
38
|
+
"role": "plan authoring",
|
|
39
|
+
"integrationStatus": "beta",
|
|
40
|
+
"replaces": [],
|
|
41
|
+
"referenceUrl": "https://github.com/obra/superpowers"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"skillId": "superpowers:systematic-debugging",
|
|
45
|
+
"pluginOwner": "superpowers",
|
|
46
|
+
"versionRange": ">=5.0.0",
|
|
47
|
+
"role": "debug discipline",
|
|
48
|
+
"integrationStatus": "beta",
|
|
49
|
+
"replaces": [],
|
|
50
|
+
"referenceUrl": "https://github.com/obra/superpowers"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"skillId": "superpowers:subagent-driven-development",
|
|
54
|
+
"pluginOwner": "superpowers",
|
|
55
|
+
"versionRange": ">=5.0.0",
|
|
56
|
+
"role": "parallel implementation",
|
|
57
|
+
"integrationStatus": "beta",
|
|
58
|
+
"replaces": [],
|
|
59
|
+
"referenceUrl": "https://github.com/obra/superpowers"
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"skillId": "superpowers:using-superpowers",
|
|
63
|
+
"pluginOwner": "superpowers",
|
|
64
|
+
"versionRange": ">=5.0.0",
|
|
65
|
+
"role": "session bootstrap (skill discovery)",
|
|
66
|
+
"integrationStatus": "beta",
|
|
67
|
+
"replaces": [],
|
|
68
|
+
"referenceUrl": "https://github.com/obra/superpowers"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"skillId": "pr-review-toolkit:review-pr",
|
|
72
|
+
"pluginOwner": "pr-review-toolkit",
|
|
73
|
+
"versionRange": ">=1.0.0",
|
|
74
|
+
"role": "PR code review",
|
|
75
|
+
"integrationStatus": "proven",
|
|
76
|
+
"replaces": [],
|
|
77
|
+
"referenceUrl": "https://github.com/anthropics/claude-code"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"skillId": "frontend-design:frontend-design",
|
|
81
|
+
"pluginOwner": "frontend-design",
|
|
82
|
+
"versionRange": ">=1.0.0",
|
|
83
|
+
"role": "UI/UX guidance for frontend-spa",
|
|
84
|
+
"integrationStatus": "proven",
|
|
85
|
+
"replaces": [],
|
|
86
|
+
"referenceUrl": ""
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"skillId": "ponytail:ponytail",
|
|
90
|
+
"pluginOwner": "ponytail",
|
|
91
|
+
"versionRange": ">=4.0.0",
|
|
92
|
+
"role": "YAGNI drafting persona (/ship green-phase companion, #1730)",
|
|
93
|
+
"integrationStatus": "beta",
|
|
94
|
+
"replaces": [],
|
|
95
|
+
"referenceUrl": "https://github.com/DietrichGebert/ponytail"
|
|
96
|
+
}
|
|
97
|
+
]
|
|
98
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { SkillMatrixEntry } from '../integrations/types.js';
|
|
3
|
+
declare const SkillsMatrixSchema: z.ZodObject<{
|
|
4
|
+
$schemaVersion: z.ZodLiteral<1>;
|
|
5
|
+
_lastUpdated: z.ZodString;
|
|
6
|
+
_refreshCadence: z.ZodString;
|
|
7
|
+
_promotionCriteria: z.ZodString;
|
|
8
|
+
skills: z.ZodArray<z.ZodObject<{
|
|
9
|
+
skillId: z.ZodString;
|
|
10
|
+
pluginOwner: z.ZodString;
|
|
11
|
+
versionRange: z.ZodString;
|
|
12
|
+
role: z.ZodString;
|
|
13
|
+
integrationStatus: z.ZodEnum<{
|
|
14
|
+
unknown: "unknown";
|
|
15
|
+
beta: "beta";
|
|
16
|
+
proven: "proven";
|
|
17
|
+
}>;
|
|
18
|
+
replaces: z.ZodArray<z.ZodString>;
|
|
19
|
+
referenceUrl: z.ZodString;
|
|
20
|
+
}, z.core.$strip>>;
|
|
21
|
+
}, z.core.$strip>;
|
|
22
|
+
export type SkillsMatrix = z.infer<typeof SkillsMatrixSchema>;
|
|
23
|
+
export interface ValidationResult {
|
|
24
|
+
valid: boolean;
|
|
25
|
+
errors: string[];
|
|
26
|
+
}
|
|
27
|
+
export declare function validateSkillsMatrix(raw: unknown): ValidationResult;
|
|
28
|
+
export declare function loadSkillsMatrix(): SkillsMatrix;
|
|
29
|
+
export declare function getSkillsMatrixEntries(): SkillMatrixEntry[];
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import{z}from"zod";import skillsMatrixJson from"./skills-matrix.json"with{type:"json"};import skillNames from"../generators/skill-names.json"with{type:"json"};const VALID_SKILL_NAMES=new Set(skillNames),SkillEntrySchema=z.object({skillId:z.string().min(1),pluginOwner:z.string().min(1),versionRange:z.string().min(1),role:z.string(),integrationStatus:z.enum(["proven","beta","unknown"]),replaces:z.array(z.string()),referenceUrl:z.string()}),SkillsMatrixSchema=z.object({$schemaVersion:z.literal(1),_lastUpdated:z.string(),_refreshCadence:z.string(),_promotionCriteria:z.string(),skills:z.array(SkillEntrySchema)});export function validateSkillsMatrix(raw){const errors=[],parsed=SkillsMatrixSchema.safeParse(raw);if(!parsed.success){for(const issue of parsed.error.issues)errors.push(`${issue.path.join(".")}: ${issue.message}`);return{valid:!1,errors}}for(const entry of parsed.data.skills)for(const name of entry.replaces)VALID_SKILL_NAMES.has(name)||errors.push(`skills-matrix: "${entry.skillId}" replaces unknown SKILL_NAME "${name}". Valid names: ${[...VALID_SKILL_NAMES].join(", ")}`);return{valid:errors.length===0,errors}}export function loadSkillsMatrix(){const raw=skillsMatrixJson,result=validateSkillsMatrix(raw);if(!result.valid)throw new Error(`skills-matrix.json is invalid:
|
|
3
|
+
${result.errors.join(`
|
|
4
|
+
`)}`);return raw}export function getSkillsMatrixEntries(){return loadSkillsMatrix().skills.map(s=>({skillId:s.skillId,pluginOwner:s.pluginOwner,versionRange:s.versionRange,role:s.role,integrationStatus:s.integrationStatus,replaces:s.replaces,referenceUrl:s.referenceUrl}))}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import{existsSync,readFileSync}from"node:fs";import{join}from"node:path";import{globMatch}from"../conformance/shared.js";export const IGNORE_FILE_NAME=".arbiterignore";export function loadIgnorePatterns(targetDir){const path=join(targetDir,IGNORE_FILE_NAME);if(!existsSync(path))return[];let raw;try{raw=readFileSync(path,"utf-8")}catch{return[]}return raw.split(`
|
|
3
|
+
`).map(line=>line.trim()).filter(line=>line.length>0&&!line.startsWith("#"))}function patternGlobs(pattern){const dirOnly=pattern.endsWith("/"),stripped=dirOnly?pattern.slice(0,-1):pattern,anchored=stripped.startsWith("/"),body=anchored?stripped.slice(1):stripped;if(body.length===0)return[];const base=anchored||body.includes("/")?body:`**/${body}`;return dirOnly?[`${base}/**`]:[base,`${base}/**`]}function matchesPattern(pattern,key){return patternGlobs(pattern).some(glob=>globMatch(glob,key))}export function isIgnored(patterns,key){let ignored=!1;for(const raw of patterns){const negated=raw.startsWith("!"),pattern=negated?raw.slice(1):raw;matchesPattern(pattern,key)&&(ignored=!negated)}return ignored}export function matchesOnly(globs,key){return globs.some(glob=>matchesPattern(glob,key))}export function buildSelectionPredicate(opts){return key=>isIgnored(opts.patterns,key)?"ignored":opts.only.length>0&&!matchesOnly(opts.only,key)?"deselected":"emit"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{levelAtLeast}from"./levels.js";const PIPELINE_STYLE_TABLE={"trunk-solo":{L1:"starter",L2:"starter",L3:"standard",L4:"standard"},"peer-review":{L1:"starter",L2:"standard",L3:"standard",L4:"standard"},"gated-review":{L1:"standard",L2:"standard",L3:"industrial",L4:"industrial"}},BRANCHING_STRATEGY_DEFAULTS={"trunk-solo":"trunk-direct","peer-review":"github-flow","gated-review":"github-flow"},WORKTREE_MODE_DEFAULTS={"trunk-solo":"optional","peer-review":"always","gated-review":"always"},MERGE_MODE_DEFAULTS={"trunk-solo":"direct","peer-review":"pr-ff","gated-review":"pr-ff"};export const DEFAULT_AUTONOMY="L0";const MAX_PARALLEL_WORKTREES_DEFAULTS={"trunk-solo":1,"peer-review":3,"gated-review":3};export function resolveDefaultMaxParallelWorktrees(mode){return MAX_PARALLEL_WORKTREES_DEFAULTS[mode]}export function resolveMaxParallelWorktrees(config){return config.automation?.maxParallelWorktrees??resolveDefaultMaxParallelWorktrees(resolveCollaborationMode(config))}export function resolveDefaultGateLevel(level){return levelAtLeast(level,"L3")?"L2":"L1"}export function resolvePipelineStyle(mode,level){return PIPELINE_STYLE_TABLE[mode][level]}export function resolveDefaultBranchingStrategy(mode){return BRANCHING_STRATEGY_DEFAULTS[mode]}export function resolveDefaultWorktreeMode(mode){return WORKTREE_MODE_DEFAULTS[mode]}export function resolveDefaultMergeMode(mode){return MERGE_MODE_DEFAULTS[mode]}export function collaborationModeFromAnswers(answers){return answers.collaborationMode?answers.collaborationMode:answers.soloDevMode===!0?"trunk-solo":"peer-review"}export function resolveCollaborationMode(config){return config.collaborationMode!==void 0?config.collaborationMode:config.enableSoloDevMode===!0?"trunk-solo":"peer-review"}export function resolveCollaborationAxes(config){const collaborationMode=resolveCollaborationMode(config);return{collaborationMode,mergeMode:config.solo?.mergeMode??resolveDefaultMergeMode(collaborationMode),worktreeMode:config.tasks?.worktree??resolveDefaultWorktreeMode(collaborationMode),branchingStrategy:config.branchingStrategy??resolveDefaultBranchingStrategy(collaborationMode),pipelineStyle:config.pipelineStyle??resolvePipelineStyle(collaborationMode,config.governanceLevel)}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const AXIS_FIELDS=new Set(["governanceLevel","archetype","architectureStyle","isMultiTenant","hasDatabase","databaseEngine","hasPublicApi","contractType","language"]),FIELD_DEFAULTS={contractType:"none",architectureStyle:"none",archetype:"library",isMultiTenant:!1,hasDatabase:!1,databaseEngine:"none",hasPublicApi:!1};function normField(key,val){return val===void 0&&key in FIELD_DEFAULTS?FIELD_DEFAULTS[key]:val}const PATH_TO_KEYS={tools:["agents-md","claude","codex","skills","agents-claude","githooks","ship-driver"],useGitHub:["github","root","check-all"],permitGitHub:["github","root","check-all","ci-tier","github-setup"],"features.debtGates":["debt-gates","debt-ratchet","coverage","duplication","stride-enforcement","anti-drift-validators"],"features.securityScanning":["security"],"features.mutationTesting":["mutation","check-all","nightly"],"features.contractTesting":["contract-testing","integration-testing","github"],"features.evidenceHarness":["evidence-retention","nightly"],"features.selfValidationHarness":["self-validation","anti-drift-validators","check-all"],"features.auditToolchain":["audit-toolchain","check-all"],"features.fiveLaneCi":["ci-five-lane","github","ci-tier","github-setup"],"features.suppressions":["suppressions"],"features.soloDevMode":["github","githooks"],collaborationMode:["github","githooks","root","check-all","claude"],solo:["claude","github"],branchingStrategy:["claude","github"],"thresholds.lineCoverage":["check-all","coverage"],"thresholds.branchCoverage":["check-all","coverage"],"thresholds.mutationScore":["mutation","check-all"],"thresholds.cyclomaticComplexity":["debt-gates"],"thresholds.methodLength":["debt-gates"],"thresholds.maxParams":["debt-gates"],invariantTiers:["global-invariants","agents-md"],basePackage:["archunit","mutation","modulith","api-middleware","behavioral-tests","integration-testing","contract-testing"],strictnessTier:["root","debt-gates","rust-boundaries"],runnerProfile:["github"],thresholdProfile:["root","coverage","debt-gates"],evidenceRetention:["evidence-retention","baseline-gitignore","nightly"],taxonomy:["test-taxonomy","api-e2e"],hasPublicApi:["api-middleware"],deployTarget:["github","infra","ci-tier"],industryOverlay:["pharma","iso27001-controls","iso9001","regulated-overlay"],"observability.provider":["observability"],"auth.provider":["auth"],frontend:["frontend-governance","frontend-quality"],"frontend.framework":["frontend-governance","frontend-quality"],"frontend.stateManager":["frontend-governance"],"frontend.validationLib":["frontend-governance"],lanes:["frontend-governance","frontend-quality","playwright-ts","playwright-python"]};function diffLeaf(prefix,a,b,paths){if(Array.isArray(a)||Array.isArray(b)){JSON.stringify(a)!==JSON.stringify(b)&&paths.push(prefix);return}if(typeof a=="object"&&a!==null&&typeof b=="object"&&b!==null){const keys=new Set([...Object.keys(a),...Object.keys(b)]);for(const k of keys)diffLeaf(`${prefix}.${k}`,a[k],b[k],paths);return}a!==b&&paths.push(prefix)}export function diffConfig(stored,next){const paths=[],s=stored,n=next,keys=new Set([...Object.keys(s),...Object.keys(n)]);for(const k of keys){const a=normField(k,s[k]),b=normField(k,n[k]);k==="features"||k==="thresholds"||k==="observability"||k==="auth"||k==="frontend"?diffLeaf(k,a,b,paths):JSON.stringify(a)!==JSON.stringify(b)&&paths.push(k)}return{paths}}export function impactedGenerators(diff){const result=new Set;for(const path of diff.paths)if(AXIS_FIELDS.has(path))return result.add("*"),result;for(const path of diff.paths){const keys=PATH_TO_KEYS[path];if(!keys)return result.add("*"),result;for(const k of keys)result.add(k)}return result}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import{parseBooleanEnv}from"../utils/env.js";import{DEFAULT_CROSS_MODEL_REVIEW,DEFAULT_THRESHOLDS,isThresholdValueInRange}from"./schema.js";const THRESHOLD_PREFIX="ARBITER_THRESHOLD__",FEATURE_PREFIX="ARBITER_FEATURE__",VALID_THRESHOLD_KEYS=new Set(["lineCoverage","branchCoverage","mutationScore","cyclomaticComplexity","methodLength","maxParams"]),VALID_FEATURE_KEYS=new Set(["contractTesting","mutationTesting","securityScanning","evidenceHarness","acceptanceAnchor","debtGates","suppressions"]);function screamingSnakeToCamel(s){return s.toLowerCase().split("_").map((part,i)=>i===0?part:part.charAt(0).toUpperCase()+part.slice(1)).join("")}function parseNumericEnv(raw){const trimmed=raw.trim();if(trimmed==="")return;const n=Number(trimmed);if(!(Number.isNaN(n)||!Number.isFinite(n)))return n}function warnDroppedOverride(envKey,reason){process.stderr.write(`[arbiter] env override ${envKey} ignored \u2014 ${reason}; default retained
|
|
3
|
+
`)}function applyThresholdOverride(thresholds,envKey,rawValue){const camel=screamingSnakeToCamel(envKey.slice(THRESHOLD_PREFIX.length));if(!VALID_THRESHOLD_KEYS.has(camel))return warnDroppedOverride(envKey,`unknown threshold field "${camel}"`),thresholds;const value=parseNumericEnv(rawValue);return value===void 0?(warnDroppedOverride(envKey,`value "${rawValue}" is not a finite number`),thresholds):isThresholdValueInRange(camel,value)?{...thresholds,[camel]:value}:(warnDroppedOverride(envKey,`value "${rawValue}" is out of range`),thresholds)}function applyFeatureOverride(features,envKey,rawValue){const camel=screamingSnakeToCamel(envKey.slice(FEATURE_PREFIX.length));if(!VALID_FEATURE_KEYS.has(camel))return warnDroppedOverride(envKey,`unknown feature flag "${camel}"`),features;const value=parseBooleanEnv(rawValue);return value===void 0?(warnDroppedOverride(envKey,`value "${rawValue}" is not a recognized boolean`),features):{...features,[camel]:value}}const THRESHOLD_KEYS=["lineCoverage","branchCoverage","mutationScore","cyclomaticComplexity","methodLength","maxParams"];function thresholdsAreDefaultFor(thresholds,level){const def=DEFAULT_THRESHOLDS[level];return THRESHOLD_KEYS.every(k=>thresholds[k]===def[k])}function applyTopLevelOverride(cfg,envKey,rawValue){const tail=envKey.slice(8);if(screamingSnakeToCamel(tail)==="governanceLevel"&&(rawValue==="L1"||rawValue==="L2"||rawValue==="L3"||rawValue==="L4")){const oldLevel=cfg.governanceLevel,next={...cfg,governanceLevel:rawValue};return rawValue===oldLevel?next:thresholdsAreDefaultFor(cfg.thresholds,oldLevel)?{...next,thresholds:{...DEFAULT_THRESHOLDS[rawValue]}}:(warnDroppedOverride(envKey,`level bumped ${oldLevel}\u2192${rawValue} but custom thresholds were kept \u2014 coverage/complexity bars still reflect ${oldLevel}`),next)}return cfg}export function applyEnvOverrides(cfg,env){let thresholds={...cfg.thresholds},features={...cfg.features},next={...cfg,thresholds,features};for(const[key,rawValue]of Object.entries(env))if(rawValue!==void 0&&key.startsWith("ARBITER_")){if(key.startsWith(THRESHOLD_PREFIX)){thresholds=applyThresholdOverride(thresholds,key,rawValue),next={...next,thresholds};continue}if(key.startsWith(FEATURE_PREFIX)){features=applyFeatureOverride(features,key,rawValue),next={...next,features};continue}if(key!=="ARBITER_NO_EVIDENCE"){if(key==="ARBITER_CROSS_MODEL_REVIEW"){const value=parseBooleanEnv(rawValue);value===void 0?warnDroppedOverride(key,`value "${rawValue}" is not a recognized boolean`):next={...next,crossModelReview:{...next.crossModelReview??DEFAULT_CROSS_MODEL_REVIEW,enabled:value}};continue}next=applyTopLevelOverride(next,key,rawValue)}}return next}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import{parseBooleanEnv}from"../utils/env.js";export const ARBITER_ENV_FLAGS=[{name:"ARBITER_RUN_ID",type:"string",purpose:"Trace ID for the current process; minted once and exported so subprocesses inherit it.",isGateBypass:!1},{name:"ARBITER_LOG_LEVEL",type:"enum",enumValues:["error","warn","info","debug","trace"],default:"info",purpose:"Minimum log level. CLI --log-level takes precedence; invalid values fall back to info.",isGateBypass:!1},{name:"ARBITER_LOG_FORMAT",type:"enum",enumValues:["text","json"],default:"text",purpose:"Log output format. CLI --log-format takes precedence.",isGateBypass:!1},{name:"ARBITER_LOCALE",type:"string",purpose:'Override the UI locale. Falls back to LC_ALL, LC_MESSAGES, LANG, then "en".',isGateBypass:!1},{name:"ARBITER_EXPERIMENTAL",type:"string",purpose:"JSON map of enabled experimental flags; set by the CLI for downstream command access.",isGateBypass:!1},{name:"ARBITER_LEVEL",type:"enum",enumValues:["L1","L2","L3","L4"],purpose:"Governance level override for local gate runs.",isGateBypass:!1},{name:"ARBITER_THRESHOLD__",type:"prefix",purpose:"Prefix: override a thresholds.<field> value (e.g. ARBITER_THRESHOLD__LINE_COVERAGE=80).",isGateBypass:!1},{name:"ARBITER_FEATURE__",type:"prefix",purpose:"Prefix: override a features.<flag> value (e.g. ARBITER_FEATURE__MUTATION_TESTING=1).",isGateBypass:!1},{name:"ARBITER_CONSUMER_",type:"prefix",purpose:"Credential namespace used only by the trusted consumer-reliability preparation process; stripped before verification.",isGateBypass:!1},{name:"ARBITER_EVIDENCE_HARNESS",type:"boolean",default:!1,purpose:'Override the guard-done-evidence hook activation flag (#1872). "1"/"true" enforces, "0"/"false" disarms; unset falls through to features.evidenceHarness in arbiter.json.',isGateBypass:!1},{name:"ARBITER_CROSS_MODEL_REVIEW",type:"boolean",default:!1,purpose:"Per-run override for crossModelReview.enabled; disabling it weakens the optional adversarial review axis.",isGateBypass:!0},{name:"ARBITER_ACCEPTANCE_ANCHOR",type:"boolean",default:!1,purpose:'Override the acceptance-criteria anchor gate activation (INV-138, scripts/check-acceptance.mjs). "1"/"true" enforces, "0"/"false" disarms; unset falls through to features.acceptanceAnchor in arbiter.json. Bespoke var (not ARBITER_FEATURE__*): the gate script cannot run TS config resolution.',isGateBypass:!1},{name:"ARBITER_EVIDENCE_DIR",type:"string",purpose:"Path to the evidence artifact directory.",isGateBypass:!1},{name:"ARBITER_WORKTREES_DIR",type:"string",purpose:"Override the base directory where `arbiter worktree open` creates worktrees.",isGateBypass:!1},{name:"ARBITER_GITHUB",type:"string",purpose:'Set to "1" to activate live GitHub API calls (opt-in).',isGateBypass:!1},{name:"ARBITER_DIFF_BASE",type:"string",purpose:"Base git ref for diff-scoped checks (plugin API stability).",isGateBypass:!1},{name:"ARBITER_MATRIX_LEVEL",type:"string",purpose:"Governance level filter for the feature-matrix check.",isGateBypass:!1},{name:"ARBITER_HOOK_GIT_CWD",type:"string",purpose:"Working directory hooks resolve git operations against.",isGateBypass:!1},{name:"ARBITER_HOOK_BASENAMES",type:"string",purpose:"Override the set of hook basenames considered by hook dispatch.",isGateBypass:!1},{name:"ARBITER_HOOK_DEBOUNCE_MS",type:"number",default:2e4,purpose:"Debounce window (ms) for expensive post-edit hooks.",isGateBypass:!1},{name:"ARBITER_FINDING_LOSS_HARD",type:"boolean",default:!1,purpose:"Escalates stop-finding-loss.mjs (E6b #1948) from advisory (exit 0) to hard block (exit 2) when 2+ research dispatches persisted zero findings since session start.",isGateBypass:!1},{name:"ARBITER_SPAWN_GUARD_HARD",type:"boolean",default:!1,purpose:"Escalates pre-spawn-worktree-guard.mjs (E5 #1947) from advisory (exit 0) to hard block (exit 2) on a second write-intent spawn onto the main tree or a multi-task dispatch.",isGateBypass:!1},{name:"ARBITER_PROBE_TIMEOUT_MS",type:"number",default:1e4,purpose:"Per-tool compatibility probe timeout (ms).",isGateBypass:!1},{name:"ARBITER_BUILD_PROBE_TIMEOUT_MS",type:"number",default:6e4,purpose:"Build-step probe timeout (ms).",isGateBypass:!1},{name:"ARBITER_EXTERNAL_PROBE_TIMEOUT_MS",type:"number",default:5e3,purpose:'External-model availability probe timeout (ms) \u2014 the `<provider> --version` spawn in src/detectors/external-model.ts. Five seconds is ample on an idle machine, but this is a wall-clock probe against a spawned process: on a loaded box the spawn alone can exceed it and the provider is then reported unavailable for a reason unrelated to the provider, so the cross-model seat degrades and the caller cannot tell that from "codex is not installed" (#2501).',isGateBypass:!1},{name:"ARBITER_MAX_NEEDS_CHAIN",type:"number",default:3,purpose:"Maximum allowed length of a workflow `needs:` dependency chain.",isGateBypass:!1},{name:"ARBITER_SELECTIVE_GATE",type:"boolean",default:!1,purpose:"Opt-in local-only speed mode (#2094): skip gate checks whose affects-registry entry proves untouched by the current diff vs origin/main. Never gates CI or a real push \u2014 the full unfiltered gate is the only merge authority.",isGateBypass:!1},{name:"ARBITER_GATE_MUTEX_MODE",type:"string",default:"wait",purpose:"How a gate behaves when another gate already holds the per-repo mutex: `wait` (default \u2014 block, announcing the wait on stderr immediately, then fail closed when the budget expires), `fail` (refuse at once, never queue), `off` (run unserialised; also the automatic fallback where flock(1) does not exist).",isGateBypass:!1},{name:"ARBITER_GATE_MUTEX_WAIT_SEC",type:"number",default:1800,purpose:"Seconds a queued gate blocks on the per-repo mutex before failing closed (#2427). Sized above one full L2 run so a legitimate queue is not cut short.",isGateBypass:!1},{name:"ARBITER_GATE_MUTEX_HELD",type:"string",default:"",purpose:"Set BY the mutex wrapper (and by `arbiter gate-exec`) to the lock path it already holds, so a nested gate recognises the mutex as taken instead of self-deadlocking waiting on it (#2427). Not a user-facing knob.",isGateBypass:!1},{name:"ARBITER_GATE_PARENT_PID",type:"string",default:"",purpose:"Set BY the mutex wrapper to the pid of the process the gate exists to serve. The gate checks it between checks and aborts when it is gone, so a SIGKILL that no signal can forward cannot leave an orphan gate stamping evidence (#2427). Not a user-facing knob.",isGateBypass:!1},{name:"ARBITER_BYPASS_LOG_PATH",type:"string",purpose:"Override the JSONL path the loud-bypass audit contract appends to.",isGateBypass:!1},{name:"ARBITER_BYPASS_BRANCH",type:"string",purpose:"Branch name recorded in the loud-bypass audit line.",isGateBypass:!1},{name:"ARBITER_EVIDENCE_MAX_AGE_MIN",type:"number",default:240,purpose:"Maximum age (minutes) of a gate-pass marker before every consumer refuses it (#2328).",isGateBypass:!1},{name:"ARBITER_PREPUSH_MAX_AGE_MIN",type:"number",default:240,purpose:"Maximum age (minutes) of the freshest evidence file before a push is blocked.",isGateBypass:!1},{name:"ARBITER_PREPUSH_EVIDENCE_DIR",type:"string",default:".arbiter/evidence",purpose:"Override the evidence directory the pre-push freshness gate inspects.",isGateBypass:!1},{name:"ARBITER_PREPUSH_BYPASS_REASON",type:"string",purpose:"Free-form justification recorded in the loud-bypass JSONL line.",isGateBypass:!1},{name:"ARBITER_NO_EVIDENCE",type:"boolean",default:!1,purpose:"Suppress evidence-file writing for the current run (mirrors --no-evidence).",isGateBypass:!0},{name:"ARBITER_AUDIT_MODE",type:"boolean",default:!0,purpose:"Read by a generated consumer's check-all.mjs (#9003 gate-registry `audit: true` field) as on/off (parseBooleanEnv shape) \u2014 off (\"ARBITER_AUDIT_MODE=off\") skips audit-only gates, a level-orthogonal axis (the #9003 design brief). Not read by arbiter's own CLI \u2014 the flag lives in the emitted script, not this process.",isGateBypass:!0},{name:"ARBITER_SKIP_PLAN_REVIEW",type:"boolean",default:!1,purpose:"Bypass the plan-review gate and write an audit bypass record. Refused under CI.",isGateBypass:!0},{name:"ARBITER_PLAN_BYPASS",type:"boolean",default:!1,purpose:"Bypass the pre-edit plan-anchor hook (CANON-14). Emergency use only; logged.",isGateBypass:!0},{name:"ARBITER_POST_CLEAR",type:"boolean",default:!1,purpose:"Signal a post-/clear re-entry (mirrors --post-clear); controls handoff strategy.",isGateBypass:!1},{name:"ARBITER_SKIP_DOCS",type:"boolean",default:!1,purpose:"Skip the docs-freshness gate. Routed through the loud-bypass audit contract.",isGateBypass:!0},{name:"ARBITER_SKIP_TDD",type:"boolean",default:!1,purpose:"Skip the TDD-evidence gate. For non-#NNN hygiene/chore commits only.",isGateBypass:!0},{name:"ARBITER_SKIP_GATE_MARKER",type:"boolean",default:!1,purpose:"Bypass the gate-pass marker requirement in the pre-PR hook and task phase gate. Refused under CI.",isGateBypass:!0},{name:"ARBITER_SSOT_BYPASS",type:"boolean",default:!1,purpose:"Bypass the pre-edit SSOT guard hook.",isGateBypass:!0},{name:"ARBITER_GATE_BYPASS",type:"boolean",default:!1,purpose:"Generic gate bypass switch (loud-bypass audited).",isGateBypass:!0},{name:"ARBITER_PREPUSH_BYPASS",type:"boolean",default:!1,purpose:'Bypass the pre-push freshness gate (exact "true"); loud-bypass audited.',isGateBypass:!0},{name:"ARBITER_PREPUSH_SKIP",type:"boolean",default:!1,purpose:"Skip the pre-push freshness gate silently. Reserved for hook recursion / test harness.",isGateBypass:!0},{name:"ARBITER_ALLOW_CHANNEL_DOWNGRADE",type:"boolean",default:!1,purpose:"Allow a release-channel downgrade without an interactive TTY prompt.",isGateBypass:!0}];const FLAG_BY_NAME=new Map(ARBITER_ENV_FLAGS.map(f=>[f.name,f]));export const KNOWN_ARBITER_FLAGS=new Set(FLAG_BY_NAME.keys());export function getBoolFlag(name,env=process.env){const spec=FLAG_BY_NAME.get(name);if(spec===void 0||spec.type!=="boolean")throw new Error(`getBoolFlag: "${name}" is not a registered boolean ARBITER_* flag (#1538)`);const parsed=parseBooleanEnv(env[name]);return parsed!==void 0?parsed:spec.default===!0}export function getNumberFlag(name,env=process.env){const spec=FLAG_BY_NAME.get(name);if(spec===void 0||spec.type!=="number")throw new Error(`getNumberFlag: "${name}" is not a registered numeric ARBITER_* flag (#1538)`);const fallback=typeof spec.default=="number"?spec.default:0,parsed=Number(env[name]);return Number.isFinite(parsed)&&parsed>0?parsed:fallback}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const LEVEL_ORDER=["L1","L2","L3","L4"];export function levelRank(level){return LEVEL_ORDER.indexOf(level)}export function levelAtLeast(actual,min){return levelRank(actual)>=levelRank(min)}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import{CURRENT_CONFIG_SCHEMA_VERSION}from"../schema.js";import{migrateV0ToV1}from"./v0-to-v1.js";import{migrateV1ToV2}from"./v1-to-v2.js";import{migrateV2ToV3}from"./v2-to-v3.js";import{migrateV3ToV4}from"./v3-to-v4.js";function isRecord(val){return typeof val=="object"&&val!==null&&!Array.isArray(val)}export function migrate(raw){if(!isRecord(raw))throw new Error("arbiter.json must be a non-null object");const schemaVersion=raw.$schemaVersion;if(schemaVersion!==void 0){const numericVersion=typeof schemaVersion=="number"?schemaVersion:Number(schemaVersion);if(Number.isNaN(numericVersion)||numericVersion>CURRENT_CONFIG_SCHEMA_VERSION)throw new Error(`arbiter.json has $schemaVersion=${JSON.stringify(schemaVersion)} but this arbiter build understands at most ${CURRENT_CONFIG_SCHEMA_VERSION}. Upgrade arbiter or downgrade the config file.`)}const version=raw.version;if(version==="0.2")return migrateV3ToV4(migrateV2ToV3(migrateV1ToV2(raw)));if(version==="0.1")return migrateV3ToV4(migrateV2ToV3(migrateV1ToV2(raw)));const v1=migrateV0ToV1(raw);return migrateV3ToV4(migrateV2ToV3(migrateV1ToV2(v1)))}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import{AI_TOOLS,DEFAULT_THRESHOLDS,GOVERNANCE_LEVELS,validateConfig}from"../schema.js";import{getLogger}from"../../utils/logger.js";import{levelAtLeast}from"../levels.js";function isRecord(val){return typeof val=="object"&&val!==null&&!Array.isArray(val)}function warnUseGitHubDeprecated(){getLogger().warn("config.useGitHub_deprecated",{},"`useGitHub` is deprecated. Use `permitGitHub` in arbiter.json and the `--github` flag for live API calls.")}function migratePermitGitHub(cfg){const raw=cfg;if(!("useGitHub"in raw))return cfg;const{useGitHub,...rest}=raw;return"permitGitHub"in rest?rest:(warnUseGitHubDeprecated(),{...rest,permitGitHub:useGitHub})}function deriveEvidenceHarness(evidenceRetention,level){if(isRecord(evidenceRetention)){const legacy=evidenceRetention;if(typeof legacy.enabled=="boolean")return legacy.enabled}return levelAtLeast(level,"L3")}function deriveFeatureFlags(raw,level){const nonL1=level!=="L1";return{debtGates:typeof raw.enableDebtGates=="boolean"?raw.enableDebtGates:nonL1,securityScanning:typeof raw.enableSecurityScanning=="boolean"?raw.enableSecurityScanning:nonL1,suppressions:typeof raw.enableSuppressions=="boolean"?raw.enableSuppressions:!0,mutationTesting:nonL1,contractTesting:typeof raw.contractType=="string"&&raw.contractType!=="none",evidenceHarness:deriveEvidenceHarness(raw.evidenceRetention,level),selfValidationHarness:!0}}function applyDecompositionAlias(cfg){if(cfg.decomposition?.backend)return cfg;const backend=cfg.permitGitHub??cfg.useGitHub??!1?"github":"markdown";return{...cfg,decomposition:{backend}}}export function migrateV1ToV2(raw){if(!isRecord(raw))throw new Error("arbiter.json must be a non-null object");if(raw.version==="0.2"){const result=validateConfig(raw);if(result.ok){const migrated2=migratePermitGitHub(result.config);return{...applyDecompositionAlias(migrated2),$schemaVersion:2}}getLogger().warn("config.v2_passthrough_invalid",{errors:result.errors.join("; ")},`arbiter.json (v0.2) failed strict validation (${result.errors.join("; ")}) \u2014 deferring to the migration fallback`);const migrated=migratePermitGitHub(raw);return{...applyDecompositionAlias(migrated),$schemaVersion:2}}const rawLevel=raw.governanceLevel,upperLevel=typeof rawLevel=="string"?rawLevel.toUpperCase():rawLevel;let level;if(rawLevel===void 0)level="L2";else if(typeof upperLevel=="string"&&GOVERNANCE_LEVELS.has(upperLevel))level=upperLevel;else throw new Error(`arbiter.json governanceLevel must be one of L1, L2, L3, L4 \u2014 got ${typeof rawLevel=="string"?rawLevel:JSON.stringify(rawLevel)}`);const features=deriveFeatureFlags(raw,level),thresholds=DEFAULT_THRESHOLDS[level],stripKeys=new Set(["version","enableDebtGates","enableSecurityScanning","enableSuppressions","useGitHub"]),rest=Object.fromEntries(Object.entries(raw).filter(([k])=>!stripKeys.has(k))),permitGitHub=typeof raw.useGitHub=="boolean"?raw.useGitHub:!1,migratedBackend=permitGitHub?"github":"markdown",decomposition=isRecord(raw.decomposition)&&raw.decomposition.backend?raw.decomposition:{backend:migratedBackend};return{...rest,version:"0.2",$schemaVersion:2,tools:Array.isArray(raw.tools)?raw.tools.filter(t=>AI_TOOLS.has(t)):["claude","codex"],governanceLevel:level,permitGitHub,decomposition,features,thresholds}}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import{loadConfig}from"../utils/config.js";import{getLogger}from"../utils/logger.js";import{parseValue}from"../commands/configure.js";import{readOverride}from"../commands/task-state.js";import{DEFAULT_AUTONOMY}from"./collaboration-mode-defaults.js";const DERIVED_DEFAULTS={"automation.autonomy":DEFAULT_AUTONOMY,"automation.defaultGateLevel":"L1","crossModelReview.enabled":"false"};function profileRawValue(root,path){let config;try{config=loadConfig(root)}catch{return}if(config===null)return;const raw=config,parts=path.split(".");let cursor=raw;for(const part of parts){if(typeof cursor!="object"||cursor===null)return;cursor=cursor[part]}if(typeof cursor=="string")return cursor;if(typeof cursor=="number"||typeof cursor=="boolean")return String(cursor)}function validCandidate(path,raw,layer){if(raw!==void 0)try{return parseValue(path,raw),raw}catch{getLogger().warn("override.invalid_candidate",{path,raw,layer},`ignoring invalid ${path}="${raw}" from ${layer} layer; falling through (fail-closed)`);return}}export function resolveSetting(path,ctx){const fromOverride=validCandidate(path,ctx.overrides?.[path],"override");if(fromOverride!==void 0)return fromOverride;const fromSession=validCandidate(path,readOverride(ctx.root,path),"session");if(fromSession!==void 0)return fromSession;const profileRaw=ctx.profileValue??profileRawValue(ctx.root,path),fromProfile=validCandidate(path,profileRaw,"profile");if(fromProfile!==void 0)return fromProfile;const fallback=DERIVED_DEFAULTS[path];if(fallback===void 0)throw new Error(`resolveSetting: no derived default registered for path "${path}"`);return fallback}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import{resolveLanguage}from"../detectors/language.js";import{detectBuildCommands}from"../detectors/build.js";import{detectFramework}from"../detectors/framework.js";import{detectGitInfo}from"../detectors/git.js";import{detectExisting}from"../detectors/existing.js";import{getLanguageHooks}from"../detectors/language-hooks.js";import{resolveAxisFields}from"../detectors/axis.js";import{presetToTiers,defaultPresetForLevel}from"../invariants/filter.js";import{resolveCollaborationMode}from"./collaboration-mode-defaults.js";function resolveExtendedInvariants(stored){return stored.governance?.invariants_catalog==="extended"}function storedAxisFields(stored){return{...stored.solo!==void 0?{solo:stored.solo}:{},...stored.branchingStrategy!==void 0?{branchingStrategy:stored.branchingStrategy}:{},...stored.evidenceRetention!==void 0?{evidenceRetention:stored.evidenceRetention}:{},...stored.thresholdProfile!==void 0?{thresholdProfile:stored.thresholdProfile}:{},...stored.strictnessTier!==void 0?{strictnessTier:stored.strictnessTier}:{},...stored.runnerProfile!==void 0?{runnerProfile:stored.runnerProfile}:{}}}function storedProviderFields(stored){return{...stored.industryOverlay!==void 0&&stored.industryOverlay!=="none"?{industryOverlay:stored.industryOverlay}:{},...stored.basePackage!==void 0?{basePackage:stored.basePackage}:{},...stored.taskTiers!==void 0?{taskTiers:stored.taskTiers}:{},...stored.deployTarget!==void 0?{deployTarget:stored.deployTarget}:{},...stored.taxonomy!==void 0?{taxonomy:stored.taxonomy}:{},...stored.observability!==void 0?{observability:stored.observability}:{},...stored.auth!==void 0?{auth:stored.auth}:{},...stored.frontend!==void 0?{frontend:stored.frontend}:{}}}function storedOptionalFields(stored){return{...storedAxisFields(stored),...storedProviderFields(stored)}}function storedFeatureFlagFields(stored){return{enableSelfValidationHarness:stored.features.selfValidationHarness??!0,enableAuditToolchain:stored.features.auditToolchain??!1,enableFiveLaneCi:stored.features.fiveLaneCi??!1,enableSoloDevMode:stored.features.soloDevMode??!1,enableMcpFallback:stored.features.mcpFallback??!1,enableNoSkippedTests:stored.features.noSkippedTests??!0,enableRiskRegister:stored.features.riskRegister??!1,enableOperationsHandbook:stored.features.operationsHandbook??!1,enableIso27001Mapping:stored.features.iso27001Mapping??!1,enableNis2Mapping:stored.features.nis2Mapping??!1,enableGdprMapping:stored.features.gdprMapping??!1,enableCodeownersNotify:stored.features.codeownersNotify??!1,enableTaxonomy25d:stored.features.taxonomy25d??!1,enablePerfTesting:stored.features.perfTesting??!1}}function v2ToProjectConfig(stored,detectorFields){const level=stored.governanceLevel;return{...detectorFields,projectName:detectorFields.projectName,description:`${detectorFields.projectName} project`,tools:stored.tools,governanceLevel:level,enableDebtGates:stored.features.debtGates,enableSuppressions:stored.features.suppressions,enableSecurityScanning:stored.features.securityScanning,enableMutationTesting:stored.features.mutationTesting,enableContractTesting:stored.features.contractTesting,enableEvidenceHarness:stored.features.evidenceHarness,...storedFeatureFlagFields(stored),collaborationMode:resolveCollaborationMode({...stored.collaborationMode!==void 0?{collaborationMode:stored.collaborationMode}:{},...stored.features.soloDevMode!==void 0?{enableSoloDevMode:stored.features.soloDevMode}:{}}),...storedOptionalFields(stored),invariantTiers:stored.invariantTiers??presetToTiers(defaultPresetForLevel(level)),acceptBetaTools:stored.acceptBetaTools??!1,contractType:detectorFields.contractType,thresholds:stored.thresholds,lanes:detectorFields.lanes,includeExtendedInvariants:resolveExtendedInvariants(stored),...stored.governance?.projectInvariants!==void 0?{projectInvariants:stored.governance.projectInvariants}:{},...stored.governance?.liveSsot!==void 0?{liveSsot:stored.governance.liveSsot}:{}}}export function gitHubPermitted(stored){return stored.permitGitHub??stored.useGitHub??!1}export function resolveProjectConfig(targetDir,projectName,stored,useGitHubBackend=!1){const language=resolveLanguage(targetDir,stored),framework=detectFramework(targetDir,language),buildCmds=detectBuildCommands(targetDir,language),gitInfo=detectGitInfo(targetDir),existing=detectExisting(targetDir),axisFields=resolveAxisFields(stored,targetDir,language,framework),{archetype,architectureStyle,isMultiTenant,hasDatabase,databaseEngine,hasPublicApi,contractType,lanes}=axisFields,detectorFields={targetDir,projectName,language,framework,buildTool:buildCmds.buildTool,packageManager:stored.packageManager??buildCmds.packageManager??"npm",buildCommand:buildCmds.buildCommand,testCommand:buildCmds.testCommand,lintCommand:buildCmds.lintCommand,formatCommand:buildCmds.formatCommand,useGitHub:useGitHubBackend,permitGitHub:gitHubPermitted(stored),githubOwner:gitInfo.githubOwner,githubRepo:gitInfo.githubRepo,existing,languageHooks:getLanguageHooks(language),archetype,architectureStyle,isMultiTenant,hasDatabase,databaseEngine,hasPublicApi,contractType,lanes};return{config:v2ToProjectConfig(stored,detectorFields),detectorFields}}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import{existsSync,readFileSync}from"node:fs";import{basename,join}from"node:path";import{detectGitInfo}from"../detectors/git.js";import{getLogger}from"../utils/logger.js";export function slugifyProjectName(raw){return raw.replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^[-.]+|[-.]+$/g,"")||"app"}function unscopePackageName(name){const slashIndex=name.indexOf("/");return name.startsWith("@")&&slashIndex!==-1?name.slice(slashIndex+1):name}function readPackageJsonName(dir){const pkgPath=join(dir,"package.json");if(!existsSync(pkgPath))return null;try{const pkg=JSON.parse(readFileSync(pkgPath,"utf-8"));return typeof pkg.name=="string"&&pkg.name.trim()!==""?unscopePackageName(pkg.name.trim()):null}catch{return null}}export function resolveProjectName(dir,stored){if(stored?.projectName)return stored.projectName;const fromPackageJson=readPackageJsonName(dir);if(fromPackageJson)return fromPackageJson;const fromGitRemote=detectGitInfo(dir).projectName;if(fromGitRemote)return fromGitRemote;const fallback=basename(dir);return getLogger().warn("config.project_name_cwd_fallback",{dir,fallback},`no stored arbiter.json name, package.json name, or git remote found \u2014 falling back to the current directory name "${fallback}" as the project name. If this directory is a git worktree, the project name may be wrong; set it explicitly via arbiter.json.`),slugifyProjectName(fallback)}
|