@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,284 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CAWS Quality Monitor Command
|
|
3
|
-
*
|
|
4
|
-
* Monitors code quality impact in real-time based on development actions.
|
|
5
|
-
* Provides actionable recommendations for maintaining quality standards.
|
|
6
|
-
*
|
|
7
|
-
* @author @darianrosebrook
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
const chalk = require('chalk');
|
|
11
|
-
const path = require('path');
|
|
12
|
-
const { resolveSpec } = require('../utils/spec-resolver');
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Analyze quality impact of an action
|
|
16
|
-
*
|
|
17
|
-
* @param {string} action - Type of action (file_saved, code_edited, test_run)
|
|
18
|
-
* @param {array} files - Files affected by the action
|
|
19
|
-
* @param {object} context - Additional context information
|
|
20
|
-
* @returns {object} Quality analysis
|
|
21
|
-
*/
|
|
22
|
-
function analyzeQualityImpact(action, files = [], context = {}) {
|
|
23
|
-
const analysis = {
|
|
24
|
-
action,
|
|
25
|
-
files_affected: files?.length || 0,
|
|
26
|
-
quality_impact: 'unknown',
|
|
27
|
-
recommendations: [],
|
|
28
|
-
risk_level: 'low',
|
|
29
|
-
timestamp: new Date().toISOString(),
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
// Analyze based on action type
|
|
33
|
-
switch (action) {
|
|
34
|
-
case 'file_saved':
|
|
35
|
-
analysis.quality_impact = 'code_change';
|
|
36
|
-
analysis.recommendations = [
|
|
37
|
-
'Run CAWS validation: caws evaluate',
|
|
38
|
-
'Check for linting issues',
|
|
39
|
-
'Verify test coverage if applicable',
|
|
40
|
-
];
|
|
41
|
-
break;
|
|
42
|
-
|
|
43
|
-
case 'code_edited':
|
|
44
|
-
analysis.quality_impact = 'implementation_change';
|
|
45
|
-
analysis.recommendations = [
|
|
46
|
-
'Run unit tests for affected files',
|
|
47
|
-
'Check CAWS quality gates',
|
|
48
|
-
'Update documentation if public APIs changed',
|
|
49
|
-
];
|
|
50
|
-
analysis.risk_level = files?.length > 5 ? 'medium' : 'low';
|
|
51
|
-
|
|
52
|
-
// Add file-specific recommendations
|
|
53
|
-
if (files.length > 0) {
|
|
54
|
-
const hasTests = files.some((f) => f.includes('test') || f.includes('spec'));
|
|
55
|
-
const hasConfig = files.some((f) => f.includes('config') || f.includes('.json'));
|
|
56
|
-
|
|
57
|
-
if (hasTests) {
|
|
58
|
-
analysis.recommendations.push('Run full test suite to ensure consistency');
|
|
59
|
-
}
|
|
60
|
-
if (hasConfig) {
|
|
61
|
-
analysis.risk_level = 'high';
|
|
62
|
-
analysis.recommendations.unshift('Configuration changed - validate carefully');
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
break;
|
|
66
|
-
|
|
67
|
-
case 'test_run':
|
|
68
|
-
analysis.quality_impact = 'validation_complete';
|
|
69
|
-
analysis.recommendations = [
|
|
70
|
-
'Review test results',
|
|
71
|
-
'Address any failing tests',
|
|
72
|
-
'Update CAWS working spec if needed',
|
|
73
|
-
];
|
|
74
|
-
break;
|
|
75
|
-
|
|
76
|
-
default:
|
|
77
|
-
analysis.quality_impact = 'unknown_action';
|
|
78
|
-
analysis.recommendations = ['Run CAWS evaluation to assess impact'];
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// Add context-based recommendations
|
|
82
|
-
if (context.project_tier) {
|
|
83
|
-
analysis.project_tier = context.project_tier;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
return analysis;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Enrich analysis with project tier and resolved spec metadata.
|
|
91
|
-
* @param {Object} analysis
|
|
92
|
-
* @param {Object|null} resolvedSpec
|
|
93
|
-
* @returns {Object}
|
|
94
|
-
*/
|
|
95
|
-
function applySpecContext(analysis, resolvedSpec) {
|
|
96
|
-
if (!resolvedSpec?.spec) {
|
|
97
|
-
return analysis;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
const projectTier = resolvedSpec.spec.risk_tier;
|
|
101
|
-
analysis.project_tier = projectTier;
|
|
102
|
-
analysis.spec_id = resolvedSpec.spec.id || null;
|
|
103
|
-
analysis.spec_path = resolvedSpec.path
|
|
104
|
-
? path.relative(process.cwd(), resolvedSpec.path)
|
|
105
|
-
: null;
|
|
106
|
-
|
|
107
|
-
if (projectTier <= 2) {
|
|
108
|
-
analysis.recommendations.unshift(
|
|
109
|
-
'High-risk project (Tier ' + projectTier + '): Run comprehensive validation'
|
|
110
|
-
);
|
|
111
|
-
if (analysis.risk_level === 'low') {
|
|
112
|
-
analysis.risk_level = 'medium';
|
|
113
|
-
} else if (analysis.risk_level === 'medium') {
|
|
114
|
-
analysis.risk_level = 'high';
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
if (projectTier === 1) {
|
|
119
|
-
analysis.quality_gates = [
|
|
120
|
-
'Branch coverage ≥ 90%',
|
|
121
|
-
'Mutation score ≥ 70%',
|
|
122
|
-
'All contract tests passing',
|
|
123
|
-
'Manual code review required',
|
|
124
|
-
];
|
|
125
|
-
} else if (projectTier === 2) {
|
|
126
|
-
analysis.quality_gates = [
|
|
127
|
-
'Branch coverage ≥ 80%',
|
|
128
|
-
'Mutation score ≥ 50%',
|
|
129
|
-
'Contract tests passing (if applicable)',
|
|
130
|
-
];
|
|
131
|
-
} else {
|
|
132
|
-
analysis.quality_gates = ['Branch coverage ≥ 70%', 'Mutation score ≥ 30%'];
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
return analysis;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* Quality monitor command handler
|
|
140
|
-
*
|
|
141
|
-
* @param {string} action - Type of action to monitor
|
|
142
|
-
* @param {object} options - Command options
|
|
143
|
-
*/
|
|
144
|
-
async function qualityMonitorCommand(action, options = {}) {
|
|
145
|
-
try {
|
|
146
|
-
// Parse files if provided
|
|
147
|
-
let files = [];
|
|
148
|
-
if (options.files) {
|
|
149
|
-
files =
|
|
150
|
-
typeof options.files === 'string'
|
|
151
|
-
? options.files.split(',').map((f) => f.trim())
|
|
152
|
-
: options.files;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
// Parse context if provided
|
|
156
|
-
let context = {};
|
|
157
|
-
if (options.context) {
|
|
158
|
-
try {
|
|
159
|
-
context =
|
|
160
|
-
typeof options.context === 'string' ? JSON.parse(options.context) : options.context;
|
|
161
|
-
} catch (e) {
|
|
162
|
-
console.warn(chalk.yellow('Invalid context JSON, ignoring'));
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
// Validate action
|
|
167
|
-
const validActions = ['file_saved', 'code_edited', 'test_run'];
|
|
168
|
-
if (!validActions.includes(action)) {
|
|
169
|
-
console.error(chalk.red(`\nInvalid action: ${action}`));
|
|
170
|
-
console.log(chalk.blue('\nValid actions:'));
|
|
171
|
-
validActions.forEach((a) => {
|
|
172
|
-
console.log(chalk.blue(` - ${a}`));
|
|
173
|
-
});
|
|
174
|
-
process.exit(1);
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
// Analyze quality impact
|
|
178
|
-
let analysis = analyzeQualityImpact(action, files, context);
|
|
179
|
-
|
|
180
|
-
try {
|
|
181
|
-
const resolved = await resolveSpec({
|
|
182
|
-
specId: options.specId,
|
|
183
|
-
warnLegacy: false,
|
|
184
|
-
interactive: false,
|
|
185
|
-
});
|
|
186
|
-
analysis = applySpecContext(analysis, resolved);
|
|
187
|
-
} catch {
|
|
188
|
-
// Best-effort enrichment only
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
// Display results
|
|
192
|
-
console.log(chalk.bold('\nCAWS Quality Monitor\n'));
|
|
193
|
-
console.log('-'.repeat(60));
|
|
194
|
-
|
|
195
|
-
// Action info
|
|
196
|
-
console.log(chalk.bold(`\nAction: ${action}`));
|
|
197
|
-
console.log(chalk.gray(`Time: ${new Date(analysis.timestamp).toLocaleString()}`));
|
|
198
|
-
|
|
199
|
-
if (analysis.files_affected > 0) {
|
|
200
|
-
console.log(chalk.bold(`\nFiles Affected: ${analysis.files_affected}`));
|
|
201
|
-
if (files.length > 0 && files.length <= 10) {
|
|
202
|
-
files.forEach((file) => {
|
|
203
|
-
console.log(chalk.gray(` - ${file}`));
|
|
204
|
-
});
|
|
205
|
-
} else if (files.length > 10) {
|
|
206
|
-
files.slice(0, 10).forEach((file) => {
|
|
207
|
-
console.log(chalk.gray(` - ${file}`));
|
|
208
|
-
});
|
|
209
|
-
console.log(chalk.gray(` ... and ${files.length - 10} more`));
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
// Quality impact
|
|
214
|
-
const impactColor =
|
|
215
|
-
analysis.quality_impact === 'validation_complete'
|
|
216
|
-
? chalk.green
|
|
217
|
-
: analysis.quality_impact === 'code_change'
|
|
218
|
-
? chalk.yellow
|
|
219
|
-
: chalk.blue;
|
|
220
|
-
|
|
221
|
-
console.log(chalk.bold('\nQuality Impact:'));
|
|
222
|
-
console.log(impactColor(` ${analysis.quality_impact}`));
|
|
223
|
-
|
|
224
|
-
// Risk level
|
|
225
|
-
const riskColor =
|
|
226
|
-
analysis.risk_level === 'high'
|
|
227
|
-
? chalk.red
|
|
228
|
-
: analysis.risk_level === 'medium'
|
|
229
|
-
? chalk.yellow
|
|
230
|
-
: chalk.green;
|
|
231
|
-
|
|
232
|
-
console.log(chalk.bold('\nRisk Level:'));
|
|
233
|
-
console.log(riskColor(` ${analysis.risk_level.toUpperCase()}`));
|
|
234
|
-
|
|
235
|
-
// Project tier
|
|
236
|
-
if (analysis.project_tier) {
|
|
237
|
-
console.log(chalk.bold(`\nProject Tier: ${analysis.project_tier}`));
|
|
238
|
-
if (analysis.spec_id) {
|
|
239
|
-
console.log(chalk.gray(`Spec: ${analysis.spec_id}${analysis.spec_path ? ` (${analysis.spec_path})` : ''}`));
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
// Quality gates
|
|
244
|
-
if (analysis.quality_gates && analysis.quality_gates.length > 0) {
|
|
245
|
-
console.log(chalk.bold('\nQuality Gates to Check:\n'));
|
|
246
|
-
analysis.quality_gates.forEach((gate) => {
|
|
247
|
-
console.log(chalk.gray(` □ ${gate}`));
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
// Recommendations
|
|
252
|
-
console.log(chalk.bold('\nRecommendations:\n'));
|
|
253
|
-
analysis.recommendations.forEach((rec, idx) => {
|
|
254
|
-
const icon = idx === 0 ? '' : ' -';
|
|
255
|
-
console.log(chalk.blue(` ${icon} ${rec}`));
|
|
256
|
-
});
|
|
257
|
-
|
|
258
|
-
// Suggested commands
|
|
259
|
-
console.log(chalk.bold('\nSuggested Commands:\n'));
|
|
260
|
-
switch (action) {
|
|
261
|
-
case 'file_saved':
|
|
262
|
-
case 'code_edited':
|
|
263
|
-
console.log(chalk.gray(' caws evaluate - Check quality score'));
|
|
264
|
-
console.log(chalk.gray(' caws validate - Run validation'));
|
|
265
|
-
console.log(chalk.gray(' caws diagnose - Health check'));
|
|
266
|
-
break;
|
|
267
|
-
case 'test_run':
|
|
268
|
-
console.log(chalk.gray(' caws status - Project status'));
|
|
269
|
-
console.log(chalk.gray(' caws iterate - Next steps'));
|
|
270
|
-
break;
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
console.log('\n' + '-'.repeat(60) + '\n');
|
|
274
|
-
} catch (error) {
|
|
275
|
-
console.error(chalk.red(`\nQuality monitoring failed: ${error.message}`));
|
|
276
|
-
console.error(chalk.gray(error.stack));
|
|
277
|
-
process.exit(1);
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
module.exports = {
|
|
282
|
-
qualityMonitorCommand,
|
|
283
|
-
analyzeQualityImpact,
|
|
284
|
-
};
|
package/dist/commands/scope.js
DELETED
|
@@ -1,264 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview CAWS Scope CLI Command
|
|
3
|
-
* Inspects and displays effective scope boundaries for the current context
|
|
4
|
-
* @author @darianrosebrook
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
const chalk = require('chalk');
|
|
8
|
-
const path = require('path');
|
|
9
|
-
const fs = require('fs-extra');
|
|
10
|
-
const yaml = require('js-yaml');
|
|
11
|
-
const {
|
|
12
|
-
getRepoRoot,
|
|
13
|
-
loadRegistry,
|
|
14
|
-
findFeatureSpecPath,
|
|
15
|
-
WORKTREES_DIR,
|
|
16
|
-
} = require('../worktree/worktree-manager');
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Handle scope subcommands
|
|
20
|
-
* @param {string} subcommand - Subcommand name
|
|
21
|
-
* @param {Object} options - Command options
|
|
22
|
-
*/
|
|
23
|
-
async function scopeCommand(subcommand, options = {}) {
|
|
24
|
-
try {
|
|
25
|
-
switch (subcommand) {
|
|
26
|
-
case 'show':
|
|
27
|
-
return handleShow(options);
|
|
28
|
-
default:
|
|
29
|
-
console.error(chalk.red(`Unknown scope subcommand: ${subcommand}`));
|
|
30
|
-
console.log(chalk.blue('Available: show'));
|
|
31
|
-
process.exit(1);
|
|
32
|
-
}
|
|
33
|
-
} catch (error) {
|
|
34
|
-
console.error(chalk.red(`${error.message}`));
|
|
35
|
-
process.exit(1);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Detect if current working directory is inside a worktree
|
|
41
|
-
* @param {string} root - Repository root
|
|
42
|
-
* @returns {{ inWorktree: boolean, worktreeName: string|null }}
|
|
43
|
-
*/
|
|
44
|
-
function detectWorktreeContext(root) {
|
|
45
|
-
const cwd = process.cwd();
|
|
46
|
-
const worktreesBase = path.join(root, WORKTREES_DIR);
|
|
47
|
-
|
|
48
|
-
if (!cwd.startsWith(worktreesBase + path.sep) && cwd !== worktreesBase) {
|
|
49
|
-
return { inWorktree: false, worktreeName: null };
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// Extract worktree name: first path segment after the worktrees dir
|
|
53
|
-
const relative = path.relative(worktreesBase, cwd);
|
|
54
|
-
const worktreeName = relative.split(path.sep)[0];
|
|
55
|
-
|
|
56
|
-
if (!worktreeName) {
|
|
57
|
-
return { inWorktree: false, worktreeName: null };
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
return { inWorktree: true, worktreeName };
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Load a spec file and return its parsed contents
|
|
65
|
-
* @param {string} specPath - Absolute path to spec YAML
|
|
66
|
-
* @returns {Object|null}
|
|
67
|
-
*/
|
|
68
|
-
function loadSpec(specPath) {
|
|
69
|
-
try {
|
|
70
|
-
if (!fs.existsSync(specPath)) return null;
|
|
71
|
-
const content = fs.readFileSync(specPath, 'utf8');
|
|
72
|
-
return yaml.load(content);
|
|
73
|
-
} catch {
|
|
74
|
-
return null;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Find all active spec files in .caws/specs/
|
|
80
|
-
* @param {string} root - Repository root
|
|
81
|
-
* @returns {Array<{ id: string, path: string, data: Object }>}
|
|
82
|
-
*/
|
|
83
|
-
function findAllActiveSpecs(root) {
|
|
84
|
-
const specsDir = path.join(root, '.caws', 'specs');
|
|
85
|
-
if (!fs.existsSync(specsDir)) return [];
|
|
86
|
-
|
|
87
|
-
const files = fs.readdirSync(specsDir).filter(f => f.endsWith('.yaml') || f.endsWith('.yml'));
|
|
88
|
-
const specs = [];
|
|
89
|
-
|
|
90
|
-
for (const file of files) {
|
|
91
|
-
const specPath = path.join(specsDir, file);
|
|
92
|
-
const data = loadSpec(specPath);
|
|
93
|
-
if (!data) continue;
|
|
94
|
-
|
|
95
|
-
// Skip closed/archived specs
|
|
96
|
-
const status = (data.status || '').toLowerCase();
|
|
97
|
-
if (status === 'closed' || status === 'archived') continue;
|
|
98
|
-
|
|
99
|
-
const id = path.basename(file, path.extname(file));
|
|
100
|
-
specs.push({ id, path: specPath, data });
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
return specs;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* Print scope patterns for a spec
|
|
108
|
-
* @param {Object} data - Parsed spec YAML
|
|
109
|
-
* @param {string} indent - Indentation prefix
|
|
110
|
-
*/
|
|
111
|
-
function printScopePatterns(data, indent = ' ') {
|
|
112
|
-
const scope = data.scope || {};
|
|
113
|
-
const scopeIn = scope.in || scope.include || [];
|
|
114
|
-
const scopeOut = scope.out || scope.exclude || [];
|
|
115
|
-
|
|
116
|
-
if (scopeIn.length > 0) {
|
|
117
|
-
console.log(chalk.green(`${indent}scope.in:`));
|
|
118
|
-
for (const pattern of scopeIn) {
|
|
119
|
-
console.log(chalk.gray(`${indent} - ${pattern}`));
|
|
120
|
-
}
|
|
121
|
-
} else {
|
|
122
|
-
console.log(chalk.yellow(`${indent}scope.in: (none defined)`));
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
if (scopeOut.length > 0) {
|
|
126
|
-
console.log(chalk.red(`${indent}scope.out:`));
|
|
127
|
-
for (const pattern of scopeOut) {
|
|
128
|
-
console.log(chalk.gray(`${indent} - ${pattern}`));
|
|
129
|
-
}
|
|
130
|
-
} else {
|
|
131
|
-
console.log(chalk.gray(`${indent}scope.out: (none)`));
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* Handle the 'show' subcommand
|
|
137
|
-
* @param {Object} options - Command options
|
|
138
|
-
*/
|
|
139
|
-
function handleShow(_options) {
|
|
140
|
-
const root = getRepoRoot();
|
|
141
|
-
const { inWorktree, worktreeName } = detectWorktreeContext(root);
|
|
142
|
-
|
|
143
|
-
console.log(chalk.bold.cyan('CAWS Scope Inspector'));
|
|
144
|
-
console.log(chalk.cyan('='.repeat(50)));
|
|
145
|
-
console.log('');
|
|
146
|
-
|
|
147
|
-
if (inWorktree) {
|
|
148
|
-
return handleAuthoritativeMode(root, worktreeName);
|
|
149
|
-
} else {
|
|
150
|
-
return handleUnionMode(root);
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
/**
|
|
155
|
-
* Handle authoritative mode: agent is inside a worktree with a bound spec
|
|
156
|
-
* @param {string} root - Repository root
|
|
157
|
-
* @param {string} worktreeName - Name of the worktree
|
|
158
|
-
*/
|
|
159
|
-
function handleAuthoritativeMode(root, worktreeName) {
|
|
160
|
-
console.log(chalk.white(`Worktree: ${chalk.bold(worktreeName)}`));
|
|
161
|
-
|
|
162
|
-
const registry = loadRegistry(root);
|
|
163
|
-
const entry = registry.worktrees ? registry.worktrees[worktreeName] : null;
|
|
164
|
-
|
|
165
|
-
if (!entry) {
|
|
166
|
-
console.log(chalk.red(`Worktree '${worktreeName}' not found in registry.`));
|
|
167
|
-
console.log(chalk.yellow('The scope guard is operating in union mode (all active specs).'));
|
|
168
|
-
return handleUnionMode(root);
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
const specId = entry.specId;
|
|
172
|
-
|
|
173
|
-
if (!specId) {
|
|
174
|
-
console.log(chalk.yellow('Mode: union (no spec bound to this worktree)'));
|
|
175
|
-
console.log('');
|
|
176
|
-
console.log(chalk.yellow('This worktree has no spec binding. The scope guard checks'));
|
|
177
|
-
console.log(chalk.yellow('against the union of all active specs.'));
|
|
178
|
-
console.log('');
|
|
179
|
-
console.log(chalk.blue('To bind a spec: caws worktree bind <spec-id>'));
|
|
180
|
-
console.log('');
|
|
181
|
-
return handleUnionMode(root);
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
// Load the spec
|
|
185
|
-
const specPath = findFeatureSpecPath(root, specId);
|
|
186
|
-
if (!specPath) {
|
|
187
|
-
console.log(chalk.red(`Bound spec '${specId}' not found on disk.`));
|
|
188
|
-
console.log(chalk.yellow('Fix: recreate the spec or rebind with a valid spec ID.'));
|
|
189
|
-
console.log(chalk.blue(` caws worktree bind <valid-spec-id>`));
|
|
190
|
-
return;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
const specData = loadSpec(specPath);
|
|
194
|
-
if (!specData) {
|
|
195
|
-
console.log(chalk.red(`Failed to parse spec file: ${specPath}`));
|
|
196
|
-
return;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
console.log(chalk.green(`Mode: authoritative (single bound spec)`));
|
|
200
|
-
console.log(chalk.white(`Spec: ${chalk.bold(specId)}`));
|
|
201
|
-
if (specData.title) {
|
|
202
|
-
console.log(chalk.gray(`Title: ${specData.title}`));
|
|
203
|
-
}
|
|
204
|
-
console.log('');
|
|
205
|
-
|
|
206
|
-
// Print scope patterns
|
|
207
|
-
printScopePatterns(specData);
|
|
208
|
-
console.log('');
|
|
209
|
-
|
|
210
|
-
// Check binding health: mutual reference
|
|
211
|
-
const specWorktreeRef = specData.worktree || null;
|
|
212
|
-
const registrySpecRef = specId;
|
|
213
|
-
|
|
214
|
-
if (specWorktreeRef !== worktreeName) {
|
|
215
|
-
console.log(chalk.yellow('Binding health: BROKEN'));
|
|
216
|
-
console.log(chalk.yellow(` Registry points to spec '${registrySpecRef}'`));
|
|
217
|
-
console.log(chalk.yellow(` Spec 'worktree' field: ${specWorktreeRef || '(missing)'} (expected: ${worktreeName})`));
|
|
218
|
-
console.log('');
|
|
219
|
-
console.log(chalk.blue(`Fix: caws worktree bind ${specId}`));
|
|
220
|
-
} else {
|
|
221
|
-
console.log(chalk.green('Binding health: OK'));
|
|
222
|
-
console.log(chalk.gray(` Registry -> spec: ${registrySpecRef}`));
|
|
223
|
-
console.log(chalk.gray(` Spec -> worktree: ${specWorktreeRef}`));
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
/**
|
|
228
|
-
* Handle union mode: no worktree or no spec binding
|
|
229
|
-
* @param {string} root - Repository root
|
|
230
|
-
*/
|
|
231
|
-
function handleUnionMode(root) {
|
|
232
|
-
const specs = findAllActiveSpecs(root);
|
|
233
|
-
|
|
234
|
-
if (specs.length === 0) {
|
|
235
|
-
console.log(chalk.gray('Mode: union (no active specs found)'));
|
|
236
|
-
console.log('');
|
|
237
|
-
console.log(chalk.gray('No active feature specs in .caws/specs/.'));
|
|
238
|
-
console.log(chalk.gray('The scope guard has no patterns to enforce.'));
|
|
239
|
-
console.log('');
|
|
240
|
-
console.log(chalk.blue('Create a spec: caws specs create <id> --title "description"'));
|
|
241
|
-
return;
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
console.log(chalk.white('Mode: union (checking all active specs)'));
|
|
245
|
-
console.log(chalk.gray(`Active specs: ${specs.length}`));
|
|
246
|
-
console.log('');
|
|
247
|
-
|
|
248
|
-
for (const spec of specs) {
|
|
249
|
-
const statusLabel = spec.data.status || 'draft';
|
|
250
|
-
console.log(chalk.white(` ${chalk.bold(spec.id)} [${statusLabel}]`));
|
|
251
|
-
if (spec.data.title) {
|
|
252
|
-
console.log(chalk.gray(` Title: ${spec.data.title}`));
|
|
253
|
-
}
|
|
254
|
-
printScopePatterns(spec.data, ' ');
|
|
255
|
-
|
|
256
|
-
// Check if this spec has a worktree binding
|
|
257
|
-
if (spec.data.worktree) {
|
|
258
|
-
console.log(chalk.gray(` worktree: ${spec.data.worktree}`));
|
|
259
|
-
}
|
|
260
|
-
console.log('');
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
module.exports = { scopeCommand };
|