@paths.design/caws-cli 10.2.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 -785
- 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/agents.js +0 -124
- 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 -1656
- package/dist/commands/status.js +0 -1172
- 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 -502
- 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 -112
- 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 -470
- 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 -117
- 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 -101
- 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 -196
- package/dist/templates/COMMIT_CONVENTIONS.md +0 -86
- package/dist/templates/OIDC_SETUP.md +0 -300
- package/dist/templates/agents.md +0 -171
- 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-display.js +0 -210
- package/dist/utils/agent-session.js +0 -344
- 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 -924
- package/dist/waivers-manager.js +0 -732
- package/dist/worktree/worktree-manager.js +0 -1735
- package/templates/.caws/schemas/policy.schema.json +0 -117
- 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 -101
- 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 -196
- package/templates/COMMIT_CONVENTIONS.md +0 -86
- package/templates/OIDC_SETUP.md +0 -300
- package/templates/agents.md +0 -171
- 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/cicd-optimizer.js
DELETED
|
@@ -1,504 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CAWS CI/CD Optimizer
|
|
3
|
-
*
|
|
4
|
-
* Optimizes CI/CD pipelines with tier-based conditional execution,
|
|
5
|
-
* parallel processing, and smart caching strategies.
|
|
6
|
-
*
|
|
7
|
-
* @author @darianrosebrook
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
const fs = require('fs');
|
|
11
|
-
const path = require('path');
|
|
12
|
-
const crypto = require('crypto');
|
|
13
|
-
|
|
14
|
-
class CICDOptimizer {
|
|
15
|
-
constructor(options = {}) {
|
|
16
|
-
this.projectRoot = options.projectRoot || process.cwd();
|
|
17
|
-
this.cacheDir = path.join(this.projectRoot, '.caws', 'cache');
|
|
18
|
-
this.optimizationConfig = path.join(this.projectRoot, '.caws', 'cicd-config.yaml');
|
|
19
|
-
|
|
20
|
-
// Ensure cache directory exists
|
|
21
|
-
if (!fs.existsSync(this.cacheDir)) {
|
|
22
|
-
fs.mkdirSync(this.cacheDir, { recursive: true });
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Analyze project and generate CI/CD optimization recommendations
|
|
28
|
-
*/
|
|
29
|
-
async analyzeProject(specPath = '.caws/working-spec.yaml') {
|
|
30
|
-
const analysis = {
|
|
31
|
-
project_tier: 'unknown',
|
|
32
|
-
recommended_optimizations: [],
|
|
33
|
-
cache_strategy: {},
|
|
34
|
-
parallel_groups: [],
|
|
35
|
-
conditional_execution: {},
|
|
36
|
-
estimated_savings: {},
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
try {
|
|
40
|
-
// Load working spec to determine tier
|
|
41
|
-
if (fs.existsSync(specPath)) {
|
|
42
|
-
const yaml = require('js-yaml');
|
|
43
|
-
const spec = yaml.load(fs.readFileSync(specPath, 'utf8'));
|
|
44
|
-
analysis.project_tier = spec.risk_tier || 2;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// Analyze current project structure
|
|
48
|
-
analysis.recommended_optimizations = await this.analyzeOptimizationOpportunities(
|
|
49
|
-
analysis.project_tier
|
|
50
|
-
);
|
|
51
|
-
|
|
52
|
-
// Generate cache strategy
|
|
53
|
-
analysis.cache_strategy = await this.generateCacheStrategy();
|
|
54
|
-
|
|
55
|
-
// Create parallel execution groups
|
|
56
|
-
analysis.parallel_groups = await this.createParallelGroups();
|
|
57
|
-
|
|
58
|
-
// Define conditional execution rules
|
|
59
|
-
analysis.conditional_execution = this.generateConditionalExecutionRules(
|
|
60
|
-
analysis.project_tier
|
|
61
|
-
);
|
|
62
|
-
|
|
63
|
-
// Estimate time savings
|
|
64
|
-
analysis.estimated_savings = this.estimateTimeSavings(analysis);
|
|
65
|
-
} catch (error) {
|
|
66
|
-
console.warn('Warning: Could not complete full analysis:', error.message);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
return analysis;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Generate tier-based conditional execution rules
|
|
74
|
-
*/
|
|
75
|
-
generateConditionalExecutionRules(tier) {
|
|
76
|
-
const rules = {
|
|
77
|
-
coverage_required: tier <= 2,
|
|
78
|
-
mutation_required: tier === 1,
|
|
79
|
-
contract_testing: tier <= 2,
|
|
80
|
-
accessibility_check: tier <= 2,
|
|
81
|
-
performance_budget: tier === 1,
|
|
82
|
-
security_scan: true, // Always required
|
|
83
|
-
lint_strict: tier <= 2,
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
// Add tier-specific rules
|
|
87
|
-
if (tier === 1) {
|
|
88
|
-
rules.integration_tests = true;
|
|
89
|
-
rules.load_testing = true;
|
|
90
|
-
rules.manual_review = true;
|
|
91
|
-
} else if (tier === 2) {
|
|
92
|
-
rules.integration_tests = true;
|
|
93
|
-
rules.smoke_tests = true;
|
|
94
|
-
} else {
|
|
95
|
-
rules.unit_tests_only = true;
|
|
96
|
-
rules.fast_feedback = true;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
return rules;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* Analyze what optimizations are beneficial for this tier
|
|
104
|
-
*/
|
|
105
|
-
async analyzeOptimizationOpportunities(tier) {
|
|
106
|
-
const opportunities = [];
|
|
107
|
-
|
|
108
|
-
// Tier-based optimizations
|
|
109
|
-
if (tier === 3) {
|
|
110
|
-
opportunities.push({
|
|
111
|
-
type: 'fast_feedback',
|
|
112
|
-
description: 'Skip heavy analysis for quick feedback',
|
|
113
|
-
impact: 'high',
|
|
114
|
-
effort: 'low',
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
if (tier <= 2) {
|
|
119
|
-
opportunities.push({
|
|
120
|
-
type: 'parallel_execution',
|
|
121
|
-
description: 'Run independent quality gates in parallel',
|
|
122
|
-
impact: 'high',
|
|
123
|
-
effort: 'medium',
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// Always beneficial optimizations
|
|
128
|
-
opportunities.push({
|
|
129
|
-
type: 'smart_caching',
|
|
130
|
-
description: 'Cache dependencies and build artifacts',
|
|
131
|
-
impact: 'medium',
|
|
132
|
-
effort: 'low',
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
opportunities.push({
|
|
136
|
-
type: 'test_selection',
|
|
137
|
-
description: 'Run only tests affected by changes',
|
|
138
|
-
impact: 'high',
|
|
139
|
-
effort: 'medium',
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
opportunities.push({
|
|
143
|
-
type: 'early_failure',
|
|
144
|
-
description: 'Fail fast on critical issues',
|
|
145
|
-
impact: 'medium',
|
|
146
|
-
effort: 'low',
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
return opportunities;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* Generate intelligent caching strategy
|
|
154
|
-
*/
|
|
155
|
-
async generateCacheStrategy() {
|
|
156
|
-
const strategy = {
|
|
157
|
-
node_modules: {
|
|
158
|
-
key: 'node-modules-${{ hashFiles("package-lock.json") }}',
|
|
159
|
-
paths: ['node_modules'],
|
|
160
|
-
restore_keys: ['node-modules-'],
|
|
161
|
-
},
|
|
162
|
-
build_artifacts: {
|
|
163
|
-
key: 'build-${{ github.sha }}',
|
|
164
|
-
paths: ['dist', 'build', '.next'],
|
|
165
|
-
restore_keys: [],
|
|
166
|
-
},
|
|
167
|
-
test_cache: {
|
|
168
|
-
key: 'test-cache-${{ github.sha }}',
|
|
169
|
-
paths: ['.jest/cache', '.nyc_output'],
|
|
170
|
-
restore_keys: ['test-cache-'],
|
|
171
|
-
},
|
|
172
|
-
};
|
|
173
|
-
|
|
174
|
-
// Check for specific frameworks and add framework-specific caches
|
|
175
|
-
const packageJson = path.join(this.projectRoot, 'package.json');
|
|
176
|
-
if (fs.existsSync(packageJson)) {
|
|
177
|
-
try {
|
|
178
|
-
const pkg = JSON.parse(fs.readFileSync(packageJson, 'utf8'));
|
|
179
|
-
|
|
180
|
-
if (pkg.dependencies && pkg.dependencies.next) {
|
|
181
|
-
strategy.next_cache = {
|
|
182
|
-
key: 'next-cache-${{ github.sha }}',
|
|
183
|
-
paths: ['.next/cache'],
|
|
184
|
-
restore_keys: [],
|
|
185
|
-
};
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
if (pkg.devDependencies && pkg.devDependencies.jest) {
|
|
189
|
-
strategy.jest_cache = {
|
|
190
|
-
key: 'jest-${{ hashFiles("jest.config.js") }}',
|
|
191
|
-
paths: ['.jest'],
|
|
192
|
-
restore_keys: ['jest-'],
|
|
193
|
-
};
|
|
194
|
-
}
|
|
195
|
-
} catch (error) {
|
|
196
|
-
// Ignore package.json parsing errors
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
return strategy;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
/**
|
|
204
|
-
* Create parallel execution groups for quality gates
|
|
205
|
-
*/
|
|
206
|
-
async createParallelGroups() {
|
|
207
|
-
const groups = [
|
|
208
|
-
{
|
|
209
|
-
name: 'fast-feedback',
|
|
210
|
-
description: 'Quick checks that provide immediate feedback',
|
|
211
|
-
jobs: ['lint', 'type-check', 'unit-tests-fast'],
|
|
212
|
-
max_parallel: 3,
|
|
213
|
-
timeout: 5,
|
|
214
|
-
},
|
|
215
|
-
{
|
|
216
|
-
name: 'quality-gates',
|
|
217
|
-
description: 'Comprehensive quality checks',
|
|
218
|
-
jobs: ['coverage', 'mutation', 'security-scan'],
|
|
219
|
-
max_parallel: 2,
|
|
220
|
-
timeout: 15,
|
|
221
|
-
},
|
|
222
|
-
{
|
|
223
|
-
name: 'integration',
|
|
224
|
-
description: 'Integration and contract testing',
|
|
225
|
-
jobs: ['contract-tests', 'integration-tests', 'accessibility'],
|
|
226
|
-
max_parallel: 1,
|
|
227
|
-
timeout: 20,
|
|
228
|
-
},
|
|
229
|
-
];
|
|
230
|
-
|
|
231
|
-
return groups;
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
/**
|
|
235
|
-
* Analyze changed files to determine what tests to run
|
|
236
|
-
*/
|
|
237
|
-
async analyzeChangedFiles(changedFiles = []) {
|
|
238
|
-
const affectedTests = {
|
|
239
|
-
unit: [],
|
|
240
|
-
integration: [],
|
|
241
|
-
contract: [],
|
|
242
|
-
e2e: [],
|
|
243
|
-
};
|
|
244
|
-
|
|
245
|
-
// Simple heuristic - in production, this would use dependency analysis
|
|
246
|
-
for (const file of changedFiles) {
|
|
247
|
-
if (file.includes('src/') || file.includes('lib/')) {
|
|
248
|
-
// Source file changes - run related unit tests
|
|
249
|
-
affectedTests.unit.push(`test-${path.basename(file, path.extname(file))}`);
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
if (file.includes('api/') || file.includes('routes/')) {
|
|
253
|
-
// API changes - run integration tests
|
|
254
|
-
affectedTests.integration.push('api-integration');
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
if (file.includes('.contract.') || file.includes('contracts/')) {
|
|
258
|
-
// Contract changes - run contract tests
|
|
259
|
-
affectedTests.contract.push('contract-validation');
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
return affectedTests;
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
/**
|
|
267
|
-
* Estimate time savings from optimizations
|
|
268
|
-
*/
|
|
269
|
-
estimateTimeSavings(analysis) {
|
|
270
|
-
const baseTimes = {
|
|
271
|
-
1: 45, // High tier - comprehensive checks
|
|
272
|
-
2: 25, // Medium tier - standard checks
|
|
273
|
-
3: 10, // Low tier - basic checks
|
|
274
|
-
};
|
|
275
|
-
|
|
276
|
-
const baseTime = baseTimes[analysis.project_tier] || 25;
|
|
277
|
-
let optimizedTime = baseTime;
|
|
278
|
-
|
|
279
|
-
// Apply optimizations
|
|
280
|
-
if (analysis.recommended_optimizations.some((opt) => opt.type === 'parallel_execution')) {
|
|
281
|
-
optimizedTime *= 0.7; // 30% improvement from parallelization
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
if (analysis.recommended_optimizations.some((opt) => opt.type === 'smart_caching')) {
|
|
285
|
-
optimizedTime *= 0.85; // 15% improvement from caching
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
if (analysis.recommended_optimizations.some((opt) => opt.type === 'test_selection')) {
|
|
289
|
-
optimizedTime *= 0.6; // 40% improvement from selective testing
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
const savings = {
|
|
293
|
-
original_minutes: baseTime,
|
|
294
|
-
optimized_minutes: Math.round(optimizedTime),
|
|
295
|
-
savings_percent: Math.round((1 - optimizedTime / baseTime) * 100),
|
|
296
|
-
monthly_savings_hours: Math.round((((baseTime - optimizedTime) * 30) / 60) * 10) / 10, // Assuming 30 runs/month
|
|
297
|
-
};
|
|
298
|
-
|
|
299
|
-
return savings;
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
/**
|
|
303
|
-
* Generate optimized CI/CD configuration
|
|
304
|
-
*/
|
|
305
|
-
async generateOptimizedConfig(platform = 'github') {
|
|
306
|
-
const analysis = await this.analyzeProject();
|
|
307
|
-
|
|
308
|
-
if (platform === 'github') {
|
|
309
|
-
return this.generateGitHubActionsConfig(analysis);
|
|
310
|
-
} else if (platform === 'gitlab') {
|
|
311
|
-
return this.generateGitLabCIConfig(analysis);
|
|
312
|
-
} else if (platform === 'jenkins') {
|
|
313
|
-
return this.generateJenkinsConfig(analysis);
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
throw new Error(`Unsupported CI/CD platform: ${platform}`);
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
/**
|
|
320
|
-
* Generate optimized GitHub Actions workflow
|
|
321
|
-
*/
|
|
322
|
-
generateGitHubActionsConfig(analysis) {
|
|
323
|
-
const config = {
|
|
324
|
-
name: 'CAWS Quality Gates',
|
|
325
|
-
on: {
|
|
326
|
-
push: { branches: ['main', 'develop'] },
|
|
327
|
-
pull_request: { branches: ['main'] },
|
|
328
|
-
},
|
|
329
|
-
jobs: {},
|
|
330
|
-
};
|
|
331
|
-
|
|
332
|
-
// Fast feedback job
|
|
333
|
-
config.jobs.fast_feedback = {
|
|
334
|
-
name: 'Fast Feedback',
|
|
335
|
-
'runs-on': 'ubuntu-latest',
|
|
336
|
-
steps: [
|
|
337
|
-
{ uses: 'actions/checkout@v3' },
|
|
338
|
-
{
|
|
339
|
-
name: 'Setup Node.js',
|
|
340
|
-
uses: 'actions/setup-node@v3',
|
|
341
|
-
with: { 'node-version': '18', cache: 'npm' },
|
|
342
|
-
},
|
|
343
|
-
{ run: 'npm ci' },
|
|
344
|
-
{ run: 'npm run lint', continue_on_error: analysis.project_tier === 3 },
|
|
345
|
-
{ run: 'npm run type-check' },
|
|
346
|
-
{
|
|
347
|
-
run: 'npm run test:unit',
|
|
348
|
-
continue_on_error: analysis.project_tier === 3,
|
|
349
|
-
},
|
|
350
|
-
],
|
|
351
|
-
};
|
|
352
|
-
|
|
353
|
-
// Quality gates job (conditional based on tier)
|
|
354
|
-
if (analysis.conditional_execution.coverage_required) {
|
|
355
|
-
config.jobs.quality_gates = {
|
|
356
|
-
name: 'Quality Gates',
|
|
357
|
-
'runs-on': 'ubuntu-latest',
|
|
358
|
-
needs: ['fast_feedback'],
|
|
359
|
-
steps: [
|
|
360
|
-
{ uses: 'actions/checkout@v3' },
|
|
361
|
-
{
|
|
362
|
-
name: 'Setup Node.js',
|
|
363
|
-
uses: 'actions/setup-node@v3',
|
|
364
|
-
with: { 'node-version': '18', cache: 'npm' },
|
|
365
|
-
},
|
|
366
|
-
{ run: 'npm ci' },
|
|
367
|
-
{ run: 'npm run test:coverage' },
|
|
368
|
-
...(analysis.conditional_execution.security_scan
|
|
369
|
-
? [{ run: 'npm run security-scan' }]
|
|
370
|
-
: []),
|
|
371
|
-
...(analysis.conditional_execution.contract_testing
|
|
372
|
-
? [{ run: 'npm run test:contract' }]
|
|
373
|
-
: []),
|
|
374
|
-
],
|
|
375
|
-
};
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
// Integration tests (only for T1/T2)
|
|
379
|
-
if (analysis.conditional_execution.integration_tests) {
|
|
380
|
-
config.jobs.integration = {
|
|
381
|
-
name: 'Integration Tests',
|
|
382
|
-
'runs-on': 'ubuntu-latest',
|
|
383
|
-
needs: ['quality_gates'],
|
|
384
|
-
steps: [
|
|
385
|
-
{ uses: 'actions/checkout@v3' },
|
|
386
|
-
{
|
|
387
|
-
name: 'Setup Node.js',
|
|
388
|
-
uses: 'actions/setup-node@v3',
|
|
389
|
-
with: { 'node-version': '18', cache: 'npm' },
|
|
390
|
-
},
|
|
391
|
-
{ run: 'npm ci' },
|
|
392
|
-
{ run: 'npm run test:integration' },
|
|
393
|
-
],
|
|
394
|
-
};
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
return config;
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
/**
|
|
401
|
-
* Generate GitLab CI configuration
|
|
402
|
-
*/
|
|
403
|
-
generateGitLabCIConfig(analysis) {
|
|
404
|
-
const config = {
|
|
405
|
-
stages: ['fast_feedback', 'quality_gates', 'integration'],
|
|
406
|
-
cache: {
|
|
407
|
-
key: '${CI_COMMIT_REF_SLUG}',
|
|
408
|
-
paths: ['node_modules/', '.cache/'],
|
|
409
|
-
},
|
|
410
|
-
};
|
|
411
|
-
|
|
412
|
-
// Fast feedback job
|
|
413
|
-
config['lint_and_test'] = {
|
|
414
|
-
stage: 'fast_feedback',
|
|
415
|
-
image: 'node:18',
|
|
416
|
-
before_script: ['npm ci'],
|
|
417
|
-
script: ['npm run lint', 'npm run type-check', 'npm run test:unit'],
|
|
418
|
-
allow_failure: analysis.project_tier === 3,
|
|
419
|
-
};
|
|
420
|
-
|
|
421
|
-
// Quality gates
|
|
422
|
-
if (analysis.conditional_execution.coverage_required) {
|
|
423
|
-
config['quality_gates'] = {
|
|
424
|
-
stage: 'quality_gates',
|
|
425
|
-
image: 'node:18',
|
|
426
|
-
before_script: ['npm ci'],
|
|
427
|
-
script: [
|
|
428
|
-
'npm run test:coverage',
|
|
429
|
-
...(analysis.conditional_execution.security_scan ? ['npm run security-scan'] : []),
|
|
430
|
-
...(analysis.conditional_execution.contract_testing ? ['npm run test:contract'] : []),
|
|
431
|
-
],
|
|
432
|
-
};
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
return config;
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
/**
|
|
439
|
-
* Generate Jenkins pipeline configuration
|
|
440
|
-
*/
|
|
441
|
-
generateJenkinsConfig(analysis) {
|
|
442
|
-
return `
|
|
443
|
-
pipeline {
|
|
444
|
-
agent any
|
|
445
|
-
|
|
446
|
-
stages {
|
|
447
|
-
stage('Fast Feedback') {
|
|
448
|
-
steps {
|
|
449
|
-
sh 'npm ci'
|
|
450
|
-
sh 'npm run lint'
|
|
451
|
-
sh 'npm run type-check'
|
|
452
|
-
sh 'npm run test:unit'
|
|
453
|
-
}
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
${
|
|
457
|
-
analysis.conditional_execution.coverage_required
|
|
458
|
-
? `
|
|
459
|
-
stage('Quality Gates') {
|
|
460
|
-
steps {
|
|
461
|
-
sh 'npm run test:coverage'
|
|
462
|
-
${analysis.conditional_execution.security_scan ? `sh 'npm run security-scan'` : ''}
|
|
463
|
-
${analysis.conditional_execution.contract_testing ? `sh 'npm run test:contract'` : ''}
|
|
464
|
-
}
|
|
465
|
-
}`
|
|
466
|
-
: ''
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
${
|
|
470
|
-
analysis.conditional_execution.integration_tests
|
|
471
|
-
? `
|
|
472
|
-
stage('Integration Tests') {
|
|
473
|
-
steps {
|
|
474
|
-
sh 'npm run test:integration'
|
|
475
|
-
}
|
|
476
|
-
}`
|
|
477
|
-
: ''
|
|
478
|
-
}
|
|
479
|
-
}
|
|
480
|
-
|
|
481
|
-
post {
|
|
482
|
-
always {
|
|
483
|
-
junit 'test-results/*.xml'
|
|
484
|
-
publishCoverage adapters: [istanbulCoberturaAdapter('coverage/cobertura-coverage.xml')]
|
|
485
|
-
}
|
|
486
|
-
}
|
|
487
|
-
}`;
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
/**
|
|
491
|
-
* Create hash for cache invalidation
|
|
492
|
-
*/
|
|
493
|
-
createCacheHash(files) {
|
|
494
|
-
const hasher = crypto.createHash('sha256');
|
|
495
|
-
files.forEach((file) => {
|
|
496
|
-
if (fs.existsSync(file)) {
|
|
497
|
-
hasher.update(fs.readFileSync(file));
|
|
498
|
-
}
|
|
499
|
-
});
|
|
500
|
-
return hasher.digest('hex').substring(0, 16);
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
|
|
504
|
-
module.exports = CICDOptimizer;
|
package/dist/commands/agents.js
DELETED
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview CAWSFIX-31 — caws agents command.
|
|
3
|
-
*
|
|
4
|
-
* Surfaces the agent registry (`.caws/agents.json`) so operators and
|
|
5
|
-
* other agents can see who is currently registered, what they are
|
|
6
|
-
* working on, and where their session logs live. Reads only — write
|
|
7
|
-
* paths are owned by the session-log hook and the lifecycle ops in
|
|
8
|
-
* specs/worktree.
|
|
9
|
-
*
|
|
10
|
-
* Subcommands:
|
|
11
|
-
* - list — table of all live entries (no platform filter)
|
|
12
|
-
* - show <session-id> — full detail for one entry, including session-log pointer
|
|
13
|
-
*
|
|
14
|
-
* @author @darianrosebrook
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
const chalk = require('chalk');
|
|
18
|
-
|
|
19
|
-
const { findProjectRoot } = require('../utils/detection');
|
|
20
|
-
const {
|
|
21
|
-
loadAgentRegistry,
|
|
22
|
-
findSessionLogs,
|
|
23
|
-
} = require('../utils/agent-session');
|
|
24
|
-
const {
|
|
25
|
-
formatAgentRef,
|
|
26
|
-
formatHeartbeatAge,
|
|
27
|
-
formatSessionLogPointer,
|
|
28
|
-
} = require('../utils/agent-display');
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Top-level dispatcher.
|
|
32
|
-
* @param {string} subcommand
|
|
33
|
-
* @param {Object} options
|
|
34
|
-
*/
|
|
35
|
-
function agentsCommand(subcommand, options = {}) {
|
|
36
|
-
switch (subcommand) {
|
|
37
|
-
case 'list':
|
|
38
|
-
return handleList(options);
|
|
39
|
-
case 'show':
|
|
40
|
-
return handleShow(options);
|
|
41
|
-
default:
|
|
42
|
-
console.error(chalk.red(`Unknown agents subcommand: ${subcommand}`));
|
|
43
|
-
console.log(chalk.blue('Available: list, show'));
|
|
44
|
-
process.exit(1);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
function handleList() {
|
|
49
|
-
const root = findProjectRoot();
|
|
50
|
-
const registry = loadAgentRegistry(root);
|
|
51
|
-
const entries = Object.values(registry.agents || {});
|
|
52
|
-
|
|
53
|
-
console.log(chalk.bold.cyan('CAWS Agents'));
|
|
54
|
-
console.log(chalk.cyan('='.repeat(80)));
|
|
55
|
-
|
|
56
|
-
if (entries.length === 0) {
|
|
57
|
-
console.log(chalk.gray('No active agents.'));
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// Sort by lastSeen desc so most recent appears first.
|
|
62
|
-
entries.sort((a, b) => new Date(b.lastSeen || 0) - new Date(a.lastSeen || 0));
|
|
63
|
-
|
|
64
|
-
for (const entry of entries) {
|
|
65
|
-
const ref = formatAgentRef(entry.sessionId, entry.platform);
|
|
66
|
-
const age = formatHeartbeatAge(entry.lastSeen);
|
|
67
|
-
console.log(chalk.bold(ref));
|
|
68
|
-
console.log(chalk.gray(` Heartbeat: ${entry.lastSeen || 'unknown'} (${age})`));
|
|
69
|
-
if (entry.specId) {
|
|
70
|
-
console.log(chalk.gray(` Spec: ${entry.specId}`));
|
|
71
|
-
}
|
|
72
|
-
if (entry.worktree) {
|
|
73
|
-
console.log(chalk.gray(` Worktree: ${entry.worktree}`));
|
|
74
|
-
}
|
|
75
|
-
if (entry.model) {
|
|
76
|
-
console.log(chalk.gray(` Model: ${entry.model}`));
|
|
77
|
-
}
|
|
78
|
-
console.log('');
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
function handleShow(options) {
|
|
83
|
-
const id = options.id;
|
|
84
|
-
if (!id) {
|
|
85
|
-
console.error(chalk.red('Session ID is required'));
|
|
86
|
-
console.log(chalk.blue('Usage: caws agents show <session-id>'));
|
|
87
|
-
process.exit(1);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
const root = findProjectRoot();
|
|
91
|
-
const registry = loadAgentRegistry(root);
|
|
92
|
-
const entry = registry.agents[id];
|
|
93
|
-
if (!entry) {
|
|
94
|
-
console.error(chalk.red(`No agent registered with session id: ${id}`));
|
|
95
|
-
console.log(
|
|
96
|
-
chalk.blue('Run `caws agents list` to see active sessions, or `tmp/<id>/.meta.json` for archived ones.')
|
|
97
|
-
);
|
|
98
|
-
process.exit(1);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
const ref = formatAgentRef(entry.sessionId, entry.platform);
|
|
102
|
-
console.log(chalk.bold.cyan(ref));
|
|
103
|
-
console.log(chalk.cyan('='.repeat(70)));
|
|
104
|
-
console.log(chalk.gray(`First seen: ${entry.firstSeen || 'unknown'}`));
|
|
105
|
-
console.log(
|
|
106
|
-
chalk.gray(`Last seen: ${entry.lastSeen || 'unknown'} (${formatHeartbeatAge(entry.lastSeen)})`)
|
|
107
|
-
);
|
|
108
|
-
if (entry.specId) console.log(chalk.gray(`Spec: ${entry.specId}`));
|
|
109
|
-
if (entry.worktree) console.log(chalk.gray(`Worktree: ${entry.worktree}`));
|
|
110
|
-
if (entry.model) console.log(chalk.gray(`Model: ${entry.model}`));
|
|
111
|
-
if (entry.ttl) console.log(chalk.gray(`TTL: ${Math.round(entry.ttl / 1000 / 60)} min`));
|
|
112
|
-
|
|
113
|
-
// Surface any session-log pointers for this id.
|
|
114
|
-
const logs = findSessionLogs(root, { sessionId: id });
|
|
115
|
-
if (logs.length > 0) {
|
|
116
|
-
console.log('');
|
|
117
|
-
console.log(chalk.bold('Session logs:'));
|
|
118
|
-
for (const log of logs) {
|
|
119
|
-
console.log(formatSessionLogPointer(log, root));
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
module.exports = { agentsCommand };
|