@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,190 +0,0 @@
|
|
|
1
|
-
# Claude Code Integration for CAWS
|
|
2
|
-
|
|
3
|
-
This directory contains Claude Code hooks and configuration for CAWS (Coding Agent Working Standard) integration.
|
|
4
|
-
|
|
5
|
-
## Overview
|
|
6
|
-
|
|
7
|
-
CAWS hooks for Claude Code provide:
|
|
8
|
-
|
|
9
|
-
- **Safety Gates**: Block dangerous commands and scan for secrets
|
|
10
|
-
- **Quality Gates**: Run CAWS quality checks after file edits
|
|
11
|
-
- **Scope Guards**: Validate edits against the working spec's scope
|
|
12
|
-
- **Audit Logging**: Track agent actions for compliance
|
|
13
|
-
|
|
14
|
-
## Directory Structure
|
|
15
|
-
|
|
16
|
-
```
|
|
17
|
-
.claude/
|
|
18
|
-
├── settings.json # Claude Code settings with hooks configuration
|
|
19
|
-
├── hooks/ # Hook scripts
|
|
20
|
-
│ ├── audit.sh # Session and action logging
|
|
21
|
-
│ ├── block-dangerous.sh # Block destructive commands
|
|
22
|
-
│ ├── scan-secrets.sh # Warn when reading sensitive files
|
|
23
|
-
│ ├── quality-check.sh # Run CAWS quality gates
|
|
24
|
-
│ ├── validate-spec.sh # Validate spec files
|
|
25
|
-
│ ├── scope-guard.sh # Check scope boundaries
|
|
26
|
-
│ └── naming-check.sh # Validate file naming conventions
|
|
27
|
-
├── logs/ # Audit logs (gitignored)
|
|
28
|
-
└── README.md # This file
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
## Hook Events
|
|
32
|
-
|
|
33
|
-
### PreToolUse Hooks
|
|
34
|
-
|
|
35
|
-
Run before Claude executes a tool:
|
|
36
|
-
|
|
37
|
-
| Hook | Matcher | Purpose |
|
|
38
|
-
|------|---------|---------|
|
|
39
|
-
| `block-dangerous.sh` | `Bash` | Block destructive shell commands |
|
|
40
|
-
| `scan-secrets.sh` | `Read` | Warn when reading sensitive files |
|
|
41
|
-
| `scope-guard.sh` | `Write\|Edit` | Check scope boundaries before edits (use `caws scope show` to diagnose blocks) |
|
|
42
|
-
|
|
43
|
-
### PostToolUse Hooks
|
|
44
|
-
|
|
45
|
-
Run after Claude executes a tool:
|
|
46
|
-
|
|
47
|
-
| Hook | Matcher | Purpose |
|
|
48
|
-
|------|---------|---------|
|
|
49
|
-
| `quality-check.sh` | `Write\|Edit` | Run CAWS quality gates |
|
|
50
|
-
| `validate-spec.sh` | `Write\|Edit` | Validate spec file changes |
|
|
51
|
-
| `naming-check.sh` | `Write` | Check file naming conventions |
|
|
52
|
-
| `audit.sh` | `Write\|Edit\|Bash` | Log tool usage |
|
|
53
|
-
|
|
54
|
-
### Session Hooks
|
|
55
|
-
|
|
56
|
-
| Hook | Event | Purpose |
|
|
57
|
-
|------|-------|---------|
|
|
58
|
-
| `audit.sh session-start` | `SessionStart` | Log session start |
|
|
59
|
-
| `audit.sh stop` | `Stop` | Log session end |
|
|
60
|
-
|
|
61
|
-
## Configuration
|
|
62
|
-
|
|
63
|
-
### Enable/Disable Hooks
|
|
64
|
-
|
|
65
|
-
Edit `settings.json` to enable or disable specific hooks. Remove entries from the `hooks` object to disable them.
|
|
66
|
-
|
|
67
|
-
### Hook Levels
|
|
68
|
-
|
|
69
|
-
The scaffold supports four hook levels:
|
|
70
|
-
|
|
71
|
-
- **safety**: Block dangerous commands, scan for secrets
|
|
72
|
-
- **quality**: Run quality gates on file edits
|
|
73
|
-
- **scope**: Validate edits against spec scope
|
|
74
|
-
- **audit**: Log all agent actions
|
|
75
|
-
|
|
76
|
-
Run `caws init --hooks=safety,quality` to enable specific levels.
|
|
77
|
-
|
|
78
|
-
## Audit Logs
|
|
79
|
-
|
|
80
|
-
Audit logs are written to `.claude/logs/`:
|
|
81
|
-
|
|
82
|
-
- `audit.log` - All-time log (appended)
|
|
83
|
-
- `audit-YYYY-MM-DD.log` - Daily logs
|
|
84
|
-
|
|
85
|
-
Logs are JSON-formatted for easy parsing:
|
|
86
|
-
|
|
87
|
-
```json
|
|
88
|
-
{
|
|
89
|
-
"timestamp": "2024-01-15T10:30:00Z",
|
|
90
|
-
"session_id": "abc123",
|
|
91
|
-
"event": "tool_use",
|
|
92
|
-
"tool": "Write",
|
|
93
|
-
"file": "src/index.ts",
|
|
94
|
-
"cwd": "/project"
|
|
95
|
-
}
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
## Customization
|
|
99
|
-
|
|
100
|
-
### Adding Custom Hooks
|
|
101
|
-
|
|
102
|
-
1. Create a new script in `.claude/hooks/`
|
|
103
|
-
2. Make it executable: `chmod +x .claude/hooks/my-hook.sh`
|
|
104
|
-
3. Add it to `settings.json`:
|
|
105
|
-
|
|
106
|
-
```json
|
|
107
|
-
{
|
|
108
|
-
"hooks": {
|
|
109
|
-
"PostToolUse": [
|
|
110
|
-
{
|
|
111
|
-
"matcher": "Write|Edit",
|
|
112
|
-
"hooks": [
|
|
113
|
-
{
|
|
114
|
-
"type": "command",
|
|
115
|
-
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/my-hook.sh",
|
|
116
|
-
"timeout": 10
|
|
117
|
-
}
|
|
118
|
-
]
|
|
119
|
-
}
|
|
120
|
-
]
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
### Hook Input/Output
|
|
126
|
-
|
|
127
|
-
Hooks receive JSON input via stdin:
|
|
128
|
-
|
|
129
|
-
```json
|
|
130
|
-
{
|
|
131
|
-
"session_id": "abc123",
|
|
132
|
-
"hook_event_name": "PostToolUse",
|
|
133
|
-
"tool_name": "Write",
|
|
134
|
-
"tool_input": {
|
|
135
|
-
"file_path": "/path/to/file.ts",
|
|
136
|
-
"content": "..."
|
|
137
|
-
},
|
|
138
|
-
"tool_response": { "success": true }
|
|
139
|
-
}
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
Hooks can output JSON to control Claude's behavior:
|
|
143
|
-
|
|
144
|
-
```json
|
|
145
|
-
{
|
|
146
|
-
"decision": "block",
|
|
147
|
-
"reason": "Quality gate failed: ..."
|
|
148
|
-
}
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
Or add context:
|
|
152
|
-
|
|
153
|
-
```json
|
|
154
|
-
{
|
|
155
|
-
"hookSpecificOutput": {
|
|
156
|
-
"hookEventName": "PostToolUse",
|
|
157
|
-
"additionalContext": "Remember to update the tests."
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
## Troubleshooting
|
|
163
|
-
|
|
164
|
-
### Hooks Not Running
|
|
165
|
-
|
|
166
|
-
1. Check `settings.json` syntax: `cat .claude/settings.json | jq .`
|
|
167
|
-
2. Verify scripts are executable: `ls -la .claude/hooks/`
|
|
168
|
-
3. Test hooks manually: `echo '{}' | .claude/hooks/audit.sh`
|
|
169
|
-
|
|
170
|
-
### Permission Errors
|
|
171
|
-
|
|
172
|
-
Make all hook scripts executable:
|
|
173
|
-
|
|
174
|
-
```bash
|
|
175
|
-
chmod +x .claude/hooks/*.sh
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
### Debug Hooks
|
|
179
|
-
|
|
180
|
-
Run Claude Code with `--debug` to see hook execution details:
|
|
181
|
-
|
|
182
|
-
```bash
|
|
183
|
-
claude --debug
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
## Further Reading
|
|
187
|
-
|
|
188
|
-
- [Claude Code Hooks Documentation](https://code.claude.com/docs/en/hooks)
|
|
189
|
-
- [CAWS Quality Gates](../../docs/quality-gates.md)
|
|
190
|
-
- [CAWS Scope Management](../../docs/scope-management.md)
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# CAWS Audit Hook for Claude Code
|
|
3
|
-
# Logs agent actions for compliance and debugging
|
|
4
|
-
# @author @darianrosebrook
|
|
5
|
-
|
|
6
|
-
set -euo pipefail
|
|
7
|
-
|
|
8
|
-
# Get event type from argument or input
|
|
9
|
-
EVENT_TYPE="${1:-tool-use}"
|
|
10
|
-
|
|
11
|
-
# Read JSON input from stdin
|
|
12
|
-
INPUT=$(cat)
|
|
13
|
-
|
|
14
|
-
# Parse common fields from Claude Code hook input
|
|
15
|
-
SESSION_ID=$(echo "$INPUT" | jq -r '.session_id // "unknown"')
|
|
16
|
-
CWD=$(echo "$INPUT" | jq -r '.cwd // "."')
|
|
17
|
-
HOOK_EVENT=$(echo "$INPUT" | jq -r '.hook_event_name // "unknown"')
|
|
18
|
-
TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name // ""')
|
|
19
|
-
PERMISSION_MODE=$(echo "$INPUT" | jq -r '.permission_mode // "default"')
|
|
20
|
-
|
|
21
|
-
# Ensure log directory exists
|
|
22
|
-
LOG_DIR="${CLAUDE_PROJECT_DIR:-.}/.claude/logs"
|
|
23
|
-
mkdir -p "$LOG_DIR"
|
|
24
|
-
|
|
25
|
-
# Log file path
|
|
26
|
-
LOG_FILE="$LOG_DIR/audit.log"
|
|
27
|
-
DATE_LOG_FILE="$LOG_DIR/audit-$(date +%Y-%m-%d).log"
|
|
28
|
-
|
|
29
|
-
# Timestamp
|
|
30
|
-
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
31
|
-
|
|
32
|
-
# Build log entry based on event type
|
|
33
|
-
case "$EVENT_TYPE" in
|
|
34
|
-
session-start)
|
|
35
|
-
SOURCE=$(echo "$INPUT" | jq -r '.source // "unknown"')
|
|
36
|
-
MODEL=$(echo "$INPUT" | jq -r '.model // "unknown"')
|
|
37
|
-
LOG_ENTRY=$(jq -n \
|
|
38
|
-
--arg ts "$TIMESTAMP" \
|
|
39
|
-
--arg sid "$SESSION_ID" \
|
|
40
|
-
--arg event "session_start" \
|
|
41
|
-
--arg source "$SOURCE" \
|
|
42
|
-
--arg model "$MODEL" \
|
|
43
|
-
--arg cwd "$CWD" \
|
|
44
|
-
'{timestamp: $ts, session_id: $sid, event: $event, source: $source, model: $model, cwd: $cwd}')
|
|
45
|
-
;;
|
|
46
|
-
|
|
47
|
-
stop)
|
|
48
|
-
STOP_HOOK_ACTIVE=$(echo "$INPUT" | jq -r '.stop_hook_active // false')
|
|
49
|
-
LOG_ENTRY=$(jq -n \
|
|
50
|
-
--arg ts "$TIMESTAMP" \
|
|
51
|
-
--arg sid "$SESSION_ID" \
|
|
52
|
-
--arg event "session_stop" \
|
|
53
|
-
--arg cwd "$CWD" \
|
|
54
|
-
--argjson hook_active "$STOP_HOOK_ACTIVE" \
|
|
55
|
-
'{timestamp: $ts, session_id: $sid, event: $event, cwd: $cwd, stop_hook_active: $hook_active}')
|
|
56
|
-
;;
|
|
57
|
-
|
|
58
|
-
tool-use)
|
|
59
|
-
# Extract tool-specific info
|
|
60
|
-
TOOL_INPUT=$(echo "$INPUT" | jq -c '.tool_input // {}')
|
|
61
|
-
TOOL_RESPONSE=$(echo "$INPUT" | jq -c '.tool_response // {}')
|
|
62
|
-
TOOL_USE_ID=$(echo "$INPUT" | jq -r '.tool_use_id // ""')
|
|
63
|
-
|
|
64
|
-
# For file operations, extract the path
|
|
65
|
-
FILE_PATH=$(echo "$TOOL_INPUT" | jq -r '.file_path // ""')
|
|
66
|
-
COMMAND=$(echo "$TOOL_INPUT" | jq -r '.command // ""')
|
|
67
|
-
|
|
68
|
-
LOG_ENTRY=$(jq -n \
|
|
69
|
-
--arg ts "$TIMESTAMP" \
|
|
70
|
-
--arg sid "$SESSION_ID" \
|
|
71
|
-
--arg event "tool_use" \
|
|
72
|
-
--arg tool "$TOOL_NAME" \
|
|
73
|
-
--arg file "$FILE_PATH" \
|
|
74
|
-
--arg cmd "$COMMAND" \
|
|
75
|
-
--arg cwd "$CWD" \
|
|
76
|
-
--arg mode "$PERMISSION_MODE" \
|
|
77
|
-
'{timestamp: $ts, session_id: $sid, event: $event, tool: $tool, file: $file, command: $cmd, cwd: $cwd, permission_mode: $mode}')
|
|
78
|
-
;;
|
|
79
|
-
|
|
80
|
-
*)
|
|
81
|
-
LOG_ENTRY=$(jq -n \
|
|
82
|
-
--arg ts "$TIMESTAMP" \
|
|
83
|
-
--arg sid "$SESSION_ID" \
|
|
84
|
-
--arg event "$EVENT_TYPE" \
|
|
85
|
-
--arg hook "$HOOK_EVENT" \
|
|
86
|
-
--arg cwd "$CWD" \
|
|
87
|
-
'{timestamp: $ts, session_id: $sid, event: $event, hook_event: $hook, cwd: $cwd}')
|
|
88
|
-
;;
|
|
89
|
-
esac
|
|
90
|
-
|
|
91
|
-
# --- Log rotation ---
|
|
92
|
-
# Keep main audit.log under 10MB; keep date-logs for 30 days
|
|
93
|
-
rotate_logs() {
|
|
94
|
-
# Rotate main audit.log at 10MB
|
|
95
|
-
if [[ -f "$LOG_FILE" ]]; then
|
|
96
|
-
local size
|
|
97
|
-
size=$(wc -c < "$LOG_FILE" 2>/dev/null | tr -d ' ')
|
|
98
|
-
if [[ "$size" -gt 10485760 ]]; then
|
|
99
|
-
# Keep last rotated copy, discard older
|
|
100
|
-
[[ -f "${LOG_FILE}.1" ]] && rm -f "${LOG_FILE}.1"
|
|
101
|
-
mv "$LOG_FILE" "${LOG_FILE}.1"
|
|
102
|
-
fi
|
|
103
|
-
fi
|
|
104
|
-
|
|
105
|
-
# Prune date-based logs older than 30 days
|
|
106
|
-
if [[ -d "$LOG_DIR" ]]; then
|
|
107
|
-
find "$LOG_DIR" -name 'audit-*.log' -type f -mtime +30 -delete 2>/dev/null || true
|
|
108
|
-
fi
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
# Run rotation check ~1% of the time (avoid stat overhead on every tool call)
|
|
112
|
-
if [[ $(( RANDOM % 100 )) -eq 0 ]]; then
|
|
113
|
-
rotate_logs
|
|
114
|
-
fi
|
|
115
|
-
|
|
116
|
-
# Append to log files
|
|
117
|
-
echo "$LOG_ENTRY" >> "$LOG_FILE"
|
|
118
|
-
echo "$LOG_ENTRY" >> "$DATE_LOG_FILE"
|
|
119
|
-
|
|
120
|
-
# Success - allow operation to continue
|
|
121
|
-
exit 0
|
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# CAWS Command Safety Gate for Claude Code
|
|
3
|
-
# Delegates to classify_command.py for robust command parsing and classification.
|
|
4
|
-
# Falls back to bash pattern matching if Python is unavailable.
|
|
5
|
-
#
|
|
6
|
-
# The Python classifier handles:
|
|
7
|
-
# - Heredoc-aware parsing (won't false-positive on quoted dangerous commands)
|
|
8
|
-
# - Quoted-region stripping (echo "git reset --hard" is safe)
|
|
9
|
-
# - Pipeline-aware dangers (curl | sh)
|
|
10
|
-
# - Context-aware rm classification (safe prefixes vs dangerous targets)
|
|
11
|
-
# - Proper shell segmentation (&&, ||, ;, |)
|
|
12
|
-
#
|
|
13
|
-
# @author @darianrosebrook
|
|
14
|
-
|
|
15
|
-
set -euo pipefail
|
|
16
|
-
|
|
17
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
18
|
-
|
|
19
|
-
# Read JSON input from Claude Code
|
|
20
|
-
INPUT=$(cat)
|
|
21
|
-
|
|
22
|
-
# Extract tool info
|
|
23
|
-
TOOL_NAME=$(printf '%s' "$INPUT" | jq -r '.tool_name // ""')
|
|
24
|
-
COMMAND=$(printf '%s' "$INPUT" | jq -r '.tool_input.command // ""')
|
|
25
|
-
|
|
26
|
-
# Only check Bash tool
|
|
27
|
-
if [[ "$TOOL_NAME" != "Bash" ]] || [[ -z "$COMMAND" ]]; then
|
|
28
|
-
exit 0
|
|
29
|
-
fi
|
|
30
|
-
|
|
31
|
-
# --- Try Python classifier first (preferred) ---
|
|
32
|
-
CLASSIFIER="$SCRIPT_DIR/classify_command.py"
|
|
33
|
-
if [[ -f "$CLASSIFIER" ]] && command -v python3 >/dev/null 2>&1; then
|
|
34
|
-
REPO_ROOT="${CLAUDE_PROJECT_DIR:-.}"
|
|
35
|
-
CLASSIFIER_STDERR=$(mktemp)
|
|
36
|
-
RESULT=$(printf '%s' "$COMMAND" | python3 "$CLASSIFIER" \
|
|
37
|
-
--repo-root "$REPO_ROOT" \
|
|
38
|
-
--home "$HOME" \
|
|
39
|
-
--cwd "$(pwd)" 2>"$CLASSIFIER_STDERR") || {
|
|
40
|
-
DIAG=$(head -c 200 "$CLASSIFIER_STDERR" 2>/dev/null || true)
|
|
41
|
-
rm -f "$CLASSIFIER_STDERR"
|
|
42
|
-
RESULT="{\"decision\":\"ask\",\"reason\":\"command classifier failed: ${DIAG:-unknown error}\"}"
|
|
43
|
-
}
|
|
44
|
-
rm -f "$CLASSIFIER_STDERR"
|
|
45
|
-
|
|
46
|
-
DECISION=$(printf '%s' "$RESULT" | jq -r '.decision // "ask"')
|
|
47
|
-
REASON=$(printf '%s' "$RESULT" | jq -r '.reason // "unknown"')
|
|
48
|
-
|
|
49
|
-
case "$DECISION" in
|
|
50
|
-
allow)
|
|
51
|
-
exit 0
|
|
52
|
-
;;
|
|
53
|
-
deny)
|
|
54
|
-
echo "BLOCKED: $REASON" >&2
|
|
55
|
-
echo "Command was: $COMMAND" >&2
|
|
56
|
-
exit 2
|
|
57
|
-
;;
|
|
58
|
-
ask)
|
|
59
|
-
echo "WARNING: $REASON" >&2
|
|
60
|
-
echo "Command was: $COMMAND" >&2
|
|
61
|
-
exit 1
|
|
62
|
-
;;
|
|
63
|
-
esac
|
|
64
|
-
fi
|
|
65
|
-
|
|
66
|
-
# --- Fallback: bash pattern matching (less precise, no heredoc/quote awareness) ---
|
|
67
|
-
|
|
68
|
-
DANGEROUS_PATTERNS=(
|
|
69
|
-
# Destructive file operations
|
|
70
|
-
'rm -rf /'
|
|
71
|
-
'rm -rf ~'
|
|
72
|
-
'rm -rf \*'
|
|
73
|
-
'rm -rf \.'
|
|
74
|
-
'rm -rf /\*'
|
|
75
|
-
'dd if=/dev/zero'
|
|
76
|
-
'dd if=/dev/random'
|
|
77
|
-
'mkfs\.'
|
|
78
|
-
'fdisk'
|
|
79
|
-
'> /dev/sd'
|
|
80
|
-
|
|
81
|
-
# Fork bombs and resource exhaustion
|
|
82
|
-
':\(\)\{:\|:\&\};:'
|
|
83
|
-
'while true.*fork'
|
|
84
|
-
|
|
85
|
-
# Credential/secret exposure
|
|
86
|
-
'cat.*\.env'
|
|
87
|
-
'cat.*/etc/passwd'
|
|
88
|
-
'cat.*/etc/shadow'
|
|
89
|
-
'cat.*id_rsa'
|
|
90
|
-
'cat.*\.ssh/'
|
|
91
|
-
'cat.*credentials'
|
|
92
|
-
'cat.*\.aws/'
|
|
93
|
-
|
|
94
|
-
# Network exfiltration
|
|
95
|
-
'curl.*\|.*sh'
|
|
96
|
-
'wget.*\|.*sh'
|
|
97
|
-
'curl.*\|.*bash'
|
|
98
|
-
'wget.*\|.*bash'
|
|
99
|
-
|
|
100
|
-
# Permission escalation
|
|
101
|
-
'chmod 777'
|
|
102
|
-
'chmod -R 777'
|
|
103
|
-
'chmod.*\+s'
|
|
104
|
-
|
|
105
|
-
# History manipulation
|
|
106
|
-
'history -c'
|
|
107
|
-
'rm.*\.bash_history'
|
|
108
|
-
'rm.*\.zsh_history'
|
|
109
|
-
|
|
110
|
-
# System modification
|
|
111
|
-
'shutdown'
|
|
112
|
-
'reboot'
|
|
113
|
-
'init 0'
|
|
114
|
-
'init 6'
|
|
115
|
-
|
|
116
|
-
# Git destructive operations
|
|
117
|
-
'git init'
|
|
118
|
-
'git reset --hard'
|
|
119
|
-
'git push --force'
|
|
120
|
-
'git push -f '
|
|
121
|
-
'git push --force-with-lease'
|
|
122
|
-
'git clean -f'
|
|
123
|
-
'git checkout \.'
|
|
124
|
-
'git restore \.'
|
|
125
|
-
'(^|&&|\|\||;|\|)\s*git rebase'
|
|
126
|
-
'(^|&&|\|\||;|\|)\s*git cherry-pick'
|
|
127
|
-
|
|
128
|
-
# Virtual environment creation (prevents venv sprawl)
|
|
129
|
-
'python -m venv'
|
|
130
|
-
'python3 -m venv'
|
|
131
|
-
'virtualenv '
|
|
132
|
-
'conda create'
|
|
133
|
-
)
|
|
134
|
-
|
|
135
|
-
# Check command against dangerous patterns
|
|
136
|
-
for pattern in "${DANGEROUS_PATTERNS[@]}"; do
|
|
137
|
-
if echo "$COMMAND" | grep -qiE "$pattern"; then
|
|
138
|
-
# Allow git init in worktree context
|
|
139
|
-
if [[ "$pattern" == "git init" ]] && [[ "${CAWS_WORKTREE_CONTEXT:-0}" == "1" ]]; then
|
|
140
|
-
continue
|
|
141
|
-
fi
|
|
142
|
-
|
|
143
|
-
# Allow git rebase/cherry-pick only when no worktrees are active
|
|
144
|
-
if [[ "$pattern" == *"git rebase"* ]] || [[ "$pattern" == *"git cherry-pick"* ]]; then
|
|
145
|
-
PROJECT_DIR="${CLAUDE_PROJECT_DIR:-.}"
|
|
146
|
-
if command -v git >/dev/null 2>&1; then
|
|
147
|
-
GIT_COMMON=$(cd "$PROJECT_DIR" && git rev-parse --git-common-dir 2>/dev/null || echo "")
|
|
148
|
-
if [[ -n "$GIT_COMMON" ]] && [[ "$GIT_COMMON" != ".git" ]]; then
|
|
149
|
-
CANDIDATE=$(cd "$PROJECT_DIR" && cd "$GIT_COMMON/.." 2>/dev/null && pwd || echo "")
|
|
150
|
-
if [[ -n "$CANDIDATE" ]] && [[ -d "$CANDIDATE/.caws" ]]; then
|
|
151
|
-
PROJECT_DIR="$CANDIDATE"
|
|
152
|
-
fi
|
|
153
|
-
fi
|
|
154
|
-
fi
|
|
155
|
-
WT_FILE="$PROJECT_DIR/.caws/worktrees.json"
|
|
156
|
-
if [[ -f "$WT_FILE" ]] && command -v node >/dev/null 2>&1; then
|
|
157
|
-
ACTIVE_COUNT=$(node -e "
|
|
158
|
-
try {
|
|
159
|
-
var r = JSON.parse(require('fs').readFileSync('$WT_FILE','utf8'));
|
|
160
|
-
var c = Object.values(r.worktrees||{}).filter(function(w){return w.status==='active';}).length;
|
|
161
|
-
console.log(c);
|
|
162
|
-
} catch(e) { console.log(0); }
|
|
163
|
-
" 2>/dev/null || echo "0")
|
|
164
|
-
if [[ "$ACTIVE_COUNT" -gt 0 ]]; then
|
|
165
|
-
GIT_SUBCMD="git operation"
|
|
166
|
-
[[ "$pattern" == *"git rebase"* ]] && GIT_SUBCMD="git rebase"
|
|
167
|
-
[[ "$pattern" == *"git cherry-pick"* ]] && GIT_SUBCMD="git cherry-pick"
|
|
168
|
-
echo "BLOCKED: $GIT_SUBCMD is forbidden while $ACTIVE_COUNT worktree(s) are active." >&2
|
|
169
|
-
echo "This can replay or rewrite commits across worktree boundaries." >&2
|
|
170
|
-
echo "Command was: $COMMAND" >&2
|
|
171
|
-
exit 2
|
|
172
|
-
fi
|
|
173
|
-
fi
|
|
174
|
-
continue
|
|
175
|
-
fi
|
|
176
|
-
|
|
177
|
-
# Allow venv commands if target matches designated venv path from scope.json
|
|
178
|
-
if echo "$pattern" | grep -qE '(python.*venv|virtualenv|conda create)'; then
|
|
179
|
-
PROJECT_DIR="${CLAUDE_PROJECT_DIR:-.}"
|
|
180
|
-
SCOPE_FILE="$PROJECT_DIR/.caws/scope.json"
|
|
181
|
-
if [[ -f "$SCOPE_FILE" ]] && command -v node >/dev/null 2>&1; then
|
|
182
|
-
DESIGNATED_VENV=$(node -e "try { const s = JSON.parse(require('fs').readFileSync('$SCOPE_FILE','utf8')); console.log(s.designatedVenvPath || ''); } catch(e) { console.log(''); }" 2>/dev/null || echo "")
|
|
183
|
-
if [[ -n "$DESIGNATED_VENV" ]] && echo "$COMMAND" | grep -qF "$DESIGNATED_VENV"; then
|
|
184
|
-
continue
|
|
185
|
-
fi
|
|
186
|
-
fi
|
|
187
|
-
fi
|
|
188
|
-
|
|
189
|
-
echo "BLOCKED: Command matches dangerous pattern: $pattern" >&2
|
|
190
|
-
echo "Command was: $COMMAND" >&2
|
|
191
|
-
exit 2
|
|
192
|
-
fi
|
|
193
|
-
done
|
|
194
|
-
|
|
195
|
-
# Check for sudo without specific allowed commands
|
|
196
|
-
if echo "$COMMAND" | grep -qE '^sudo\s' && ! echo "$COMMAND" | grep -qE 'sudo (npm|yarn|pnpm|brew|apt-get|apt|dnf|yum)'; then
|
|
197
|
-
echo "BLOCKED: sudo commands require explicit approval" >&2
|
|
198
|
-
echo "If this command is safe, please run it manually in your terminal" >&2
|
|
199
|
-
exit 2
|
|
200
|
-
fi
|
|
201
|
-
|
|
202
|
-
# Allow the command
|
|
203
|
-
exit 0
|