@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,76 @@
|
|
|
1
|
+
# Risk Register — <%= projectName %>
|
|
2
|
+
|
|
3
|
+
<!-- arbiter-managed: risk-register (#712) -->
|
|
4
|
+
|
|
5
|
+
> ISO 27001:2022 §6.1.2 — Information security risk assessment and treatment.
|
|
6
|
+
> P×I (Probability × Impact) scoring. Review at least annually or after significant architecture changes.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Probability × Impact Matrix
|
|
11
|
+
|
|
12
|
+
| Probability \ Impact | Low (1) | Medium (2) | High (3) | Critical (4) |
|
|
13
|
+
| -------------------- | ------- | ---------- | -------- | ------------ |
|
|
14
|
+
| **Unlikely (1)** | 1 | 2 | 3 | 4 |
|
|
15
|
+
| **Possible (2)** | 2 | 4 | 6 | 8 |
|
|
16
|
+
| **Likely (3)** | 3 | 6 | 9 | 12 |
|
|
17
|
+
| **Almost Certain (4)** | 4 | 8 | 12 | 16 |
|
|
18
|
+
|
|
19
|
+
### Risk Classification Thresholds (ISO 27001 A.8.2)
|
|
20
|
+
|
|
21
|
+
| Score | Tier | Response SLA |
|
|
22
|
+
| ----- | -------- | --------------------------------------------------- |
|
|
23
|
+
| ≤ 4 | Low | Monitor; review at next quarterly cycle |
|
|
24
|
+
| 5–8 | Medium | Mitigate within 90 days; add to backlog |
|
|
25
|
+
| 9–12 | High | Mitigate within 30 days; notify security lead |
|
|
26
|
+
| > 12 | Critical | Immediate action; escalate to management |
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Risk Register
|
|
31
|
+
|
|
32
|
+
Add a `RISK_ASSESSMENT_TEMPLATE.md`-based assessment for each new risk before adding a row here.
|
|
33
|
+
|
|
34
|
+
| ID | Category | Threat | Asset | P | I | Score | Tier | Status | Mitigation summary | Owner | Review date |
|
|
35
|
+
| ----- | --------------- | ---------------------------------------- | ----------------------- | - | - | ----- | -------- | --------- | ------------------------------------------- | ----- | ----------- |
|
|
36
|
+
| R-001 | Confidentiality | Unauthorized access to production data | Database / secrets | 2 | 4 | 8 | Medium | Open | MFA + least-privilege IAM + secret rotation | TBD | TBD |
|
|
37
|
+
| R-002 | Integrity | Dependency supply-chain compromise | Build pipeline | 2 | 4 | 8 | Medium | Open | Lockfile pinning + `npm audit` / Trivy FS | TBD | TBD |
|
|
38
|
+
| R-003 | Availability | Service outage due to unhandled failure | Core service endpoints | 2 | 3 | 6 | Medium | Open | Circuit-breakers + graceful degradation | TBD | TBD |
|
|
39
|
+
| R-004 | Confidentiality | PII leakage through logs or error output | Log streams | 2 | 3 | 6 | Medium | Open | PII scan gate (`pii-scan.mjs`) + masking | TBD | TBD |
|
|
40
|
+
| R-005 | Integrity | Broken access control (OWASP A01) | API endpoints | 2 | 4 | 8 | Medium | Open | Auth middleware + RBAC + STRIDE review | TBD | TBD |
|
|
41
|
+
<% if (archetype === 'backend-web-db' || archetype === 'data-pipeline') { %>
|
|
42
|
+
| R-006 | Availability | Database corruption / accidental deletion | Production database | 1 | 4 | 4 | Low | Open | Point-in-time backups + migration tests | TBD | TBD |
|
|
43
|
+
| R-007 | Integrity | Schema migration failure at deploy time | Database schema | 2 | 3 | 6 | Medium | Open | Blue/green deploy + rollback tested in CI | TBD | TBD |
|
|
44
|
+
<% } %><% if (archetype === 'frontend-spa') { %>
|
|
45
|
+
| R-006 | Confidentiality | XSS / client-side injection | Browser session / DOM | 2 | 3 | 6 | Medium | Open | CSP headers + no `innerHTML` + sanitization | TBD | TBD |
|
|
46
|
+
<% } %><% if (isMultiTenant) { %>
|
|
47
|
+
| R-008 | Confidentiality | Tenant data cross-contamination | All tenant data stores | 1 | 4 | 4 | Low | Open | Isolation topology enforced (row-level, schema, DB, or file-per-tenant); tenant routing/validation at request-time | TBD | TBD |
|
|
48
|
+
<% } %><% if (hasPublicApi) { %>
|
|
49
|
+
| R-009 | Availability | API abuse / rate-limit bypass | Public API endpoints | 3 | 2 | 6 | Medium | Open | Rate-limiting middleware + WAF rules | TBD | TBD |
|
|
50
|
+
<% } %>
|
|
51
|
+
|
|
52
|
+
_Add new rows using the P×I assessment template in `RISK_ASSESSMENT_TEMPLATE.md`._
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Treatment Plan
|
|
57
|
+
|
|
58
|
+
For each **High** or **Critical** risk, document the treatment decision:
|
|
59
|
+
|
|
60
|
+
| ID | Treatment option | Rationale | Target score (post-mitigation) | Owner | Due date |
|
|
61
|
+
| ----- | ---------------------- | --------- | ------------------------------ | ----- | -------- |
|
|
62
|
+
| R-001 | Mitigate | — | 4 (Low) | TBD | TBD |
|
|
63
|
+
| R-002 | Mitigate | — | 4 (Low) | TBD | TBD |
|
|
64
|
+
| R-003 | Mitigate | — | 3 (Low) | TBD | TBD |
|
|
65
|
+
| R-004 | Mitigate | — | 3 (Low) | TBD | TBD |
|
|
66
|
+
| R-005 | Mitigate | — | 4 (Low) | TBD | TBD |
|
|
67
|
+
|
|
68
|
+
_Treatment options: Mitigate / Accept / Transfer / Avoid._
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Review History
|
|
73
|
+
|
|
74
|
+
| Date | Reviewer | Changes |
|
|
75
|
+
| -------------- | -------- | -------------------------- |
|
|
76
|
+
| _YYYY-MM-DD_ | _Name_ | Initial register generated |
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: 'Single-Developer Exception — <%= projectName %>'
|
|
3
|
+
doc_version: '1.0.0'
|
|
4
|
+
governance_level: '<%= governanceLevel %>'
|
|
5
|
+
collaboration_mode: '<%= collaborationMode %>'
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Single-Developer Exception — <%= projectName %>
|
|
9
|
+
|
|
10
|
+
> **Regulatory reference:** §11.10(k) — Appropriate use of authority checks to ensure
|
|
11
|
+
> that only authorized individuals can use the system, electronically sign a record, access
|
|
12
|
+
> the operation or computer system input or output device, alter a record, or perform the
|
|
13
|
+
> operation at issue.
|
|
14
|
+
|
|
15
|
+
## Declaration
|
|
16
|
+
|
|
17
|
+
This document attests that **<%= projectName %>** operates under a single-developer exception
|
|
18
|
+
for regulated software development at governance level **<%= governanceLevel %>**.
|
|
19
|
+
|
|
20
|
+
Under this exception:
|
|
21
|
+
|
|
22
|
+
- The project's **arbiter review pipeline** serves as the declared rigor-equivalent reviewer
|
|
23
|
+
(replacing human peer-review for routine changes)
|
|
24
|
+
- The developer's identity is bound to all git commits and signed artifacts via cosign keyless
|
|
25
|
+
attestation using GitHub OIDC
|
|
26
|
+
- **All automated gates must pass** before any change reaches the main branch
|
|
27
|
+
|
|
28
|
+
## Governance Level Declarations
|
|
29
|
+
|
|
30
|
+
| Attribute | Value |
|
|
31
|
+
|-----------|-------|
|
|
32
|
+
| Governance level | `<%= governanceLevel %>` |
|
|
33
|
+
| Collaboration mode | `<%= collaborationMode %>` |
|
|
34
|
+
| Review mechanism | arbiter review pipeline (rigor-equivalent) |
|
|
35
|
+
| Signing method | cosign keyless / GPG commit signing |
|
|
36
|
+
| Reactivation threshold | ≥3 active authors (trailing 30 days) OR external audit |
|
|
37
|
+
|
|
38
|
+
## Regulatory Basis (§11.10(k))
|
|
39
|
+
|
|
40
|
+
The single-developer exception is valid when:
|
|
41
|
+
|
|
42
|
+
1. **Identity control** — all commits are signed with a verified developer identity
|
|
43
|
+
2. **Audit trail** — every change is recorded with timestamp, SHA, and CI gate status
|
|
44
|
+
3. **Automated rigor** — arbiter's pipeline enforces all quality and security gates
|
|
45
|
+
4. **Reactivation trigger** — the exception auto-expires when team composition changes
|
|
46
|
+
|
|
47
|
+
## Reactivation Trigger
|
|
48
|
+
|
|
49
|
+
**This exception expires automatically when either condition is met:**
|
|
50
|
+
|
|
51
|
+
- **Author threshold:** ≥3 distinct active authors detected in the trailing 30-day git log
|
|
52
|
+
- **External audit:** `EXTERNAL_AUDIT=true` environment variable is set
|
|
53
|
+
|
|
54
|
+
**On trigger, the following MUST be activated:**
|
|
55
|
+
|
|
56
|
+
1. Enable CODEOWNERS (`CODEOWNERS` file with required reviewers)
|
|
57
|
+
2. Configure branch protection: `required_approving_review_count: 1`
|
|
58
|
+
3. Update `arbiter.json` `collaborationMode` from `trunk-solo` to `peer-review` or `gated-review`
|
|
59
|
+
|
|
60
|
+
The reactivation check runs nightly via `scripts/check-solo-reactivation.mjs`
|
|
61
|
+
(integrated into the nightly CI workflow).
|
|
62
|
+
|
|
63
|
+
## Attestation
|
|
64
|
+
|
|
65
|
+
| Field | Value |
|
|
66
|
+
|-------|-------|
|
|
67
|
+
| Document version | 1.0.0 |
|
|
68
|
+
| Generated by | arbiter <%= typeof arbiterVersion !== 'undefined' ? arbiterVersion : 'unknown' %> |
|
|
69
|
+
| Project | <%= projectName %> |
|
|
70
|
+
| Date | _[fill in: YYYY-MM-DD]_ |
|
|
71
|
+
| Developer identity | _[fill in: verified email / GitHub handle]_ |
|
|
72
|
+
| GPG key fingerprint | _[fill in: if using GPG signing]_ |
|
|
73
|
+
| Last review date | _[fill in: YYYY-MM-DD]_ |
|
|
74
|
+
| Next review date | _[fill in: YYYY-MM-DD + 90 days]_ |
|
|
75
|
+
|
|
76
|
+
> **Signature:** I attest that the controls documented herein are active and effective.
|
|
77
|
+
>
|
|
78
|
+
> `_____________________________` Date: `_______________`
|
|
79
|
+
|
|
80
|
+
## Evidence of Automated Controls
|
|
81
|
+
|
|
82
|
+
The following automated controls are active:
|
|
83
|
+
|
|
84
|
+
- `scripts/check-all.mjs L1` — runs on every commit (pre-commit hook)
|
|
85
|
+
- `scripts/check-all.mjs L2` — runs on every push (pre-push hook)
|
|
86
|
+
- Nightly CI (`06-nightly-lite.yml`) — dependency CVE refresh + integration tests
|
|
87
|
+
- Cosign attestation — every release artifact is signed with OIDC identity
|
|
88
|
+
- `scripts/check-solo-reactivation.mjs` — author-count reactivation check (nightly)
|
|
89
|
+
|
|
90
|
+
## References
|
|
91
|
+
|
|
92
|
+
- ADR-051: collaborationMode trunk-solo design
|
|
93
|
+
- ADR-091: single-developer exception attestation policy
|
|
94
|
+
- `docs/governance/CI_MENTAL_MODEL.md` — pipeline stage mental model
|
|
95
|
+
- `docs/governance/VALIDATION_EVIDENCE_TEMPLATE.md` — per-run evidence template
|
|
96
|
+
- `docs/METHOD/EVIDENCE_RETENTION.md` — evidence retention policy
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: 'Validation Evidence Template — <%= projectName %>'
|
|
3
|
+
doc_version: '1.0.0'
|
|
4
|
+
governance_level: '<%= governanceLevel %>'
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Validation Evidence Template — <%= projectName %>
|
|
8
|
+
|
|
9
|
+
> **Instructions:** Complete one copy of this document per validation run.
|
|
10
|
+
> Sign with GPG or cosign before archiving. Retain per the policy in
|
|
11
|
+
> `docs/METHOD/EVIDENCE_RETENTION.md` (ADR-091 retention schedule).
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Run Identification
|
|
16
|
+
|
|
17
|
+
| Field | Value |
|
|
18
|
+
|-------|-------|
|
|
19
|
+
| Run date | _[YYYY-MM-DD HH:MM:SS UTC]_ |
|
|
20
|
+
| Git commit SHA | _[40-char hex]_ |
|
|
21
|
+
| Branch / tag | _[branch name or release tag]_ |
|
|
22
|
+
| Arbiter version | _[arbiter --version output]_ |
|
|
23
|
+
| Governance level | `<%= governanceLevel %>` |
|
|
24
|
+
| Operator | _[verified email / GitHub handle]_ |
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Gate Status (Real-Run Measured)
|
|
29
|
+
|
|
30
|
+
| Gate | Status | Duration | Notes |
|
|
31
|
+
|------|--------|----------|-------|
|
|
32
|
+
| L1 (build + lint + unit) | _[ PASS / FAIL ]_ | _[Xs]_ | |
|
|
33
|
+
| L2 (L1 + coverage + integration) | _[ PASS / FAIL ]_ | _[Xs]_ | |
|
|
34
|
+
<% if (isL3Plus) { %>
|
|
35
|
+
| Mutation testing | _[ PASS / FAIL ]_ | _[Xs]_ | |
|
|
36
|
+
| SAST / CodeQL | _[ PASS / FAIL ]_ | _[Xs]_ | |
|
|
37
|
+
<% } %>
|
|
38
|
+
<% if (governanceLevel === 'L4') { %>
|
|
39
|
+
| SLSA provenance | _[ PASS / FAIL ]_ | _[Xs]_ | |
|
|
40
|
+
| SBOM attestation | _[ PASS / FAIL ]_ | _[Xs]_ | |
|
|
41
|
+
| Cosign signature verification | _[ PASS / FAIL ]_ | _[Xs]_ | |
|
|
42
|
+
<% } %>
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Measured Metrics
|
|
47
|
+
|
|
48
|
+
| Metric | Value | Threshold | Status |
|
|
49
|
+
|--------|-------|-----------|--------|
|
|
50
|
+
| Unit test count | _[N]_ | — | |
|
|
51
|
+
| Unit test pass rate | _[N/N (100%)]_ | 100% | _[ PASS / FAIL ]_ |
|
|
52
|
+
| Branch coverage | _[NN%]_ | <%= isL3Plus ? '85%' : '80%' %> | _[ PASS / FAIL ]_ |
|
|
53
|
+
| Line coverage | _[NN%]_ | <%= isL3Plus ? '85%' : '80%' %> | _[ PASS / FAIL ]_ |
|
|
54
|
+
<% if (isL3Plus) { %>
|
|
55
|
+
| Mutation score | _[NN%]_ | 70% | _[ PASS / FAIL ]_ |
|
|
56
|
+
| Duplication ratio | _[NN%]_ | 3% | _[ PASS / FAIL ]_ |
|
|
57
|
+
<% } %>
|
|
58
|
+
| Dependency CVE (high+critical) | _[N]_ | 0 | _[ PASS / FAIL ]_ |
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## Evidence Artefacts
|
|
63
|
+
|
|
64
|
+
List all artefacts captured in this run (SHA-pinned):
|
|
65
|
+
|
|
66
|
+
| Artefact | SHA-256 | Location |
|
|
67
|
+
|----------|---------|----------|
|
|
68
|
+
| L1 gate output | _[sha256:...]_ | `.evidence/run-NNNN/L1.txt` |
|
|
69
|
+
| L2 gate output | _[sha256:...]_ | `.evidence/run-NNNN/L2.txt` |
|
|
70
|
+
| Coverage report | _[sha256:...]_ | `.evidence/run-NNNN/coverage.json` |
|
|
71
|
+
<% if (isL3Plus) { %>
|
|
72
|
+
| Mutation report | _[sha256:...]_ | `.evidence/run-NNNN/mutation.json` |
|
|
73
|
+
<% } %>
|
|
74
|
+
<% if (governanceLevel === 'L4') { %>
|
|
75
|
+
| SBOM (CycloneDX) | _[sha256:...]_ | `.evidence/run-NNNN/sbom.json` |
|
|
76
|
+
| Cosign bundle | _[sha256:...]_ | `.evidence/run-NNNN/artifact.bundle` |
|
|
77
|
+
<% } %>
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Reactivation Check (trunk-solo projects only)
|
|
82
|
+
|
|
83
|
+
<% if (collaborationMode === 'trunk-solo') { %>
|
|
84
|
+
| Check | Result |
|
|
85
|
+
|-------|--------|
|
|
86
|
+
| Distinct active authors (trailing 30d) | _[N]_ |
|
|
87
|
+
| Threshold (≥3 triggers reactivation) | 3 |
|
|
88
|
+
| External audit flag active | _[ YES / NO ]_ |
|
|
89
|
+
| Reactivation triggered | _[ YES / NO ]_ |
|
|
90
|
+
|
|
91
|
+
> If reactivation triggered: STOP — switch to peer-review mode before proceeding.
|
|
92
|
+
<% } else { %>
|
|
93
|
+
_Not applicable — project uses `<%= collaborationMode %>` collaboration mode._
|
|
94
|
+
<% } %>
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Signature (Cosign / GPG)
|
|
99
|
+
|
|
100
|
+
**Sign this document after filling in all fields:**
|
|
101
|
+
|
|
102
|
+
```sh
|
|
103
|
+
# GPG signature
|
|
104
|
+
gpg --armor --detach-sign docs/governance/validation-evidence-<RUN-DATE>.md
|
|
105
|
+
|
|
106
|
+
# OR cosign blob signature (keyless OIDC)
|
|
107
|
+
cosign sign-blob docs/governance/validation-evidence-<RUN-DATE>.md \
|
|
108
|
+
--bundle docs/governance/validation-evidence-<RUN-DATE>.md.bundle
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
| Field | Value |
|
|
112
|
+
|-------|-------|
|
|
113
|
+
| Signature type | _[ GPG / cosign ]_ |
|
|
114
|
+
| Key fingerprint / OIDC identity | _[fill in]_ |
|
|
115
|
+
| Bundle path | _[fill in, if cosign]_ |
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## Retention Policy
|
|
120
|
+
|
|
121
|
+
Retain this document per `docs/METHOD/EVIDENCE_RETENTION.md` (ADR-091):
|
|
122
|
+
|
|
123
|
+
- **Local mode:** keep last 5 runs under `.evidence/` (gitignored)
|
|
124
|
+
- **External mode:** upload to configured bucket; local copy pruned after upload
|
|
125
|
+
- **Minimum retention:** 2 years (regulated contexts requiring §11.10 compliance)
|
|
126
|
+
|
|
127
|
+
Run `node scripts/evidence-rotate.mjs` after archiving to enforce the rotation policy.
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
_This document was generated by arbiter. Fill in measured values immediately after each run._
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# containerapp.tpl.yaml — generated by arbiter — Azure Container Apps initial-provisioning spec
|
|
2
|
+
# SCAFFOLD (OPTIONAL) — one-time `az containerapp create` seed for the first deployment.
|
|
3
|
+
#
|
|
4
|
+
# This is NOT the CD deploy path. The generated GitHub Actions deploy workflows
|
|
5
|
+
# (`.github/workflows/04-deploy-test.yml`, `10-deploy-prod.yml`) promote new images
|
|
6
|
+
# with `az containerapp update --image` directly and do NOT touch this file. This
|
|
7
|
+
# template exists only for the initial `az containerapp create` of the resource.
|
|
8
|
+
#
|
|
9
|
+
# To provision the resource once, run:
|
|
10
|
+
# envsubst < infra/azure/containerapp.tpl.yaml | az containerapp create --yaml -
|
|
11
|
+
#
|
|
12
|
+
# Required env vars at deploy time:
|
|
13
|
+
# REGISTRY_IMAGE — fully-qualified image reference, e.g. "myacr.azurecr.io/app:v1.2.3"
|
|
14
|
+
# RESOURCE_GROUP — Azure resource group name
|
|
15
|
+
# CONTAINER_APP_NAME — name of the Container App resource (no spaces)
|
|
16
|
+
# ENVIRONMENT — Container Apps environment name (managed environment)
|
|
17
|
+
# LOCATION — Azure region, e.g. "westeurope"
|
|
18
|
+
# MIN_REPLICAS — minimum replica count (e.g. 0)
|
|
19
|
+
# MAX_REPLICAS — maximum replica count (e.g. 10)
|
|
20
|
+
# TARGET_PORT — container listening port (e.g. 8080)
|
|
21
|
+
#
|
|
22
|
+
# Ref: docs/SYSTEM/CI-TIER-MODEL.md §2 (infra slot, Azure target)
|
|
23
|
+
# Parent issue: #875 (F11)
|
|
24
|
+
|
|
25
|
+
# Project: <%= projectName %>
|
|
26
|
+
|
|
27
|
+
containerApp:
|
|
28
|
+
name: ${CONTAINER_APP_NAME}
|
|
29
|
+
location: ${LOCATION}
|
|
30
|
+
resourceGroup: ${RESOURCE_GROUP}
|
|
31
|
+
|
|
32
|
+
environment:
|
|
33
|
+
name: ${ENVIRONMENT}
|
|
34
|
+
|
|
35
|
+
configuration:
|
|
36
|
+
activeRevisionsMode: Single
|
|
37
|
+
|
|
38
|
+
ingress:
|
|
39
|
+
external: true
|
|
40
|
+
targetPort: ${TARGET_PORT}
|
|
41
|
+
transport: http
|
|
42
|
+
allowInsecure: false
|
|
43
|
+
|
|
44
|
+
registries: []
|
|
45
|
+
# Populate with your registry credentials if not using managed identity:
|
|
46
|
+
# registries:
|
|
47
|
+
# - server: myacr.azurecr.io
|
|
48
|
+
# identity: system
|
|
49
|
+
|
|
50
|
+
template:
|
|
51
|
+
containers:
|
|
52
|
+
- name: <%= projectName %>
|
|
53
|
+
image: ${REGISTRY_IMAGE}
|
|
54
|
+
resources:
|
|
55
|
+
cpu: 0.5
|
|
56
|
+
memory: 1Gi
|
|
57
|
+
env: []
|
|
58
|
+
# Add environment variables as needed:
|
|
59
|
+
# env:
|
|
60
|
+
# - name: NODE_ENV
|
|
61
|
+
# value: production
|
|
62
|
+
# - name: MY_SECRET
|
|
63
|
+
# secretRef: my-secret-ref
|
|
64
|
+
|
|
65
|
+
scale:
|
|
66
|
+
minReplicas: ${MIN_REPLICAS}
|
|
67
|
+
maxReplicas: ${MAX_REPLICAS}
|
|
68
|
+
rules: []
|
|
69
|
+
# Add HTTP scaling rule:
|
|
70
|
+
# rules:
|
|
71
|
+
# - name: http-scaling
|
|
72
|
+
# http:
|
|
73
|
+
# metadata:
|
|
74
|
+
# concurrentRequests: "100"
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# deploy.sh — generated by arbiter — pull-by-digest NAS deploy via docker-compose
|
|
3
|
+
# (deployTarget: nas-compose). Ported from a proven fleet reference deploy script,
|
|
4
|
+
# adapted for a NAS that already holds registry credentials (`docker login` persisted
|
|
5
|
+
# in /root/.docker/config.json) — the NAS pulls the signed image itself; no more
|
|
6
|
+
# `docker save | ssh | docker load`.
|
|
7
|
+
#
|
|
8
|
+
# Called by .github/workflows/_deploy/nas-compose.ejs:
|
|
9
|
+
# infra/nas-compose/deploy.sh <IMAGE_REF> # e.g. ghcr.io/org/<%= projectName %>@sha256:...
|
|
10
|
+
#
|
|
11
|
+
# Required env (exported by .github/actions/nas-ssh + the calling workflow step):
|
|
12
|
+
# NAS_SSH full ssh command prefix
|
|
13
|
+
# NAS_SUDO_PASS NAS sudo password — consumed by `sudo -S` on stdin only, never a
|
|
14
|
+
# command-line argument
|
|
15
|
+
#
|
|
16
|
+
# Config (repo/org vars — see _deploy/nas-compose.ejs):
|
|
17
|
+
# NAS_ROOT compose project root on the NAS (default /volume1/docker/app)
|
|
18
|
+
# SERVICES space-separated ordered service list for staged
|
|
19
|
+
# `docker-compose up -d --no-deps <svc>` (first entry is the
|
|
20
|
+
# "primary" service that gates health); empty = plain `up -d`
|
|
21
|
+
# bringing every service up together
|
|
22
|
+
# HEALTH_TIMEOUT_S seconds to wait for the primary service to report healthy
|
|
23
|
+
# BACKUP_CMD optional shell command run on the NAS before recreating the
|
|
24
|
+
# stack (app-specific — sqlite `.backup`, pg_dump, etc.);
|
|
25
|
+
# empty = no-op (ponytail: eval'd as-is, no sandboxing — this is
|
|
26
|
+
# an admin-configured repo var, not user input)
|
|
27
|
+
#
|
|
28
|
+
# This file is a SCAFFOLD (skipIfExists): customize it for your app, arbiter will
|
|
29
|
+
# not overwrite your edits on re-init.
|
|
30
|
+
set -euo pipefail
|
|
31
|
+
|
|
32
|
+
IMAGE_REF="${1:?usage: deploy.sh <IMAGE_REF>}"
|
|
33
|
+
NAS_ROOT="${NAS_ROOT:-/volume1/docker/app}"
|
|
34
|
+
SERVICES="${SERVICES:-}"
|
|
35
|
+
HEALTH_TIMEOUT_S="${HEALTH_TIMEOUT_S:-90}"
|
|
36
|
+
BACKUP_CMD="${BACKUP_CMD:-}"
|
|
37
|
+
|
|
38
|
+
fail() { printf 'nas-compose deploy: FAIL — %s\n' "$1" >&2; exit 1; }
|
|
39
|
+
|
|
40
|
+
[[ -n "${NAS_SSH:-}" ]] || fail 'NAS_SSH is not set (expected from .github/actions/nas-ssh)'
|
|
41
|
+
[[ -n "${NAS_SUDO_PASS:-}" ]] || fail 'NAS_SUDO_PASS is not set'
|
|
42
|
+
|
|
43
|
+
# The password is the first line of stdin, consumed by `sudo -S`; bash -s reads the
|
|
44
|
+
# rest as the script. Nothing secret ever appears in a command line or in the log.
|
|
45
|
+
remote_script=$(cat <<'REMOTE'
|
|
46
|
+
set -euo pipefail
|
|
47
|
+
IMAGE_REF="$1"
|
|
48
|
+
ROOT="$2"
|
|
49
|
+
SERVICES="$3"
|
|
50
|
+
HEALTH_TIMEOUT_S="$4"
|
|
51
|
+
BACKUP_CMD="$5"
|
|
52
|
+
DOCKER=/usr/local/bin/docker
|
|
53
|
+
COMPOSE=/usr/local/bin/docker-compose
|
|
54
|
+
|
|
55
|
+
step() { printf ' [nas] %s\n' "$1"; }
|
|
56
|
+
die() { printf ' [nas] FAIL — %s\n' "$1" >&2; exit 1; }
|
|
57
|
+
|
|
58
|
+
step "pulling ${IMAGE_REF}"
|
|
59
|
+
"$DOCKER" pull "$IMAGE_REF" || die "docker pull failed for ${IMAGE_REF}"
|
|
60
|
+
|
|
61
|
+
# Fail-closed: verification at the destination, on the exact bytes about to run —
|
|
62
|
+
# stronger than only verifying in CI (the image already left CI's custody).
|
|
63
|
+
command -v cosign >/dev/null 2>&1 || die 'cosign is not installed on the NAS — required for destination admission'
|
|
64
|
+
step 'verifying signature on the NAS (destination admission gate)'
|
|
65
|
+
cosign verify "$IMAGE_REF" >/dev/null || die "cosign verify failed for ${IMAGE_REF}"
|
|
66
|
+
|
|
67
|
+
if [[ -n "$BACKUP_CMD" ]]; then
|
|
68
|
+
step 'running pre-deploy backup hook'
|
|
69
|
+
eval "$BACKUP_CMD" || die 'BACKUP_CMD failed'
|
|
70
|
+
fi
|
|
71
|
+
|
|
72
|
+
cd "$ROOT"
|
|
73
|
+
[[ -f docker-compose.yml ]] || die "no docker-compose.yml in ${ROOT} — refusing to deploy by hand"
|
|
74
|
+
export IMAGE_REF
|
|
75
|
+
"$COMPOSE" config >/dev/null || die 'docker-compose config rejected the stack'
|
|
76
|
+
"$COMPOSE" pull || die 'docker-compose pull failed'
|
|
77
|
+
|
|
78
|
+
if [[ -n "$SERVICES" ]]; then
|
|
79
|
+
for svc in $SERVICES; do
|
|
80
|
+
step "recreating service: ${svc}"
|
|
81
|
+
"$COMPOSE" up -d --no-deps "$svc" || die "up -d --no-deps ${svc} failed"
|
|
82
|
+
done
|
|
83
|
+
primary="$(awk '{print $1}' <<< "$SERVICES")"
|
|
84
|
+
else
|
|
85
|
+
"$COMPOSE" up -d || die 'docker-compose up -d failed'
|
|
86
|
+
primary=""
|
|
87
|
+
fi
|
|
88
|
+
|
|
89
|
+
if [[ -n "$primary" ]]; then
|
|
90
|
+
step "waiting up to ${HEALTH_TIMEOUT_S}s for ${primary} to be healthy"
|
|
91
|
+
for _ in $(seq 1 "$HEALTH_TIMEOUT_S"); do
|
|
92
|
+
status="$("$DOCKER" inspect "$primary" --format '{{if .State.Health}}{{.State.Health.Status}}{{else}}none{{end}}' 2>/dev/null || echo '')"
|
|
93
|
+
[[ "$status" == "healthy" || "$status" == "none" ]] && break
|
|
94
|
+
sleep 1
|
|
95
|
+
done
|
|
96
|
+
final="$("$DOCKER" inspect "$primary" --format '{{.State.Running}} {{if .State.Health}}{{.State.Health.Status}}{{else}}none{{end}}' 2>/dev/null || echo 'absent')"
|
|
97
|
+
if [[ "$final" != "true healthy" && "$final" != "true none" ]]; then
|
|
98
|
+
# Stop the restart policy from cycling a broken container while it is inspected —
|
|
99
|
+
# never leave a broken container auto-restarting.
|
|
100
|
+
"$DOCKER" update --restart=no "$primary" 2>/dev/null || true
|
|
101
|
+
"$DOCKER" logs --tail 40 "$primary" 2>&1 || true
|
|
102
|
+
die "${primary} is not running+healthy after ${HEALTH_TIMEOUT_S}s (got '${final}') — restart policy set to 'no'"
|
|
103
|
+
fi
|
|
104
|
+
step "verified: ${primary} healthy"
|
|
105
|
+
fi
|
|
106
|
+
REMOTE
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
printf 'nas-compose deploy: deploying %s on the NAS\n' "$IMAGE_REF"
|
|
110
|
+
printf '%s\n%s' "$NAS_SUDO_PASS" "$remote_script" |
|
|
111
|
+
$NAS_SSH "sudo -S bash -s -- '${IMAGE_REF}' '${NAS_ROOT}' '${SERVICES}' '${HEALTH_TIMEOUT_S}' '${BACKUP_CMD}'" ||
|
|
112
|
+
fail 'NAS deployment failed — see the [nas] lines above'
|
|
113
|
+
|
|
114
|
+
printf 'nas-compose deploy: PASS — %s is live on the NAS\n' "$IMAGE_REF"
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
package <%= locals.basePackage ? locals.basePackage + '.support' : 'support' %>;
|
|
2
|
+
|
|
3
|
+
import org.springframework.boot.test.context.SpringBootTest;
|
|
4
|
+
import org.springframework.test.context.DynamicPropertyRegistry;
|
|
5
|
+
import org.springframework.test.context.DynamicPropertySource;
|
|
6
|
+
import org.testcontainers.containers.PostgreSQLContainer;
|
|
7
|
+
import org.testcontainers.junit.jupiter.Container;
|
|
8
|
+
import org.testcontainers.junit.jupiter.Testcontainers;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Base class for integration tests — generated by arbiter (M26).
|
|
12
|
+
*
|
|
13
|
+
* Provides:
|
|
14
|
+
* - PostgreSQL 16 via Testcontainers (shared container across subclasses)
|
|
15
|
+
* - DynamicPropertySource to override spring.datasource.* at test time
|
|
16
|
+
*
|
|
17
|
+
* Generated once (skipIfExists). Edit freely after generation.
|
|
18
|
+
*/
|
|
19
|
+
@Testcontainers
|
|
20
|
+
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
|
|
21
|
+
public abstract class AbstractIntegrationTest {
|
|
22
|
+
|
|
23
|
+
@Container
|
|
24
|
+
protected static final PostgreSQLContainer<?> postgres =
|
|
25
|
+
new PostgreSQLContainer<>("postgres:16-alpine")
|
|
26
|
+
.withDatabaseName("testdb")
|
|
27
|
+
.withUsername("test")
|
|
28
|
+
.withPassword("test");
|
|
29
|
+
|
|
30
|
+
@DynamicPropertySource
|
|
31
|
+
static void overrideDataSourceProperties(DynamicPropertyRegistry registry) {
|
|
32
|
+
registry.add("spring.datasource.url", postgres::getJdbcUrl);
|
|
33
|
+
registry.add("spring.datasource.username", postgres::getUsername);
|
|
34
|
+
registry.add("spring.datasource.password", postgres::getPassword);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
package <%= basePackage ? basePackage + '.architecture' : 'architecture' %>;
|
|
2
|
+
|
|
3
|
+
import com.tngtech.archunit.junit.AnalyzeClasses;
|
|
4
|
+
import com.tngtech.archunit.junit.ArchTest;
|
|
5
|
+
import com.tngtech.archunit.lang.ArchRule;
|
|
6
|
+
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Bans H2 in-memory database imports — generated by arbiter (M26, INV-34).
|
|
10
|
+
*
|
|
11
|
+
* Enforces that test classes do not import H2, SQLite, or other in-memory
|
|
12
|
+
* databases. Real integration tests must use Testcontainers + PostgreSQL.
|
|
13
|
+
*/
|
|
14
|
+
@AnalyzeClasses(packages = "<%= basePackage ?? 'com.example' %>")
|
|
15
|
+
public class NoH2ArchTest {
|
|
16
|
+
|
|
17
|
+
@ArchTest
|
|
18
|
+
static final ArchRule no_h2_imports =
|
|
19
|
+
noClasses()
|
|
20
|
+
.should()
|
|
21
|
+
.dependOnClassesThat()
|
|
22
|
+
.resideInAnyPackage("org.h2..")
|
|
23
|
+
.because("Use Testcontainers + PostgreSQL for integration tests (INV-34). H2 in-memory mode masks real SQL compatibility issues.");
|
|
24
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Integration test fixtures — generated by arbiter (M26, INV-34)
|
|
2
|
+
# File: tests/conftest.py
|
|
3
|
+
|
|
4
|
+
import os
|
|
5
|
+
import pytest
|
|
6
|
+
from testcontainers.postgres import PostgreSQLContainer
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@pytest.fixture(scope="session")
|
|
10
|
+
def postgres_container():
|
|
11
|
+
"""Start a PostgreSQL Testcontainer for the test session."""
|
|
12
|
+
with PostgreSQLContainer("postgres:16-alpine") as postgres:
|
|
13
|
+
os.environ["DATABASE_URL"] = postgres.get_connection_url()
|
|
14
|
+
yield postgres
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@pytest.fixture(scope="session")
|
|
18
|
+
def database_url(postgres_container):
|
|
19
|
+
"""Return the DATABASE_URL for the running PostgreSQL container."""
|
|
20
|
+
return os.environ["DATABASE_URL"]
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// Integration test database fixture — generated by arbiter (M26, INV-34)
|
|
2
|
+
// File: tests/db_fixture.rs
|
|
3
|
+
//
|
|
4
|
+
// Starts a real PostgreSQL container via testcontainers-rs for integration tests.
|
|
5
|
+
// Add to Cargo.toml [dev-dependencies]:
|
|
6
|
+
// testcontainers = "0.23"
|
|
7
|
+
//
|
|
8
|
+
// Run integration tests:
|
|
9
|
+
// cargo test --tests
|
|
10
|
+
|
|
11
|
+
use std::sync::OnceLock;
|
|
12
|
+
use testcontainers::clients::Cli;
|
|
13
|
+
use testcontainers::core::WaitFor;
|
|
14
|
+
use testcontainers::GenericImage;
|
|
15
|
+
use testcontainers::Container;
|
|
16
|
+
|
|
17
|
+
static DOCKER: OnceLock<Cli> = OnceLock::new();
|
|
18
|
+
|
|
19
|
+
/// Starts a PostgreSQL 16-alpine container and returns the connection URL.
|
|
20
|
+
/// The container is kept alive for the lifetime of the returned `Container`.
|
|
21
|
+
pub fn start_postgres() -> (String, Container<'static, GenericImage>) {
|
|
22
|
+
let docker = DOCKER.get_or_init(Cli::default);
|
|
23
|
+
let image = GenericImage::new("postgres", "16-alpine")
|
|
24
|
+
.with_env_var("POSTGRES_USER", "test")
|
|
25
|
+
.with_env_var("POSTGRES_PASSWORD", "test")
|
|
26
|
+
.with_env_var("POSTGRES_DB", "testdb")
|
|
27
|
+
.with_wait_for(WaitFor::message_on_stderr(
|
|
28
|
+
"database system is ready to accept connections",
|
|
29
|
+
));
|
|
30
|
+
let container = docker.run(image);
|
|
31
|
+
let port = container.get_host_port_ipv4(5432);
|
|
32
|
+
let url = format!("postgres://test:test@127.0.0.1:{}/testdb", port);
|
|
33
|
+
(url, container)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
#[cfg(test)]
|
|
37
|
+
mod tests {
|
|
38
|
+
use super::*;
|
|
39
|
+
|
|
40
|
+
#[test]
|
|
41
|
+
fn postgres_container_starts_and_accepts_connections() {
|
|
42
|
+
let (url, _container) = start_postgres();
|
|
43
|
+
assert!(
|
|
44
|
+
url.starts_with("postgres://"),
|
|
45
|
+
"connection URL must be a PostgreSQL connection string"
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"rules": {
|
|
3
|
+
"no-restricted-imports": [
|
|
4
|
+
"error",
|
|
5
|
+
{
|
|
6
|
+
"paths": [
|
|
7
|
+
{
|
|
8
|
+
"name": "sqlite3",
|
|
9
|
+
"message": "Use Testcontainers + PostgreSQL for integration tests (INV-34). sqlite3 is banned in test files."
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"name": "better-sqlite3",
|
|
13
|
+
"message": "Use Testcontainers + PostgreSQL for integration tests (INV-34). better-sqlite3 is banned in test files."
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
}
|
|
17
|
+
]
|
|
18
|
+
}
|
|
19
|
+
}
|