@paths.design/caws-cli 10.2.0 → 11.0.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/README.md +125 -374
- package/dist/index.js +43 -785
- package/dist/shell/binding/resolve-binding.d.ts +4 -0
- package/dist/shell/binding/resolve-binding.d.ts.map +1 -0
- package/dist/shell/binding/resolve-binding.js +228 -0
- package/dist/shell/binding/resolve-binding.js.map +1 -0
- package/dist/shell/binding/types.d.ts +42 -0
- package/dist/shell/binding/types.d.ts.map +1 -0
- package/dist/shell/binding/types.js +21 -0
- package/dist/shell/binding/types.js.map +1 -0
- package/dist/shell/commands/claim.d.ts +14 -0
- package/dist/shell/commands/claim.d.ts.map +1 -0
- package/dist/shell/commands/claim.js +197 -0
- package/dist/shell/commands/claim.js.map +1 -0
- package/dist/shell/commands/doctor.d.ts +13 -0
- package/dist/shell/commands/doctor.d.ts.map +1 -0
- package/dist/shell/commands/doctor.js +97 -0
- package/dist/shell/commands/doctor.js.map +1 -0
- package/dist/shell/commands/evidence.d.ts +28 -0
- package/dist/shell/commands/evidence.d.ts.map +1 -0
- package/dist/shell/commands/evidence.js +166 -0
- package/dist/shell/commands/evidence.js.map +1 -0
- package/dist/shell/commands/gates.d.ts +19 -0
- package/dist/shell/commands/gates.d.ts.map +1 -0
- package/dist/shell/commands/gates.js +181 -0
- package/dist/shell/commands/gates.js.map +1 -0
- package/dist/shell/commands/init.d.ts +8 -0
- package/dist/shell/commands/init.d.ts.map +1 -0
- package/dist/shell/commands/init.js +64 -0
- package/dist/shell/commands/init.js.map +1 -0
- package/dist/shell/commands/scope.d.ts +11 -0
- package/dist/shell/commands/scope.d.ts.map +1 -0
- package/dist/shell/commands/scope.js +92 -0
- package/dist/shell/commands/scope.js.map +1 -0
- package/dist/shell/commands/status.d.ts +15 -0
- package/dist/shell/commands/status.d.ts.map +1 -0
- package/dist/shell/commands/status.js +106 -0
- package/dist/shell/commands/status.js.map +1 -0
- package/dist/shell/commands/waiver.d.ts +38 -0
- package/dist/shell/commands/waiver.d.ts.map +1 -0
- package/dist/shell/commands/waiver.js +240 -0
- package/dist/shell/commands/waiver.js.map +1 -0
- package/dist/shell/gates/disposition.d.ts +23 -0
- package/dist/shell/gates/disposition.d.ts.map +1 -0
- package/dist/shell/gates/disposition.js +87 -0
- package/dist/shell/gates/disposition.js.map +1 -0
- package/dist/shell/gates/gate-result-contract.d.ts +39 -0
- package/dist/shell/gates/gate-result-contract.d.ts.map +1 -0
- package/dist/shell/gates/gate-result-contract.js +150 -0
- package/dist/shell/gates/gate-result-contract.js.map +1 -0
- package/dist/shell/gates/quality-gates-adapter.d.ts +55 -0
- package/dist/shell/gates/quality-gates-adapter.d.ts.map +1 -0
- package/dist/shell/gates/quality-gates-adapter.js +161 -0
- package/dist/shell/gates/quality-gates-adapter.js.map +1 -0
- package/dist/shell/gates/waiver-filter.d.ts +58 -0
- package/dist/shell/gates/waiver-filter.d.ts.map +1 -0
- package/dist/shell/gates/waiver-filter.js +119 -0
- package/dist/shell/gates/waiver-filter.js.map +1 -0
- package/dist/shell/index.d.ts +50 -0
- package/dist/shell/index.d.ts.map +1 -0
- package/dist/shell/index.js +73 -0
- package/dist/shell/index.js.map +1 -0
- package/dist/shell/register.d.ts +11 -0
- package/dist/shell/register.d.ts.map +1 -0
- package/dist/shell/register.js +274 -0
- package/dist/shell/register.js.map +1 -0
- package/dist/shell/render/claim.d.ts +22 -0
- package/dist/shell/render/claim.d.ts.map +1 -0
- package/dist/shell/render/claim.js +75 -0
- package/dist/shell/render/claim.js.map +1 -0
- package/dist/shell/render/decision.d.ts +15 -0
- package/dist/shell/render/decision.d.ts.map +1 -0
- package/dist/shell/render/decision.js +66 -0
- package/dist/shell/render/decision.js.map +1 -0
- package/dist/shell/render/diagnostic.d.ts +19 -0
- package/dist/shell/render/diagnostic.d.ts.map +1 -0
- package/dist/shell/render/diagnostic.js +76 -0
- package/dist/shell/render/diagnostic.js.map +1 -0
- package/dist/shell/render/finding.d.ts +15 -0
- package/dist/shell/render/finding.d.ts.map +1 -0
- package/dist/shell/render/finding.js +57 -0
- package/dist/shell/render/finding.js.map +1 -0
- package/dist/shell/render/gates.d.ts +3 -0
- package/dist/shell/render/gates.d.ts.map +1 -0
- package/dist/shell/render/gates.js +56 -0
- package/dist/shell/render/gates.js.map +1 -0
- package/dist/shell/render/init.d.ts +11 -0
- package/dist/shell/render/init.d.ts.map +1 -0
- package/dist/shell/render/init.js +32 -0
- package/dist/shell/render/init.js.map +1 -0
- package/dist/shell/render/status.d.ts +26 -0
- package/dist/shell/render/status.d.ts.map +1 -0
- package/dist/shell/render/status.js +143 -0
- package/dist/shell/render/status.js.map +1 -0
- package/dist/shell/render/waiver.d.ts +21 -0
- package/dist/shell/render/waiver.d.ts.map +1 -0
- package/dist/shell/render/waiver.js +94 -0
- package/dist/shell/render/waiver.js.map +1 -0
- package/dist/shell/rules.d.ts +37 -0
- package/dist/shell/rules.d.ts.map +1 -0
- package/dist/shell/rules.js +51 -0
- package/dist/shell/rules.js.map +1 -0
- package/dist/shell/session/actor.d.ts +14 -0
- package/dist/shell/session/actor.d.ts.map +1 -0
- package/dist/shell/session/actor.js +34 -0
- package/dist/shell/session/actor.js.map +1 -0
- package/dist/shell/session/resolve-session.d.ts +5 -0
- package/dist/shell/session/resolve-session.d.ts.map +1 -0
- package/dist/shell/session/resolve-session.js +239 -0
- package/dist/shell/session/resolve-session.js.map +1 -0
- package/dist/shell/session/types.d.ts +56 -0
- package/dist/shell/session/types.d.ts.map +1 -0
- package/dist/shell/session/types.js +15 -0
- package/dist/shell/session/types.js.map +1 -0
- package/dist/store/agents-store.d.ts +3 -0
- package/dist/store/agents-store.d.ts.map +1 -0
- package/dist/store/agents-store.js +63 -0
- package/dist/store/agents-store.js.map +1 -0
- package/dist/store/apply-patch.d.ts +16 -0
- package/dist/store/apply-patch.d.ts.map +1 -0
- package/dist/store/apply-patch.js +191 -0
- package/dist/store/apply-patch.js.map +1 -0
- package/dist/store/atomic-write.d.ts +16 -0
- package/dist/store/atomic-write.d.ts.map +1 -0
- package/dist/store/atomic-write.js +132 -0
- package/dist/store/atomic-write.js.map +1 -0
- package/dist/store/doctor-snapshot.d.ts +20 -0
- package/dist/store/doctor-snapshot.d.ts.map +1 -0
- package/dist/store/doctor-snapshot.js +176 -0
- package/dist/store/doctor-snapshot.js.map +1 -0
- package/dist/store/events-store.d.ts +33 -0
- package/dist/store/events-store.d.ts.map +1 -0
- package/dist/store/events-store.js +297 -0
- package/dist/store/events-store.js.map +1 -0
- package/dist/store/index.d.ts +21 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +47 -0
- package/dist/store/index.js.map +1 -0
- package/dist/store/init-store.d.ts +21 -0
- package/dist/store/init-store.d.ts.map +1 -0
- package/dist/store/init-store.js +295 -0
- package/dist/store/init-store.js.map +1 -0
- package/dist/store/json-store.d.ts +3 -0
- package/dist/store/json-store.d.ts.map +1 -0
- package/dist/store/json-store.js +65 -0
- package/dist/store/json-store.js.map +1 -0
- package/dist/store/policy-store.d.ts +3 -0
- package/dist/store/policy-store.d.ts.map +1 -0
- package/dist/store/policy-store.js +65 -0
- package/dist/store/policy-store.js.map +1 -0
- package/dist/store/repo-root.d.ts +46 -0
- package/dist/store/repo-root.d.ts.map +1 -0
- package/dist/store/repo-root.js +145 -0
- package/dist/store/repo-root.js.map +1 -0
- package/dist/store/rules.d.ts +53 -0
- package/dist/store/rules.d.ts.map +1 -0
- package/dist/store/rules.js +78 -0
- package/dist/store/rules.js.map +1 -0
- package/dist/store/specs-store.d.ts +3 -0
- package/dist/store/specs-store.d.ts.map +1 -0
- package/dist/store/specs-store.js +131 -0
- package/dist/store/specs-store.js.map +1 -0
- package/dist/store/types.d.ts +84 -0
- package/dist/store/types.d.ts.map +1 -0
- package/dist/store/types.js +14 -0
- package/dist/store/types.js.map +1 -0
- package/dist/store/waivers-store.d.ts +25 -0
- package/dist/store/waivers-store.d.ts.map +1 -0
- package/dist/store/waivers-store.js +232 -0
- package/dist/store/waivers-store.js.map +1 -0
- package/dist/store/worktrees-store.d.ts +3 -0
- package/dist/store/worktrees-store.d.ts.map +1 -0
- package/dist/store/worktrees-store.js +62 -0
- package/dist/store/worktrees-store.js.map +1 -0
- package/dist/store/yaml-store.d.ts +9 -0
- package/dist/store/yaml-store.d.ts.map +1 -0
- package/dist/store/yaml-store.js +121 -0
- package/dist/store/yaml-store.js.map +1 -0
- package/package.json +15 -13
- package/dist/budget-derivation.js +0 -751
- package/dist/cicd-optimizer.js +0 -504
- package/dist/commands/agents.js +0 -124
- package/dist/commands/archive.js +0 -500
- package/dist/commands/burnup.js +0 -198
- package/dist/commands/diagnose.js +0 -525
- package/dist/commands/evaluate.js +0 -314
- package/dist/commands/gates.js +0 -149
- package/dist/commands/init.js +0 -857
- package/dist/commands/iterate.js +0 -417
- package/dist/commands/mode.js +0 -269
- package/dist/commands/parallel.js +0 -242
- package/dist/commands/plan.js +0 -438
- package/dist/commands/provenance.js +0 -1143
- package/dist/commands/quality-monitor.js +0 -284
- package/dist/commands/scope.js +0 -264
- package/dist/commands/session.js +0 -312
- package/dist/commands/sidecar.js +0 -74
- package/dist/commands/specs.js +0 -1656
- package/dist/commands/status.js +0 -1172
- package/dist/commands/templates.js +0 -237
- package/dist/commands/tool.js +0 -136
- package/dist/commands/tutorial.js +0 -480
- package/dist/commands/validate.js +0 -357
- package/dist/commands/verify-acs.js +0 -443
- package/dist/commands/waivers.js +0 -599
- package/dist/commands/workflow.js +0 -243
- package/dist/commands/worktree.js +0 -502
- package/dist/config/lite-scope.js +0 -158
- package/dist/config/modes.js +0 -347
- package/dist/constants/spec-types.js +0 -65
- package/dist/gates/budget-limit.js +0 -121
- package/dist/gates/feedback.js +0 -260
- package/dist/gates/format.js +0 -179
- package/dist/gates/god-object.js +0 -117
- package/dist/gates/pipeline.js +0 -167
- package/dist/gates/scope-boundary.js +0 -112
- package/dist/gates/spec-completeness.js +0 -109
- package/dist/gates/todo-detection.js +0 -205
- package/dist/generators/jest-config-generator.js +0 -242
- package/dist/generators/working-spec.js +0 -237
- package/dist/minimal-cli.js +0 -88
- package/dist/parallel/parallel-manager.js +0 -433
- package/dist/policy/PolicyManager.js +0 -470
- package/dist/scaffold/claude-hooks.js +0 -443
- package/dist/scaffold/cursor-hooks.js +0 -177
- package/dist/scaffold/git-hooks.js +0 -928
- package/dist/scaffold/index.js +0 -794
- package/dist/session/session-manager.js +0 -653
- package/dist/sidecars/index.js +0 -33
- package/dist/sidecars/listeners.js +0 -40
- package/dist/sidecars/provenance-summary.js +0 -238
- package/dist/sidecars/quality-gaps.js +0 -258
- package/dist/sidecars/schema.js +0 -149
- package/dist/sidecars/spec-drift.js +0 -151
- package/dist/sidecars/waiver-draft.js +0 -176
- package/dist/spec/SpecFileManager.js +0 -419
- package/dist/templates/.caws/schemas/policy.schema.json +0 -117
- package/dist/templates/.caws/schemas/scope.schema.json +0 -52
- package/dist/templates/.caws/schemas/waivers.schema.json +0 -106
- package/dist/templates/.caws/schemas/working-spec.schema.json +0 -340
- package/dist/templates/.caws/schemas/worktrees.schema.json +0 -38
- package/dist/templates/.caws/templates/working-spec.template.yml +0 -80
- package/dist/templates/.caws/tools/README.md +0 -18
- package/dist/templates/.caws/tools/scope-guard.js +0 -203
- package/dist/templates/.caws/tools-allow.json +0 -331
- package/dist/templates/.caws/waivers.yml +0 -19
- package/dist/templates/.claude/README.md +0 -190
- package/dist/templates/.claude/hooks/audit.sh +0 -121
- package/dist/templates/.claude/hooks/block-dangerous.sh +0 -203
- package/dist/templates/.claude/hooks/classify_command.py +0 -592
- package/dist/templates/.claude/hooks/doc-frontmatter-check.sh +0 -173
- package/dist/templates/.claude/hooks/lite-sprawl-check.sh +0 -145
- package/dist/templates/.claude/hooks/naming-check.sh +0 -100
- package/dist/templates/.claude/hooks/protected-paths.sh +0 -39
- package/dist/templates/.claude/hooks/quality-check.sh +0 -81
- package/dist/templates/.claude/hooks/scan-secrets.sh +0 -85
- package/dist/templates/.claude/hooks/scope-guard.sh +0 -381
- package/dist/templates/.claude/hooks/session-caws-status.sh +0 -117
- package/dist/templates/.claude/hooks/session-log.sh +0 -634
- package/dist/templates/.claude/hooks/simplification-guard.sh +0 -92
- package/dist/templates/.claude/hooks/stop-worktree-check.sh +0 -46
- package/dist/templates/.claude/hooks/test_classify_command.py +0 -370
- package/dist/templates/.claude/hooks/test_wrapper_smoke.sh +0 -96
- package/dist/templates/.claude/hooks/validate-spec.sh +0 -76
- package/dist/templates/.claude/hooks/worktree-guard.sh +0 -220
- package/dist/templates/.claude/hooks/worktree-write-guard.sh +0 -190
- package/dist/templates/.claude/rules/git-safety.md +0 -26
- package/dist/templates/.claude/rules/worktree-isolation.md +0 -101
- package/dist/templates/.claude/settings.json +0 -141
- package/dist/templates/.cursor/README.md +0 -299
- package/dist/templates/.cursor/hooks/audit.sh +0 -55
- package/dist/templates/.cursor/hooks/block-dangerous.sh +0 -84
- package/dist/templates/.cursor/hooks/caws-quality-check.sh +0 -52
- package/dist/templates/.cursor/hooks/caws-scope-guard.sh +0 -130
- package/dist/templates/.cursor/hooks/format.sh +0 -38
- package/dist/templates/.cursor/hooks/naming-check.sh +0 -64
- package/dist/templates/.cursor/hooks/scan-secrets.sh +0 -51
- package/dist/templates/.cursor/hooks/scope-guard.sh +0 -52
- package/dist/templates/.cursor/hooks/session-log.sh +0 -924
- package/dist/templates/.cursor/hooks/validate-spec.sh +0 -83
- package/dist/templates/.cursor/hooks.json +0 -76
- package/dist/templates/.cursor/rules/00-claims-verification.mdc +0 -144
- package/dist/templates/.cursor/rules/01-working-style.mdc +0 -50
- package/dist/templates/.cursor/rules/02-quality-gates.mdc +0 -368
- package/dist/templates/.cursor/rules/03-naming-and-refactor.mdc +0 -33
- package/dist/templates/.cursor/rules/04-logging-language-style.mdc +0 -23
- package/dist/templates/.cursor/rules/05-safe-defaults-guards.mdc +0 -23
- package/dist/templates/.cursor/rules/06-typescript-conventions.mdc +0 -36
- package/dist/templates/.cursor/rules/07-process-ops.mdc +0 -20
- package/dist/templates/.cursor/rules/08-solid-and-architecture.mdc +0 -16
- package/dist/templates/.cursor/rules/09-docstrings.mdc +0 -89
- package/dist/templates/.cursor/rules/10-documentation-quality-standards.mdc +0 -385
- package/dist/templates/.cursor/rules/11-scope-management-waivers.mdc +0 -381
- package/dist/templates/.cursor/rules/12-implementation-completeness.mdc +0 -516
- package/dist/templates/.cursor/rules/13-language-agnostic-standards.mdc +0 -578
- package/dist/templates/.cursor/rules/README.md +0 -148
- package/dist/templates/.github/copilot-instructions.md +0 -82
- package/dist/templates/.idea/runConfigurations/CAWS_Evaluate.xml +0 -5
- package/dist/templates/.idea/runConfigurations/CAWS_Validate.xml +0 -5
- package/dist/templates/.junie/guidelines.md +0 -73
- package/dist/templates/.vscode/launch.json +0 -17
- package/dist/templates/.vscode/settings.json +0 -95
- package/dist/templates/.windsurf/rules/caws-quality-standards.md +0 -54
- package/dist/templates/.windsurf/workflows/caws-guided-development.md +0 -92
- package/dist/templates/CLAUDE.md +0 -196
- package/dist/templates/COMMIT_CONVENTIONS.md +0 -86
- package/dist/templates/OIDC_SETUP.md +0 -300
- package/dist/templates/agents.md +0 -171
- package/dist/templates/codemod/README.md +0 -1
- package/dist/templates/codemod/test.js +0 -93
- package/dist/templates/docs/README.md +0 -151
- package/dist/templates/scripts/new_feature.sh +0 -80
- package/dist/templates/scripts/quality-gates/check-god-objects.js +0 -146
- package/dist/templates/scripts/quality-gates/run-quality-gates.js +0 -50
- package/dist/templates/scripts/v3/analysis/todo_analyzer.py +0 -1997
- package/dist/test-analysis.js +0 -786
- package/dist/tool-interface.js +0 -314
- package/dist/tool-loader.js +0 -303
- package/dist/tool-validator.js +0 -393
- package/dist/utils/agent-display.js +0 -210
- package/dist/utils/agent-session.js +0 -344
- package/dist/utils/async-utils.js +0 -188
- package/dist/utils/command-wrapper.js +0 -200
- package/dist/utils/event-log.js +0 -584
- package/dist/utils/event-renderer.js +0 -521
- package/dist/utils/finalization.js +0 -230
- package/dist/utils/git-lock.js +0 -119
- package/dist/utils/gitignore-updater.js +0 -158
- package/dist/utils/ide-detection.js +0 -133
- package/dist/utils/lifecycle-events.js +0 -94
- package/dist/utils/project-analysis.js +0 -367
- package/dist/utils/promise-utils.js +0 -72
- package/dist/utils/quality-gates-errors.js +0 -520
- package/dist/utils/quality-gates-utils.js +0 -387
- package/dist/utils/schema-validator.js +0 -50
- package/dist/utils/spec-resolver.js +0 -711
- package/dist/utils/typescript-detector.js +0 -369
- package/dist/utils/working-state.js +0 -530
- package/dist/utils/yaml-validation.js +0 -156
- package/dist/validation/spec-validation.js +0 -924
- package/dist/waivers-manager.js +0 -732
- package/dist/worktree/worktree-manager.js +0 -1735
- package/templates/.caws/schemas/policy.schema.json +0 -117
- package/templates/.caws/schemas/scope.schema.json +0 -52
- package/templates/.caws/schemas/waivers.schema.json +0 -106
- package/templates/.caws/schemas/working-spec.schema.json +0 -340
- package/templates/.caws/schemas/worktrees.schema.json +0 -38
- package/templates/.caws/templates/working-spec.template.yml +0 -80
- package/templates/.caws/tools/README.md +0 -18
- package/templates/.caws/tools/scope-guard.js +0 -203
- package/templates/.caws/tools-allow.json +0 -331
- package/templates/.caws/waivers.yml +0 -19
- package/templates/.claude/README.md +0 -190
- package/templates/.claude/hooks/audit.sh +0 -121
- package/templates/.claude/hooks/block-dangerous.sh +0 -203
- package/templates/.claude/hooks/classify_command.py +0 -592
- package/templates/.claude/hooks/doc-frontmatter-check.sh +0 -173
- package/templates/.claude/hooks/lite-sprawl-check.sh +0 -145
- package/templates/.claude/hooks/naming-check.sh +0 -100
- package/templates/.claude/hooks/protected-paths.sh +0 -39
- package/templates/.claude/hooks/quality-check.sh +0 -81
- package/templates/.claude/hooks/scan-secrets.sh +0 -85
- package/templates/.claude/hooks/scope-guard.sh +0 -381
- package/templates/.claude/hooks/session-caws-status.sh +0 -117
- package/templates/.claude/hooks/session-log.sh +0 -634
- package/templates/.claude/hooks/simplification-guard.sh +0 -92
- package/templates/.claude/hooks/stop-worktree-check.sh +0 -46
- package/templates/.claude/hooks/test_classify_command.py +0 -370
- package/templates/.claude/hooks/test_wrapper_smoke.sh +0 -96
- package/templates/.claude/hooks/validate-spec.sh +0 -76
- package/templates/.claude/hooks/worktree-guard.sh +0 -220
- package/templates/.claude/hooks/worktree-write-guard.sh +0 -190
- package/templates/.claude/rules/git-safety.md +0 -26
- package/templates/.claude/rules/worktree-isolation.md +0 -101
- package/templates/.claude/settings.json +0 -141
- package/templates/.cursor/README.md +0 -299
- package/templates/.cursor/hooks/audit.sh +0 -55
- package/templates/.cursor/hooks/block-dangerous.sh +0 -84
- package/templates/.cursor/hooks/caws-quality-check.sh +0 -52
- package/templates/.cursor/hooks/caws-scope-guard.sh +0 -130
- package/templates/.cursor/hooks/format.sh +0 -38
- package/templates/.cursor/hooks/naming-check.sh +0 -64
- package/templates/.cursor/hooks/scan-secrets.sh +0 -51
- package/templates/.cursor/hooks/scope-guard.sh +0 -52
- package/templates/.cursor/hooks/session-log.sh +0 -924
- package/templates/.cursor/hooks/validate-spec.sh +0 -83
- package/templates/.cursor/hooks.json +0 -76
- package/templates/.cursor/rules/00-claims-verification.mdc +0 -144
- package/templates/.cursor/rules/01-working-style.mdc +0 -50
- package/templates/.cursor/rules/02-quality-gates.mdc +0 -368
- package/templates/.cursor/rules/03-naming-and-refactor.mdc +0 -33
- package/templates/.cursor/rules/04-logging-language-style.mdc +0 -23
- package/templates/.cursor/rules/05-safe-defaults-guards.mdc +0 -23
- package/templates/.cursor/rules/06-typescript-conventions.mdc +0 -36
- package/templates/.cursor/rules/07-process-ops.mdc +0 -20
- package/templates/.cursor/rules/08-solid-and-architecture.mdc +0 -16
- package/templates/.cursor/rules/09-docstrings.mdc +0 -89
- package/templates/.cursor/rules/10-documentation-quality-standards.mdc +0 -385
- package/templates/.cursor/rules/11-scope-management-waivers.mdc +0 -381
- package/templates/.cursor/rules/12-implementation-completeness.mdc +0 -516
- package/templates/.cursor/rules/13-language-agnostic-standards.mdc +0 -578
- package/templates/.cursor/rules/README.md +0 -148
- package/templates/.github/copilot-instructions.md +0 -82
- package/templates/.idea/runConfigurations/CAWS_Evaluate.xml +0 -5
- package/templates/.idea/runConfigurations/CAWS_Validate.xml +0 -5
- package/templates/.junie/guidelines.md +0 -73
- package/templates/.vscode/launch.json +0 -17
- package/templates/.vscode/settings.json +0 -95
- package/templates/.windsurf/rules/caws-quality-standards.md +0 -54
- package/templates/.windsurf/workflows/caws-guided-development.md +0 -92
- package/templates/CLAUDE.md +0 -196
- package/templates/COMMIT_CONVENTIONS.md +0 -86
- package/templates/OIDC_SETUP.md +0 -300
- package/templates/agents.md +0 -171
- package/templates/codemod/README.md +0 -1
- package/templates/codemod/test.js +0 -93
- package/templates/docs/README.md +0 -151
- package/templates/scripts/new_feature.sh +0 -80
- package/templates/scripts/quality-gates/check-god-objects.js +0 -146
- package/templates/scripts/quality-gates/run-quality-gates.js +0 -50
- package/templates/scripts/v3/analysis/todo_analyzer.py +0 -1997
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// `caws scope show <path>` and `caws scope check <path>` — share one
|
|
3
|
+
// decision path; differ only in exit-code policy.
|
|
4
|
+
//
|
|
5
|
+
// show: always exits 0 after rendering, even for reject / no_authority
|
|
6
|
+
// / invalid_path. It is explanatory.
|
|
7
|
+
// check: exits 0 only on `admit`. reject / no_authority / invalid_path
|
|
8
|
+
// exit 1. Used by hooks.
|
|
9
|
+
//
|
|
10
|
+
// Both:
|
|
11
|
+
// 1. resolveRepoRoot(cwd)
|
|
12
|
+
// 2. composeStoreSnapshot (we want load diagnostics if anything is
|
|
13
|
+
// malformed; we do NOT use composeDoctorSnapshot because we don't
|
|
14
|
+
// run the doctor here)
|
|
15
|
+
// 3. resolveBinding(cwd, registry, specs)
|
|
16
|
+
// 4. require a loaded policy. If absent, exit 2 with a clear message.
|
|
17
|
+
// 5. kernel evaluatePath(path, binding, policy)
|
|
18
|
+
// 6. renderDecision(decision, {boundContext})
|
|
19
|
+
// 7. exit per mode.
|
|
20
|
+
//
|
|
21
|
+
// The command does NOT compute its own scope rules. The kernel decides;
|
|
22
|
+
// the command only renders and picks the exit.
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.runScopeCommand = runScopeCommand;
|
|
25
|
+
const caws_kernel_1 = require("@paths.design/caws-kernel");
|
|
26
|
+
const store_1 = require("../../store");
|
|
27
|
+
const resolve_binding_1 = require("../binding/resolve-binding");
|
|
28
|
+
const decision_1 = require("../render/decision");
|
|
29
|
+
const diagnostic_1 = require("../render/diagnostic");
|
|
30
|
+
function runScopeCommand(opts) {
|
|
31
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
32
|
+
const out = opts.out ?? ((s) => process.stdout.write(s + '\n'));
|
|
33
|
+
const err = opts.err ?? ((s) => process.stderr.write(s + '\n'));
|
|
34
|
+
const showData = opts.showData === true;
|
|
35
|
+
const mode = opts.mode;
|
|
36
|
+
// 1. Repo root
|
|
37
|
+
const repoRootResult = (0, store_1.resolveRepoRoot)(cwd);
|
|
38
|
+
if (!repoRootResult.ok) {
|
|
39
|
+
err(`caws scope ${mode}: failed to resolve repo root.`);
|
|
40
|
+
err((0, diagnostic_1.renderDiagnostics)(repoRootResult.errors, { showData }));
|
|
41
|
+
return 2;
|
|
42
|
+
}
|
|
43
|
+
const { repoRoot, cawsDir } = repoRootResult.value;
|
|
44
|
+
// 2. Snapshot
|
|
45
|
+
let snapshot;
|
|
46
|
+
try {
|
|
47
|
+
snapshot = (0, store_1.composeStoreSnapshot)({ repoRoot, cawsDir });
|
|
48
|
+
}
|
|
49
|
+
catch (e) {
|
|
50
|
+
err(`caws scope ${mode}: store composition failed: ${e.message}`);
|
|
51
|
+
return 2;
|
|
52
|
+
}
|
|
53
|
+
// 3. Binding from cwd
|
|
54
|
+
const bound = (0, resolve_binding_1.resolveBinding)({
|
|
55
|
+
repoRoot,
|
|
56
|
+
cwd,
|
|
57
|
+
registry: snapshot.worktrees,
|
|
58
|
+
specs: snapshot.specs,
|
|
59
|
+
});
|
|
60
|
+
// 4. Require a loaded policy. Without it, the kernel can't evaluate
|
|
61
|
+
// non_governed_zones / root_passthrough / infra exemptions, and the
|
|
62
|
+
// rewrite plan requires policy.yaml for any vNext project. This is
|
|
63
|
+
// exit-2 (program/composition) territory, not no_authority.
|
|
64
|
+
const policy = snapshot.policy;
|
|
65
|
+
if (policy === undefined) {
|
|
66
|
+
err(`caws scope ${mode}: no policy.yaml loaded. Run \`caws doctor\` for details.`);
|
|
67
|
+
if (snapshot.policyErrors.length > 0) {
|
|
68
|
+
err((0, diagnostic_1.renderDiagnostics)(snapshot.policyErrors, { showData }));
|
|
69
|
+
}
|
|
70
|
+
return 2;
|
|
71
|
+
}
|
|
72
|
+
// 5. Kernel decision
|
|
73
|
+
let decision;
|
|
74
|
+
try {
|
|
75
|
+
decision = (0, caws_kernel_1.evaluatePath)(opts.path, bound.binding, policy);
|
|
76
|
+
}
|
|
77
|
+
catch (e) {
|
|
78
|
+
err(`caws scope ${mode}: kernel evaluation failed: ${e.message}`);
|
|
79
|
+
return 2;
|
|
80
|
+
}
|
|
81
|
+
// 6. Render — both modes use the same renderer with the same
|
|
82
|
+
// boundContext hint so the human-readable nuance for unbound is
|
|
83
|
+
// consistent.
|
|
84
|
+
out((0, decision_1.renderDecision)(decision, { boundContext: bound, showData }));
|
|
85
|
+
// 7. Exit per mode
|
|
86
|
+
if (mode === 'show') {
|
|
87
|
+
return 0;
|
|
88
|
+
}
|
|
89
|
+
// mode === 'check'
|
|
90
|
+
return decision.kind === 'admit' ? 0 : 1;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=scope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../../../src/shell/commands/scope.ts"],"names":[],"mappings":";AAAA,qEAAqE;AACrE,kDAAkD;AAClD,EAAE;AACF,0EAA0E;AAC1E,8CAA8C;AAC9C,yEAAyE;AACzE,kCAAkC;AAClC,EAAE;AACF,QAAQ;AACR,4BAA4B;AAC5B,qEAAqE;AACrE,uEAAuE;AACvE,4BAA4B;AAC5B,4CAA4C;AAC5C,wEAAwE;AACxE,kDAAkD;AAClD,gDAAgD;AAChD,sBAAsB;AACtB,EAAE;AACF,wEAAwE;AACxE,+CAA+C;;AAwB/C,0CAkEC;AAxFD,2DAImC;AAEnC,uCAAoE;AACpE,gEAA4D;AAC5D,iDAAoD;AACpD,qDAAyD;AAazD,SAAgB,eAAe,CAAC,IAAyB;IACvD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACxE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IAEvB,eAAe;IACf,MAAM,cAAc,GAAG,IAAA,uBAAe,EAAC,GAAG,CAAC,CAAC;IAC5C,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC;QACvB,GAAG,CAAC,cAAc,IAAI,gCAAgC,CAAC,CAAC;QACxD,GAAG,CAAC,IAAA,8BAAiB,EAAC,cAAc,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC;IAEnD,cAAc;IACd,IAAI,QAAiD,CAAC;IACtD,IAAI,CAAC;QACH,QAAQ,GAAG,IAAA,4BAAoB,EAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,cAAc,IAAI,+BAAgC,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7E,OAAO,CAAC,CAAC;IACX,CAAC;IAED,sBAAsB;IACtB,MAAM,KAAK,GAAG,IAAA,gCAAc,EAAC;QAC3B,QAAQ;QACR,GAAG;QACH,QAAQ,EAAE,QAAQ,CAAC,SAAS;QAC5B,KAAK,EAAE,QAAQ,CAAC,KAAK;KACtB,CAAC,CAAC;IAEH,oEAAoE;IACpE,uEAAuE;IACvE,sEAAsE;IACtE,+DAA+D;IAC/D,MAAM,MAAM,GAAuB,QAAQ,CAAC,MAAM,CAAC;IACnD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,GAAG,CAAC,cAAc,IAAI,2DAA2D,CAAC,CAAC;QACnF,IAAI,QAAQ,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,GAAG,CAAC,IAAA,8BAAiB,EAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,qBAAqB;IACrB,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACH,QAAQ,GAAG,IAAA,0BAAY,EAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC5D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,cAAc,IAAI,+BAAgC,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7E,OAAO,CAAC,CAAC;IACX,CAAC;IAED,6DAA6D;IAC7D,mEAAmE;IACnE,iBAAiB;IACjB,GAAG,CAAC,IAAA,yBAAc,EAAC,QAAQ,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IAEjE,mBAAmB;IACnB,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,mBAAmB;IACnB,OAAO,QAAQ,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface StatusCommandOptions {
|
|
2
|
+
readonly cwd?: string;
|
|
3
|
+
readonly now?: () => Date;
|
|
4
|
+
readonly env?: NodeJS.ProcessEnv;
|
|
5
|
+
readonly out?: (line: string) => void;
|
|
6
|
+
readonly err?: (line: string) => void;
|
|
7
|
+
/** Stale heartbeat TTL in ms; display only. Default 24h. */
|
|
8
|
+
readonly staleTtlMs?: number;
|
|
9
|
+
/** Cap on rendered top findings. Default 5. */
|
|
10
|
+
readonly findingCap?: number;
|
|
11
|
+
/** Show structured data blocks on rendered diagnostics. */
|
|
12
|
+
readonly showData?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function runStatusCommand(opts?: StatusCommandOptions): number;
|
|
15
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/shell/commands/status.ts"],"names":[],"mappings":"AA8BA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,4DAA4D;IAC5D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,+CAA+C;IAC/C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,2DAA2D;IAC3D,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,oBAAyB,GAAG,MAAM,CAoFxE"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// `caws status` — vNext read-only dashboard.
|
|
3
|
+
//
|
|
4
|
+
// Hard constraint: status MUST NOT mutate anything. It loads state,
|
|
5
|
+
// runs the kernel diagnoser, and renders. It does NOT mint capsules,
|
|
6
|
+
// refresh heartbeats, write events, mutate worktrees.json, or alter
|
|
7
|
+
// agents.json. Ownership mutation belongs to `caws claim`; spec
|
|
8
|
+
// lifecycle belongs to `caws spec *`; event emission belongs to
|
|
9
|
+
// `caws evidence record`.
|
|
10
|
+
//
|
|
11
|
+
// Pipeline:
|
|
12
|
+
// 1. resolveRepoRoot(cwd)
|
|
13
|
+
// 2. composeDoctorSnapshot(...) → snapshot + doctorInput
|
|
14
|
+
// 3. inspectProjectState(doctorInput) → DoctorReport
|
|
15
|
+
// 4. resolveBinding(cwd, registry, specs)
|
|
16
|
+
// 5. resolveSession({ allowMint: false }) — read-only; never mints
|
|
17
|
+
// 6. renderStatus(...) → stdout
|
|
18
|
+
// 7. exit 0 (regardless of doctor findings) or 2 on composition error
|
|
19
|
+
//
|
|
20
|
+
// Doctor findings drive PROMINENT DISPLAY in the dashboard. They do
|
|
21
|
+
// NOT change the exit code. `caws doctor` is the diagnostic command
|
|
22
|
+
// with 0/1/2 semantics; status is observability.
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.runStatusCommand = runStatusCommand;
|
|
25
|
+
const caws_kernel_1 = require("@paths.design/caws-kernel");
|
|
26
|
+
const store_1 = require("../../store");
|
|
27
|
+
const resolve_binding_1 = require("../binding/resolve-binding");
|
|
28
|
+
const diagnostic_1 = require("../render/diagnostic");
|
|
29
|
+
const status_1 = require("../render/status");
|
|
30
|
+
const resolve_session_1 = require("../session/resolve-session");
|
|
31
|
+
function runStatusCommand(opts = {}) {
|
|
32
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
33
|
+
const nowFn = opts.now ?? (() => new Date());
|
|
34
|
+
const env = opts.env ?? process.env;
|
|
35
|
+
const out = opts.out ?? ((s) => process.stdout.write(s + '\n'));
|
|
36
|
+
const err = opts.err ?? ((s) => process.stderr.write(s + '\n'));
|
|
37
|
+
const showData = opts.showData === true;
|
|
38
|
+
// 1. Repo root
|
|
39
|
+
const repoRootResult = (0, store_1.resolveRepoRoot)(cwd);
|
|
40
|
+
if (!repoRootResult.ok) {
|
|
41
|
+
err('caws status: failed to resolve repo root.');
|
|
42
|
+
err((0, diagnostic_1.renderDiagnostics)(repoRootResult.errors, { showData }));
|
|
43
|
+
return 2;
|
|
44
|
+
}
|
|
45
|
+
const { repoRoot, cawsDir } = repoRootResult.value;
|
|
46
|
+
const now = nowFn();
|
|
47
|
+
// 2. Snapshot + doctor input
|
|
48
|
+
let composition;
|
|
49
|
+
try {
|
|
50
|
+
composition = (0, store_1.composeDoctorSnapshot)({ repoRoot, cawsDir, now });
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
err(`caws status: store composition failed: ${e.message}`);
|
|
54
|
+
return 2;
|
|
55
|
+
}
|
|
56
|
+
const { snapshot, doctorInput } = composition;
|
|
57
|
+
// 3. Run the kernel diagnoser
|
|
58
|
+
let report;
|
|
59
|
+
try {
|
|
60
|
+
report = (0, caws_kernel_1.inspectProjectState)(doctorInput);
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
err(`caws status: kernel inspect failed: ${e.message}`);
|
|
64
|
+
return 2;
|
|
65
|
+
}
|
|
66
|
+
// 4. Binding from cwd
|
|
67
|
+
const binding = (0, resolve_binding_1.resolveBinding)({
|
|
68
|
+
repoRoot,
|
|
69
|
+
cwd,
|
|
70
|
+
registry: snapshot.worktrees,
|
|
71
|
+
specs: snapshot.specs,
|
|
72
|
+
});
|
|
73
|
+
// 5. Session — READ-ONLY. Never pass allowMint: true here.
|
|
74
|
+
const sessionResult = (0, resolve_session_1.resolveSession)({
|
|
75
|
+
cawsDir,
|
|
76
|
+
worktreeRoot: cwd,
|
|
77
|
+
env,
|
|
78
|
+
now: nowFn,
|
|
79
|
+
// allowMint: false — read-only; status MUST NOT mint capsules.
|
|
80
|
+
});
|
|
81
|
+
// 6. Render
|
|
82
|
+
// Event-chain validity is captured in the doctor findings (via
|
|
83
|
+
// doctor.event.chain_invalid); the status dashboard surfaces a
|
|
84
|
+
// chain-broken note only when the kernel actually emitted that finding.
|
|
85
|
+
const chainBroken = report.findings.some((f) => f.rule === 'doctor.event.chain_invalid' && f.severity === 'error');
|
|
86
|
+
out((0, status_1.renderStatus)({
|
|
87
|
+
repoRoot,
|
|
88
|
+
cawsDir,
|
|
89
|
+
policyLoaded: snapshot.policy !== undefined,
|
|
90
|
+
specs: snapshot.specs,
|
|
91
|
+
worktrees: snapshot.worktrees,
|
|
92
|
+
agents: snapshot.agents,
|
|
93
|
+
eventCount: snapshot.events.length,
|
|
94
|
+
// Only emit a chain-OK/broken label when there are events to chain.
|
|
95
|
+
...(snapshot.events.length > 0 ? { eventChainOk: !chainBroken } : {}),
|
|
96
|
+
binding,
|
|
97
|
+
session: sessionResult.ok ? sessionResult.value : null,
|
|
98
|
+
doctorFindings: report.findings,
|
|
99
|
+
now,
|
|
100
|
+
...(opts.staleTtlMs !== undefined ? { staleTtlMs: opts.staleTtlMs } : {}),
|
|
101
|
+
...(opts.findingCap !== undefined ? { findingCap: opts.findingCap } : {}),
|
|
102
|
+
}));
|
|
103
|
+
// 7. Exit. Status is observability, never a gate.
|
|
104
|
+
return 0;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/shell/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export interface WaiverCommandBase {
|
|
2
|
+
readonly cwd?: string;
|
|
3
|
+
readonly now?: () => Date;
|
|
4
|
+
readonly out?: (line: string) => void;
|
|
5
|
+
readonly err?: (line: string) => void;
|
|
6
|
+
readonly showData?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface WaiverCreateOptions extends WaiverCommandBase {
|
|
9
|
+
readonly id: string;
|
|
10
|
+
readonly title: string;
|
|
11
|
+
readonly gates: readonly string[];
|
|
12
|
+
readonly reason: string;
|
|
13
|
+
readonly approvedBy: string;
|
|
14
|
+
readonly expiresAt: string;
|
|
15
|
+
/** Optional. When supplied, scopes the waiver to a single spec id. */
|
|
16
|
+
readonly specId?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function runWaiverCreateCommand(opts: WaiverCreateOptions): number;
|
|
19
|
+
export interface WaiverListOptions extends WaiverCommandBase {
|
|
20
|
+
/** Include waivers whose stored status is 'revoked'. Default false. */
|
|
21
|
+
readonly includeRevoked?: boolean;
|
|
22
|
+
/** Include waivers whose expires_at is in the past. Default false. */
|
|
23
|
+
readonly includeExpired?: boolean;
|
|
24
|
+
}
|
|
25
|
+
export declare function runWaiverListCommand(opts?: WaiverListOptions): number;
|
|
26
|
+
export interface WaiverShowOptions extends WaiverCommandBase {
|
|
27
|
+
readonly id: string;
|
|
28
|
+
}
|
|
29
|
+
export declare function runWaiverShowCommand(opts: WaiverShowOptions): number;
|
|
30
|
+
export interface WaiverRevokeOptions extends WaiverCommandBase {
|
|
31
|
+
readonly id: string;
|
|
32
|
+
/** Optional revoker identity recorded in revocation.revoked_by. */
|
|
33
|
+
readonly revokedBy?: string;
|
|
34
|
+
/** Optional reason recorded in revocation.reason. */
|
|
35
|
+
readonly reason?: string;
|
|
36
|
+
}
|
|
37
|
+
export declare function runWaiverRevokeCommand(opts: WaiverRevokeOptions): number;
|
|
38
|
+
//# sourceMappingURL=waiver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"waiver.d.ts","sourceRoot":"","sources":["../../../src/shell/commands/waiver.ts"],"names":[],"mappings":"AA6DA,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAiDD,MAAM,WAAW,mBAAoB,SAAQ,iBAAiB;IAC5D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,sEAAsE;IACtE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAuDxE;AAMD,MAAM,WAAW,iBAAkB,SAAQ,iBAAiB;IAC1D,uEAAuE;IACvE,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAClC,sEAAsE;IACtE,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,wBAAgB,oBAAoB,CAAC,IAAI,GAAE,iBAAsB,GAAG,MAAM,CAoDzE;AAMD,MAAM,WAAW,iBAAkB,SAAQ,iBAAiB;IAC1D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAkCpE;AAMD,MAAM,WAAW,mBAAoB,SAAQ,iBAAiB;IAC5D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,qDAAqD;IACrD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CA0CxE"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// `caws waiver` — vNext singular command surface.
|
|
3
|
+
//
|
|
4
|
+
// Four subcommands, each a thin shell over the kernel + waivers-store:
|
|
5
|
+
//
|
|
6
|
+
// create — validateWaiver → writeWaiver (refuses duplicates).
|
|
7
|
+
// list — loadWaivers → render summaries; filters by effectiveness.
|
|
8
|
+
// show — loadWaivers → render detail; missing id is a domain error.
|
|
9
|
+
// revoke — markRevoked (refuses double-revoke and missing files).
|
|
10
|
+
//
|
|
11
|
+
// Discipline:
|
|
12
|
+
// - Explicit waiver id on `create` (no auto-generation in 7a). Auto-id
|
|
13
|
+
// would force naming and collision policy decisions that don't
|
|
14
|
+
// belong on the authority surface.
|
|
15
|
+
// - `status: active` is the only status `create` writes. Callers
|
|
16
|
+
// cannot manufacture `expired` (expiry is derived) or `revoked`
|
|
17
|
+
// (use `revoke` for that, which carries an audit record).
|
|
18
|
+
// - Effectiveness is computed by the kernel (`waiverEffectiveness`).
|
|
19
|
+
// The shell never re-derives it — that would risk diverging from
|
|
20
|
+
// gates filtering. `list` defaults to "effective only" so an
|
|
21
|
+
// operator surveying the waiver surface sees what actually applies
|
|
22
|
+
// to gates right now.
|
|
23
|
+
// - All writes go through `writeWaiver` / `markRevoked`. Those are
|
|
24
|
+
// atomic and refuse silent overwrite, so even concurrent invocations
|
|
25
|
+
// can't corrupt a waiver.
|
|
26
|
+
//
|
|
27
|
+
// Exit codes:
|
|
28
|
+
// 0 = command succeeds (including: list with zero results, show with
|
|
29
|
+
// a valid id, revoke that succeeds).
|
|
30
|
+
// 1 = validation/domain failure: duplicate id, missing waiver,
|
|
31
|
+
// invalid id/gate/expiry, already-revoked.
|
|
32
|
+
// 2 = repo-root or store composition failure.
|
|
33
|
+
//
|
|
34
|
+
// Event emission for waiver lifecycle is OUT OF SCOPE for 7a.4 — the
|
|
35
|
+
// existing `waiver_applied` event records *use*, not *creation*. A
|
|
36
|
+
// `waiver_created` / `waiver_revoked` event family belongs with 7b
|
|
37
|
+
// or later and is not gated by this slice.
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.runWaiverCreateCommand = runWaiverCreateCommand;
|
|
40
|
+
exports.runWaiverListCommand = runWaiverListCommand;
|
|
41
|
+
exports.runWaiverShowCommand = runWaiverShowCommand;
|
|
42
|
+
exports.runWaiverRevokeCommand = runWaiverRevokeCommand;
|
|
43
|
+
const caws_kernel_1 = require("@paths.design/caws-kernel");
|
|
44
|
+
const store_1 = require("../../store");
|
|
45
|
+
const diagnostic_1 = require("../render/diagnostic");
|
|
46
|
+
const waiver_1 = require("../render/waiver");
|
|
47
|
+
const rules_1 = require("../rules");
|
|
48
|
+
function shellDiag(rule, message, subject) {
|
|
49
|
+
// Shell-side ad-hoc diagnostics borrow the kernel/diagnostics authority
|
|
50
|
+
// — the kernel's Authority enum is closed, and the rule prefix
|
|
51
|
+
// `shell.*` is what distinguishes shell-owned diagnostics from kernel-
|
|
52
|
+
// owned ones. Existing shell modules (resolve-session, gates contract)
|
|
53
|
+
// follow the same convention.
|
|
54
|
+
return {
|
|
55
|
+
rule,
|
|
56
|
+
authority: 'kernel/diagnostics',
|
|
57
|
+
severity: 'error',
|
|
58
|
+
message,
|
|
59
|
+
...(subject !== undefined ? { subject } : {}),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
function setupIO(opts) {
|
|
63
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
64
|
+
const nowFn = opts.now ?? (() => new Date());
|
|
65
|
+
const out = opts.out ?? ((s) => process.stdout.write(s + '\n'));
|
|
66
|
+
const err = opts.err ?? ((s) => process.stderr.write(s + '\n'));
|
|
67
|
+
const showData = opts.showData === true;
|
|
68
|
+
return { cwd, nowFn, out, err, showData };
|
|
69
|
+
}
|
|
70
|
+
function resolveCaws(cwd, err, showData, cmd) {
|
|
71
|
+
const r = (0, store_1.resolveRepoRoot)(cwd);
|
|
72
|
+
if (!r.ok) {
|
|
73
|
+
err(`caws ${cmd}: failed to resolve repo root.`);
|
|
74
|
+
err((0, diagnostic_1.renderDiagnostics)(r.errors, { showData }));
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
return { cawsDir: r.value.cawsDir };
|
|
78
|
+
}
|
|
79
|
+
function runWaiverCreateCommand(opts) {
|
|
80
|
+
const { cwd, nowFn, out, err, showData } = setupIO(opts);
|
|
81
|
+
const now = nowFn();
|
|
82
|
+
const ctx = resolveCaws(cwd, err, showData, 'waiver create');
|
|
83
|
+
if (ctx === null)
|
|
84
|
+
return 2;
|
|
85
|
+
// Build the candidate waiver document. Validation is delegated to the
|
|
86
|
+
// kernel — no parallel field-shape checks here.
|
|
87
|
+
const candidate = {
|
|
88
|
+
id: opts.id,
|
|
89
|
+
title: opts.title,
|
|
90
|
+
status: 'active',
|
|
91
|
+
gates: opts.gates,
|
|
92
|
+
reason: opts.reason,
|
|
93
|
+
approved_by: opts.approvedBy,
|
|
94
|
+
created_at: now.toISOString(),
|
|
95
|
+
expires_at: opts.expiresAt,
|
|
96
|
+
};
|
|
97
|
+
if (opts.specId !== undefined) {
|
|
98
|
+
candidate['scope'] = { spec_id: opts.specId };
|
|
99
|
+
}
|
|
100
|
+
const validated = (0, caws_kernel_1.validateWaiver)(candidate);
|
|
101
|
+
if (!(0, caws_kernel_1.isOk)(validated)) {
|
|
102
|
+
err('caws waiver create: invalid waiver shape.');
|
|
103
|
+
err((0, diagnostic_1.renderDiagnostics)(validated.errors, { showData }));
|
|
104
|
+
return 1;
|
|
105
|
+
}
|
|
106
|
+
const write = (0, store_1.writeWaiver)(ctx.cawsDir, validated.value);
|
|
107
|
+
if (!(0, caws_kernel_1.isOk)(write)) {
|
|
108
|
+
// The store distinguishes duplicate id (already_exists) from generic
|
|
109
|
+
// I/O failure (write_io_failed). Exit code reflects the difference:
|
|
110
|
+
// duplicate is a user-correctable domain error (1), I/O is a hard
|
|
111
|
+
// store failure (2).
|
|
112
|
+
const isDuplicate = write.errors.some((d) => d.rule === store_1.STORE_RULES.WAIVERS_ALREADY_EXISTS);
|
|
113
|
+
err(isDuplicate
|
|
114
|
+
? `caws waiver create: waiver ${validated.value.id} already exists.`
|
|
115
|
+
: 'caws waiver create: failed to write waiver.');
|
|
116
|
+
err((0, diagnostic_1.renderDiagnostics)(write.errors, { showData }));
|
|
117
|
+
return isDuplicate ? 1 : 2;
|
|
118
|
+
}
|
|
119
|
+
out((0, waiver_1.renderWaiverDetail)({
|
|
120
|
+
waiver: validated.value,
|
|
121
|
+
effectiveness: (0, caws_kernel_1.waiverEffectiveness)(validated.value, now),
|
|
122
|
+
now,
|
|
123
|
+
}));
|
|
124
|
+
return 0;
|
|
125
|
+
}
|
|
126
|
+
function runWaiverListCommand(opts = {}) {
|
|
127
|
+
const { cwd, nowFn, out, err, showData } = setupIO(opts);
|
|
128
|
+
const ctx = resolveCaws(cwd, err, showData, 'waiver list');
|
|
129
|
+
if (ctx === null)
|
|
130
|
+
return 2;
|
|
131
|
+
const load = (0, store_1.loadWaivers)(ctx.cawsDir);
|
|
132
|
+
// Surface load diagnostics on stderr but do NOT discard valid waivers.
|
|
133
|
+
if (load.diagnostics.length > 0) {
|
|
134
|
+
err((0, diagnostic_1.renderDiagnostics)(load.diagnostics, { showData }));
|
|
135
|
+
}
|
|
136
|
+
const now = nowFn();
|
|
137
|
+
const includeRevoked = opts.includeRevoked === true;
|
|
138
|
+
const includeExpired = opts.includeExpired === true;
|
|
139
|
+
const rows = [];
|
|
140
|
+
for (const w of load.waivers) {
|
|
141
|
+
const eff = (0, caws_kernel_1.waiverEffectiveness)(w, now);
|
|
142
|
+
if (eff === 'revoked' && !includeRevoked)
|
|
143
|
+
continue;
|
|
144
|
+
if (eff === 'expired' && !includeExpired)
|
|
145
|
+
continue;
|
|
146
|
+
rows.push({ waiver: w, effectiveness: eff });
|
|
147
|
+
}
|
|
148
|
+
if (rows.length === 0) {
|
|
149
|
+
// Distinguish "no waivers at all" from "no waivers match the filter".
|
|
150
|
+
const msg = load.waivers.length === 0
|
|
151
|
+
? 'No waivers in .caws/waivers/.'
|
|
152
|
+
: 'No waivers match the current filter (use --include-revoked / --include-expired to widen).';
|
|
153
|
+
out(msg);
|
|
154
|
+
return 0;
|
|
155
|
+
}
|
|
156
|
+
// Stable ordering: effective first, then revoked, then expired; within
|
|
157
|
+
// each group sort by id ascending. Predictable list output is much
|
|
158
|
+
// easier to scan and to assert against in tests.
|
|
159
|
+
const order = {
|
|
160
|
+
active: 0,
|
|
161
|
+
not_applicable: 1,
|
|
162
|
+
revoked: 2,
|
|
163
|
+
expired: 3,
|
|
164
|
+
};
|
|
165
|
+
rows.sort((a, b) => {
|
|
166
|
+
const o = order[a.effectiveness] - order[b.effectiveness];
|
|
167
|
+
if (o !== 0)
|
|
168
|
+
return o;
|
|
169
|
+
return a.waiver.id.localeCompare(b.waiver.id);
|
|
170
|
+
});
|
|
171
|
+
out(`Waivers (${rows.length} shown of ${load.waivers.length} total):`);
|
|
172
|
+
for (const r of rows)
|
|
173
|
+
out((0, waiver_1.renderWaiverSummary)(r));
|
|
174
|
+
return 0;
|
|
175
|
+
}
|
|
176
|
+
function runWaiverShowCommand(opts) {
|
|
177
|
+
const { cwd, nowFn, out, err, showData } = setupIO(opts);
|
|
178
|
+
const now = nowFn();
|
|
179
|
+
if (typeof opts.id !== 'string' || opts.id.length === 0) {
|
|
180
|
+
err('caws waiver show: id is required.');
|
|
181
|
+
err(`(rule: ${rules_1.SHELL_RULES.WAIVER_MISSING_ID})`);
|
|
182
|
+
return 1;
|
|
183
|
+
}
|
|
184
|
+
const ctx = resolveCaws(cwd, err, showData, 'waiver show');
|
|
185
|
+
if (ctx === null)
|
|
186
|
+
return 2;
|
|
187
|
+
const load = (0, store_1.loadWaivers)(ctx.cawsDir);
|
|
188
|
+
if (load.diagnostics.length > 0) {
|
|
189
|
+
err((0, diagnostic_1.renderDiagnostics)(load.diagnostics, { showData }));
|
|
190
|
+
}
|
|
191
|
+
const found = load.waivers.find((w) => w.id === opts.id);
|
|
192
|
+
if (found === undefined) {
|
|
193
|
+
err(`caws waiver show: waiver ${opts.id} not found.`);
|
|
194
|
+
err((0, diagnostic_1.renderDiagnostics)([shellDiag(rules_1.SHELL_RULES.WAIVER_NOT_FOUND, `Waiver ${opts.id} not found.`, opts.id)], { showData }));
|
|
195
|
+
return 1;
|
|
196
|
+
}
|
|
197
|
+
out((0, waiver_1.renderWaiverDetail)({
|
|
198
|
+
waiver: found,
|
|
199
|
+
effectiveness: (0, caws_kernel_1.waiverEffectiveness)(found, now),
|
|
200
|
+
now,
|
|
201
|
+
}));
|
|
202
|
+
return 0;
|
|
203
|
+
}
|
|
204
|
+
function runWaiverRevokeCommand(opts) {
|
|
205
|
+
const { cwd, nowFn, out, err, showData } = setupIO(opts);
|
|
206
|
+
const now = nowFn();
|
|
207
|
+
if (typeof opts.id !== 'string' || opts.id.length === 0) {
|
|
208
|
+
err('caws waiver revoke: id is required.');
|
|
209
|
+
err(`(rule: ${rules_1.SHELL_RULES.WAIVER_MISSING_ID})`);
|
|
210
|
+
return 1;
|
|
211
|
+
}
|
|
212
|
+
const ctx = resolveCaws(cwd, err, showData, 'waiver revoke');
|
|
213
|
+
if (ctx === null)
|
|
214
|
+
return 2;
|
|
215
|
+
const result = (0, store_1.markRevoked)(ctx.cawsDir, opts.id, {
|
|
216
|
+
now,
|
|
217
|
+
...(opts.revokedBy !== undefined ? { revoked_by: opts.revokedBy } : {}),
|
|
218
|
+
...(opts.reason !== undefined ? { reason: opts.reason } : {}),
|
|
219
|
+
});
|
|
220
|
+
if (!(0, caws_kernel_1.isOk)(result)) {
|
|
221
|
+
// markRevoked uses STORE_RULES.WAIVERS_NOT_FOUND for missing files and
|
|
222
|
+
// STORE_RULES.WAIVERS_ALREADY_EXISTS for "already revoked" (semantics
|
|
223
|
+
// overload acknowledged in the store comment). Both are domain
|
|
224
|
+
// errors → exit 1. Other failures (I/O, validation) are exit 2.
|
|
225
|
+
const isDomain = result.errors.some((d) => d.rule === store_1.STORE_RULES.WAIVERS_NOT_FOUND ||
|
|
226
|
+
d.rule === store_1.STORE_RULES.WAIVERS_ALREADY_EXISTS);
|
|
227
|
+
err(isDomain
|
|
228
|
+
? `caws waiver revoke: cannot revoke ${opts.id}.`
|
|
229
|
+
: 'caws waiver revoke: failed to revoke waiver.');
|
|
230
|
+
err((0, diagnostic_1.renderDiagnostics)(result.errors, { showData }));
|
|
231
|
+
return isDomain ? 1 : 2;
|
|
232
|
+
}
|
|
233
|
+
out((0, waiver_1.renderWaiverDetail)({
|
|
234
|
+
waiver: result.value,
|
|
235
|
+
effectiveness: (0, caws_kernel_1.waiverEffectiveness)(result.value, now),
|
|
236
|
+
now,
|
|
237
|
+
}));
|
|
238
|
+
return 0;
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=waiver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"waiver.js","sourceRoot":"","sources":["../../../src/shell/commands/waiver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Policy } from '@paths.design/caws-kernel';
|
|
2
|
+
import type { GatesReport, GatesViolation } from './gate-result-contract';
|
|
3
|
+
export type GateMode = 'block' | 'warn' | 'skip';
|
|
4
|
+
export type GateOutcome = 'pass' | 'fail' | 'skipped';
|
|
5
|
+
export interface GateDisposition {
|
|
6
|
+
readonly gate_id: string;
|
|
7
|
+
readonly mode: GateMode;
|
|
8
|
+
readonly outcome: GateOutcome;
|
|
9
|
+
/** True iff this gate's outcome contributes to a final exit 1. */
|
|
10
|
+
readonly blocks: boolean;
|
|
11
|
+
/** Violations whose `gate` field equals `gate_id`. */
|
|
12
|
+
readonly violations: readonly GatesViolation[];
|
|
13
|
+
}
|
|
14
|
+
export interface DispositionResult {
|
|
15
|
+
/** One disposition per policy-declared gate. */
|
|
16
|
+
readonly dispositions: readonly GateDisposition[];
|
|
17
|
+
/** Violations from the subprocess whose gate name was NOT a policy gate. */
|
|
18
|
+
readonly unmatchedViolations: readonly GatesViolation[];
|
|
19
|
+
/** True iff any disposition blocks. */
|
|
20
|
+
readonly anyBlocks: boolean;
|
|
21
|
+
}
|
|
22
|
+
export declare function deriveDispositions(report: GatesReport, policy: Policy): DispositionResult;
|
|
23
|
+
//# sourceMappingURL=disposition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disposition.d.ts","sourceRoot":"","sources":["../../../src/shell/gates/disposition.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAExD,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE1E,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AACjD,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,kEAAkE;IAClE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,sDAAsD;IACtD,QAAQ,CAAC,UAAU,EAAE,SAAS,cAAc,EAAE,CAAC;CAChD;AAED,MAAM,WAAW,iBAAiB;IAChC,gDAAgD;IAChD,QAAQ,CAAC,YAAY,EAAE,SAAS,eAAe,EAAE,CAAC;IAClD,4EAA4E;IAC5E,QAAQ,CAAC,mBAAmB,EAAE,SAAS,cAAc,EAAE,CAAC;IACxD,uCAAuC;IACvC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAmBD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,MAAM,GACb,iBAAiB,CAgDnB"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Policy-derived gate disposition.
|
|
3
|
+
//
|
|
4
|
+
// Given (parsed quality-gates report, parsed policy), produce one
|
|
5
|
+
// `GateDisposition` per policy-declared gate. This is the SOLE place
|
|
6
|
+
// where final block/warn/skip semantics are decided. The subprocess
|
|
7
|
+
// reports violations; this module decides what they mean.
|
|
8
|
+
//
|
|
9
|
+
// Rules:
|
|
10
|
+
//
|
|
11
|
+
// policy.gates[gate].mode === 'skip' → result: 'skipped', blocks=false
|
|
12
|
+
// policy.gates[gate].enabled === false → result: 'skipped', blocks=false
|
|
13
|
+
// any matched violation + mode==='block' → result: 'fail', blocks=true
|
|
14
|
+
// any matched violation + mode==='warn' → result: 'fail', blocks=false
|
|
15
|
+
// no matched violation → result: 'pass', blocks=false
|
|
16
|
+
//
|
|
17
|
+
// A violation is "matched" to a policy gate iff the violation's `gate`
|
|
18
|
+
// field equals the policy gate id. Violations targeting unknown gate
|
|
19
|
+
// names (subprocess-specific checks like 'naming') are surfaced
|
|
20
|
+
// separately as `unmatchedViolations` so the renderer can show them,
|
|
21
|
+
// but they do NOT drive policy disposition.
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.deriveDispositions = deriveDispositions;
|
|
24
|
+
const KNOWN_GATE_IDS = [
|
|
25
|
+
'budget_limit',
|
|
26
|
+
'spec_completeness',
|
|
27
|
+
'scope_boundary',
|
|
28
|
+
'god_object',
|
|
29
|
+
'todo_detection',
|
|
30
|
+
];
|
|
31
|
+
function gateConfigFor(policy, gateId) {
|
|
32
|
+
const cfg = policy.gates[gateId];
|
|
33
|
+
if (cfg === undefined)
|
|
34
|
+
return undefined;
|
|
35
|
+
return { enabled: cfg.enabled, mode: cfg.mode };
|
|
36
|
+
}
|
|
37
|
+
function deriveDispositions(report, policy) {
|
|
38
|
+
// Group violations by gate name.
|
|
39
|
+
const byGate = new Map();
|
|
40
|
+
for (const v of report.violations) {
|
|
41
|
+
const list = byGate.get(v.gate);
|
|
42
|
+
if (list === undefined)
|
|
43
|
+
byGate.set(v.gate, [v]);
|
|
44
|
+
else
|
|
45
|
+
list.push(v);
|
|
46
|
+
}
|
|
47
|
+
const dispositions = [];
|
|
48
|
+
for (const gateId of KNOWN_GATE_IDS) {
|
|
49
|
+
const cfg = gateConfigFor(policy, gateId);
|
|
50
|
+
if (cfg === undefined)
|
|
51
|
+
continue; // gate not declared in policy
|
|
52
|
+
const violations = byGate.get(gateId) ?? [];
|
|
53
|
+
byGate.delete(gateId);
|
|
54
|
+
let outcome;
|
|
55
|
+
let blocks;
|
|
56
|
+
if (cfg.enabled === false || cfg.mode === 'skip') {
|
|
57
|
+
outcome = 'skipped';
|
|
58
|
+
blocks = false;
|
|
59
|
+
}
|
|
60
|
+
else if (violations.length === 0) {
|
|
61
|
+
outcome = 'pass';
|
|
62
|
+
blocks = false;
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
outcome = 'fail';
|
|
66
|
+
blocks = cfg.mode === 'block';
|
|
67
|
+
}
|
|
68
|
+
dispositions.push({
|
|
69
|
+
gate_id: gateId,
|
|
70
|
+
mode: cfg.mode,
|
|
71
|
+
outcome,
|
|
72
|
+
blocks,
|
|
73
|
+
violations,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
// Whatever remains in byGate are unmatched violations (gates the
|
|
77
|
+
// subprocess reported but policy doesn't declare).
|
|
78
|
+
const unmatchedViolations = [];
|
|
79
|
+
for (const list of byGate.values())
|
|
80
|
+
unmatchedViolations.push(...list);
|
|
81
|
+
return {
|
|
82
|
+
dispositions,
|
|
83
|
+
unmatchedViolations,
|
|
84
|
+
anyBlocks: dispositions.some((d) => d.blocks),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=disposition.js.map
|