@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,242 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview CAWS Parallel CLI Command
|
|
3
|
-
* Orchestrates parallel multi-agent workspaces
|
|
4
|
-
* @author @darianrosebrook
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
const chalk = require('chalk');
|
|
8
|
-
const path = require('path');
|
|
9
|
-
const {
|
|
10
|
-
loadPlan,
|
|
11
|
-
setupParallel,
|
|
12
|
-
getParallelStatus,
|
|
13
|
-
mergeParallel,
|
|
14
|
-
teardownParallel,
|
|
15
|
-
} = require('../parallel/parallel-manager');
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Handle parallel subcommands
|
|
19
|
-
* @param {string} subcommand - Subcommand name
|
|
20
|
-
* @param {Object} options - Command options
|
|
21
|
-
*/
|
|
22
|
-
async function parallelCommand(subcommand, options = {}) {
|
|
23
|
-
try {
|
|
24
|
-
switch (subcommand) {
|
|
25
|
-
case 'setup':
|
|
26
|
-
return handleSetup(options);
|
|
27
|
-
case 'status':
|
|
28
|
-
return handleStatus();
|
|
29
|
-
case 'merge':
|
|
30
|
-
return handleMerge(options);
|
|
31
|
-
case 'teardown':
|
|
32
|
-
return handleTeardown(options);
|
|
33
|
-
default:
|
|
34
|
-
console.error(chalk.red(`Unknown parallel subcommand: ${subcommand}`));
|
|
35
|
-
console.log(chalk.blue('Available: setup, status, merge, teardown'));
|
|
36
|
-
process.exit(1);
|
|
37
|
-
}
|
|
38
|
-
} catch (error) {
|
|
39
|
-
console.error(chalk.red(`${error.message}`));
|
|
40
|
-
process.exit(1);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
function handleSetup(options) {
|
|
45
|
-
const { planFile, baseBranch } = options;
|
|
46
|
-
|
|
47
|
-
if (!planFile) {
|
|
48
|
-
console.error(chalk.red('Plan file is required'));
|
|
49
|
-
console.log(chalk.blue('Usage: caws parallel setup <plan-file> [--base-branch <branch>]'));
|
|
50
|
-
process.exit(1);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
const planPath = path.resolve(planFile);
|
|
54
|
-
console.log(chalk.cyan(`Loading plan: ${planFile}`));
|
|
55
|
-
|
|
56
|
-
const plan = loadPlan(planPath);
|
|
57
|
-
|
|
58
|
-
// Allow CLI --base-branch to override plan file
|
|
59
|
-
if (baseBranch) {
|
|
60
|
-
plan.baseBranch = baseBranch;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
console.log(chalk.cyan(`Setting up ${plan.agents.length} parallel worktree(s)...`));
|
|
64
|
-
const results = setupParallel(plan);
|
|
65
|
-
|
|
66
|
-
console.log(chalk.green(`\nParallel workspace created`));
|
|
67
|
-
console.log(chalk.gray(` Base branch: ${results[0] ? results[0].baseBranch : plan.baseBranch || 'main'}`));
|
|
68
|
-
console.log(chalk.gray(` Strategy: ${plan.mergeStrategy}`));
|
|
69
|
-
console.log('');
|
|
70
|
-
|
|
71
|
-
// Print table
|
|
72
|
-
console.log(
|
|
73
|
-
chalk.bold(
|
|
74
|
-
'Agent'.padEnd(20) +
|
|
75
|
-
'Branch'.padEnd(25) +
|
|
76
|
-
'Scope'
|
|
77
|
-
)
|
|
78
|
-
);
|
|
79
|
-
console.log(chalk.gray('-'.repeat(70)));
|
|
80
|
-
|
|
81
|
-
for (const entry of results) {
|
|
82
|
-
console.log(
|
|
83
|
-
entry.name.padEnd(20) +
|
|
84
|
-
chalk.cyan(entry.branch.padEnd(25)) +
|
|
85
|
-
chalk.gray(entry.scope || '(all)')
|
|
86
|
-
);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
console.log('');
|
|
90
|
-
console.log(chalk.blue('Direct each agent to its worktree:'));
|
|
91
|
-
for (const entry of results) {
|
|
92
|
-
console.log(chalk.gray(` ${entry.name}: cd ${entry.path}`));
|
|
93
|
-
}
|
|
94
|
-
console.log('');
|
|
95
|
-
console.log(chalk.blue('Monitor progress: caws parallel status'));
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
function handleStatus() {
|
|
99
|
-
const status = getParallelStatus();
|
|
100
|
-
|
|
101
|
-
if (!status) {
|
|
102
|
-
console.log(chalk.gray('No active parallel run.'));
|
|
103
|
-
console.log(chalk.blue('Start one with: caws parallel setup <plan-file>'));
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
console.log(chalk.bold.cyan('CAWS Parallel Status'));
|
|
108
|
-
console.log(chalk.cyan('='.repeat(70)));
|
|
109
|
-
console.log(chalk.gray(` Base branch: ${status.baseBranch}`));
|
|
110
|
-
console.log(chalk.gray(` Strategy: ${status.mergeStrategy}`));
|
|
111
|
-
console.log(chalk.gray(` Created: ${status.createdAt}`));
|
|
112
|
-
console.log('');
|
|
113
|
-
|
|
114
|
-
// Agent table
|
|
115
|
-
console.log(
|
|
116
|
-
chalk.bold(
|
|
117
|
-
'Agent'.padEnd(18) +
|
|
118
|
-
'Status'.padEnd(10) +
|
|
119
|
-
'Branch'.padEnd(22) +
|
|
120
|
-
'Commits'.padEnd(9) +
|
|
121
|
-
'Dirty'.padEnd(7) +
|
|
122
|
-
'Scope'
|
|
123
|
-
)
|
|
124
|
-
);
|
|
125
|
-
console.log(chalk.gray('-'.repeat(80)));
|
|
126
|
-
|
|
127
|
-
for (const agent of status.agents) {
|
|
128
|
-
const statusColor =
|
|
129
|
-
agent.status === 'active'
|
|
130
|
-
? chalk.green
|
|
131
|
-
: agent.status === 'fresh'
|
|
132
|
-
? chalk.cyan
|
|
133
|
-
: agent.status === 'merged'
|
|
134
|
-
? chalk.blue
|
|
135
|
-
: agent.status === 'missing'
|
|
136
|
-
? chalk.red
|
|
137
|
-
: chalk.yellow;
|
|
138
|
-
|
|
139
|
-
console.log(
|
|
140
|
-
agent.name.padEnd(18) +
|
|
141
|
-
statusColor(agent.status.padEnd(10)) +
|
|
142
|
-
agent.branch.padEnd(22) +
|
|
143
|
-
String(agent.commitCount).padEnd(9) +
|
|
144
|
-
(agent.dirty ? chalk.yellow('yes') : chalk.gray('no')).padEnd(7 + 10) + // +10 for chalk color codes
|
|
145
|
-
chalk.gray(agent.scope || '(all)')
|
|
146
|
-
);
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
// Show conflicts
|
|
150
|
-
if (status.conflicts.length > 0) {
|
|
151
|
-
console.log('');
|
|
152
|
-
console.log(chalk.yellow(`WARNING: ${status.conflicts.length} file-level conflict(s) detected:`));
|
|
153
|
-
for (const conflict of status.conflicts) {
|
|
154
|
-
console.log(chalk.yellow(` ${conflict.file} -- modified by: ${conflict.agents.join(', ')}`));
|
|
155
|
-
}
|
|
156
|
-
console.log(chalk.blue(' These files were modified by multiple agents and may cause merge conflicts.'));
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
console.log('');
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
function handleMerge(options) {
|
|
163
|
-
const { strategy, dryRun, force } = options;
|
|
164
|
-
|
|
165
|
-
if (dryRun) {
|
|
166
|
-
console.log(chalk.cyan('Dry run: previewing merge...'));
|
|
167
|
-
} else {
|
|
168
|
-
console.log(chalk.cyan('Merging parallel branches back to base...'));
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
const result = mergeParallel({ strategy, dryRun, force });
|
|
172
|
-
|
|
173
|
-
// Show conflicts
|
|
174
|
-
if (result.conflicts.length > 0) {
|
|
175
|
-
console.log(chalk.yellow(`\n${result.conflicts.length} file-level conflict(s) detected:`));
|
|
176
|
-
for (const conflict of result.conflicts) {
|
|
177
|
-
console.log(chalk.yellow(` ${conflict.file} -- ${conflict.agents.join(', ')}`));
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
if (!force && !dryRun) {
|
|
181
|
-
console.log('');
|
|
182
|
-
console.log(chalk.red('Merge aborted due to conflicts.'));
|
|
183
|
-
console.log(chalk.blue(' Review conflicts, then: caws parallel merge --force'));
|
|
184
|
-
return;
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
if (dryRun) {
|
|
189
|
-
console.log(chalk.green(`\nWould merge ${result.merged.length} branch(es):`));
|
|
190
|
-
for (const name of result.merged) {
|
|
191
|
-
console.log(chalk.gray(` - ${name}`));
|
|
192
|
-
}
|
|
193
|
-
return;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
if (result.merged.length > 0) {
|
|
197
|
-
console.log(chalk.green(`\nMerged ${result.merged.length} branch(es):`));
|
|
198
|
-
for (const name of result.merged) {
|
|
199
|
-
console.log(chalk.gray(` - ${name}`));
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
if (result.failed.length > 0) {
|
|
204
|
-
console.log(chalk.red(`\nFailed to merge ${result.failed.length} branch(es):`));
|
|
205
|
-
for (const fail of result.failed) {
|
|
206
|
-
console.log(chalk.red(` - ${fail.name}: ${fail.error}`));
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
if (result.merged.length > 0 && result.failed.length === 0) {
|
|
211
|
-
console.log('');
|
|
212
|
-
console.log(chalk.blue('Clean up with: caws parallel teardown --delete-branches'));
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
function handleTeardown(options) {
|
|
217
|
-
const { deleteBranches, force } = options;
|
|
218
|
-
|
|
219
|
-
console.log(chalk.cyan('Tearing down parallel worktrees...'));
|
|
220
|
-
const result = teardownParallel({ deleteBranches, force });
|
|
221
|
-
|
|
222
|
-
if (result.destroyed.length > 0) {
|
|
223
|
-
console.log(chalk.green(`Destroyed ${result.destroyed.length} worktree(s):`));
|
|
224
|
-
for (const name of result.destroyed) {
|
|
225
|
-
console.log(chalk.gray(` - ${name}`));
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
if (result.failed.length > 0) {
|
|
230
|
-
console.log(chalk.red(`Failed to destroy ${result.failed.length} worktree(s):`));
|
|
231
|
-
for (const fail of result.failed) {
|
|
232
|
-
console.log(chalk.red(` - ${fail.name}: ${fail.error}`));
|
|
233
|
-
}
|
|
234
|
-
console.log(chalk.blue(' Use --force to override'));
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
if (deleteBranches) {
|
|
238
|
-
console.log(chalk.gray(' Branches also deleted'));
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
module.exports = { parallelCommand };
|
package/dist/commands/plan.js
DELETED
|
@@ -1,438 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview CAWS Plan Command
|
|
3
|
-
* Automated plan generation from specifications (multi-spec aware)
|
|
4
|
-
* @author @darianrosebrook
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
const fs = require('fs-extra');
|
|
8
|
-
const path = require('path');
|
|
9
|
-
const chalk = require('chalk');
|
|
10
|
-
const { safeAsync, outputResult } = require('../error-handler');
|
|
11
|
-
|
|
12
|
-
// Import spec resolution system
|
|
13
|
-
const { resolveSpec, loadSpecsRegistry } = require('../utils/spec-resolver');
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Plan templates for different spec types
|
|
17
|
-
*/
|
|
18
|
-
const PLAN_TEMPLATES = {
|
|
19
|
-
feature: {
|
|
20
|
-
sections: [
|
|
21
|
-
'Overview',
|
|
22
|
-
'Acceptance Criteria Analysis',
|
|
23
|
-
'Implementation Strategy',
|
|
24
|
-
'Testing Strategy',
|
|
25
|
-
'Risk Assessment',
|
|
26
|
-
'Dependencies',
|
|
27
|
-
'Timeline',
|
|
28
|
-
'Success Metrics',
|
|
29
|
-
],
|
|
30
|
-
defaultTasks: [
|
|
31
|
-
'Set up development environment',
|
|
32
|
-
'Implement core functionality',
|
|
33
|
-
'Add error handling',
|
|
34
|
-
'Write comprehensive tests',
|
|
35
|
-
'Update documentation',
|
|
36
|
-
'Performance optimization',
|
|
37
|
-
'Security review',
|
|
38
|
-
'Final validation',
|
|
39
|
-
],
|
|
40
|
-
},
|
|
41
|
-
fix: {
|
|
42
|
-
sections: [
|
|
43
|
-
'Problem Analysis',
|
|
44
|
-
'Root Cause Investigation',
|
|
45
|
-
'Solution Design',
|
|
46
|
-
'Implementation Plan',
|
|
47
|
-
'Testing Strategy',
|
|
48
|
-
'Rollback Plan',
|
|
49
|
-
'Verification',
|
|
50
|
-
],
|
|
51
|
-
defaultTasks: [
|
|
52
|
-
'Reproduce the issue',
|
|
53
|
-
'Identify root cause',
|
|
54
|
-
'Design fix approach',
|
|
55
|
-
'Implement solution',
|
|
56
|
-
'Write regression tests',
|
|
57
|
-
'Update documentation',
|
|
58
|
-
'Deploy and verify',
|
|
59
|
-
],
|
|
60
|
-
},
|
|
61
|
-
refactor: {
|
|
62
|
-
sections: [
|
|
63
|
-
'Current State Analysis',
|
|
64
|
-
'Refactoring Goals',
|
|
65
|
-
'Approach Strategy',
|
|
66
|
-
'Implementation Plan',
|
|
67
|
-
'Testing Strategy',
|
|
68
|
-
'Performance Impact',
|
|
69
|
-
'Migration Plan',
|
|
70
|
-
],
|
|
71
|
-
defaultTasks: [
|
|
72
|
-
'Analyze current code',
|
|
73
|
-
'Design new architecture',
|
|
74
|
-
'Plan incremental changes',
|
|
75
|
-
'Implement refactoring',
|
|
76
|
-
'Update tests',
|
|
77
|
-
'Performance validation',
|
|
78
|
-
'Documentation update',
|
|
79
|
-
],
|
|
80
|
-
},
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Load spec for plan generation
|
|
85
|
-
* @param {string} specId - Spec identifier
|
|
86
|
-
* @returns {Promise<Object|null>} Spec data or null
|
|
87
|
-
*/
|
|
88
|
-
async function loadSpecForPlanning(specId) {
|
|
89
|
-
const resolved = await resolveSpec({
|
|
90
|
-
specId,
|
|
91
|
-
warnLegacy: false,
|
|
92
|
-
});
|
|
93
|
-
return resolved.spec;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* Generate and display implementation plan
|
|
98
|
-
* @param {Object} spec - Spec data
|
|
99
|
-
* @param {string} specId - Spec identifier
|
|
100
|
-
* @param {Object} options - Command options
|
|
101
|
-
*/
|
|
102
|
-
async function generateAndDisplayPlan(spec, specId, options) {
|
|
103
|
-
// Generate plan
|
|
104
|
-
const plan = generateImplementationPlan(spec);
|
|
105
|
-
|
|
106
|
-
// Determine output path
|
|
107
|
-
const outputPath = options.output || `.caws/plans/${specId}-plan.md`;
|
|
108
|
-
|
|
109
|
-
// Write plan to file
|
|
110
|
-
await writePlanToFile(plan, outputPath);
|
|
111
|
-
|
|
112
|
-
// Display plan summary
|
|
113
|
-
displayGeneratedPlan(plan);
|
|
114
|
-
|
|
115
|
-
console.log(chalk.green(`Plan generated: ${outputPath}`));
|
|
116
|
-
|
|
117
|
-
return outputResult({
|
|
118
|
-
command: 'plan generate',
|
|
119
|
-
specId,
|
|
120
|
-
outputPath,
|
|
121
|
-
planSections: plan.sections.length,
|
|
122
|
-
tasks: plan.tasks.length,
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* Generate implementation tasks from acceptance criteria
|
|
128
|
-
* @param {Array} criteria - Acceptance criteria
|
|
129
|
-
* @returns {Array} Generated tasks
|
|
130
|
-
*/
|
|
131
|
-
function generateTasksFromCriteria(criteria) {
|
|
132
|
-
const tasks = [];
|
|
133
|
-
|
|
134
|
-
criteria.forEach((criterion, index) => {
|
|
135
|
-
const criterionId = criterion.id || `A${index + 1}`;
|
|
136
|
-
const description = criterion.description || criterion.title || `Implement ${criterionId}`;
|
|
137
|
-
|
|
138
|
-
// Break down complex criteria into multiple tasks
|
|
139
|
-
if (description.includes('and') || description.includes('then') || description.length > 100) {
|
|
140
|
-
// Split into multiple tasks
|
|
141
|
-
const parts = description.split(/[.;]/).filter((part) => part.trim().length > 0);
|
|
142
|
-
parts.forEach((part, partIndex) => {
|
|
143
|
-
tasks.push({
|
|
144
|
-
id: `${criterionId}.${partIndex + 1}`,
|
|
145
|
-
title: part.trim(),
|
|
146
|
-
criterion: criterionId,
|
|
147
|
-
type: 'implementation',
|
|
148
|
-
estimatedHours: 2,
|
|
149
|
-
dependencies: partIndex > 0 ? [`${criterionId}.${partIndex}`] : [],
|
|
150
|
-
});
|
|
151
|
-
});
|
|
152
|
-
} else {
|
|
153
|
-
// Single task for simple criteria
|
|
154
|
-
tasks.push({
|
|
155
|
-
id: criterionId,
|
|
156
|
-
title: description,
|
|
157
|
-
criterion: criterionId,
|
|
158
|
-
type: 'implementation',
|
|
159
|
-
estimatedHours: 3,
|
|
160
|
-
dependencies: [],
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
return tasks;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* Generate testing tasks for acceptance criteria
|
|
170
|
-
* @param {Array} criteria - Acceptance criteria
|
|
171
|
-
* @returns {Array} Generated test tasks
|
|
172
|
-
*/
|
|
173
|
-
function generateTestTasks(criteria) {
|
|
174
|
-
const tasks = [];
|
|
175
|
-
|
|
176
|
-
criteria.forEach((criterion, index) => {
|
|
177
|
-
const criterionId = criterion.id || `A${index + 1}`;
|
|
178
|
-
|
|
179
|
-
tasks.push({
|
|
180
|
-
id: `test-${criterionId}`,
|
|
181
|
-
title: `Write tests for ${criterionId}`,
|
|
182
|
-
criterion: criterionId,
|
|
183
|
-
type: 'testing',
|
|
184
|
-
estimatedHours: 2,
|
|
185
|
-
dependencies: [criterionId],
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
tasks.push({
|
|
189
|
-
id: `integration-${criterionId}`,
|
|
190
|
-
title: `Integration tests for ${criterionId}`,
|
|
191
|
-
criterion: criterionId,
|
|
192
|
-
type: 'testing',
|
|
193
|
-
estimatedHours: 1,
|
|
194
|
-
dependencies: [`test-${criterionId}`],
|
|
195
|
-
});
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
return tasks;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
/**
|
|
202
|
-
* Generate implementation plan from spec
|
|
203
|
-
* @param {Object} spec - Spec data
|
|
204
|
-
* @returns {Object} Generated plan
|
|
205
|
-
*/
|
|
206
|
-
function generateImplementationPlan(spec) {
|
|
207
|
-
const template = PLAN_TEMPLATES[spec.type] || PLAN_TEMPLATES.feature;
|
|
208
|
-
|
|
209
|
-
// Generate tasks from acceptance criteria
|
|
210
|
-
const implementationTasks = generateTasksFromCriteria(spec.acceptance_criteria || []);
|
|
211
|
-
const testTasks = generateTestTasks(spec.acceptance_criteria || []);
|
|
212
|
-
|
|
213
|
-
// Combine all tasks
|
|
214
|
-
const allTasks = [
|
|
215
|
-
...template.defaultTasks.map((task, index) => ({
|
|
216
|
-
id: `setup-${index + 1}`,
|
|
217
|
-
title: task,
|
|
218
|
-
type: 'setup',
|
|
219
|
-
estimatedHours: 1,
|
|
220
|
-
dependencies: [],
|
|
221
|
-
})),
|
|
222
|
-
...implementationTasks,
|
|
223
|
-
...testTasks,
|
|
224
|
-
];
|
|
225
|
-
|
|
226
|
-
// Calculate timeline
|
|
227
|
-
const totalHours = allTasks.reduce((sum, task) => sum + task.estimatedHours, 0);
|
|
228
|
-
const estimatedDays = Math.ceil(totalHours / 8); // Assuming 8-hour work days
|
|
229
|
-
|
|
230
|
-
// Generate plan content
|
|
231
|
-
const planContent = {
|
|
232
|
-
spec_id: spec.id,
|
|
233
|
-
title: `Implementation Plan: ${spec.title}`,
|
|
234
|
-
generated_at: new Date().toISOString(),
|
|
235
|
-
sections: template.sections,
|
|
236
|
-
tasks: allTasks,
|
|
237
|
-
timeline: {
|
|
238
|
-
total_hours: totalHours,
|
|
239
|
-
estimated_days: estimatedDays,
|
|
240
|
-
parallel_execution: true,
|
|
241
|
-
},
|
|
242
|
-
risks: [
|
|
243
|
-
{
|
|
244
|
-
level: 'low',
|
|
245
|
-
description: 'Standard implementation risks',
|
|
246
|
-
mitigation: 'Follow established patterns and conduct thorough testing',
|
|
247
|
-
},
|
|
248
|
-
],
|
|
249
|
-
};
|
|
250
|
-
|
|
251
|
-
return planContent;
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
/**
|
|
255
|
-
* Write plan to file
|
|
256
|
-
* @param {Object} plan - Plan data
|
|
257
|
-
* @param {string} outputPath - Output file path
|
|
258
|
-
* @returns {Promise<void>}
|
|
259
|
-
*/
|
|
260
|
-
async function writePlanToFile(plan, outputPath) {
|
|
261
|
-
const planDir = path.dirname(outputPath);
|
|
262
|
-
await fs.ensureDir(planDir);
|
|
263
|
-
|
|
264
|
-
const markdownContent = generatePlanMarkdown(plan);
|
|
265
|
-
await fs.writeFile(outputPath, markdownContent);
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
/**
|
|
269
|
-
* Generate markdown content from plan
|
|
270
|
-
* @param {Object} plan - Plan data
|
|
271
|
-
* @returns {string} Markdown content
|
|
272
|
-
*/
|
|
273
|
-
function generatePlanMarkdown(plan) {
|
|
274
|
-
let content = `# ${plan.title}\n\n`;
|
|
275
|
-
content += `**Generated:** ${new Date(plan.generated_at).toLocaleString()}\n`;
|
|
276
|
-
content += `**Spec ID:** ${plan.spec_id}\n\n`;
|
|
277
|
-
|
|
278
|
-
// Overview section
|
|
279
|
-
content += `## Overview\n\n`;
|
|
280
|
-
content += `This plan outlines the implementation strategy for the specified requirements.\n`;
|
|
281
|
-
content += `**Timeline:** ${plan.timeline.estimated_days} days (${plan.timeline.total_hours} hours)\n\n`;
|
|
282
|
-
|
|
283
|
-
// Tasks section
|
|
284
|
-
content += `## Implementation Tasks\n\n`;
|
|
285
|
-
|
|
286
|
-
// Group tasks by type
|
|
287
|
-
const setupTasks = plan.tasks.filter((task) => task.type === 'setup');
|
|
288
|
-
const implementationTasks = plan.tasks.filter((task) => task.type === 'implementation');
|
|
289
|
-
const testTasks = plan.tasks.filter((task) => task.type === 'testing');
|
|
290
|
-
|
|
291
|
-
if (setupTasks.length > 0) {
|
|
292
|
-
content += `### Setup (${setupTasks.length} tasks)\n\n`;
|
|
293
|
-
setupTasks.forEach((task) => {
|
|
294
|
-
content += `- [ ] **${task.id}** - ${task.title} (${task.estimatedHours}h)\n`;
|
|
295
|
-
});
|
|
296
|
-
content += '\n';
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
if (implementationTasks.length > 0) {
|
|
300
|
-
content += `### Implementation (${implementationTasks.length} tasks)\n\n`;
|
|
301
|
-
implementationTasks.forEach((task) => {
|
|
302
|
-
const deps =
|
|
303
|
-
task.dependencies.length > 0 ? ` (depends on: ${task.dependencies.join(', ')})` : '';
|
|
304
|
-
content += `- [ ] **${task.id}** - ${task.title} (${task.estimatedHours}h)${deps}\n`;
|
|
305
|
-
});
|
|
306
|
-
content += '\n';
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
if (testTasks.length > 0) {
|
|
310
|
-
content += `### Testing (${testTasks.length} tasks)\n\n`;
|
|
311
|
-
testTasks.forEach((task) => {
|
|
312
|
-
const deps =
|
|
313
|
-
task.dependencies.length > 0 ? ` (depends on: ${task.dependencies.join(', ')})` : '';
|
|
314
|
-
content += `- [ ] **${task.id}** - ${task.title} (${task.estimatedHours}h)${deps}\n`;
|
|
315
|
-
});
|
|
316
|
-
content += '\n';
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
// Risk assessment
|
|
320
|
-
content += `## Risk Assessment\n\n`;
|
|
321
|
-
plan.risks.forEach((risk, index) => {
|
|
322
|
-
content += `### ${risk.level.toUpperCase()} Risk ${index + 1}\n`;
|
|
323
|
-
content += `${risk.description}\n\n`;
|
|
324
|
-
content += `**Mitigation:** ${risk.mitigation}\n\n`;
|
|
325
|
-
});
|
|
326
|
-
|
|
327
|
-
// Success metrics
|
|
328
|
-
content += `## Success Metrics\n\n`;
|
|
329
|
-
content += `- All acceptance criteria implemented and tested\n`;
|
|
330
|
-
content += `- Code coverage meets project standards\n`;
|
|
331
|
-
content += `- Performance requirements satisfied\n`;
|
|
332
|
-
content += `- No breaking changes to existing functionality\n`;
|
|
333
|
-
content += `- Documentation updated\n\n`;
|
|
334
|
-
|
|
335
|
-
return content;
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
/**
|
|
339
|
-
* Display generated plan
|
|
340
|
-
* @param {Object} plan - Plan data
|
|
341
|
-
*/
|
|
342
|
-
function displayGeneratedPlan(plan) {
|
|
343
|
-
console.log(chalk.bold.cyan(`\nGenerated Implementation Plan`));
|
|
344
|
-
console.log(chalk.cyan('===================================================\n'));
|
|
345
|
-
|
|
346
|
-
console.log(chalk.bold(`Title: ${plan.title}`));
|
|
347
|
-
console.log(chalk.gray(`Spec: ${plan.spec_id}`));
|
|
348
|
-
console.log(chalk.gray(`Generated: ${new Date(plan.generated_at).toLocaleString()}`));
|
|
349
|
-
console.log('');
|
|
350
|
-
|
|
351
|
-
// Task summary
|
|
352
|
-
const setupTasks = plan.tasks.filter((task) => task.type === 'setup').length;
|
|
353
|
-
const implementationTasks = plan.tasks.filter((task) => task.type === 'implementation').length;
|
|
354
|
-
const testTasks = plan.tasks.filter((task) => task.type === 'testing').length;
|
|
355
|
-
|
|
356
|
-
console.log(chalk.bold('Task Breakdown:'));
|
|
357
|
-
if (setupTasks > 0) console.log(chalk.gray(` Setup: ${setupTasks} tasks`));
|
|
358
|
-
if (implementationTasks > 0)
|
|
359
|
-
console.log(chalk.gray(` Implementation: ${implementationTasks} tasks`));
|
|
360
|
-
if (testTasks > 0) console.log(chalk.gray(` Testing: ${testTasks} tasks`));
|
|
361
|
-
|
|
362
|
-
console.log(
|
|
363
|
-
chalk.gray(
|
|
364
|
-
` Total: ${plan.tasks.length} tasks, ${plan.timeline.total_hours} hours, ${plan.timeline.estimated_days} days`
|
|
365
|
-
)
|
|
366
|
-
);
|
|
367
|
-
console.log('');
|
|
368
|
-
|
|
369
|
-
// Next steps
|
|
370
|
-
console.log(chalk.bold.yellow('Next Steps:'));
|
|
371
|
-
console.log(chalk.yellow(' 1. Review and customize the generated plan'));
|
|
372
|
-
console.log(chalk.yellow(' 2. Update task priorities and dependencies'));
|
|
373
|
-
console.log(chalk.yellow(' 3. Start implementation following the task order'));
|
|
374
|
-
console.log(chalk.yellow(' 4. Update progress: caws progress update --criterion-id A1'));
|
|
375
|
-
console.log('');
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
/**
|
|
379
|
-
* Plan command handler
|
|
380
|
-
* @param {string} action - Action to perform (generate)
|
|
381
|
-
* @param {Object} options - Command options
|
|
382
|
-
*/
|
|
383
|
-
async function planCommand(action, options = {}) {
|
|
384
|
-
return safeAsync(
|
|
385
|
-
async () => {
|
|
386
|
-
switch (action) {
|
|
387
|
-
case 'generate': {
|
|
388
|
-
const specId = options.specId || options.spec;
|
|
389
|
-
|
|
390
|
-
if (!specId) {
|
|
391
|
-
// Try to auto-detect single spec
|
|
392
|
-
const { checkMultiSpecStatus } = require('../utils/spec-resolver');
|
|
393
|
-
const status = await checkMultiSpecStatus();
|
|
394
|
-
|
|
395
|
-
if (status.specCount === 1) {
|
|
396
|
-
// Use the single spec automatically
|
|
397
|
-
const registry = await loadSpecsRegistry();
|
|
398
|
-
const singleSpecId = Object.keys(registry.specs)[0];
|
|
399
|
-
console.log(chalk.blue(`Auto-detected single spec: ${singleSpecId}`));
|
|
400
|
-
|
|
401
|
-
const spec = await loadSpecForPlanning(singleSpecId);
|
|
402
|
-
await generateAndDisplayPlan(spec, singleSpecId, options);
|
|
403
|
-
} else if (status.specCount > 1) {
|
|
404
|
-
const registry = await loadSpecsRegistry();
|
|
405
|
-
throw new Error(
|
|
406
|
-
'Multiple specs detected. Please specify which one: caws plan generate --spec-id <id>\n' +
|
|
407
|
-
'Available specs: ' +
|
|
408
|
-
Object.keys(registry.specs || {}).join(', ')
|
|
409
|
-
);
|
|
410
|
-
} else {
|
|
411
|
-
throw new Error('No specs found. Create a spec first: caws specs create <id>');
|
|
412
|
-
}
|
|
413
|
-
} else {
|
|
414
|
-
// Load spec for planning
|
|
415
|
-
const spec = await loadSpecForPlanning(specId);
|
|
416
|
-
|
|
417
|
-
return await generateAndDisplayPlan(spec, specId, options);
|
|
418
|
-
}
|
|
419
|
-
break;
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
default:
|
|
423
|
-
throw new Error(`Unknown plan action: ${action}. Use: generate`);
|
|
424
|
-
}
|
|
425
|
-
},
|
|
426
|
-
`plan ${action}`,
|
|
427
|
-
true
|
|
428
|
-
);
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
module.exports = {
|
|
432
|
-
planCommand,
|
|
433
|
-
generateImplementationPlan,
|
|
434
|
-
writePlanToFile,
|
|
435
|
-
generatePlanMarkdown,
|
|
436
|
-
displayGeneratedPlan,
|
|
437
|
-
PLAN_TEMPLATES,
|
|
438
|
-
};
|