@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,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"info": {
|
|
3
|
+
"name": <%- JSON.stringify(`${projectName || 'service'} live API e2e (INV-126)`) %>,
|
|
4
|
+
"description": "Non-mocked Newman/Postman suite — runs against the REAL booted binary. Boot it via tests/api/run.sh; set baseUrl to the running address.",
|
|
5
|
+
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
|
|
6
|
+
},
|
|
7
|
+
"item": [
|
|
8
|
+
{
|
|
9
|
+
"name": "GET /health (live binary)",
|
|
10
|
+
"request": {
|
|
11
|
+
"method": "GET",
|
|
12
|
+
"url": { "raw": "{{baseUrl}}/health", "host": ["{{baseUrl}}"], "path": ["health"] }
|
|
13
|
+
},
|
|
14
|
+
"event": [
|
|
15
|
+
{
|
|
16
|
+
"listen": "test",
|
|
17
|
+
"script": {
|
|
18
|
+
"type": "text/javascript",
|
|
19
|
+
"exec": [
|
|
20
|
+
"pm.test('health returns 200 from the running binary', function () {",
|
|
21
|
+
" pm.response.to.have.status(200);",
|
|
22
|
+
"});"
|
|
23
|
+
]
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
}
|
|
28
|
+
],
|
|
29
|
+
"variable": [{ "key": "baseUrl", "value": "http://127.0.0.1:8080" }]
|
|
30
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Live-API e2e (INV-126): runs against the REAL booted server, no mocks.
|
|
3
|
+
# API_BASE_URL points at the running binary (tests/api/run.sh boots it).
|
|
4
|
+
import os
|
|
5
|
+
|
|
6
|
+
import httpx
|
|
7
|
+
|
|
8
|
+
BASE_URL = os.environ.get("API_BASE_URL", "http://127.0.0.1:8080")
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def test_health_returns_200_from_running_binary() -> None:
|
|
12
|
+
resp = httpx.get(f"{BASE_URL}/health", timeout=5.0)
|
|
13
|
+
assert resp.status_code == 200
|
|
14
|
+
|
|
15
|
+
# Add real request/response assertions exercising the live HTTP surface here —
|
|
16
|
+
# this layer catches "domain green, HTTP wiring broken" bugs (e.g. a field in
|
|
17
|
+
# the domain/DB never wired into the request input model).
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
# Live-API e2e runner (INV-126): builds + boots the REAL binary, runs the non-mocked
|
|
4
|
+
# suite against it over real HTTP, then tears down. No mocks, no stubs.
|
|
5
|
+
#
|
|
6
|
+
# Contract:
|
|
7
|
+
# - Use a throwaway DB + harness auth-bypass (NEVER production credentials).
|
|
8
|
+
# - Wait for readiness before running the suite.
|
|
9
|
+
# - Always tear the server down (trap), even on failure.
|
|
10
|
+
set -euo pipefail
|
|
11
|
+
|
|
12
|
+
API_BASE_URL="${API_BASE_URL:-http://127.0.0.1:8080}"
|
|
13
|
+
HEALTH_URL="${HEALTH_URL:-${API_BASE_URL}/health}"
|
|
14
|
+
SERVER_PID=""
|
|
15
|
+
|
|
16
|
+
cleanup() {
|
|
17
|
+
if [[ -n "${SERVER_PID}" ]] && kill -0 "${SERVER_PID}" 2>/dev/null; then
|
|
18
|
+
kill "${SERVER_PID}" 2>/dev/null || true
|
|
19
|
+
wait "${SERVER_PID}" 2>/dev/null || true
|
|
20
|
+
fi
|
|
21
|
+
}
|
|
22
|
+
trap cleanup EXIT
|
|
23
|
+
|
|
24
|
+
echo "[api-e2e] building + booting the real binary..."
|
|
25
|
+
<% if (language === 'go') { -%>
|
|
26
|
+
go build -o /tmp/api-e2e-bin ./... && /tmp/api-e2e-bin &
|
|
27
|
+
<% } else if (language === 'java' || language === 'kotlin') { -%>
|
|
28
|
+
# Adjust the boot command to your build tool (gradle bootRun / java -jar build/libs/*.jar).
|
|
29
|
+
./gradlew bootRun &
|
|
30
|
+
<% } else if (language === 'python') { -%>
|
|
31
|
+
# Adjust module:app to your ASGI/WSGI entrypoint.
|
|
32
|
+
python -m uvicorn app.main:app --host 127.0.0.1 --port 8080 &
|
|
33
|
+
<% } else { -%>
|
|
34
|
+
# Adjust to your start command (e.g. node dist/server.js).
|
|
35
|
+
npm run start &
|
|
36
|
+
<% } -%>
|
|
37
|
+
SERVER_PID=$!
|
|
38
|
+
|
|
39
|
+
echo "[api-e2e] waiting for readiness at ${HEALTH_URL} ..."
|
|
40
|
+
for _ in $(seq 1 60); do
|
|
41
|
+
if curl -fsS "${HEALTH_URL}" >/dev/null 2>&1; then
|
|
42
|
+
echo "[api-e2e] server is ready"
|
|
43
|
+
break
|
|
44
|
+
fi
|
|
45
|
+
sleep 1
|
|
46
|
+
done
|
|
47
|
+
|
|
48
|
+
echo "[api-e2e] running the live suite..."
|
|
49
|
+
<% if (language === 'go') { -%>
|
|
50
|
+
# `apie2e` build tag (#1840 F4 tranche-3) keeps this suite out of the default
|
|
51
|
+
# `go test ./...` — required here to actually compile+run it.
|
|
52
|
+
API_BASE_URL="${API_BASE_URL}" go test -tags apie2e ./tests/api/...
|
|
53
|
+
<% } else if (language === 'java' || language === 'kotlin') { -%>
|
|
54
|
+
API_BASE_URL="${API_BASE_URL}" ./gradlew test --tests '*ApiE2ETest'
|
|
55
|
+
<% } else if (language === 'python') { -%>
|
|
56
|
+
API_BASE_URL="${API_BASE_URL}" python -m pytest tests/api/
|
|
57
|
+
<% } else { -%>
|
|
58
|
+
# Default: vitest supertest suite. For a Postman collection use:
|
|
59
|
+
# newman run tests/api/postman.collection.json --env-var baseUrl="${API_BASE_URL}"
|
|
60
|
+
API_BASE_URL="${API_BASE_URL}" npx vitest run tests/api/
|
|
61
|
+
<% } -%>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Live-API e2e (INV-126): runs against the REAL booted server, no mocks.
|
|
3
|
+
// Set API_BASE_URL to the booted binary's address (tests/api/run.sh does this).
|
|
4
|
+
import { describe, it, expect } from 'vitest'
|
|
5
|
+
import request from 'supertest'
|
|
6
|
+
|
|
7
|
+
const BASE_URL = process.env.API_BASE_URL ?? 'http://127.0.0.1:8080'
|
|
8
|
+
|
|
9
|
+
describe('live API e2e (non-mocked)', () => {
|
|
10
|
+
it('GET /health returns 200 from the running binary', async () => {
|
|
11
|
+
const res = await request(BASE_URL).get('/health')
|
|
12
|
+
expect(res.status).toBe(200)
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
// Add real request/response assertions that exercise the live HTTP surface.
|
|
16
|
+
// This is the layer that catches "domain green, HTTP wiring broken" bugs:
|
|
17
|
+
// e.g. a field present in the domain/DB but never wired into the input struct.
|
|
18
|
+
})
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
package <%= basePackage ? basePackage + '.architecture' : 'architecture' %>;
|
|
2
|
+
|
|
3
|
+
import com.tngtech.archunit.core.importer.ImportOption;
|
|
4
|
+
import com.tngtech.archunit.junit.AnalyzeClasses;
|
|
5
|
+
import com.tngtech.archunit.junit.ArchTest;
|
|
6
|
+
import com.tngtech.archunit.lang.ArchRule;
|
|
7
|
+
import com.tngtech.archunit.library.dependencies.SlicesRuleDefinition;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Anti-cyclic dependency enforcement — generated by arbiter (M22, hexagonal).
|
|
11
|
+
*
|
|
12
|
+
* No package slice may participate in a cyclic dependency with another slice.
|
|
13
|
+
* Cycles prevent modular decomposition and make incremental builds unreliable.
|
|
14
|
+
*
|
|
15
|
+
* Generated by arbiter. Edit the template to change enforcement.
|
|
16
|
+
*/
|
|
17
|
+
@AnalyzeClasses(
|
|
18
|
+
packages = "<%= basePackage ? basePackage : '' %>",
|
|
19
|
+
importOptions = ImportOption.DoNotIncludeTests.class
|
|
20
|
+
)
|
|
21
|
+
public class AntiCyclicTest {
|
|
22
|
+
|
|
23
|
+
@ArchTest
|
|
24
|
+
public static final ArchRule no_cycles_between_slices =
|
|
25
|
+
SlicesRuleDefinition.slices()
|
|
26
|
+
.matching("<%= basePackage ? basePackage + '.(*)..': '(*)...' %>")
|
|
27
|
+
.should().beFreeOfCycles()
|
|
28
|
+
.because("Cyclic dependencies between packages break modular architecture and complicate testing.");
|
|
29
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
package <%= basePackage ? basePackage + '.architecture' : 'architecture' %>;
|
|
2
|
+
|
|
3
|
+
import java.lang.annotation.ElementType;
|
|
4
|
+
import java.lang.annotation.Retention;
|
|
5
|
+
import java.lang.annotation.RetentionPolicy;
|
|
6
|
+
import java.lang.annotation.Target;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Exempts a @Test method from the anti-proforma gate (AntiProformaTest, INV-118).
|
|
10
|
+
*
|
|
11
|
+
* Use when the test intentionally has no assertion (e.g., tests that only verify
|
|
12
|
+
* that code does not throw, rely on framework assertions via @Test(expected=...),
|
|
13
|
+
* or are placeholder tests pending implementation).
|
|
14
|
+
*
|
|
15
|
+
* Requires CLASS retention (not SOURCE) so ArchUnit can detect via bytecode.
|
|
16
|
+
*
|
|
17
|
+
* Example:
|
|
18
|
+
* @Test
|
|
19
|
+
* @AntiProformaExempt("verifies no exception thrown — contract defined externally")
|
|
20
|
+
* void no_exception_on_valid_input() {
|
|
21
|
+
* service.process(VALID_PAYLOAD);
|
|
22
|
+
* }
|
|
23
|
+
*
|
|
24
|
+
* Generated by arbiter (#1249). Edit the template to change enforcement.
|
|
25
|
+
*/
|
|
26
|
+
@Retention(RetentionPolicy.CLASS)
|
|
27
|
+
@Target(ElementType.METHOD)
|
|
28
|
+
public @interface AntiProformaExempt {
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Rationale for exempting this test from the anti-proforma gate.
|
|
32
|
+
* Must be a non-empty descriptive string.
|
|
33
|
+
*/
|
|
34
|
+
String value();
|
|
35
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
package <%= basePackage ? basePackage + '.architecture' : 'architecture' %>;
|
|
2
|
+
|
|
3
|
+
import com.tngtech.archunit.core.domain.JavaClass;
|
|
4
|
+
import com.tngtech.archunit.core.domain.JavaMethod;
|
|
5
|
+
import com.tngtech.archunit.core.importer.ClassFileImporter;
|
|
6
|
+
import com.tngtech.archunit.core.importer.ImportOption;
|
|
7
|
+
import com.tngtech.archunit.junit.AnalyzeClasses;
|
|
8
|
+
import com.tngtech.archunit.junit.ArchTest;
|
|
9
|
+
import com.tngtech.archunit.lang.ArchCondition;
|
|
10
|
+
import com.tngtech.archunit.lang.ArchRule;
|
|
11
|
+
import com.tngtech.archunit.lang.ConditionEvents;
|
|
12
|
+
import com.tngtech.archunit.lang.SimpleConditionEvent;
|
|
13
|
+
|
|
14
|
+
import org.assertj.core.api.Assertions;
|
|
15
|
+
import org.junit.jupiter.api.Test;
|
|
16
|
+
|
|
17
|
+
import java.util.Set;
|
|
18
|
+
|
|
19
|
+
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.methods;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Anti-proforma test gate — enforces that every @Test method contains at least
|
|
23
|
+
* one real assertion (INV-118, §R-41).
|
|
24
|
+
*
|
|
25
|
+
* Detects proforma tests: test methods that do not call any recognized assertion
|
|
26
|
+
* class (AssertJ, JUnit5 Assertions, Mockito verify, REST Assured, MockMvc).
|
|
27
|
+
*
|
|
28
|
+
* Bypass: annotate the method with @AntiProformaExempt("rationale"). Requires
|
|
29
|
+
* CLASS retention so ArchUnit can detect via bytecode.
|
|
30
|
+
*
|
|
31
|
+
* Generated by arbiter (#1249). Edit the template to change enforcement.
|
|
32
|
+
*/
|
|
33
|
+
@AnalyzeClasses(
|
|
34
|
+
packages = "<%= basePackage ? basePackage : '' %>",
|
|
35
|
+
importOptions = ImportOption.OnlyIncludeTests.class
|
|
36
|
+
)
|
|
37
|
+
public class AntiProformaTest {
|
|
38
|
+
|
|
39
|
+
/** Recognized assertion class name fragments (bytecode-level). */
|
|
40
|
+
private static final Set<String> ASSERTION_CLASS_FRAGMENTS = Set.of(
|
|
41
|
+
"org.assertj.core.api",
|
|
42
|
+
"org.junit.jupiter.api.Assertions",
|
|
43
|
+
"org.mockito.Mockito",
|
|
44
|
+
"io.restassured",
|
|
45
|
+
"org.springframework.test.web.servlet.result"
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
private static final ArchCondition<JavaMethod> HAVE_REAL_ASSERTION =
|
|
49
|
+
new ArchCondition<>("have at least one real assertion or be exempt") {
|
|
50
|
+
|
|
51
|
+
@Override
|
|
52
|
+
public void check(JavaMethod method, ConditionEvents events) {
|
|
53
|
+
// Skip if annotated with @AntiProformaExempt
|
|
54
|
+
if (method.isAnnotatedWith(AntiProformaExempt.class)) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
boolean hasAssertion = method.getMethodCallsFromSelf().stream()
|
|
59
|
+
.anyMatch(call -> ASSERTION_CLASS_FRAGMENTS.stream()
|
|
60
|
+
.anyMatch(fragment -> call.getTargetOwner().getFullName().startsWith(fragment)));
|
|
61
|
+
|
|
62
|
+
if (!hasAssertion) {
|
|
63
|
+
// One-hop transitive check: look for helper method calls in same class
|
|
64
|
+
boolean hasTransitiveAssertion = method.getMethodCallsFromSelf().stream()
|
|
65
|
+
.filter(call -> call.getTargetOwner().equals(method.getOwner()))
|
|
66
|
+
.flatMap(call -> {
|
|
67
|
+
try {
|
|
68
|
+
return call.getTargetOwner().getMethods().stream()
|
|
69
|
+
.filter(m -> m.getName().equals(call.getName()))
|
|
70
|
+
.flatMap(m -> m.getMethodCallsFromSelf().stream());
|
|
71
|
+
} catch (Exception e) {
|
|
72
|
+
return java.util.stream.Stream.empty();
|
|
73
|
+
}
|
|
74
|
+
})
|
|
75
|
+
.anyMatch(call -> ASSERTION_CLASS_FRAGMENTS.stream()
|
|
76
|
+
.anyMatch(fragment -> call.getTargetOwner().getFullName().startsWith(fragment)));
|
|
77
|
+
|
|
78
|
+
if (!hasTransitiveAssertion) {
|
|
79
|
+
events.add(SimpleConditionEvent.violated(
|
|
80
|
+
method,
|
|
81
|
+
String.format(
|
|
82
|
+
"Method %s in %s has no recognized assertion. " +
|
|
83
|
+
"Add an assertion or annotate with @AntiProformaExempt(\"rationale\").",
|
|
84
|
+
method.getName(),
|
|
85
|
+
method.getOwner().getFullName()
|
|
86
|
+
)
|
|
87
|
+
));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
@ArchTest
|
|
94
|
+
public static final ArchRule test_methods_must_have_assertions =
|
|
95
|
+
methods()
|
|
96
|
+
.that().areAnnotatedWith(Test.class)
|
|
97
|
+
.or().areAnnotatedWith("org.junit.jupiter.params.ParameterizedTest")
|
|
98
|
+
.or().areAnnotatedWith("org.junit.jupiter.api.RepeatedTest")
|
|
99
|
+
.should(HAVE_REAL_ASSERTION)
|
|
100
|
+
.because(
|
|
101
|
+
"Proforma tests (tests without assertions) provide false confidence — " +
|
|
102
|
+
"they always pass regardless of what the code under test does (INV-118, §R-41)."
|
|
103
|
+
);
|
|
104
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
package <%= basePackage ? basePackage + '.architecture' : 'architecture' %>;
|
|
2
|
+
|
|
3
|
+
import com.tngtech.archunit.core.importer.ImportOption;
|
|
4
|
+
import com.tngtech.archunit.junit.AnalyzeClasses;
|
|
5
|
+
import com.tngtech.archunit.junit.ArchTest;
|
|
6
|
+
import com.tngtech.archunit.lang.ArchRule;
|
|
7
|
+
|
|
8
|
+
import org.junit.jupiter.api.Test;
|
|
9
|
+
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Architecture style enforcement — generated by arbiter for architectureStyle: <%= architectureStyle %>.
|
|
13
|
+
*
|
|
14
|
+
* Do not edit — update the arbiter template or re-run `arbiter init` to change enforcement.
|
|
15
|
+
* See docs/ADR/021-archetype-axis.md for the policy behind architecture-style gating.
|
|
16
|
+
*/
|
|
17
|
+
@AnalyzeClasses(
|
|
18
|
+
packages = "<%= basePackage ? basePackage : '' %>",
|
|
19
|
+
importOptions = ImportOption.DoNotIncludeTests.class
|
|
20
|
+
)
|
|
21
|
+
public class ArchitectureTest {
|
|
22
|
+
|
|
23
|
+
<% if (architectureStyle === 'hexagonal') { %>
|
|
24
|
+
/**
|
|
25
|
+
* Hexagonal (ports-and-adapters) rules.
|
|
26
|
+
* Domain layer must not depend on infrastructure or adapter packages.
|
|
27
|
+
*/
|
|
28
|
+
@ArchTest
|
|
29
|
+
public static final ArchRule domain_must_not_depend_on_infrastructure =
|
|
30
|
+
noClasses()
|
|
31
|
+
.that().resideInAPackage("<%= basePackage ? basePackage + '.domain..' : 'domain..' %>")
|
|
32
|
+
.should().dependOnClassesThat()
|
|
33
|
+
.resideInAnyPackage(
|
|
34
|
+
"<%= basePackage ? basePackage + '.infrastructure..' : 'infrastructure..' %>",
|
|
35
|
+
"<%= basePackage ? basePackage + '.adapter..' : 'adapter..' %>"
|
|
36
|
+
)
|
|
37
|
+
.because("Domain layer must not depend on infrastructure or adapters (hexagonal architecture).");
|
|
38
|
+
|
|
39
|
+
@ArchTest
|
|
40
|
+
public static final ArchRule adapters_must_not_depend_on_each_other =
|
|
41
|
+
noClasses()
|
|
42
|
+
.that().resideInAPackage("<%= basePackage ? basePackage + '.adapter..' : 'adapter..' %>")
|
|
43
|
+
.should().dependOnClassesThat()
|
|
44
|
+
.resideInAPackage("<%= basePackage ? basePackage + '.adapter..' : 'adapter..' %>")
|
|
45
|
+
.because("Adapters must be independent — they communicate only through domain ports.");
|
|
46
|
+
<% } else if (architectureStyle === 'layered') { %>
|
|
47
|
+
/**
|
|
48
|
+
* Layered architecture rules.
|
|
49
|
+
* Direction: controller → service → repository. No upward dependencies allowed.
|
|
50
|
+
*/
|
|
51
|
+
@ArchTest
|
|
52
|
+
public static final ArchRule repositories_must_not_depend_on_services =
|
|
53
|
+
noClasses()
|
|
54
|
+
.that().resideInAPackage("<%= basePackage ? basePackage + '.repository..' : 'repository..' %>")
|
|
55
|
+
.should().dependOnClassesThat()
|
|
56
|
+
.resideInAPackage("<%= basePackage ? basePackage + '.service..' : 'service..' %>")
|
|
57
|
+
.because("Repository layer must not depend on service layer (layered architecture).");
|
|
58
|
+
|
|
59
|
+
@ArchTest
|
|
60
|
+
public static final ArchRule services_must_not_depend_on_controllers =
|
|
61
|
+
noClasses()
|
|
62
|
+
.that().resideInAPackage("<%= basePackage ? basePackage + '.service..' : 'service..' %>")
|
|
63
|
+
.should().dependOnClassesThat()
|
|
64
|
+
.resideInAPackage("<%= basePackage ? basePackage + '.controller..' : 'controller..' %>")
|
|
65
|
+
.because("Service layer must not depend on controller layer (layered architecture).");
|
|
66
|
+
<% } else if (architectureStyle === 'modular-monolith') { %>
|
|
67
|
+
/**
|
|
68
|
+
* Modular-monolith rules.
|
|
69
|
+
* Modules must communicate only through their public API packages.
|
|
70
|
+
* Cross-module imports of internal packages are forbidden.
|
|
71
|
+
*/
|
|
72
|
+
@ArchTest
|
|
73
|
+
public static final ArchRule no_cross_module_internal_access =
|
|
74
|
+
noClasses()
|
|
75
|
+
.that().resideOutsideOfPackage("<%= basePackage ? basePackage + '.modules.[^.]+.internal..' : 'modules.[^.]+.internal..' %>")
|
|
76
|
+
.should().accessClassesThat()
|
|
77
|
+
.resideInAPackage("<%= basePackage ? basePackage + '.modules.[^.]+.internal..' : 'modules.[^.]+.internal..' %>")
|
|
78
|
+
.because("Module internal packages are private — access only through the module's public API package.");
|
|
79
|
+
<% } else { %>
|
|
80
|
+
@Test
|
|
81
|
+
public void architecture_style_unknown() {
|
|
82
|
+
org.junit.jupiter.api.Assertions.fail(
|
|
83
|
+
"Unknown architectureStyle '<%= architectureStyle %>'. Re-run `arbiter init` and select: hexagonal, layered, or modular-monolith."
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
<% } %>
|
|
87
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
package <%= basePackage ? basePackage + '.architecture' : 'architecture' %>;
|
|
2
|
+
|
|
3
|
+
import com.tngtech.archunit.core.importer.ImportOption;
|
|
4
|
+
import com.tngtech.archunit.junit.AnalyzeClasses;
|
|
5
|
+
import com.tngtech.archunit.junit.ArchTest;
|
|
6
|
+
import com.tngtech.archunit.lang.ArchRule;
|
|
7
|
+
|
|
8
|
+
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Dependency flow enforcement — generated by arbiter (M22, hexagonal).
|
|
12
|
+
*
|
|
13
|
+
* Enforces the inward dependency rule: adapters → application → domain.
|
|
14
|
+
* No layer may depend on a layer further out in the ring.
|
|
15
|
+
*
|
|
16
|
+
* Generated by arbiter. Edit the template to change enforcement.
|
|
17
|
+
*/
|
|
18
|
+
@AnalyzeClasses(
|
|
19
|
+
packages = "<%= basePackage ? basePackage : '' %>",
|
|
20
|
+
importOptions = ImportOption.DoNotIncludeTests.class
|
|
21
|
+
)
|
|
22
|
+
public class DependencyFlowTest {
|
|
23
|
+
|
|
24
|
+
@ArchTest
|
|
25
|
+
public static final ArchRule adapters_must_not_depend_on_domain_directly =
|
|
26
|
+
noClasses()
|
|
27
|
+
.that().resideInAPackage("<%= basePackage ? basePackage + '.adapter..' : 'adapter..' %>")
|
|
28
|
+
.should().dependOnClassesThat()
|
|
29
|
+
.resideInAPackage("<%= basePackage ? basePackage + '.domain..' : 'domain..' %>")
|
|
30
|
+
.because("Adapters must communicate with the domain only through application ports, not directly.");
|
|
31
|
+
|
|
32
|
+
@ArchTest
|
|
33
|
+
public static final ArchRule application_must_not_depend_on_adapters =
|
|
34
|
+
noClasses()
|
|
35
|
+
.that().resideInAPackage("<%= basePackage ? basePackage + '.application..' : 'application..' %>")
|
|
36
|
+
.should().dependOnClassesThat()
|
|
37
|
+
.resideInAPackage("<%= basePackage ? basePackage + '.adapter..' : 'adapter..' %>")
|
|
38
|
+
.because("Application layer must not depend on adapters (dependency inversion principle).");
|
|
39
|
+
|
|
40
|
+
@ArchTest
|
|
41
|
+
public static final ArchRule domain_must_not_depend_on_application =
|
|
42
|
+
noClasses()
|
|
43
|
+
.that().resideInAPackage("<%= basePackage ? basePackage + '.domain..' : 'domain..' %>")
|
|
44
|
+
.should().dependOnClassesThat()
|
|
45
|
+
.resideInAPackage("<%= basePackage ? basePackage + '.application..' : 'application..' %>")
|
|
46
|
+
.because("Domain layer must be self-contained: no dependency on application layer.");
|
|
47
|
+
|
|
48
|
+
@ArchTest
|
|
49
|
+
public static final ArchRule domain_must_not_depend_on_infrastructure =
|
|
50
|
+
noClasses()
|
|
51
|
+
.that().resideInAPackage("<%= basePackage ? basePackage + '.domain..' : 'domain..' %>")
|
|
52
|
+
.should().dependOnClassesThat()
|
|
53
|
+
.resideInAPackage("<%= basePackage ? basePackage + '.infrastructure..' : 'infrastructure..' %>")
|
|
54
|
+
.because("Domain layer must not depend on infrastructure: keep domain portable.");
|
|
55
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
package <%= basePackage ? basePackage + '.architecture' : 'architecture' %>;
|
|
2
|
+
|
|
3
|
+
import com.tngtech.archunit.core.importer.ImportOption;
|
|
4
|
+
import com.tngtech.archunit.junit.AnalyzeClasses;
|
|
5
|
+
import com.tngtech.archunit.junit.ArchTest;
|
|
6
|
+
import com.tngtech.archunit.lang.ArchRule;
|
|
7
|
+
|
|
8
|
+
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Domain purity enforcement — generated by arbiter (M22, hexagonal).
|
|
12
|
+
*
|
|
13
|
+
* The domain layer must be framework-free: no Spring, Jakarta EE, JPA, or Hibernate
|
|
14
|
+
* imports allowed. Domain objects are plain Java — no annotations, no coupling to
|
|
15
|
+
* persistence or web frameworks.
|
|
16
|
+
*
|
|
17
|
+
* Generated by arbiter. Edit the template to change enforcement.
|
|
18
|
+
*/
|
|
19
|
+
@AnalyzeClasses(
|
|
20
|
+
packages = "<%= basePackage ? basePackage : '' %>",
|
|
21
|
+
importOptions = ImportOption.DoNotIncludeTests.class
|
|
22
|
+
)
|
|
23
|
+
public class DomainPurityTest {
|
|
24
|
+
|
|
25
|
+
@ArchTest
|
|
26
|
+
public static final ArchRule domain_must_not_import_spring =
|
|
27
|
+
noClasses()
|
|
28
|
+
.that().resideInAPackage("<%= basePackage ? basePackage + '.domain..' : 'domain..' %>")
|
|
29
|
+
.should().dependOnClassesThat()
|
|
30
|
+
.resideInAnyPackage(
|
|
31
|
+
"org.springframework..",
|
|
32
|
+
"org.springframework.data.."
|
|
33
|
+
)
|
|
34
|
+
.because("Domain layer must be framework-free: no Spring imports allowed.");
|
|
35
|
+
|
|
36
|
+
@ArchTest
|
|
37
|
+
public static final ArchRule domain_must_not_import_jpa =
|
|
38
|
+
noClasses()
|
|
39
|
+
.that().resideInAPackage("<%= basePackage ? basePackage + '.domain..' : 'domain..' %>")
|
|
40
|
+
.should().dependOnClassesThat()
|
|
41
|
+
.resideInAnyPackage(
|
|
42
|
+
"jakarta.persistence..",
|
|
43
|
+
"javax.persistence..",
|
|
44
|
+
"org.hibernate.."
|
|
45
|
+
)
|
|
46
|
+
.because("Domain layer must be framework-free: no JPA/Hibernate imports allowed.");
|
|
47
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
package <%= basePackage ? basePackage + '.architecture' : 'architecture' %>;
|
|
2
|
+
|
|
3
|
+
import com.tngtech.archunit.core.importer.ImportOption;
|
|
4
|
+
import com.tngtech.archunit.junit.AnalyzeClasses;
|
|
5
|
+
import com.tngtech.archunit.junit.ArchTest;
|
|
6
|
+
import com.tngtech.archunit.lang.ArchRule;
|
|
7
|
+
|
|
8
|
+
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Naming conventions enforcement — generated by arbiter (M22, hexagonal).
|
|
12
|
+
*
|
|
13
|
+
* Enforces standard naming suffixes for the four core hexagonal stereotypes:
|
|
14
|
+
* Services, Repositories, Controllers, and Ports.
|
|
15
|
+
*
|
|
16
|
+
* Generated by arbiter. Edit the template to change enforcement.
|
|
17
|
+
*/
|
|
18
|
+
@AnalyzeClasses(
|
|
19
|
+
packages = "<%= basePackage ? basePackage : '' %>",
|
|
20
|
+
importOptions = ImportOption.DoNotIncludeTests.class
|
|
21
|
+
)
|
|
22
|
+
public class NamingConventionsTest {
|
|
23
|
+
|
|
24
|
+
@ArchTest
|
|
25
|
+
public static final ArchRule services_should_end_with_service =
|
|
26
|
+
classes()
|
|
27
|
+
.that().resideInAPackage("<%= basePackage ? basePackage + '.application..' : 'application..' %>")
|
|
28
|
+
.and().areAnnotatedWith("org.springframework.stereotype.Service")
|
|
29
|
+
.should().haveSimpleNameEndingWith("Service")
|
|
30
|
+
.because("Service classes must be named consistently to aid discovery and navigation.");
|
|
31
|
+
|
|
32
|
+
@ArchTest
|
|
33
|
+
public static final ArchRule repositories_should_end_with_repository =
|
|
34
|
+
classes()
|
|
35
|
+
.that().areAssignableTo(org.springframework.data.repository.Repository.class)
|
|
36
|
+
.should().haveSimpleNameEndingWith("Repository")
|
|
37
|
+
.because("Repository classes must be named consistently to distinguish them from domain objects.");
|
|
38
|
+
|
|
39
|
+
@ArchTest
|
|
40
|
+
public static final ArchRule controllers_should_end_with_controller =
|
|
41
|
+
classes()
|
|
42
|
+
.that().resideInAPackage("<%= basePackage ? basePackage + '.adapter.in..' : 'adapter.in..' %>")
|
|
43
|
+
.and().areAnnotatedWith("org.springframework.web.bind.annotation.RestController")
|
|
44
|
+
.should().haveSimpleNameEndingWith("Controller")
|
|
45
|
+
.because("Controller classes must be named consistently to separate concerns in the adapter layer.");
|
|
46
|
+
|
|
47
|
+
@ArchTest
|
|
48
|
+
public static final ArchRule ports_should_end_with_port =
|
|
49
|
+
classes()
|
|
50
|
+
.that().resideInAPackage("<%= basePackage ? basePackage + '.application.port..' : 'application.port..' %>")
|
|
51
|
+
.and().areInterfaces()
|
|
52
|
+
.should().haveSimpleNameEndingWith("Port")
|
|
53
|
+
.because("Port interfaces define the boundary of the application; naming them *Port makes the intent explicit.");
|
|
54
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
package <%= basePackage ? basePackage + '.architecture' : 'architecture' %>;
|
|
2
|
+
|
|
3
|
+
import com.tngtech.archunit.core.importer.ImportOption;
|
|
4
|
+
import com.tngtech.archunit.junit.AnalyzeClasses;
|
|
5
|
+
import com.tngtech.archunit.junit.ArchTest;
|
|
6
|
+
import com.tngtech.archunit.lang.ArchRule;
|
|
7
|
+
|
|
8
|
+
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* H2 in-production enforcement — generated by arbiter (M22, hexagonal).
|
|
12
|
+
*
|
|
13
|
+
* H2 is an in-memory database appropriate only for tests. Production code
|
|
14
|
+
* must not import H2 classes, preventing accidental in-memory persistence.
|
|
15
|
+
*
|
|
16
|
+
* Generated by arbiter. Edit the template to change enforcement.
|
|
17
|
+
*/
|
|
18
|
+
@AnalyzeClasses(
|
|
19
|
+
packages = "<%= basePackage ? basePackage : '' %>",
|
|
20
|
+
importOptions = ImportOption.DoNotIncludeTests.class
|
|
21
|
+
)
|
|
22
|
+
public class NoH2ArchTest {
|
|
23
|
+
|
|
24
|
+
@ArchTest
|
|
25
|
+
public static final ArchRule no_h2_imports_in_production_code =
|
|
26
|
+
noClasses()
|
|
27
|
+
.should().dependOnClassesThat()
|
|
28
|
+
.resideInAPackage("org.h2..")
|
|
29
|
+
.because("H2 is a test-only in-memory database. Production code must use a real datasource (PostgreSQL, MySQL, etc.).");
|
|
30
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
package <%= basePackage ? basePackage + '.architecture' : 'architecture' %>;
|
|
2
|
+
|
|
3
|
+
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;
|
|
4
|
+
|
|
5
|
+
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
|
|
6
|
+
|
|
7
|
+
import com.tngtech.archunit.core.importer.ClassFileImporter;
|
|
8
|
+
import com.tngtech.archunit.core.importer.ImportOption;
|
|
9
|
+
import com.tngtech.archunit.junit.AnalyzeClasses;
|
|
10
|
+
import com.tngtech.archunit.junit.ArchTest;
|
|
11
|
+
import com.tngtech.archunit.lang.ArchRule;
|
|
12
|
+
import org.junit.jupiter.api.Test;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* ArchUnit enforcement of INV-29: No MockMvc — use RestAssured for integration tests.
|
|
16
|
+
*
|
|
17
|
+
* <p>MockMvc tests the controller layer through a mock servlet container, bypassing real HTTP
|
|
18
|
+
* serialization, filter chains, exception handlers, and content negotiation. Use RestAssured with a
|
|
19
|
+
* real embedded server instead.
|
|
20
|
+
*
|
|
21
|
+
* <p>Generated by arbiter. Do not edit — update the arbiter template to change enforcement.
|
|
22
|
+
*/
|
|
23
|
+
<%_
|
|
24
|
+
// google-java-format (AOSP) is canonical: it joins this annotation onto one
|
|
25
|
+
// line when it fits the 100-column limit and splits it (8-space continuation)
|
|
26
|
+
// otherwise. Reproduce that decision here so the emitted file passes
|
|
27
|
+
// spotlessCheck verbatim for ANY basePackage length.
|
|
28
|
+
const analyzeOneLine = `@AnalyzeClasses(packages = "${basePackage || ''}", importOptions = ImportOption.DoNotIncludeTests.class)`;
|
|
29
|
+
_%>
|
|
30
|
+
<%_ if (analyzeOneLine.length <= 100) { _%>
|
|
31
|
+
<%- analyzeOneLine %>
|
|
32
|
+
<%_ } else { _%>
|
|
33
|
+
@AnalyzeClasses(
|
|
34
|
+
packages = "<%= basePackage ? basePackage : '' %>",
|
|
35
|
+
importOptions = ImportOption.DoNotIncludeTests.class)
|
|
36
|
+
<%_ } _%>
|
|
37
|
+
class NoMockMvcTest {
|
|
38
|
+
|
|
39
|
+
@ArchTest
|
|
40
|
+
public static final ArchRule no_mockmvc_in_production_code =
|
|
41
|
+
noClasses()
|
|
42
|
+
.should()
|
|
43
|
+
.dependOnClassesThat()
|
|
44
|
+
.resideInAPackage("org.springframework.test.web.servlet..")
|
|
45
|
+
.because(
|
|
46
|
+
"MockMvc is forbidden (INV-29). Use RestAssured with @SpringBootTest(webEnvironment=RANDOM_PORT) instead.");
|
|
47
|
+
|
|
48
|
+
@ArchTest
|
|
49
|
+
public static final ArchRule no_auto_configure_mockmvc =
|
|
50
|
+
noClasses()
|
|
51
|
+
.should()
|
|
52
|
+
.beAnnotatedWith(
|
|
53
|
+
"org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc")
|
|
54
|
+
.because(
|
|
55
|
+
"@AutoConfigureMockMvc is forbidden (INV-29). Use @SpringBootTest(webEnvironment=RANDOM_PORT) with RestAssured instead.");
|
|
56
|
+
|
|
57
|
+
@Test
|
|
58
|
+
void production_code_avoids_mockmvc() {
|
|
59
|
+
var productionClasses =
|
|
60
|
+
new ClassFileImporter()
|
|
61
|
+
.withImportOption(new ImportOption.DoNotIncludeTests())
|
|
62
|
+
.importPackages("<%= basePackage ? basePackage : '' %>");
|
|
63
|
+
|
|
64
|
+
assertDoesNotThrow(
|
|
65
|
+
() -> {
|
|
66
|
+
no_mockmvc_in_production_code.check(productionClasses);
|
|
67
|
+
no_auto_configure_mockmvc.check(productionClasses);
|
|
68
|
+
},
|
|
69
|
+
"production code must comply with the No MockMvc architecture rules");
|
|
70
|
+
}
|
|
71
|
+
}
|