@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,38 @@
|
|
|
1
|
+
# pytest a11y spec — INV-61 (#1149).
|
|
2
|
+
#
|
|
3
|
+
# Exercises run_axe against representative views. Extend the VIEWS list
|
|
4
|
+
# as new top-level routes ship.
|
|
5
|
+
#
|
|
6
|
+
# `page` and `base_url` fixtures come from the arbiter-generated conftest.py.
|
|
7
|
+
# base_url defaults to E2E_BASE_URL env var or http://localhost:8000.
|
|
8
|
+
|
|
9
|
+
from typing import NamedTuple
|
|
10
|
+
|
|
11
|
+
import pytest
|
|
12
|
+
from playwright.sync_api import Page
|
|
13
|
+
|
|
14
|
+
from a11y.run_axe import run_axe
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class View(NamedTuple):
|
|
18
|
+
label: str
|
|
19
|
+
path: str
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
VIEWS = [
|
|
23
|
+
View("home", "/"),
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
# Guard: empty VIEWS silently produces zero tests and bypasses INV-61.
|
|
27
|
+
if not VIEWS:
|
|
28
|
+
raise RuntimeError(
|
|
29
|
+
"test_a11y.py: VIEWS list is empty — add at least one View entry. "
|
|
30
|
+
"INV-61 requires at least the home route ('/')."
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@pytest.mark.parametrize("view", VIEWS, ids=lambda v: v.label)
|
|
35
|
+
def test_a11y(page: Page, base_url: str, view: View) -> None:
|
|
36
|
+
"""a11y gate — INV-61 (WCAG 2.2 AA, axe-playwright-python)."""
|
|
37
|
+
page.goto(f"{base_url}{view.path}")
|
|
38
|
+
run_axe(page, view.label)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# pytest-playwright smoke spec — #366.
|
|
2
|
+
#
|
|
3
|
+
# Liveness assertions: navigating to the home route must return a non-error
|
|
4
|
+
# response, the document must have a non-empty title, and a <body> must be
|
|
5
|
+
# visible. Failure here means the ephemeral server (#358) is up but the
|
|
6
|
+
# application is dead — exactly the regression class the playwright gate
|
|
7
|
+
# is meant to catch.
|
|
8
|
+
|
|
9
|
+
import re
|
|
10
|
+
|
|
11
|
+
from playwright.sync_api import Page, expect
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def test_home_page_status(page: Page, base_url: str) -> None:
|
|
15
|
+
response = page.goto(base_url)
|
|
16
|
+
assert response is not None, "page.goto returned no response"
|
|
17
|
+
status = response.status
|
|
18
|
+
assert status < 400, f"home returned HTTP {status} — server liveness regression"
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def test_home_page_title(page: Page, base_url: str) -> None:
|
|
22
|
+
page.goto(base_url)
|
|
23
|
+
expect(page).to_have_title(re.compile(r".+"))
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def test_home_page_body_visible(page: Page, base_url: str) -> None:
|
|
27
|
+
page.goto(base_url)
|
|
28
|
+
expect(page.locator("body")).to_be_visible()
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// a11y.spec.ts — INV-61 (#349).
|
|
2
|
+
//
|
|
3
|
+
// Exercises the runAxe wrapper against representative views. Extend the
|
|
4
|
+
// `views` array as new top-level routes ship.
|
|
5
|
+
|
|
6
|
+
import { test } from '@playwright/test'
|
|
7
|
+
import { runAxe } from './a11y/run-axe'
|
|
8
|
+
|
|
9
|
+
const BASE_URL = process.env.E2E_BASE_URL ?? 'http://localhost:4173'
|
|
10
|
+
|
|
11
|
+
const views: ReadonlyArray<{ label: string; path: string }> = [
|
|
12
|
+
{ label: 'home', path: '/' },
|
|
13
|
+
]
|
|
14
|
+
|
|
15
|
+
for (const view of views) {
|
|
16
|
+
test(`a11y — ${view.label} (INV-61)`, async ({ page }) => {
|
|
17
|
+
await page.goto(`${BASE_URL}${view.path}`)
|
|
18
|
+
await runAxe(page, view.label)
|
|
19
|
+
})
|
|
20
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
<%
|
|
2
|
+
const _fw = (typeof frontend !== 'undefined' && frontend && frontend.framework)
|
|
3
|
+
? frontend.framework : 'react';
|
|
4
|
+
// Framework-aware mount root. The smoke test asserts this node mounted with
|
|
5
|
+
// real content — not a blank/error page. Extend the selector list if your
|
|
6
|
+
// app uses a custom root id.
|
|
7
|
+
const _mountSelector = _fw === 'vue' || _fw === 'svelte'
|
|
8
|
+
? '#app'
|
|
9
|
+
: _fw === 'angular'
|
|
10
|
+
? 'app-root'
|
|
11
|
+
: '#root';
|
|
12
|
+
-%>
|
|
13
|
+
// render-smoke.spec.ts — INV-127 (#1366).
|
|
14
|
+
//
|
|
15
|
+
// The MINIMUM behavioural gate for a frontend: a headless browser boots the
|
|
16
|
+
// BUILT SPA (served at E2E_BASE_URL — the same ephemeral-server convention as
|
|
17
|
+
// the a11y lane) and proves, for each key screen, that:
|
|
18
|
+
// 1. the app shell mounted with real content (not a blank/error page), and
|
|
19
|
+
// 2. ZERO console errors / uncaught page errors fired during mount.
|
|
20
|
+
//
|
|
21
|
+
// This catches the failure mode a token-purity gate cannot: the screen renders
|
|
22
|
+
// as broken empty boxes while every lint/token check stays green. A render-smoke
|
|
23
|
+
// failure is a HARD gate — do not merge a frontend that does not mount.
|
|
24
|
+
//
|
|
25
|
+
// Extend `screens` as new top-level routes ship. Keep each screen's anchor a
|
|
26
|
+
// stable, content-bearing selector (a [data-testid], heading, or landmark).
|
|
27
|
+
|
|
28
|
+
import { test, expect } from '@playwright/test'
|
|
29
|
+
|
|
30
|
+
const BASE_URL = process.env.E2E_BASE_URL ?? 'http://localhost:4173'
|
|
31
|
+
|
|
32
|
+
// Mount root for <%= _fw %>. The shell screen asserts this node has rendered children.
|
|
33
|
+
const MOUNT_SELECTOR = '<%- _mountSelector %>'
|
|
34
|
+
|
|
35
|
+
const screens: ReadonlyArray<{ label: string; path: string; anchor?: string }> = [
|
|
36
|
+
// The app shell itself — the first screen that must mount.
|
|
37
|
+
{ label: 'app shell', path: '/' },
|
|
38
|
+
// Add key screens here, e.g.:
|
|
39
|
+
// { label: 'dashboard', path: '/dashboard', anchor: '[data-testid="dashboard-root"]' },
|
|
40
|
+
]
|
|
41
|
+
|
|
42
|
+
for (const screen of screens) {
|
|
43
|
+
test(`render smoke — ${screen.label} mounts without console errors (INV-127)`, async ({
|
|
44
|
+
page,
|
|
45
|
+
}) => {
|
|
46
|
+
const consoleErrors: string[] = []
|
|
47
|
+
const pageErrors: string[] = []
|
|
48
|
+
|
|
49
|
+
page.on('console', (msg) => {
|
|
50
|
+
if (msg.type() === 'error') consoleErrors.push(msg.text())
|
|
51
|
+
})
|
|
52
|
+
page.on('pageerror', (err) => {
|
|
53
|
+
pageErrors.push(err.message)
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
const response = await page.goto(`${BASE_URL}${screen.path}`, {
|
|
57
|
+
waitUntil: 'networkidle',
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
// The document must have been served (not a 4xx/5xx error page).
|
|
61
|
+
expect(
|
|
62
|
+
response?.ok(),
|
|
63
|
+
`expected a 2xx/3xx response for ${screen.path}, got ${response?.status()}`,
|
|
64
|
+
).toBeTruthy()
|
|
65
|
+
|
|
66
|
+
// The app shell must have mounted with real content — not a blank page.
|
|
67
|
+
const root = page.locator(screen.anchor ?? MOUNT_SELECTOR)
|
|
68
|
+
await expect(
|
|
69
|
+
root,
|
|
70
|
+
`expected mount node "${screen.anchor ?? MOUNT_SELECTOR}" to be visible on ${screen.path}`,
|
|
71
|
+
).toBeVisible()
|
|
72
|
+
|
|
73
|
+
const childCount = await root.evaluate((el) => el.childElementCount)
|
|
74
|
+
expect(
|
|
75
|
+
childCount,
|
|
76
|
+
`expected mount node to contain rendered children on ${screen.path} (got an empty shell)`,
|
|
77
|
+
).toBeGreaterThan(0)
|
|
78
|
+
|
|
79
|
+
// Zero console errors / uncaught exceptions during mount — broken layout
|
|
80
|
+
// and runtime crashes both surface here.
|
|
81
|
+
expect(
|
|
82
|
+
consoleErrors,
|
|
83
|
+
`console errors on ${screen.path}:\n${consoleErrors.join('\n')}`,
|
|
84
|
+
).toEqual([])
|
|
85
|
+
expect(
|
|
86
|
+
pageErrors,
|
|
87
|
+
`uncaught page errors on ${screen.path}:\n${pageErrors.join('\n')}`,
|
|
88
|
+
).toEqual([])
|
|
89
|
+
})
|
|
90
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// a11y axe-core wrapper — INV-61 (#349, CANON-02).
|
|
2
|
+
// Updated to WCAG 2.2 AA in #1127.
|
|
3
|
+
//
|
|
4
|
+
// Threshold policy (deliberate, not negotiable without an INV revision):
|
|
5
|
+
// - HARD-throw on impact === 'critical'
|
|
6
|
+
// - HARD-throw on unclassified impact (null / undefined) — never silently pass
|
|
7
|
+
// - LOG without throw on serious / moderate / minor — captured as evidence
|
|
8
|
+
//
|
|
9
|
+
// Downstream projects may ratchet the policy stricter (e.g. throw on
|
|
10
|
+
// 'serious' too) by wrapping or replacing this helper. They may NOT loosen
|
|
11
|
+
// it without recording a project-level exception that cites INV-61.
|
|
12
|
+
//
|
|
13
|
+
// Tag set: full WCAG 2.2 AA — wcag2a + wcag2aa + wcag21a + wcag21aa + wcag22aa.
|
|
14
|
+
// Covers: target-size (2.5.8), focus-appearance (2.4.11), accessible-auth (3.3.8).
|
|
15
|
+
// WCAG 2.2 AA is the 2026 baseline — do NOT drop to wcag2a+wcag2aa only.
|
|
16
|
+
|
|
17
|
+
import AxeBuilder from '@axe-core/playwright'
|
|
18
|
+
import type { Page } from '@playwright/test'
|
|
19
|
+
|
|
20
|
+
type ImpactLevel = 'critical' | 'serious' | 'moderate' | 'minor'
|
|
21
|
+
|
|
22
|
+
interface AxeViolation {
|
|
23
|
+
id: string
|
|
24
|
+
impact?: ImpactLevel | null
|
|
25
|
+
description: string
|
|
26
|
+
help: string
|
|
27
|
+
helpUrl: string
|
|
28
|
+
nodes: ReadonlyArray<{ target: ReadonlyArray<string> }>
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
interface AxeResults {
|
|
32
|
+
violations: ReadonlyArray<AxeViolation>
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const HARD_FAIL_IMPACTS = new Set<ImpactLevel>(['critical'])
|
|
36
|
+
|
|
37
|
+
export async function runAxe(page: Page, label: string): Promise<void> {
|
|
38
|
+
const results = (await new AxeBuilder({ page })
|
|
39
|
+
.withTags(['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa', 'wcag22aa'])
|
|
40
|
+
.analyze()) as unknown as AxeResults
|
|
41
|
+
|
|
42
|
+
const hardFailures: AxeViolation[] = []
|
|
43
|
+
const unclassified: AxeViolation[] = []
|
|
44
|
+
const soft: AxeViolation[] = []
|
|
45
|
+
|
|
46
|
+
for (const v of results.violations) {
|
|
47
|
+
if (v.impact === null || v.impact === undefined) {
|
|
48
|
+
unclassified.push(v)
|
|
49
|
+
} else if (HARD_FAIL_IMPACTS.has(v.impact)) {
|
|
50
|
+
hardFailures.push(v)
|
|
51
|
+
} else {
|
|
52
|
+
soft.push(v)
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
for (const v of soft) {
|
|
57
|
+
// eslint-disable-next-line no-console
|
|
58
|
+
console.warn(`[a11y][${label}] ${v.impact ?? '?'}: ${v.id} — ${v.help}`)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (unclassified.length > 0) {
|
|
62
|
+
const ids = unclassified.map((v) => v.id).join(', ')
|
|
63
|
+
throw new Error(
|
|
64
|
+
`[a11y][${label}] INV-61: unclassified-impact violations not permitted: ${ids}`,
|
|
65
|
+
)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (hardFailures.length > 0) {
|
|
69
|
+
const summary = hardFailures
|
|
70
|
+
.map((v) => `${v.id} (${v.nodes.length} node${v.nodes.length === 1 ? '' : 's'})`)
|
|
71
|
+
.join(', ')
|
|
72
|
+
throw new Error(`[a11y][${label}] INV-61: critical violations detected: ${summary}`)
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// smoke-journeys.spec.ts — INV-137 (#2080), the login/CRUD acceptance floor.
|
|
2
|
+
//
|
|
3
|
+
// The MINIMUM user-journey gate for a frontend: a headless browser boots the BUILT
|
|
4
|
+
// SPA (served at E2E_BASE_URL — the same ephemeral-server convention as render-smoke
|
|
5
|
+
// and the a11y lane) and drives each MANDATORY journey end-to-end. This is the layer
|
|
6
|
+
// that catches "every unit test green, but a real user cannot log in or save a record".
|
|
7
|
+
//
|
|
8
|
+
// These are HONEST STARTERS, not pass-throughs: each block navigates the real app and
|
|
9
|
+
// asserts a real, journey-specific outcome. Replace the // TODO(#2080) selectors/paths
|
|
10
|
+
// with your app's, and keep the assertion meaningful — an empty test() here is a lie the
|
|
11
|
+
// smoke-journeys gate (presence-only) cannot catch, but INV-118 (anti-proforma) can.
|
|
12
|
+
//
|
|
13
|
+
// Declared in smoke-journeys.json:
|
|
14
|
+
// auth — Authentication flow (required)
|
|
15
|
+
// crud — Core CRUD operation (required)
|
|
16
|
+
// authz — Authorization enforcement (n/a for frontend-spa — the backend archetype's floor)
|
|
17
|
+
|
|
18
|
+
import { test, expect } from '@playwright/test'
|
|
19
|
+
|
|
20
|
+
const BASE_URL = process.env.E2E_BASE_URL ?? 'http://localhost:4173'
|
|
21
|
+
|
|
22
|
+
test('auth — a user can complete the login flow (INV-137)', async ({ page }) => {
|
|
23
|
+
const consoleErrors: string[] = []
|
|
24
|
+
page.on('console', (msg) => {
|
|
25
|
+
if (msg.type() === 'error') consoleErrors.push(msg.text())
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
// TODO(#2080): drive your real login form. Replace path + selectors + credentials.
|
|
29
|
+
// NOTE: the placeholder below is intentionally not email-shaped (arbiter's own PII
|
|
30
|
+
// scan flags an @-address pattern in scaffolded source, #2257) — swap in a real
|
|
31
|
+
// fixture identity (via E2E_USER) once your login form is wired up.
|
|
32
|
+
await page.goto(`${BASE_URL}/login`, { waitUntil: 'networkidle' })
|
|
33
|
+
await page.getByLabel(/email|username/i).fill(process.env.E2E_USER ?? 'smoke-test-user')
|
|
34
|
+
await page.getByLabel(/password/i).fill(process.env.E2E_PASS ?? 'password')
|
|
35
|
+
await page.getByRole('button', { name: /log ?in|sign ?in/i }).click()
|
|
36
|
+
|
|
37
|
+
// The journey succeeds only if the app leaves the login screen for an authed view.
|
|
38
|
+
await expect(page).not.toHaveURL(/\/login\b/)
|
|
39
|
+
expect(consoleErrors, `console errors during login: ${consoleErrors.join('; ')}`).toHaveLength(0)
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
test('crud — a user can create then read back a record (INV-137)', async ({ page }) => {
|
|
43
|
+
// TODO(#2080): drive your real create-then-read path. Replace path + selectors.
|
|
44
|
+
// Keep the assertion journey-specific: the created record must be visible on read-back,
|
|
45
|
+
// proving the write persisted and the read wiring surfaces it (not just a 200).
|
|
46
|
+
await page.goto(`${BASE_URL}/`, { waitUntil: 'networkidle' })
|
|
47
|
+
await expect(page.locator('body')).toBeVisible()
|
|
48
|
+
// e.g.:
|
|
49
|
+
// await page.getByRole('button', { name: /new|create|add/i }).click()
|
|
50
|
+
// await page.getByLabel(/title|name/i).fill('smoke-journey record')
|
|
51
|
+
// await page.getByRole('button', { name: /save|submit/i }).click()
|
|
52
|
+
// await expect(page.getByText('smoke-journey record')).toBeVisible()
|
|
53
|
+
})
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"_comment": "Defines which files are load-bearing for done evidence (SHA-pinning). Generated by arbiter.",
|
|
4
|
+
"pin_dirs": [<% if (language === 'typescript') { %>"src", "__tests__"<% } else if (language === 'java') { %>"src/main/java", "src/test/java"<% } else if (language === 'python') { %>"src", "tests"<% } else if (language === 'rust') { %>"src", "tests"<% } else if (language === 'go') { %>"."<% } else { %>"src"<% } %>],
|
|
5
|
+
"pin_extensions": [<% if (language === 'typescript') { %>".ts", ".tsx", ".mjs", ".js"<% } else if (language === 'java') { %>".java"<% } else if (language === 'python') { %>".py"<% } else if (language === 'rust') { %>".rs"<% } else if (language === 'go') { %>".go"<% } else { %>".ts"<% } %>],
|
|
6
|
+
"exclude_dirs": ["node_modules", "dist", "build", "coverage", ".git", "target", "vendor", "__pycache__", ".venv"],
|
|
7
|
+
"reality_contact": {
|
|
8
|
+
"archetype": "<%- archetype %>",
|
|
9
|
+
"required": <% if (archetype === 'backend-web-db' || archetype === 'frontend-spa') { %>true<% } else { %>false<% } %>,
|
|
10
|
+
"suite": "<% if (archetype === 'frontend-spa') { %>render-smoke<% } else { %>live-api-e2e<% } %>",
|
|
11
|
+
"command": <% if (archetype === 'backend-web-db') { %>"./tests/api/run.sh"<% } else if (archetype === 'frontend-spa') { %>["node", "scripts/lib/ephemeral-server.mjs", "--start", "npm run start:test", "--test", "npx playwright test tests/e2e/render-smoke.spec.ts", "--port", "4173"]<% } else { %>""<% } %>
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
<%
|
|
2
|
+
const _fw = (typeof frontend !== 'undefined' && frontend && frontend.framework)
|
|
3
|
+
? frontend.framework
|
|
4
|
+
: 'the frontend framework'
|
|
5
|
+
%>
|
|
6
|
+
# FE Design Principles — <%= projectName %>
|
|
7
|
+
|
|
8
|
+
<!-- arbiter-managed: frontend-governance (#1124) -->
|
|
9
|
+
|
|
10
|
+
**Framework:** <%= _fw %>
|
|
11
|
+
**Authority:** Binding project policy. Violations are defects, not style suggestions.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## P1: Semantic Tokens Only
|
|
16
|
+
|
|
17
|
+
Every color reference in UI templates MUST come from the semantic token layer.
|
|
18
|
+
|
|
19
|
+
- **NO** raw palette colors (`bg-amber-500`, `text-red-600`, `border-slate-200`)
|
|
20
|
+
- **NO** phantom tokens (undefined CSS vars produce zero CSS output → invisible elements)
|
|
21
|
+
- **NO** numbered shades outside the token system
|
|
22
|
+
|
|
23
|
+
**Why:** Semantic tokens are theme-aware. Raw palette classes break dark mode and require
|
|
24
|
+
per-component manual overrides. Using semantic tokens makes multi-theme correctness structural.
|
|
25
|
+
|
|
26
|
+
**Enforcement:** CI grep check for raw palette classes in UI source.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## P2: Page Header Consistency
|
|
31
|
+
|
|
32
|
+
All route-level views MUST use a shared `<PageHeader>` (or equivalent) component for
|
|
33
|
+
title/subtitle rendering. This enforces visual consistency across all pages.
|
|
34
|
+
|
|
35
|
+
**Exceptions (explicit, not default):**
|
|
36
|
+
- Dashboard — hero-card layout with custom visual hierarchy
|
|
37
|
+
- Auth / Error pages — centered full-page layouts
|
|
38
|
+
- Mobile execution views with full-bleed layouts
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## P3: Explicit Component Imports (Runtime Safety)
|
|
43
|
+
|
|
44
|
+
Every component used in a template MUST have an explicit import in its script block.
|
|
45
|
+
Auto-import plugins are opt-in, not the default.
|
|
46
|
+
|
|
47
|
+
**Why:** Without explicit imports, a missing component renders as a raw HTML element
|
|
48
|
+
(e.g., `<appcard>`) with zero styling — invisible to users with no console error.
|
|
49
|
+
This is a runtime safety rule, not a style preference.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## P4: Container Heights Flow Down
|
|
54
|
+
|
|
55
|
+
The parent provides the height constraint. The child fills with `height: 100%`.
|
|
56
|
+
|
|
57
|
+
- **NEVER:** child forces a fixed height inside a smaller parent container
|
|
58
|
+
- **Pattern:** parent wraps with a fixed-height container, child chart/component uses `h-full`
|
|
59
|
+
|
|
60
|
+
**Why:** Prevents layout overflow and ensures chart/canvas components resize correctly.
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## P5: Layout Fills Available Width
|
|
65
|
+
|
|
66
|
+
Page content containers MUST fill the layout shell's available width.
|
|
67
|
+
No `max-width` constraints on page content unless it is explicitly a reading layout.
|
|
68
|
+
|
|
69
|
+
**Why:** The layout shell controls the outer constraint. Per-page `max-width` overrides
|
|
70
|
+
create inconsistent widths across pages.
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## P6: i18n Governance
|
|
75
|
+
|
|
76
|
+
All user-facing strings MUST use the i18n translation function (`t('key')`).
|
|
77
|
+
Keys MUST exist in all supported locale files. No raw UI literals.
|
|
78
|
+
|
|
79
|
+
**Enforcement:** CI grep check for unlocalized string literals in UI template files.
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## P7: Visual Verification Protocol
|
|
84
|
+
|
|
85
|
+
Any layout or styling change requires:
|
|
86
|
+
|
|
87
|
+
1. **Unit tests** — component renders without crash
|
|
88
|
+
2. **Local visual verification** — rendered page inspected in browser
|
|
89
|
+
3. **Responsive check** — 375px mobile and 1280px desktop minimum
|
|
90
|
+
4. **Dark mode check** — verify no raw palette breakage
|
|
91
|
+
|
|
92
|
+
**Unit tests passing does NOT equal visual correctness.** Browser evidence is mandatory
|
|
93
|
+
for any visual claim.
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## P8: Dark Mode by Design
|
|
98
|
+
|
|
99
|
+
Semantic tokens are theme-aware via CSS custom properties scoped to `[data-theme]`.
|
|
100
|
+
Raw palette colors break dark mode. Using semantic tokens makes dark-mode correctness
|
|
101
|
+
a structural guarantee, not a per-component concern.
|
|
102
|
+
|
|
103
|
+
**Corollary:** Every phantom token fix is simultaneously a dark-mode fix.
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## P9: Accessibility by Default
|
|
108
|
+
|
|
109
|
+
All interactive elements MUST be keyboard-accessible and meet WCAG 2.1 AA contrast ratios.
|
|
110
|
+
|
|
111
|
+
- Form inputs MUST have associated labels (not just placeholder text).
|
|
112
|
+
- Icon-only buttons MUST have `aria-label` or equivalent.
|
|
113
|
+
- Focus indicators MUST be visible and not suppressed with `outline: none` without replacement.
|
|
114
|
+
|
|
115
|
+
**Enforcement:** Automated a11y checks in CI (e.g., axe-core Playwright integration).
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
<%
|
|
2
|
+
const _fw = (typeof frontend !== 'undefined' && frontend && frontend.framework)
|
|
3
|
+
? frontend.framework
|
|
4
|
+
: 'the frontend layer'
|
|
5
|
+
const _sm = (typeof frontend !== 'undefined' && frontend && frontend.stateManager)
|
|
6
|
+
? frontend.stateManager
|
|
7
|
+
: (_fw === 'vue' ? 'Pinia' : _fw === 'react' ? 'Zustand' : 'the state store')
|
|
8
|
+
const _vl = (typeof frontend !== 'undefined' && frontend && frontend.validationLib)
|
|
9
|
+
? frontend.validationLib
|
|
10
|
+
: 'Zod'
|
|
11
|
+
%>
|
|
12
|
+
# Frontend Constitution — <%= projectName %>
|
|
13
|
+
|
|
14
|
+
<!-- arbiter-managed: frontend-governance (#1124) -->
|
|
15
|
+
|
|
16
|
+
**Framework:** <%= _fw %>
|
|
17
|
+
**Status:** RATIFIED
|
|
18
|
+
**Scope:** FE001–FE006
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 1. Definitions
|
|
23
|
+
|
|
24
|
+
**Adapter / API layer**
|
|
25
|
+
Infrastructure boundary implementing all I/O operations (HTTP, storage, external APIs).
|
|
26
|
+
No business logic lives here.
|
|
27
|
+
|
|
28
|
+
**Domain layer**
|
|
29
|
+
Pure business logic with zero framework coupling (no UI framework, no browser APIs, no state libraries).
|
|
30
|
+
|
|
31
|
+
**Application layer**
|
|
32
|
+
Glue connecting domain logic to UI via composables / hooks / services.
|
|
33
|
+
|
|
34
|
+
**State store**
|
|
35
|
+
Restricted to synchronous, client-only state. No async actions, no API caching.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## 2. Non-Negotiables (MUST)
|
|
40
|
+
|
|
41
|
+
- All HTTP calls to the backend API MUST occur within the adapter/API layer.
|
|
42
|
+
- The domain layer MUST contain pure business logic — no UI framework, state library, or browser API imports.
|
|
43
|
+
- Server state MUST be managed via a data-fetching library with stale-while-revalidate strategy.
|
|
44
|
+
- Every API response MUST be validated by a schema validator (<%= _vl %>) at the system boundary.
|
|
45
|
+
- All errors MUST be normalized to a standard `AppError` shape and routed via a centralized notification bus.
|
|
46
|
+
- UI components MUST use semantic design tokens (`--bg-*`, `--text-*`, etc.), NOT raw palette colors.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## 3. Pillar Rules (FE001–FE006)
|
|
51
|
+
|
|
52
|
+
### FE001 — Governed ACL (Anti-Corruption Layer)
|
|
53
|
+
|
|
54
|
+
**MUST:**
|
|
55
|
+
- All I/O and external mutations MUST occur within the adapter/API layer.
|
|
56
|
+
- Access to external systems MUST be via port interfaces or data-fetching hooks.
|
|
57
|
+
- Linting MUST restrict `fetch`/HTTP client imports to the API layer only.
|
|
58
|
+
|
|
59
|
+
**FORBIDDEN:**
|
|
60
|
+
- Direct `fetch`, `axios`, or equivalent HTTP calls in UI components, composables/hooks, or state stores.
|
|
61
|
+
- Cross-module HTTP calls outside the API layer.
|
|
62
|
+
|
|
63
|
+
**Enforcement:**
|
|
64
|
+
- ESLint `no-restricted-imports`: forbid HTTP clients outside the adapter layer.
|
|
65
|
+
- CI grep check: `rg "fetch\(|axios\." src/*/ui` MUST be empty.
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
### FE002 — Headless Domain Logic
|
|
70
|
+
|
|
71
|
+
**MUST:**
|
|
72
|
+
- The domain layer MUST contain pure business logic with zero framework coupling.
|
|
73
|
+
- Domain modules MUST import only pure language constructs, validation schemas, date utilities, and standard `Error` classes.
|
|
74
|
+
|
|
75
|
+
**FORBIDDEN:**
|
|
76
|
+
- Importing the UI framework (<%= _fw %>) in the domain layer.
|
|
77
|
+
- Importing state management libraries in the domain layer.
|
|
78
|
+
- Accessing browser APIs (`window`, `document`, `localStorage`, `matchMedia`) in the domain layer.
|
|
79
|
+
|
|
80
|
+
**Enforcement:**
|
|
81
|
+
- CI grep check: `rg "localStorage|matchMedia|document\.|window\." src/*/domain` MUST be empty.
|
|
82
|
+
- Architectural boundary tests enforce domain purity.
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
### FE003 — Application Layer & State Management
|
|
87
|
+
|
|
88
|
+
**MUST:**
|
|
89
|
+
- Server state MUST be managed via a data-fetching library with stale-while-revalidate strategy.
|
|
90
|
+
- <%= _sm %> MUST be restricted to synchronous, client-only state (no async actions, no API caching).
|
|
91
|
+
- Query keys MUST be co-located with their API functions.
|
|
92
|
+
|
|
93
|
+
**FORBIDDEN:**
|
|
94
|
+
- Async actions in <%= _sm %>.
|
|
95
|
+
- Business logic in store getters.
|
|
96
|
+
- Manually caching API responses in a client store.
|
|
97
|
+
|
|
98
|
+
**Enforcement:**
|
|
99
|
+
- Code review: verify no async/await in <%= _sm %> actions.
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
### FE004 — Centralized Error Handling
|
|
104
|
+
|
|
105
|
+
**MUST:**
|
|
106
|
+
- All exceptions MUST be normalized to a standard `AppError` schema.
|
|
107
|
+
- Errors MUST be routed via a centralized feedback/notification bus.
|
|
108
|
+
- A global error interceptor MUST convert 4xx/5xx responses to `AppError` objects.
|
|
109
|
+
- UI components MUST consume `AppError` to display user-friendly messages.
|
|
110
|
+
|
|
111
|
+
**FORBIDDEN:**
|
|
112
|
+
- Swallowing errors without reporting.
|
|
113
|
+
- Ad-hoc alerts or component-level `try/catch` blocks that suppress errors.
|
|
114
|
+
- `console.error` as the primary error handling mechanism in production code.
|
|
115
|
+
|
|
116
|
+
**Enforcement:**
|
|
117
|
+
- Code review: verify all API errors route through the global interceptor.
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
### FE005 — Async UX Policy
|
|
122
|
+
|
|
123
|
+
**MUST:**
|
|
124
|
+
- User intent MUST be acknowledged immediately via visual feedback.
|
|
125
|
+
- A loading/skeleton state MUST appear for first loads (no cached data available).
|
|
126
|
+
- A background-refresh indicator MUST appear for stale-while-revalidate refreshes.
|
|
127
|
+
- Skeleton components MUST have fixed heights matching real content dimensions (anti-layout-shift).
|
|
128
|
+
- Interactive elements MUST enter a disabled/loading state during in-flight operations.
|
|
129
|
+
|
|
130
|
+
**FORBIDDEN:**
|
|
131
|
+
- Frozen UI (blocking the main thread).
|
|
132
|
+
- Interactive elements lacking a loading state during operations.
|
|
133
|
+
- Silent failures (errors must surface via the notification bus).
|
|
134
|
+
- Manual `isLoading` refs duplicating what the data-fetching library already provides.
|
|
135
|
+
|
|
136
|
+
**Enforcement:**
|
|
137
|
+
- Code review: verify loading-state semantics (first load vs. background refetch).
|
|
138
|
+
- Design QA: verify skeleton heights match loaded content.
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
### FE006 — Design Tokens & Multi-Theme
|
|
143
|
+
|
|
144
|
+
**MUST:**
|
|
145
|
+
- UI components MUST use semantic design tokens (`--bg-*`, `--text-*`, etc.) exclusively.
|
|
146
|
+
- Foundation/primitive tokens are abstract values and MUST NOT be referenced directly by components.
|
|
147
|
+
- Theme switching MUST be controlled via a `data-theme` attribute on `<html>`.
|
|
148
|
+
- The app MUST support at minimum `light`, `dark`, and `system` (default) themes.
|
|
149
|
+
- FOUC prevention MUST be implemented via an inline script applied BEFORE CSS loads.
|
|
150
|
+
|
|
151
|
+
**FORBIDDEN:**
|
|
152
|
+
- Raw palette color classes (`bg-white`, `text-gray-500`, etc.) in production UI files.
|
|
153
|
+
- Foundation/primitive tokens used directly in component styles.
|
|
154
|
+
- Side-effects (DOM manipulation, localStorage) in the dumb state store.
|
|
155
|
+
|
|
156
|
+
**Enforcement:**
|
|
157
|
+
- CI grep check: `rg "bg-white|text-gray-|bg-slate-" src/*/ui` MUST be empty.
|
|
158
|
+
- Code review: verify `ThemeController` location and state-store purity.
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## 4. Ratification Checklist (PR Reviewers)
|
|
163
|
+
|
|
164
|
+
- [ ] All HTTP calls originate from the adapter/API layer.
|
|
165
|
+
- [ ] Domain layer contains only pure logic (no UI framework, state lib, browser APIs).
|
|
166
|
+
- [ ] Server state managed via data-fetching library; state store restricted to client-only sync state.
|
|
167
|
+
- [ ] All API responses validated by <%= _vl %> at boundary.
|
|
168
|
+
- [ ] Errors normalized to `AppError` and routed via notification bus.
|
|
169
|
+
- [ ] Loading-state semantics correct (first load vs. background refetch).
|
|
170
|
+
- [ ] Semantic tokens used exclusively in UI components.
|