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,125 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# rg-replace-flag-detector.sh — Warn when Claude reaches for `rg -r` thinking it means recursive
|
|
3
|
+
#
|
|
4
|
+
# Solves: anthropics/claude-code#62016 — Claude's "grep -r" muscle memory leads it
|
|
5
|
+
# to invoke `rg -rn`, which ripgrep parses as `--replace=n`. Every match is
|
|
6
|
+
# silently rewritten to the literal `n` in stdout, exit 0, no error. Claude
|
|
7
|
+
# then reads its own corrupted output, misattributes the garbage to an
|
|
8
|
+
# "external cause" (post-processing layer, compression), and burns cycles
|
|
9
|
+
# debugging a self-inflicted flag bug.
|
|
10
|
+
#
|
|
11
|
+
# How it works: PreToolUse hook on Bash that scans the proposed command for the
|
|
12
|
+
# `rg -r[a-z]` pattern (and variants like `rg -rn`, `rg -rln`, `rg --replace`
|
|
13
|
+
# without TEXT). Emits a stderr advisory pointing to the correct flag
|
|
14
|
+
# (`-l` for line numbers is wrong too; line numbers are `-n`; recursive search
|
|
15
|
+
# is the default for ripgrep, so no `-r` needed at all). Default mode is
|
|
16
|
+
# advisory (exit 0 with stderr); strict mode (env var CC_RG_REPLACE_DETECTOR_MODE=strict)
|
|
17
|
+
# blocks the call (exit 2).
|
|
18
|
+
#
|
|
19
|
+
# This is the Cluster-4 hook from the 2026-05-25 customer pain audit
|
|
20
|
+
# (~/ops/customer-pain-audit-2026-05-25-post-launch-cluster.md). It catches
|
|
21
|
+
# the tool-flag self-deception pattern at the boundary where the corrupted
|
|
22
|
+
# output would otherwise enter the model's context.
|
|
23
|
+
#
|
|
24
|
+
# TRIGGER: PreToolUse
|
|
25
|
+
# MATCHER: "Bash"
|
|
26
|
+
#
|
|
27
|
+
# Usage:
|
|
28
|
+
# {
|
|
29
|
+
# "hooks": {
|
|
30
|
+
# "PreToolUse": [{
|
|
31
|
+
# "matcher": "Bash",
|
|
32
|
+
# "hooks": [{ "type": "command", "command": "~/.claude/hooks/rg-replace-flag-detector.sh" }]
|
|
33
|
+
# }]
|
|
34
|
+
# }
|
|
35
|
+
# }
|
|
36
|
+
#
|
|
37
|
+
# Configuration:
|
|
38
|
+
# CC_RG_REPLACE_DETECTOR_DISABLE=1 — skip the check entirely
|
|
39
|
+
# CC_RG_REPLACE_DETECTOR_MODE=strict — exit 2 (hard block) instead of exit 0 (advisory)
|
|
40
|
+
|
|
41
|
+
# Read stdin first so the upstream writer never sees EPIPE, even when disabled.
|
|
42
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
43
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
44
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
45
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
46
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
47
|
+
_nojq_warned="/tmp/cc-nojq-warned-rg-replace-flag-detector-$PPID"
|
|
48
|
+
[ -f "$_nojq_warned" ] || {
|
|
49
|
+
echo "WARNING [rg-replace-flag-detector]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
50
|
+
: > "$_nojq_warned"
|
|
51
|
+
}
|
|
52
|
+
fi
|
|
53
|
+
|
|
54
|
+
INPUT=$(cat 2>/dev/null || true)
|
|
55
|
+
|
|
56
|
+
[ "${CC_RG_REPLACE_DETECTOR_DISABLE:-0}" = "1" ] && exit 0
|
|
57
|
+
[ -z "$INPUT" ] && exit 0
|
|
58
|
+
|
|
59
|
+
# Only fire on Bash tool calls.
|
|
60
|
+
TOOL_NAME=$(printf '%s' "$INPUT" | jq -r '.tool_name // empty' 2>/dev/null)
|
|
61
|
+
[ "$TOOL_NAME" = "Bash" ] || exit 0
|
|
62
|
+
|
|
63
|
+
COMMAND=$(printf '%s' "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null)
|
|
64
|
+
[ -z "$COMMAND" ] && exit 0
|
|
65
|
+
|
|
66
|
+
# Detect rg with -r or --replace flag.
|
|
67
|
+
# Patterns to catch:
|
|
68
|
+
# rg -r <TEXT>
|
|
69
|
+
# rg -rn / rg -rln (recursive + line numbers — but rg -r is --replace, not recursive)
|
|
70
|
+
# rg -r=<TEXT>
|
|
71
|
+
# rg --replace=<TEXT>
|
|
72
|
+
# rg --replace <TEXT>
|
|
73
|
+
# Patterns to skip (no false positive):
|
|
74
|
+
# rg -e <PATTERN> (extended regex, different flag)
|
|
75
|
+
# rg --regexp=<PATTERN>
|
|
76
|
+
# rg -i / --ignore-case
|
|
77
|
+
DETECTED=""
|
|
78
|
+
|
|
79
|
+
# Approach: confirm `rg` is invoked, then look for any short-flag token containing
|
|
80
|
+
# `r` anywhere in the rg invocation (separated by whitespace, not embedded in a
|
|
81
|
+
# long flag like `--regexp`).
|
|
82
|
+
#
|
|
83
|
+
# Step 1: confirm rg appears as a command (start of line, after pipe/semicolon,
|
|
84
|
+
# or after a word boundary like xargs).
|
|
85
|
+
if printf '%s' "$COMMAND" | grep -qE '(^|[[:space:]|;&]|xargs[[:space:]]+)rg([[:space:]]|$)'; then
|
|
86
|
+
# Step 2: look for any short-flag token (single -, not --) containing r.
|
|
87
|
+
# This matches `-r`, `-rn`, `-rln`, `-rH`, `-erR`, etc. but NOT `--regexp` or `--replace=X`.
|
|
88
|
+
if printf '%s' "$COMMAND" | grep -qE '(^|[[:space:]])-[a-zA-Z]*r[a-zA-Z]*([[:space:]]|$)'; then
|
|
89
|
+
DETECTED="short-flag"
|
|
90
|
+
fi
|
|
91
|
+
# Step 3: explicitly match --replace as a long flag.
|
|
92
|
+
if printf '%s' "$COMMAND" | grep -qE '(^|[[:space:]])--replace([=[:space:]]|$)'; then
|
|
93
|
+
DETECTED="long-flag"
|
|
94
|
+
fi
|
|
95
|
+
fi
|
|
96
|
+
|
|
97
|
+
[ -z "$DETECTED" ] && exit 0
|
|
98
|
+
|
|
99
|
+
cat >&2 <<EOF
|
|
100
|
+
<system-reminder>
|
|
101
|
+
rg-replace-flag-detector caught a likely flag-misuse pattern.
|
|
102
|
+
|
|
103
|
+
Command: $COMMAND
|
|
104
|
+
|
|
105
|
+
The flag \`-r\` in ripgrep means \`--replace=TEXT\`, NOT recursive. Recursive
|
|
106
|
+
search is the default for ripgrep. If you intended \`grep -rn\` muscle memory:
|
|
107
|
+
|
|
108
|
+
WRONG: rg -rn "pattern" path/ # rewrites every match to literal "n"
|
|
109
|
+
RIGHT: rg -n "pattern" path/ # line numbers, recursive by default
|
|
110
|
+
ALSO: rg "pattern" path/ # line numbers via default config
|
|
111
|
+
ALSO: rg --line-number "pattern" . # explicit long form
|
|
112
|
+
|
|
113
|
+
If you actually meant to replace text in output, ignore this warning. Otherwise
|
|
114
|
+
the resulting stdout is silently corrupted (exit 0, no error) and reading it
|
|
115
|
+
back will misattribute the garbage to an external cause.
|
|
116
|
+
|
|
117
|
+
Source: anthropics/claude-code#62016
|
|
118
|
+
EOF
|
|
119
|
+
|
|
120
|
+
# Strict mode blocks; default mode advises.
|
|
121
|
+
if [ "${CC_RG_REPLACE_DETECTOR_MODE:-advisory}" = "strict" ]; then
|
|
122
|
+
exit 2
|
|
123
|
+
fi
|
|
124
|
+
|
|
125
|
+
exit 0
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# rhetorical-verification-prompt-detector.sh — UserPromptSubmit hook
|
|
3
|
+
# Trigger: UserPromptSubmit
|
|
4
|
+
# Matcher: ""
|
|
5
|
+
#
|
|
6
|
+
# Solves: Issue #60107 — "the agent treated my question as rhetorical and
|
|
7
|
+
# confirmed". User asked a verification question; agent emitted an
|
|
8
|
+
# unconditional confirmation without running any verification step.
|
|
9
|
+
# User trusted the confirmation, deployed to production, and the
|
|
10
|
+
# deployed system crashed in full.
|
|
11
|
+
#
|
|
12
|
+
# Class of failure: claim-vs-reality divergence at the verification layer.
|
|
13
|
+
# The user's explicit verification intent ("is this really working?",
|
|
14
|
+
# "did this actually deploy?", "are you sure this is safe?") gets
|
|
15
|
+
# flattened by the model into a rhetorical-question reading, which
|
|
16
|
+
# the model then answers with social affirmation rather than with
|
|
17
|
+
# a tool-driven verification step.
|
|
18
|
+
#
|
|
19
|
+
# HOW IT WORKS:
|
|
20
|
+
# When the user submits a prompt containing verification-intent markers,
|
|
21
|
+
# the hook emits an additionalContext payload (via hookSpecificOutput)
|
|
22
|
+
# that explicitly tells the agent: this is a verification request, not
|
|
23
|
+
# a rhetorical one — do not respond with a bare affirmation; either run
|
|
24
|
+
# verification tool calls (Bash, Read, Grep) or state explicitly that
|
|
25
|
+
# verification was not performed.
|
|
26
|
+
#
|
|
27
|
+
# WHY THIS MATTERS:
|
|
28
|
+
# The 60107 failure shape is one of the cleanest examples of the broader
|
|
29
|
+
# pattern where the response surface asserts a claim that the runtime
|
|
30
|
+
# never verified. Most prevention efforts focus on the agent's *output*
|
|
31
|
+
# (caveat checkers, claim-vs-caveat validators). This hook addresses the
|
|
32
|
+
# *input* side: by labeling the user's prompt explicitly as a verification
|
|
33
|
+
# request before the agent processes it, the rhetorical-reading failure
|
|
34
|
+
# mode is harder to enter in the first place.
|
|
35
|
+
#
|
|
36
|
+
# TRIGGER: UserPromptSubmit
|
|
37
|
+
# MATCHER: ""
|
|
38
|
+
#
|
|
39
|
+
# CONFIGURATION:
|
|
40
|
+
# CC_RHETORICAL_VERIFY_DISABLE=1 disable the hook entirely
|
|
41
|
+
# CC_RHETORICAL_VERIFY_LOG=path append detection events (default off)
|
|
42
|
+
#
|
|
43
|
+
# SAFETY:
|
|
44
|
+
# - Read-only on the prompt; never modifies the user's input.
|
|
45
|
+
# - Emits advisory context via hookSpecificOutput; does not block the prompt.
|
|
46
|
+
# - The user's exact prompt still reaches the agent unchanged.
|
|
47
|
+
# - Exit 0 always; never blocks the session.
|
|
48
|
+
#
|
|
49
|
+
# REFERENCES:
|
|
50
|
+
# - anthropics/claude-code#60107 (2026-05-18, the canonical case)
|
|
51
|
+
# - https://gist.github.com/yurukusa/a5b2a32ca57e75eb1e96adcf67bcf2c3 (the
|
|
52
|
+
# nine-axis verification compilation, Axis 8 for self-acknowledged
|
|
53
|
+
# structural divergence)
|
|
54
|
+
set -euo pipefail
|
|
55
|
+
|
|
56
|
+
[ "${CC_RHETORICAL_VERIFY_DISABLE:-}" = "1" ] && exit 0
|
|
57
|
+
|
|
58
|
+
INPUT=$(cat)
|
|
59
|
+
PROMPT=$(echo "$INPUT" | jq -r '.prompt // empty' 2>/dev/null || true)
|
|
60
|
+
[ -z "$PROMPT" ] && exit 0
|
|
61
|
+
|
|
62
|
+
# Detection patterns — verification-intent markers.
|
|
63
|
+
# English and Japanese forms are both checked.
|
|
64
|
+
# These are conservative: only match phrases that strongly imply
|
|
65
|
+
# the user is asking for a *check*, not a *task*.
|
|
66
|
+
EN_PATTERNS='are you sure|are you certain|did (this|that|it) actually|did (this|that|it) really|did you (actually|really|verify|check|confirm)|can you (confirm|verify|double-?check|make sure)|is (this|that|it) (really|actually|definitely|truly) (working|correct|safe|done|deployed|complete|finished)|is (this|that|it) safe to|please (confirm|verify|double-?check|make sure)|just to (confirm|verify|be sure|double-?check)|double[ -]check|sanity check|are we (sure|certain|good)'
|
|
67
|
+
|
|
68
|
+
JA_PATTERNS='本当に|確かに|大丈夫(です)?(か|\?)|本当か|確認した|確認して(くれ|ください)|もう一度確認|再確認|間違いない(か|ですか|\?)?|本当だ?ね|チェックして|本当に(動いて|できて|終わって|成功して)|間違いなく'
|
|
69
|
+
|
|
70
|
+
MATCHED_MARKER=""
|
|
71
|
+
|
|
72
|
+
if echo "$PROMPT" | grep -qiE "$EN_PATTERNS"; then
|
|
73
|
+
MATCHED_MARKER=$(echo "$PROMPT" | grep -oiE "$EN_PATTERNS" | head -1)
|
|
74
|
+
elif echo "$PROMPT" | grep -qE "$JA_PATTERNS"; then
|
|
75
|
+
MATCHED_MARKER=$(echo "$PROMPT" | grep -oE "$JA_PATTERNS" | head -1)
|
|
76
|
+
fi
|
|
77
|
+
|
|
78
|
+
[ -z "$MATCHED_MARKER" ] && exit 0
|
|
79
|
+
|
|
80
|
+
# Optional logging
|
|
81
|
+
if [ -n "${CC_RHETORICAL_VERIFY_LOG:-}" ]; then
|
|
82
|
+
{
|
|
83
|
+
printf '[%s] rhetorical-verify-detected: marker=%q prompt_head=%q\n' \
|
|
84
|
+
"$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$MATCHED_MARKER" "${PROMPT:0:200}"
|
|
85
|
+
} >> "$CC_RHETORICAL_VERIFY_LOG" 2>/dev/null || true
|
|
86
|
+
fi
|
|
87
|
+
|
|
88
|
+
# Emit additionalContext via hookSpecificOutput.
|
|
89
|
+
# Claude Code reads this as a system note to the agent.
|
|
90
|
+
ADDITIONAL_CONTEXT="Verification-intent detected in this user prompt (marker: \"${MATCHED_MARKER}\"). Treat this prompt as a verification request, NOT as a rhetorical question. Do not respond with a bare affirmation, social-confirmation phrase, or unverified \"yes\" / \"that's correct\" / \"all good\" / \"安心してください\". Instead: (1) run concrete verification tool calls (Bash, Read, Grep, file tests, status checks) appropriate to what is being verified; or (2) if verification is impossible in this context, state EXPLICITLY that verification was not performed and identify which check is missing. This guard exists because anthropics/claude-code#60107 documents a case where a verification question was read as rhetorical, an unverified confirmation was emitted, and the user's production system crashed in full as a direct consequence."
|
|
91
|
+
|
|
92
|
+
# Produce JSON output for hookSpecificOutput
|
|
93
|
+
jq -n \
|
|
94
|
+
--arg ctx "$ADDITIONAL_CONTEXT" \
|
|
95
|
+
'{
|
|
96
|
+
hookSpecificOutput: {
|
|
97
|
+
hookEventName: "UserPromptSubmit",
|
|
98
|
+
additionalContext: $ctx
|
|
99
|
+
}
|
|
100
|
+
}'
|
|
101
|
+
|
|
102
|
+
exit 0
|
|
File without changes
|
|
@@ -9,13 +9,18 @@
|
|
|
9
9
|
# This hook blocks: ALL rm commands on important paths, even non-recursive
|
|
10
10
|
#
|
|
11
11
|
# What it blocks:
|
|
12
|
-
# rm (any flags) on: /, ~, .., /home, /etc, /usr, /var, .git, .env
|
|
12
|
+
# rm (any flags) on: /, ~, .., /home, /Users, /etc, /usr, /var, .git, .env
|
|
13
|
+
# wildcard/glob rm reaching into a user/home/absolute path, e.g.
|
|
14
|
+
# rm -f ~/Downloads/*copy*.md (unpredictable match set — see #64559)
|
|
13
15
|
# find -delete (any path)
|
|
16
|
+
# find ... | xargs rm without the null-delimited pair -print0 / xargs -0 (#69793 —
|
|
17
|
+
# a path with spaces splits into multiple targets and rm -rf wipes an unrelated dir)
|
|
14
18
|
# shred (any file)
|
|
15
19
|
# unlink on critical paths
|
|
16
20
|
#
|
|
17
21
|
# What it allows:
|
|
18
22
|
# rm on safe targets: node_modules, dist, build, __pycache__, .cache, /tmp
|
|
23
|
+
# bare relative globs in the working dir: rm *.pyc, rm dist/*.js
|
|
19
24
|
#
|
|
20
25
|
# Usage: Add to settings.json as a PreToolUse hook
|
|
21
26
|
#
|
|
@@ -33,18 +38,97 @@
|
|
|
33
38
|
#
|
|
34
39
|
# TRIGGER: PreToolUse MATCHER: "Bash"
|
|
35
40
|
|
|
41
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
42
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
43
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
44
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
45
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
46
|
+
_nojq_warned="/tmp/cc-nojq-warned-rm-safety-net-$PPID"
|
|
47
|
+
[ -f "$_nojq_warned" ] || {
|
|
48
|
+
echo "WARNING [rm-safety-net]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
49
|
+
: > "$_nojq_warned"
|
|
50
|
+
}
|
|
51
|
+
fi
|
|
52
|
+
|
|
36
53
|
INPUT=$(cat)
|
|
37
54
|
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null)
|
|
38
55
|
|
|
56
|
+
# --- Look inside wrappers -----------------------------------------------------
|
|
57
|
+
# The rm analysis below opens only when the command *starts* with rm, and every
|
|
58
|
+
# other boundary in this file is a separator. A command inside a substitution,
|
|
59
|
+
# a subshell, or after a shell keyword is at neither, so it was never examined.
|
|
60
|
+
# Measured 2026-08-04: this hook blocked the bare deletion and passed all six
|
|
61
|
+
# wrappings of it. Claude Code 2.1.221 fixed the same shape in its own
|
|
62
|
+
# permission check ("hidden commands in [[ ]] regex conditionals").
|
|
63
|
+
#
|
|
64
|
+
# Replace the wrapping tokens with separators and run this same script once more
|
|
65
|
+
# against that text. Detection only: the rewritten text is never executed, and
|
|
66
|
+
# the message below keeps the command the user actually sent.
|
|
67
|
+
if [ -n "${CC_RMNET_UNWRAPPED:-}" ]; then
|
|
68
|
+
COMMAND="$CC_RMNET_UNWRAPPED"
|
|
69
|
+
elif [ -n "$COMMAND" ]; then
|
|
70
|
+
_rmnet_unwrapped=$(printf '%s' "$COMMAND" | sed -E \
|
|
71
|
+
-e 's/\$\(/ ; /g' -e 's/`/ ; /g' \
|
|
72
|
+
-e 's/(^|[[:space:]])\(/\1 ; /g' -e 's/\)([[:space:]]|$)/ ; \1/g' \
|
|
73
|
+
-e 's/(^|[[:space:]])(then|do|else|elif)([[:space:]])/\1 ; \3/g')
|
|
74
|
+
if [ "$_rmnet_unwrapped" != "$COMMAND" ]; then
|
|
75
|
+
CC_RMNET_UNWRAPPED="$_rmnet_unwrapped" bash "$0" </dev/null >/dev/null 2>&1
|
|
76
|
+
if [ "$?" = "2" ]; then
|
|
77
|
+
echo "BLOCKED: an rm on a critical path is hidden inside a wrapper." >&2
|
|
78
|
+
echo "Command: $COMMAND" >&2
|
|
79
|
+
echo "A substitution, a subshell or a shell keyword does not make it safe." >&2
|
|
80
|
+
exit 2
|
|
81
|
+
fi
|
|
82
|
+
fi
|
|
83
|
+
fi
|
|
84
|
+
|
|
39
85
|
[ -z "$COMMAND" ] && exit 0
|
|
40
86
|
|
|
87
|
+
# The extractions in this hook used grep -oP, which is GNU-only. BSD grep
|
|
88
|
+
# (macOS) rejects -P, so the targets came back empty and every critical-path
|
|
89
|
+
# check silently found nothing to inspect. The GNU path is left exactly as it
|
|
90
|
+
# was; an equivalent runs where -P is absent. Defined at file scope because the
|
|
91
|
+
# find/xargs sections below use it too.
|
|
92
|
+
if echo x | grep -qP x 2>/dev/null; then HAS_PCRE=1; else HAS_PCRE=0; fi
|
|
93
|
+
|
|
94
|
+
# $1 = command word, $2 = operand pattern. \K has no POSIX equivalent, so the
|
|
95
|
+
# fallback matches from the command word and strips that prefix afterwards.
|
|
96
|
+
extract_operand() {
|
|
97
|
+
if [ "$HAS_PCRE" = 1 ]; then
|
|
98
|
+
grep -oP "$1\\s+\\K$2" 2>/dev/null || true
|
|
99
|
+
else
|
|
100
|
+
grep -oE "$1[[:space:]]+$2" 2>/dev/null | sed -E "s/^$1[[:space:]]+//" || true
|
|
101
|
+
fi
|
|
102
|
+
}
|
|
103
|
+
|
|
41
104
|
# --- rm command analysis ---
|
|
42
|
-
|
|
105
|
+
# The gate used to be '^\s*(sudo\s+)?rm\s': the analysis opened only when the
|
|
106
|
+
# whole command began with rm, so `cd /tmp && rm -rf ~` never entered it.
|
|
107
|
+
# A separator in front is just as much a command start as the line start is.
|
|
108
|
+
if echo "$COMMAND" | grep -qE '(^|[;&|])[[:space:]]*(sudo[[:space:]]+)?rm[[:space:]]'; then
|
|
43
109
|
# Safe targets that can be deleted freely
|
|
44
110
|
SAFE_TARGETS="node_modules|dist|build|__pycache__|\.cache|\.pytest_cache|coverage|\.nyc_output|\.next|\.nuxt|tmp|temp"
|
|
111
|
+
CRITICAL="^/\$|^/home|^/Users|^/etc|^/usr|^/var|^/opt|^/root|^~|^\.\.|^\.git$|(^|/)\.env"
|
|
45
112
|
|
|
46
113
|
# Extract the target (last argument after flags)
|
|
47
|
-
|
|
114
|
+
if [ "$HAS_PCRE" = 1 ]; then
|
|
115
|
+
TARGET=$(echo "$COMMAND" | grep -oP 'rm\s+[^;|&]*' | awk '{print $NF}')
|
|
116
|
+
else
|
|
117
|
+
TARGET=$(echo "$COMMAND" | grep -oE 'rm[[:space:]]+[^;|&]*' | awk '{print $NF}')
|
|
118
|
+
fi
|
|
119
|
+
|
|
120
|
+
# Judge the target with its quotes removed. This hook blocks anything that
|
|
121
|
+
# is not on the safe list, so a quoted target used to be blocked whatever it
|
|
122
|
+
# was: `rm -rf "node_modules"` and `rm -rf "/"` failed the same test for the
|
|
123
|
+
# same reason -- the quote, not the path. Dropping the quote characters lets
|
|
124
|
+
# the safe list recognise the first and the critical list catch the second.
|
|
125
|
+
# Measured 2026-08-11: four ordinary quoted cleanups were blocked here.
|
|
126
|
+
# Messages keep $TARGET so the user sees what they actually typed.
|
|
127
|
+
#
|
|
128
|
+
# A name containing spaces (`rm -rf "my build dir"`) is still blocked. That
|
|
129
|
+
# is word splitting, not quoting, and fixing it means rewriting how operands
|
|
130
|
+
# are cut apart. Out of scope here; the tests record it as a known limit.
|
|
131
|
+
TARGET_UNQ=$(printf '%s' "$TARGET" | tr -d "\"'")
|
|
48
132
|
|
|
49
133
|
# Block path traversal early
|
|
50
134
|
if echo "$TARGET" | grep -qF '..'; then
|
|
@@ -52,6 +136,22 @@ if echo "$COMMAND" | grep -qE '^\s*(sudo\s+)?rm\s'; then
|
|
|
52
136
|
exit 2
|
|
53
137
|
fi
|
|
54
138
|
|
|
139
|
+
# Inspect EVERY non-flag argument for critical paths, not just the last one.
|
|
140
|
+
# The single-TARGET checks below use `awk '{print $NF}'` (last arg only), so
|
|
141
|
+
# "rm -rf /home/user/data node_modules" would early-exit on the safe LAST arg
|
|
142
|
+
# (node_modules) and never inspect the critical FIRST arg — a real bypass.
|
|
143
|
+
# set -f disables glob expansion of the split words (so "rm *.pyc" stays literal).
|
|
144
|
+
set -f
|
|
145
|
+
for arg in $(echo "$COMMAND" | extract_operand 'rm' '[^;|&]*'); do
|
|
146
|
+
case "$arg" in -*) continue ;; esac # skip flags
|
|
147
|
+
if printf '%s' "$arg" | tr -d "\"'" | grep -qE "$CRITICAL"; then
|
|
148
|
+
set +f
|
|
149
|
+
echo "BLOCKED: rm targeting critical path: $arg" >&2
|
|
150
|
+
exit 2
|
|
151
|
+
fi
|
|
152
|
+
done
|
|
153
|
+
set +f
|
|
154
|
+
|
|
55
155
|
# Allow safe targets
|
|
56
156
|
if echo "$TARGET" | grep -qE "^(\./)?(${SAFE_TARGETS})(/|$)"; then
|
|
57
157
|
exit 0
|
|
@@ -62,9 +162,29 @@ if echo "$COMMAND" | grep -qE '^\s*(sudo\s+)?rm\s'; then
|
|
|
62
162
|
exit 0
|
|
63
163
|
fi
|
|
64
164
|
|
|
65
|
-
# Block rm on
|
|
66
|
-
|
|
67
|
-
|
|
165
|
+
# Block wildcard/glob rm on absolute or home paths (#64559).
|
|
166
|
+
# A glob's match set can't be enumerated in advance, so a delete intended only
|
|
167
|
+
# for the model's own temp files (e.g. rm -f ~/Downloads/*copy*.md) can silently
|
|
168
|
+
# collateral-delete pre-existing user files whose names merely share the substring.
|
|
169
|
+
# Auto mode runs this with no confirmation. Bare relative globs (e.g. rm *.pyc in a
|
|
170
|
+
# project dir) are left alone; only globs reaching into a user/home/absolute path
|
|
171
|
+
# outside the safe-target list are gated, where the blast radius is unpredictable.
|
|
172
|
+
if echo "$TARGET" | grep -qE '[*?[]'; then
|
|
173
|
+
if echo "$TARGET" | grep -qE "^(/|~)"; then
|
|
174
|
+
echo "BLOCKED: wildcard rm on a user/absolute path — unpredictable match set: $TARGET" >&2
|
|
175
|
+
echo "A glob can delete pre-existing files you never named. List the matches first:" >&2
|
|
176
|
+
echo " ls -d $TARGET # confirm exactly what matches, then rm those names explicitly" >&2
|
|
177
|
+
exit 2
|
|
178
|
+
fi
|
|
179
|
+
fi
|
|
180
|
+
|
|
181
|
+
# Block rm on critical paths (/Users = macOS home, parity with /home on Linux)
|
|
182
|
+
# .env is matched at the start OR after any path segment, so a nested path
|
|
183
|
+
# like backend/.env or src/.env is caught too (#65034 — Claude deleted a
|
|
184
|
+
# .env living in a subdirectory, which the start-anchored pattern missed).
|
|
185
|
+
# CRITICAL is defined once near the top of this block (also used by the
|
|
186
|
+
# multi-argument loop above). This single-TARGET check stays as a backstop.
|
|
187
|
+
if echo "$TARGET_UNQ" | grep -qE "$CRITICAL"; then
|
|
68
188
|
echo "BLOCKED: rm targeting critical path: $TARGET" >&2
|
|
69
189
|
exit 2
|
|
70
190
|
fi
|
|
@@ -72,7 +192,7 @@ if echo "$COMMAND" | grep -qE '^\s*(sudo\s+)?rm\s'; then
|
|
|
72
192
|
# Block rm -rf on any non-safe path (extra safety)
|
|
73
193
|
if echo "$COMMAND" | grep -qE 'rm\s+.*-[rRf]*[rR][rRf]*'; then
|
|
74
194
|
# rm -rf on non-safe, non-tmp target — block unless it's a known safe directory
|
|
75
|
-
if ! echo "$
|
|
195
|
+
if ! echo "$TARGET_UNQ" | grep -qE "^(\./)?(${SAFE_TARGETS})(/|$)|^/tmp/"; then
|
|
76
196
|
echo "BLOCKED: rm -rf on non-safe target: $TARGET" >&2
|
|
77
197
|
exit 2
|
|
78
198
|
fi
|
|
@@ -82,7 +202,7 @@ fi
|
|
|
82
202
|
# --- find -delete ---
|
|
83
203
|
if echo "$COMMAND" | grep -qE 'find\s.*-delete'; then
|
|
84
204
|
# Allow find in safe directories only
|
|
85
|
-
FIND_PATH=$(echo "$COMMAND" |
|
|
205
|
+
FIND_PATH=$(echo "$COMMAND" | extract_operand 'find' '[^[:space:]]+')
|
|
86
206
|
if echo "$FIND_PATH" | grep -qE '^\.|^node_modules|^dist|^build|^/tmp'; then
|
|
87
207
|
exit 0
|
|
88
208
|
fi
|
|
@@ -90,6 +210,29 @@ if echo "$COMMAND" | grep -qE 'find\s.*-delete'; then
|
|
|
90
210
|
exit 2
|
|
91
211
|
fi
|
|
92
212
|
|
|
213
|
+
# --- find | xargs rm without a null delimiter (#69793) ---
|
|
214
|
+
# find prints newline-separated paths; xargs WITHOUT -0 splits on ANY whitespace.
|
|
215
|
+
# So a single path containing spaces, e.g. "./Google Photos/a.jpg", is split into
|
|
216
|
+
# two arguments: "./Google" and "Photos/a.jpg". With rm -rf, the first token can
|
|
217
|
+
# match an UNRELATED real directory ("./Google") and wipe it whole — the reporter
|
|
218
|
+
# in #69793 lost ~28,800 files this way. The rm checks above can't catch this:
|
|
219
|
+
# the delete targets are produced by find at runtime, so there is no literal path
|
|
220
|
+
# in the command string to inspect. The only safe form is the null-delimited pair
|
|
221
|
+
# find -print0 | xargs -0 (or avoid xargs: find -delete / -exec rm {} +).
|
|
222
|
+
if echo "$COMMAND" | grep -qE 'xargs\b[^|]*\b(rm|rmdir|unlink|shred|trash|trash-put)\b'; then
|
|
223
|
+
# Require BOTH halves of the null-delimited pair: find's -print0 and xargs's -0.
|
|
224
|
+
if ! echo "$COMMAND" | grep -qE '\-print0' \
|
|
225
|
+
|| ! echo "$COMMAND" | grep -qE 'xargs\s+[^|]*(-0|--null)'; then
|
|
226
|
+
echo "BLOCKED: 'xargs rm' without a null delimiter — paths with spaces split into multiple targets (#69793)." >&2
|
|
227
|
+
echo " A path like './Google Photos/a.jpg' splits into './Google' and 'Photos/a.jpg';" >&2
|
|
228
|
+
echo " rm -rf may then wipe an unrelated real directory. Use one of:" >&2
|
|
229
|
+
echo " find ... -delete" >&2
|
|
230
|
+
echo " find ... -exec rm -rf {} +" >&2
|
|
231
|
+
echo " find ... -print0 | xargs -0 rm -rf" >&2
|
|
232
|
+
exit 2
|
|
233
|
+
fi
|
|
234
|
+
fi
|
|
235
|
+
|
|
93
236
|
# --- shred ---
|
|
94
237
|
if echo "$COMMAND" | grep -qE '^\s*(sudo\s+)?shred\s'; then
|
|
95
238
|
echo "BLOCKED: shred command (secure file deletion)" >&2
|
|
@@ -18,6 +18,18 @@
|
|
|
18
18
|
|
|
19
19
|
set -euo pipefail
|
|
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-role-tool-guard-$PPID"
|
|
27
|
+
[ -f "$_nojq_warned" ] || {
|
|
28
|
+
echo "WARNING [role-tool-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
|
TOOL=$(echo "$INPUT" | jq -r '.tool_name // empty' 2>/dev/null)
|
|
23
35
|
[ -z "$TOOL" ] && exit 0
|