@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,465 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Policy Manager with Intelligent Caching
|
|
3
|
-
* Manages policy.yaml loading with caching, default fallback, and waiver validation.
|
|
4
|
-
* Ported from agent-agency v2 CAWS integration patterns.
|
|
5
|
-
* @author @darianrosebrook
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
const fs = require('fs-extra');
|
|
9
|
-
const path = require('path');
|
|
10
|
-
const yaml = require('js-yaml');
|
|
11
|
-
const { createValidator, getSchemaPath } = require('../utils/schema-validator');
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Policy Manager - Handles policy loading with intelligent caching
|
|
15
|
-
*
|
|
16
|
-
* Features:
|
|
17
|
-
* - TTL-based caching for performance
|
|
18
|
-
* - Graceful fallback to defaults when policy.yaml missing
|
|
19
|
-
* - Cache inspection and management API
|
|
20
|
-
* - Waiver validation and delta application
|
|
21
|
-
*/
|
|
22
|
-
class PolicyManager {
|
|
23
|
-
constructor(options = {}) {
|
|
24
|
-
this.enableCaching = options.enableCaching ?? true;
|
|
25
|
-
this.cacheTTL = options.cacheTTL ?? 300000; // 5 minutes default
|
|
26
|
-
this.policyCache = new Map(); // projectRoot -> { policy, cachedAt, ttl }
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Load CAWS policy from policy.yaml with caching
|
|
31
|
-
*
|
|
32
|
-
* @param {string} projectRoot - Project root directory
|
|
33
|
-
* @param {Object} options - Loading options
|
|
34
|
-
* @param {boolean} options.useCache - Use cache if available (default: true)
|
|
35
|
-
* @param {number} options.cacheTTL - Cache TTL override in milliseconds
|
|
36
|
-
* @returns {Promise<Object>} Policy object
|
|
37
|
-
*/
|
|
38
|
-
async loadPolicy(projectRoot, options = {}) {
|
|
39
|
-
const useCache = options.useCache ?? this.enableCaching;
|
|
40
|
-
const cacheTTL = options.cacheTTL ?? this.cacheTTL;
|
|
41
|
-
const startTime = Date.now();
|
|
42
|
-
|
|
43
|
-
try {
|
|
44
|
-
// Check cache first
|
|
45
|
-
if (useCache && this.policyCache.has(projectRoot)) {
|
|
46
|
-
const cached = this.policyCache.get(projectRoot);
|
|
47
|
-
const cacheAge = Date.now() - cached.cachedAt;
|
|
48
|
-
|
|
49
|
-
if (cacheAge < cacheTTL) {
|
|
50
|
-
return {
|
|
51
|
-
...cached.policy,
|
|
52
|
-
_cacheHit: true,
|
|
53
|
-
_loadDuration: Date.now() - startTime,
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// Load from file - check multiple locations for backward compatibility
|
|
59
|
-
const policyPaths = [
|
|
60
|
-
path.join(projectRoot, '.caws', 'policy.yaml'), // Preferred location
|
|
61
|
-
path.join(projectRoot, '.caws', 'policy', 'tier-policy.json'), // Legacy location
|
|
62
|
-
];
|
|
63
|
-
|
|
64
|
-
let policyPath = null;
|
|
65
|
-
let policyContent = null;
|
|
66
|
-
|
|
67
|
-
// Try each path in order
|
|
68
|
-
for (const candidatePath of policyPaths) {
|
|
69
|
-
try {
|
|
70
|
-
if (await fs.pathExists(candidatePath)) {
|
|
71
|
-
policyPath = candidatePath;
|
|
72
|
-
const content = await fs.readFile(candidatePath, 'utf-8');
|
|
73
|
-
|
|
74
|
-
// Handle JSON format (legacy)
|
|
75
|
-
if (candidatePath.endsWith('.json')) {
|
|
76
|
-
policyContent = JSON.parse(content);
|
|
77
|
-
} else {
|
|
78
|
-
// Handle YAML format (preferred)
|
|
79
|
-
policyContent = yaml.load(content);
|
|
80
|
-
}
|
|
81
|
-
break;
|
|
82
|
-
}
|
|
83
|
-
} catch (error) {
|
|
84
|
-
// Continue to next path if this one fails
|
|
85
|
-
continue;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
if (policyPath && policyContent) {
|
|
90
|
-
// Schema validation (warn and fall back to defaults on failure)
|
|
91
|
-
try {
|
|
92
|
-
const schemaFilePath = getSchemaPath('policy.schema.json', projectRoot);
|
|
93
|
-
const validate = createValidator(schemaFilePath);
|
|
94
|
-
const schemaResult = validate(policyContent);
|
|
95
|
-
if (!schemaResult.valid) {
|
|
96
|
-
console.warn('Policy has schema violations:', schemaResult.errors);
|
|
97
|
-
console.warn('Falling back to default policy');
|
|
98
|
-
const defaultPolicy = this.getDefaultPolicy();
|
|
99
|
-
if (this.enableCaching) {
|
|
100
|
-
this.policyCache.set(projectRoot, {
|
|
101
|
-
policy: defaultPolicy,
|
|
102
|
-
cachedAt: Date.now(),
|
|
103
|
-
ttl: cacheTTL,
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
return {
|
|
107
|
-
...defaultPolicy,
|
|
108
|
-
_isDefault: true,
|
|
109
|
-
_schemaErrors: schemaResult.errors,
|
|
110
|
-
_cacheHit: false,
|
|
111
|
-
_loadDuration: Date.now() - startTime,
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
} catch (schemaErr) {
|
|
115
|
-
console.warn('Could not validate policy schema:', schemaErr.message);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
// Validate policy structure
|
|
119
|
-
this.validatePolicy(policyContent);
|
|
120
|
-
|
|
121
|
-
// Update cache
|
|
122
|
-
if (this.enableCaching) {
|
|
123
|
-
this.policyCache.set(projectRoot, {
|
|
124
|
-
policy: policyContent,
|
|
125
|
-
cachedAt: Date.now(),
|
|
126
|
-
ttl: cacheTTL,
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
// Warn if using legacy location
|
|
131
|
-
if (policyPath.endsWith('.json')) {
|
|
132
|
-
console.warn(
|
|
133
|
-
'Using legacy policy file location: .caws/policy/tier-policy.json\n' +
|
|
134
|
-
' Migrate to .caws/policy.yaml for better compatibility\n' +
|
|
135
|
-
' Run: caws init --migrate-policy'
|
|
136
|
-
);
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
return {
|
|
140
|
-
...policyContent,
|
|
141
|
-
_cacheHit: false,
|
|
142
|
-
_loadDuration: Date.now() - startTime,
|
|
143
|
-
_policyPath: policyPath,
|
|
144
|
-
};
|
|
145
|
-
} else {
|
|
146
|
-
// Policy file doesn't exist - use default
|
|
147
|
-
const defaultPolicy = this.getDefaultPolicy();
|
|
148
|
-
|
|
149
|
-
if (this.enableCaching) {
|
|
150
|
-
this.policyCache.set(projectRoot, {
|
|
151
|
-
policy: defaultPolicy,
|
|
152
|
-
cachedAt: Date.now(),
|
|
153
|
-
ttl: cacheTTL,
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
return {
|
|
158
|
-
...defaultPolicy,
|
|
159
|
-
_isDefault: true,
|
|
160
|
-
_cacheHit: false,
|
|
161
|
-
_loadDuration: Date.now() - startTime,
|
|
162
|
-
};
|
|
163
|
-
}
|
|
164
|
-
} catch (error) {
|
|
165
|
-
throw new Error(`Policy load failed: ${error.message}`);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
/**
|
|
170
|
-
* Load a waiver document by ID
|
|
171
|
-
*
|
|
172
|
-
* @param {string} waiverId - Waiver ID (e.g., WV-0001)
|
|
173
|
-
* @param {string} projectRoot - Project root directory
|
|
174
|
-
* @returns {Promise<Object|null>} Waiver document or null if not found
|
|
175
|
-
*/
|
|
176
|
-
async loadWaiver(waiverId, projectRoot) {
|
|
177
|
-
try {
|
|
178
|
-
const waiverPath = path.join(projectRoot, '.caws', 'waivers', `${waiverId}.yaml`);
|
|
179
|
-
|
|
180
|
-
const content = await fs.readFile(waiverPath, 'utf-8');
|
|
181
|
-
return yaml.load(content);
|
|
182
|
-
} catch (error) {
|
|
183
|
-
if (error.code === 'ENOENT') {
|
|
184
|
-
return null;
|
|
185
|
-
}
|
|
186
|
-
throw new Error(`Failed to load waiver ${waiverId}: ${error.message}`);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* Check if a waiver is currently valid
|
|
192
|
-
*
|
|
193
|
-
* @param {Object} waiver - Waiver document
|
|
194
|
-
* @returns {boolean} True if waiver is valid and active
|
|
195
|
-
*/
|
|
196
|
-
isWaiverValid(waiver) {
|
|
197
|
-
if (!waiver) {
|
|
198
|
-
return false;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
// Check status
|
|
202
|
-
if (waiver.status !== 'active') {
|
|
203
|
-
return false;
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
// Check expiry
|
|
207
|
-
if (waiver.expires_at) {
|
|
208
|
-
const expiryDate = new Date(waiver.expires_at);
|
|
209
|
-
const now = new Date();
|
|
210
|
-
if (now > expiryDate) {
|
|
211
|
-
return false;
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
// Check if it has required approvals
|
|
216
|
-
if (!waiver.approvers || waiver.approvers.length === 0) {
|
|
217
|
-
return false;
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
return true;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
/**
|
|
224
|
-
* Apply waivers to baseline budget
|
|
225
|
-
*
|
|
226
|
-
* @param {Object} baseline - Baseline budget from policy
|
|
227
|
-
* @param {string[]} waiverIds - Array of waiver IDs to apply
|
|
228
|
-
* @param {string} projectRoot - Project root directory
|
|
229
|
-
* @returns {Promise<Object>} Effective budget with waivers applied
|
|
230
|
-
*/
|
|
231
|
-
async applyWaivers(baseline, waiverIds, projectRoot) {
|
|
232
|
-
const effective = { ...baseline };
|
|
233
|
-
const applied = [];
|
|
234
|
-
|
|
235
|
-
for (const waiverId of waiverIds) {
|
|
236
|
-
const waiver = await this.loadWaiver(waiverId, projectRoot);
|
|
237
|
-
|
|
238
|
-
if (waiver && this.isWaiverValid(waiver)) {
|
|
239
|
-
// Apply additive delta
|
|
240
|
-
if (waiver.delta) {
|
|
241
|
-
if (waiver.delta.max_files) {
|
|
242
|
-
effective.max_files += waiver.delta.max_files;
|
|
243
|
-
}
|
|
244
|
-
if (waiver.delta.max_loc) {
|
|
245
|
-
effective.max_loc += waiver.delta.max_loc;
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
applied.push(waiverId);
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
return {
|
|
253
|
-
effective,
|
|
254
|
-
applied,
|
|
255
|
-
};
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
/**
|
|
259
|
-
* Validate policy structure
|
|
260
|
-
*
|
|
261
|
-
* @param {Object} policy - Policy to validate
|
|
262
|
-
* @throws {Error} If policy is invalid
|
|
263
|
-
*/
|
|
264
|
-
validatePolicy(policy) {
|
|
265
|
-
if (!policy.version) {
|
|
266
|
-
throw new Error('Policy missing version field');
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
if (!policy.risk_tiers) {
|
|
270
|
-
throw new Error('Policy missing risk_tiers configuration');
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
const tierKeys = Object.keys(policy.risk_tiers);
|
|
274
|
-
if (tierKeys.length === 0) {
|
|
275
|
-
throw new Error('Policy risk_tiers must define at least one risk tier (1, 2, or 3)');
|
|
276
|
-
}
|
|
277
|
-
for (const key of tierKeys) {
|
|
278
|
-
if (!/^[1-3]$/.test(key)) {
|
|
279
|
-
throw new Error(`Policy risk_tiers has unknown tier '${key}' (expected 1, 2, or 3)`);
|
|
280
|
-
}
|
|
281
|
-
const budget = policy.risk_tiers[key];
|
|
282
|
-
if (typeof budget.max_files !== 'number' || typeof budget.max_loc !== 'number') {
|
|
283
|
-
throw new Error(`Risk tier ${key} missing or invalid budget limits`);
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
// Validate edit rules if present
|
|
288
|
-
if (policy.edit_rules) {
|
|
289
|
-
if (typeof policy.edit_rules.policy_and_code_same_pr !== 'boolean') {
|
|
290
|
-
throw new Error('edit_rules.policy_and_code_same_pr must be boolean');
|
|
291
|
-
}
|
|
292
|
-
if (typeof policy.edit_rules.min_approvers_for_budget_raise !== 'number') {
|
|
293
|
-
throw new Error('edit_rules.min_approvers_for_budget_raise must be number');
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
/**
|
|
299
|
-
* Get default CAWS policy
|
|
300
|
-
*
|
|
301
|
-
* Returns sensible defaults when policy.yaml doesn't exist.
|
|
302
|
-
*
|
|
303
|
-
* @returns {Object} Default policy configuration
|
|
304
|
-
*/
|
|
305
|
-
getDefaultPolicy() {
|
|
306
|
-
return {
|
|
307
|
-
version: 1,
|
|
308
|
-
risk_tiers: {
|
|
309
|
-
1: {
|
|
310
|
-
max_files: 25,
|
|
311
|
-
max_loc: 1000,
|
|
312
|
-
description: 'Critical changes requiring manual review',
|
|
313
|
-
},
|
|
314
|
-
2: {
|
|
315
|
-
max_files: 50,
|
|
316
|
-
max_loc: 2000,
|
|
317
|
-
description: 'Standard features with automated gates',
|
|
318
|
-
},
|
|
319
|
-
3: {
|
|
320
|
-
max_files: 100,
|
|
321
|
-
max_loc: 5000,
|
|
322
|
-
description: 'Low-risk changes with minimal oversight',
|
|
323
|
-
},
|
|
324
|
-
},
|
|
325
|
-
edit_rules: {
|
|
326
|
-
policy_and_code_same_pr: false,
|
|
327
|
-
min_approvers_for_budget_raise: 2,
|
|
328
|
-
require_signed_commits: true,
|
|
329
|
-
},
|
|
330
|
-
gates: {
|
|
331
|
-
budget_limit: {
|
|
332
|
-
enabled: true,
|
|
333
|
-
mode: 'block',
|
|
334
|
-
description: 'Enforce change budget limits',
|
|
335
|
-
},
|
|
336
|
-
spec_completeness: {
|
|
337
|
-
enabled: true,
|
|
338
|
-
mode: 'block',
|
|
339
|
-
description: 'Require complete working specifications',
|
|
340
|
-
},
|
|
341
|
-
scope_boundary: {
|
|
342
|
-
enabled: true,
|
|
343
|
-
mode: 'block',
|
|
344
|
-
description: 'Enforce spec scope boundaries',
|
|
345
|
-
},
|
|
346
|
-
god_object: {
|
|
347
|
-
enabled: true,
|
|
348
|
-
mode: 'warn',
|
|
349
|
-
thresholds: { warning: 1750, critical: 2000 },
|
|
350
|
-
description: 'Detect oversized source files',
|
|
351
|
-
},
|
|
352
|
-
todo_detection: {
|
|
353
|
-
enabled: true,
|
|
354
|
-
mode: 'warn',
|
|
355
|
-
thresholds: { min_confidence: 0.8 },
|
|
356
|
-
description: 'Scan for TODO/FIXME/HACK/XXX markers',
|
|
357
|
-
},
|
|
358
|
-
},
|
|
359
|
-
};
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
/**
|
|
363
|
-
* Clear policy cache
|
|
364
|
-
*
|
|
365
|
-
* @param {string} [projectRoot] - Specific project to clear, or all if omitted
|
|
366
|
-
*/
|
|
367
|
-
clearCache(projectRoot) {
|
|
368
|
-
if (projectRoot) {
|
|
369
|
-
this.policyCache.delete(projectRoot);
|
|
370
|
-
} else {
|
|
371
|
-
this.policyCache.clear();
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
/**
|
|
376
|
-
* Get cache status for a project
|
|
377
|
-
*
|
|
378
|
-
* @param {string} projectRoot - Project root directory
|
|
379
|
-
* @returns {Object} Cache status information
|
|
380
|
-
*/
|
|
381
|
-
getCacheStatus(projectRoot) {
|
|
382
|
-
const cached = this.policyCache.get(projectRoot);
|
|
383
|
-
|
|
384
|
-
if (!cached) {
|
|
385
|
-
return {
|
|
386
|
-
cached: false,
|
|
387
|
-
ttl: this.cacheTTL,
|
|
388
|
-
};
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
return {
|
|
392
|
-
cached: true,
|
|
393
|
-
age: Date.now() - cached.cachedAt,
|
|
394
|
-
ttl: cached.ttl,
|
|
395
|
-
remainingTTL: Math.max(0, cached.ttl - (Date.now() - cached.cachedAt)),
|
|
396
|
-
};
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
/**
|
|
400
|
-
* Reload policy from disk (bypassing cache)
|
|
401
|
-
*
|
|
402
|
-
* @param {string} projectRoot - Project root directory
|
|
403
|
-
* @returns {Promise<Object>} Fresh policy
|
|
404
|
-
*/
|
|
405
|
-
async reloadPolicy(projectRoot) {
|
|
406
|
-
this.clearCache(projectRoot);
|
|
407
|
-
return this.loadPolicy(projectRoot, { useCache: false });
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
/**
|
|
411
|
-
* Get all cached projects
|
|
412
|
-
*
|
|
413
|
-
* @returns {string[]} Array of project roots with cached policies
|
|
414
|
-
*/
|
|
415
|
-
getCachedProjects() {
|
|
416
|
-
return Array.from(this.policyCache.keys());
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
/**
|
|
420
|
-
* Get cache statistics
|
|
421
|
-
*
|
|
422
|
-
* @returns {Object} Cache statistics
|
|
423
|
-
*/
|
|
424
|
-
getCacheStats() {
|
|
425
|
-
const projects = this.getCachedProjects();
|
|
426
|
-
const now = Date.now();
|
|
427
|
-
|
|
428
|
-
const stats = {
|
|
429
|
-
totalCached: projects.length,
|
|
430
|
-
validCaches: 0,
|
|
431
|
-
expiredCaches: 0,
|
|
432
|
-
totalAge: 0,
|
|
433
|
-
};
|
|
434
|
-
|
|
435
|
-
for (const project of projects) {
|
|
436
|
-
const cached = this.policyCache.get(project);
|
|
437
|
-
const age = now - cached.cachedAt;
|
|
438
|
-
|
|
439
|
-
stats.totalAge += age;
|
|
440
|
-
|
|
441
|
-
if (age < cached.ttl) {
|
|
442
|
-
stats.validCaches++;
|
|
443
|
-
} else {
|
|
444
|
-
stats.expiredCaches++;
|
|
445
|
-
}
|
|
446
|
-
}
|
|
447
|
-
|
|
448
|
-
stats.averageAge = projects.length > 0 ? stats.totalAge / projects.length : 0;
|
|
449
|
-
|
|
450
|
-
return stats;
|
|
451
|
-
}
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
// Export singleton instance with default configuration
|
|
455
|
-
const defaultPolicyManager = new PolicyManager();
|
|
456
|
-
|
|
457
|
-
module.exports = {
|
|
458
|
-
PolicyManager,
|
|
459
|
-
defaultPolicyManager,
|
|
460
|
-
|
|
461
|
-
// Convenience exports for backward compatibility
|
|
462
|
-
loadPolicy: (projectRoot, options) => defaultPolicyManager.loadPolicy(projectRoot, options),
|
|
463
|
-
clearCache: (projectRoot) => defaultPolicyManager.clearCache(projectRoot),
|
|
464
|
-
getCacheStatus: (projectRoot) => defaultPolicyManager.getCacheStatus(projectRoot),
|
|
465
|
-
};
|