@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,173 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Document Frontmatter Check Hook for Claude Code
|
|
3
|
-
# Warns when docs/**/*.md files are written/edited without proper frontmatter.
|
|
4
|
-
# Advisory only — does not block.
|
|
5
|
-
#
|
|
6
|
-
# Validates YAML frontmatter with required fields, authority/status enums,
|
|
7
|
-
# governs requirements for high-authority docs, and verified_at_commit for
|
|
8
|
-
# implementation-state claims.
|
|
9
|
-
|
|
10
|
-
set -euo pipefail
|
|
11
|
-
|
|
12
|
-
INPUT=$(cat)
|
|
13
|
-
|
|
14
|
-
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // ""')
|
|
15
|
-
TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name // ""')
|
|
16
|
-
|
|
17
|
-
# Only check Write and Edit tools
|
|
18
|
-
if [[ "$TOOL_NAME" != "Write" ]] && [[ "$TOOL_NAME" != "Edit" ]]; then
|
|
19
|
-
exit 0
|
|
20
|
-
fi
|
|
21
|
-
|
|
22
|
-
if [[ -z "$FILE_PATH" ]]; then
|
|
23
|
-
exit 0
|
|
24
|
-
fi
|
|
25
|
-
|
|
26
|
-
# Only check .md files under docs/
|
|
27
|
-
if [[ ! "$FILE_PATH" =~ docs/.*\.md$ ]]; then
|
|
28
|
-
exit 0
|
|
29
|
-
fi
|
|
30
|
-
|
|
31
|
-
# Skip exempt filenames
|
|
32
|
-
BASENAME=$(basename "$FILE_PATH")
|
|
33
|
-
if [[ "$BASENAME" == "README.md" ]] || [[ "$BASENAME" == "INDEX.md" ]] || [[ "$BASENAME" == "index.md" ]] || [[ "$BASENAME" == "00_INDEX.md" ]]; then
|
|
34
|
-
exit 0
|
|
35
|
-
fi
|
|
36
|
-
|
|
37
|
-
# Skip archive and templates directories
|
|
38
|
-
if [[ "$FILE_PATH" =~ docs/archive/ ]] || [[ "$FILE_PATH" =~ docs/templates/ ]]; then
|
|
39
|
-
exit 0
|
|
40
|
-
fi
|
|
41
|
-
|
|
42
|
-
# Skip ephemeral (gitignored, not governed)
|
|
43
|
-
if [[ "$FILE_PATH" =~ docs/ephemeral/ ]]; then
|
|
44
|
-
exit 0
|
|
45
|
-
fi
|
|
46
|
-
|
|
47
|
-
# Check if file exists (Write creates it, Edit modifies it)
|
|
48
|
-
if [[ ! -f "$FILE_PATH" ]]; then
|
|
49
|
-
exit 0
|
|
50
|
-
fi
|
|
51
|
-
|
|
52
|
-
# --- Frontmatter validation ---
|
|
53
|
-
|
|
54
|
-
# V1: Check for frontmatter delimiters
|
|
55
|
-
FIRST_LINE=$(head -1 "$FILE_PATH" 2>/dev/null || echo "")
|
|
56
|
-
if [[ "$FIRST_LINE" != "---" ]]; then
|
|
57
|
-
echo '{
|
|
58
|
-
"hookSpecificOutput": {
|
|
59
|
-
"hookEventName": "PostToolUse",
|
|
60
|
-
"additionalContext": "Doc governance (V1): '"$FILE_PATH"' is missing YAML frontmatter. All docs under docs/ (except README.md, archive/, templates/) must start with --- delimiters containing doc_id, authority, status, title, owner, and updated fields."
|
|
61
|
-
}
|
|
62
|
-
}'
|
|
63
|
-
exit 0
|
|
64
|
-
fi
|
|
65
|
-
|
|
66
|
-
# Extract frontmatter block (between first and second ---)
|
|
67
|
-
FRONTMATTER=$(awk 'NR==1 && /^---$/{found=1; next} found && /^---$/{exit} found{print}' "$FILE_PATH")
|
|
68
|
-
|
|
69
|
-
if [[ -z "$FRONTMATTER" ]]; then
|
|
70
|
-
echo '{
|
|
71
|
-
"hookSpecificOutput": {
|
|
72
|
-
"hookEventName": "PostToolUse",
|
|
73
|
-
"additionalContext": "Doc governance (V1): '"$FILE_PATH"' has opening --- but no closing --- for frontmatter block."
|
|
74
|
-
}
|
|
75
|
-
}'
|
|
76
|
-
exit 0
|
|
77
|
-
fi
|
|
78
|
-
|
|
79
|
-
# V2: Check required fields
|
|
80
|
-
MISSING=""
|
|
81
|
-
for field in doc_id authority status title owner updated; do
|
|
82
|
-
if ! echo "$FRONTMATTER" | grep -q "^${field}:"; then
|
|
83
|
-
MISSING="${MISSING} ${field}"
|
|
84
|
-
fi
|
|
85
|
-
done
|
|
86
|
-
|
|
87
|
-
if [[ -n "$MISSING" ]]; then
|
|
88
|
-
echo '{
|
|
89
|
-
"hookSpecificOutput": {
|
|
90
|
-
"hookEventName": "PostToolUse",
|
|
91
|
-
"additionalContext": "Doc governance (V2): '"$FILE_PATH"' is missing required frontmatter fields:'"$MISSING"'."
|
|
92
|
-
}
|
|
93
|
-
}'
|
|
94
|
-
exit 0
|
|
95
|
-
fi
|
|
96
|
-
|
|
97
|
-
# V2: Check authority value
|
|
98
|
-
AUTHORITY=$(echo "$FRONTMATTER" | grep "^authority:" | head -1 | sed 's/^authority: *//' | tr -d '"' | tr -d "'")
|
|
99
|
-
case "$AUTHORITY" in
|
|
100
|
-
canonical|policy|architecture|adr|spec|roadmap|reference|working|ephemeral)
|
|
101
|
-
;;
|
|
102
|
-
*)
|
|
103
|
-
echo '{
|
|
104
|
-
"hookSpecificOutput": {
|
|
105
|
-
"hookEventName": "PostToolUse",
|
|
106
|
-
"additionalContext": "Doc governance (V2): '"$FILE_PATH"' has invalid authority '"'"''"$AUTHORITY"''"'"'. Must be one of: canonical, policy, architecture, adr, spec, roadmap, reference, working, ephemeral."
|
|
107
|
-
}
|
|
108
|
-
}'
|
|
109
|
-
exit 0
|
|
110
|
-
;;
|
|
111
|
-
esac
|
|
112
|
-
|
|
113
|
-
# V2: Check status value
|
|
114
|
-
STATUS=$(echo "$FRONTMATTER" | grep "^status:" | head -1 | sed 's/^status: *//' | tr -d '"' | tr -d "'")
|
|
115
|
-
case "$STATUS" in
|
|
116
|
-
draft|active|implemented|proven|superseded|archived)
|
|
117
|
-
;;
|
|
118
|
-
*)
|
|
119
|
-
echo '{
|
|
120
|
-
"hookSpecificOutput": {
|
|
121
|
-
"hookEventName": "PostToolUse",
|
|
122
|
-
"additionalContext": "Doc governance (V2): '"$FILE_PATH"' has invalid status '"'"''"$STATUS"''"'"'. Must be one of: draft, active, implemented, proven, superseded, archived."
|
|
123
|
-
}
|
|
124
|
-
}'
|
|
125
|
-
exit 0
|
|
126
|
-
;;
|
|
127
|
-
esac
|
|
128
|
-
|
|
129
|
-
# V3: Check governs for high-authority docs
|
|
130
|
-
case "$AUTHORITY" in
|
|
131
|
-
canonical|architecture|adr|spec)
|
|
132
|
-
if ! echo "$FRONTMATTER" | grep -q "^governs:"; then
|
|
133
|
-
echo '{
|
|
134
|
-
"hookSpecificOutput": {
|
|
135
|
-
"hookEventName": "PostToolUse",
|
|
136
|
-
"additionalContext": "Doc governance (V3): '"$FILE_PATH"' has authority '"'"''"$AUTHORITY"''"'"' but no governs section. Docs with authority canonical/architecture/adr/spec must declare what they govern (modules, schemas, or specs)."
|
|
137
|
-
}
|
|
138
|
-
}'
|
|
139
|
-
exit 0
|
|
140
|
-
fi
|
|
141
|
-
;;
|
|
142
|
-
esac
|
|
143
|
-
|
|
144
|
-
# V4: Check verified_at_commit for implementation-state claims
|
|
145
|
-
case "$STATUS" in
|
|
146
|
-
implemented|proven)
|
|
147
|
-
if ! echo "$FRONTMATTER" | grep -q "^verified_at_commit:"; then
|
|
148
|
-
echo '{
|
|
149
|
-
"hookSpecificOutput": {
|
|
150
|
-
"hookEventName": "PostToolUse",
|
|
151
|
-
"additionalContext": "Doc governance (V4): '"$FILE_PATH"' has status '"'"''"$STATUS"''"'"' but no verified_at_commit. Docs claiming implementation state must declare the commit SHA where claims were verified."
|
|
152
|
-
}
|
|
153
|
-
}'
|
|
154
|
-
exit 0
|
|
155
|
-
fi
|
|
156
|
-
;;
|
|
157
|
-
esac
|
|
158
|
-
|
|
159
|
-
# V5: Check superseded_by for superseded docs
|
|
160
|
-
if [[ "$STATUS" == "superseded" ]]; then
|
|
161
|
-
if ! echo "$FRONTMATTER" | grep -q "^superseded_by:"; then
|
|
162
|
-
echo '{
|
|
163
|
-
"hookSpecificOutput": {
|
|
164
|
-
"hookEventName": "PostToolUse",
|
|
165
|
-
"additionalContext": "Doc governance (V5): '"$FILE_PATH"' has status '"'"'superseded'"'"' but no superseded_by. Superseded docs must declare their replacement doc_id."
|
|
166
|
-
}
|
|
167
|
-
}'
|
|
168
|
-
exit 0
|
|
169
|
-
fi
|
|
170
|
-
fi
|
|
171
|
-
|
|
172
|
-
# All checks passed
|
|
173
|
-
exit 0
|
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# CAWS Lite-Mode Sprawl Check Hook
|
|
3
|
-
# Checks for file sprawl patterns (banned names, venv dirs, doc sprawl)
|
|
4
|
-
# @author @darianrosebrook
|
|
5
|
-
|
|
6
|
-
set -euo pipefail
|
|
7
|
-
|
|
8
|
-
# Read JSON input from Claude Code
|
|
9
|
-
INPUT=$(cat)
|
|
10
|
-
|
|
11
|
-
# Extract tool info
|
|
12
|
-
TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name // ""')
|
|
13
|
-
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // ""')
|
|
14
|
-
|
|
15
|
-
# Only check Write operations (new file creation)
|
|
16
|
-
if [[ "$TOOL_NAME" != "Write" ]]; then
|
|
17
|
-
exit 0
|
|
18
|
-
fi
|
|
19
|
-
|
|
20
|
-
if [[ -z "$FILE_PATH" ]]; then
|
|
21
|
-
exit 0
|
|
22
|
-
fi
|
|
23
|
-
|
|
24
|
-
PROJECT_DIR="${CLAUDE_PROJECT_DIR:-.}"
|
|
25
|
-
SCOPE_FILE="$PROJECT_DIR/.caws/scope.json"
|
|
26
|
-
|
|
27
|
-
# Only active in lite mode (scope.json present, no working-spec.yaml)
|
|
28
|
-
if [[ ! -f "$SCOPE_FILE" ]]; then
|
|
29
|
-
exit 0
|
|
30
|
-
fi
|
|
31
|
-
|
|
32
|
-
# Get relative path
|
|
33
|
-
# Get relative path (portable — macOS realpath lacks --relative-to)
|
|
34
|
-
if [[ "$FILE_PATH" == "$PROJECT_DIR"/* ]]; then
|
|
35
|
-
REL_PATH="${FILE_PATH#$PROJECT_DIR/}"
|
|
36
|
-
else
|
|
37
|
-
REL_PATH="$FILE_PATH"
|
|
38
|
-
fi
|
|
39
|
-
BASENAME=$(basename "$REL_PATH")
|
|
40
|
-
|
|
41
|
-
# Use Node.js to check banned patterns
|
|
42
|
-
if command -v node >/dev/null 2>&1; then
|
|
43
|
-
SPRAWL_CHECK=$(node -e "
|
|
44
|
-
const fs = require('fs');
|
|
45
|
-
const path = require('path');
|
|
46
|
-
try {
|
|
47
|
-
const scope = JSON.parse(fs.readFileSync('$SCOPE_FILE', 'utf8'));
|
|
48
|
-
const filePath = '$REL_PATH';
|
|
49
|
-
const basename = '$BASENAME';
|
|
50
|
-
const banned = scope.bannedPatterns || {};
|
|
51
|
-
|
|
52
|
-
function globToRegex(pattern) {
|
|
53
|
-
let i = 0, re = '';
|
|
54
|
-
while (i < pattern.length) {
|
|
55
|
-
const c = pattern[i];
|
|
56
|
-
if (c === '*' && pattern[i+1] === '*') {
|
|
57
|
-
re += '.*'; i += 2;
|
|
58
|
-
if (pattern[i] === '/') i++;
|
|
59
|
-
} else if (c === '*') {
|
|
60
|
-
re += '[^/]*'; i++;
|
|
61
|
-
} else if (c === '?') {
|
|
62
|
-
re += '[^/]'; i++;
|
|
63
|
-
} else if (c === '[') {
|
|
64
|
-
const end = pattern.indexOf(']', i);
|
|
65
|
-
if (end > i) { re += pattern.slice(i, end + 1); i = end + 1; }
|
|
66
|
-
else { re += '\\\\['; i++; }
|
|
67
|
-
} else if (c === '{') {
|
|
68
|
-
const end = pattern.indexOf('}', i);
|
|
69
|
-
if (end > i) {
|
|
70
|
-
const alts = pattern.slice(i + 1, end).split(',').map(a => a.trim());
|
|
71
|
-
re += '(?:' + alts.join('|') + ')'; i = end + 1;
|
|
72
|
-
} else { re += '\\\\{'; i++; }
|
|
73
|
-
} else if ('.+^$|()'.includes(c)) {
|
|
74
|
-
re += '\\\\' + c; i++;
|
|
75
|
-
} else {
|
|
76
|
-
re += c; i++;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
return new RegExp('^' + re + '$');
|
|
80
|
-
}
|
|
81
|
-
function matchGlob(str, pattern) {
|
|
82
|
-
return globToRegex(pattern).test(str);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// Check banned file patterns
|
|
86
|
-
for (const p of (banned.files || [])) {
|
|
87
|
-
if (matchGlob(basename, p)) {
|
|
88
|
-
console.log('banned_file:' + p);
|
|
89
|
-
process.exit(0);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// Check banned doc patterns
|
|
94
|
-
for (const p of (banned.docs || [])) {
|
|
95
|
-
if (matchGlob(basename, p)) {
|
|
96
|
-
console.log('banned_doc:' + p);
|
|
97
|
-
process.exit(0);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// Check banned directory patterns
|
|
102
|
-
const parts = filePath.split('/');
|
|
103
|
-
for (const part of parts) {
|
|
104
|
-
for (const p of (banned.directories || [])) {
|
|
105
|
-
if (matchGlob(part, p)) {
|
|
106
|
-
console.log('banned_dir:' + p + ':' + part);
|
|
107
|
-
process.exit(0);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
console.log('ok');
|
|
113
|
-
} catch (error) {
|
|
114
|
-
console.log('error:' + error.message);
|
|
115
|
-
}
|
|
116
|
-
" 2>&1)
|
|
117
|
-
|
|
118
|
-
if [[ "$SPRAWL_CHECK" == banned_file:* ]]; then
|
|
119
|
-
PATTERN="${SPRAWL_CHECK#banned_file:}"
|
|
120
|
-
echo "BLOCKED: File name matches banned sprawl pattern: $PATTERN" >&2
|
|
121
|
-
echo "File: $REL_PATH" >&2
|
|
122
|
-
echo "Banned patterns prevent shadow files like *-enhanced.*, *-final.*, *-v2.*, *-copy.*" >&2
|
|
123
|
-
echo "Instead, modify the original file directly." >&2
|
|
124
|
-
exit 2
|
|
125
|
-
fi
|
|
126
|
-
|
|
127
|
-
if [[ "$SPRAWL_CHECK" == banned_doc:* ]]; then
|
|
128
|
-
PATTERN="${SPRAWL_CHECK#banned_doc:}"
|
|
129
|
-
echo "BLOCKED: Doc file matches banned sprawl pattern: $PATTERN" >&2
|
|
130
|
-
echo "File: $REL_PATH" >&2
|
|
131
|
-
echo "Avoid creating many summary/recap/plan files. Update existing documentation instead." >&2
|
|
132
|
-
exit 2
|
|
133
|
-
fi
|
|
134
|
-
|
|
135
|
-
if [[ "$SPRAWL_CHECK" == banned_dir:* ]]; then
|
|
136
|
-
IFS=':' read -r _ PATTERN DIR_NAME <<< "$SPRAWL_CHECK"
|
|
137
|
-
echo "BLOCKED: Directory matches banned pattern: $PATTERN (directory: $DIR_NAME)" >&2
|
|
138
|
-
echo "File: $REL_PATH" >&2
|
|
139
|
-
echo "Use the designated venv path instead of creating new virtual environments." >&2
|
|
140
|
-
exit 2
|
|
141
|
-
fi
|
|
142
|
-
fi
|
|
143
|
-
|
|
144
|
-
# Allow the operation
|
|
145
|
-
exit 0
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# CAWS Naming Convention Check Hook for Claude Code
|
|
3
|
-
# Validates file naming against CAWS conventions
|
|
4
|
-
# @author @darianrosebrook
|
|
5
|
-
|
|
6
|
-
set -euo pipefail
|
|
7
|
-
|
|
8
|
-
# Read JSON input from Claude Code
|
|
9
|
-
INPUT=$(cat)
|
|
10
|
-
|
|
11
|
-
# Extract file path from PostToolUse input
|
|
12
|
-
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // ""')
|
|
13
|
-
TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name // ""')
|
|
14
|
-
|
|
15
|
-
# Only check Write tool (new files)
|
|
16
|
-
if [[ "$TOOL_NAME" != "Write" ]]; then
|
|
17
|
-
exit 0
|
|
18
|
-
fi
|
|
19
|
-
|
|
20
|
-
if [[ -z "$FILE_PATH" ]]; then
|
|
21
|
-
exit 0
|
|
22
|
-
fi
|
|
23
|
-
|
|
24
|
-
# Get filename
|
|
25
|
-
FILENAME=$(basename "$FILE_PATH")
|
|
26
|
-
|
|
27
|
-
# Banned modifiers that indicate incomplete/temporary naming
|
|
28
|
-
BANNED_MODIFIERS=(
|
|
29
|
-
"enhanced"
|
|
30
|
-
"unified"
|
|
31
|
-
"simplified"
|
|
32
|
-
"better"
|
|
33
|
-
"new"
|
|
34
|
-
"next"
|
|
35
|
-
"final"
|
|
36
|
-
"copy"
|
|
37
|
-
"revamp"
|
|
38
|
-
"improved"
|
|
39
|
-
"alt"
|
|
40
|
-
"tmp"
|
|
41
|
-
"scratch"
|
|
42
|
-
"wip"
|
|
43
|
-
"test-"
|
|
44
|
-
"-test"
|
|
45
|
-
"_test"
|
|
46
|
-
"temp"
|
|
47
|
-
"old"
|
|
48
|
-
"backup"
|
|
49
|
-
)
|
|
50
|
-
|
|
51
|
-
# Convert filename to lowercase for checking
|
|
52
|
-
FILENAME_LOWER=$(echo "$FILENAME" | tr '[:upper:]' '[:lower:]')
|
|
53
|
-
|
|
54
|
-
# Check for banned modifiers (word-boundary aware)
|
|
55
|
-
for modifier in "${BANNED_MODIFIERS[@]}"; do
|
|
56
|
-
# Match modifier preceded by start-of-string, hyphen, underscore, or dot
|
|
57
|
-
# and followed by end-of-string, hyphen, underscore, or dot
|
|
58
|
-
# Prevents false positives like "old" in "gold_oracle" or "new" in "renewable"
|
|
59
|
-
if [[ "$FILENAME_LOWER" =~ (^|[-_.])"$modifier"([-_.]|$) ]]; then
|
|
60
|
-
# Special case: allow test files that follow conventions
|
|
61
|
-
if [[ "$modifier" == "test-" ]] || [[ "$modifier" == "-test" ]] || [[ "$modifier" == "_test" ]]; then
|
|
62
|
-
if [[ "$FILENAME_LOWER" =~ \.(test|spec)\.(js|ts|jsx|tsx|py|go|rs)$ ]]; then
|
|
63
|
-
continue
|
|
64
|
-
fi
|
|
65
|
-
fi
|
|
66
|
-
|
|
67
|
-
echo '{
|
|
68
|
-
"hookSpecificOutput": {
|
|
69
|
-
"hookEventName": "PostToolUse",
|
|
70
|
-
"additionalContext": "Warning: The filename '\'''"$FILENAME"''\'' contains the modifier '\'''"$modifier"''\'' which may indicate temporary or non-canonical naming. Consider using a more descriptive, permanent name. See CAWS naming conventions in .caws/canonical-map.yaml or run '\''caws naming check'\''."
|
|
71
|
-
}
|
|
72
|
-
}'
|
|
73
|
-
exit 0
|
|
74
|
-
fi
|
|
75
|
-
done
|
|
76
|
-
|
|
77
|
-
# Check for version suffixes (e.g., file-v2.js, file_v3.ts)
|
|
78
|
-
if [[ "$FILENAME_LOWER" =~ [-_]v[0-9]+\. ]]; then
|
|
79
|
-
echo '{
|
|
80
|
-
"hookSpecificOutput": {
|
|
81
|
-
"hookEventName": "PostToolUse",
|
|
82
|
-
"additionalContext": "Warning: The filename '\'''"$FILENAME"''\'' contains a version suffix. Version control should be handled by git, not file names. Consider removing the version suffix."
|
|
83
|
-
}
|
|
84
|
-
}'
|
|
85
|
-
exit 0
|
|
86
|
-
fi
|
|
87
|
-
|
|
88
|
-
# Check for date stamps (e.g., file-2024-01-15.js)
|
|
89
|
-
if [[ "$FILENAME_LOWER" =~ [0-9]{4}[-_][0-9]{2}[-_][0-9]{2} ]]; then
|
|
90
|
-
echo '{
|
|
91
|
-
"hookSpecificOutput": {
|
|
92
|
-
"hookEventName": "PostToolUse",
|
|
93
|
-
"additionalContext": "Warning: The filename '\'''"$FILENAME"''\'' contains a date stamp. Version control should be handled by git, not file names. Consider removing the date."
|
|
94
|
-
}
|
|
95
|
-
}'
|
|
96
|
-
exit 0
|
|
97
|
-
fi
|
|
98
|
-
|
|
99
|
-
# File naming is OK
|
|
100
|
-
exit 0
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# CAWS Protected Paths Guard for Claude Code
|
|
3
|
-
# Blocks direct Write/Edit access to guard code and guard state.
|
|
4
|
-
# @author @darianrosebrook
|
|
5
|
-
|
|
6
|
-
set -euo pipefail
|
|
7
|
-
|
|
8
|
-
INPUT=$(cat)
|
|
9
|
-
|
|
10
|
-
TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name // ""')
|
|
11
|
-
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // ""')
|
|
12
|
-
|
|
13
|
-
case "$TOOL_NAME" in
|
|
14
|
-
Write|Edit) ;;
|
|
15
|
-
*) exit 0 ;;
|
|
16
|
-
esac
|
|
17
|
-
|
|
18
|
-
if [[ -z "$FILE_PATH" ]]; then
|
|
19
|
-
exit 0
|
|
20
|
-
fi
|
|
21
|
-
|
|
22
|
-
# If you are reading this because a write was blocked, do not edit hook files or
|
|
23
|
-
# strike-state files to bypass a guard. Switch into the correct worktree, fix the
|
|
24
|
-
# active spec scope, or ask the user if the guard itself is wrong.
|
|
25
|
-
case "$FILE_PATH" in
|
|
26
|
-
*/.claude/hooks/*)
|
|
27
|
-
echo "BLOCKED: $FILE_PATH is protected." >&2
|
|
28
|
-
echo "Ask the user for permission before editing Claude hook scripts." >&2
|
|
29
|
-
exit 1
|
|
30
|
-
;;
|
|
31
|
-
*/.claude/logs/guard-strikes-*.json)
|
|
32
|
-
echo "BLOCKED: $FILE_PATH is protected guard state." >&2
|
|
33
|
-
echo "Do not reset or edit strike counters to bypass enforcement." >&2
|
|
34
|
-
echo "Switch into the correct worktree, update the active CAWS spec scope, or ask the user for direction instead." >&2
|
|
35
|
-
exit 2
|
|
36
|
-
;;
|
|
37
|
-
esac
|
|
38
|
-
|
|
39
|
-
exit 0
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# CAWS Quality Check Hook for Claude Code
|
|
3
|
-
# Runs CAWS quality validation after file edits
|
|
4
|
-
# @author @darianrosebrook
|
|
5
|
-
|
|
6
|
-
set -euo pipefail
|
|
7
|
-
|
|
8
|
-
# Read JSON input from Claude Code
|
|
9
|
-
INPUT=$(cat)
|
|
10
|
-
|
|
11
|
-
# Extract file info from PostToolUse input
|
|
12
|
-
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // ""')
|
|
13
|
-
TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name // ""')
|
|
14
|
-
|
|
15
|
-
# Only run on Write/Edit of source files
|
|
16
|
-
if [[ "$TOOL_NAME" != "Write" ]] && [[ "$TOOL_NAME" != "Edit" ]]; then
|
|
17
|
-
exit 0
|
|
18
|
-
fi
|
|
19
|
-
|
|
20
|
-
# Skip non-source files and node_modules/dist
|
|
21
|
-
if [[ ! "$FILE_PATH" =~ \.(js|ts|jsx|tsx|py|go|rs|java|mjs|cjs)$ ]] || \
|
|
22
|
-
[[ "$FILE_PATH" =~ node_modules ]] || \
|
|
23
|
-
[[ "$FILE_PATH" =~ dist/ ]] || \
|
|
24
|
-
[[ "$FILE_PATH" =~ build/ ]]; then
|
|
25
|
-
exit 0
|
|
26
|
-
fi
|
|
27
|
-
|
|
28
|
-
# Determine project directory
|
|
29
|
-
PROJECT_DIR="${CLAUDE_PROJECT_DIR:-.}"
|
|
30
|
-
|
|
31
|
-
# Check if we're in a CAWS project
|
|
32
|
-
if [[ ! -f "$PROJECT_DIR/.caws/working-spec.yaml" ]] && [[ ! -d "$PROJECT_DIR/.caws/specs" ]]; then
|
|
33
|
-
exit 0
|
|
34
|
-
fi
|
|
35
|
-
|
|
36
|
-
# Check if CAWS CLI is available
|
|
37
|
-
if ! command -v caws &> /dev/null; then
|
|
38
|
-
echo '{
|
|
39
|
-
"hookSpecificOutput": {
|
|
40
|
-
"hookEventName": "PostToolUse",
|
|
41
|
-
"additionalContext": "CAWS CLI not available. Consider installing with: npm install -g @paths.design/caws-cli"
|
|
42
|
-
}
|
|
43
|
-
}'
|
|
44
|
-
exit 0
|
|
45
|
-
fi
|
|
46
|
-
|
|
47
|
-
# Run quality gates via the unified pipeline
|
|
48
|
-
RESULT=$(caws gates run --context=edit --file "$FILE_PATH" --json --quiet 2>&1) || GATE_EXIT=$?
|
|
49
|
-
|
|
50
|
-
if [ -z "$RESULT" ]; then
|
|
51
|
-
# No output — gates command not available or errored
|
|
52
|
-
echo '{
|
|
53
|
-
"hookSpecificOutput": {
|
|
54
|
-
"hookEventName": "PostToolUse",
|
|
55
|
-
"additionalContext": "Quality gates did not produce output (exit '"${GATE_EXIT:-0}"'). Run '\''caws gates run'\'' for details."
|
|
56
|
-
}
|
|
57
|
-
}'
|
|
58
|
-
exit 0
|
|
59
|
-
fi
|
|
60
|
-
|
|
61
|
-
# Check if gates passed
|
|
62
|
-
PASSED=$(echo "$RESULT" | jq -r '.passed // true' 2>/dev/null)
|
|
63
|
-
|
|
64
|
-
if [ "$PASSED" = "true" ]; then
|
|
65
|
-
echo '{
|
|
66
|
-
"hookSpecificOutput": {
|
|
67
|
-
"hookEventName": "PostToolUse",
|
|
68
|
-
"additionalContext": "Quality gates passed for this change."
|
|
69
|
-
}
|
|
70
|
-
}'
|
|
71
|
-
else
|
|
72
|
-
# Extract top 3 gate failure messages
|
|
73
|
-
VIOLATIONS=$(echo "$RESULT" | jq -r '[.gates[] | select(.status == "fail") | "- \(.name): \(.messages[0] // "failed")"] | .[0:3] | .[]' 2>/dev/null || echo "Run 'caws gates run' for details")
|
|
74
|
-
|
|
75
|
-
echo '{
|
|
76
|
-
"decision": "block",
|
|
77
|
-
"reason": "Quality gate violations detected. Please address the following issues before continuing:\n'"$VIOLATIONS"'\n\nRun '\''caws gates run'\'' for full details."
|
|
78
|
-
}'
|
|
79
|
-
fi
|
|
80
|
-
|
|
81
|
-
exit 0
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# CAWS Secret Scanner for Claude Code
|
|
3
|
-
# Warns when reading files that may contain secrets
|
|
4
|
-
# @author @darianrosebrook
|
|
5
|
-
|
|
6
|
-
set -euo pipefail
|
|
7
|
-
|
|
8
|
-
# Read JSON input from Claude Code
|
|
9
|
-
INPUT=$(cat)
|
|
10
|
-
|
|
11
|
-
# Extract file path
|
|
12
|
-
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // ""')
|
|
13
|
-
|
|
14
|
-
if [[ -z "$FILE_PATH" ]]; then
|
|
15
|
-
exit 0
|
|
16
|
-
fi
|
|
17
|
-
|
|
18
|
-
# Get just the filename for pattern matching
|
|
19
|
-
FILENAME=$(basename "$FILE_PATH")
|
|
20
|
-
|
|
21
|
-
# Files that commonly contain secrets
|
|
22
|
-
SECRET_FILE_PATTERNS=(
|
|
23
|
-
'.env'
|
|
24
|
-
'.env.local'
|
|
25
|
-
'.env.production'
|
|
26
|
-
'.env.development'
|
|
27
|
-
'.env.*'
|
|
28
|
-
'credentials.json'
|
|
29
|
-
'service-account.json'
|
|
30
|
-
'secrets.yaml'
|
|
31
|
-
'secrets.yml'
|
|
32
|
-
'secrets.json'
|
|
33
|
-
'.netrc'
|
|
34
|
-
'.npmrc'
|
|
35
|
-
'.pypirc'
|
|
36
|
-
'id_rsa'
|
|
37
|
-
'id_ed25519'
|
|
38
|
-
'id_ecdsa'
|
|
39
|
-
'*.pem'
|
|
40
|
-
'*.key'
|
|
41
|
-
'*.p12'
|
|
42
|
-
'*.pfx'
|
|
43
|
-
'htpasswd'
|
|
44
|
-
'shadow'
|
|
45
|
-
)
|
|
46
|
-
|
|
47
|
-
# Directories that commonly contain secrets
|
|
48
|
-
SECRET_DIRS=(
|
|
49
|
-
'.ssh'
|
|
50
|
-
'.aws'
|
|
51
|
-
'.azure'
|
|
52
|
-
'.gcloud'
|
|
53
|
-
'.kube'
|
|
54
|
-
'.gnupg'
|
|
55
|
-
)
|
|
56
|
-
|
|
57
|
-
# Check if file matches secret patterns
|
|
58
|
-
for pattern in "${SECRET_FILE_PATTERNS[@]}"; do
|
|
59
|
-
if [[ "$FILENAME" == $pattern ]]; then
|
|
60
|
-
# Output JSON with warning for Claude
|
|
61
|
-
echo '{
|
|
62
|
-
"hookSpecificOutput": {
|
|
63
|
-
"hookEventName": "PreToolUse",
|
|
64
|
-
"additionalContext": "WARNING: This file may contain secrets. Do not include sensitive values in your response. If you need to reference credentials, use placeholders like <API_KEY> instead of actual values."
|
|
65
|
-
}
|
|
66
|
-
}'
|
|
67
|
-
exit 0
|
|
68
|
-
fi
|
|
69
|
-
done
|
|
70
|
-
|
|
71
|
-
# Check if file is in a sensitive directory
|
|
72
|
-
for dir in "${SECRET_DIRS[@]}"; do
|
|
73
|
-
if [[ "$FILE_PATH" == *"/$dir/"* ]] || [[ "$FILE_PATH" == *"/$dir" ]]; then
|
|
74
|
-
echo '{
|
|
75
|
-
"hookSpecificOutput": {
|
|
76
|
-
"hookEventName": "PreToolUse",
|
|
77
|
-
"additionalContext": "WARNING: This file is in a sensitive directory that may contain secrets. Do not include any sensitive values in your response."
|
|
78
|
-
}
|
|
79
|
-
}'
|
|
80
|
-
exit 0
|
|
81
|
-
fi
|
|
82
|
-
done
|
|
83
|
-
|
|
84
|
-
# Allow the read
|
|
85
|
-
exit 0
|