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,195 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ================================================================
|
|
3
|
+
# cache-residue-detector.sh — Detect leftover server-side injection
|
|
4
|
+
# caches that persist after opt-out env vars are set
|
|
5
|
+
# ================================================================
|
|
6
|
+
# PURPOSE:
|
|
7
|
+
# Cluster 8 (server-side prompt injection, v2.1.150+).
|
|
8
|
+
#
|
|
9
|
+
# Setting CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 and
|
|
10
|
+
# DISABLE_GROWTHBOOK=1 closes the channel for FUTURE sync, but
|
|
11
|
+
# does NOT delete cache files written before the opt-out. The
|
|
12
|
+
# runtime still reads cached values on startup unless the cache
|
|
13
|
+
# keys are physically removed. This produces a silent gap: the
|
|
14
|
+
# operator believes injection is disabled, but the most recent
|
|
15
|
+
# cached value continues to register as a peer system prompt
|
|
16
|
+
# section until cache eviction or next sync.
|
|
17
|
+
#
|
|
18
|
+
# This hook detects the gap: if opt-out env vars are set AND
|
|
19
|
+
# cache residue exists, it prints a one-screen advisory with
|
|
20
|
+
# exact cleanup commands (jq-based, idempotent).
|
|
21
|
+
#
|
|
22
|
+
# DETECTION:
|
|
23
|
+
# At SessionStart, check:
|
|
24
|
+
# 1. Both opt-out env vars are set to 1.
|
|
25
|
+
# 2. ~/.claude.json contains cachedGrowthBookFeatures,
|
|
26
|
+
# cachedExperimentFeatures, or cachedStatsigGates keys.
|
|
27
|
+
# 3. macOS-only: ~/Library/Application Support/Claude/
|
|
28
|
+
# cachedGrowthBookFeatures file exists.
|
|
29
|
+
# When residue is found in step 2 or 3, print advisory naming
|
|
30
|
+
# the specific files/keys and the cleanup commands.
|
|
31
|
+
#
|
|
32
|
+
# TRIGGER: SessionStart
|
|
33
|
+
# MATCHER: (none)
|
|
34
|
+
#
|
|
35
|
+
# OUTPUT:
|
|
36
|
+
# Advisory only, never blocks. Prints to stderr.
|
|
37
|
+
#
|
|
38
|
+
# CONFIGURATION:
|
|
39
|
+
# CC_CACHE_RESIDUE_DETECTOR_DISABLE=1 — disable entirely
|
|
40
|
+
# CC_CACHE_RESIDUE_DETECTOR_QUIET=1 — silence after acknowledgment
|
|
41
|
+
# CC_CACHE_RESIDUE_DETECTOR_STRICT=1 — also warn even when
|
|
42
|
+
# opt-out env vars are NOT
|
|
43
|
+
# set (operators who plan
|
|
44
|
+
# to opt out and want a
|
|
45
|
+
# forward-looking signal)
|
|
46
|
+
# CC_CACHE_RESIDUE_CLAUDE_JSON — override default location
|
|
47
|
+
# for ~/.claude.json
|
|
48
|
+
#
|
|
49
|
+
# RELATED ISSUES:
|
|
50
|
+
# https://github.com/anthropics/claude-code/issues/62061 — central
|
|
51
|
+
# report of v2.1.150 server-side injection (46+ reactions).
|
|
52
|
+
# https://github.com/anthropics/claude-code/issues/25141 — earlier
|
|
53
|
+
# transparency request for experimental features.
|
|
54
|
+
# https://github.com/anthropics/claude-code/issues/28941 — earlier
|
|
55
|
+
# report of unauthorized server-side feature flag push.
|
|
56
|
+
#
|
|
57
|
+
# RELATED HOOKS:
|
|
58
|
+
# server-side-prompt-injection-detector.sh — warns when opt-out
|
|
59
|
+
# env vars are MISSING. Pair with this hook for full coverage:
|
|
60
|
+
# the other hook tells operators to opt out; this one tells
|
|
61
|
+
# them the cache cleanup that the env vars alone do not perform.
|
|
62
|
+
#
|
|
63
|
+
# DESIGN NOTES:
|
|
64
|
+
# - The hook does NOT touch the cache files. Cleanup is the
|
|
65
|
+
# operator's call; the hook only surfaces the state.
|
|
66
|
+
# - jq is required for reliable JSON inspection. When jq is
|
|
67
|
+
# missing, the hook prints a one-line advisory pointing at the
|
|
68
|
+
# installer and exits clean (fail-open).
|
|
69
|
+
# - The macOS path is reported as informational on non-macOS
|
|
70
|
+
# systems but never causes a failure.
|
|
71
|
+
|
|
72
|
+
set -u
|
|
73
|
+
|
|
74
|
+
if [ "${CC_CACHE_RESIDUE_DETECTOR_DISABLE:-0}" = "1" ]; then
|
|
75
|
+
exit 0
|
|
76
|
+
fi
|
|
77
|
+
if [ "${CC_CACHE_RESIDUE_DETECTOR_QUIET:-0}" = "1" ]; then
|
|
78
|
+
exit 0
|
|
79
|
+
fi
|
|
80
|
+
|
|
81
|
+
# Consume stdin if provided (SessionStart hooks receive JSON input)
|
|
82
|
+
if [ ! -t 0 ]; then
|
|
83
|
+
cat >/dev/null 2>&1 || true
|
|
84
|
+
fi
|
|
85
|
+
|
|
86
|
+
OPT_OUT_NON_ESSENTIAL="${CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC:-0}"
|
|
87
|
+
OPT_OUT_GROWTHBOOK="${DISABLE_GROWTHBOOK:-0}"
|
|
88
|
+
|
|
89
|
+
STRICT="${CC_CACHE_RESIDUE_DETECTOR_STRICT:-0}"
|
|
90
|
+
|
|
91
|
+
# When strict mode is off, only warn if the operator has already opted out.
|
|
92
|
+
# This matches the hook's primary purpose: catching the silent gap between
|
|
93
|
+
# opt-out and cache cleanup. Strict mode flips it to forward-looking advisory.
|
|
94
|
+
if [ "$STRICT" != "1" ]; then
|
|
95
|
+
if [ "$OPT_OUT_NON_ESSENTIAL" != "1" ] && [ "$OPT_OUT_GROWTHBOOK" != "1" ]; then
|
|
96
|
+
exit 0
|
|
97
|
+
fi
|
|
98
|
+
fi
|
|
99
|
+
|
|
100
|
+
CLAUDE_JSON="${CC_CACHE_RESIDUE_CLAUDE_JSON:-$HOME/.claude.json}"
|
|
101
|
+
|
|
102
|
+
RESIDUE_KEYS=()
|
|
103
|
+
RESIDUE_FILES=()
|
|
104
|
+
NEEDS_JQ_ADVISORY=0
|
|
105
|
+
|
|
106
|
+
if [ -f "$CLAUDE_JSON" ] && [ -r "$CLAUDE_JSON" ]; then
|
|
107
|
+
if command -v jq >/dev/null 2>&1; then
|
|
108
|
+
# Inspect known cache keys. Any one of these being present and non-empty
|
|
109
|
+
# is residue worth surfacing.
|
|
110
|
+
for key in cachedGrowthBookFeatures cachedExperimentFeatures cachedStatsigGates; do
|
|
111
|
+
count=$(jq --arg k "$key" '
|
|
112
|
+
if has($k) then
|
|
113
|
+
(.[$k] | if type=="object" then (keys|length)
|
|
114
|
+
elif type=="array" then length
|
|
115
|
+
else 0 end)
|
|
116
|
+
else 0 end
|
|
117
|
+
' "$CLAUDE_JSON" 2>/dev/null || echo 0)
|
|
118
|
+
if [ -n "$count" ] && [ "$count" -gt 0 ] 2>/dev/null; then
|
|
119
|
+
RESIDUE_KEYS+=("$key ($count entries)")
|
|
120
|
+
fi
|
|
121
|
+
done
|
|
122
|
+
else
|
|
123
|
+
# Fall back to a coarse grep when jq is missing. This avoids false
|
|
124
|
+
# positives in the cleanup advisory by labeling the result as coarse.
|
|
125
|
+
if grep -q '"cachedGrowthBookFeatures"' "$CLAUDE_JSON" 2>/dev/null; then
|
|
126
|
+
RESIDUE_KEYS+=("cachedGrowthBookFeatures (count unknown — jq missing)")
|
|
127
|
+
fi
|
|
128
|
+
if grep -q '"cachedExperimentFeatures"' "$CLAUDE_JSON" 2>/dev/null; then
|
|
129
|
+
RESIDUE_KEYS+=("cachedExperimentFeatures (count unknown — jq missing)")
|
|
130
|
+
fi
|
|
131
|
+
if grep -q '"cachedStatsigGates"' "$CLAUDE_JSON" 2>/dev/null; then
|
|
132
|
+
RESIDUE_KEYS+=("cachedStatsigGates (count unknown — jq missing)")
|
|
133
|
+
fi
|
|
134
|
+
if [ "${#RESIDUE_KEYS[@]}" -gt 0 ]; then
|
|
135
|
+
NEEDS_JQ_ADVISORY=1
|
|
136
|
+
fi
|
|
137
|
+
fi
|
|
138
|
+
fi
|
|
139
|
+
|
|
140
|
+
# macOS Desktop cache — informational on Linux/CLI installs.
|
|
141
|
+
MAC_CACHE="$HOME/Library/Application Support/Claude/cachedGrowthBookFeatures"
|
|
142
|
+
if [ -f "$MAC_CACHE" ]; then
|
|
143
|
+
RESIDUE_FILES+=("$MAC_CACHE")
|
|
144
|
+
fi
|
|
145
|
+
|
|
146
|
+
if [ "${#RESIDUE_KEYS[@]}" -eq 0 ] && [ "${#RESIDUE_FILES[@]}" -eq 0 ]; then
|
|
147
|
+
exit 0
|
|
148
|
+
fi
|
|
149
|
+
|
|
150
|
+
# Compose advisory. Keep it under one screen so operators can read it
|
|
151
|
+
# without scrolling. The cleanup commands are idempotent and reversible
|
|
152
|
+
# (the runtime repopulates the keys on next sync if opt-out env vars are
|
|
153
|
+
# unset).
|
|
154
|
+
{
|
|
155
|
+
echo "ADVISORY: server-side injection cache residue detected (Cluster 8)."
|
|
156
|
+
if [ "$STRICT" = "1" ]; then
|
|
157
|
+
if [ "$OPT_OUT_NON_ESSENTIAL" != "1" ] || [ "$OPT_OUT_GROWTHBOOK" != "1" ]; then
|
|
158
|
+
echo " Strict mode is on; opt-out env vars are not fully set. Residue"
|
|
159
|
+
echo " will continue to be written on the ~60s refresh cadence."
|
|
160
|
+
fi
|
|
161
|
+
fi
|
|
162
|
+
if [ "${#RESIDUE_KEYS[@]}" -gt 0 ]; then
|
|
163
|
+
echo " ${CLAUDE_JSON}:"
|
|
164
|
+
for k in "${RESIDUE_KEYS[@]}"; do
|
|
165
|
+
echo " - $k"
|
|
166
|
+
done
|
|
167
|
+
fi
|
|
168
|
+
if [ "${#RESIDUE_FILES[@]}" -gt 0 ]; then
|
|
169
|
+
echo " Cache files present:"
|
|
170
|
+
for f in "${RESIDUE_FILES[@]}"; do
|
|
171
|
+
echo " - $f"
|
|
172
|
+
done
|
|
173
|
+
fi
|
|
174
|
+
if [ "$NEEDS_JQ_ADVISORY" = "1" ]; then
|
|
175
|
+
echo " jq was not found on PATH. Install jq for the exact entry counts and"
|
|
176
|
+
echo " for the idempotent cleanup command below."
|
|
177
|
+
fi
|
|
178
|
+
echo " Cleanup (idempotent; safe to run repeatedly):"
|
|
179
|
+
if command -v jq >/dev/null 2>&1; then
|
|
180
|
+
echo " jq 'del(.cachedGrowthBookFeatures, .cachedExperimentFeatures, .cachedStatsigGates)' \\"
|
|
181
|
+
echo " \"$CLAUDE_JSON\" > \"$CLAUDE_JSON.tmp\" && mv \"$CLAUDE_JSON.tmp\" \"$CLAUDE_JSON\""
|
|
182
|
+
fi
|
|
183
|
+
if [ "${#RESIDUE_FILES[@]}" -gt 0 ]; then
|
|
184
|
+
for f in "${RESIDUE_FILES[@]}"; do
|
|
185
|
+
echo " rm -- \"$f\""
|
|
186
|
+
done
|
|
187
|
+
fi
|
|
188
|
+
echo " Background: Setting CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 and"
|
|
189
|
+
echo " DISABLE_GROWTHBOOK=1 closes the channel for future sync but does not"
|
|
190
|
+
echo " delete already-cached values. The runtime continues to read them on"
|
|
191
|
+
echo " startup. Reference: https://github.com/anthropics/claude-code/issues/62061"
|
|
192
|
+
echo " Silence after acknowledgment: export CC_CACHE_RESIDUE_DETECTOR_QUIET=1"
|
|
193
|
+
} >&2
|
|
194
|
+
|
|
195
|
+
exit 0
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# cache-tier-logger.sh — cache TTL regression detector (Incident 1)
|
|
3
|
+
# Why: March 2026 regression silently downgraded the prompt-cache TTL from 1h to
|
|
4
|
+
# 5m (ephemeral_5m), causing cache re-creation every turn. Users saw quota
|
|
5
|
+
# burn at 4-5x without any client-side change. Issue #46829 (119,866-call
|
|
6
|
+
# dataset), #46917 (cache_creation inflation).
|
|
7
|
+
# Event: PostToolUse MATCHER: "*"
|
|
8
|
+
# Action: Per tool call, inspect the PostToolUse payload for cache usage fields
|
|
9
|
+
# and append a TSV line to ~/.claude/logs/cache-tier.log.
|
|
10
|
+
#
|
|
11
|
+
# Review weekly with:
|
|
12
|
+
# awk -F'\t' '{print $4}' ~/.claude/logs/cache-tier.log | sort | uniq -c
|
|
13
|
+
# Main-conversation turns should skew toward large cache_read_input_tokens
|
|
14
|
+
# relative to cache_creation_input_tokens. A session where cache_creation
|
|
15
|
+
# dominates every turn is the silent-downgrade signal.
|
|
16
|
+
#
|
|
17
|
+
# The registration was missing from this header. The installer reads TRIGGER
|
|
18
|
+
# and MATCHER from here and falls back to PreToolUse / Bash when both are
|
|
19
|
+
# absent, so this hook was being registered at a moment where the field it
|
|
20
|
+
# reads is always empty: it installed, it appeared in the settings, and it
|
|
21
|
+
# did nothing. Measured 2026-08-04 across examples/: 14 files were like this.
|
|
22
|
+
# TRIGGER: PostToolUse
|
|
23
|
+
# MATCHER: ""
|
|
24
|
+
|
|
25
|
+
set -u
|
|
26
|
+
|
|
27
|
+
LOG_DIR="${HOME}/.claude/logs"
|
|
28
|
+
LOG_FILE="${LOG_DIR}/cache-tier.log"
|
|
29
|
+
mkdir -p "$LOG_DIR" 2>/dev/null
|
|
30
|
+
|
|
31
|
+
INPUT=$(cat)
|
|
32
|
+
|
|
33
|
+
SESSION_ID=$(printf '%s' "$INPUT" | jq -r '.session_id // "unknown"' 2>/dev/null)
|
|
34
|
+
TOOL_NAME=$(printf '%s' "$INPUT" | jq -r '.tool_name // "unknown"' 2>/dev/null)
|
|
35
|
+
CACHE_READ=$(printf '%s' "$INPUT" | jq -r '.tool_response.usage.cache_read_input_tokens // empty' 2>/dev/null)
|
|
36
|
+
CACHE_CREATE=$(printf '%s' "$INPUT" | jq -r '.tool_response.usage.cache_creation_input_tokens // empty' 2>/dev/null)
|
|
37
|
+
|
|
38
|
+
# Fallback: when PostToolUse payload has no usage (most tools), read the last
|
|
39
|
+
# assistant turn from the transcript. This is cheap — one tac|head|jq.
|
|
40
|
+
if [ -z "$CACHE_READ" ] && [ -z "$CACHE_CREATE" ]; then
|
|
41
|
+
TRANSCRIPT=$(printf '%s' "$INPUT" | jq -r '.transcript_path // empty' 2>/dev/null)
|
|
42
|
+
if [ -n "$TRANSCRIPT" ] && [ -r "$TRANSCRIPT" ]; then
|
|
43
|
+
LAST_USAGE=$(tac "$TRANSCRIPT" 2>/dev/null | grep -m1 '"usage"' || true)
|
|
44
|
+
if [ -n "$LAST_USAGE" ]; then
|
|
45
|
+
CACHE_READ=$(printf '%s' "$LAST_USAGE" | jq -r '.message.usage.cache_read_input_tokens // .usage.cache_read_input_tokens // empty' 2>/dev/null)
|
|
46
|
+
CACHE_CREATE=$(printf '%s' "$LAST_USAGE" | jq -r '.message.usage.cache_creation_input_tokens // .usage.cache_creation_input_tokens // empty' 2>/dev/null)
|
|
47
|
+
fi
|
|
48
|
+
fi
|
|
49
|
+
fi
|
|
50
|
+
|
|
51
|
+
CACHE_READ="${CACHE_READ:-0}"
|
|
52
|
+
CACHE_CREATE="${CACHE_CREATE:-0}"
|
|
53
|
+
|
|
54
|
+
# Infer tier: if a turn had cache reads, the prefix was still valid (tier hit).
|
|
55
|
+
# If only creations, the previous prefix expired — this is the signal that
|
|
56
|
+
# matters for TTL regression. ephemeral_5m burns creations every turn.
|
|
57
|
+
if [ "$CACHE_READ" -gt 0 ] 2>/dev/null; then
|
|
58
|
+
TIER="cache_hit"
|
|
59
|
+
elif [ "$CACHE_CREATE" -gt 0 ] 2>/dev/null; then
|
|
60
|
+
TIER="cache_miss"
|
|
61
|
+
else
|
|
62
|
+
TIER="no_cache_data"
|
|
63
|
+
fi
|
|
64
|
+
|
|
65
|
+
TS=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
|
66
|
+
printf '%s\t%s\t%s\t%s\t%s\t%s\n' \
|
|
67
|
+
"$TS" "$SESSION_ID" "$TOOL_NAME" "$TIER" "$CACHE_READ" "$CACHE_CREATE" \
|
|
68
|
+
>> "$LOG_FILE"
|
|
69
|
+
|
|
70
|
+
exit 0
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# cache-ttl-eviction-detector.sh — alert when long idle gaps cause prompt-cache TTL eviction
|
|
3
|
+
#
|
|
4
|
+
# Why: Anthropic quietly reduced the prompt-cache TTL from 60 minutes to 5 minutes
|
|
5
|
+
# sometime before 2026-05-30 (community report:
|
|
6
|
+
# https://www.reddit.com/r/ClaudeAI/comments/1tqx8q5/spent_1156308524_input_tokens_in_may_sharing_what/
|
|
7
|
+
# top comment, with 80+ thread responses corroborating).
|
|
8
|
+
# For operators with stable long-running sessions, this can silently 10x
|
|
9
|
+
# effective cost: any idle gap >5 minutes evicts the cache, forcing a fresh
|
|
10
|
+
# cache_creation on the next request that previously would have hit
|
|
11
|
+
# cache_read at ~1/10th the per-token price.
|
|
12
|
+
#
|
|
13
|
+
# The existing cache-creation-drift-detector.sh catches per-request
|
|
14
|
+
# inflation but does not correlate to inter-request time gaps. This hook
|
|
15
|
+
# tracks the gap between consecutive PostToolUse events and warns when
|
|
16
|
+
# a >5-minute gap is followed by a request that does NOT achieve the
|
|
17
|
+
# expected cache hit (cache_read_input_tokens below a configurable
|
|
18
|
+
# fraction of total input).
|
|
19
|
+
#
|
|
20
|
+
# Event: PostToolUse MATCHER: "" (all tools)
|
|
21
|
+
# Action: On each event, read cache_read_input_tokens, cache_creation_input_tokens,
|
|
22
|
+
# and input_tokens from the payload (with transcript fallback). Track the
|
|
23
|
+
# elapsed time since the previous event in a small state file. When the
|
|
24
|
+
# gap exceeds CC_TTL_EVICT_GAP_SECONDS (default 300 = 5 minutes) AND
|
|
25
|
+
# the post-gap event shows a low cache hit ratio
|
|
26
|
+
# (cache_read / (cache_read + cache_creation) < CC_TTL_EVICT_HIT_FLOOR,
|
|
27
|
+
# default 0.50), emit a one-line stderr advisory. Advisory only.
|
|
28
|
+
#
|
|
29
|
+
# Configuration (all optional):
|
|
30
|
+
# CC_TTL_EVICT_STATE State file (default: ~/.cache/cc-safe-setup/cache-ttl-state.json)
|
|
31
|
+
# CC_TTL_EVICT_LOG Event log (default: ~/.cache/cc-safe-setup/cache-ttl-evictions.jsonl)
|
|
32
|
+
# CC_TTL_EVICT_GAP_SECONDS Idle gap that triggers the check (default: 300 = 5 min)
|
|
33
|
+
# CC_TTL_EVICT_HIT_FLOOR Minimum cache-hit ratio expected post-gap (default: 0.50)
|
|
34
|
+
# CC_TTL_EVICT_SILENT Set to "1" to suppress stderr (still logs)
|
|
35
|
+
#
|
|
36
|
+
# Inspect the log:
|
|
37
|
+
# tail -50 ~/.cache/cc-safe-setup/cache-ttl-evictions.jsonl
|
|
38
|
+
# jq -s 'length' ~/.cache/cc-safe-setup/cache-ttl-evictions.jsonl # total evictions seen
|
|
39
|
+
#
|
|
40
|
+
# The registration was missing from this header. The installer reads TRIGGER
|
|
41
|
+
# and MATCHER from here and falls back to PreToolUse / Bash when both are
|
|
42
|
+
# absent, so this hook was being registered at a moment where the field it
|
|
43
|
+
# reads is always empty: it installed, it appeared in the settings, and it
|
|
44
|
+
# did nothing. Measured 2026-08-04 across examples/: 14 files were like this.
|
|
45
|
+
# TRIGGER: PostToolUse
|
|
46
|
+
# MATCHER: ""
|
|
47
|
+
|
|
48
|
+
set -u
|
|
49
|
+
|
|
50
|
+
STATE="${CC_TTL_EVICT_STATE:-${HOME}/.cache/cc-safe-setup/cache-ttl-state.json}"
|
|
51
|
+
LOG="${CC_TTL_EVICT_LOG:-${HOME}/.cache/cc-safe-setup/cache-ttl-evictions.jsonl}"
|
|
52
|
+
GAP_SECONDS="${CC_TTL_EVICT_GAP_SECONDS:-300}"
|
|
53
|
+
HIT_FLOOR="${CC_TTL_EVICT_HIT_FLOOR:-0.50}"
|
|
54
|
+
SILENT="${CC_TTL_EVICT_SILENT:-0}"
|
|
55
|
+
|
|
56
|
+
mkdir -p "$(dirname "$STATE")" 2>/dev/null
|
|
57
|
+
|
|
58
|
+
INPUT=$(cat)
|
|
59
|
+
|
|
60
|
+
# Helper: extract a numeric usage field from the payload or transcript fallback.
|
|
61
|
+
extract_usage() {
|
|
62
|
+
local field="$1"
|
|
63
|
+
local value
|
|
64
|
+
value=$(printf '%s' "$INPUT" | jq -r ".tool_response.usage.${field} // empty" 2>/dev/null)
|
|
65
|
+
if [ -z "$value" ] || [ "$value" = "null" ]; then
|
|
66
|
+
local transcript
|
|
67
|
+
transcript=$(printf '%s' "$INPUT" | jq -r '.transcript_path // empty' 2>/dev/null)
|
|
68
|
+
if [ -n "$transcript" ] && [ -r "$transcript" ]; then
|
|
69
|
+
local last_usage
|
|
70
|
+
last_usage=$(tac "$transcript" 2>/dev/null | grep -m1 '"usage"' || true)
|
|
71
|
+
if [ -n "$last_usage" ]; then
|
|
72
|
+
value=$(printf '%s' "$last_usage" | \
|
|
73
|
+
jq -r ".message.usage.${field} // .usage.${field} // empty" 2>/dev/null)
|
|
74
|
+
fi
|
|
75
|
+
fi
|
|
76
|
+
fi
|
|
77
|
+
case "$value" in
|
|
78
|
+
''|null|*[!0-9]*) echo "0" ;;
|
|
79
|
+
*) echo "$value" ;;
|
|
80
|
+
esac
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
CACHE_READ=$(extract_usage "cache_read_input_tokens")
|
|
84
|
+
CACHE_CREATION=$(extract_usage "cache_creation_input_tokens")
|
|
85
|
+
|
|
86
|
+
# No measurement at all — nothing to track. Exit quietly.
|
|
87
|
+
if [ "$CACHE_READ" = "0" ] && [ "$CACHE_CREATION" = "0" ]; then
|
|
88
|
+
exit 0
|
|
89
|
+
fi
|
|
90
|
+
|
|
91
|
+
NOW=$(date -u +%s)
|
|
92
|
+
SESSION_ID=$(printf '%s' "$INPUT" | jq -r '.session_id // "unknown"' 2>/dev/null)
|
|
93
|
+
|
|
94
|
+
# Load previous state (last event timestamp + session).
|
|
95
|
+
PREV_TS=""
|
|
96
|
+
PREV_SESSION=""
|
|
97
|
+
if [ -r "$STATE" ]; then
|
|
98
|
+
PREV_TS=$(jq -r '.last_event_ts // empty' < "$STATE" 2>/dev/null)
|
|
99
|
+
PREV_SESSION=$(jq -r '.last_session // empty' < "$STATE" 2>/dev/null)
|
|
100
|
+
fi
|
|
101
|
+
|
|
102
|
+
# Write current state immediately so we don't lose it if downstream code errors.
|
|
103
|
+
printf '{"last_event_ts":%s,"last_session":"%s"}\n' "$NOW" "$SESSION_ID" > "$STATE"
|
|
104
|
+
|
|
105
|
+
# Only evaluate gap if we have a previous timestamp AND the session matches.
|
|
106
|
+
# Cross-session gaps are not necessarily TTL eviction — session boundary itself
|
|
107
|
+
# rebuilds the cache prefix, so we'd produce false positives.
|
|
108
|
+
if [ -z "$PREV_TS" ] || [ "$PREV_SESSION" != "$SESSION_ID" ]; then
|
|
109
|
+
exit 0
|
|
110
|
+
fi
|
|
111
|
+
|
|
112
|
+
# Validate prev_ts is an integer (defensive).
|
|
113
|
+
case "$PREV_TS" in
|
|
114
|
+
''|*[!0-9]*) exit 0 ;;
|
|
115
|
+
esac
|
|
116
|
+
|
|
117
|
+
GAP=$((NOW - PREV_TS))
|
|
118
|
+
|
|
119
|
+
# Gap not long enough to be TTL eviction — exit quietly.
|
|
120
|
+
if [ "$GAP" -lt "$GAP_SECONDS" ]; then
|
|
121
|
+
exit 0
|
|
122
|
+
fi
|
|
123
|
+
|
|
124
|
+
# Gap is long enough. Now check the cache hit ratio of this event.
|
|
125
|
+
# Ratio = cache_read / (cache_read + cache_creation).
|
|
126
|
+
# When TTL has evicted the cache, cache_read goes to ~0 and cache_creation spikes.
|
|
127
|
+
HIT_RATIO=$(awk -v r="$CACHE_READ" -v c="$CACHE_CREATION" \
|
|
128
|
+
'BEGIN { tot = r + c; if (tot > 0) printf "%.4f", r/tot; else print "0" }')
|
|
129
|
+
|
|
130
|
+
# Compare against floor.
|
|
131
|
+
EXCEEDS=$(awk -v h="$HIT_RATIO" -v f="$HIT_FLOOR" 'BEGIN { print (h < f) ? 1 : 0 }')
|
|
132
|
+
|
|
133
|
+
if [ "$EXCEEDS" = "1" ]; then
|
|
134
|
+
# Log the eviction.
|
|
135
|
+
TS_ISO=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
|
136
|
+
printf '{"ts":"%s","session":"%s","gap_seconds":%d,"cache_read":%s,"cache_creation":%s,"hit_ratio":%s}\n' \
|
|
137
|
+
"$TS_ISO" "$SESSION_ID" "$GAP" "$CACHE_READ" "$CACHE_CREATION" "$HIT_RATIO" >> "$LOG"
|
|
138
|
+
|
|
139
|
+
if [ "$SILENT" != "1" ]; then
|
|
140
|
+
GAP_MIN=$(awk -v g="$GAP" 'BEGIN { printf "%.1f", g/60 }')
|
|
141
|
+
HIT_PCT=$(awk -v h="$HIT_RATIO" 'BEGIN { printf "%d", h*100 }')
|
|
142
|
+
echo "NOTICE: probable prompt-cache TTL eviction. ${GAP_MIN}-minute idle gap followed by ${HIT_PCT}% cache-hit ratio (floor=${HIT_FLOOR})." >&2
|
|
143
|
+
echo " Anthropic reduced cache TTL from 60min to 5min (community report 2026-05-30)." >&2
|
|
144
|
+
echo " Mitigation: avoid >5min idle gaps between requests, or accept the per-eviction recreation cost." >&2
|
|
145
|
+
echo " Eviction log: ${LOG}" >&2
|
|
146
|
+
fi
|
|
147
|
+
fi
|
|
148
|
+
|
|
149
|
+
exit 0
|
|
@@ -1,5 +1,18 @@
|
|
|
1
|
+
#!/bin/bash
|
|
1
2
|
#
|
|
2
|
-
# TRIGGER: PreToolUse MATCHER: "Bash"
|
|
3
|
+
# TRIGGER: PreToolUse MATCHER: "Bash|PowerShell"
|
|
4
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
5
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
6
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
7
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
8
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
9
|
+
_nojq_warned="/tmp/cc-nojq-warned-cargo-publish-guard-$PPID"
|
|
10
|
+
[ -f "$_nojq_warned" ] || {
|
|
11
|
+
echo "WARNING [cargo-publish-guard]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
12
|
+
: > "$_nojq_warned"
|
|
13
|
+
}
|
|
14
|
+
fi
|
|
15
|
+
|
|
3
16
|
INPUT=$(cat)
|
|
4
17
|
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null)
|
|
5
18
|
[[ -z "$COMMAND" ]] && exit 0
|
|
@@ -19,6 +19,18 @@
|
|
|
19
19
|
|
|
20
20
|
set -euo pipefail
|
|
21
21
|
|
|
22
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
23
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
24
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
25
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
26
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
27
|
+
_nojq_warned="/tmp/cc-nojq-warned-case-insensitive-path-guard-$PPID"
|
|
28
|
+
[ -f "$_nojq_warned" ] || {
|
|
29
|
+
echo "WARNING [case-insensitive-path-guard]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
30
|
+
: > "$_nojq_warned"
|
|
31
|
+
}
|
|
32
|
+
fi
|
|
33
|
+
|
|
22
34
|
INPUT=$(cat)
|
|
23
35
|
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null)
|
|
24
36
|
[ -z "$COMMAND" ] && exit 0
|
|
@@ -37,12 +49,19 @@ TARGETS=""
|
|
|
37
49
|
|
|
38
50
|
# rm: all non-flag arguments
|
|
39
51
|
if echo "$COMMAND" | grep -qE '\brm\s'; then
|
|
40
|
-
|
|
52
|
+
# -P は GNU 拡張。BSD grep では TARGETS が空になり検査が消える。
|
|
53
|
+
# このフックも case-insensitive なファイルシステム向けなので、発火する環境が
|
|
54
|
+
# まさに -P の無い環境。手元では発火させられないため構造の是正として直す。
|
|
55
|
+
TARGETS=$(echo "$COMMAND" \
|
|
56
|
+
| grep -oE '(^|[^A-Za-z0-9_])rm[[:space:]]+(-[a-zA-Z]+[[:space:]]+)*[^[:space:];&|]+([[:space:]]+[^[:space:];&|]+)*' 2>/dev/null \
|
|
57
|
+
| sed -E 's/^[^A-Za-z0-9_]?rm[[:space:]]+(-[a-zA-Z]+[[:space:]]+)*//' || true)
|
|
41
58
|
fi
|
|
42
59
|
|
|
43
60
|
# mv: first non-flag argument (source)
|
|
44
61
|
if echo "$COMMAND" | grep -qE '\bmv\s'; then
|
|
45
|
-
MV_TARGET=$(echo "$COMMAND"
|
|
62
|
+
MV_TARGET=$(echo "$COMMAND" \
|
|
63
|
+
| grep -oE '(^|[^A-Za-z0-9_])mv[[:space:]]+(-[a-zA-Z]+[[:space:]]+)*[^[:space:]]+' 2>/dev/null \
|
|
64
|
+
| sed -E 's/^[^A-Za-z0-9_]?mv[[:space:]]+(-[a-zA-Z]+[[:space:]]+)*//' || true)
|
|
46
65
|
TARGETS="$TARGETS $MV_TARGET"
|
|
47
66
|
fi
|
|
48
67
|
|
|
@@ -34,6 +34,18 @@
|
|
|
34
34
|
# 4. Block if collision detected
|
|
35
35
|
# ================================================================
|
|
36
36
|
|
|
37
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
38
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
39
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
40
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
41
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
42
|
+
_nojq_warned="/tmp/cc-nojq-warned-case-sensitive-guard-$PPID"
|
|
43
|
+
[ -f "$_nojq_warned" ] || {
|
|
44
|
+
echo "WARNING [case-sensitive-guard]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
45
|
+
: > "$_nojq_warned"
|
|
46
|
+
}
|
|
47
|
+
fi
|
|
48
|
+
|
|
37
49
|
INPUT=$(cat)
|
|
38
50
|
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null)
|
|
39
51
|
|
|
@@ -49,9 +61,18 @@ fi
|
|
|
49
61
|
# Extract the target path
|
|
50
62
|
TARGET=""
|
|
51
63
|
if echo "$COMMAND" | grep -qE '^\s*mkdir'; then
|
|
52
|
-
|
|
64
|
+
# -P は GNU 拡張。BSD grep では TARGET が空になり、下の「空なら exit 0」で検査が消える。
|
|
65
|
+
# このフックは case-insensitive なファイルシステムでしか発火しない設計なので、
|
|
66
|
+
# 発火する環境(macOS / Windows)がまさに -P の無い環境にあたる。
|
|
67
|
+
# 手元の case-sensitive な Linux では発火させて確かめられないため、
|
|
68
|
+
# 実測ではなく構造の是正として直している。
|
|
69
|
+
TARGET=$(echo "$COMMAND" \
|
|
70
|
+
| grep -oE 'mkdir[[:space:]]+(-p[[:space:]]+)?[^[:space:]]+' \
|
|
71
|
+
| sed -E 's/^mkdir[[:space:]]+(-p[[:space:]]+)?//' | tail -1)
|
|
53
72
|
elif echo "$COMMAND" | grep -qE '^\s*rm\s'; then
|
|
54
|
-
TARGET=$(echo "$COMMAND"
|
|
73
|
+
TARGET=$(echo "$COMMAND" \
|
|
74
|
+
| grep -oE 'rm[[:space:]]+(-[rf]+[[:space:]]+)*[^[:space:]]+' \
|
|
75
|
+
| sed -E 's/^rm[[:space:]]+(-[rf]+[[:space:]]+)*//' | tail -1)
|
|
55
76
|
fi
|
|
56
77
|
|
|
57
78
|
if [[ -z "$TARGET" ]]; then
|
|
File without changes
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# cch-sentinel-precommit-guard.sh — native sentinel content guard (Incident 3)
|
|
3
|
+
# Why: The standalone Bun Claude Code binary substitutes the literal string
|
|
4
|
+
# `cch=00000` at the native layer — below anything the JavaScript hook
|
|
5
|
+
# surface can intercept. Committing the literal into a file Claude reads
|
|
6
|
+
# triggers cache invalidation patterns and a 10-20x cost multiplier on
|
|
7
|
+
# affected sessions. This guard refuses the commit before the string
|
|
8
|
+
# ever reaches Claude's working set.
|
|
9
|
+
# Event: git pre-commit (NOT a Claude Code hook)
|
|
10
|
+
# Install:
|
|
11
|
+
# cp examples/cch-sentinel-precommit-guard.sh .git/hooks/pre-commit
|
|
12
|
+
# chmod +x .git/hooks/pre-commit
|
|
13
|
+
# Or, to combine with existing pre-commit logic:
|
|
14
|
+
# append `bash path/to/cch-sentinel-precommit-guard.sh || exit 1` to your
|
|
15
|
+
# existing .git/hooks/pre-commit.
|
|
16
|
+
#
|
|
17
|
+
# False positive: documentation that writes ABOUT the sentinel bug will trip
|
|
18
|
+
# this guard. Bypass via `git commit --no-verify` once, or exclude docs paths:
|
|
19
|
+
# CCH_ALLOW_PATHS="docs/|README" bash .git/hooks/pre-commit
|
|
20
|
+
|
|
21
|
+
set -u
|
|
22
|
+
|
|
23
|
+
# Allow opt-out for docs that discuss the bug (the Postmortems book itself
|
|
24
|
+
# needs this escape hatch).
|
|
25
|
+
ALLOW_PATHS="${CCH_ALLOW_PATHS:-}"
|
|
26
|
+
|
|
27
|
+
if [ -n "$ALLOW_PATHS" ]; then
|
|
28
|
+
# Check only files that do not match the allowlist regex.
|
|
29
|
+
FILES_TO_CHECK=$(git diff --cached --name-only | grep -Ev "$ALLOW_PATHS" || true)
|
|
30
|
+
if [ -z "$FILES_TO_CHECK" ]; then
|
|
31
|
+
exit 0
|
|
32
|
+
fi
|
|
33
|
+
MATCH=$(git diff --cached -- $FILES_TO_CHECK 2>/dev/null | grep -n 'cch=00000' || true)
|
|
34
|
+
else
|
|
35
|
+
MATCH=$(git diff --cached 2>/dev/null | grep -n 'cch=00000' || true)
|
|
36
|
+
fi
|
|
37
|
+
|
|
38
|
+
if [ -n "$MATCH" ]; then
|
|
39
|
+
echo "refusing commit: literal cch=00000 found in staged diff" >&2
|
|
40
|
+
echo "this string triggers native sentinel substitution in the Bun Claude Code binary" >&2
|
|
41
|
+
echo "see cc-safe-setup Incident 3 or set CCH_ALLOW_PATHS for documentation writes" >&2
|
|
42
|
+
echo "--- matching lines ---" >&2
|
|
43
|
+
printf '%s\n' "$MATCH" | head -5 >&2
|
|
44
|
+
exit 1
|
|
45
|
+
fi
|
|
46
|
+
|
|
47
|
+
exit 0
|
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
# TRIGGER: PreToolUse MATCHER: "Edit|Write"
|
|
4
4
|
CONTENT=$(cat | jq -r '.tool_input.new_string // .tool_input.content // empty' 2>/dev/null)
|
|
5
5
|
[ -z "$CONTENT" ] && exit 0
|
|
6
|
-
echo "
|
|
6
|
+
echo "$CONTENT" | grep -qE "fetch\(" && ! echo "$CONTENT" | grep -qE "AbortController|signal:" && echo "NOTE: fetch() without AbortController/signal — the request cannot be cancelled" >&2
|
|
7
7
|
exit 0
|
|
File without changes
|
|
File without changes
|
|
@@ -17,6 +17,18 @@
|
|
|
17
17
|
|
|
18
18
|
set -euo pipefail
|
|
19
19
|
|
|
20
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
21
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
22
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
23
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
24
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
25
|
+
_nojq_warned="/tmp/cc-nojq-warned-check-before-act-enforcer-$PPID"
|
|
26
|
+
[ -f "$_nojq_warned" ] || {
|
|
27
|
+
echo "WARNING [check-before-act-enforcer]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
28
|
+
: > "$_nojq_warned"
|
|
29
|
+
}
|
|
30
|
+
fi
|
|
31
|
+
|
|
20
32
|
INPUT=$(cat)
|
|
21
33
|
TOOL=$(echo "$INPUT" | jq -r '.tool_name // empty' 2>/dev/null)
|
|
22
34
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
# TRIGGER: PreToolUse MATCHER: "Edit|Write"
|
|
4
4
|
CONTENT=$(cat | jq -r '.tool_input.new_string // .tool_input.content // empty' 2>/dev/null)
|
|
5
5
|
[ -z "$CONTENT" ] && exit 0
|
|
6
|
-
echo "NOTE:
|
|
6
|
+
echo "$CONTENT" | grep -qE "addEventListener\((['\"])(scroll|resize|mousemove|wheel|drag|input)" && ! echo "$CONTENT" | grep -qE "debounce|throttle" && echo "NOTE: high-frequency event listener without debounce/throttle" >&2
|
|
7
7
|
exit 0
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
# TRIGGER: PreToolUse MATCHER: "Edit|Write"
|
|
4
4
|
CONTENT=$(cat | jq -r '.tool_input.new_string // .tool_input.content // empty' 2>/dev/null)
|
|
5
5
|
[ -z "$CONTENT" ] && exit 0
|
|
6
|
-
echo "NOTE:
|
|
6
|
+
echo "$CONTENT" | grep -qE "throw +['\"]" && echo "NOTE: throwing a string literal — use throw new Error(...) to preserve the stack" >&2
|
|
7
7
|
exit 0
|
|
File without changes
|
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
# TRIGGER: PreToolUse MATCHER: "Edit|Write"
|
|
4
4
|
CONTENT=$(cat | jq -r '.tool_input.new_string // .tool_input.content // empty' 2>/dev/null)
|
|
5
5
|
[ -z "$CONTENT" ] && exit 0
|
|
6
|
-
echo "NOTE:
|
|
6
|
+
echo "$CONTENT" | grep -qE "catch *\(" && ! echo "$CONTENT" | grep -qE "console|log|logger|captureException|report" && echo "NOTE: catch block without any logging" >&2
|
|
7
7
|
exit 0
|
|
File without changes
|
|
File without changes
|
|
File without changes
|