@paths.design/caws-cli 10.1.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 -756
- 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/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 -1448
- package/dist/commands/status.js +0 -1151
- 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 -386
- 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 -93
- 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 -465
- 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 -112
- 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 -83
- 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 -174
- package/dist/templates/COMMIT_CONVENTIONS.md +0 -86
- package/dist/templates/OIDC_SETUP.md +0 -300
- package/dist/templates/agents.md +0 -145
- 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-session.js +0 -202
- 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 -921
- package/dist/waivers-manager.js +0 -732
- package/dist/worktree/worktree-manager.js +0 -1374
- package/templates/.caws/schemas/policy.schema.json +0 -112
- 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 -83
- 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 -174
- package/templates/COMMIT_CONVENTIONS.md +0 -86
- package/templates/OIDC_SETUP.md +0 -300
- package/templates/agents.md +0 -145
- 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
|
@@ -1,419 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Spec File Manager - WorkingSpec ↔ YAML conversion and file management
|
|
3
|
-
* Handles conversion between JavaScript WorkingSpec objects and YAML files,
|
|
4
|
-
* manages .caws/working-spec.yaml lifecycle, and provides temporary file utilities.
|
|
5
|
-
* Ported from agent-agency v2 CAWS integration patterns.
|
|
6
|
-
* @author @darianrosebrook
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
const fs = require('fs-extra');
|
|
10
|
-
const path = require('path');
|
|
11
|
-
const yaml = require('js-yaml');
|
|
12
|
-
const os = require('os');
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Spec File Manager - Handles WorkingSpec file operations and YAML conversion
|
|
16
|
-
*
|
|
17
|
-
* Features:
|
|
18
|
-
* - Bidirectional WorkingSpec ↔ YAML conversion
|
|
19
|
-
* - Temporary file support for validation workflows
|
|
20
|
-
* - Backup/restore capabilities
|
|
21
|
-
* - Automatic cleanup of old temporary files
|
|
22
|
-
*/
|
|
23
|
-
class SpecFileManager {
|
|
24
|
-
constructor(config = {}) {
|
|
25
|
-
this.projectRoot = config.projectRoot || process.cwd();
|
|
26
|
-
this.useTemporaryFiles = config.useTemporaryFiles ?? false;
|
|
27
|
-
this.tempDir = config.tempDir || os.tmpdir();
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Convert WorkingSpec object to YAML string
|
|
32
|
-
*
|
|
33
|
-
* @param {Object} spec - WorkingSpec to convert
|
|
34
|
-
* @returns {string} YAML string representation
|
|
35
|
-
*/
|
|
36
|
-
specToYaml(spec) {
|
|
37
|
-
return yaml.dump(spec, {
|
|
38
|
-
indent: 2,
|
|
39
|
-
lineWidth: 100,
|
|
40
|
-
noRefs: true,
|
|
41
|
-
sortKeys: false,
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Parse YAML string to WorkingSpec object
|
|
47
|
-
*
|
|
48
|
-
* @param {string} yamlContent - YAML string to parse
|
|
49
|
-
* @returns {Object} Parsed WorkingSpec object
|
|
50
|
-
* @throws {Error} If YAML is invalid or doesn't match WorkingSpec schema
|
|
51
|
-
*/
|
|
52
|
-
yamlToSpec(yamlContent) {
|
|
53
|
-
try {
|
|
54
|
-
const parsed = yaml.load(yamlContent);
|
|
55
|
-
|
|
56
|
-
// Basic validation
|
|
57
|
-
if (!parsed || typeof parsed !== 'object') {
|
|
58
|
-
throw new Error('Invalid YAML: not an object');
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
if (!parsed.id || !parsed.title || !parsed.risk_tier) {
|
|
62
|
-
throw new Error('Invalid WorkingSpec: missing required fields (id, title, risk_tier)');
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
return parsed;
|
|
66
|
-
} catch (error) {
|
|
67
|
-
throw new Error(`Failed to parse YAML: ${error.message}`);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Get path to .caws/working-spec.yaml in project
|
|
73
|
-
*
|
|
74
|
-
* @returns {string} Absolute path to working spec file
|
|
75
|
-
*/
|
|
76
|
-
getSpecFilePath() {
|
|
77
|
-
return path.join(this.projectRoot, '.caws', 'working-spec.yaml');
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Check if working spec file exists
|
|
82
|
-
*
|
|
83
|
-
* @returns {Promise<boolean>} True if file exists
|
|
84
|
-
*/
|
|
85
|
-
async specFileExists() {
|
|
86
|
-
try {
|
|
87
|
-
await fs.access(this.getSpecFilePath());
|
|
88
|
-
return true;
|
|
89
|
-
} catch {
|
|
90
|
-
return false;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Read working spec from .caws/working-spec.yaml
|
|
96
|
-
*
|
|
97
|
-
* @returns {Promise<Object>} Parsed WorkingSpec object
|
|
98
|
-
* @throws {Error} If file doesn't exist or is invalid
|
|
99
|
-
*/
|
|
100
|
-
async readSpecFile() {
|
|
101
|
-
const specPath = this.getSpecFilePath();
|
|
102
|
-
|
|
103
|
-
try {
|
|
104
|
-
const content = await fs.readFile(specPath, 'utf-8');
|
|
105
|
-
return this.yamlToSpec(content);
|
|
106
|
-
} catch (error) {
|
|
107
|
-
if (error.code === 'ENOENT') {
|
|
108
|
-
throw new Error(`Working spec not found: ${specPath}\nRun 'caws init' to create it`);
|
|
109
|
-
}
|
|
110
|
-
throw error;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* Write WorkingSpec to file
|
|
116
|
-
*
|
|
117
|
-
* Writes to .caws/working-spec.yaml or a temporary file based on configuration.
|
|
118
|
-
*
|
|
119
|
-
* @param {Object} spec - WorkingSpec to write
|
|
120
|
-
* @param {Object} options - Write options
|
|
121
|
-
* @param {boolean} options.useTemp - Override temp file usage
|
|
122
|
-
* @param {boolean} options.backup - Create backup before writing
|
|
123
|
-
* @returns {Promise<Object>} Write result with file path and cleanup function
|
|
124
|
-
*/
|
|
125
|
-
async writeSpecFile(spec, options = {}) {
|
|
126
|
-
const yamlContent = this.specToYaml(spec);
|
|
127
|
-
const useTemp = options.useTemp ?? this.useTemporaryFiles;
|
|
128
|
-
|
|
129
|
-
if (useTemp) {
|
|
130
|
-
// Write to temporary file
|
|
131
|
-
const tempPath = path.join(this.tempDir, `caws-spec-${spec.id || 'temp'}-${Date.now()}.yaml`);
|
|
132
|
-
|
|
133
|
-
await fs.writeFile(tempPath, yamlContent, 'utf-8');
|
|
134
|
-
|
|
135
|
-
return {
|
|
136
|
-
filePath: tempPath,
|
|
137
|
-
isTemporary: true,
|
|
138
|
-
cleanup: async () => {
|
|
139
|
-
try {
|
|
140
|
-
await fs.unlink(tempPath);
|
|
141
|
-
} catch {
|
|
142
|
-
// Ignore cleanup errors (file may already be deleted)
|
|
143
|
-
}
|
|
144
|
-
},
|
|
145
|
-
};
|
|
146
|
-
} else {
|
|
147
|
-
// Write to project .caws directory
|
|
148
|
-
const specPath = this.getSpecFilePath();
|
|
149
|
-
const cawsDir = path.dirname(specPath);
|
|
150
|
-
|
|
151
|
-
// Create backup if requested
|
|
152
|
-
if (options.backup && (await this.specFileExists())) {
|
|
153
|
-
await this.backupSpecFile();
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
// Ensure .caws directory exists
|
|
157
|
-
await fs.mkdir(cawsDir, { recursive: true });
|
|
158
|
-
|
|
159
|
-
await fs.writeFile(specPath, yamlContent, 'utf-8');
|
|
160
|
-
|
|
161
|
-
return {
|
|
162
|
-
filePath: specPath,
|
|
163
|
-
isTemporary: false,
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* Update existing working spec file
|
|
170
|
-
*
|
|
171
|
-
* Reads current spec, merges changes, and writes back.
|
|
172
|
-
*
|
|
173
|
-
* @param {Object} updates - Partial WorkingSpec with fields to update
|
|
174
|
-
* @returns {Promise<Object>} Updated WorkingSpec
|
|
175
|
-
*/
|
|
176
|
-
async updateSpecFile(updates) {
|
|
177
|
-
const currentSpec = await this.readSpecFile();
|
|
178
|
-
const updatedSpec = {
|
|
179
|
-
...currentSpec,
|
|
180
|
-
...updates,
|
|
181
|
-
};
|
|
182
|
-
|
|
183
|
-
// Always write to permanent location for updates
|
|
184
|
-
await this.writeSpecFile(updatedSpec, { useTemp: false });
|
|
185
|
-
|
|
186
|
-
return updatedSpec;
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* Create backup of working spec
|
|
191
|
-
*
|
|
192
|
-
* @returns {Promise<string>} Path to backup file
|
|
193
|
-
*/
|
|
194
|
-
async backupSpecFile() {
|
|
195
|
-
const specPath = this.getSpecFilePath();
|
|
196
|
-
const backupPath = `${specPath}.backup-${Date.now()}`;
|
|
197
|
-
|
|
198
|
-
await fs.copyFile(specPath, backupPath);
|
|
199
|
-
|
|
200
|
-
return backupPath;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
/**
|
|
204
|
-
* Restore working spec from backup
|
|
205
|
-
*
|
|
206
|
-
* @param {string} backupPath - Path to backup file
|
|
207
|
-
* @returns {Promise<void>}
|
|
208
|
-
*/
|
|
209
|
-
async restoreSpecFile(backupPath) {
|
|
210
|
-
const specPath = this.getSpecFilePath();
|
|
211
|
-
await fs.copyFile(backupPath, specPath);
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
/**
|
|
215
|
-
* List all backup files
|
|
216
|
-
*
|
|
217
|
-
* @returns {Promise<string[]>} Array of backup file paths
|
|
218
|
-
*/
|
|
219
|
-
async listBackups() {
|
|
220
|
-
const specPath = this.getSpecFilePath();
|
|
221
|
-
const cawsDir = path.dirname(specPath);
|
|
222
|
-
const specName = path.basename(specPath);
|
|
223
|
-
|
|
224
|
-
try {
|
|
225
|
-
const files = await fs.readdir(cawsDir);
|
|
226
|
-
const backups = files
|
|
227
|
-
.filter((f) => f.startsWith(`${specName}.backup-`))
|
|
228
|
-
.map((f) => path.join(cawsDir, f));
|
|
229
|
-
|
|
230
|
-
// Sort by timestamp (newest first)
|
|
231
|
-
backups.sort().reverse();
|
|
232
|
-
|
|
233
|
-
return backups;
|
|
234
|
-
} catch {
|
|
235
|
-
return [];
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
/**
|
|
240
|
-
* Delete old backup files
|
|
241
|
-
*
|
|
242
|
-
* @param {Object} options - Cleanup options
|
|
243
|
-
* @param {number} options.maxAge - Maximum age in milliseconds (default: 7 days)
|
|
244
|
-
* @param {number} options.keep - Minimum number of backups to keep (default: 5)
|
|
245
|
-
* @returns {Promise<number>} Number of backups deleted
|
|
246
|
-
*/
|
|
247
|
-
async cleanupBackups(options = {}) {
|
|
248
|
-
const maxAge = options.maxAge ?? 7 * 24 * 60 * 60 * 1000; // 7 days
|
|
249
|
-
const keepCount = options.keep ?? 5;
|
|
250
|
-
|
|
251
|
-
const backups = await this.listBackups();
|
|
252
|
-
const now = Date.now();
|
|
253
|
-
let deleted = 0;
|
|
254
|
-
|
|
255
|
-
// Delete old backups beyond the keep count
|
|
256
|
-
for (let i = 0; i < backups.length; i++) {
|
|
257
|
-
const backupPath = backups[i];
|
|
258
|
-
|
|
259
|
-
try {
|
|
260
|
-
const stats = await fs.stat(backupPath);
|
|
261
|
-
const age = now - stats.mtimeMs;
|
|
262
|
-
|
|
263
|
-
// Keep the most recent N backups, or delete if too old
|
|
264
|
-
const shouldDelete = i >= keepCount && age > maxAge;
|
|
265
|
-
|
|
266
|
-
if (shouldDelete) {
|
|
267
|
-
await fs.unlink(backupPath);
|
|
268
|
-
deleted++;
|
|
269
|
-
}
|
|
270
|
-
} catch {
|
|
271
|
-
// Skip files that can't be accessed
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
return deleted;
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
/**
|
|
279
|
-
* Validate spec file exists and is parseable
|
|
280
|
-
*
|
|
281
|
-
* @returns {Promise<Object>} Validation result
|
|
282
|
-
*/
|
|
283
|
-
async validateSpecFile() {
|
|
284
|
-
try {
|
|
285
|
-
const spec = await this.readSpecFile();
|
|
286
|
-
return {
|
|
287
|
-
valid: true,
|
|
288
|
-
spec,
|
|
289
|
-
};
|
|
290
|
-
} catch (error) {
|
|
291
|
-
return {
|
|
292
|
-
valid: false,
|
|
293
|
-
error: error.message,
|
|
294
|
-
};
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
/**
|
|
299
|
-
* Clean up old temporary spec files
|
|
300
|
-
*
|
|
301
|
-
* Removes temp files older than specified age.
|
|
302
|
-
*
|
|
303
|
-
* @param {number} maxAge - Maximum age in milliseconds (default: 1 hour)
|
|
304
|
-
* @returns {Promise<number>} Number of files cleaned up
|
|
305
|
-
*/
|
|
306
|
-
async cleanupTempFiles(maxAge = 3600000) {
|
|
307
|
-
try {
|
|
308
|
-
const files = await fs.readdir(this.tempDir);
|
|
309
|
-
const specFiles = files.filter((f) => f.startsWith('caws-spec-'));
|
|
310
|
-
|
|
311
|
-
let cleaned = 0;
|
|
312
|
-
const now = Date.now();
|
|
313
|
-
|
|
314
|
-
for (const file of specFiles) {
|
|
315
|
-
const filePath = path.join(this.tempDir, file);
|
|
316
|
-
try {
|
|
317
|
-
const stats = await fs.stat(filePath);
|
|
318
|
-
const age = now - stats.mtimeMs;
|
|
319
|
-
|
|
320
|
-
if (age > maxAge) {
|
|
321
|
-
await fs.unlink(filePath);
|
|
322
|
-
cleaned++;
|
|
323
|
-
}
|
|
324
|
-
} catch {
|
|
325
|
-
// Skip files that can't be accessed
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
return cleaned;
|
|
330
|
-
} catch {
|
|
331
|
-
return 0;
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
/**
|
|
336
|
-
* Get spec file stats (size, modified date, etc.)
|
|
337
|
-
*
|
|
338
|
-
* @returns {Promise<Object>} File stats
|
|
339
|
-
*/
|
|
340
|
-
async getSpecFileStats() {
|
|
341
|
-
const specPath = this.getSpecFilePath();
|
|
342
|
-
|
|
343
|
-
try {
|
|
344
|
-
const stats = await fs.stat(specPath);
|
|
345
|
-
const content = await fs.readFile(specPath, 'utf-8');
|
|
346
|
-
const lines = content.split('\n').length;
|
|
347
|
-
|
|
348
|
-
return {
|
|
349
|
-
exists: true,
|
|
350
|
-
size: stats.size,
|
|
351
|
-
sizeKB: Math.round((stats.size / 1024) * 10) / 10,
|
|
352
|
-
lines,
|
|
353
|
-
modified: stats.mtime,
|
|
354
|
-
created: stats.birthtime,
|
|
355
|
-
};
|
|
356
|
-
} catch (error) {
|
|
357
|
-
if (error.code === 'ENOENT') {
|
|
358
|
-
return {
|
|
359
|
-
exists: false,
|
|
360
|
-
};
|
|
361
|
-
}
|
|
362
|
-
throw error;
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
/**
|
|
367
|
-
* Create a new SpecFileManager instance with different configuration
|
|
368
|
-
*
|
|
369
|
-
* @param {Object} config - New configuration
|
|
370
|
-
* @returns {SpecFileManager} New instance
|
|
371
|
-
*/
|
|
372
|
-
withConfig(config) {
|
|
373
|
-
return new SpecFileManager({
|
|
374
|
-
projectRoot: this.projectRoot,
|
|
375
|
-
useTemporaryFiles: this.useTemporaryFiles,
|
|
376
|
-
tempDir: this.tempDir,
|
|
377
|
-
...config,
|
|
378
|
-
});
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
/**
|
|
383
|
-
* Create a SpecFileManager instance with default configuration
|
|
384
|
-
*
|
|
385
|
-
* @param {string} projectRoot - Project root directory
|
|
386
|
-
* @param {Object} options - Additional options
|
|
387
|
-
* @returns {SpecFileManager} SpecFileManager instance
|
|
388
|
-
*/
|
|
389
|
-
function createSpecFileManager(projectRoot, options = {}) {
|
|
390
|
-
return new SpecFileManager({
|
|
391
|
-
projectRoot,
|
|
392
|
-
...options,
|
|
393
|
-
});
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
// Export singleton instance for convenience
|
|
397
|
-
const defaultSpecFileManager = new SpecFileManager();
|
|
398
|
-
|
|
399
|
-
module.exports = {
|
|
400
|
-
SpecFileManager,
|
|
401
|
-
defaultSpecFileManager,
|
|
402
|
-
createSpecFileManager,
|
|
403
|
-
|
|
404
|
-
// Convenience exports for backward compatibility
|
|
405
|
-
specToYaml: (spec) => defaultSpecFileManager.specToYaml(spec),
|
|
406
|
-
yamlToSpec: (yaml) => defaultSpecFileManager.yamlToSpec(yaml),
|
|
407
|
-
readSpecFile: (projectRoot) => {
|
|
408
|
-
if (projectRoot) {
|
|
409
|
-
return createSpecFileManager(projectRoot).readSpecFile();
|
|
410
|
-
}
|
|
411
|
-
return defaultSpecFileManager.readSpecFile();
|
|
412
|
-
},
|
|
413
|
-
writeSpecFile: (spec, projectRoot, options) => {
|
|
414
|
-
if (projectRoot) {
|
|
415
|
-
return createSpecFileManager(projectRoot).writeSpecFile(spec, options);
|
|
416
|
-
}
|
|
417
|
-
return defaultSpecFileManager.writeSpecFile(spec, options);
|
|
418
|
-
},
|
|
419
|
-
};
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
-
"type": "object",
|
|
4
|
-
"required": [
|
|
5
|
-
"version",
|
|
6
|
-
"risk_tiers",
|
|
7
|
-
"edit_rules"
|
|
8
|
-
],
|
|
9
|
-
"properties": {
|
|
10
|
-
"version": {
|
|
11
|
-
"type": "integer",
|
|
12
|
-
"enum": [
|
|
13
|
-
1
|
|
14
|
-
],
|
|
15
|
-
"description": "Policy schema version"
|
|
16
|
-
},
|
|
17
|
-
"risk_tiers": {
|
|
18
|
-
"type": "object",
|
|
19
|
-
"patternProperties": {
|
|
20
|
-
"^[1-3]$": {
|
|
21
|
-
"type": "object",
|
|
22
|
-
"required": [
|
|
23
|
-
"max_files",
|
|
24
|
-
"max_loc"
|
|
25
|
-
],
|
|
26
|
-
"properties": {
|
|
27
|
-
"max_files": {
|
|
28
|
-
"type": "integer",
|
|
29
|
-
"minimum": 1,
|
|
30
|
-
"description": "Maximum files allowed for this risk tier"
|
|
31
|
-
},
|
|
32
|
-
"max_loc": {
|
|
33
|
-
"type": "integer",
|
|
34
|
-
"minimum": 1,
|
|
35
|
-
"description": "Maximum lines of code allowed for this risk tier"
|
|
36
|
-
},
|
|
37
|
-
"description": {
|
|
38
|
-
"type": "string",
|
|
39
|
-
"description": "Human-readable description of the tier"
|
|
40
|
-
}
|
|
41
|
-
},
|
|
42
|
-
"additionalProperties": false
|
|
43
|
-
}
|
|
44
|
-
},
|
|
45
|
-
"additionalProperties": false,
|
|
46
|
-
"description": "Risk tier definitions with budget limits"
|
|
47
|
-
},
|
|
48
|
-
"edit_rules": {
|
|
49
|
-
"type": "object",
|
|
50
|
-
"required": [
|
|
51
|
-
"policy_and_code_same_pr",
|
|
52
|
-
"min_approvers_for_budget_raise"
|
|
53
|
-
],
|
|
54
|
-
"properties": {
|
|
55
|
-
"policy_and_code_same_pr": {
|
|
56
|
-
"type": "boolean",
|
|
57
|
-
"description": "Whether policy and code changes can be in the same PR"
|
|
58
|
-
},
|
|
59
|
-
"min_approvers_for_budget_raise": {
|
|
60
|
-
"type": "integer",
|
|
61
|
-
"minimum": 1,
|
|
62
|
-
"description": "Minimum approvers required for budget increases"
|
|
63
|
-
},
|
|
64
|
-
"require_signed_commits": {
|
|
65
|
-
"type": "boolean",
|
|
66
|
-
"description": "Whether signed commits are required for policy changes"
|
|
67
|
-
}
|
|
68
|
-
},
|
|
69
|
-
"additionalProperties": false,
|
|
70
|
-
"description": "Rules governing policy file edits"
|
|
71
|
-
},
|
|
72
|
-
"gates": {
|
|
73
|
-
"type": "object",
|
|
74
|
-
"patternProperties": {
|
|
75
|
-
"^.*$": {
|
|
76
|
-
"type": "object",
|
|
77
|
-
"required": [
|
|
78
|
-
"enabled"
|
|
79
|
-
],
|
|
80
|
-
"properties": {
|
|
81
|
-
"enabled": {
|
|
82
|
-
"type": "boolean",
|
|
83
|
-
"description": "Whether this gate is active"
|
|
84
|
-
},
|
|
85
|
-
"mode": {
|
|
86
|
-
"type": "string",
|
|
87
|
-
"enum": [
|
|
88
|
-
"warn",
|
|
89
|
-
"block",
|
|
90
|
-
"skip"
|
|
91
|
-
],
|
|
92
|
-
"description": "How the gate reports failures: warn, block, or skip entirely"
|
|
93
|
-
},
|
|
94
|
-
"description": {
|
|
95
|
-
"type": "string",
|
|
96
|
-
"description": "Human-readable description of the gate"
|
|
97
|
-
},
|
|
98
|
-
"thresholds": {
|
|
99
|
-
"type": "object",
|
|
100
|
-
"description": "Gate-specific thresholds (e.g. warning/critical limits)"
|
|
101
|
-
}
|
|
102
|
-
},
|
|
103
|
-
"additionalProperties": false
|
|
104
|
-
}
|
|
105
|
-
},
|
|
106
|
-
"additionalProperties": false,
|
|
107
|
-
"description": "Quality gate configurations"
|
|
108
|
-
}
|
|
109
|
-
},
|
|
110
|
-
"additionalProperties": false,
|
|
111
|
-
"title": "CAWS Policy"
|
|
112
|
-
}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
-
"title": "CAWS Lite Scope Configuration",
|
|
4
|
-
"description": "Scope configuration for CAWS lite mode — guardrails without YAML specs. This schema governs the standalone .caws/scope.json file ONLY; inline scope: blocks inside working-spec.yaml or feature specs are governed by the working-spec schema's scope sub-schema and do NOT invoke this schema. See CAWSFIX-11.",
|
|
5
|
-
"type": "object",
|
|
6
|
-
"required": ["allowedDirectories"],
|
|
7
|
-
"properties": {
|
|
8
|
-
"version": {
|
|
9
|
-
"type": "integer",
|
|
10
|
-
"const": 1,
|
|
11
|
-
"description": "Schema version. Optional for back-compat with scope.json files that predate versioning; the runtime (src/config/lite-scope.js) defaults to 1 when missing. If present, must be exactly 1. CAWSFIX-11 lifted `version` from the required list because no code path enforces a version mismatch — only the schema did, producing spurious warnings for pre-versioning scope.json files."
|
|
12
|
-
},
|
|
13
|
-
"allowedDirectories": {
|
|
14
|
-
"type": "array",
|
|
15
|
-
"items": { "type": "string" },
|
|
16
|
-
"minItems": 1,
|
|
17
|
-
"description": "Directories the agent is allowed to modify (e.g., src/, tests/)"
|
|
18
|
-
},
|
|
19
|
-
"bannedPatterns": {
|
|
20
|
-
"type": "object",
|
|
21
|
-
"properties": {
|
|
22
|
-
"files": {
|
|
23
|
-
"type": "array",
|
|
24
|
-
"items": { "type": "string" },
|
|
25
|
-
"description": "Glob patterns for banned file names (e.g., *-enhanced.*, *-final.*)"
|
|
26
|
-
},
|
|
27
|
-
"directories": {
|
|
28
|
-
"type": "array",
|
|
29
|
-
"items": { "type": "string" },
|
|
30
|
-
"description": "Glob patterns for banned directory names (e.g., *venv*, .venv)"
|
|
31
|
-
},
|
|
32
|
-
"docs": {
|
|
33
|
-
"type": "array",
|
|
34
|
-
"items": { "type": "string" },
|
|
35
|
-
"description": "Glob patterns for banned doc file names (e.g., *-summary.md)"
|
|
36
|
-
}
|
|
37
|
-
},
|
|
38
|
-
"additionalProperties": false
|
|
39
|
-
},
|
|
40
|
-
"maxNewFilesPerCommit": {
|
|
41
|
-
"type": "integer",
|
|
42
|
-
"minimum": 1,
|
|
43
|
-
"maximum": 100,
|
|
44
|
-
"description": "Maximum number of new files allowed per commit (prevents file sprawl)"
|
|
45
|
-
},
|
|
46
|
-
"designatedVenvPath": {
|
|
47
|
-
"type": "string",
|
|
48
|
-
"description": "The only allowed virtual environment path (e.g., .venv)"
|
|
49
|
-
}
|
|
50
|
-
},
|
|
51
|
-
"additionalProperties": false
|
|
52
|
-
}
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
-
"title": "CAWS Waiver",
|
|
4
|
-
"description": "Individual waiver file created by caws waivers create",
|
|
5
|
-
"type": "object",
|
|
6
|
-
"required": ["id", "applies_to", "gates", "delta", "reason_code", "expires_at", "risk_owner", "approvers", "status"],
|
|
7
|
-
"properties": {
|
|
8
|
-
"id": {
|
|
9
|
-
"type": "string",
|
|
10
|
-
"pattern": "^WV-\\d{4}$",
|
|
11
|
-
"description": "Waiver ID in format WV-XXXX"
|
|
12
|
-
},
|
|
13
|
-
"applies_to": {
|
|
14
|
-
"type": "string",
|
|
15
|
-
"description": "Spec ID or PR number this waiver applies to"
|
|
16
|
-
},
|
|
17
|
-
"gates": {
|
|
18
|
-
"type": "array",
|
|
19
|
-
"items": {
|
|
20
|
-
"type": "string",
|
|
21
|
-
"enum": ["budget_limit", "spec_completeness", "contract_compliance", "coverage_threshold", "mutation_threshold", "security_scan", "accessibility_check", "performance_budget", "scope_boundary"]
|
|
22
|
-
},
|
|
23
|
-
"minItems": 1,
|
|
24
|
-
"description": "Quality gates to waive"
|
|
25
|
-
},
|
|
26
|
-
"delta": {
|
|
27
|
-
"type": "object",
|
|
28
|
-
"description": "Additive budget deltas (only positive values allowed)",
|
|
29
|
-
"properties": {
|
|
30
|
-
"max_files": {
|
|
31
|
-
"type": "integer",
|
|
32
|
-
"minimum": 0,
|
|
33
|
-
"description": "Additional files allowed"
|
|
34
|
-
},
|
|
35
|
-
"max_loc": {
|
|
36
|
-
"type": "integer",
|
|
37
|
-
"minimum": 0,
|
|
38
|
-
"description": "Additional lines of code allowed"
|
|
39
|
-
}
|
|
40
|
-
},
|
|
41
|
-
"additionalProperties": false
|
|
42
|
-
},
|
|
43
|
-
"reason_code": {
|
|
44
|
-
"type": "string",
|
|
45
|
-
"enum": ["emergency_hotfix", "legacy_integration", "experimental_feature", "third_party_constraint", "performance_critical", "security_patch", "infrastructure_limitation", "architectural_refactor", "other"],
|
|
46
|
-
"description": "Controlled vocabulary for waiver reasons"
|
|
47
|
-
},
|
|
48
|
-
"description": {
|
|
49
|
-
"type": "string",
|
|
50
|
-
"minLength": 50,
|
|
51
|
-
"maxLength": 1000,
|
|
52
|
-
"description": "Detailed explanation of why waiver is needed"
|
|
53
|
-
},
|
|
54
|
-
"mitigation": {
|
|
55
|
-
"type": "string",
|
|
56
|
-
"minLength": 50,
|
|
57
|
-
"description": "Plan to address the underlying issue"
|
|
58
|
-
},
|
|
59
|
-
"expires_at": {
|
|
60
|
-
"type": "string",
|
|
61
|
-
"format": "date-time",
|
|
62
|
-
"description": "ISO 8601 datetime when waiver expires"
|
|
63
|
-
},
|
|
64
|
-
"risk_owner": {
|
|
65
|
-
"type": "string",
|
|
66
|
-
"description": "Person/entity responsible for managing this risk"
|
|
67
|
-
},
|
|
68
|
-
"approvers": {
|
|
69
|
-
"type": "array",
|
|
70
|
-
"items": {
|
|
71
|
-
"type": "object",
|
|
72
|
-
"required": ["handle"],
|
|
73
|
-
"properties": {
|
|
74
|
-
"handle": {
|
|
75
|
-
"type": "string",
|
|
76
|
-
"description": "GitHub handle or email of approver"
|
|
77
|
-
},
|
|
78
|
-
"approved_at": {
|
|
79
|
-
"type": "string",
|
|
80
|
-
"format": "date-time",
|
|
81
|
-
"description": "When this approval was given"
|
|
82
|
-
}
|
|
83
|
-
},
|
|
84
|
-
"additionalProperties": false
|
|
85
|
-
},
|
|
86
|
-
"minItems": 1,
|
|
87
|
-
"description": "List of people who approved this waiver"
|
|
88
|
-
},
|
|
89
|
-
"status": {
|
|
90
|
-
"type": "string",
|
|
91
|
-
"enum": ["proposed", "active", "expired", "revoked"],
|
|
92
|
-
"description": "Current status of the waiver"
|
|
93
|
-
},
|
|
94
|
-
"metadata": {
|
|
95
|
-
"type": "object",
|
|
96
|
-
"properties": {
|
|
97
|
-
"related_pr": { "type": "string" },
|
|
98
|
-
"related_issue": { "type": "string" },
|
|
99
|
-
"environment": { "type": "string", "enum": ["development", "staging", "production"] },
|
|
100
|
-
"urgency": { "type": "string", "enum": ["low", "normal", "high", "critical"] }
|
|
101
|
-
},
|
|
102
|
-
"additionalProperties": false
|
|
103
|
-
}
|
|
104
|
-
},
|
|
105
|
-
"additionalProperties": false
|
|
106
|
-
}
|