@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 @@
|
|
|
1
|
+
{"version":3,"file":"disposition.js","sourceRoot":"","sources":["../../../src/shell/gates/disposition.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type Result } from '@paths.design/caws-kernel';
|
|
2
|
+
export interface GatesViolation {
|
|
3
|
+
/** The gate that detected this violation. May be any string. */
|
|
4
|
+
readonly gate: string;
|
|
5
|
+
/** Optional violation type id (e.g. 'banned_modifier', 'timeout'). */
|
|
6
|
+
readonly type?: string;
|
|
7
|
+
readonly message?: string;
|
|
8
|
+
readonly file?: string;
|
|
9
|
+
readonly line?: number;
|
|
10
|
+
readonly rule?: string;
|
|
11
|
+
/** Subprocess-reported severity. NOT trusted for blocking — policy decides. */
|
|
12
|
+
readonly severity?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface GatesWarning {
|
|
15
|
+
readonly gate?: string;
|
|
16
|
+
readonly type?: string;
|
|
17
|
+
readonly message?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface GatesReport {
|
|
20
|
+
readonly timestamp: string;
|
|
21
|
+
readonly context: string;
|
|
22
|
+
readonly files_scoped: number;
|
|
23
|
+
readonly warnings: readonly GatesWarning[];
|
|
24
|
+
readonly violations: readonly GatesViolation[];
|
|
25
|
+
readonly waivers?: {
|
|
26
|
+
readonly active: number;
|
|
27
|
+
readonly applied: number;
|
|
28
|
+
};
|
|
29
|
+
readonly performance?: {
|
|
30
|
+
readonly total_execution_time_ms?: number;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Parse + validate the subprocess JSON. Returns Ok(GatesReport) only when
|
|
35
|
+
* EVERY required field is present and well-typed. Returns Err with a
|
|
36
|
+
* specific shell.gates.* rule otherwise. Never throws on bad input.
|
|
37
|
+
*/
|
|
38
|
+
export declare function validateGatesReport(raw: string): Result<GatesReport>;
|
|
39
|
+
//# sourceMappingURL=gate-result-contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate-result-contract.d.ts","sourceRoot":"","sources":["../../../src/shell/gates/gate-result-contract.ts"],"names":[],"mappings":"AAwBA,OAAO,EAA4B,KAAK,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAIlF,MAAM,WAAW,cAAc;IAC7B,gEAAgE;IAChE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,+EAA+E;IAC/E,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;IAC3C,QAAQ,CAAC,UAAU,EAAE,SAAS,cAAc,EAAE,CAAC;IAC/C,QAAQ,CAAC,OAAO,CAAC,EAAE;QACjB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,QAAQ,CAAC,WAAW,CAAC,EAAE;QACrB,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC;KAC3C,CAAC;CACH;AAiED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,CA0GpE"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Runtime validator for `caws-quality-gates --json` output.
|
|
3
|
+
//
|
|
4
|
+
// The subprocess emits a SINGLE aggregated JSON payload describing the full
|
|
5
|
+
// gate run. We do NOT trust the shape — TypeScript types do not survive
|
|
6
|
+
// `JSON.parse`. The validator below enforces the minimal contract the
|
|
7
|
+
// vNext command needs to make a policy-derived decision.
|
|
8
|
+
//
|
|
9
|
+
// Accepted shape (narrowed; the real payload may carry more fields, which
|
|
10
|
+
// we ignore):
|
|
11
|
+
//
|
|
12
|
+
// {
|
|
13
|
+
// timestamp: string (ISO-8601)
|
|
14
|
+
// context: string (e.g. 'cli', 'commit', 'ci')
|
|
15
|
+
// files_scoped: number
|
|
16
|
+
// warnings: Array<{ gate?: string; ... }>
|
|
17
|
+
// violations: Array<{ gate: string; ... }>
|
|
18
|
+
// waivers?: { active: number; applied: number; details: ... }
|
|
19
|
+
// performance?: { total_execution_time_ms?: number; ... }
|
|
20
|
+
// }
|
|
21
|
+
//
|
|
22
|
+
// Anything else is rejected. The contract is intentionally tighter than the
|
|
23
|
+
// subprocess's actual payload — the command should only consume fields it
|
|
24
|
+
// has validated.
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.validateGatesReport = validateGatesReport;
|
|
27
|
+
const caws_kernel_1 = require("@paths.design/caws-kernel");
|
|
28
|
+
const rules_1 = require("../rules");
|
|
29
|
+
function diag(rule, message, data) {
|
|
30
|
+
const base = {
|
|
31
|
+
rule,
|
|
32
|
+
authority: 'kernel/diagnostics',
|
|
33
|
+
severity: 'error',
|
|
34
|
+
message,
|
|
35
|
+
};
|
|
36
|
+
return data !== undefined ? { ...base, data } : base;
|
|
37
|
+
}
|
|
38
|
+
function isObject(v) {
|
|
39
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
40
|
+
}
|
|
41
|
+
function validateViolation(value, idx) {
|
|
42
|
+
if (!isObject(value)) {
|
|
43
|
+
return (0, caws_kernel_1.err)(diag(rules_1.SHELL_RULES.GATES_REPORT_INVALID_SHAPE, `violations[${idx}] is not an object.`, { index: idx }));
|
|
44
|
+
}
|
|
45
|
+
if (typeof value['gate'] !== 'string' || value['gate'].length === 0) {
|
|
46
|
+
return (0, caws_kernel_1.err)(diag(rules_1.SHELL_RULES.GATES_REPORT_INVALID_SHAPE, `violations[${idx}] is missing required string field 'gate'.`, { index: idx }));
|
|
47
|
+
}
|
|
48
|
+
const out = { gate: value['gate'] };
|
|
49
|
+
if (typeof value['type'] === 'string')
|
|
50
|
+
out.type = value['type'];
|
|
51
|
+
if (typeof value['message'] === 'string')
|
|
52
|
+
out.message = value['message'];
|
|
53
|
+
if (typeof value['file'] === 'string')
|
|
54
|
+
out.file = value['file'];
|
|
55
|
+
if (typeof value['line'] === 'number')
|
|
56
|
+
out.line = value['line'];
|
|
57
|
+
if (typeof value['rule'] === 'string')
|
|
58
|
+
out.rule = value['rule'];
|
|
59
|
+
if (typeof value['severity'] === 'string')
|
|
60
|
+
out.severity = value['severity'];
|
|
61
|
+
return (0, caws_kernel_1.ok)(out);
|
|
62
|
+
}
|
|
63
|
+
function validateWarning(value, idx) {
|
|
64
|
+
if (!isObject(value)) {
|
|
65
|
+
return (0, caws_kernel_1.err)(diag(rules_1.SHELL_RULES.GATES_REPORT_INVALID_SHAPE, `warnings[${idx}] is not an object.`, { index: idx }));
|
|
66
|
+
}
|
|
67
|
+
const out = {};
|
|
68
|
+
if (typeof value['gate'] === 'string')
|
|
69
|
+
out.gate = value['gate'];
|
|
70
|
+
if (typeof value['type'] === 'string')
|
|
71
|
+
out.type = value['type'];
|
|
72
|
+
if (typeof value['message'] === 'string')
|
|
73
|
+
out.message = value['message'];
|
|
74
|
+
return (0, caws_kernel_1.ok)(out);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Parse + validate the subprocess JSON. Returns Ok(GatesReport) only when
|
|
78
|
+
* EVERY required field is present and well-typed. Returns Err with a
|
|
79
|
+
* specific shell.gates.* rule otherwise. Never throws on bad input.
|
|
80
|
+
*/
|
|
81
|
+
function validateGatesReport(raw) {
|
|
82
|
+
let parsed;
|
|
83
|
+
try {
|
|
84
|
+
parsed = JSON.parse(raw);
|
|
85
|
+
}
|
|
86
|
+
catch (e) {
|
|
87
|
+
return (0, caws_kernel_1.err)(diag(rules_1.SHELL_RULES.GATES_REPORT_NOT_JSON, `quality-gates output is not valid JSON: ${e.message}`));
|
|
88
|
+
}
|
|
89
|
+
if (!isObject(parsed)) {
|
|
90
|
+
return (0, caws_kernel_1.err)(diag(rules_1.SHELL_RULES.GATES_REPORT_INVALID_SHAPE, 'quality-gates output is not a JSON object.'));
|
|
91
|
+
}
|
|
92
|
+
if (typeof parsed['timestamp'] !== 'string') {
|
|
93
|
+
return (0, caws_kernel_1.err)(diag(rules_1.SHELL_RULES.GATES_REPORT_INVALID_SHAPE, 'quality-gates output missing required string field `timestamp`.'));
|
|
94
|
+
}
|
|
95
|
+
if (typeof parsed['context'] !== 'string') {
|
|
96
|
+
return (0, caws_kernel_1.err)(diag(rules_1.SHELL_RULES.GATES_REPORT_INVALID_SHAPE, 'quality-gates output missing required string field `context`.'));
|
|
97
|
+
}
|
|
98
|
+
if (typeof parsed['files_scoped'] !== 'number') {
|
|
99
|
+
return (0, caws_kernel_1.err)(diag(rules_1.SHELL_RULES.GATES_REPORT_INVALID_SHAPE, 'quality-gates output missing required number field `files_scoped`.'));
|
|
100
|
+
}
|
|
101
|
+
const rawViolations = parsed['violations'];
|
|
102
|
+
if (!Array.isArray(rawViolations)) {
|
|
103
|
+
return (0, caws_kernel_1.err)(diag(rules_1.SHELL_RULES.GATES_REPORT_INVALID_SHAPE, 'quality-gates output missing required array field `violations`.'));
|
|
104
|
+
}
|
|
105
|
+
const violations = [];
|
|
106
|
+
for (let i = 0; i < rawViolations.length; i++) {
|
|
107
|
+
const r = validateViolation(rawViolations[i], i);
|
|
108
|
+
if (!r.ok)
|
|
109
|
+
return r;
|
|
110
|
+
violations.push(r.value);
|
|
111
|
+
}
|
|
112
|
+
const rawWarnings = parsed['warnings'];
|
|
113
|
+
if (!Array.isArray(rawWarnings)) {
|
|
114
|
+
return (0, caws_kernel_1.err)(diag(rules_1.SHELL_RULES.GATES_REPORT_INVALID_SHAPE, 'quality-gates output missing required array field `warnings`.'));
|
|
115
|
+
}
|
|
116
|
+
const warnings = [];
|
|
117
|
+
for (let i = 0; i < rawWarnings.length; i++) {
|
|
118
|
+
const r = validateWarning(rawWarnings[i], i);
|
|
119
|
+
if (!r.ok)
|
|
120
|
+
return r;
|
|
121
|
+
warnings.push(r.value);
|
|
122
|
+
}
|
|
123
|
+
const out = {
|
|
124
|
+
timestamp: parsed['timestamp'],
|
|
125
|
+
context: parsed['context'],
|
|
126
|
+
files_scoped: parsed['files_scoped'],
|
|
127
|
+
warnings,
|
|
128
|
+
violations,
|
|
129
|
+
};
|
|
130
|
+
// Optional fields — defensive: accept if shaped right, ignore otherwise.
|
|
131
|
+
if (isObject(parsed['waivers'])) {
|
|
132
|
+
const w = parsed['waivers'];
|
|
133
|
+
if (typeof w['active'] === 'number' && typeof w['applied'] === 'number') {
|
|
134
|
+
out.waivers = {
|
|
135
|
+
active: w['active'],
|
|
136
|
+
applied: w['applied'],
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
if (isObject(parsed['performance'])) {
|
|
141
|
+
const p = parsed['performance'];
|
|
142
|
+
if (typeof p['total_execution_time_ms'] === 'number') {
|
|
143
|
+
out.performance = {
|
|
144
|
+
total_execution_time_ms: p['total_execution_time_ms'],
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return (0, caws_kernel_1.ok)(out);
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=gate-result-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate-result-contract.js","sourceRoot":"","sources":["../../../src/shell/gates/gate-result-contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { type Result } from '@paths.design/caws-kernel';
|
|
2
|
+
import { type GatesReport } from './gate-result-contract';
|
|
3
|
+
/**
|
|
4
|
+
* Pure resolver: given the CLI install directory and the consumer project
|
|
5
|
+
* cwd, decide which on-disk path to spawn. Walks up from each starting
|
|
6
|
+
* point looking for `node_modules/.bin/<BIN_NAME>`.
|
|
7
|
+
*
|
|
8
|
+
* Resolution order (documented per CLI-GATES-003 A4):
|
|
9
|
+
* 1. CLI-install-local — walk up from cliDir. This wins when caws-cli is
|
|
10
|
+
* installed globally or in a separate sandbox: caws-quality-gates
|
|
11
|
+
* ships as a runtime dep of caws-cli, so it lives beside the caws
|
|
12
|
+
* binary, not beside the consumer project.
|
|
13
|
+
* 2. Project-local — walk up from projectCwd. Preserves the prior
|
|
14
|
+
* behavior for the project-local install pattern (CLI-GATES-002 A1).
|
|
15
|
+
*
|
|
16
|
+
* The CLI-install-local check wins when both exist. That ordering is by
|
|
17
|
+
* design: a global caws install was a deliberate choice to use one CLI
|
|
18
|
+
* version everywhere, and we want that single subprocess version too —
|
|
19
|
+
* not whatever happens to be in the consumer's node_modules from an older
|
|
20
|
+
* project-local install.
|
|
21
|
+
*
|
|
22
|
+
* Returns the resolved path on success, or { tried: string[] } so the
|
|
23
|
+
* adapter can surface both attempted paths in the GATES_SUBPROCESS_NOT_FOUND
|
|
24
|
+
* diagnostic.
|
|
25
|
+
*/
|
|
26
|
+
export declare function resolveQualityGatesBin(cliDir: string, projectCwd: string, fsCheck?: (p: string) => boolean): {
|
|
27
|
+
resolved: string;
|
|
28
|
+
source: 'cli-local' | 'project-local';
|
|
29
|
+
} | {
|
|
30
|
+
tried: string[];
|
|
31
|
+
};
|
|
32
|
+
export interface SubprocessResult {
|
|
33
|
+
/** Exit code of the subprocess. */
|
|
34
|
+
readonly status: number | null;
|
|
35
|
+
/** stdout captured as UTF-8. */
|
|
36
|
+
readonly stdout: string;
|
|
37
|
+
/** stderr captured as UTF-8. */
|
|
38
|
+
readonly stderr: string;
|
|
39
|
+
/** Any error thrown by the spawn itself (ENOENT, etc.). */
|
|
40
|
+
readonly error?: Error;
|
|
41
|
+
}
|
|
42
|
+
export interface QualityGatesRunnerInput {
|
|
43
|
+
readonly cwd: string;
|
|
44
|
+
/** Extra CLI args after `--json` (e.g. ['--context=cli', '--quiet']). */
|
|
45
|
+
readonly args: readonly string[];
|
|
46
|
+
}
|
|
47
|
+
export type QualityGatesRunner = (input: QualityGatesRunnerInput) => SubprocessResult;
|
|
48
|
+
export interface RunQualityGatesOptions {
|
|
49
|
+
readonly cwd: string;
|
|
50
|
+
readonly args?: readonly string[];
|
|
51
|
+
/** Inject a custom runner. Tests use this; production omits. */
|
|
52
|
+
readonly runner?: QualityGatesRunner;
|
|
53
|
+
}
|
|
54
|
+
export declare function runQualityGates(opts: RunQualityGatesOptions): Result<GatesReport>;
|
|
55
|
+
//# sourceMappingURL=quality-gates-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality-gates-adapter.d.ts","sourceRoot":"","sources":["../../../src/shell/gates/quality-gates-adapter.ts"],"names":[],"mappings":"AAmBA,OAAO,EAA4B,KAAK,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAGlF,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAI/E;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAuB,GAC9C;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,eAAe,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAmBnF;AAED,MAAM,WAAW,gBAAgB;IAC/B,mCAAmC;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,gCAAgC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,gCAAgC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,2DAA2D;IAC3D,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;CACxB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,yEAAyE;IACzE,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAED,MAAM,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,uBAAuB,KAAK,gBAAgB,CAAC;AAgDtF,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,gEAAgE;IAChE,QAAQ,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC;CACtC;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,sBAAsB,GAAG,MAAM,CAAC,WAAW,CAAC,CAqCjF"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Adapter for the `caws-quality-gates` subprocess.
|
|
3
|
+
//
|
|
4
|
+
// Single responsibility: invoke the subprocess in `--json` mode, capture
|
|
5
|
+
// stdout, validate the JSON shape against `gate-result-contract`, and
|
|
6
|
+
// return Ok(GatesReport) or Err(diagnostic).
|
|
7
|
+
//
|
|
8
|
+
// What this adapter does NOT do:
|
|
9
|
+
// - it does not interpret violations
|
|
10
|
+
// - it does not decide pass/fail/skip
|
|
11
|
+
// - it does not append events
|
|
12
|
+
// - it does not write to any file
|
|
13
|
+
//
|
|
14
|
+
// The runner is pluggable so tests can inject canned JSON without spawning
|
|
15
|
+
// real subprocesses. Production uses a default child_process runner.
|
|
16
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
19
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
20
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
21
|
+
}
|
|
22
|
+
Object.defineProperty(o, k2, desc);
|
|
23
|
+
}) : (function(o, m, k, k2) {
|
|
24
|
+
if (k2 === undefined) k2 = k;
|
|
25
|
+
o[k2] = m[k];
|
|
26
|
+
}));
|
|
27
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
28
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
29
|
+
}) : function(o, v) {
|
|
30
|
+
o["default"] = v;
|
|
31
|
+
});
|
|
32
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
33
|
+
var ownKeys = function(o) {
|
|
34
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
35
|
+
var ar = [];
|
|
36
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
37
|
+
return ar;
|
|
38
|
+
};
|
|
39
|
+
return ownKeys(o);
|
|
40
|
+
};
|
|
41
|
+
return function (mod) {
|
|
42
|
+
if (mod && mod.__esModule) return mod;
|
|
43
|
+
var result = {};
|
|
44
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
45
|
+
__setModuleDefault(result, mod);
|
|
46
|
+
return result;
|
|
47
|
+
};
|
|
48
|
+
})();
|
|
49
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
|
+
exports.resolveQualityGatesBin = resolveQualityGatesBin;
|
|
51
|
+
exports.runQualityGates = runQualityGates;
|
|
52
|
+
const fs = __importStar(require("node:fs"));
|
|
53
|
+
const path = __importStar(require("node:path"));
|
|
54
|
+
const node_child_process_1 = require("node:child_process");
|
|
55
|
+
const caws_kernel_1 = require("@paths.design/caws-kernel");
|
|
56
|
+
const rules_1 = require("../rules");
|
|
57
|
+
const gate_result_contract_1 = require("./gate-result-contract");
|
|
58
|
+
const BIN_NAME = 'caws-quality-gates';
|
|
59
|
+
/**
|
|
60
|
+
* Pure resolver: given the CLI install directory and the consumer project
|
|
61
|
+
* cwd, decide which on-disk path to spawn. Walks up from each starting
|
|
62
|
+
* point looking for `node_modules/.bin/<BIN_NAME>`.
|
|
63
|
+
*
|
|
64
|
+
* Resolution order (documented per CLI-GATES-003 A4):
|
|
65
|
+
* 1. CLI-install-local — walk up from cliDir. This wins when caws-cli is
|
|
66
|
+
* installed globally or in a separate sandbox: caws-quality-gates
|
|
67
|
+
* ships as a runtime dep of caws-cli, so it lives beside the caws
|
|
68
|
+
* binary, not beside the consumer project.
|
|
69
|
+
* 2. Project-local — walk up from projectCwd. Preserves the prior
|
|
70
|
+
* behavior for the project-local install pattern (CLI-GATES-002 A1).
|
|
71
|
+
*
|
|
72
|
+
* The CLI-install-local check wins when both exist. That ordering is by
|
|
73
|
+
* design: a global caws install was a deliberate choice to use one CLI
|
|
74
|
+
* version everywhere, and we want that single subprocess version too —
|
|
75
|
+
* not whatever happens to be in the consumer's node_modules from an older
|
|
76
|
+
* project-local install.
|
|
77
|
+
*
|
|
78
|
+
* Returns the resolved path on success, or { tried: string[] } so the
|
|
79
|
+
* adapter can surface both attempted paths in the GATES_SUBPROCESS_NOT_FOUND
|
|
80
|
+
* diagnostic.
|
|
81
|
+
*/
|
|
82
|
+
function resolveQualityGatesBin(cliDir, projectCwd, fsCheck = fs.existsSync) {
|
|
83
|
+
const tried = [];
|
|
84
|
+
for (const [source, start] of [
|
|
85
|
+
['cli-local', cliDir],
|
|
86
|
+
['project-local', projectCwd],
|
|
87
|
+
]) {
|
|
88
|
+
let dir = path.resolve(start);
|
|
89
|
+
while (true) {
|
|
90
|
+
const candidate = path.join(dir, 'node_modules', '.bin', BIN_NAME);
|
|
91
|
+
tried.push(candidate);
|
|
92
|
+
if (fsCheck(candidate)) {
|
|
93
|
+
return { resolved: candidate, source };
|
|
94
|
+
}
|
|
95
|
+
const parent = path.dirname(dir);
|
|
96
|
+
if (parent === dir)
|
|
97
|
+
break;
|
|
98
|
+
dir = parent;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return { tried };
|
|
102
|
+
}
|
|
103
|
+
function diag(rule, message, data) {
|
|
104
|
+
const base = {
|
|
105
|
+
rule,
|
|
106
|
+
authority: 'kernel/diagnostics',
|
|
107
|
+
severity: 'error',
|
|
108
|
+
message,
|
|
109
|
+
};
|
|
110
|
+
return data !== undefined ? { ...base, data } : base;
|
|
111
|
+
}
|
|
112
|
+
function defaultRunner(input) {
|
|
113
|
+
// CLI-GATES-003: resolve the subprocess from the installed CLI package
|
|
114
|
+
// location first (covers global / sandboxed install), then fall back to
|
|
115
|
+
// the consumer project (covers project-local install — CLI-GATES-002 A1).
|
|
116
|
+
// No PATH fallback — explicit failure beats a hijacked binary.
|
|
117
|
+
//
|
|
118
|
+
// Spawn cwd stays as input.cwd (CLI-GATES-003 A3): the analyzed files
|
|
119
|
+
// come from the consumer project, never from the CLI's install dir.
|
|
120
|
+
const resolution = resolveQualityGatesBin(__dirname, input.cwd);
|
|
121
|
+
if ('tried' in resolution) {
|
|
122
|
+
return {
|
|
123
|
+
status: null,
|
|
124
|
+
stdout: '',
|
|
125
|
+
stderr: '',
|
|
126
|
+
error: Object.assign(new Error(`caws-quality-gates not found. Tried ${resolution.tried.length} location(s): ${resolution.tried.join(', ')}`), { code: 'ENOENT' }),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
const r = (0, node_child_process_1.spawnSync)(resolution.resolved, ['--json', ...input.args], { cwd: input.cwd, encoding: 'utf8' });
|
|
130
|
+
const out = {
|
|
131
|
+
status: r.status,
|
|
132
|
+
stdout: typeof r.stdout === 'string' ? r.stdout : '',
|
|
133
|
+
stderr: typeof r.stderr === 'string' ? r.stderr : '',
|
|
134
|
+
...(r.error !== undefined ? { error: r.error } : {}),
|
|
135
|
+
};
|
|
136
|
+
return out;
|
|
137
|
+
}
|
|
138
|
+
function runQualityGates(opts) {
|
|
139
|
+
const runner = opts.runner ?? defaultRunner;
|
|
140
|
+
const result = runner({ cwd: opts.cwd, args: opts.args ?? [] });
|
|
141
|
+
// Subprocess could not be spawned (ENOENT, permission, etc.).
|
|
142
|
+
if (result.error !== undefined) {
|
|
143
|
+
return (0, caws_kernel_1.err)(diag(rules_1.SHELL_RULES.GATES_SUBPROCESS_NOT_FOUND, `Failed to spawn caws-quality-gates: ${result.error.message}`, { errno: result.error.code }));
|
|
144
|
+
}
|
|
145
|
+
// Nonzero exit is acceptable IF we still got valid JSON: violations
|
|
146
|
+
// routinely produce nonzero exit. We do NOT treat exit code as the
|
|
147
|
+
// disposition source — policy does. But if the subprocess didn't
|
|
148
|
+
// produce JSON at all, that's an integration failure.
|
|
149
|
+
if (result.stdout.trim().length === 0) {
|
|
150
|
+
return (0, caws_kernel_1.err)(diag(rules_1.SHELL_RULES.GATES_SUBPROCESS_FAILED, `caws-quality-gates produced no stdout (exit=${result.status}).`, {
|
|
151
|
+
exit: result.status,
|
|
152
|
+
stderr: result.stderr.slice(0, 4000),
|
|
153
|
+
}));
|
|
154
|
+
}
|
|
155
|
+
// Validate the JSON shape before trusting it. This is the contract gate.
|
|
156
|
+
const reportResult = (0, gate_result_contract_1.validateGatesReport)(result.stdout);
|
|
157
|
+
if (!reportResult.ok)
|
|
158
|
+
return reportResult;
|
|
159
|
+
return (0, caws_kernel_1.ok)(reportResult.value);
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=quality-gates-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality-gates-adapter.js","sourceRoot":"","sources":["../../../src/shell/gates/quality-gates-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { type Waiver } from '@paths.design/caws-kernel';
|
|
2
|
+
import type { GatesReport } from './gate-result-contract';
|
|
3
|
+
export interface WaiverFilterInput {
|
|
4
|
+
readonly report: GatesReport;
|
|
5
|
+
readonly waivers: readonly Waiver[];
|
|
6
|
+
readonly specId: string;
|
|
7
|
+
readonly now: Date;
|
|
8
|
+
/**
|
|
9
|
+
* Gate ids the policy declares. Violations targeting any other gate
|
|
10
|
+
* pass through the filter unmodified — waivers MUST NOT promote an
|
|
11
|
+
* unmatched (subprocess-only) violation to a policy-suppressed state,
|
|
12
|
+
* because policy doesn't own that gate. Treating waivers as scoped to
|
|
13
|
+
* policy-declared gates keeps the unmatched bucket purely
|
|
14
|
+
* observational, which is the contract `deriveDispositions` relies on.
|
|
15
|
+
*
|
|
16
|
+
* If omitted, every gate is considered policy-declared (legacy / test
|
|
17
|
+
* convenience). Production callers should always pass this.
|
|
18
|
+
*/
|
|
19
|
+
readonly policyGateIds?: readonly string[];
|
|
20
|
+
}
|
|
21
|
+
export interface WaiverEvidence {
|
|
22
|
+
/** Number of violations on this gate that an effective waiver suppressed. */
|
|
23
|
+
readonly waived_count: number;
|
|
24
|
+
/** Stable ids of the waivers credited with the suppression, deduped + sorted. */
|
|
25
|
+
readonly waiver_ids: readonly string[];
|
|
26
|
+
}
|
|
27
|
+
export interface WaiverFilterResult {
|
|
28
|
+
/**
|
|
29
|
+
* The same report shape, but with `violations` reduced to those NOT
|
|
30
|
+
* suppressed by an effective waiver. `warnings`, `timestamp`,
|
|
31
|
+
* `context`, `files_scoped`, and the optional `waivers` / `performance`
|
|
32
|
+
* blocks are passed through unchanged.
|
|
33
|
+
*/
|
|
34
|
+
readonly reportForDisposition: GatesReport;
|
|
35
|
+
/**
|
|
36
|
+
* Per-gate evidence keyed by the violation's `gate` field. Only gates
|
|
37
|
+
* that actually had at least one suppression appear here. Gates with
|
|
38
|
+
* zero suppressions are intentionally omitted: callers should default
|
|
39
|
+
* them to `{ waived_count: 0, waiver_ids: [] }` if they need a uniform
|
|
40
|
+
* shape, but the canonical form is "absent means zero".
|
|
41
|
+
*/
|
|
42
|
+
readonly waivedByGate: Readonly<Record<string, WaiverEvidence>>;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Filter `report.violations` against the supplied effective waivers.
|
|
46
|
+
*
|
|
47
|
+
* For each violation:
|
|
48
|
+
* - look up the effective waivers for that violation's gate (kernel call)
|
|
49
|
+
* - if any are effective, the violation is suppressed and the waivers'
|
|
50
|
+
* ids are recorded as evidence on that gate's bucket
|
|
51
|
+
* - if none are effective, the violation passes through unchanged
|
|
52
|
+
*
|
|
53
|
+
* The kernel's effectiveness rule (active && not expired && gate matches
|
|
54
|
+
* && (no spec_id OR matches input.specId)) is the only applicability
|
|
55
|
+
* decision. Path scoping is not consulted (see file header).
|
|
56
|
+
*/
|
|
57
|
+
export declare function filterWaivedViolations(input: WaiverFilterInput): WaiverFilterResult;
|
|
58
|
+
//# sourceMappingURL=waiver-filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"waiver-filter.d.ts","sourceRoot":"","sources":["../../../src/shell/gates/waiver-filter.ts"],"names":[],"mappings":"AAiCA,OAAO,EAEL,KAAK,MAAM,EACZ,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,wBAAwB,CAAC;AAE1E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;IACnB;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5C;AAED,MAAM,WAAW,cAAc;IAC7B,6EAA6E;IAC7E,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,iFAAiF;IACjF,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,kBAAkB;IACjC;;;;;OAKG;IACH,QAAQ,CAAC,oBAAoB,EAAE,WAAW,CAAC;IAC3C;;;;;;OAMG;IACH,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;CACjE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,iBAAiB,GACvB,kBAAkB,CAuEpB"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Waiver filter — shell-level helper that removes effective-waiver-suppressed
|
|
3
|
+
// violations from a GatesReport before disposition.
|
|
4
|
+
//
|
|
5
|
+
// Discipline:
|
|
6
|
+
//
|
|
7
|
+
// 1. This helper does NOT mutate `policy.gates[gate].mode`. A waived
|
|
8
|
+
// violation is removed from the blocking calculation, but the gate's
|
|
9
|
+
// block/warn/skip meaning still comes only from policy. After filtering,
|
|
10
|
+
// `deriveDispositions(filteredReport, policy)` is run unchanged.
|
|
11
|
+
//
|
|
12
|
+
// 2. Applicability is delegated to the kernel
|
|
13
|
+
// (`effectiveWaiversForGate`) so kernel rules stay the single source
|
|
14
|
+
// of truth. The shell only knows: "given the per-gate effective
|
|
15
|
+
// waivers, drop the violations that match this gate."
|
|
16
|
+
//
|
|
17
|
+
// 3. Path scoping (`scope.paths`) is intentionally absent. The kernel
|
|
18
|
+
// type does not include it. Doing it half-way here would be worse
|
|
19
|
+
// than deferring it to a later slice.
|
|
20
|
+
//
|
|
21
|
+
// 4. The "violation matched this gate" rule is the same as
|
|
22
|
+
// `deriveDispositions`'s grouping rule: violations whose `gate`
|
|
23
|
+
// field equals a gate in the waiver's `gates` list. We do NOT use
|
|
24
|
+
// the violation's `severity` field for matching — policy and waivers
|
|
25
|
+
// are both gate-level constructs in this slice; per-violation
|
|
26
|
+
// identity (e.g. by rule + subject) is not yet a thing waivers
|
|
27
|
+
// address.
|
|
28
|
+
//
|
|
29
|
+
// 5. Subprocess "unmatched" gates (gates the subprocess reports but
|
|
30
|
+
// policy doesn't declare) are never waiver-suppressed: waivers
|
|
31
|
+
// filter violations that policy can act on, and unmatched gates
|
|
32
|
+
// are observational by construction. Leaving them untouched here
|
|
33
|
+
// preserves the existing `unmatchedViolations` surface.
|
|
34
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
|
+
exports.filterWaivedViolations = filterWaivedViolations;
|
|
36
|
+
const caws_kernel_1 = require("@paths.design/caws-kernel");
|
|
37
|
+
/**
|
|
38
|
+
* Filter `report.violations` against the supplied effective waivers.
|
|
39
|
+
*
|
|
40
|
+
* For each violation:
|
|
41
|
+
* - look up the effective waivers for that violation's gate (kernel call)
|
|
42
|
+
* - if any are effective, the violation is suppressed and the waivers'
|
|
43
|
+
* ids are recorded as evidence on that gate's bucket
|
|
44
|
+
* - if none are effective, the violation passes through unchanged
|
|
45
|
+
*
|
|
46
|
+
* The kernel's effectiveness rule (active && not expired && gate matches
|
|
47
|
+
* && (no spec_id OR matches input.specId)) is the only applicability
|
|
48
|
+
* decision. Path scoping is not consulted (see file header).
|
|
49
|
+
*/
|
|
50
|
+
function filterWaivedViolations(input) {
|
|
51
|
+
// Per-gate effective waivers, computed lazily so we don't pay the cost
|
|
52
|
+
// for gates that have no violations in this report.
|
|
53
|
+
const effectiveByGate = new Map();
|
|
54
|
+
const policyGateSet = input.policyGateIds === undefined
|
|
55
|
+
? undefined
|
|
56
|
+
: new Set(input.policyGateIds);
|
|
57
|
+
function effectiveFor(gate) {
|
|
58
|
+
// Waivers only touch policy-declared gates. An unmatched (subprocess-
|
|
59
|
+
// only) violation is observational by construction; letting waivers
|
|
60
|
+
// suppress it would break that contract and confuse the unmatched
|
|
61
|
+
// surface in `deriveDispositions`.
|
|
62
|
+
if (policyGateSet !== undefined && !policyGateSet.has(gate)) {
|
|
63
|
+
return [];
|
|
64
|
+
}
|
|
65
|
+
const cached = effectiveByGate.get(gate);
|
|
66
|
+
if (cached !== undefined)
|
|
67
|
+
return cached;
|
|
68
|
+
const computed = (0, caws_kernel_1.effectiveWaiversForGate)({
|
|
69
|
+
waivers: input.waivers,
|
|
70
|
+
gate,
|
|
71
|
+
specId: input.specId,
|
|
72
|
+
now: input.now,
|
|
73
|
+
});
|
|
74
|
+
effectiveByGate.set(gate, computed);
|
|
75
|
+
return computed;
|
|
76
|
+
}
|
|
77
|
+
const survivors = [];
|
|
78
|
+
const evidenceByGate = new Map();
|
|
79
|
+
for (const v of input.report.violations) {
|
|
80
|
+
const effective = effectiveFor(v.gate);
|
|
81
|
+
if (effective.length === 0) {
|
|
82
|
+
survivors.push(v);
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
// Suppressed. Credit every effective waiver — overlapping coverage is
|
|
86
|
+
// fine; the audit record names every authorized exception.
|
|
87
|
+
let bucket = evidenceByGate.get(v.gate);
|
|
88
|
+
if (bucket === undefined) {
|
|
89
|
+
bucket = new Set();
|
|
90
|
+
evidenceByGate.set(v.gate, bucket);
|
|
91
|
+
}
|
|
92
|
+
for (const w of effective)
|
|
93
|
+
bucket.add(w.id);
|
|
94
|
+
}
|
|
95
|
+
const waivedByGate = {};
|
|
96
|
+
for (const [gate, ids] of evidenceByGate) {
|
|
97
|
+
const sorted = Array.from(ids).sort();
|
|
98
|
+
// waived_count counts violations on this gate that were suppressed,
|
|
99
|
+
// not waivers credited. Recompute by re-walking; cheaper than carrying
|
|
100
|
+
// a parallel counter and keeps the meaning explicit.
|
|
101
|
+
let count = 0;
|
|
102
|
+
for (const v of input.report.violations) {
|
|
103
|
+
if (v.gate !== gate)
|
|
104
|
+
continue;
|
|
105
|
+
if (effectiveFor(v.gate).length > 0)
|
|
106
|
+
count++;
|
|
107
|
+
}
|
|
108
|
+
waivedByGate[gate] = {
|
|
109
|
+
waived_count: count,
|
|
110
|
+
waiver_ids: sorted,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
const reportForDisposition = {
|
|
114
|
+
...input.report,
|
|
115
|
+
violations: survivors,
|
|
116
|
+
};
|
|
117
|
+
return { reportForDisposition, waivedByGate };
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=waiver-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"waiver-filter.js","sourceRoot":"","sources":["../../../src/shell/gates/waiver-filter.ts"],"names":[],"mappings":"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"}
|