@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
package/dist/commands/iterate.js
DELETED
|
@@ -1,417 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CAWS Iterate Command
|
|
3
|
-
*
|
|
4
|
-
* Provides iterative development guidance based on current progress
|
|
5
|
-
* and working spec state.
|
|
6
|
-
*
|
|
7
|
-
* @author @darianrosebrook
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
const fs = require('fs');
|
|
11
|
-
const path = require('path');
|
|
12
|
-
const chalk = require('chalk');
|
|
13
|
-
const { initializeGlobalSetup } = require('../config');
|
|
14
|
-
|
|
15
|
-
// Import spec resolution system
|
|
16
|
-
const { resolveSpec } = require('../utils/spec-resolver');
|
|
17
|
-
// EVLOG-002 Phase 2 read flip: iterate reads from the event log instead of
|
|
18
|
-
// the state layer. loadStateFromEvents matches loadState's contract exactly
|
|
19
|
-
// (returns null for specs with no events), so the `workingState &&` guard
|
|
20
|
-
// below stays correct without code changes.
|
|
21
|
-
const { loadStateFromEvents } = require('../utils/event-renderer');
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Iterate command handler
|
|
25
|
-
*
|
|
26
|
-
* @param {string} specFile - Path to working spec file
|
|
27
|
-
* @param {object} options - Command options
|
|
28
|
-
*/
|
|
29
|
-
async function iterateCommand(specFile, options = {}) {
|
|
30
|
-
try {
|
|
31
|
-
// Resolve spec using priority system
|
|
32
|
-
const resolved = await resolveSpec({
|
|
33
|
-
specId: options.specId,
|
|
34
|
-
specFile: specFile || undefined,
|
|
35
|
-
warnLegacy: false,
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
const { spec } = resolved;
|
|
39
|
-
|
|
40
|
-
console.log('Detecting CAWS setup...');
|
|
41
|
-
const setup = initializeGlobalSetup();
|
|
42
|
-
|
|
43
|
-
if (setup.hasWorkingSpec) {
|
|
44
|
-
console.log(`Detected ${setup.type} CAWS setup`);
|
|
45
|
-
console.log(` Capabilities: ${setup.capabilities.join(', ')}`);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// Parse current state from options
|
|
49
|
-
let currentState = {};
|
|
50
|
-
if (options.currentState) {
|
|
51
|
-
try {
|
|
52
|
-
currentState = JSON.parse(options.currentState);
|
|
53
|
-
} catch {
|
|
54
|
-
console.error('Invalid JSON in --current-state. Using defaults.');
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
const stateDescription = currentState.description || 'Starting implementation';
|
|
58
|
-
|
|
59
|
-
console.log(chalk.blue('\nIterative Development Guidance\n'));
|
|
60
|
-
console.log('-'.repeat(60));
|
|
61
|
-
console.log(chalk.bold(`\nProject: ${spec.title}`));
|
|
62
|
-
console.log(`ID: ${spec.id} | Tier: ${spec.risk_tier} | Mode: ${spec.mode}`);
|
|
63
|
-
console.log(`Current State: ${stateDescription}\n`);
|
|
64
|
-
|
|
65
|
-
// Load working state for evidence-based guidance (EVLOG-002: from event log)
|
|
66
|
-
let workingState = null;
|
|
67
|
-
try { workingState = loadStateFromEvents(spec.id); } catch { /* non-fatal */ }
|
|
68
|
-
|
|
69
|
-
// Analyze progress based on mode
|
|
70
|
-
const guidance = generateGuidance(spec, currentState, options);
|
|
71
|
-
|
|
72
|
-
// If working state exists, overlay evidence-based data
|
|
73
|
-
if (workingState && workingState.phase !== 'not-started') {
|
|
74
|
-
guidance.phase = formatPhase(workingState.phase);
|
|
75
|
-
|
|
76
|
-
// Build evidence-based completed steps
|
|
77
|
-
const evidence = [];
|
|
78
|
-
if (workingState.validation && workingState.validation.passed) {
|
|
79
|
-
evidence.push(`Validation passed (Grade ${workingState.validation.grade || '?'})`);
|
|
80
|
-
}
|
|
81
|
-
if (workingState.evaluation) {
|
|
82
|
-
evidence.push(`Evaluation: ${workingState.evaluation.percentage}% (Grade ${workingState.evaluation.grade})`);
|
|
83
|
-
}
|
|
84
|
-
if (workingState.gates && workingState.gates.passed) {
|
|
85
|
-
evidence.push(`All gates passing (last run: ${workingState.gates.context} context)`);
|
|
86
|
-
}
|
|
87
|
-
if (workingState.acceptance_criteria) {
|
|
88
|
-
const ac = workingState.acceptance_criteria;
|
|
89
|
-
evidence.push(`AC verification: ${ac.pass}/${ac.total} pass, ${ac.fail} fail, ${ac.unchecked} unchecked`);
|
|
90
|
-
}
|
|
91
|
-
if (workingState.files_touched && workingState.files_touched.length > 0) {
|
|
92
|
-
evidence.push(`${workingState.files_touched.length} file(s) touched`);
|
|
93
|
-
}
|
|
94
|
-
if (evidence.length > 0) {
|
|
95
|
-
guidance.completed = evidence;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// Overlay blockers and next actions from state
|
|
99
|
-
if (workingState.blockers && workingState.blockers.length > 0) {
|
|
100
|
-
guidance.blockers = workingState.blockers.map(b => b.message);
|
|
101
|
-
}
|
|
102
|
-
if (workingState.next_actions && workingState.next_actions.length > 0) {
|
|
103
|
-
guidance.nextActions = workingState.next_actions;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
// Display guidance
|
|
108
|
-
console.log(chalk.blue('Current Phase:\n'));
|
|
109
|
-
console.log(` ${guidance.phase}\n`);
|
|
110
|
-
|
|
111
|
-
console.log(chalk.blue('Completed Steps:\n'));
|
|
112
|
-
guidance.completed.forEach((step) => {
|
|
113
|
-
console.log(chalk.green(` [done] ${step}`));
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
console.log(chalk.blue('\nNext Actions:\n'));
|
|
117
|
-
guidance.nextActions.forEach((action, index) => {
|
|
118
|
-
console.log(chalk.yellow(` ${index + 1}. ${action}`));
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
if (guidance.blockers.length > 0) {
|
|
122
|
-
console.log(chalk.red('\nBlockers:\n'));
|
|
123
|
-
guidance.blockers.forEach((blocker) => {
|
|
124
|
-
console.log(chalk.red(` ${blocker}`));
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
// Show quality gap summary if sidecars available
|
|
128
|
-
try {
|
|
129
|
-
const { diagnoseQualityGaps } = require('../sidecars');
|
|
130
|
-
if (workingState) {
|
|
131
|
-
const gapResult = diagnoseQualityGaps(workingState, spec);
|
|
132
|
-
if (gapResult.data && gapResult.data.gaps && gapResult.data.gaps.length > 0) {
|
|
133
|
-
console.log(chalk.yellow(`\n Quality gaps: ${gapResult.data.summary}`));
|
|
134
|
-
console.log(chalk.yellow(' Run: caws sidecar gaps --spec-id ' + spec.id));
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
} catch { /* sidecars not available — non-fatal */ }
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
console.log(chalk.blue('\nRecommendations:\n'));
|
|
141
|
-
guidance.recommendations.forEach((rec) => {
|
|
142
|
-
console.log(chalk.blue(` - ${rec}`));
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
// Acceptance criteria checklist with detailed progress
|
|
146
|
-
if (spec.acceptance && spec.acceptance.length > 0) {
|
|
147
|
-
console.log(chalk.blue('\nAcceptance Criteria Progress:\n'));
|
|
148
|
-
|
|
149
|
-
let totalTestsWritten = 0;
|
|
150
|
-
let totalTestsPassing = 0;
|
|
151
|
-
let totalCoverage = 0;
|
|
152
|
-
let criteriaWithProgress = 0;
|
|
153
|
-
|
|
154
|
-
spec.acceptance.forEach((criterion, _index) => {
|
|
155
|
-
// Support both old format (boolean completed) and new format (detailed progress)
|
|
156
|
-
let status = '';
|
|
157
|
-
let progressInfo = '';
|
|
158
|
-
|
|
159
|
-
if (criterion.status) {
|
|
160
|
-
// New detailed format
|
|
161
|
-
switch (criterion.status) {
|
|
162
|
-
case 'completed':
|
|
163
|
-
status = '';
|
|
164
|
-
break;
|
|
165
|
-
case 'in_progress':
|
|
166
|
-
status = '';
|
|
167
|
-
break;
|
|
168
|
-
case 'pending':
|
|
169
|
-
default:
|
|
170
|
-
status = '';
|
|
171
|
-
break;
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
// Show detailed progress if available
|
|
175
|
-
if (criterion.tests) {
|
|
176
|
-
const written = criterion.tests.written || 0;
|
|
177
|
-
const passing = criterion.tests.passing || 0;
|
|
178
|
-
progressInfo = ` (${passing}/${written} tests passing`;
|
|
179
|
-
|
|
180
|
-
if (criterion.coverage !== undefined) {
|
|
181
|
-
progressInfo += `, ${criterion.coverage.toFixed(1)}% coverage`;
|
|
182
|
-
}
|
|
183
|
-
progressInfo += ')';
|
|
184
|
-
|
|
185
|
-
totalTestsWritten += written;
|
|
186
|
-
totalTestsPassing += passing;
|
|
187
|
-
if (criterion.coverage !== undefined) {
|
|
188
|
-
totalCoverage += criterion.coverage;
|
|
189
|
-
criteriaWithProgress++;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
if (criterion.last_updated) {
|
|
194
|
-
const lastUpdate = new Date(criterion.last_updated).toLocaleDateString();
|
|
195
|
-
progressInfo += ` - updated ${lastUpdate}`;
|
|
196
|
-
}
|
|
197
|
-
} else if (criterion.completed) {
|
|
198
|
-
// Backward compatibility with old boolean format
|
|
199
|
-
status = '';
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
console.log(` ${status} ${criterion.id}: ${criterion.then}`);
|
|
203
|
-
if (progressInfo) {
|
|
204
|
-
console.log(chalk.gray(` ${progressInfo}`));
|
|
205
|
-
}
|
|
206
|
-
});
|
|
207
|
-
|
|
208
|
-
// Calculate overall progress
|
|
209
|
-
const completed = spec.acceptance.filter(
|
|
210
|
-
(a) => a.status === 'completed' || a.completed
|
|
211
|
-
).length;
|
|
212
|
-
const inProgress = spec.acceptance.filter((a) => a.status === 'in_progress').length;
|
|
213
|
-
const total = spec.acceptance.length;
|
|
214
|
-
const completionProgress = Math.round((completed / total) * 100);
|
|
215
|
-
|
|
216
|
-
console.log(
|
|
217
|
-
chalk.bold(
|
|
218
|
-
`\n Overall Progress: ${completed}/${total} completed (${completionProgress}%)`
|
|
219
|
-
)
|
|
220
|
-
);
|
|
221
|
-
if (inProgress > 0) {
|
|
222
|
-
console.log(chalk.yellow(` In Progress: ${inProgress} criteria`));
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
// Show test progress if available
|
|
226
|
-
if (totalTestsWritten > 0) {
|
|
227
|
-
const testProgress = Math.round((totalTestsPassing / totalTestsWritten) * 100);
|
|
228
|
-
console.log(
|
|
229
|
-
` Test Progress: ${totalTestsPassing}/${totalTestsWritten} tests passing (${testProgress}%)`
|
|
230
|
-
);
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
// Show coverage progress if available
|
|
234
|
-
if (criteriaWithProgress > 0) {
|
|
235
|
-
const avgCoverage = totalCoverage / criteriaWithProgress;
|
|
236
|
-
console.log(` Average Coverage: ${avgCoverage.toFixed(1)}%`);
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
// Quality gates reminder
|
|
241
|
-
console.log(chalk.blue('\nQuality Gates (Risk Tier ' + spec.risk_tier + '):\n'));
|
|
242
|
-
const gates = getQualityGates(spec.risk_tier);
|
|
243
|
-
gates.forEach((gate) => {
|
|
244
|
-
console.log(` □ ${gate}`);
|
|
245
|
-
});
|
|
246
|
-
|
|
247
|
-
console.log(chalk.blue('\nUseful Commands:\n'));
|
|
248
|
-
console.log(' caws evaluate - Check quality score');
|
|
249
|
-
console.log(' caws validate - Validate working spec');
|
|
250
|
-
console.log(' caws status - View project health');
|
|
251
|
-
console.log(' caws diagnose - Run health checks');
|
|
252
|
-
console.log(' npm test - Run test suite');
|
|
253
|
-
console.log(' npm run coverage - Check test coverage\n');
|
|
254
|
-
} catch (error) {
|
|
255
|
-
console.error(chalk.red(`\nIteration guidance failed: ${error.message}`));
|
|
256
|
-
if (options.verbose) {
|
|
257
|
-
console.error(error.stack);
|
|
258
|
-
}
|
|
259
|
-
process.exit(1);
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
/**
|
|
264
|
-
* Generate guidance based on spec and current state
|
|
265
|
-
*/
|
|
266
|
-
function generateGuidance(spec, _currentState, _options) {
|
|
267
|
-
const mode = spec.mode;
|
|
268
|
-
const riskTier = spec.risk_tier;
|
|
269
|
-
|
|
270
|
-
// Default guidance structure
|
|
271
|
-
const guidance = {
|
|
272
|
-
phase: 'Implementation',
|
|
273
|
-
completed: [],
|
|
274
|
-
nextActions: [],
|
|
275
|
-
blockers: [],
|
|
276
|
-
recommendations: [],
|
|
277
|
-
};
|
|
278
|
-
|
|
279
|
-
// Mode-specific guidance
|
|
280
|
-
if (mode === 'feature') {
|
|
281
|
-
guidance.phase = 'Feature Development';
|
|
282
|
-
guidance.completed = ['Working specification created', 'Acceptance criteria defined'];
|
|
283
|
-
guidance.nextActions = [
|
|
284
|
-
'Write failing tests for first acceptance criterion',
|
|
285
|
-
'Implement minimum code to pass tests',
|
|
286
|
-
'Refactor and ensure all tests pass',
|
|
287
|
-
'Move to next acceptance criterion',
|
|
288
|
-
];
|
|
289
|
-
guidance.recommendations = [
|
|
290
|
-
'Follow TDD cycle: Red → Green → Refactor',
|
|
291
|
-
'Keep changes within scope boundaries',
|
|
292
|
-
'Update working spec as requirements evolve',
|
|
293
|
-
`Maintain ${riskTier === 1 ? '90%+' : riskTier === 2 ? '80%+' : '70%+'} test coverage`,
|
|
294
|
-
];
|
|
295
|
-
} else if (mode === 'refactor') {
|
|
296
|
-
guidance.phase = 'Refactoring';
|
|
297
|
-
guidance.completed = ['Working specification created', 'Baseline tests established'];
|
|
298
|
-
guidance.nextActions = [
|
|
299
|
-
'Ensure all existing tests pass',
|
|
300
|
-
'Make small, incremental refactoring changes',
|
|
301
|
-
'Run tests after each change',
|
|
302
|
-
'Update documentation as needed',
|
|
303
|
-
];
|
|
304
|
-
guidance.recommendations = [
|
|
305
|
-
'No behavior changes - tests must still pass',
|
|
306
|
-
'Use codemod scripts for large-scale changes',
|
|
307
|
-
'Generate semantic diff report',
|
|
308
|
-
'Keep commits small and atomic',
|
|
309
|
-
];
|
|
310
|
-
guidance.blockers = [
|
|
311
|
-
!spec.contracts?.length ? 'No contracts defined to prove unchanged behavior' : null,
|
|
312
|
-
].filter(Boolean);
|
|
313
|
-
} else if (mode === 'fix') {
|
|
314
|
-
guidance.phase = 'Bug Fix';
|
|
315
|
-
guidance.completed = ['Working specification created', 'Bug reproduced'];
|
|
316
|
-
guidance.nextActions = [
|
|
317
|
-
'Write failing test that reproduces the bug',
|
|
318
|
-
'Implement minimal fix',
|
|
319
|
-
'Verify test passes',
|
|
320
|
-
'Add regression tests',
|
|
321
|
-
];
|
|
322
|
-
guidance.recommendations = [
|
|
323
|
-
'Keep fix scope minimal',
|
|
324
|
-
'Document root cause in working spec',
|
|
325
|
-
'Add edge case tests to prevent recurrence',
|
|
326
|
-
'Consider if similar bugs exist elsewhere',
|
|
327
|
-
];
|
|
328
|
-
} else if (mode === 'doc') {
|
|
329
|
-
guidance.phase = 'Documentation';
|
|
330
|
-
guidance.completed = ['Working specification created'];
|
|
331
|
-
guidance.nextActions = [
|
|
332
|
-
'Update README with current information',
|
|
333
|
-
'Add code examples and usage snippets',
|
|
334
|
-
'Update API documentation',
|
|
335
|
-
'Review and update troubleshooting guides',
|
|
336
|
-
];
|
|
337
|
-
guidance.recommendations = [
|
|
338
|
-
'Use Mermaid for diagrams',
|
|
339
|
-
'Include code examples that actually work',
|
|
340
|
-
'Keep docs in sync with code',
|
|
341
|
-
'Add links to related documentation',
|
|
342
|
-
];
|
|
343
|
-
} else if (mode === 'chore') {
|
|
344
|
-
guidance.phase = 'Maintenance';
|
|
345
|
-
guidance.completed = ['Working specification created'];
|
|
346
|
-
guidance.nextActions = [
|
|
347
|
-
'Update dependencies to latest versions',
|
|
348
|
-
'Run tests to ensure compatibility',
|
|
349
|
-
'Update CI/CD configurations',
|
|
350
|
-
'Commit changes with descriptive message',
|
|
351
|
-
];
|
|
352
|
-
guidance.recommendations = [
|
|
353
|
-
'Review changelogs for breaking changes',
|
|
354
|
-
'Test locally before committing',
|
|
355
|
-
'Update lockfiles',
|
|
356
|
-
'Document any configuration changes',
|
|
357
|
-
];
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
// Check for common blockers
|
|
361
|
-
if (!fs.existsSync(path.join(process.cwd(), 'package.json'))) {
|
|
362
|
-
guidance.blockers.push('No package.json found');
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
if (spec.change_budget && !spec.change_budget.max_files) {
|
|
366
|
-
guidance.blockers.push('Change budget not defined');
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
return guidance;
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
/**
|
|
373
|
-
* Get quality gates for risk tier
|
|
374
|
-
*/
|
|
375
|
-
function getQualityGates(riskTier) {
|
|
376
|
-
const gates = {
|
|
377
|
-
1: [
|
|
378
|
-
'Branch coverage ≥ 90%',
|
|
379
|
-
'Mutation score ≥ 70%',
|
|
380
|
-
'All contract tests passing',
|
|
381
|
-
'Manual code review completed',
|
|
382
|
-
'No SAST/secret scan violations',
|
|
383
|
-
'Performance budgets met',
|
|
384
|
-
],
|
|
385
|
-
2: [
|
|
386
|
-
'Branch coverage ≥ 80%',
|
|
387
|
-
'Mutation score ≥ 50%',
|
|
388
|
-
'Contract tests passing (if external APIs)',
|
|
389
|
-
'E2E smoke tests passing',
|
|
390
|
-
'No security violations',
|
|
391
|
-
],
|
|
392
|
-
3: [
|
|
393
|
-
'Branch coverage ≥ 70%',
|
|
394
|
-
'Mutation score ≥ 30%',
|
|
395
|
-
'Integration happy-path tests passing',
|
|
396
|
-
'Linting passing',
|
|
397
|
-
],
|
|
398
|
-
};
|
|
399
|
-
|
|
400
|
-
return gates[riskTier] || gates[2];
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
/**
|
|
404
|
-
* Format phase slug into human-readable label
|
|
405
|
-
*/
|
|
406
|
-
function formatPhase(phase) {
|
|
407
|
-
const labels = {
|
|
408
|
-
'not-started': 'Not Started',
|
|
409
|
-
'spec-authoring': 'Spec Authoring',
|
|
410
|
-
'implementation': 'Implementation',
|
|
411
|
-
'verification': 'Verification',
|
|
412
|
-
'complete': 'Complete',
|
|
413
|
-
};
|
|
414
|
-
return labels[phase] || phase;
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
module.exports = { iterateCommand };
|
package/dist/commands/mode.js
DELETED
|
@@ -1,269 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview CAWS Mode Command
|
|
3
|
-
* Manage CAWS complexity tiers and switch between modes
|
|
4
|
-
* @author @darianrosebrook
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
const chalk = require('chalk');
|
|
8
|
-
const { safeAsync, outputResult } = require('../error-handler');
|
|
9
|
-
|
|
10
|
-
const {
|
|
11
|
-
getTier,
|
|
12
|
-
getAvailableTiers,
|
|
13
|
-
getCurrentMode,
|
|
14
|
-
setCurrentMode,
|
|
15
|
-
displayTierComparison,
|
|
16
|
-
getTierRecommendation,
|
|
17
|
-
} = require('../config/modes');
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Display current mode status
|
|
21
|
-
* @param {string} currentMode - The current mode to display
|
|
22
|
-
*/
|
|
23
|
-
function displayCurrentMode(currentMode) {
|
|
24
|
-
const tier = getTier(currentMode);
|
|
25
|
-
|
|
26
|
-
console.log(chalk.bold.cyan('\nCAWS Current Mode'));
|
|
27
|
-
console.log(chalk.cyan('==============================================\n'));
|
|
28
|
-
|
|
29
|
-
console.log(chalk.bold(`Active Mode: ${tier.icon} ${tier.color(currentMode)}`));
|
|
30
|
-
console.log(chalk.gray(`Description: ${tier.description}`));
|
|
31
|
-
console.log('');
|
|
32
|
-
|
|
33
|
-
// Quality requirements
|
|
34
|
-
console.log(chalk.bold('Quality Requirements:'));
|
|
35
|
-
console.log(chalk.gray(` Test Coverage: ≥${tier.qualityRequirements.testCoverage}%`));
|
|
36
|
-
console.log(chalk.gray(` Mutation Score: ≥${tier.qualityRequirements.mutationScore}%`));
|
|
37
|
-
console.log(chalk.gray(` Contracts: ${tier.qualityRequirements.contracts}`));
|
|
38
|
-
console.log('');
|
|
39
|
-
|
|
40
|
-
// Risk tiers supported
|
|
41
|
-
console.log(chalk.bold('Supported Risk Tiers:'));
|
|
42
|
-
tier.riskTiers.forEach((riskTier) => {
|
|
43
|
-
const riskColor =
|
|
44
|
-
riskTier === 'T1' ? chalk.red : riskTier === 'T2' ? chalk.yellow : chalk.green;
|
|
45
|
-
console.log(chalk.gray(` ${riskColor(riskTier)}`));
|
|
46
|
-
});
|
|
47
|
-
console.log('');
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Display mode details
|
|
52
|
-
* @param {string} mode - Mode to display
|
|
53
|
-
*/
|
|
54
|
-
function displayModeDetails(mode) {
|
|
55
|
-
const tier = getTier(mode);
|
|
56
|
-
const tierColor = tier.color;
|
|
57
|
-
const icon = tier.icon;
|
|
58
|
-
|
|
59
|
-
console.log(chalk.bold.cyan(`\n${icon} ${tierColor(tier.name)} Mode Details`));
|
|
60
|
-
console.log(chalk.cyan('=================================================================\n'));
|
|
61
|
-
|
|
62
|
-
console.log(`${tierColor(tier.name)} - ${tier.description}\n`);
|
|
63
|
-
|
|
64
|
-
// Quality Requirements
|
|
65
|
-
console.log(chalk.bold('Quality Requirements:'));
|
|
66
|
-
console.log(chalk.gray(` Test Coverage: ${tier.qualityRequirements.testCoverage}%`));
|
|
67
|
-
console.log(chalk.gray(` Mutation Score: ${tier.qualityRequirements.mutationScore}%`));
|
|
68
|
-
console.log(chalk.gray(` Contracts: ${tier.qualityRequirements.contracts}\n`));
|
|
69
|
-
|
|
70
|
-
// Supported Risk Tiers
|
|
71
|
-
console.log(chalk.bold('Supported Risk Tiers:'));
|
|
72
|
-
tier.riskTiers.forEach((riskTier) => {
|
|
73
|
-
const riskColor =
|
|
74
|
-
riskTier === 'T1' ? chalk.red : riskTier === 'T2' ? chalk.yellow : chalk.green;
|
|
75
|
-
console.log(chalk.gray(` ${riskColor(riskTier)}`));
|
|
76
|
-
});
|
|
77
|
-
console.log('');
|
|
78
|
-
|
|
79
|
-
// Available Commands
|
|
80
|
-
console.log(chalk.bold('Available Commands:'));
|
|
81
|
-
Object.entries(tier.commands)
|
|
82
|
-
.filter(([, available]) => available)
|
|
83
|
-
.forEach(([command]) => {
|
|
84
|
-
console.log(chalk.gray(` caws ${command}`));
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
const disabledCommands = Object.entries(tier.commands)
|
|
88
|
-
.filter(([, available]) => !available)
|
|
89
|
-
.map(([command]) => command);
|
|
90
|
-
|
|
91
|
-
if (disabledCommands.length > 0) {
|
|
92
|
-
console.log(chalk.bold('\nDisabled Commands:'));
|
|
93
|
-
disabledCommands.forEach((command) => {
|
|
94
|
-
console.log(chalk.gray(` caws ${command}`));
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
console.log('');
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Interactive mode selection
|
|
103
|
-
* @returns {Promise<string>} Selected mode
|
|
104
|
-
*/
|
|
105
|
-
async function interactiveModeSelection() {
|
|
106
|
-
const readline = require('readline');
|
|
107
|
-
|
|
108
|
-
const rl = readline.createInterface({
|
|
109
|
-
input: process.stdin,
|
|
110
|
-
output: process.stdout,
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
return new Promise((resolve) => {
|
|
114
|
-
console.log(chalk.bold.cyan('\nSelect CAWS Complexity Tier'));
|
|
115
|
-
console.log(chalk.cyan('==============================================\n'));
|
|
116
|
-
|
|
117
|
-
const tiers = getAvailableTiers();
|
|
118
|
-
tiers.forEach((tier, index) => {
|
|
119
|
-
const tierConfig = getTier(tier);
|
|
120
|
-
const tierColor = tierConfig.color;
|
|
121
|
-
const icon = tierConfig.icon;
|
|
122
|
-
console.log(`${index + 1}. ${icon} ${tierColor(tier)} - ${tierConfig.description}`);
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
console.log('\nEnter your choice (1-3): ');
|
|
126
|
-
|
|
127
|
-
rl.on('line', (input) => {
|
|
128
|
-
const choice = parseInt(input.trim());
|
|
129
|
-
if (choice >= 1 && choice <= tiers.length) {
|
|
130
|
-
rl.close();
|
|
131
|
-
resolve(tiers[choice - 1]);
|
|
132
|
-
} else {
|
|
133
|
-
console.log(chalk.red('Invalid choice. Please enter 1-3:'));
|
|
134
|
-
}
|
|
135
|
-
});
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
/**
|
|
140
|
-
* Mode command handler
|
|
141
|
-
* @param {string} action - Action to perform (current, set, compare, recommend)
|
|
142
|
-
* @param {Object} options - Command options
|
|
143
|
-
*/
|
|
144
|
-
async function modeCommand(action, options = {}) {
|
|
145
|
-
return safeAsync(
|
|
146
|
-
async () => {
|
|
147
|
-
switch (action) {
|
|
148
|
-
case 'current': {
|
|
149
|
-
const currentMode = await getCurrentMode();
|
|
150
|
-
displayCurrentMode(currentMode);
|
|
151
|
-
|
|
152
|
-
return outputResult({
|
|
153
|
-
command: 'mode current',
|
|
154
|
-
mode: currentMode,
|
|
155
|
-
tier: getTier(currentMode),
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
case 'set': {
|
|
160
|
-
let targetMode;
|
|
161
|
-
|
|
162
|
-
if (options.mode) {
|
|
163
|
-
targetMode = options.mode;
|
|
164
|
-
} else if (options.interactive) {
|
|
165
|
-
targetMode = await interactiveModeSelection();
|
|
166
|
-
} else {
|
|
167
|
-
throw new Error('Mode not specified. Use --mode <mode> or --interactive');
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
if (!getAvailableTiers().includes(targetMode)) {
|
|
171
|
-
throw new Error(
|
|
172
|
-
`Invalid mode: ${targetMode}. Available: ${getAvailableTiers().join(', ')}`
|
|
173
|
-
);
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
const success = await setCurrentMode(targetMode);
|
|
177
|
-
if (!success) {
|
|
178
|
-
throw new Error(`Failed to set mode to ${targetMode}`);
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
console.log(
|
|
182
|
-
chalk.green(
|
|
183
|
-
`Successfully switched to ${getTier(targetMode).icon} ${getTier(targetMode).color(targetMode)} mode`
|
|
184
|
-
)
|
|
185
|
-
);
|
|
186
|
-
|
|
187
|
-
return outputResult({
|
|
188
|
-
command: 'mode set',
|
|
189
|
-
mode: targetMode,
|
|
190
|
-
});
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
case 'compare': {
|
|
194
|
-
displayTierComparison();
|
|
195
|
-
|
|
196
|
-
return outputResult({
|
|
197
|
-
command: 'mode compare',
|
|
198
|
-
tiers: getAvailableTiers(),
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
case 'recommend': {
|
|
203
|
-
const projectInfo = {};
|
|
204
|
-
|
|
205
|
-
if (options.size) projectInfo.size = options.size;
|
|
206
|
-
if (options.teamSize) projectInfo.teamSize = parseInt(options.teamSize);
|
|
207
|
-
if (options.compliance) projectInfo.compliance = options.compliance === 'true';
|
|
208
|
-
if (options.audit) projectInfo.auditRequired = options.audit === 'true';
|
|
209
|
-
|
|
210
|
-
const recommendation = getTierRecommendation(projectInfo);
|
|
211
|
-
const recommendedTier = getTier(recommendation);
|
|
212
|
-
|
|
213
|
-
console.log(chalk.bold.cyan('\nRecommended CAWS Tier'));
|
|
214
|
-
console.log(chalk.cyan('==============================================\n'));
|
|
215
|
-
|
|
216
|
-
console.log(
|
|
217
|
-
`${recommendedTier.icon} ${recommendedTier.color(recommendedTier.name)} - ${recommendedTier.description}`
|
|
218
|
-
);
|
|
219
|
-
console.log(
|
|
220
|
-
chalk.gray(
|
|
221
|
-
`Quality: ${recommendedTier.qualityRequirements.testCoverage}% coverage, ${recommendedTier.qualityRequirements.mutationScore}% mutation`
|
|
222
|
-
)
|
|
223
|
-
);
|
|
224
|
-
|
|
225
|
-
if (options.details) {
|
|
226
|
-
console.log('');
|
|
227
|
-
displayModeDetails(recommendation);
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
return outputResult({
|
|
231
|
-
command: 'mode recommend',
|
|
232
|
-
recommendation,
|
|
233
|
-
tier: recommendedTier,
|
|
234
|
-
projectInfo,
|
|
235
|
-
});
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
case 'details': {
|
|
239
|
-
if (!options.mode) {
|
|
240
|
-
throw new Error('Mode not specified. Use --mode <mode>');
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
displayModeDetails(options.mode);
|
|
244
|
-
|
|
245
|
-
return outputResult({
|
|
246
|
-
command: 'mode details',
|
|
247
|
-
mode: options.mode,
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
default:
|
|
252
|
-
throw new Error(
|
|
253
|
-
`Unknown mode action: ${action}. Use: current, set, compare, recommend, details`
|
|
254
|
-
);
|
|
255
|
-
}
|
|
256
|
-
},
|
|
257
|
-
`mode ${action}`,
|
|
258
|
-
true
|
|
259
|
-
);
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
module.exports = {
|
|
263
|
-
modeCommand,
|
|
264
|
-
getCurrentMode,
|
|
265
|
-
setCurrentMode,
|
|
266
|
-
displayCurrentMode,
|
|
267
|
-
displayModeDetails,
|
|
268
|
-
interactiveModeSelection,
|
|
269
|
-
};
|