@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,216 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// <%= projectName %> — SpotBugs baseline manager
|
|
3
|
+
// Generated by arbiter. Re-generate: arbiter update
|
|
4
|
+
// Usage:
|
|
5
|
+
// node scripts/verify-spotbugs.mjs # check against baseline
|
|
6
|
+
// node scripts/verify-spotbugs.mjs --update-baseline # update baseline with non-security findings
|
|
7
|
+
// node scripts/verify-spotbugs.mjs --report-only # print findings without failing
|
|
8
|
+
//
|
|
9
|
+
// Security-category bugs are NEVER baselined (INV-44):
|
|
10
|
+
// SQL_INJECTION, SQL_INJECTION_SPRING_JDBC, XSS_REQUEST_WRAPPER, XSS_SERVLET,
|
|
11
|
+
// COMMAND_INJECTION, XXE_DOCUMENT, XXE_XMLREADER, LDAP_INJECTION, HARD_CODE_PASSWORD
|
|
12
|
+
|
|
13
|
+
import { readFileSync, writeFileSync, existsSync } from "node:fs";
|
|
14
|
+
import { join } from "node:path";
|
|
15
|
+
import { parseArgs } from "node:util";
|
|
16
|
+
|
|
17
|
+
const SECURITY_HARD_BLOCK = new Set([
|
|
18
|
+
"SQL_INJECTION",
|
|
19
|
+
"SQL_INJECTION_SPRING_JDBC",
|
|
20
|
+
"XSS_REQUEST_WRAPPER",
|
|
21
|
+
"XSS_SERVLET",
|
|
22
|
+
"COMMAND_INJECTION",
|
|
23
|
+
"XXE_DOCUMENT",
|
|
24
|
+
"XXE_XMLREADER",
|
|
25
|
+
"LDAP_INJECTION",
|
|
26
|
+
"HARD_CODE_PASSWORD",
|
|
27
|
+
]);
|
|
28
|
+
|
|
29
|
+
const SPOTBUGS_XML = join("build", "reports", "spotbugs", "main.xml");
|
|
30
|
+
const BASELINE_JSON = join("spotbugs-baseline.json");
|
|
31
|
+
|
|
32
|
+
const { values: flags } = parseArgs({
|
|
33
|
+
options: {
|
|
34
|
+
"update-baseline": { type: "boolean", default: false },
|
|
35
|
+
"report-only": { type: "boolean", default: false },
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
const updateBaseline = flags["update-baseline"];
|
|
40
|
+
const reportOnly = flags["report-only"];
|
|
41
|
+
|
|
42
|
+
// ─── Parse SpotBugs XML ──────────────────────────────────────────────────────
|
|
43
|
+
|
|
44
|
+
if (!existsSync(SPOTBUGS_XML)) {
|
|
45
|
+
console.error(`[spotbugs] XML report not found: ${SPOTBUGS_XML}`);
|
|
46
|
+
console.error("[spotbugs] Run SpotBugs first: ./gradlew spotbugsMain");
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const xml = readFileSync(SPOTBUGS_XML, "utf-8");
|
|
51
|
+
|
|
52
|
+
// Extract BugType:ClassName pairs via matchAll (no shell — pure string parsing)
|
|
53
|
+
const bugInstancePattern =
|
|
54
|
+
/<BugInstance[^>]+type="([^"]+)"[^>]*>[\s\S]*?<Class[^>]+classname="([^"]+)"/g;
|
|
55
|
+
|
|
56
|
+
/** @type {{ bugType: string; className: string }[]} */
|
|
57
|
+
const findings = [...xml.matchAll(bugInstancePattern)].map((m) => ({
|
|
58
|
+
bugType: m[1],
|
|
59
|
+
className: m[2],
|
|
60
|
+
}));
|
|
61
|
+
|
|
62
|
+
// ─── Load Baseline ───────────────────────────────────────────────────────────
|
|
63
|
+
|
|
64
|
+
/** @type {{ baselined: string[]; policy: string; maxSuppressions?: number }} */
|
|
65
|
+
let baseline = {
|
|
66
|
+
baselined: [],
|
|
67
|
+
policy: "security-category bugs are never baselined",
|
|
68
|
+
};
|
|
69
|
+
if (existsSync(BASELINE_JSON)) {
|
|
70
|
+
try {
|
|
71
|
+
baseline = JSON.parse(readFileSync(BASELINE_JSON, "utf-8"));
|
|
72
|
+
} catch {
|
|
73
|
+
console.error(
|
|
74
|
+
"[spotbugs] Failed to parse spotbugs-baseline.json — using empty baseline",
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const baselinedSet = new Set(baseline.baselined);
|
|
80
|
+
|
|
81
|
+
// ─── Suppression-growth ratchet (INV-44, #1510) ──────────────────────────────
|
|
82
|
+
// A suppressed finding never appears in the report, so the finding-baseline above
|
|
83
|
+
// cannot see it — quality can silently backslide by ADDING <Match> entries to the
|
|
84
|
+
// exclude filter. Ratchet the suppression COUNT: it may only grow with an explicit
|
|
85
|
+
// baseline bump (the justification lives in the reviewed commit), never silently.
|
|
86
|
+
const EXCLUDE_FILTER = join("config", "spotbugs-exclude.xml");
|
|
87
|
+
|
|
88
|
+
/** Pure: count <Match> suppression entries in a SpotBugs exclude-filter XML. */
|
|
89
|
+
export function countSuppressionMatches(xml) {
|
|
90
|
+
if (typeof xml !== "string") return 0;
|
|
91
|
+
return (xml.match(/<Match\b/g) || []).length;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const currentSuppressions = existsSync(EXCLUDE_FILTER)
|
|
95
|
+
? countSuppressionMatches(readFileSync(EXCLUDE_FILTER, "utf-8"))
|
|
96
|
+
: 0;
|
|
97
|
+
const baselineMaxSuppressions =
|
|
98
|
+
typeof baseline.maxSuppressions === "number" ? baseline.maxSuppressions : null;
|
|
99
|
+
|
|
100
|
+
// ─── Classify Findings ───────────────────────────────────────────────────────
|
|
101
|
+
|
|
102
|
+
/** @type {string[]} */
|
|
103
|
+
const securityFindings = [];
|
|
104
|
+
/** @type {string[]} */
|
|
105
|
+
const newNonSecurity = [];
|
|
106
|
+
/** @type {string[]} */
|
|
107
|
+
const baselinedFindings = [];
|
|
108
|
+
/** @type {string[]} */
|
|
109
|
+
const resolvedFindings = [];
|
|
110
|
+
|
|
111
|
+
const currentKeys = new Set();
|
|
112
|
+
for (const f of findings) {
|
|
113
|
+
const key = `${f.bugType}:${f.className}`;
|
|
114
|
+
currentKeys.add(key);
|
|
115
|
+
if (SECURITY_HARD_BLOCK.has(f.bugType)) {
|
|
116
|
+
securityFindings.push(key);
|
|
117
|
+
} else if (baselinedSet.has(key)) {
|
|
118
|
+
baselinedFindings.push(key);
|
|
119
|
+
} else {
|
|
120
|
+
newNonSecurity.push(key);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
for (const key of baselinedSet) {
|
|
125
|
+
if (!currentKeys.has(key)) {
|
|
126
|
+
resolvedFindings.push(key);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// ─── Report ──────────────────────────────────────────────────────────────────
|
|
131
|
+
|
|
132
|
+
if (resolvedFindings.length > 0) {
|
|
133
|
+
console.log("[spotbugs] Resolved findings (no longer present):");
|
|
134
|
+
for (const k of resolvedFindings) console.log(` ✓ ${k}`);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (baselinedFindings.length > 0) {
|
|
138
|
+
console.log("[spotbugs] Baselined findings (known, tracked):");
|
|
139
|
+
for (const k of baselinedFindings) console.log(` ~ ${k}`);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
if (securityFindings.length > 0) {
|
|
143
|
+
console.error("[spotbugs] SECURITY FINDINGS — never baselined (INV-44):");
|
|
144
|
+
for (const k of securityFindings) console.error(` ✗ ${k}`);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if (newNonSecurity.length > 0) {
|
|
148
|
+
console.log("[spotbugs] New non-security findings:");
|
|
149
|
+
for (const k of newNonSecurity) console.log(` ! ${k}`);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// ─── Update Baseline ─────────────────────────────────────────────────────────
|
|
153
|
+
|
|
154
|
+
if (updateBaseline) {
|
|
155
|
+
if (securityFindings.length > 0) {
|
|
156
|
+
console.error(
|
|
157
|
+
"[spotbugs] Cannot update baseline: security-category findings present. Fix them first.",
|
|
158
|
+
);
|
|
159
|
+
process.exit(1);
|
|
160
|
+
}
|
|
161
|
+
const newBaseline = {
|
|
162
|
+
baselined: Array.from(new Set([...baselinedSet, ...newNonSecurity])).sort(),
|
|
163
|
+
policy: baseline.policy,
|
|
164
|
+
// #1510: record the accepted suppression count so future growth is gated.
|
|
165
|
+
maxSuppressions: currentSuppressions,
|
|
166
|
+
};
|
|
167
|
+
writeFileSync(BASELINE_JSON, JSON.stringify(newBaseline, null, 2) + "\n");
|
|
168
|
+
console.log(
|
|
169
|
+
`[spotbugs] Baseline updated: ${newBaseline.baselined.length} entries, ${currentSuppressions} suppression(s)`,
|
|
170
|
+
);
|
|
171
|
+
process.exit(0);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// ─── Verdict ─────────────────────────────────────────────────────────────────
|
|
175
|
+
|
|
176
|
+
if (reportOnly) {
|
|
177
|
+
console.log(
|
|
178
|
+
`[spotbugs] Report-only mode. Total findings: ${findings.length}`,
|
|
179
|
+
);
|
|
180
|
+
process.exit(0);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
if (securityFindings.length > 0) {
|
|
184
|
+
console.error(
|
|
185
|
+
`[spotbugs] Gate FAILED: ${securityFindings.length} security-category finding(s) — never baselineable.`,
|
|
186
|
+
);
|
|
187
|
+
process.exit(1);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
if (newNonSecurity.length > 0) {
|
|
191
|
+
console.error(
|
|
192
|
+
`[spotbugs] Gate FAILED: ${newNonSecurity.length} new non-security finding(s). ` +
|
|
193
|
+
"Run with --update-baseline to add to baseline after review.",
|
|
194
|
+
);
|
|
195
|
+
process.exit(1);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// #1510: suppression-growth ratchet. First run (no recorded max) seeds the count and
|
|
199
|
+
// passes; afterwards an unjustified new <Match> in config/spotbugs-exclude.xml is red.
|
|
200
|
+
if (baselineMaxSuppressions === null) {
|
|
201
|
+
const seeded = { ...baseline, maxSuppressions: currentSuppressions };
|
|
202
|
+
writeFileSync(BASELINE_JSON, JSON.stringify(seeded, null, 2) + "\n");
|
|
203
|
+
console.log(
|
|
204
|
+
`[spotbugs] Seeded suppression baseline: ${currentSuppressions} <Match> entry(ies).`,
|
|
205
|
+
);
|
|
206
|
+
} else if (currentSuppressions > baselineMaxSuppressions) {
|
|
207
|
+
console.error(
|
|
208
|
+
`[spotbugs] Gate FAILED: suppression count grew ${baselineMaxSuppressions} → ${currentSuppressions} ` +
|
|
209
|
+
"in config/spotbugs-exclude.xml. A new suppression hides a finding — fix the root cause, " +
|
|
210
|
+
"or run --update-baseline to accept it (the justification lives in the reviewed commit).",
|
|
211
|
+
);
|
|
212
|
+
process.exit(1);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
console.log("[spotbugs] Gate PASSED.");
|
|
216
|
+
process.exit(0);
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
// CATALOG: INV-105 enforcement — design token discipline gate (#1127).
|
|
4
|
+
// Checks:
|
|
5
|
+
// A) No raw hex/rgb colors in component source files
|
|
6
|
+
// B) No phantom token references (token name not in design-tokens.json)
|
|
7
|
+
// C) No direct foundation/primitive token refs in component files
|
|
8
|
+
// Exit 1 if any violation found (HARD gate — L2+).
|
|
9
|
+
// Framework-aware: scans appropriate file extensions per detected framework.
|
|
10
|
+
|
|
11
|
+
import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs'
|
|
12
|
+
import { extname, join, relative } from 'node:path'
|
|
13
|
+
<%
|
|
14
|
+
const _fw = (typeof frontend !== 'undefined' && frontend && frontend.framework)
|
|
15
|
+
? frontend.framework : 'react'
|
|
16
|
+
const _exts = _fw === 'vue'
|
|
17
|
+
? ['.ts', '.vue', '.css', '.scss']
|
|
18
|
+
: _fw === 'svelte'
|
|
19
|
+
? ['.ts', '.svelte', '.css', '.scss']
|
|
20
|
+
: ['.ts', '.tsx', '.jsx', '.css', '.scss']
|
|
21
|
+
const _extList = JSON.stringify(_exts)
|
|
22
|
+
%>
|
|
23
|
+
const ROOT = process.cwd()
|
|
24
|
+
const SRC = join(ROOT, 'src')
|
|
25
|
+
const TOKENS_FILE = join(ROOT, 'design-tokens.json')
|
|
26
|
+
const SOURCE_EXTS = new Set(<%- _extList %>)
|
|
27
|
+
|
|
28
|
+
// Raw color patterns that should never appear in component files
|
|
29
|
+
const RAW_HEX_PATTERN = /#[0-9a-fA-F]{3,8}\b/g
|
|
30
|
+
const RAW_RGB_PATTERN = /\brgba?\s*\(/g
|
|
31
|
+
const RAW_HSL_PATTERN = /\bhsla?\s*\(/g
|
|
32
|
+
|
|
33
|
+
// Foundation/primitive token prefix that should NOT be used in components
|
|
34
|
+
const FOUNDATION_PREFIX_PATTERN = /var\(--f-[a-z]/
|
|
35
|
+
|
|
36
|
+
let violations = 0
|
|
37
|
+
|
|
38
|
+
// Build a set of valid semantic token CSS var names from design-tokens.json
|
|
39
|
+
function buildTokenVarNames(tokens, prefix = '--') {
|
|
40
|
+
const names = new Set()
|
|
41
|
+
for (const [key, value] of Object.entries(tokens)) {
|
|
42
|
+
if (key.startsWith('$')) continue
|
|
43
|
+
const cssVarName = `${prefix}${key}`
|
|
44
|
+
if (typeof value === 'object' && value !== null && !('$value' in value)) {
|
|
45
|
+
// Nested group — recurse
|
|
46
|
+
for (const name of buildTokenVarNames(value, `${cssVarName}-`)) {
|
|
47
|
+
names.add(name)
|
|
48
|
+
}
|
|
49
|
+
} else if ('$value' in value) {
|
|
50
|
+
names.add(cssVarName)
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return names
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
let validTokenNames = new Set()
|
|
57
|
+
let tokensLoaded = false
|
|
58
|
+
if (existsSync(TOKENS_FILE)) {
|
|
59
|
+
// Parse failure is fatal — phantom token check cannot run on a corrupt token file.
|
|
60
|
+
// Silently continuing would produce false-negatives (INV-105 passes with no phantom detection).
|
|
61
|
+
try {
|
|
62
|
+
const tokens = JSON.parse(readFileSync(TOKENS_FILE, 'utf-8'))
|
|
63
|
+
validTokenNames = buildTokenVarNames(tokens)
|
|
64
|
+
tokensLoaded = true
|
|
65
|
+
} catch (err) {
|
|
66
|
+
process.stderr.write(
|
|
67
|
+
`[INV-105] FATAL: failed to parse design-tokens.json: ${err.message}\n` +
|
|
68
|
+
` Phantom token check cannot run. Fix design-tokens.json or delete it to skip.\n`,
|
|
69
|
+
)
|
|
70
|
+
process.exit(1)
|
|
71
|
+
}
|
|
72
|
+
} else {
|
|
73
|
+
process.stderr.write(
|
|
74
|
+
'[INV-105] WARNING: design-tokens.json not found — phantom token check skipped\n',
|
|
75
|
+
)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function checkFile(absPath) {
|
|
79
|
+
const rel = relative(ROOT, absPath)
|
|
80
|
+
let content
|
|
81
|
+
try {
|
|
82
|
+
content = readFileSync(absPath, 'utf-8')
|
|
83
|
+
} catch {
|
|
84
|
+
return
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const lines = content.split('\n')
|
|
88
|
+
|
|
89
|
+
for (let i = 0; i < lines.length; i++) {
|
|
90
|
+
const line = lines[i]
|
|
91
|
+
const lineNum = i + 1
|
|
92
|
+
|
|
93
|
+
// A) Raw hex colors
|
|
94
|
+
const hexMatches = line.match(RAW_HEX_PATTERN) ?? []
|
|
95
|
+
// Allow hex in comments, string literals in test files, and token definitions
|
|
96
|
+
const isTokenDef = /"\$value"\s*:/.test(line) || /'\$value'\s*:/.test(line)
|
|
97
|
+
const isComment = /^\s*(\/\/|\/\*|\*|<!--)/.test(line)
|
|
98
|
+
if (!isTokenDef && !isComment && hexMatches.length > 0) {
|
|
99
|
+
for (const hex of hexMatches) {
|
|
100
|
+
process.stderr.write(
|
|
101
|
+
`[INV-105] ${rel}:${lineNum}: raw hex color ${hex} — use a semantic token instead\n`,
|
|
102
|
+
)
|
|
103
|
+
violations++
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// B) Raw rgb/hsl functions (excluding CSS custom property definitions)
|
|
108
|
+
if (!isTokenDef && !isComment && (RAW_RGB_PATTERN.test(line) || RAW_HSL_PATTERN.test(line))) {
|
|
109
|
+
process.stderr.write(
|
|
110
|
+
`[INV-105] ${rel}:${lineNum}: raw color function — use a semantic token instead\n`,
|
|
111
|
+
)
|
|
112
|
+
violations++
|
|
113
|
+
}
|
|
114
|
+
RAW_RGB_PATTERN.lastIndex = 0
|
|
115
|
+
RAW_HSL_PATTERN.lastIndex = 0
|
|
116
|
+
|
|
117
|
+
// C) Foundation/primitive token refs
|
|
118
|
+
if (FOUNDATION_PREFIX_PATTERN.test(line) && !isComment) {
|
|
119
|
+
process.stderr.write(
|
|
120
|
+
`[INV-105] ${rel}:${lineNum}: foundation token (--f-*) used in component — use semantic token instead\n`,
|
|
121
|
+
)
|
|
122
|
+
violations++
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// B) Phantom token detection (var(--something) not in design-tokens.json)
|
|
127
|
+
if (tokensLoaded && (absPath.endsWith('.css') || absPath.endsWith('.scss'))) {
|
|
128
|
+
const cssVarRefs = [...content.matchAll(/var\((--[a-z][a-z0-9-]*)\)/g)].map((m) => m[1])
|
|
129
|
+
for (const varName of cssVarRefs) {
|
|
130
|
+
if (!validTokenNames.has(varName) && !varName.startsWith('--f-')) {
|
|
131
|
+
// Phantom: referenced but not defined in token file
|
|
132
|
+
process.stderr.write(
|
|
133
|
+
`[INV-105] ${rel}: phantom token reference: ${varName} not in design-tokens.json\n`,
|
|
134
|
+
)
|
|
135
|
+
violations++
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function walkSrc(dir) {
|
|
142
|
+
if (!existsSync(dir)) return
|
|
143
|
+
let entries
|
|
144
|
+
try {
|
|
145
|
+
entries = readdirSync(dir)
|
|
146
|
+
} catch {
|
|
147
|
+
return
|
|
148
|
+
}
|
|
149
|
+
for (const entry of entries) {
|
|
150
|
+
const full = join(dir, entry)
|
|
151
|
+
let st
|
|
152
|
+
try {
|
|
153
|
+
st = statSync(full)
|
|
154
|
+
} catch {
|
|
155
|
+
continue
|
|
156
|
+
}
|
|
157
|
+
if (st.isDirectory()) {
|
|
158
|
+
if (entry === 'node_modules' || entry === '.git' || entry === '__tests__') continue
|
|
159
|
+
walkSrc(full)
|
|
160
|
+
} else if (st.isFile() && SOURCE_EXTS.has(extname(entry))) {
|
|
161
|
+
checkFile(full)
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
walkSrc(SRC)
|
|
167
|
+
|
|
168
|
+
if (violations > 0) {
|
|
169
|
+
process.stderr.write(
|
|
170
|
+
`\n[verify-tokens] ${violations} violation(s) found.\n` +
|
|
171
|
+
` INV-105: Use semantic tokens from design-tokens.json, not raw colors.\n` +
|
|
172
|
+
` See docs/GOVERNANCE/FE_DESIGN_PRINCIPLES.md P1.\n`,
|
|
173
|
+
)
|
|
174
|
+
process.exit(1)
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
process.stdout.write('[verify-tokens] design token discipline OK (INV-105)\n')
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Risk Assessment
|
|
2
|
+
|
|
3
|
+
> ISO 27001:2022 §6.1.2 — Information security risk assessment
|
|
4
|
+
|
|
5
|
+
_Generated by arbiter at L3 governance level. Review and update annually or after significant architecture changes._
|
|
6
|
+
|
|
7
|
+
## Probability × Impact Matrix (P×I)
|
|
8
|
+
|
|
9
|
+
| Probability \ Impact | Low (1) | Medium (2) | High (3) | Critical (4) |
|
|
10
|
+
|----------------------|---------|-----------|---------|-------------|
|
|
11
|
+
| **Unlikely (1)** | 1 | 2 | 3 | 4 |
|
|
12
|
+
| **Possible (2)** | 2 | 4 | 6 | 8 |
|
|
13
|
+
| **Likely (3)** | 3 | 6 | 9 | 12 |
|
|
14
|
+
| **Almost Certain (4)**| 4 | 8 | 12 | 16 |
|
|
15
|
+
|
|
16
|
+
### Risk Thresholds
|
|
17
|
+
|
|
18
|
+
| Score | Tier | Action Required |
|
|
19
|
+
|-------|------------|--------------------------------------------------|
|
|
20
|
+
| ≤ 4 | Low | Monitor; no immediate action required |
|
|
21
|
+
| 5–8 | Medium | Mitigate within 90 days; document in backlog |
|
|
22
|
+
| 9–12 | High | Mitigate within 30 days; notify security team |
|
|
23
|
+
| > 12 | Critical | Immediate mitigation; escalate to management |
|
|
24
|
+
|
|
25
|
+
## Risk Register
|
|
26
|
+
|
|
27
|
+
| ID | Threat | Asset | P | I | Score | Tier | Mitigation | Owner | Due Date |
|
|
28
|
+
|------|-----------------|-------------------|---|---|-------|------|------------------------|-------|----------|
|
|
29
|
+
| R-001| _Example threat_| _Affected asset_ | 2 | 3 | 6 | Medium | _Describe mitigation_ | TBD | TBD |
|
|
30
|
+
|
|
31
|
+
## Review History
|
|
32
|
+
|
|
33
|
+
| Date | Reviewer | Changes |
|
|
34
|
+
|------|----------|---------|
|
|
35
|
+
| _YYYY-MM-DD_ | _Name_ | Initial assessment |
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# STRIDE Threat Model — <%= projectName %>
|
|
2
|
+
|
|
3
|
+
<!-- arbiter-managed: claim-verified-governance (INV-90) -->
|
|
4
|
+
<!-- HIGH and CRITICAL threats require a @Security:<id>-tagged test. -->
|
|
5
|
+
<!-- Run: node scripts/check-stride-traceability.mjs to verify. -->
|
|
6
|
+
|
|
7
|
+
## Threat Register
|
|
8
|
+
|
|
9
|
+
| ID | Threat | Category | Severity | Mitigation | Status |
|
|
10
|
+
|----|--------|----------|----------|------------|--------|
|
|
11
|
+
|
|
12
|
+
<!--
|
|
13
|
+
## How to use this table
|
|
14
|
+
|
|
15
|
+
1. Add a row for each identified threat.
|
|
16
|
+
2. Set Severity: CRITICAL, HIGH, MEDIUM, or LOW.
|
|
17
|
+
3. For HIGH and CRITICAL threats, annotate the verifying test with:
|
|
18
|
+
// @Security:<id>
|
|
19
|
+
where <id> matches the ID column (e.g., // @Security:S001).
|
|
20
|
+
4. Run: node scripts/check-stride-traceability.mjs
|
|
21
|
+
|
|
22
|
+
Categories: S=Spoofing, T=Tampering, R=Repudiation, I=Information Disclosure, D=Denial of Service, E=Elevation of Privilege
|
|
23
|
+
Status: OPEN | MITIGATED | ACCEPTED
|
|
24
|
+
-->
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# <%- projectName %> — Gitleaks configuration
|
|
2
|
+
# Generated by arbiter. Managed file — do not delete.
|
|
3
|
+
# Docs: https://github.com/gitleaks/gitleaks
|
|
4
|
+
|
|
5
|
+
[extend]
|
|
6
|
+
useDefault = true
|
|
7
|
+
|
|
8
|
+
[allowlist]
|
|
9
|
+
description = "Project-level allowlist (see suppressions/.gitleaksignore)"
|
|
10
|
+
paths = [
|
|
11
|
+
'''suppressions/\.gitleaksignore''',
|
|
12
|
+
'''\.gitleaks\.toml''',
|
|
13
|
+
# Arbiter render-hash baseline (fleet provenance — committed by design). Its
|
|
14
|
+
# path->sha256 entries are content hashes, not secrets; allowlist the path so
|
|
15
|
+
# gitleaks' generic-api-key rule does not flag them and block the push.
|
|
16
|
+
'''\.arbiter-generated-manifest\.json''',
|
|
17
|
+
]
|
|
18
|
+
|
|
19
|
+
# Paths that gitleaks scans are controlled via .gitleaksignore
|
|
20
|
+
# Individual fingerprint suppressions go in suppressions/.gitleaksignore
|
|
21
|
+
# (managed by arbiter suppression system with expiry enforcement)
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
2
|
+
<!-- ZAP baseline authentication context — <%= projectName %> -->
|
|
3
|
+
<!-- Generated by arbiter (#898). Customise loginUrl and credentials for your stack. -->
|
|
4
|
+
<!-- Reference: https://www.zaproxy.org/docs/desktop/addons/authentication/ -->
|
|
5
|
+
<Context>
|
|
6
|
+
<name><%= projectName %>-baseline-auth</name>
|
|
7
|
+
<desc>Authenticated baseline DAST context for <%= projectName %></desc>
|
|
8
|
+
<inscope>true</inscope>
|
|
9
|
+
<incregexes>http://localhost:8080.*</incregexes>
|
|
10
|
+
|
|
11
|
+
<authentication>
|
|
12
|
+
<!-- type 2 = Form-based authentication -->
|
|
13
|
+
<type>2</type>
|
|
14
|
+
<strategy>
|
|
15
|
+
<!-- Login URL: replace with your application's login endpoint -->
|
|
16
|
+
<loginUrl>http://localhost:8080/login</loginUrl>
|
|
17
|
+
<!-- Login request POST body: replace field names to match your form -->
|
|
18
|
+
<loginRequestData>username={%username%}&password={%password%}</loginRequestData>
|
|
19
|
+
<!-- Regex that matches on the response when authentication FAILS -->
|
|
20
|
+
<loggedOutIndicatorPattern>(?i)sign.?in|log.?in|authentication.?required|unauthorized</loggedOutIndicatorPattern>
|
|
21
|
+
<!-- Regex that matches on the response when authentication SUCCEEDS -->
|
|
22
|
+
<loggedInIndicatorPattern>(?i)dashboard|welcome|logout|sign.?out</loggedInIndicatorPattern>
|
|
23
|
+
</strategy>
|
|
24
|
+
</authentication>
|
|
25
|
+
|
|
26
|
+
<sessionManagement>
|
|
27
|
+
<!-- type 0 = Cookie-based session management (most web apps) -->
|
|
28
|
+
<type>0</type>
|
|
29
|
+
</sessionManagement>
|
|
30
|
+
|
|
31
|
+
<users>
|
|
32
|
+
<user>
|
|
33
|
+
<id>1</id>
|
|
34
|
+
<name>zap-test-user</name>
|
|
35
|
+
<!-- Credentials: replace with a non-privileged test account -->
|
|
36
|
+
<credentials>
|
|
37
|
+
<username>zap_test_user</username>
|
|
38
|
+
<password>REPLACE_WITH_TEST_PASSWORD</password>
|
|
39
|
+
</credentials>
|
|
40
|
+
<enabled>true</enabled>
|
|
41
|
+
</user>
|
|
42
|
+
</users>
|
|
43
|
+
|
|
44
|
+
<forcedUser>1</forcedUser>
|
|
45
|
+
|
|
46
|
+
<technology>
|
|
47
|
+
<!-- Include/exclude technologies as relevant to your stack -->
|
|
48
|
+
<include>Db.MySQL</include>
|
|
49
|
+
<include>Db.PostgreSQL</include>
|
|
50
|
+
<include>Language.Java</include>
|
|
51
|
+
<include>Language.JavaScript</include>
|
|
52
|
+
<include>Language.Python</include>
|
|
53
|
+
<include>OS.Linux</include>
|
|
54
|
+
<include>WS.Apache</include>
|
|
55
|
+
<include>WS.Nginx</include>
|
|
56
|
+
<include>WS.Tomcat</include>
|
|
57
|
+
</technology>
|
|
58
|
+
</Context>
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# ZAP passive/active scan rule overrides — <%= projectName %>
|
|
2
|
+
# Generated by arbiter (#898). Commit to version control.
|
|
3
|
+
# Format: id<TAB>action<TAB>threshold<TAB>description
|
|
4
|
+
# action: IGNORE | WARN | FAIL
|
|
5
|
+
# threshold: LOW | MEDIUM | HIGH (applies when action=WARN or FAIL)
|
|
6
|
+
# id action threshold description
|
|
7
|
+
# Reference: https://www.zaproxy.org/docs/desktop/addons/alert-filters/
|
|
8
|
+
10010 WARN LOW Secure pages include mixed content
|
|
9
|
+
10011 WARN LOW Cookie Without Secure Flag
|
|
10
|
+
10015 WARN LOW Incomplete or No Cache-control Header Set
|
|
11
|
+
10016 WARN LOW Web Browser XSS Protection Not Enabled
|
|
12
|
+
10017 WARN LOW Cross-Domain JavaScript Source File Inclusion
|
|
13
|
+
10019 WARN LOW Content-Type Header Missing
|
|
14
|
+
10020 WARN MEDIUM X-Frame-Options Header Not Set
|
|
15
|
+
10021 WARN LOW X-Content-Type-Options Header Missing
|
|
16
|
+
10023 WARN LOW Information Disclosure - Debug Error Messages
|
|
17
|
+
10024 WARN LOW Information Disclosure - Sensitive Information in URL
|
|
18
|
+
10025 WARN LOW Information Disclosure - Sensitive Information in HTTP Referrer Header
|
|
19
|
+
10027 WARN LOW Information Disclosure - Suspicious Comments
|
|
20
|
+
10028 WARN MEDIUM Open Redirect
|
|
21
|
+
10029 WARN MEDIUM Cookie Poisoning
|
|
22
|
+
10030 WARN LOW User Controllable Charset
|
|
23
|
+
10031 WARN LOW User Controllable HTML Element Attribute (Potential XSS)
|
|
24
|
+
10032 WARN MEDIUM Viewstate
|
|
25
|
+
10036 WARN HIGH HTTP Server Response Header
|
|
26
|
+
10037 WARN LOW Server Leaks Information via "X-Powered-By" HTTP Response Header
|
|
27
|
+
10038 WARN MEDIUM Content Security Policy (CSP) Header Not Set
|
|
28
|
+
10040 WARN MEDIUM Secure Pages Include Mixed Content (Including Scripts)
|
|
29
|
+
10041 WARN MEDIUM HTTP to HTTPS Insecure Transition in Form Post
|
|
30
|
+
10042 WARN MEDIUM HTTPS to HTTP Insecure Transition in Form Post
|
|
31
|
+
10043 WARN LOW User Controllable JavaScript Event (XSS)
|
|
32
|
+
10044 WARN LOW Big Redirect Detected (Potential Sensitive Information Leak)
|
|
33
|
+
10045 WARN MEDIUM Source Code Disclosure - /WEB-INF folder
|
|
34
|
+
10049 WARN HIGH Caching Suppressed Content
|
|
35
|
+
10050 WARN MEDIUM Retrieved from Cache
|
|
36
|
+
10052 WARN MEDIUM X-ChromeLogger-Data (XCOLD) Header Information Leak
|
|
37
|
+
10054 WARN MEDIUM Cookie without SameSite Attribute
|
|
38
|
+
10055 WARN LOW CSP
|
|
39
|
+
10056 WARN MEDIUM X-Debug-Token Information Leak
|
|
40
|
+
10057 WARN HIGH Username Hash Found
|
|
41
|
+
10058 WARN MEDIUM GET for POST
|
|
42
|
+
10061 WARN MEDIUM X-AspNet-Version Response Header
|
|
43
|
+
10062 WARN MEDIUM PII Disclosure
|
|
44
|
+
10063 WARN HIGH Permissions Policy Header Not Set
|
|
45
|
+
10096 WARN MEDIUM Timestamp Disclosure
|
|
46
|
+
10097 WARN MEDIUM Hash Disclosure
|
|
47
|
+
10098 WARN MEDIUM Cross-Domain Misconfiguration
|
|
48
|
+
10099 WARN LOW Source Code Disclosure
|
|
49
|
+
10108 WARN MEDIUM Reverse Tabnabbing
|
|
50
|
+
10109 WARN LOW Modern Web Application
|
|
51
|
+
10110 WARN LOW Dangerous JS Functions
|
|
52
|
+
10202 FAIL HIGH Absence of Anti-CSRF Tokens
|
|
53
|
+
10208 WARN MEDIUM Private IP Disclosure
|
|
54
|
+
10243 WARN MEDIUM Transition Redirect
|
|
55
|
+
10244 FAIL HIGH Server Leaks Sensitive Information via HTTP Headers
|
|
56
|
+
10246 WARN MEDIUM Authentication Credentials Captured
|
|
57
|
+
10247 WARN MEDIUM HTTPS Content Available via HTTP
|
|
58
|
+
10311 WARN MEDIUM Monitoring Service Found
|
|
59
|
+
40003 FAIL HIGH CRLF Injection
|
|
60
|
+
40008 FAIL HIGH Parameter Tampering
|
|
61
|
+
40009 FAIL HIGH Server Side Include
|
|
62
|
+
40012 FAIL HIGH Cross Site Scripting (Reflected)
|
|
63
|
+
40013 FAIL HIGH Session Fixation
|
|
64
|
+
40014 FAIL HIGH Cross Site Scripting (Persistent)
|
|
65
|
+
40016 FAIL HIGH Cross Site Scripting (Persistent) - Prime
|
|
66
|
+
40017 FAIL HIGH Cross Site Scripting (Persistent) - Spider
|
|
67
|
+
40018 FAIL HIGH SQL Injection
|
|
68
|
+
40019 FAIL HIGH SQL Injection - MySQL
|
|
69
|
+
40020 FAIL HIGH SQL Injection - Hypersonic SQL
|
|
70
|
+
40021 FAIL HIGH SQL Injection - Oracle
|
|
71
|
+
40022 FAIL HIGH SQL Injection - PostgreSQL
|
|
72
|
+
40023 FAIL HIGH Possible Username Enumeration
|
|
73
|
+
40024 FAIL HIGH SQL Injection - SQLite
|
|
74
|
+
40025 FAIL HIGH Proxy Disclosure
|
|
75
|
+
40026 FAIL HIGH Cross Site Scripting (DOM Based)
|
|
76
|
+
40027 FAIL HIGH SQL Injection - MsSQL
|
|
77
|
+
40028 FAIL HIGH CSRF
|
|
78
|
+
40029 FAIL HIGH Trace.axd Information Leak
|
|
79
|
+
40032 FAIL HIGH .htaccess Information Leak
|
|
80
|
+
40034 FAIL HIGH .env Information Leak
|
|
81
|
+
40035 FAIL HIGH Hidden File Finder
|
|
82
|
+
40036 FAIL HIGH HTML Injection
|
|
83
|
+
40038 FAIL HIGH ReDoS (Regular Expression Denial of Service)
|
|
84
|
+
40039 FAIL HIGH Unprotected API
|
|
85
|
+
40042 FAIL HIGH Spring Actuator Information Leak
|
|
86
|
+
40043 FAIL HIGH Log4Shell
|
|
87
|
+
40044 FAIL HIGH Spring4Shell
|
|
88
|
+
40045 FAIL HIGH Server Side Template Injection
|
|
89
|
+
90001 WARN MEDIUM Insecure JSF ViewState
|
|
90
|
+
90002 WARN MEDIUM Java Serialization Object
|
|
91
|
+
90003 WARN MEDIUM Sub Resource Integrity Attribute Missing
|
|
92
|
+
90004 WARN MEDIUM Insufficient Site Isolation Against Spectre Vulnerability
|
|
93
|
+
90011 WARN MEDIUM Charset Mismatch
|
|
94
|
+
90017 WARN MEDIUM XSLT Injection
|
|
95
|
+
90019 WARN MEDIUM Server Side Code Injection
|
|
96
|
+
90020 WARN MEDIUM Remote OS Command Injection
|
|
97
|
+
90021 WARN MEDIUM XPath Injection
|
|
98
|
+
90022 WARN MEDIUM Application Error Disclosure
|
|
99
|
+
90033 WARN MEDIUM Loosely Scoped Cookie
|
|
100
|
+
90034 WARN MEDIUM Cloud Metadata Potentially Exposed
|