@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
|
@@ -1,387 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CAWS Quality Gate Utilities
|
|
3
|
-
*
|
|
4
|
-
* Reusable quality gate scripts for CAWS projects.
|
|
5
|
-
* Provides staged file analysis, god object detection, and TODO analysis.
|
|
6
|
-
*
|
|
7
|
-
* @author @darianrosebrook
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
const fs = require('fs');
|
|
11
|
-
const path = require('path');
|
|
12
|
-
const yaml = require('js-yaml');
|
|
13
|
-
const { execSync } = require('child_process');
|
|
14
|
-
const { getTodoAnalyzerSuggestion } = require('./project-analysis');
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Quality Gate Configuration
|
|
18
|
-
*/
|
|
19
|
-
const CONFIG = {
|
|
20
|
-
godObjectThresholds: {
|
|
21
|
-
warning: 1750,
|
|
22
|
-
critical: 2000,
|
|
23
|
-
},
|
|
24
|
-
todoConfidenceThreshold: 0.8,
|
|
25
|
-
supportedExtensions: ['.rs', '.ts', '.tsx', '.js', '.jsx', '.py'],
|
|
26
|
-
crisisResponseThresholds: {
|
|
27
|
-
godObjectCritical: 3000,
|
|
28
|
-
todoConfidenceThreshold: 0.9,
|
|
29
|
-
},
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Detect if project is in crisis response mode
|
|
34
|
-
* @returns {boolean} True if in crisis mode
|
|
35
|
-
*/
|
|
36
|
-
function detectCrisisMode() {
|
|
37
|
-
try {
|
|
38
|
-
const crisisIndicators = [
|
|
39
|
-
// Check for crisis response in any active spec (feature specs then legacy)
|
|
40
|
-
() => {
|
|
41
|
-
// Check feature specs first
|
|
42
|
-
const specsDir = path.join(process.cwd(), '.caws/specs');
|
|
43
|
-
if (fs.existsSync(specsDir)) {
|
|
44
|
-
try {
|
|
45
|
-
const files = fs.readdirSync(specsDir).filter(f => f.endsWith('.yaml') || f.endsWith('.yml'));
|
|
46
|
-
for (const file of files) {
|
|
47
|
-
const spec = yaml.load(fs.readFileSync(path.join(specsDir, file), 'utf8'));
|
|
48
|
-
if (spec && (spec.mode === 'crisis' || spec.crisis_mode === true)) {
|
|
49
|
-
return true;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
} catch {
|
|
53
|
-
// Fall through to legacy check
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
// Legacy fallback
|
|
57
|
-
const legacyPath = path.join(process.cwd(), '.caws/working-spec.yaml');
|
|
58
|
-
if (fs.existsSync(legacyPath)) {
|
|
59
|
-
try {
|
|
60
|
-
const spec = yaml.load(fs.readFileSync(legacyPath, 'utf8'));
|
|
61
|
-
return spec.mode === 'crisis' || spec.crisis_mode === true;
|
|
62
|
-
} catch {
|
|
63
|
-
// Ignore
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
return false;
|
|
67
|
-
},
|
|
68
|
-
// Check for crisis response in environment
|
|
69
|
-
() => process.env.CAWS_CRISIS_MODE === 'true',
|
|
70
|
-
// Check for crisis response in git commit message
|
|
71
|
-
() => {
|
|
72
|
-
try {
|
|
73
|
-
const lastCommit = execSync('git log -1 --pretty=%B', { encoding: 'utf8' });
|
|
74
|
-
return (
|
|
75
|
-
lastCommit.toLowerCase().includes('crisis') ||
|
|
76
|
-
lastCommit.toLowerCase().includes('emergency')
|
|
77
|
-
);
|
|
78
|
-
} catch {
|
|
79
|
-
return false;
|
|
80
|
-
}
|
|
81
|
-
},
|
|
82
|
-
];
|
|
83
|
-
|
|
84
|
-
return crisisIndicators.some((indicator) => indicator());
|
|
85
|
-
} catch (error) {
|
|
86
|
-
return false;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Get staged files from git
|
|
92
|
-
* @returns {string[]} Array of staged file paths
|
|
93
|
-
*/
|
|
94
|
-
function getStagedFiles() {
|
|
95
|
-
try {
|
|
96
|
-
const stagedFiles = execSync('git diff --cached --name-only', {
|
|
97
|
-
encoding: 'utf8',
|
|
98
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
99
|
-
})
|
|
100
|
-
.trim()
|
|
101
|
-
.split('\n')
|
|
102
|
-
.filter((file) => file.trim() !== '');
|
|
103
|
-
|
|
104
|
-
return stagedFiles;
|
|
105
|
-
} catch (error) {
|
|
106
|
-
console.warn(`Could not get staged files: ${error.message}`);
|
|
107
|
-
return [];
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* Check for god objects in staged files
|
|
113
|
-
* @param {string[]} stagedFiles - Array of staged file paths
|
|
114
|
-
* @param {string} language - Language to check ('rust', 'typescript', etc.)
|
|
115
|
-
* @returns {Object} God object analysis results
|
|
116
|
-
*/
|
|
117
|
-
function checkGodObjects(stagedFiles, language = 'rust') {
|
|
118
|
-
const extension =
|
|
119
|
-
language === 'rust'
|
|
120
|
-
? '.rs'
|
|
121
|
-
: language === 'typescript'
|
|
122
|
-
? '.ts'
|
|
123
|
-
: language === 'javascript'
|
|
124
|
-
? '.js'
|
|
125
|
-
: '.py';
|
|
126
|
-
|
|
127
|
-
const files = stagedFiles.filter((file) => file.endsWith(extension));
|
|
128
|
-
|
|
129
|
-
if (files.length === 0) {
|
|
130
|
-
return { violations: [], warnings: [], total: 0 };
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
console.log(`Found ${files.length} staged ${language} files to check`);
|
|
134
|
-
|
|
135
|
-
const violations = [];
|
|
136
|
-
const warnings = [];
|
|
137
|
-
|
|
138
|
-
for (const file of files) {
|
|
139
|
-
try {
|
|
140
|
-
const fullPath = path.resolve(file);
|
|
141
|
-
if (!fs.existsSync(fullPath)) continue;
|
|
142
|
-
|
|
143
|
-
const content = fs.readFileSync(fullPath, 'utf8');
|
|
144
|
-
const lineCount = content.split('\n').length;
|
|
145
|
-
|
|
146
|
-
if (lineCount >= CONFIG.godObjectThresholds.critical) {
|
|
147
|
-
violations.push({
|
|
148
|
-
file,
|
|
149
|
-
lines: lineCount,
|
|
150
|
-
severity: 'critical',
|
|
151
|
-
message: `CRITICAL: ${lineCount} LOC exceeds god object threshold (${CONFIG.godObjectThresholds.critical}+ LOC)`,
|
|
152
|
-
});
|
|
153
|
-
} else if (lineCount >= CONFIG.godObjectThresholds.warning) {
|
|
154
|
-
warnings.push({
|
|
155
|
-
file,
|
|
156
|
-
lines: lineCount,
|
|
157
|
-
severity: 'warning',
|
|
158
|
-
message: `WARNING: ${lineCount} LOC approaches god object territory (${CONFIG.godObjectThresholds.warning}+ LOC)`,
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
} catch (error) {
|
|
162
|
-
console.warn(`Could not analyze ${file}: ${error.message}`);
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
return { violations, warnings, total: violations.length + warnings.length };
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
/**
|
|
170
|
-
* Check for hidden TODOs in staged files
|
|
171
|
-
* @param {string[]} stagedFiles - Array of staged file paths
|
|
172
|
-
* @returns {Object} TODO analysis results
|
|
173
|
-
*/
|
|
174
|
-
function checkHiddenTodos(stagedFiles) {
|
|
175
|
-
const supportedFiles = stagedFiles.filter((file) =>
|
|
176
|
-
CONFIG.supportedExtensions.some((ext) => file.endsWith(ext))
|
|
177
|
-
);
|
|
178
|
-
|
|
179
|
-
if (supportedFiles.length === 0) {
|
|
180
|
-
return { todos: [], blocking: 0, total: 0 };
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
console.log(`Found ${supportedFiles.length} staged files to analyze for TODOs`);
|
|
184
|
-
|
|
185
|
-
try {
|
|
186
|
-
// Find TODO analyzer .mjs file (preferred - no Python dependency)
|
|
187
|
-
const possiblePaths = [
|
|
188
|
-
// Published npm package (priority)
|
|
189
|
-
path.join(
|
|
190
|
-
process.cwd(),
|
|
191
|
-
'node_modules',
|
|
192
|
-
'@paths.design',
|
|
193
|
-
'quality-gates',
|
|
194
|
-
'todo-analyzer.mjs'
|
|
195
|
-
),
|
|
196
|
-
// Legacy monorepo local copy
|
|
197
|
-
path.join(process.cwd(), 'node_modules', '@caws', 'quality-gates', 'todo-analyzer.mjs'),
|
|
198
|
-
// Monorepo structure (development)
|
|
199
|
-
path.join(process.cwd(), 'packages', 'quality-gates', 'todo-analyzer.mjs'),
|
|
200
|
-
// Local copy in scripts directory (if scaffolded)
|
|
201
|
-
path.join(process.cwd(), 'scripts', 'todo-analyzer.mjs'),
|
|
202
|
-
// Legacy Python analyzer (deprecated)
|
|
203
|
-
path.join(process.cwd(), 'scripts', 'v3', 'analysis', 'todo_analyzer.py'),
|
|
204
|
-
];
|
|
205
|
-
|
|
206
|
-
let analyzerPath = null;
|
|
207
|
-
let usePython = false;
|
|
208
|
-
|
|
209
|
-
for (const testPath of possiblePaths) {
|
|
210
|
-
if (fs.existsSync(testPath)) {
|
|
211
|
-
analyzerPath = testPath;
|
|
212
|
-
usePython = testPath.endsWith('.py');
|
|
213
|
-
break;
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
if (!analyzerPath) {
|
|
218
|
-
console.warn('TODO analyzer not found - skipping TODO analysis');
|
|
219
|
-
const suggestion = getTodoAnalyzerSuggestion(process.cwd());
|
|
220
|
-
console.warn('Available options for TODO analysis:');
|
|
221
|
-
console.warn(suggestion);
|
|
222
|
-
return { todos: [], blocking: 0, total: 0 };
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
if (usePython) {
|
|
226
|
-
console.warn('Using legacy Python TODO analyzer (deprecated)');
|
|
227
|
-
const suggestion = getTodoAnalyzerSuggestion(process.cwd());
|
|
228
|
-
console.warn('Consider upgrading to Node.js version:');
|
|
229
|
-
console.warn(suggestion);
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
// Run the TODO analyzer with staged files
|
|
233
|
-
const command = usePython
|
|
234
|
-
? `python3 ${analyzerPath} --staged-only --min-confidence ${CONFIG.todoConfidenceThreshold}`
|
|
235
|
-
: `node ${analyzerPath} --staged-only --ci-mode --min-confidence ${CONFIG.todoConfidenceThreshold}`;
|
|
236
|
-
|
|
237
|
-
const result = execSync(command, { encoding: 'utf8', cwd: process.cwd() });
|
|
238
|
-
|
|
239
|
-
// Parse the output to extract TODO count
|
|
240
|
-
const lines = result.split('\n');
|
|
241
|
-
const summaryLine = lines.find((line) => line.includes('Total hidden TODOs:'));
|
|
242
|
-
const todoCount = summaryLine ? parseInt(summaryLine.split(':')[1].trim()) : 0;
|
|
243
|
-
|
|
244
|
-
return {
|
|
245
|
-
todos: [],
|
|
246
|
-
blocking: todoCount,
|
|
247
|
-
total: todoCount,
|
|
248
|
-
details: result,
|
|
249
|
-
};
|
|
250
|
-
} catch (error) {
|
|
251
|
-
console.warn(`Could not run TODO analysis: ${error.message}`);
|
|
252
|
-
return { todos: [], blocking: 0, total: 0 };
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
/**
|
|
257
|
-
* Run comprehensive quality gates on staged files
|
|
258
|
-
* @param {Object} options - Options for quality gates
|
|
259
|
-
* @returns {Object} Quality gate results
|
|
260
|
-
*/
|
|
261
|
-
function runQualityGates(options = {}) {
|
|
262
|
-
const { languages = ['rust'], checkTodos = true, checkGodObjects = true, ci = false } = options;
|
|
263
|
-
|
|
264
|
-
console.log(`Running Quality Gates${ci ? ' (CI Mode)' : ' - Crisis Response Mode'}`);
|
|
265
|
-
console.log('==================================================');
|
|
266
|
-
|
|
267
|
-
// Get staged files
|
|
268
|
-
const stagedFiles = getStagedFiles();
|
|
269
|
-
|
|
270
|
-
if (stagedFiles.length === 0) {
|
|
271
|
-
console.log('No staged files to analyze');
|
|
272
|
-
return { passed: true, violations: [], warnings: [] };
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
console.log(`Analyzing ${stagedFiles.length} staged files`);
|
|
276
|
-
|
|
277
|
-
const results = {
|
|
278
|
-
passed: true,
|
|
279
|
-
violations: [],
|
|
280
|
-
warnings: [],
|
|
281
|
-
todos: 0,
|
|
282
|
-
};
|
|
283
|
-
|
|
284
|
-
// Check naming conventions
|
|
285
|
-
console.log('\nChecking naming conventions...');
|
|
286
|
-
console.log(' Naming conventions check passed');
|
|
287
|
-
|
|
288
|
-
// Check code freeze compliance
|
|
289
|
-
console.log('\nChecking code freeze compliance...');
|
|
290
|
-
console.log(' Code freeze compliance check passed');
|
|
291
|
-
|
|
292
|
-
// Check duplication
|
|
293
|
-
console.log('\nChecking duplication...');
|
|
294
|
-
console.log(' No duplication regression detected');
|
|
295
|
-
|
|
296
|
-
// Check god objects for each language
|
|
297
|
-
if (checkGodObjects) {
|
|
298
|
-
for (const language of languages) {
|
|
299
|
-
console.log(`\nChecking god objects (${language})...`);
|
|
300
|
-
const godObjectResults = checkGodObjects(stagedFiles, language);
|
|
301
|
-
|
|
302
|
-
results.violations.push(...godObjectResults.violations);
|
|
303
|
-
results.warnings.push(...godObjectResults.warnings);
|
|
304
|
-
|
|
305
|
-
if (godObjectResults.violations.length > 0) {
|
|
306
|
-
console.log(' God object violations detected:');
|
|
307
|
-
godObjectResults.violations.forEach((violation) => {
|
|
308
|
-
console.log(` ${violation.file}: ${violation.message}`);
|
|
309
|
-
});
|
|
310
|
-
} else {
|
|
311
|
-
console.log(' No blocking god object violations');
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
if (godObjectResults.warnings.length > 0) {
|
|
315
|
-
console.log(' God object warnings:');
|
|
316
|
-
godObjectResults.warnings.forEach((warning) => {
|
|
317
|
-
console.log(` ${warning.file}: ${warning.message}`);
|
|
318
|
-
});
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
// Check hidden TODOs
|
|
324
|
-
if (checkTodos) {
|
|
325
|
-
console.log('\nChecking hidden TODOs...');
|
|
326
|
-
const todoResults = checkHiddenTodos(stagedFiles);
|
|
327
|
-
results.todos = todoResults.total;
|
|
328
|
-
|
|
329
|
-
if (todoResults.total > 0) {
|
|
330
|
-
console.log(` Found ${todoResults.total} hidden TODOs in staged files`);
|
|
331
|
-
console.log(' Fix stub implementations and placeholder code before committing');
|
|
332
|
-
console.log(' See docs/PLACEHOLDER-DETECTION-GUIDE.md for classification');
|
|
333
|
-
} else {
|
|
334
|
-
console.log(' No critical hidden TODOs found in staged files');
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
// Summary
|
|
339
|
-
console.log('\n==================================================');
|
|
340
|
-
console.log('QUALITY GATES RESULTS');
|
|
341
|
-
console.log('==================================================');
|
|
342
|
-
|
|
343
|
-
const totalViolations = results.violations.length;
|
|
344
|
-
const totalWarnings = results.warnings.length;
|
|
345
|
-
const totalTodos = results.todos;
|
|
346
|
-
|
|
347
|
-
if (totalViolations > 0) {
|
|
348
|
-
console.log(`\nCRITICAL VIOLATIONS (${totalViolations}):`);
|
|
349
|
-
results.violations.forEach((violation) => {
|
|
350
|
-
console.log(` ${violation.file}: ${violation.message}`);
|
|
351
|
-
});
|
|
352
|
-
results.passed = false;
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
if (totalWarnings > 0) {
|
|
356
|
-
console.log(`\nWARNINGS (${totalWarnings}):`);
|
|
357
|
-
results.warnings.forEach((warning) => {
|
|
358
|
-
console.log(` ${warning.file}: ${warning.message}`);
|
|
359
|
-
});
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
if (totalTodos > 0) {
|
|
363
|
-
console.log(`\nHIDDEN TODOS (${totalTodos}):`);
|
|
364
|
-
console.log(` Found ${totalTodos} hidden TODOs in staged files`);
|
|
365
|
-
results.passed = false;
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
// Final result
|
|
369
|
-
if (results.passed) {
|
|
370
|
-
console.log('\nALL QUALITY GATES PASSED');
|
|
371
|
-
console.log('Commit allowed - quality maintained!');
|
|
372
|
-
} else {
|
|
373
|
-
console.log('\nQUALITY GATES FAILED');
|
|
374
|
-
console.log('Commit blocked - fix violations above');
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
return results;
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
module.exports = {
|
|
381
|
-
getStagedFiles,
|
|
382
|
-
checkGodObjects,
|
|
383
|
-
checkHiddenTodos,
|
|
384
|
-
detectCrisisMode,
|
|
385
|
-
runQualityGates,
|
|
386
|
-
CONFIG,
|
|
387
|
-
};
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
const Ajv = require('ajv');
|
|
2
|
-
const fs = require('fs-extra');
|
|
3
|
-
const path = require('path');
|
|
4
|
-
|
|
5
|
-
const ajv = new Ajv({ allErrors: true, allowUnionTypes: true, strict: false, validateFormats: false });
|
|
6
|
-
const cache = new Map();
|
|
7
|
-
|
|
8
|
-
function createValidator(schemaPath) {
|
|
9
|
-
const resolved = path.resolve(schemaPath);
|
|
10
|
-
if (cache.has(resolved)) return cache.get(resolved);
|
|
11
|
-
let schema;
|
|
12
|
-
try {
|
|
13
|
-
schema = JSON.parse(fs.readFileSync(resolved, 'utf8'));
|
|
14
|
-
} catch (err) {
|
|
15
|
-
throw new Error(`Failed to parse schema file ${resolved}: ${err.message}`);
|
|
16
|
-
}
|
|
17
|
-
// Remove $schema keyword — Ajv handles validation without it and
|
|
18
|
-
// the 2020-12 meta-schema URI is not bundled with the base Ajv package.
|
|
19
|
-
delete schema.$schema;
|
|
20
|
-
const validate = ajv.compile(schema);
|
|
21
|
-
const validator = (data) => {
|
|
22
|
-
const valid = validate(data);
|
|
23
|
-
return {
|
|
24
|
-
valid,
|
|
25
|
-
errors: valid ? [] : validate.errors.map(e => ({
|
|
26
|
-
path: e.instancePath,
|
|
27
|
-
message: e.message,
|
|
28
|
-
params: e.params,
|
|
29
|
-
})),
|
|
30
|
-
};
|
|
31
|
-
};
|
|
32
|
-
cache.set(resolved, validator);
|
|
33
|
-
return validator;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
function getSchemaPath(schemaName, projectRoot) {
|
|
37
|
-
// Order: flat repo layout (`.caws/<name>.schema.json`) wins so
|
|
38
|
-
// repos that tightened a schema in-place (e.g. CAWSFIX-03) are
|
|
39
|
-
// the authoritative source. Nested `.caws/schemas/<name>.schema.json`
|
|
40
|
-
// is the legacy layout kept for back-compat. Bundled template is
|
|
41
|
-
// the last-resort fallback used by globally-installed CLIs and
|
|
42
|
-
// projects without a local copy.
|
|
43
|
-
const flatPath = path.join(projectRoot, '.caws', schemaName);
|
|
44
|
-
if (fs.existsSync(flatPath)) return flatPath;
|
|
45
|
-
const nestedPath = path.join(projectRoot, '.caws', 'schemas', schemaName);
|
|
46
|
-
if (fs.existsSync(nestedPath)) return nestedPath;
|
|
47
|
-
return path.join(__dirname, '../../templates/.caws/schemas', schemaName);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
module.exports = { createValidator, getSchemaPath };
|