cc-safe-setup 29.8.0 → 30.0.4
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/.claude-plugin/marketplace.json +72 -19
- package/.claude-plugin/plugin.json +1 -1
- package/CONTRIBUTING.md +7 -2
- package/COOKBOOK.md +50 -46
- package/LICENSE +21 -0
- package/MIGRATION.md +8 -8
- package/README.md +419 -512
- package/SAFETY_CHECKLIST.md +15 -7
- package/SERVICES.md +194 -0
- package/SETTINGS_REFERENCE.md +236 -17
- package/SKILL.md +5 -5
- package/TROUBLESHOOTING.md +35 -14
- package/action.yml +12 -4
- package/audit/README.md +84 -0
- package/audit/audit-checklist.md +152 -0
- package/audit/boundary-selftest.sh +85 -0
- package/audit/boundary.sh +123 -0
- package/audit/count-hooks.py +42 -0
- package/audit/find-dead-hooks.sh +82 -0
- package/audit/find-unfirable-rules.sh +142 -0
- package/audit/fire.sh +97 -0
- package/audit/selftest.sh +42 -0
- package/audit/unfirable-selftest.sh +81 -0
- package/audit-web/index.html +9 -9
- package/examples/README.md +54 -17
- package/examples/account-billing-log.sh +98 -0
- package/examples/account-routing-preflight.sh +123 -0
- package/examples/agent-sdk-credit-pool-monitor.sh +145 -0
- package/examples/agent-view-quota-decrement.sh +32 -0
- package/examples/agent-view-quota-warn.sh +94 -0
- package/examples/agents-md-edit-drift-warner.sh +223 -0
- package/examples/agents-md-loader.sh +160 -0
- package/examples/agents-md-sync-checker.sh +102 -0
- package/examples/ai-slop-punctuation-arrest.sh +210 -0
- package/examples/allowlist.sh +70 -10
- package/examples/always-allow-pattern-suggester.sh +125 -0
- package/examples/ansible-vault-guard.sh +2 -1
- package/examples/anthropic-base-url-guard.sh +76 -0
- package/examples/api-busyloop-guard.sh +123 -0
- package/examples/api-endpoint-guard.sh +12 -0
- package/examples/api-key-in-url-guard.sh +17 -1
- package/examples/api-rate-limit-guard.sh +36 -1
- package/examples/api-rate-limit-tracker.sh +12 -0
- package/examples/articulated-scope-capture.sh +101 -0
- package/examples/askuserquestion-autonomy-gate.sh +102 -0
- package/examples/attachment-traversal-guard.sh +118 -0
- package/examples/aup-block-pattern-logger.sh +161 -0
- package/examples/aup-false-positive-helper.sh +124 -0
- package/examples/aup-large-tool-output-warner.sh +282 -0
- package/examples/aup-retry-loop-guard.sh +229 -0
- package/examples/auth-expiry-reminder.sh +157 -0
- package/examples/auth-macos-sleep-detector.sh +185 -0
- package/examples/auth-path-detector.sh +171 -0
- package/examples/auth-status-checker.sh +157 -0
- package/examples/authorized-reconfirmation-detector.sh +195 -0
- package/examples/auto-approve-build.sh +39 -0
- package/examples/auto-approve-cargo.sh +31 -1
- package/examples/auto-approve-docker.sh +35 -0
- package/examples/auto-approve-git-read.sh +37 -14
- package/examples/auto-approve-go.sh +30 -1
- package/examples/auto-approve-gradle.sh +29 -1
- package/examples/auto-approve-make.sh +29 -1
- package/examples/auto-approve-maven.sh +29 -1
- package/examples/auto-approve-python.sh +41 -1
- package/examples/auto-approve-readonly-tools.sh +1 -0
- package/examples/auto-approve-readonly.sh +110 -33
- package/examples/auto-approve-ssh.sh +30 -1
- package/examples/auto-approve-test.sh +44 -0
- package/examples/auto-checkpoint.sh +1 -1
- package/examples/auto-compact-prep.sh +0 -0
- package/examples/auto-git-checkpoint.sh +0 -0
- package/examples/auto-mode-safe-commands.sh +53 -1
- package/examples/auto-mode-safety-enforcer.sh +151 -4
- package/examples/auto-push-session-branch.sh +22 -0
- package/examples/aws-production-guard.sh +13 -1
- package/examples/aws-region-guard.sh +1 -1
- package/examples/background-cost-launch-guard.sh +82 -0
- package/examples/background-task-guard.sh +12 -0
- package/examples/backup-before-refactor.sh +0 -0
- package/examples/banned-command-guard.sh +12 -0
- package/examples/bash-allowlist-secondary-check.sh +157 -0
- package/examples/bash-domain-allowlist.sh +12 -0
- package/examples/bash-fanout-bounded-rewriter.sh +191 -0
- package/examples/bash-heuristic-approver.sh +112 -10
- package/examples/bash-project-fence.sh +194 -0
- package/examples/bash-safety-auto-deny.sh +12 -0
- package/examples/bash-secret-output-detector.sh +44 -3
- package/examples/bash-trace-guard.sh +12 -0
- package/examples/bashrc-safety-check.sh +0 -0
- package/examples/bg-permission-prompt-warner.sh +182 -0
- package/examples/bg-task-cooldown-guard.sh +12 -0
- package/examples/binary-read-detector.sh +135 -0
- package/examples/binary-upload-guard.sh +12 -0
- package/examples/block-database-wipe.sh +35 -10
- package/examples/branch-name-check.sh +8 -3
- package/examples/branch-naming-convention.sh +0 -0
- package/examples/broad-find-guard.sh +12 -0
- package/examples/broad-prefix-session-trap-warner.sh +106 -0
- package/examples/bulk-file-delete-guard.sh +45 -0
- package/examples/bypass-mode-effective-verifier.sh +203 -0
- package/examples/cache-creation-drift-detector.sh +120 -0
- package/examples/cache-residue-detector.sh +195 -0
- package/examples/cache-tier-logger.sh +70 -0
- package/examples/cache-ttl-eviction-detector.sh +149 -0
- package/examples/cargo-publish-guard.sh +14 -1
- package/examples/case-insensitive-path-guard.sh +21 -2
- package/examples/case-sensitive-guard.sh +23 -2
- package/examples/cch-cache-guard.sh +0 -0
- package/examples/cch-sentinel-precommit-guard.sh +47 -0
- package/examples/check-abort-controller.sh +1 -1
- package/examples/check-accessibility.sh +0 -0
- package/examples/check-aria-labels.sh +0 -0
- package/examples/check-before-act-enforcer.sh +12 -0
- package/examples/check-charset-meta.sh +0 -0
- package/examples/check-cookie-flags.sh +0 -0
- package/examples/check-cors-config.sh +0 -0
- package/examples/check-csp-headers.sh +0 -0
- package/examples/check-csrf-protection.sh +0 -0
- package/examples/check-debounce.sh +1 -1
- package/examples/check-dependency-age.sh +0 -0
- package/examples/check-dependency-license.sh +0 -0
- package/examples/check-dockerfile-best-practice.sh +0 -0
- package/examples/check-error-boundaries.sh +0 -0
- package/examples/check-error-class.sh +1 -1
- package/examples/check-error-handling.sh +0 -0
- package/examples/check-error-logging.sh +1 -1
- package/examples/check-error-message.sh +0 -0
- package/examples/check-error-stack.sh +0 -0
- package/examples/check-favicon.sh +0 -0
- package/examples/check-git-hooks-compat.sh +0 -0
- package/examples/check-gitattributes.sh +0 -0
- package/examples/check-https-redirect.sh +0 -0
- package/examples/check-input-validation.sh +0 -0
- package/examples/check-lang-attribute.sh +0 -0
- package/examples/check-npm-scripts-exist.sh +0 -0
- package/examples/check-package-size.sh +0 -0
- package/examples/check-port-availability.sh +0 -0
- package/examples/check-promise-all.sh +1 -1
- package/examples/check-rate-limiting.sh +0 -0
- package/examples/check-return-types.sh +0 -0
- package/examples/check-semantic-versioning.sh +0 -0
- package/examples/check-suspense-fallback.sh +1 -1
- package/examples/check-test-exists.sh +0 -0
- package/examples/check-test-naming.sh +0 -0
- package/examples/check-timeout-cleanup.sh +1 -1
- package/examples/check-tls-version.sh +0 -0
- package/examples/check-unsubscribe.sh +1 -1
- package/examples/check-viewport-meta.sh +0 -0
- package/examples/check-worker-terminate.sh +1 -1
- package/examples/checkpoint-tamper-guard.sh +12 -0
- package/examples/chmod-guard.sh +12 -0
- package/examples/chown-guard.sh +24 -0
- package/examples/ci-workflow-guard.sh +6 -1
- package/examples/claim-verify-detector.sh +109 -0
- package/examples/claim-vs-caveat-checker.sh +77 -0
- package/examples/classifier-fallback-allow.sh +114 -40
- package/examples/claude-cache-gc.sh +1 -0
- package/examples/claude-code-version-pin-advisor.sh +183 -0
- package/examples/claude-md-reinjector.sh +129 -0
- package/examples/claude-md-size-monitor.sh +66 -0
- package/examples/claude-update-budget-guard.sh +123 -0
- package/examples/claude-update-smart.sh +113 -0
- package/examples/claudeignore-enforce-guard.sh +12 -0
- package/examples/claudemd-enforcer.sh +0 -0
- package/examples/claudemd-tool-prohibition.sh +128 -0
- package/examples/clear-command-confirm-guard.sh +32 -15
- package/examples/cli-config-pinning-detector.sh +162 -0
- package/examples/cliff-countdown-advisor.sh +96 -0
- package/examples/clipboard-secret-guard.sh +12 -0
- package/examples/closure-word-verify-gate.sh +150 -0
- package/examples/cloud-cli-guard.sh +39 -2
- package/examples/commit-all-scope-guard.sh +44 -0
- package/examples/commit-message-check.sh +1 -1
- package/examples/commit-message-quality.sh +6 -1
- package/examples/commitment-carry-forward-arrest.sh +361 -0
- package/examples/compact-alert-notification.sh +0 -0
- package/examples/compact-dispatch-watchdog.sh +149 -0
- package/examples/completion-claim-without-verification-detector.sh +207 -0
- package/examples/composer-guard.sh +12 -0
- package/examples/compound-bash-permission-resolver.sh +156 -0
- package/examples/compound-command-allow.sh +1 -1
- package/examples/compound-command-deny-enforcer.sh +183 -0
- package/examples/compound-inject-guard.sh +12 -0
- package/examples/concurrent-edit-lock.sh +12 -0
- package/examples/conflict-marker-guard.sh +12 -0
- package/examples/consecutive-error-breaker.sh +0 -0
- package/examples/console-log-count.sh +1 -0
- package/examples/context-compact-advisor.sh +29 -2
- package/examples/context-length-budget.sh +69 -0
- package/examples/context-threshold-alert.sh +12 -0
- package/examples/context-usage-drift-alert.sh +41 -13
- package/examples/conversation-history-guard.sh +12 -0
- package/examples/core-file-protect-guard.sh +12 -0
- package/examples/cors-star-warn.sh +0 -0
- package/examples/cost-incident-self-audit.sh +162 -0
- package/examples/cowork-claude-md-load-checker.sh +100 -0
- package/examples/cowork-fuse-staleness-watcher.sh +140 -0
- package/examples/cowork-hook-absence-warner.sh +167 -0
- package/examples/cowork-model-picker-advisor.sh +115 -0
- package/examples/credential-exfil-guard.sh +65 -4
- package/examples/credential-file-cat-guard.sh +17 -1
- package/examples/cron-create-receipt.sh +112 -0
- package/examples/cron-modification-guard.sh +12 -0
- package/examples/cross-product-mcp-spawn-detector.sh +178 -0
- package/examples/cwd-project-boundary-guard.sh +0 -0
- package/examples/daemon-zombie-worker-surfacer.sh +118 -0
- package/examples/daily-cost-guard.sh +164 -0
- package/examples/daily-usage-tracker.sh +0 -0
- package/examples/dangerous-pip-flag-guard.sh +12 -0
- package/examples/db-connect-guard.sh +13 -1
- package/examples/denied-action-retry-guard.sh +12 -0
- package/examples/deny-bypass-detector.sh +12 -0
- package/examples/deny-rule-integrity-verifier.sh +181 -0
- package/examples/dependency-install-guard.sh +12 -0
- package/examples/deploy-guard.sh +14 -2
- package/examples/deploy-path-verify-guard.sh +12 -0
- package/examples/deployment-readback-gate.sh +135 -0
- package/examples/deployment-readback-gh-adapter.sh +247 -0
- package/examples/deployment-verify-guard.sh +25 -2
- package/examples/destructive-db-script-write-guard.sh +166 -0
- package/examples/destructive-migration-write-guard.sh +163 -0
- package/examples/diff-size-guard.sh +12 -0
- package/examples/disabled-feature-toggle-advisor.sh +88 -0
- package/examples/disk-partition-guard.sh +12 -0
- package/examples/dispatch-allowlist-preflight.sh +301 -0
- package/examples/dispatch-liveness-watchdog.sh +216 -0
- package/examples/dispatch-receipt.sh +174 -0
- package/examples/django-migrate-guard.sh +12 -0
- package/examples/dns-config-guard.sh +12 -0
- package/examples/docker-dangerous-guard.sh +12 -0
- package/examples/docker-volume-guard.sh +0 -0
- package/examples/dockerfile-latest-guard.sh +1 -0
- package/examples/dotenv-anthropic-key-billing-guard.sh +99 -0
- package/examples/dotenv-commit-guard.sh +12 -0
- package/examples/dotenv-read-guard.sh +12 -0
- package/examples/dotfile-protection-guard.sh +12 -0
- package/examples/dotnet-build-on-edit.sh +1 -1
- package/examples/drizzle-migrate-guard.sh +27 -2
- package/examples/echo-probe-spam-detector.sh +176 -0
- package/examples/edit-counter-test-gate.sh +12 -0
- package/examples/edit-error-counter.sh +1 -1
- package/examples/edit-guard.sh +12 -0
- package/examples/edit-old-string-validator.sh +12 -0
- package/examples/edit-quote-ambiguity-guard.sh +97 -0
- package/examples/edit-retry-loop-guard.sh +0 -0
- package/examples/edit-verify.sh +0 -0
- package/examples/env-inline-secret-guard.sh +14 -2
- package/examples/env-naming-convention.sh +0 -0
- package/examples/env-prod-guard.sh +0 -0
- package/examples/env-required-check.sh +0 -0
- package/examples/env-source-guard.sh +12 -0
- package/examples/env-var-check.sh +24 -1
- package/examples/ephemeral-container-detector.sh +147 -0
- package/examples/error-memory-guard.sh +12 -0
- package/examples/evidence-claim-gate.sh +187 -0
- package/examples/exploration-budget-guard.sh +12 -0
- package/examples/expo-eject-guard.sh +13 -0
- package/examples/extended-thinking-loop-guard.sh +139 -0
- package/examples/extended-thinking-resume-warning.sh +119 -0
- package/examples/extended-thinking-tool-use-mismatch-detector.sh +212 -0
- package/examples/fabricated-command-detector.sh +145 -0
- package/examples/false-disk-full-guard.sh +63 -0
- package/examples/feature-deprecation-detector.sh +109 -0
- package/examples/file-change-tracker.sh +1 -1
- package/examples/file-change-undo-tracker.sh +0 -0
- package/examples/file-edit-backup.sh +63 -14
- package/examples/file-reference-check.sh +0 -0
- package/examples/file-size-limit.sh +12 -0
- package/examples/financial-operation-guard.sh +12 -0
- package/examples/firewall-guard.sh +12 -0
- package/examples/fish-shell-wrapper.sh +125 -7
- package/examples/five-hundred-milestone.sh +1 -0
- package/examples/flask-static-route-guard.sh +89 -0
- package/examples/forbidden-response-phrase-detector.sh +161 -0
- package/examples/gem-push-guard.sh +13 -0
- package/examples/gh-cli-destructive-guard.sh +13 -1
- package/examples/git-checkout-safety-guard.sh +12 -0
- package/examples/git-checkout-uncommitted-guard.sh +12 -0
- package/examples/git-config-guard.sh +12 -0
- package/examples/git-crypt-worktree-guard.sh +12 -0
- package/examples/git-filter-repo-guard.sh +56 -0
- package/examples/git-history-rewrite-guard.sh +12 -0
- package/examples/git-hook-bypass-guard.sh +0 -0
- package/examples/git-maintenance-guard.sh +83 -0
- package/examples/git-merge-conflict-prevent.sh +0 -0
- package/examples/git-message-length-check.sh +0 -0
- package/examples/git-message-length.sh +0 -0
- package/examples/git-operations-require-approval.sh +68 -14
- package/examples/git-pack-temp-cleanup-guard.sh +102 -0
- package/examples/git-push-blast-radius-guard.sh +218 -0
- package/examples/git-remote-guard.sh +24 -3
- package/examples/git-rm-orphan-wipe-guard.sh +85 -0
- package/examples/git-stash-before-checkout.sh +12 -0
- package/examples/git-stash-before-danger.sh +0 -0
- package/examples/git-submodule-guard.sh +69 -2
- package/examples/git-tag-guard.sh +12 -0
- package/examples/github-actions-secret-guard.sh +0 -0
- package/examples/gitignore-check.sh +0 -0
- package/examples/gitops-drift-guard.sh +12 -0
- package/examples/go-mod-tidy-warn.sh +1 -0
- package/examples/go-vet-after-edit.sh +12 -0
- package/examples/goal-iteration-limit-warner.sh +152 -0
- package/examples/grep-nul-false-negative-guard.sh +30 -0
- package/examples/growthbook-flag-monitor.sh +257 -0
- package/examples/hallucination-url-check.sh +1 -1
- package/examples/halt-signal-detector.sh +135 -0
- package/examples/handoff-on-clear.sh +65 -0
- package/examples/hardcoded-ip-guard.sh +1 -0
- package/examples/headless-empty-result-guard.sh +0 -0
- package/examples/headless-stop-guard.sh +0 -0
- package/examples/helm-install-guard.sh +2 -1
- package/examples/home-critical-bash-guard.sh +17 -1
- package/examples/hook-debug-wrapper.sh +6 -2
- package/examples/hook-permission-fixer.sh +0 -0
- package/examples/hook-self-disable-detector.sh +99 -0
- package/examples/hook-stdout-sanitizer.sh +6 -2
- package/examples/hook-tamper-guard.sh +12 -0
- package/examples/idle-session-cost-alert.sh +0 -0
- package/examples/image-dimension-guard.sh +109 -0
- package/examples/image-file-validator.sh +0 -0
- package/examples/iteration-quality-degradation-detector.sh +170 -0
- package/examples/java-compile-on-edit.sh +1 -1
- package/examples/json-syntax-check.sh +0 -0
- package/examples/k8s-production-guard.sh +13 -1
- package/examples/kill-process-guard.sh +12 -0
- package/examples/kubernetes-guard.sh +13 -1
- package/examples/laravel-artisan-guard.sh +13 -0
- package/examples/large-file-guard.sh +1 -1
- package/examples/log-level-guard.sh +0 -0
- package/examples/log-truncation-guard.sh +12 -0
- package/examples/long-session-malformed-tool-call-detector.sh +183 -0
- package/examples/loop-detector.sh +12 -0
- package/examples/magic-number-warn.sh +1 -0
- package/examples/main-branch-warn.sh +12 -0
- package/examples/markdown-link-check.sh +0 -0
- package/examples/max-concurrent-agents.sh +12 -0
- package/examples/max-edit-size-guard.sh +13 -0
- package/examples/max-file-count-guard.sh +0 -0
- package/examples/max-file-delete-count.sh +0 -0
- package/examples/max-function-length.sh +1 -0
- package/examples/max-import-count.sh +0 -0
- package/examples/max-subagent-count.sh +0 -0
- package/examples/mcp-config-freeze.sh +12 -0
- package/examples/mcp-config-poisoning-audit.sh +150 -0
- package/examples/mcp-data-boundary.sh +1 -1
- package/examples/mcp-misdiagnosis-arrest.sh +209 -0
- package/examples/mcp-orphan-leak-warner.sh +49 -0
- package/examples/mcp-permissions-ask-warner.sh +151 -0
- package/examples/mcp-routine-approval-detector.sh +154 -0
- package/examples/mcp-server-allowlist.sh +12 -0
- package/examples/mcp-server-guard.sh +12 -0
- package/examples/mcp-startup-bloat-detector.sh +87 -0
- package/examples/mcp-stdio-compatibility-test.sh +153 -0
- package/examples/mcp-tool-audit-log.sh +0 -0
- package/examples/mcp-tool-guard.sh +101 -1
- package/examples/mcp-warmup-wait.sh +0 -0
- package/examples/memory-chain-audit.sh +56 -0
- package/examples/memory-orphan-detector.sh +188 -0
- package/examples/memory-write-guard.sh +99 -17
- package/examples/migration-verify-guard.sh +12 -0
- package/examples/model-swap-suggester.sh +177 -0
- package/examples/model-version-alert.sh +5 -1
- package/examples/model-version-lock.sh +63 -0
- package/examples/move-delete-sequence-guard.sh +33 -2
- package/examples/multi-file-plan-routing-gate.sh +192 -0
- package/examples/multi-vendor-concurrent-warner.sh +108 -0
- package/examples/multi-window-auth-drift-detector.sh +183 -0
- package/examples/multiline-command-approver.sh +161 -23
- package/examples/nested-background-agent-guard.sh +109 -0
- package/examples/nested-spawn-inflight-guard.sh +178 -0
- package/examples/network-exfil-guard.sh +12 -0
- package/examples/network-guard.sh +12 -0
- package/examples/network-interface-guard.sh +12 -0
- package/examples/nextjs-env-guard.sh +1 -1
- package/examples/no-absolute-import.sh +0 -0
- package/examples/no-alert-confirm-prompt.sh +0 -0
- package/examples/no-anonymous-default-export.sh +0 -0
- package/examples/no-any-type.sh +0 -0
- package/examples/no-any-typescript.sh +1 -0
- package/examples/no-ask-human.sh +12 -0
- package/examples/no-assignment-in-condition.sh +0 -0
- package/examples/no-base64-exfil.sh +12 -0
- package/examples/no-callback-hell.sh +0 -0
- package/examples/no-circular-dependency.sh +0 -0
- package/examples/no-cleartext-storage.sh +0 -0
- package/examples/no-commented-code.sh +0 -0
- package/examples/no-commit-fixup.sh +0 -0
- package/examples/no-console-assert.sh +0 -0
- package/examples/no-console-error-swallow.sh +0 -0
- package/examples/no-console-in-prod.sh +0 -0
- package/examples/no-console-log-commit.sh +12 -0
- package/examples/no-console-log.sh +0 -0
- package/examples/no-console-time.sh +0 -0
- package/examples/no-cors-wildcard.sh +4 -1
- package/examples/no-curl-upload.sh +0 -0
- package/examples/no-dangerouslySetInnerHTML.sh +0 -0
- package/examples/no-dangling-await.sh +1 -0
- package/examples/no-debug-commit.sh +12 -0
- package/examples/no-debug-in-commit.sh +0 -0
- package/examples/no-deep-nesting.sh +0 -0
- package/examples/no-deep-relative-import.sh +1 -0
- package/examples/no-default-credentials.sh +0 -0
- package/examples/no-deploy-friday.sh +13 -1
- package/examples/no-disabled-test.sh +0 -0
- package/examples/no-document-write.sh +0 -0
- package/examples/no-empty-function.sh +0 -0
- package/examples/no-eval-in-template.sh +0 -0
- package/examples/no-eval-template.sh +3 -1
- package/examples/no-eval.sh +0 -0
- package/examples/no-exec-user-input.sh +0 -0
- package/examples/no-fixme-ship.sh +12 -0
- package/examples/no-floating-promises.sh +0 -0
- package/examples/no-force-flag.sh +22 -5
- package/examples/no-force-install.sh +0 -0
- package/examples/no-git-amend.sh +12 -0
- package/examples/no-git-rebase-public.sh +0 -0
- package/examples/no-global-install.sh +12 -0
- package/examples/no-global-state.sh +0 -0
- package/examples/no-hardcoded-port.sh +1 -0
- package/examples/no-hardcoded-url.sh +0 -0
- package/examples/no-helmet-missing.sh +0 -0
- package/examples/no-http-url.sh +1 -0
- package/examples/no-http-without-https.sh +0 -0
- package/examples/no-inline-style.sh +0 -0
- package/examples/no-inline-styles.sh +1 -0
- package/examples/no-innerhtml.sh +0 -0
- package/examples/no-install-global.sh +12 -0
- package/examples/no-jwt-in-url.sh +0 -0
- package/examples/no-large-commit.sh +0 -0
- package/examples/no-localhost-expose.sh +0 -0
- package/examples/no-magic-number.sh +0 -0
- package/examples/no-md5-sha1.sh +0 -0
- package/examples/no-mixed-line-endings.sh +8 -1
- package/examples/no-mutation-in-reducer.sh +0 -0
- package/examples/no-nested-ternary.sh +0 -0
- package/examples/no-network-exfil.sh +0 -0
- package/examples/no-open-redirect.sh +0 -0
- package/examples/no-output-truncation.sh +12 -0
- package/examples/no-package-downgrade.sh +0 -0
- package/examples/no-package-lock-edit.sh +12 -0
- package/examples/no-path-join-user-input.sh +0 -0
- package/examples/no-port-bind.sh +0 -0
- package/examples/no-process-exit.sh +0 -0
- package/examples/no-prototype-pollution.sh +0 -0
- package/examples/no-push-without-ci.sh +0 -0
- package/examples/no-push-without-tests.sh +12 -0
- package/examples/no-raw-password-in-url.sh +0 -0
- package/examples/no-root-user-docker.sh +1 -0
- package/examples/no-root-write.sh +12 -0
- package/examples/no-secrets-in-args.sh +4 -1
- package/examples/no-secrets-in-logs.sh +0 -0
- package/examples/no-sensitive-log.sh +0 -0
- package/examples/no-sleep-in-hooks.sh +0 -0
- package/examples/no-star-import-python.sh +1 -0
- package/examples/no-string-concat-sql.sh +0 -0
- package/examples/no-sudo-guard.sh +12 -0
- package/examples/no-sync-fs.sh +0 -0
- package/examples/no-todo-in-merge.sh +0 -0
- package/examples/no-todo-in-production.sh +1 -0
- package/examples/no-todo-without-issue.sh +0 -0
- package/examples/no-unused-import.sh +0 -0
- package/examples/no-var-keyword.sh +0 -0
- package/examples/no-verify-blocker.sh +12 -0
- package/examples/no-wget-piped-bash.sh +12 -0
- package/examples/no-wildcard-cors.sh +0 -0
- package/examples/no-wildcard-delete.sh +0 -0
- package/examples/no-wildcard-import.sh +0 -0
- package/examples/no-with-statement.sh +0 -0
- package/examples/no-write-outside-src.sh +0 -0
- package/examples/no-xml-external-entity.sh +0 -0
- package/examples/non-english-quality-warner.sh +156 -0
- package/examples/notify-waiting.sh +1 -1
- package/examples/npm-audit-warn.sh +0 -0
- package/examples/npm-global-install-guard.sh +12 -0
- package/examples/npm-publish-guard.sh +12 -0
- package/examples/npm-script-injection.sh +0 -0
- package/examples/npm-supply-chain-guard.sh +0 -0
- package/examples/nuxt-config-guard.sh +1 -0
- package/examples/oauth-refresh-monitor.sh +210 -0
- package/examples/opus-degradation-tracker.sh +187 -0
- package/examples/opus48-routine-task-warning.sh +196 -0
- package/examples/opus48-thinking-wedge-advisor.sh +143 -0
- package/examples/output-credential-scan.sh +1 -1
- package/examples/output-secret-mask.sh +31 -9
- package/examples/output-token-spike-detector.sh +145 -0
- package/examples/package-json-guard.sh +12 -0
- package/examples/package-lock-frozen.sh +12 -0
- package/examples/parallel-batch-size-limiter.sh +121 -0
- package/examples/parallel-cascade-detector.sh +116 -0
- package/examples/partial-view-claim-arrest.sh +174 -0
- package/examples/path-deny-bash-guard.sh +12 -0
- package/examples/path-traversal-guard.sh +12 -0
- package/examples/per-prompt-token-cap.sh +124 -0
- package/examples/permission-audit-log.sh +1 -1
- package/examples/permission-denial-enforcer.sh +12 -0
- package/examples/permission-entry-validator.sh +0 -0
- package/examples/persisted-1m-model-advisor.sh +88 -0
- package/examples/php-lint-on-edit.sh +1 -1
- package/examples/pii-upload-guard.sh +12 -0
- package/examples/pip-publish-guard.sh +13 -0
- package/examples/pip-requirements-guard.sh +12 -0
- package/examples/pip-venv-required.sh +12 -0
- package/examples/plan-mode-edit-guard.sh +12 -0
- package/examples/plan-mode-enforcer.sh +12 -0
- package/examples/plan-mode-strict-guard.sh +12 -0
- package/examples/plugin-hooks-json-bloat-detector.sh +169 -0
- package/examples/plugin-process-cleanup.sh +0 -0
- package/examples/polyglot-rm-guard.sh +12 -0
- package/examples/post-compact-safety.sh +12 -0
- package/examples/post-edit-disk-verify.sh +152 -0
- package/examples/powershell-remove-item-guard.sh +85 -0
- package/examples/pr-description-check.sh +0 -0
- package/examples/pr-duplicate-guard.sh +13 -0
- package/examples/pre-bash-sed-line-ending-windows.sh +87 -0
- package/examples/pre-compact-knowledge-save.sh +0 -0
- package/examples/pre-compact-transcript-backup.sh +0 -0
- package/examples/pre-execution-claim-detector.sh +179 -0
- package/examples/prefer-builtin-tools.sh +10 -1
- package/examples/prefer-const.sh +0 -0
- package/examples/prefer-dedicated-tools.sh +12 -0
- package/examples/prefer-optional-chaining.sh +0 -0
- package/examples/prisma-migrate-guard.sh +24 -7
- package/examples/production-port-kill-guard.sh +12 -0
- package/examples/prompt-injection-guard.sh +2 -1
- package/examples/prompt-usage-logger.sh +0 -0
- package/examples/protect-claudemd.sh +12 -0
- package/examples/protect-dotfiles.sh +12 -0
- package/examples/proxy-capture-suggester.sh +159 -0
- package/examples/public-artefact-socratic-narrowing.sh +232 -0
- package/examples/public-repo-push-guard.sh +12 -0
- package/examples/push-requires-test-pass-record.sh +0 -0
- package/examples/push-requires-test-pass.sh +12 -0
- package/examples/quota-anomaly-detector.sh +173 -0
- package/examples/quota-reset-audit.sh +58 -0
- package/examples/quoted-flag-approver.sh +99 -10
- package/examples/rails-migration-guard.sh +12 -0
- package/examples/rate-limit-guard.sh +0 -0
- package/examples/read-all-files-enforcer.sh +0 -0
- package/examples/read-budget-guard.sh +12 -0
- package/examples/read-loop-detector.sh +59 -0
- package/examples/read-once-guard.sh +96 -0
- package/examples/read-only-mode.sh +12 -0
- package/examples/readme-exists-check.sh +0 -0
- package/examples/record-read-coverage.sh +73 -0
- package/examples/redirect-fragment-warner.sh +149 -0
- package/examples/redis-flushall-guard.sh +13 -0
- package/examples/redundant-read-blocker.sh +132 -0
- package/examples/refusal-arrest-gate.sh +248 -0
- package/examples/registry-publish-guard.sh +13 -1
- package/examples/remote-control-billing-classifier.sh +135 -0
- package/examples/replace-all-guard.sh +12 -0
- package/examples/repo-visibility-guard.sh +12 -0
- package/examples/reroute-after-block-guard.sh +150 -0
- package/examples/response-budget-guard.sh +0 -0
- package/examples/resume-drift-watcher.sh +57 -0
- package/examples/rg-replace-flag-detector.sh +125 -0
- package/examples/rhetorical-verification-prompt-detector.sh +102 -0
- package/examples/ripgrep-permission-fix.sh +0 -0
- package/examples/rm-safety-net.sh +151 -8
- package/examples/role-tool-guard.sh +12 -0
- package/examples/route-handler-emptiness-gate.sh +324 -0
- package/examples/ruby-lint-on-edit.sh +1 -1
- package/examples/runtime-binary-change-detector.sh +102 -0
- package/examples/same-command-repeat-detector.sh +196 -0
- package/examples/same-correction-arrest.sh +169 -0
- package/examples/sandbox-denywrite-enforcer.sh +78 -0
- package/examples/sandbox-relative-path-audit.sh +83 -25
- package/examples/sandbox-write-verify.sh +12 -0
- package/examples/schema-migration-guard.sh +0 -0
- package/examples/scope-expansion-receipt.sh +178 -0
- package/examples/scope-guard.sh +88 -9
- package/examples/secret-file-read-guard.sh +12 -0
- package/examples/secret-file-write-guard.sh +150 -0
- package/examples/self-modify-bypass-guard.sh +0 -0
- package/examples/sensitive-file-read-guard.sh +23 -3
- package/examples/sensitive-log-guard.sh +1 -0
- package/examples/server-side-prompt-injection-detector.sh +69 -0
- package/examples/session-agent-cost-limiter.sh +12 -0
- package/examples/session-backup-on-start.sh +1 -1
- package/examples/session-cost-alert.sh +12 -0
- package/examples/session-drift-guard.sh +12 -0
- package/examples/session-duration-guard.sh +25 -2
- package/examples/session-end-logger.sh +0 -0
- package/examples/session-health-monitor.sh +0 -0
- package/examples/session-index-repair.sh +1 -1
- package/examples/session-memory-watchdog.sh +1 -0
- package/examples/session-permission-reset-guard.sh +12 -0
- package/examples/session-persistence-verifier.sh +93 -0
- package/examples/session-plugin-pin-watch.sh +68 -0
- package/examples/session-rate-monitor.sh +176 -0
- package/examples/session-resume-env-fix.sh +0 -0
- package/examples/session-start-quota-status.sh +193 -0
- package/examples/session-start-safety-check.sh +55 -3
- package/examples/session-state-saver.sh +0 -0
- package/examples/session-summary-stop.sh +1 -1
- package/examples/session-summary.sh +0 -0
- package/examples/session-token-counter.sh +1 -1
- package/examples/settings-hooks-key-restorer.sh +99 -0
- package/examples/settings-json-health-check.sh +57 -0
- package/examples/settings-json-model-guard.sh +0 -0
- package/examples/settings-regression-tester.sh +188 -0
- package/examples/shell-config-truncation-guard.sh +12 -0
- package/examples/shell-wrapper-guard.sh +12 -0
- package/examples/skill-cumulative-size-detector.sh +104 -0
- package/examples/skill-description-drop-detector.sh +148 -0
- package/examples/skill-gate.sh +0 -0
- package/examples/skill-truncation-detector.sh +154 -0
- package/examples/skills-context-recorder.sh +167 -0
- package/examples/skills-load-verifier.sh +96 -0
- package/examples/skills-settings-validator.sh +139 -0
- package/examples/sonnet-45-deprecation-helper.sh +85 -0
- package/examples/spec-file-scope-guard.sh +12 -0
- package/examples/spring-profile-guard.sh +1 -0
- package/examples/spurious-malformed-notice-detector.sh +247 -0
- package/examples/sql-bulk-delete-warn.sh +88 -0
- package/examples/sql-injection-detect.sh +0 -0
- package/examples/ssh-key-protect.sh +12 -0
- package/examples/staged-secret-scan.sh +22 -1
- package/examples/stale-temp-settings-detector.sh +86 -0
- package/examples/standing-rule-session-surfacer.sh +137 -0
- package/examples/stop-hook-sigterm-wrapper.sh +182 -0
- package/examples/stop-transcript-write-health.sh +64 -0
- package/examples/strict-allowlist.sh +57 -15
- package/examples/strip-coauthored-by.sh +50 -10
- package/examples/subagent-blast-radius-guard.sh +184 -0
- package/examples/subagent-boundary-precheck.sh +126 -0
- package/examples/subagent-budget-guard.sh +12 -0
- package/examples/subagent-claudemd-inject.sh +0 -0
- package/examples/subagent-closure-verify-gate.sh +164 -0
- package/examples/subagent-destructive-git-guard.sh +120 -0
- package/examples/subagent-error-detector.sh +0 -0
- package/examples/subagent-forged-system-reminder-guard.sh +156 -0
- package/examples/subagent-identity-leak-guard.sh +102 -0
- package/examples/subagent-identity-reassertion.sh +51 -0
- package/examples/subagent-inheritance-tester.sh +179 -0
- package/examples/subagent-permission-mode-guard.sh +110 -0
- package/examples/subagent-scope-guard.sh +12 -0
- package/examples/subagent-spawn-verification-enforcer.sh +102 -0
- package/examples/subagent-tool-allowlist-enforcer.sh +101 -0
- package/examples/subagent-tool-call-limiter.sh +87 -15
- package/examples/subcommand-chain-guard.sh +12 -0
- package/examples/subscription-api-billing-warner.sh +160 -0
- package/examples/subscription-bypass-detector.sh +152 -0
- package/examples/svelte-lint-on-edit.sh +1 -0
- package/examples/swift-build-on-edit.sh +1 -1
- package/examples/symlink-guard.sh +27 -2
- package/examples/symlink-protect.sh +1 -0
- package/examples/system-dir-protection-guard.sh +73 -8
- package/examples/system-message-workaround.sh +38 -13
- package/examples/system-package-guard.sh +12 -0
- package/examples/systemd-service-guard.sh +12 -0
- package/examples/task-integrity-guard.sh +12 -0
- package/examples/temp-file-cleanup.sh +1 -1
- package/examples/temporal-suggestion-detector.sh +135 -0
- package/examples/terraform-guard.sh +27 -6
- package/examples/test-after-edit.sh +1 -1
- package/examples/test-before-push.sh +12 -0
- package/examples/test-coverage-reminder.sh +24 -1
- package/examples/thinking-budget-effort-mismatch-detector.sh +149 -0
- package/examples/timezone-guard.sh +0 -0
- package/examples/tmp-output-size-guard.sh +0 -0
- package/examples/todo-check.sh +1 -1
- package/examples/token-budget-guard.sh +12 -0
- package/examples/token-budget-per-task.sh +12 -0
- package/examples/token-usage-tracker.sh +7 -1
- package/examples/tokenizer-ratio-alert-corpus.sh +90 -0
- package/examples/tokenizer-ratio-alert.sh +104 -0
- package/examples/tool-call-rate-limiter.sh +0 -0
- package/examples/tool-result-correlation-checker.sh +167 -0
- package/examples/tool-result-size-guard.sh +132 -0
- package/examples/tool-retry-budget-guard.sh +12 -0
- package/examples/transcript-contamination-detector.sh +138 -0
- package/examples/trustfall-mcp-injection-guard.sh +103 -0
- package/examples/ultrareview-large-diff-advisor.sh +184 -0
- package/examples/unbounded-output-guard.sh +94 -0
- package/examples/uncommitted-changes-stop.sh +1 -0
- package/examples/uncommitted-discard-guard.sh +23 -5
- package/examples/uncommitted-work-guard.sh +12 -0
- package/examples/usage-warn.sh +0 -0
- package/examples/user-account-guard.sh +12 -0
- package/examples/userprompt-submit-receipt.sh +123 -0
- package/examples/variable-expansion-guard.sh +12 -0
- package/examples/verify-after-publish-reminder.sh +93 -0
- package/examples/verify-before-commit.sh +12 -0
- package/examples/version-bump-detector.sh +156 -0
- package/examples/version-regression-warner.sh +144 -0
- package/examples/vue-lint-on-edit.sh +1 -0
- package/examples/warn-cron-cost-trap.sh +173 -0
- package/examples/webfetch-runaway-guard.sh +89 -0
- package/examples/wellness-break-reminder.sh +118 -0
- package/examples/windows-destructive-command-guard.sh +177 -0
- package/examples/windows-path-guard.sh +12 -0
- package/examples/windows-python-stub-detector.sh +63 -0
- package/examples/work-hours-guard.sh +12 -0
- package/examples/working-directory-fence.sh +12 -0
- package/examples/workspace-lease-guard.sh +205 -0
- package/examples/worktree-create-log.sh +1 -0
- package/examples/worktree-delete-guard.sh +12 -0
- package/examples/worktree-edit-boundary-guard.sh +127 -0
- package/examples/worktree-escape-write-guard.sh +114 -0
- package/examples/worktree-hook-linker.sh +0 -0
- package/examples/worktree-hooks-path-fix.sh +111 -0
- package/examples/worktree-parent-write-guard.sh +43 -0
- package/examples/worktree-project-unify.sh +2 -1
- package/examples/worktree-remove-uncommitted-guard.sh +13 -0
- package/examples/worktree-unmerged-guard.sh +7 -1
- package/examples/write-byte-integrity-verifier.sh +190 -0
- package/examples/write-empty-content-guard.sh +67 -0
- package/examples/write-nul-corruption-detector.sh +61 -0
- package/examples/write-overwrite-confirm.sh +160 -14
- package/examples/write-secret-guard.sh +27 -5
- package/examples/write-shrink-guard.sh +12 -0
- package/examples/write-test-ratio.sh +0 -0
- package/examples/wsl-host-disk-space-guard.sh +97 -0
- package/examples/xml-format-leak-detector.sh +266 -0
- package/examples/yaml-syntax-check.sh +12 -0
- package/hooks/hooks.json +6 -6
- package/index.mjs +1699 -183
- package/mission.md +2 -0
- package/package.json +4 -4
- package/plugins/credential-guard/.claude-plugin/plugin.json +9 -7
- package/plugins/git-protection/.claude-plugin/plugin.json +10 -8
- package/plugins/safety-essentials/.claude-plugin/plugin.json +9 -7
- package/plugins/token-guard/.claude-plugin/plugin.json +10 -8
- package/scripts/agents-md-sync-setup.sh +156 -0
- package/scripts/autonomy-blocked-summary.sh +148 -0
- package/scripts/build-search-index.py +43 -0
- package/scripts/build-sitemap.py +119 -0
- package/scripts/cc-doctor.sh +192 -0
- package/scripts/check-hook-event-names.py +127 -0
- package/scripts/check-misfire-instrument.sh +64 -0
- package/scripts/claim-verify-audit.sh +467 -0
- package/scripts/cowork-claudemd-helper.sh +136 -0
- package/scripts/june-15-deprecated-model-scan.sh +111 -0
- package/scripts/measure-heredoc-shapes.sh +67 -0
- package/scripts/measure-literal-match-misfire.sh +110 -0
- package/scripts/probe-scope-guard-branches.sh +48 -0
- package/scripts/probe-skip-line-both-ways.sh +65 -0
- package/scripts/receipts-aggregate.py +199 -0
- package/scripts/session-forensic-audit.py +360 -0
- package/scripts.json +9 -9
- package/scripts.json.bak-2026-07-27-find +13 -0
- package/skills/safety-setup/SKILL.md +5 -5
- package/tests/approve-side-remaining-two.test.sh +129 -0
- package/tests/approver-list-granularity.test.sh +145 -0
- package/tests/askuserquestion-autonomy-gate.test.sh +181 -0
- package/tests/audit-ci-gate.test.sh +87 -0
- package/tests/audit-cross-layer-claudemd.test.sh +170 -0
- package/tests/audit-fail-open-parse.test.sh +100 -0
- package/tests/auto-approve-compound-tail.test.sh +194 -0
- package/tests/auto-mode-path-invoked-commands.test.sh +89 -0
- package/tests/auto-mode-quoted-targets.test.sh +127 -0
- package/tests/auto-mode-unquoted-targets.test.sh +112 -0
- package/tests/bash-secret-output-detector-detects.test.sh +102 -0
- package/tests/blindspots-cross-layer.test.sh +177 -0
- package/tests/block-database-wipe.test.sh +64 -0
- package/tests/bundled-short-flags-bypass.test.sh +85 -0
- package/tests/cd-git-allow-compound-tail.test.sh +67 -0
- package/tests/chown-guard-filesystem-root.test.sh +64 -0
- package/tests/ci-workflow-guard-skip-rule.test.sh +115 -0
- package/tests/compound-deny-safe-rm-targets.test.sh +105 -0
- package/tests/core-scripts-parser-fallback.test.sh +140 -0
- package/tests/destructive-guard-bare-glob.test.sh +74 -0
- package/tests/destructive-guard-every-operand.test.sh +100 -0
- package/tests/destructive-guard-find-deletion.test.sh +114 -0
- package/tests/destructive-guard-flag-order.test.sh +106 -0
- package/tests/destructive-guard-mentions-vs-invocations.test.sh +107 -0
- package/tests/destructive-guard-quoted-target.test.sh +89 -0
- package/tests/destructive-guard-separators.test.sh +105 -0
- package/tests/destructive-guard-variable-target.test.sh +98 -0
- package/tests/destructive-guard-wrapped-command.test.sh +91 -0
- package/tests/doctor-hook-disabling-env.test.sh +92 -0
- package/tests/doctor-misspelled-settings-keys.test.sh +106 -0
- package/tests/example-guards-wrapped-command.test.sh +169 -0
- package/tests/file-edit-backup.test.sh +93 -0
- package/tests/git-filter-repo-guard.test.sh +60 -0
- package/tests/git-global-options-bypass.test.sh +141 -0
- package/tests/git-invocation-prefixes-all-guards.test.sh +114 -0
- package/tests/git-maintenance-guard.test.sh +83 -0
- package/tests/git-pack-temp-cleanup-guard.test.sh +133 -0
- package/tests/git-rm-orphan-wipe-guard.test.sh +66 -0
- package/tests/git-submodule-guard.test.sh +50 -0
- package/tests/grep-pcre-portability.test.sh +155 -0
- package/tests/hook-registration-matches-input.test.sh +73 -0
- package/tests/hook-trigger-matches-envelope.test.sh +178 -0
- package/tests/install-does-not-claim-protection.test.sh +110 -0
- package/tests/install-example-standalone-tools.test.sh +139 -0
- package/tests/line-continuation-bypass.test.sh +114 -0
- package/tests/mcp-config-poisoning-audit.test.sh +106 -0
- package/tests/nested-background-agent-guard.test.sh +58 -0
- package/tests/no-unqualified-safety-claims.test.sh +114 -0
- package/tests/option-eating-grep-patterns.test.sh +130 -0
- package/tests/outdated-core-guards.test.sh +134 -0
- package/tests/outdated-report.test.sh +155 -0
- package/tests/output-secret-mask-warns.test.sh +73 -0
- package/tests/plugin-hooks-fail-open-under-sh.test.sh +165 -0
- package/tests/plugins-word-order.test.sh +126 -0
- package/tests/powershell-remove-item-guard.test.sh +85 -0
- package/tests/project-dir-naming.test.sh +103 -0
- package/tests/quoted-safe-targets-and-mentions.test.sh +190 -0
- package/tests/reroute-after-block-guard.test.sh +104 -0
- package/tests/secret-guard-documented-promises.test.sh +97 -0
- package/tests/session-plugin-pin-watch.test.sh +45 -0
- package/tests/settings-unreadable-refuses-to-write.test.sh +95 -0
- package/tests/shield-no-silent-adoption.test.py +110 -0
- package/tests/shield-no-silent-adoption.test.sh +46 -0
- package/tests/stop-transcript-write-health.test.sh +46 -0
- package/tests/system-dir-guard-root-erased.test.sh +66 -0
- package/tests/test-account-billing-log.sh +100 -0
- package/tests/test-account-routing-preflight.sh +77 -0
- package/tests/test-agent-sdk-credit-pool-monitor.sh +157 -0
- package/tests/test-agent-view-quota-warn.sh +184 -0
- package/tests/test-agents-md-edit-drift-warner.sh +176 -0
- package/tests/test-agents-md-loader.sh +204 -0
- package/tests/test-agents-md-sync-checker.sh +125 -0
- package/tests/test-ai-slop-punctuation-arrest.sh +280 -0
- package/tests/test-allowlist.sh +60 -0
- package/tests/test-always-allow-pattern-suggester.sh +147 -0
- package/tests/test-anthropic-base-url-guard.sh +88 -0
- package/tests/test-articulated-scope-capture.sh +139 -0
- package/tests/test-attachment-traversal-guard.sh +168 -0
- package/tests/test-aup-block-pattern-logger.sh +315 -0
- package/tests/test-aup-false-positive-helper.sh +188 -0
- package/tests/test-aup-large-tool-output-warner.sh +370 -0
- package/tests/test-aup-retry-loop-guard.sh +341 -0
- package/tests/test-auth-expiry-reminder.sh +303 -0
- package/tests/test-auth-macos-sleep-detector.sh +254 -0
- package/tests/test-auth-path-detector.sh +232 -0
- package/tests/test-auth-status-checker.sh +233 -0
- package/tests/test-authorized-reconfirmation-detector.sh +280 -0
- package/tests/test-background-cost-launch-guard.sh +62 -0
- package/tests/test-bash-allowlist-secondary-check.sh +143 -0
- package/tests/test-bash-fanout-bounded-rewriter.sh +186 -0
- package/tests/test-bash-project-fence.sh +127 -0
- package/tests/test-bg-permission-prompt-warner.sh +221 -0
- package/tests/test-binary-read-detector.sh +173 -0
- package/tests/test-broad-prefix-session-trap-warner.sh +167 -0
- package/tests/test-bulk-delete-target-resolution.sh +49 -0
- package/tests/test-bypass-mode-effective-verifier.sh +179 -0
- package/tests/test-cache-creation-drift-detector.sh +244 -0
- package/tests/test-cache-residue-detector.sh +429 -0
- package/tests/test-cache-tier-logger.sh +59 -0
- package/tests/test-cache-ttl-eviction-detector.sh +282 -0
- package/tests/test-cch-sentinel-precommit-guard.sh +64 -0
- package/tests/test-claim-verify-detector.sh +222 -0
- package/tests/test-claim-vs-caveat-checker.sh +134 -0
- package/tests/test-claude-code-version-pin-advisor.sh +353 -0
- package/tests/test-claude-md-reinjector.sh +173 -0
- package/tests/test-claude-md-size-monitor.sh +107 -0
- package/tests/test-claude-update-budget-guard.sh +132 -0
- package/tests/test-claude-update-smart.sh +91 -0
- package/tests/test-claudemd-tool-prohibition.sh +239 -0
- package/tests/test-cli-config-pinning-detector.sh +233 -0
- package/tests/test-cliff-countdown-advisor.sh +138 -0
- package/tests/test-closure-word-verify-gate.sh +158 -0
- package/tests/test-commit-all-scope-guard.sh +73 -0
- package/tests/test-commitment-carry-forward-arrest.sh +250 -0
- package/tests/test-compact-dispatch-watchdog.sh +147 -0
- package/tests/test-completion-claim-without-verification-detector.sh +326 -0
- package/tests/test-compound-bash-permission-resolver.sh +264 -0
- package/tests/test-compound-command-deny-enforcer.sh +67 -0
- package/tests/test-context-length-budget.sh +68 -0
- package/tests/test-context-usage-drift-alert.sh +52 -22
- package/tests/test-cost-incident-self-audit.sh +94 -0
- package/tests/test-cowork-claude-md-load-checker.sh +257 -0
- package/tests/test-cowork-claudemd-helper.sh +141 -0
- package/tests/test-cowork-fuse-staleness-watcher.sh +287 -0
- package/tests/test-cowork-hook-absence-warner.sh +230 -0
- package/tests/test-cowork-model-picker-advisor.sh +317 -0
- package/tests/test-credential-exfil-guard.sh +62 -0
- package/tests/test-cron-create-receipt.sh +165 -0
- package/tests/test-cross-product-mcp-spawn-detector.sh +112 -0
- package/tests/test-daemon-zombie-worker-surfacer.sh +71 -0
- package/tests/test-daily-cost-guard.sh +131 -0
- package/tests/test-deny-rule-integrity-verifier.sh +288 -0
- package/tests/test-deployment-readback-gate.sh +92 -0
- package/tests/test-deployment-readback-gh-adapter.sh +163 -0
- package/tests/test-disabled-feature-toggle-advisor.sh +78 -0
- package/tests/test-dispatch-allowlist-preflight.sh +385 -0
- package/tests/test-dispatch-liveness-watchdog.sh +319 -0
- package/tests/test-dispatch-receipt.sh +314 -0
- package/tests/test-dotenv-anthropic-key-billing-guard.sh +160 -0
- package/tests/test-echo-probe-spam-detector.sh +143 -0
- package/tests/test-edit-quote-ambiguity-guard.sh +75 -0
- package/tests/test-ephemeral-container-detector.sh +251 -0
- package/tests/test-evidence-claim-gate.sh +291 -0
- package/tests/test-extended-thinking-loop-guard.sh +289 -0
- package/tests/test-extended-thinking-resume-warning.sh +240 -0
- package/tests/test-extended-thinking-tool-use-mismatch-detector.sh +236 -0
- package/tests/test-fabricated-command-detector.sh +296 -0
- package/tests/test-false-disk-full-guard.sh +36 -0
- package/tests/test-feature-deprecation-detector.sh +117 -0
- package/tests/test-forbidden-response-phrase-detector.sh +246 -0
- package/tests/test-git-operations-require-approval.sh +53 -0
- package/tests/test-git-push-blast-radius-guard.sh +115 -0
- package/tests/test-goal-iteration-limit-warner.sh +128 -0
- package/tests/test-growthbook-flag-monitor.sh +428 -0
- package/tests/test-halt-signal-detector.sh +120 -0
- package/tests/test-hook-self-disable-detector.sh +232 -0
- package/tests/test-iteration-quality-degradation-detector.sh +244 -0
- package/tests/test-long-session-malformed-tool-call-detector.sh +185 -0
- package/tests/test-marketplace-plugins.sh +193 -0
- package/tests/test-mcp-misdiagnosis-arrest.sh +235 -0
- package/tests/test-mcp-orphan-leak-warner.sh +71 -0
- package/tests/test-mcp-permissions-ask-warner.sh +207 -0
- package/tests/test-mcp-routine-approval-detector.sh +229 -0
- package/tests/test-mcp-startup-bloat-detector.sh +141 -0
- package/tests/test-mcp-stdio-compatibility-test.sh +112 -0
- package/tests/test-memory-chain-audit.sh +59 -0
- package/tests/test-memory-orphan-detector.sh +227 -0
- package/tests/test-model-swap-suggester.sh +368 -0
- package/tests/test-model-version-lock.sh +83 -0
- package/tests/test-multi-file-plan-routing-gate.sh +277 -0
- package/tests/test-multi-window-auth-drift-detector.sh +262 -0
- package/tests/test-nested-spawn-inflight-guard.sh +281 -0
- package/tests/test-no-force-flag.sh +49 -0
- package/tests/test-non-english-quality-warner.sh +229 -0
- package/tests/test-oauth-refresh-monitor.sh +311 -0
- package/tests/test-opus-degradation-tracker.sh +274 -0
- package/tests/test-opus48-routine-task-warning.sh +201 -0
- package/tests/test-opus48-thinking-wedge-advisor.sh +249 -0
- package/tests/test-output-token-spike-detector.sh +315 -0
- package/tests/test-parallel-batch-size-limiter.sh +228 -0
- package/tests/test-parallel-cascade-detector.sh +191 -0
- package/tests/test-partial-view-claim-arrest.sh +272 -0
- package/tests/test-per-prompt-token-cap.sh +136 -0
- package/tests/test-persisted-1m-model-advisor.sh +71 -0
- package/tests/test-plugin-hooks-json-bloat-detector.sh +267 -0
- package/tests/test-post-edit-disk-verify.sh +294 -0
- package/tests/test-pre-bash-sed-line-ending-windows.sh +108 -0
- package/tests/test-pre-execution-claim-detector.sh +366 -0
- package/tests/test-private-key-backup-and-git-credentials.sh +100 -0
- package/tests/test-proxy-capture-suggester.sh +214 -0
- package/tests/test-public-artefact-socratic-narrowing.sh +346 -0
- package/tests/test-quota-anomaly-detector.sh +321 -0
- package/tests/test-quota-reset-audit.sh +81 -0
- package/tests/test-read-loop-detector.sh +137 -0
- package/tests/test-read-once-guard.sh +85 -0
- package/tests/test-receipts-aggregate.sh +143 -0
- package/tests/test-redirect-fragment-warner.sh +130 -0
- package/tests/test-redundant-read-blocker.sh +155 -0
- package/tests/test-refusal-arrest-gate.sh +303 -0
- package/tests/test-remote-control-billing-classifier.sh +125 -0
- package/tests/test-resume-drift-watcher.sh +65 -0
- package/tests/test-rg-replace-flag-detector.sh +175 -0
- package/tests/test-rhetorical-verification-prompt-detector.sh +237 -0
- package/tests/test-rm-safety-net.sh +115 -0
- package/tests/test-route-handler-emptiness-gate.sh +300 -0
- package/tests/test-runtime-binary-change-detector.sh +196 -0
- package/tests/test-same-command-repeat-detector.sh +165 -0
- package/tests/test-same-correction-arrest.sh +165 -0
- package/tests/test-scope-expansion-receipt.sh +207 -0
- package/tests/test-server-side-prompt-injection-detector.sh +181 -0
- package/tests/test-session-persistence-verifier.sh +128 -0
- package/tests/test-session-rate-monitor.sh +284 -0
- package/tests/test-session-start-quota-status.sh +210 -0
- package/tests/test-session-start-safety-check.sh +138 -0
- package/tests/test-settings-hooks-key-restorer.sh +257 -0
- package/tests/test-settings-json-health-check.sh +70 -0
- package/tests/test-settings-regression-tester.sh +197 -0
- package/tests/test-skill-cumulative-size-detector.sh +198 -0
- package/tests/test-skill-description-drop-detector.sh +236 -0
- package/tests/test-skill-truncation-detector.sh +263 -0
- package/tests/test-skills-context-recorder.sh +329 -0
- package/tests/test-skills-load-verifier.sh +184 -0
- package/tests/test-skills-settings-validator.sh +242 -0
- package/tests/test-sonnet-45-deprecation-helper.sh +150 -0
- package/tests/test-spurious-malformed-notice-detector.sh +290 -0
- package/tests/test-sql-bulk-delete-warn.sh +123 -0
- package/tests/test-ssh-key-protect.sh +81 -0
- package/tests/test-stale-temp-settings-detector.sh +161 -0
- package/tests/test-standing-rule-session-surfacer.sh +215 -0
- package/tests/test-starter-hooks-manifest.sh +96 -0
- package/tests/test-stop-hook-sigterm-wrapper.sh +258 -0
- package/tests/test-strict-allowlist.sh +72 -0
- package/tests/test-subagent-boundary-precheck.sh +137 -0
- package/tests/test-subagent-closure-verify-gate.sh +193 -0
- package/tests/test-subagent-destructive-git-guard.sh +86 -0
- package/tests/test-subagent-identity-leak-guard.sh +62 -0
- package/tests/test-subagent-identity-reassertion.sh +61 -0
- package/tests/test-subagent-inheritance-tester.sh +319 -0
- package/tests/test-subagent-permission-mode-guard.sh +61 -0
- package/tests/test-subagent-spawn-verification-enforcer.sh +60 -0
- package/tests/test-subagent-tool-allowlist-enforcer.sh +62 -0
- package/tests/test-subagent-tool-call-limiter.sh +97 -0
- package/tests/test-subscription-api-billing-warner.sh +138 -0
- package/tests/test-subscription-bypass-detector.sh +255 -0
- package/tests/test-temporal-suggestion-detector.sh +183 -0
- package/tests/test-thinking-budget-effort-mismatch-detector.sh +327 -0
- package/tests/test-tokenizer-ratio-alert-corpus.sh +77 -0
- package/tests/test-tokenizer-ratio-alert.sh +93 -0
- package/tests/test-tool-result-correlation-checker.sh +264 -0
- package/tests/test-tool-result-size-guard.sh +121 -0
- package/tests/test-transcript-contamination-detector.sh +264 -0
- package/tests/test-trigger-header-parsing.sh +151 -0
- package/tests/test-ultrareview-large-diff-advisor.sh +192 -0
- package/tests/test-userprompt-submit-receipt.sh +181 -0
- package/tests/test-verify-after-publish-reminder.sh +184 -0
- package/tests/test-version-bump-detector.sh +212 -0
- package/tests/test-version-regression-warner.sh +165 -0
- package/tests/test-warn-cron-cost-trap.sh +82 -0
- package/tests/test-webfetch-runaway-guard.sh +77 -0
- package/tests/test-wellness-break-reminder.sh +138 -0
- package/tests/test-windows-destructive-command-guard.sh +169 -0
- package/tests/test-windows-python-stub-detector.sh +146 -0
- package/tests/test-worktree-edit-boundary-guard.sh +219 -0
- package/tests/test-write-byte-integrity-verifier.sh +192 -0
- package/tests/test-xml-format-leak-detector.sh +299 -0
- package/tests/trustfall-mcp-injection-guard.test.sh +183 -0
- package/tests/workspace-lease-guard.test.sh +144 -0
- package/tests/worktree-escape-write-guard.test.sh +68 -0
- package/tests/worktree-hooks-path-fix.test.sh +181 -0
- package/tests/worktree-parent-write-guard.test.sh +51 -0
- package/tests/write-empty-content-guard.test.sh +39 -0
- package/tests/write-nul-corruption-detector.test.sh +29 -0
- package/tests/write-overwrite-unread-content.test.sh +178 -0
- package/tests/wsl-host-disk-space-guard.test.sh +55 -0
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ================================================================
|
|
3
|
+
# destructive-db-script-write-guard.sh — Catch a destructive
|
|
4
|
+
# DB operation written into an application SCRIPT, before the
|
|
5
|
+
# script is ever run
|
|
6
|
+
# ================================================================
|
|
7
|
+
# PURPOSE:
|
|
8
|
+
# block-database-wipe, db-connect-guard and env-prod-guard are all
|
|
9
|
+
# PreToolUse hooks on *Bash* — they scan the shell command. They
|
|
10
|
+
# catch `psql ... DROP DATABASE`, `rails db:drop`, `mysql -h host`,
|
|
11
|
+
# etc. They do NOT catch a destructive statement that lives inside
|
|
12
|
+
# an application script and is launched by a generic runtime: when
|
|
13
|
+
# the agent writes `cleanup.js` containing `DELETE FROM` for every
|
|
14
|
+
# table and then runs `node cleanup.js`, the Bash command is just
|
|
15
|
+
# `node cleanup.js` — no DROP/DELETE/host string for the Bash guards
|
|
16
|
+
# to see. subagent-blast-radius-guard fires on Edit|Write but keys
|
|
17
|
+
# off the file PATH (a root-level `cleanup.js` is not a "sensitive
|
|
18
|
+
# path") and never reads the content.
|
|
19
|
+
#
|
|
20
|
+
# This hook closes that gap. It fires on Edit|Write (any thread —
|
|
21
|
+
# sub-agents included) and reads the script content being written.
|
|
22
|
+
# If that content contains a destructive DB operation (unqualified
|
|
23
|
+
# DELETE / TRUNCATE / DROP TABLE|DATABASE|SCHEMA), it surfaces it —
|
|
24
|
+
# or, opt-in, blocks the write — before the script exists to be run.
|
|
25
|
+
# When the same content also carries a production-looking DB target,
|
|
26
|
+
# it says so (that combination is the one that loses real data).
|
|
27
|
+
#
|
|
28
|
+
# TRIGGER: PreToolUse
|
|
29
|
+
# MATCHER: "Edit|Write"
|
|
30
|
+
#
|
|
31
|
+
# WHY THIS MATTERS:
|
|
32
|
+
# #64056 (2026-05-30, unresolved) — a sub-agent, to "test" reset
|
|
33
|
+
# logic, wrote debug-check2.js containing `DELETE FROM` across every
|
|
34
|
+
# table and ran it with node. The project's .env had production
|
|
35
|
+
# (Aiven) credentials uncommented, the ad-hoc script loaded env on
|
|
36
|
+
# its own (bypassing the repo's _test-only guardrail), and a real
|
|
37
|
+
# customer's production database was lost. None of the Bash-time DB
|
|
38
|
+
# guards saw it (the command was just `node ...`), and the path-based
|
|
39
|
+
# sub-agent guard did not flag a root-level .js. The only layer that
|
|
40
|
+
# could have caught it is the write of the script itself.
|
|
41
|
+
#
|
|
42
|
+
# WHAT IT DOES:
|
|
43
|
+
# * Looks only at writes to executable/script files (.js .mjs .cjs
|
|
44
|
+
# .ts .py .rb .php .go .java .sh .ps1 ...). SQL files / migrations
|
|
45
|
+
# are intentionally left to destructive-migration-write-guard.
|
|
46
|
+
# * Extracts the new content (Write .content; Edit .new_string;
|
|
47
|
+
# MultiEdit edits[].new_string) and looks for destructive raw SQL:
|
|
48
|
+
# - DELETE FROM <table> with no WHERE (whole-table delete)
|
|
49
|
+
# - TRUNCATE
|
|
50
|
+
# - DROP TABLE | DATABASE | SCHEMA
|
|
51
|
+
# * If found, checks the same content for a production-looking target
|
|
52
|
+
# (remote host / known managed-DB providers / a DB URL pulled from
|
|
53
|
+
# the environment) and adds that to the message.
|
|
54
|
+
# * Applies CC_DB_SCRIPT_WRITE_GUARD: off | warn (default) | block.
|
|
55
|
+
# * If the write came from a sub-agent (agent_id present), says so —
|
|
56
|
+
# sub-agent writes are the ones operators see too late (#64056 #4).
|
|
57
|
+
#
|
|
58
|
+
# CONFIG:
|
|
59
|
+
# CC_DB_SCRIPT_WRITE_GUARD off | warn (default) | block
|
|
60
|
+
# CC_DB_SCRIPT_WRITE_EXT extra ERE (alternation) of file
|
|
61
|
+
# extensions to also treat as scripts
|
|
62
|
+
#
|
|
63
|
+
# DESIGN NOTES:
|
|
64
|
+
# * Default warn, not block: a write-blocking hook must not wedge
|
|
65
|
+
# legitimate work or break headless/CI. Visibility is the safe
|
|
66
|
+
# default; blocking is opt-in (matches the other write-time guards
|
|
67
|
+
# in this repo).
|
|
68
|
+
# * Requires an UNQUALIFIED delete (DELETE FROM ... ; with no WHERE)
|
|
69
|
+
# so ordinary `DELETE FROM t WHERE ...` in normal code does not
|
|
70
|
+
# trip it. Reduces false positives sharply.
|
|
71
|
+
# * Both threads, not just sub-agents: the risk is in the content,
|
|
72
|
+
# not the author. agent_id only changes the wording.
|
|
73
|
+
# * Fail-open on malformed input / missing jq.
|
|
74
|
+
#
|
|
75
|
+
# RELATED ISSUES:
|
|
76
|
+
# https://github.com/anthropics/claude-code/issues/64056
|
|
77
|
+
# ================================================================
|
|
78
|
+
|
|
79
|
+
set -u
|
|
80
|
+
|
|
81
|
+
INPUT=$(cat)
|
|
82
|
+
|
|
83
|
+
MODE="${CC_DB_SCRIPT_WRITE_GUARD:-warn}"
|
|
84
|
+
[ "$MODE" = "off" ] && exit 0
|
|
85
|
+
|
|
86
|
+
command -v jq >/dev/null 2>&1 || exit 0
|
|
87
|
+
|
|
88
|
+
FILE=$(printf '%s' "$INPUT" | jq -r '.tool_input.file_path // empty' 2>/dev/null)
|
|
89
|
+
[ -z "$FILE" ] && exit 0
|
|
90
|
+
|
|
91
|
+
# Script/executable files only. SQL & migrations are handled by
|
|
92
|
+
# destructive-migration-write-guard, so skip them here.
|
|
93
|
+
case "$FILE" in
|
|
94
|
+
*.sql) exit 0 ;;
|
|
95
|
+
esac
|
|
96
|
+
SCRIPT_ERE='\.(js|mjs|cjs|jsx|ts|tsx|py|rb|php|go|java|kt|cs|rs|sh|bash|ps1|pl)$'
|
|
97
|
+
if [ -n "${CC_DB_SCRIPT_WRITE_EXT:-}" ]; then
|
|
98
|
+
SCRIPT_ERE="${SCRIPT_ERE}|${CC_DB_SCRIPT_WRITE_EXT}"
|
|
99
|
+
fi
|
|
100
|
+
printf '%s' "$FILE" | grep -qE "$SCRIPT_ERE" || exit 0
|
|
101
|
+
|
|
102
|
+
CONTENT=$(printf '%s' "$INPUT" | jq -r '
|
|
103
|
+
[ .tool_input.content // empty,
|
|
104
|
+
.tool_input.new_string // empty,
|
|
105
|
+
( .tool_input.edits // [] | map(.new_string // empty) | join("\n") )
|
|
106
|
+
] | join("\n")
|
|
107
|
+
' 2>/dev/null)
|
|
108
|
+
[ -z "$CONTENT" ] && exit 0
|
|
109
|
+
|
|
110
|
+
DESTRUCT=""
|
|
111
|
+
# Unqualified DELETE: DELETE FROM <name> with no WHERE before the
|
|
112
|
+
# statement terminator (; , end of quote, or end of line).
|
|
113
|
+
if printf '%s' "$CONTENT" | grep -qEi 'DELETE[[:space:]]+FROM[[:space:]]+[`"'"'"']?[A-Za-z_][A-Za-z0-9_.]*[`"'"'"']?[[:space:]]*(;|"|'"'"'|$)'; then
|
|
114
|
+
DESTRUCT="${DESTRUCT}unqualified DELETE FROM (whole-table delete). "
|
|
115
|
+
fi
|
|
116
|
+
if printf '%s' "$CONTENT" | grep -qEi 'TRUNCATE([[:space:]]+TABLE)?[[:space:]]+[`"'"'"']?[A-Za-z_]'; then
|
|
117
|
+
DESTRUCT="${DESTRUCT}TRUNCATE. "
|
|
118
|
+
fi
|
|
119
|
+
if printf '%s' "$CONTENT" | grep -qEi 'DROP[[:space:]]+(TABLE|DATABASE|SCHEMA)[[:space:]]'; then
|
|
120
|
+
DESTRUCT="${DESTRUCT}DROP TABLE/DATABASE/SCHEMA. "
|
|
121
|
+
fi
|
|
122
|
+
|
|
123
|
+
[ -z "$DESTRUCT" ] && exit 0
|
|
124
|
+
|
|
125
|
+
# Production-looking target in the same script? (the lethal combination)
|
|
126
|
+
PROD=0
|
|
127
|
+
if printf '%s' "$CONTENT" | grep -qiE 'aiven|\.rds\.amazonaws\.com|supabase\.co|neon\.tech|\.render\.com|planetscale|mongodb\+srv|amazonaws\.com|azure\.com|\.cloud:|DATABASE_URL|PROD_DATABASE|PRODUCTION'; then
|
|
128
|
+
PROD=1
|
|
129
|
+
fi
|
|
130
|
+
# Does it pull a connection target from the environment rather than a
|
|
131
|
+
# hard-coded localhost? (the #64056 "loaded env on its own" pattern)
|
|
132
|
+
ENVCONN=0
|
|
133
|
+
if printf '%s' "$CONTENT" | grep -qiE 'process\.env\.[A-Z_]*(DB|DATABASE|PG|MYSQL|MONGO)|os\.environ\[[^]]*(DB|DATABASE)|getenv\([^)]*(DB|DATABASE)'; then
|
|
134
|
+
ENVCONN=1
|
|
135
|
+
fi
|
|
136
|
+
|
|
137
|
+
AGENT_ID=$(printf '%s' "$INPUT" | jq -r '.agent_id // empty' 2>/dev/null)
|
|
138
|
+
BASE=$(basename "$FILE")
|
|
139
|
+
WHO="this write"
|
|
140
|
+
[ -n "$AGENT_ID" ] && WHO="a sub-agent ($(printf '%s' "$AGENT_ID" | cut -c1-8))"
|
|
141
|
+
|
|
142
|
+
emit() {
|
|
143
|
+
echo "destructive-db-script-write-guard: $WHO is writing a destructive DB operation into $BASE" >&2
|
|
144
|
+
echo " File: $FILE" >&2
|
|
145
|
+
echo " Detected: $DESTRUCT" >&2
|
|
146
|
+
if [ "$PROD" -eq 1 ]; then
|
|
147
|
+
echo " ! The script also references a production-looking database target. This is the combination that loses real data (#64056)." >&2
|
|
148
|
+
fi
|
|
149
|
+
if [ "$ENVCONN" -eq 1 ]; then
|
|
150
|
+
echo " ! It builds the DB connection from environment variables, so it can hit whatever .env currently points at — including production." >&2
|
|
151
|
+
fi
|
|
152
|
+
echo " Before this script is run:" >&2
|
|
153
|
+
echo " 1. Never point an ad-hoc delete/reset script at a target loaded from .env; pin it to a local/test DB with an explicit test marker." >&2
|
|
154
|
+
echo " 2. Add a WHERE clause, or guard the script so it refuses any non-localhost / non-_test target." >&2
|
|
155
|
+
echo " 3. Back up first; destructive runs against live data are irreversible." >&2
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
if [ "$MODE" = "block" ]; then
|
|
159
|
+
echo "BLOCKED: refusing to write a script containing a destructive DB operation ($BASE)." >&2
|
|
160
|
+
emit
|
|
161
|
+
echo " Set CC_DB_SCRIPT_WRITE_GUARD=warn to allow the write with a warning instead." >&2
|
|
162
|
+
exit 2
|
|
163
|
+
fi
|
|
164
|
+
|
|
165
|
+
emit
|
|
166
|
+
exit 0
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ================================================================
|
|
3
|
+
# destructive-migration-write-guard.sh — Catch a destructive
|
|
4
|
+
# schema migration at the moment it is WRITTEN, before it is run
|
|
5
|
+
# ================================================================
|
|
6
|
+
# PURPOSE:
|
|
7
|
+
# Every migration/schema guard in this repo (schema-migration-guard,
|
|
8
|
+
# prisma-migrate-guard, drizzle-migrate-guard, django-migrate-guard,
|
|
9
|
+
# rails-migration-guard, migration-safety, migration-verify-guard)
|
|
10
|
+
# is a PreToolUse hook on *Bash* — it fires when the migration is
|
|
11
|
+
# *executed*. subagent-blast-radius-guard fires on Edit|Write but
|
|
12
|
+
# only for *sub-agent* writes and only keys off the file PATH, not
|
|
13
|
+
# the content. So when the main agent (Accept Edits on) writes a
|
|
14
|
+
# migration FILE that contains a destructive DDL, and that file is
|
|
15
|
+
# later applied by a separate tool (Flyway, Liquibase, Alembic,
|
|
16
|
+
# sqlx, a CI step), nothing inspects the destructive content at the
|
|
17
|
+
# moment it is generated.
|
|
18
|
+
#
|
|
19
|
+
# This hook closes that gap. It fires on Edit|Write (any thread —
|
|
20
|
+
# main agent included), and when the file being written is a
|
|
21
|
+
# migration / SQL file whose new content contains a destructive
|
|
22
|
+
# operation (DROP COLUMN / DROP TABLE / ALTER ... DROP / TRUNCATE /
|
|
23
|
+
# unqualified DELETE), it surfaces it — or, opt-in, blocks it —
|
|
24
|
+
# before the dangerous migration file exists on disk.
|
|
25
|
+
#
|
|
26
|
+
# TRIGGER: PreToolUse
|
|
27
|
+
# MATCHER: "Edit|Write"
|
|
28
|
+
#
|
|
29
|
+
# WHY THIS MATTERS:
|
|
30
|
+
# #63763 (2026-05-29, unresolved) — asked only to change a one-to-one
|
|
31
|
+
# relationship to one-to-many, Claude wrote a Flyway migration with
|
|
32
|
+
# `ALTER TABLE ... DROP COLUMN demolition_officer_id` and NO data-
|
|
33
|
+
# migration step. It was applied and a live column was lost. Accept
|
|
34
|
+
# Edits was on, so the destructive file was written from the main
|
|
35
|
+
# thread (subagent-blast-radius-guard would not fire), and the
|
|
36
|
+
# Bash-time guards never saw the SQL because Flyway, not a shell
|
|
37
|
+
# command, applied it. The only layer that could have caught it is
|
|
38
|
+
# the write of the migration file itself. That is this hook.
|
|
39
|
+
#
|
|
40
|
+
# WHAT IT DOES:
|
|
41
|
+
# * Looks only at writes to migration / SQL files (path heuristic
|
|
42
|
+
# below). Everything else: exit 0.
|
|
43
|
+
# * Extracts the new content (Write: .content; Edit: .new_string;
|
|
44
|
+
# MultiEdit: every edits[].new_string) and scans it for
|
|
45
|
+
# destructive DDL/DML.
|
|
46
|
+
# * Applies CC_MIGRATION_WRITE_GUARD:
|
|
47
|
+
# off — do nothing (exit 0).
|
|
48
|
+
# warn — (default) print a warning to stderr, exit 0. The write
|
|
49
|
+
# still happens; the operator sees what is going in.
|
|
50
|
+
# block — exit 2 (block the write) when destructive content is
|
|
51
|
+
# found. Use this in CI or for high-stakes repos.
|
|
52
|
+
# * Recognises a same-file data-migration safeguard (an UPDATE /
|
|
53
|
+
# INSERT ... SELECT / "backfill" / "data migration" alongside the
|
|
54
|
+
# DROP) and downgrades the message accordingly — a DROP that is
|
|
55
|
+
# paired with a backfill is the careful pattern, not the bug.
|
|
56
|
+
#
|
|
57
|
+
# CONFIG:
|
|
58
|
+
# CC_MIGRATION_WRITE_GUARD off | warn (default) | block
|
|
59
|
+
# CC_MIGRATION_WRITE_PATHS extra ERE (alternation) appended to the
|
|
60
|
+
# built-in migration-file path pattern.
|
|
61
|
+
#
|
|
62
|
+
# DESIGN NOTES:
|
|
63
|
+
# * Default warn, not block: blocking a write can wedge legitimate
|
|
64
|
+
# migration work and break headless/CI. Visibility is the safe
|
|
65
|
+
# default; blocking is opt-in (matches subagent-blast-radius-guard
|
|
66
|
+
# and memory-write-guard).
|
|
67
|
+
# * Both threads, not just sub-agents: #63763 was a main-thread
|
|
68
|
+
# write. The destructive-content risk is independent of who wrote
|
|
69
|
+
# it, so this hook deliberately does not gate on agent_id.
|
|
70
|
+
# * Edit|Write only (not Bash): destructive SQL run via a shell
|
|
71
|
+
# command is already covered by schema-migration-guard et al. The
|
|
72
|
+
# uncovered gap is the file write applied later by another tool.
|
|
73
|
+
# * Fail-open on malformed input / missing jq: a safety hook must
|
|
74
|
+
# never be the thing that breaks the session.
|
|
75
|
+
#
|
|
76
|
+
# RELATED ISSUES:
|
|
77
|
+
# https://github.com/anthropics/claude-code/issues/63763
|
|
78
|
+
# ================================================================
|
|
79
|
+
|
|
80
|
+
set -u
|
|
81
|
+
|
|
82
|
+
INPUT=$(cat)
|
|
83
|
+
|
|
84
|
+
MODE="${CC_MIGRATION_WRITE_GUARD:-warn}"
|
|
85
|
+
[ "$MODE" = "off" ] && exit 0
|
|
86
|
+
|
|
87
|
+
# jq is required to read the structured tool input; without it, fail open.
|
|
88
|
+
command -v jq >/dev/null 2>&1 || exit 0
|
|
89
|
+
|
|
90
|
+
FILE=$(printf '%s' "$INPUT" | jq -r '.tool_input.file_path // empty' 2>/dev/null)
|
|
91
|
+
[ -z "$FILE" ] && exit 0
|
|
92
|
+
|
|
93
|
+
# Path heuristic: migration directories, or .sql files, or the common
|
|
94
|
+
# framework layouts (Flyway V/R/U prefixes, Alembic versions, Liquibase
|
|
95
|
+
# changelogs, Rails/Django/Prisma/Drizzle migration dirs).
|
|
96
|
+
MIGRATION_ERE='(^|/)migrations?/|(^|/)migrate/|(^|/)db/migrate/|\.sql$|(^|/)V[0-9].*__.*\.sql$|(^|/)alembic/versions/|(^|/)changelog/|(^|/)prisma/migrations/|(^|/)drizzle/'
|
|
97
|
+
if [ -n "${CC_MIGRATION_WRITE_PATHS:-}" ]; then
|
|
98
|
+
MIGRATION_ERE="${MIGRATION_ERE}|${CC_MIGRATION_WRITE_PATHS}"
|
|
99
|
+
fi
|
|
100
|
+
printf '%s' "$FILE" | grep -qE "$MIGRATION_ERE" || exit 0
|
|
101
|
+
|
|
102
|
+
# Gather the content being written across Write / Edit / MultiEdit.
|
|
103
|
+
CONTENT=$(printf '%s' "$INPUT" | jq -r '
|
|
104
|
+
[ .tool_input.content // empty,
|
|
105
|
+
.tool_input.new_string // empty,
|
|
106
|
+
( .tool_input.edits // [] | map(.new_string // empty) | join("\n") )
|
|
107
|
+
] | join("\n")
|
|
108
|
+
' 2>/dev/null)
|
|
109
|
+
[ -z "$CONTENT" ] && exit 0
|
|
110
|
+
|
|
111
|
+
# Destructive DDL/DML. Mirrors schema-migration-guard's Bash-side regex
|
|
112
|
+
# so the write-time and run-time guards agree on what "destructive" means.
|
|
113
|
+
DESTRUCT=""
|
|
114
|
+
if printf '%s' "$CONTENT" | grep -qEi 'DROP[[:space:]]+(TABLE|COLUMN|INDEX|DATABASE|SCHEMA)'; then
|
|
115
|
+
DESTRUCT="${DESTRUCT}DROP. "
|
|
116
|
+
fi
|
|
117
|
+
if printf '%s' "$CONTENT" | grep -qEi 'ALTER[[:space:]]+TABLE[^;]*DROP[[:space:]]'; then
|
|
118
|
+
DESTRUCT="${DESTRUCT}ALTER ... DROP. "
|
|
119
|
+
fi
|
|
120
|
+
if printf '%s' "$CONTENT" | grep -qEi 'TRUNCATE[[:space:]]+(TABLE[[:space:]]+)?[A-Za-z_\"`]'; then
|
|
121
|
+
DESTRUCT="${DESTRUCT}TRUNCATE. "
|
|
122
|
+
fi
|
|
123
|
+
# DELETE without a WHERE clause (whole-table delete).
|
|
124
|
+
if printf '%s' "$CONTENT" | grep -qEi 'DELETE[[:space:]]+FROM[[:space:]]+[A-Za-z_\"`][A-Za-z0-9_\".`]*[[:space:]]*;'; then
|
|
125
|
+
DESTRUCT="${DESTRUCT}unqualified DELETE. "
|
|
126
|
+
fi
|
|
127
|
+
|
|
128
|
+
[ -z "$DESTRUCT" ] && exit 0
|
|
129
|
+
|
|
130
|
+
# Is a data-preservation step present in the same file content?
|
|
131
|
+
SAFEGUARD=0
|
|
132
|
+
if printf '%s' "$CONTENT" | grep -qEi 'INSERT[[:space:]]+INTO[^;]*SELECT|UPDATE[[:space:]]+[A-Za-z_].*SET|backfill|data[ _-]?migration|COPY[[:space:]]|CREATE[[:space:]]+TABLE[^;]*_backup'; then
|
|
133
|
+
SAFEGUARD=1
|
|
134
|
+
fi
|
|
135
|
+
|
|
136
|
+
BASE=$(basename "$FILE")
|
|
137
|
+
|
|
138
|
+
emit() {
|
|
139
|
+
echo "destructive-migration-write-guard: destructive schema change being written to $BASE" >&2
|
|
140
|
+
echo " File: $FILE" >&2
|
|
141
|
+
echo " Detected: $DESTRUCT" >&2
|
|
142
|
+
if [ "$SAFEGUARD" -eq 1 ]; then
|
|
143
|
+
echo " A data-migration / backfill step appears in the same file — good. Confirm it runs BEFORE the drop and preserves the data you need." >&2
|
|
144
|
+
else
|
|
145
|
+
echo " No data-migration / backfill step detected in this file." >&2
|
|
146
|
+
echo " Before this migration is applied:" >&2
|
|
147
|
+
echo " 1. Back up the affected table(s)." >&2
|
|
148
|
+
echo " 2. If the data must survive, add a backfill/move step that runs before the drop." >&2
|
|
149
|
+
echo " 3. Write a reversible down-migration / rollback." >&2
|
|
150
|
+
echo " 4. Apply on staging first; this file may be run later by Flyway/Liquibase/Alembic without another prompt." >&2
|
|
151
|
+
fi
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
if [ "$MODE" = "block" ]; then
|
|
155
|
+
echo "BLOCKED: refusing to write a destructive migration file ($BASE)." >&2
|
|
156
|
+
emit
|
|
157
|
+
echo " Set CC_MIGRATION_WRITE_GUARD=warn to allow the write with a warning instead." >&2
|
|
158
|
+
exit 2
|
|
159
|
+
fi
|
|
160
|
+
|
|
161
|
+
# warn (default)
|
|
162
|
+
emit
|
|
163
|
+
exit 0
|
|
@@ -20,6 +20,18 @@
|
|
|
20
20
|
# CC_DIFF_BLOCK=50 — block when staging 50+ files (default)
|
|
21
21
|
# ================================================================
|
|
22
22
|
|
|
23
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
24
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
25
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
26
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
27
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
28
|
+
_nojq_warned="/tmp/cc-nojq-warned-diff-size-guard-$PPID"
|
|
29
|
+
[ -f "$_nojq_warned" ] || {
|
|
30
|
+
echo "WARNING [diff-size-guard]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
31
|
+
: > "$_nojq_warned"
|
|
32
|
+
}
|
|
33
|
+
fi
|
|
34
|
+
|
|
23
35
|
INPUT=$(cat)
|
|
24
36
|
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null)
|
|
25
37
|
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# disabled-feature-toggle-advisor.sh — SessionStart advisory that surfaces
|
|
3
|
+
# feature DISABLE / opt-out toggles set in your settings.json `env` block, so
|
|
4
|
+
# you notice one a plugin installer flipped without telling you.
|
|
5
|
+
#
|
|
6
|
+
# Why: any plugin installer can write `~/.claude/settings.json` freely. Real
|
|
7
|
+
# case (#66232): the claude-mem plugin wrote CLAUDE_CODE_DISABLE_AUTO_MEMORY=1
|
|
8
|
+
# during install with no consent and no warning. A user with 75 accumulated
|
|
9
|
+
# memory files saw apparent total memory loss on the next session — the files
|
|
10
|
+
# were intact on disk, just no longer loaded — and spent ~30 minutes diagnosing
|
|
11
|
+
# what looked like catastrophic data loss. The same vector flips ANY env toggle
|
|
12
|
+
# (telemetry, 1M context, interleaved thinking, growthbook, ...), and the user
|
|
13
|
+
# has no way to tell which a plugin touched without reading the file.
|
|
14
|
+
#
|
|
15
|
+
# What this does: at SessionStart, list every *DISABLE* / *NONESSENTIAL* /
|
|
16
|
+
# *OPT_OUT* env key set to a truthy value in user + project settings.json, and
|
|
17
|
+
# name the built-in behavior each one turns off. The point is recognition: if
|
|
18
|
+
# you did not set one yourself, an installer probably did.
|
|
19
|
+
#
|
|
20
|
+
# Gap this fills: memory-chain-audit.sh treats CLAUDE_CODE_DISABLE_AUTO_MEMORY
|
|
21
|
+
# as a cost-saving you opt INTO; it never warns when the toggle is set against
|
|
22
|
+
# your intent. No existing hook surfaces silently-set disable toggles.
|
|
23
|
+
#
|
|
24
|
+
# Honest scope: ADVISORY only. It never blocks and cannot tell whether you or a
|
|
25
|
+
# plugin set a toggle — it only makes the toggles visible so you can decide.
|
|
26
|
+
# Silent when nothing is disabled.
|
|
27
|
+
#
|
|
28
|
+
# TRIGGER: SessionStart MATCHER: ""
|
|
29
|
+
# Config: CC_DISABLE_TOGGLE_ADVISOR=off disable entirely (default: on)
|
|
30
|
+
# Related: https://github.com/anthropics/claude-code/issues/66232
|
|
31
|
+
|
|
32
|
+
[ "${CC_DISABLE_TOGGLE_ADVISOR:-on}" = "off" ] && exit 0
|
|
33
|
+
|
|
34
|
+
INPUT=$(cat 2>/dev/null)
|
|
35
|
+
|
|
36
|
+
# Resolve project dir for project-level settings (env first, then payload cwd).
|
|
37
|
+
PROJ="${CLAUDE_PROJECT_DIR:-}"
|
|
38
|
+
if [ -z "$PROJ" ]; then
|
|
39
|
+
PROJ=$(printf '%s' "$INPUT" | jq -r '.cwd // empty' 2>/dev/null)
|
|
40
|
+
fi
|
|
41
|
+
|
|
42
|
+
# Emit the env keys in a settings file that look like a disable/opt-out toggle
|
|
43
|
+
# AND are set to a truthy value (1 / true / yes / on). Ignore parse errors.
|
|
44
|
+
collect() {
|
|
45
|
+
[ -r "$1" ] || return 0
|
|
46
|
+
jq -r '
|
|
47
|
+
(.env // {}) | to_entries[]
|
|
48
|
+
| select(.key | test("DISABLE|NONESSENTIAL|OPT_?OUT"; "i"))
|
|
49
|
+
| select((.value|tostring|ascii_downcase) as $v
|
|
50
|
+
| ($v=="1" or $v=="true" or $v=="yes" or $v=="on"))
|
|
51
|
+
| .key
|
|
52
|
+
' "$1" 2>/dev/null
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
found=$( {
|
|
56
|
+
collect "$HOME/.claude/settings.json"
|
|
57
|
+
collect "$HOME/.claude/settings.local.json"
|
|
58
|
+
if [ -n "$PROJ" ]; then
|
|
59
|
+
collect "$PROJ/.claude/settings.json"
|
|
60
|
+
collect "$PROJ/.claude/settings.local.json"
|
|
61
|
+
fi
|
|
62
|
+
} | sort -u )
|
|
63
|
+
|
|
64
|
+
# Nothing disabled → stay silent (advisory hooks must not add noise).
|
|
65
|
+
[ -z "$found" ] && exit 0
|
|
66
|
+
|
|
67
|
+
{
|
|
68
|
+
echo "disabled-feature-toggle-advisor: feature DISABLE toggles are active in your settings.json env block:"
|
|
69
|
+
while IFS= read -r k; do
|
|
70
|
+
[ -z "$k" ] && continue
|
|
71
|
+
case "$k" in
|
|
72
|
+
*AUTO_MEMORY*) note="persistent memory will NOT load — your memory files stay on disk but look lost (#66232)" ;;
|
|
73
|
+
*1M_CONTEXT*) note="1M context window is turned off" ;;
|
|
74
|
+
*INTERLEAVED*) note="interleaved thinking is turned off" ;;
|
|
75
|
+
*NONESSENTIAL*|*TELEMETRY*|*ERROR_REPORTING*|*GROWTHBOOK*) note="telemetry / server-side experiments are turned off" ;;
|
|
76
|
+
*) note="a built-in behavior is turned off" ;;
|
|
77
|
+
esac
|
|
78
|
+
echo " - ${k} → ${note}"
|
|
79
|
+
done <<EOF
|
|
80
|
+
$found
|
|
81
|
+
EOF
|
|
82
|
+
echo "If you did not set these yourself, a plugin installer may have written them silently"
|
|
83
|
+
echo "(real case: #66232, a plugin disabled auto-memory on install). Review the env block of"
|
|
84
|
+
echo "~/.claude/settings.json and remove a key to restore that feature. Set"
|
|
85
|
+
echo "CC_DISABLE_TOGGLE_ADVISOR=off to silence this notice."
|
|
86
|
+
} >&2
|
|
87
|
+
|
|
88
|
+
exit 0
|
|
@@ -18,6 +18,18 @@
|
|
|
18
18
|
#
|
|
19
19
|
# TRIGGER: PreToolUse MATCHER: "Bash"
|
|
20
20
|
|
|
21
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
22
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
23
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
24
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
25
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
26
|
+
_nojq_warned="/tmp/cc-nojq-warned-disk-partition-guard-$PPID"
|
|
27
|
+
[ -f "$_nojq_warned" ] || {
|
|
28
|
+
echo "WARNING [disk-partition-guard]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
29
|
+
: > "$_nojq_warned"
|
|
30
|
+
}
|
|
31
|
+
fi
|
|
32
|
+
|
|
21
33
|
INPUT=$(cat)
|
|
22
34
|
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null)
|
|
23
35
|
|