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,178 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ================================================================
|
|
3
|
+
# cross-product-mcp-spawn-detector.sh — Warn when MCP server spawn
|
|
4
|
+
# configs exist in cross-product
|
|
5
|
+
# state paths outside Claude Code
|
|
6
|
+
# ================================================================
|
|
7
|
+
# PURPOSE:
|
|
8
|
+
# On session start, scans known cross-product application-support
|
|
9
|
+
# paths (where Claude Desktop or other Anthropic products store
|
|
10
|
+
# plugin metadata) for .mcp.json files that contain user-blocklisted
|
|
11
|
+
# plugin names. If found, warns that those MCP servers will spawn
|
|
12
|
+
# on the next Claude Code session regardless of any
|
|
13
|
+
# `enabledPlugins: false` or `blocklist.json` state in
|
|
14
|
+
# ~/.claude/, because the spawn loader reads from the cross-product
|
|
15
|
+
# path as a separate surface.
|
|
16
|
+
#
|
|
17
|
+
# TRIGGER: SessionStart
|
|
18
|
+
# MATCHER: ""
|
|
19
|
+
#
|
|
20
|
+
# WHY THIS MATTERS:
|
|
21
|
+
# Issue #58806 documented a case where a user disabled a plugin
|
|
22
|
+
# ("nimble") via every config knob Claude Code exposes — disabling
|
|
23
|
+
# it in settings, removing it from installed_plugins.json, adding it
|
|
24
|
+
# to blocklist.json, removing its cache directory — and the plugin
|
|
25
|
+
# kept spawning its MCP server (and opening OAuth tabs in the
|
|
26
|
+
# browser) on every session start.
|
|
27
|
+
#
|
|
28
|
+
# Root cause: Claude Desktop's RPM plugin install path
|
|
29
|
+
# ~/Library/Application Support/Claude/local-agent-mode-sessions/
|
|
30
|
+
# <session-uuid-1>/<session-uuid-2>/rpm/plugin_<ULID>/.mcp.json
|
|
31
|
+
# is read by Claude Code as a separate spawn surface, and none of
|
|
32
|
+
# the ~/.claude/ config knobs gate that read. The user only found
|
|
33
|
+
# the path after three sessions of manual investigation.
|
|
34
|
+
#
|
|
35
|
+
# This is a structurally different problem from a single-loader
|
|
36
|
+
# gate bug: it is a cross-product state leakage where one product's
|
|
37
|
+
# state files affect another product's runtime spawn decisions. The
|
|
38
|
+
# underlying fix has to come from Anthropic (unify plugin state, or
|
|
39
|
+
# make `claude-code mcp list` reflect the full source-path set).
|
|
40
|
+
# Until then, the operator-side mitigation is to detect the
|
|
41
|
+
# presence of blocklisted plugin spawn configs before the session
|
|
42
|
+
# starts using them.
|
|
43
|
+
#
|
|
44
|
+
# This hook does that detection. A one-shot `find … rm` is
|
|
45
|
+
# point-in-time and gets defeated the next time Claude Desktop
|
|
46
|
+
# recreates the session directory under a fresh UUID. Running the
|
|
47
|
+
# same scan at every Claude Code SessionStart closes the recurrence
|
|
48
|
+
# window.
|
|
49
|
+
#
|
|
50
|
+
# WHAT IT CHECKS:
|
|
51
|
+
# For each path in the candidate cross-product roots
|
|
52
|
+
# (macOS / Linux / Windows-via-WSL), if the path exists, finds all
|
|
53
|
+
# .mcp.json files and greps for any plugin name in the user's
|
|
54
|
+
# blocklist (configured via CC_CROSS_PRODUCT_BLOCKLIST, comma- or
|
|
55
|
+
# newline-separated). Reports every match.
|
|
56
|
+
#
|
|
57
|
+
# OUTPUT:
|
|
58
|
+
# For each match: the blocked plugin name and the .mcp.json path
|
|
59
|
+
# that will spawn it. Exits 0 by default (advisory). If
|
|
60
|
+
# CC_CROSS_PRODUCT_REQUIRE_CLEAN=1 is set, exits 2 to block the
|
|
61
|
+
# session until the operator removes the stale spawn config.
|
|
62
|
+
#
|
|
63
|
+
# CONFIGURATION:
|
|
64
|
+
# CC_CROSS_PRODUCT_BLOCKLIST
|
|
65
|
+
# Comma- or newline-separated plugin name fragments to match
|
|
66
|
+
# against .mcp.json contents. Empty (the default) means the hook
|
|
67
|
+
# skips entirely — opt-in only, so installations without a
|
|
68
|
+
# blocklist incur no startup cost or false positives.
|
|
69
|
+
# Example: CC_CROSS_PRODUCT_BLOCKLIST="nimble,wix,serena"
|
|
70
|
+
#
|
|
71
|
+
# CC_CROSS_PRODUCT_REQUIRE_CLEAN
|
|
72
|
+
# Set to "1" to exit 2 (block) when any match is found. Default
|
|
73
|
+
# is exit 0 (advisory).
|
|
74
|
+
#
|
|
75
|
+
# CC_CROSS_PRODUCT_EXTRA_ROOTS
|
|
76
|
+
# Newline-separated extra paths to scan in addition to the
|
|
77
|
+
# built-in macOS / Linux / WSL candidates. Useful for non-default
|
|
78
|
+
# install locations.
|
|
79
|
+
#
|
|
80
|
+
# RELATED ISSUES:
|
|
81
|
+
# https://github.com/anthropics/claude-code/issues/58806
|
|
82
|
+
# https://github.com/anthropics/claude-code/issues/58520
|
|
83
|
+
# ================================================================
|
|
84
|
+
|
|
85
|
+
set -u
|
|
86
|
+
|
|
87
|
+
BLOCKLIST_RAW="${CC_CROSS_PRODUCT_BLOCKLIST:-}"
|
|
88
|
+
if [ -z "$BLOCKLIST_RAW" ]; then
|
|
89
|
+
# Opt-in: no blocklist configured, skip silently.
|
|
90
|
+
exit 0
|
|
91
|
+
fi
|
|
92
|
+
|
|
93
|
+
# Normalize blocklist: replace commas and whitespace runs with newlines, drop empties.
|
|
94
|
+
BLOCKLIST=$(printf '%s' "$BLOCKLIST_RAW" | tr ',' '\n' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//' | grep -v '^$' || true)
|
|
95
|
+
if [ -z "$BLOCKLIST" ]; then
|
|
96
|
+
exit 0
|
|
97
|
+
fi
|
|
98
|
+
|
|
99
|
+
# Build candidate cross-product roots.
|
|
100
|
+
CANDIDATE_ROOTS=""
|
|
101
|
+
add_root() {
|
|
102
|
+
[ -n "$1" ] || return 0
|
|
103
|
+
CANDIDATE_ROOTS="${CANDIDATE_ROOTS}${1}
|
|
104
|
+
"
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
# macOS: Claude Desktop application-support tree.
|
|
108
|
+
add_root "$HOME/Library/Application Support/Claude/local-agent-mode-sessions"
|
|
109
|
+
add_root "$HOME/Library/Application Support/Claude/plugins"
|
|
110
|
+
|
|
111
|
+
# Linux: XDG config / data trees.
|
|
112
|
+
add_root "${XDG_CONFIG_HOME:-$HOME/.config}/Claude/local-agent-mode-sessions"
|
|
113
|
+
add_root "${XDG_CONFIG_HOME:-$HOME/.config}/Claude/plugins"
|
|
114
|
+
add_root "${XDG_DATA_HOME:-$HOME/.local/share}/Claude/local-agent-mode-sessions"
|
|
115
|
+
add_root "${XDG_DATA_HOME:-$HOME/.local/share}/Claude/plugins"
|
|
116
|
+
|
|
117
|
+
# Windows via WSL: APPDATA / LOCALAPPDATA exposed through /mnt/c.
|
|
118
|
+
if [ -n "${APPDATA:-}" ]; then
|
|
119
|
+
add_root "$APPDATA/Claude/local-agent-mode-sessions"
|
|
120
|
+
add_root "$APPDATA/Claude/plugins"
|
|
121
|
+
fi
|
|
122
|
+
if [ -n "${LOCALAPPDATA:-}" ]; then
|
|
123
|
+
add_root "$LOCALAPPDATA/Claude/local-agent-mode-sessions"
|
|
124
|
+
add_root "$LOCALAPPDATA/Claude/plugins"
|
|
125
|
+
fi
|
|
126
|
+
|
|
127
|
+
# Operator-specified extras.
|
|
128
|
+
if [ -n "${CC_CROSS_PRODUCT_EXTRA_ROOTS:-}" ]; then
|
|
129
|
+
while IFS= read -r extra; do
|
|
130
|
+
add_root "$extra"
|
|
131
|
+
done <<EOF
|
|
132
|
+
${CC_CROSS_PRODUCT_EXTRA_ROOTS}
|
|
133
|
+
EOF
|
|
134
|
+
fi
|
|
135
|
+
|
|
136
|
+
# Scan each existing root for .mcp.json files containing any blocked name.
|
|
137
|
+
MATCHES=""
|
|
138
|
+
while IFS= read -r root; do
|
|
139
|
+
[ -n "$root" ] || continue
|
|
140
|
+
[ -d "$root" ] || continue
|
|
141
|
+
|
|
142
|
+
# Iterate every .mcp.json under this root.
|
|
143
|
+
while IFS= read -r -d '' mcpfile; do
|
|
144
|
+
# Iterate every blocked name.
|
|
145
|
+
while IFS= read -r name; do
|
|
146
|
+
[ -n "$name" ] || continue
|
|
147
|
+
if grep -qF -- "$name" "$mcpfile" 2>/dev/null; then
|
|
148
|
+
MATCHES="${MATCHES} - blocked plugin '${name}' is spawnable from: ${mcpfile}
|
|
149
|
+
"
|
|
150
|
+
fi
|
|
151
|
+
done <<EOF
|
|
152
|
+
${BLOCKLIST}
|
|
153
|
+
EOF
|
|
154
|
+
done < <(find "$root" -type f -name '.mcp.json' -print0 2>/dev/null)
|
|
155
|
+
done <<EOF
|
|
156
|
+
${CANDIDATE_ROOTS}
|
|
157
|
+
EOF
|
|
158
|
+
|
|
159
|
+
if [ -n "$MATCHES" ]; then
|
|
160
|
+
printf '⚠️ Cross-product MCP spawn config detected (Issue #58806):\n' >&2
|
|
161
|
+
printf '%s' "$MATCHES" >&2
|
|
162
|
+
printf '\n These files live outside ~/.claude/ and are read by Claude Code as a\n' >&2
|
|
163
|
+
printf ' separate spawn surface. Disabling the plugin via enabledPlugins / blocklist /\n' >&2
|
|
164
|
+
printf ' installed_plugins.json in ~/.claude/ will NOT prevent the next session from\n' >&2
|
|
165
|
+
printf ' spawning the MCP server from the path above.\n' >&2
|
|
166
|
+
printf '\n Mitigations:\n' >&2
|
|
167
|
+
printf ' 1. Remove the .mcp.json (or the enclosing plugin_ directory) listed above.\n' >&2
|
|
168
|
+
printf ' 2. Set MCP_REMOTE_NO_OPEN=1 in this shell to neutralize browser-open behavior\n' >&2
|
|
169
|
+
printf ' if removal is not yet possible.\n' >&2
|
|
170
|
+
printf ' 3. Add a PreToolUse hook matching mcp__<plugin-prefix>* to refuse calls.\n' >&2
|
|
171
|
+
printf '\n Reference: https://github.com/anthropics/claude-code/issues/58806\n' >&2
|
|
172
|
+
|
|
173
|
+
if [ "${CC_CROSS_PRODUCT_REQUIRE_CLEAN:-0}" = "1" ]; then
|
|
174
|
+
exit 2
|
|
175
|
+
fi
|
|
176
|
+
fi
|
|
177
|
+
|
|
178
|
+
exit 0
|
|
File without changes
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ================================================================
|
|
3
|
+
# daemon-zombie-worker-surfacer.sh — Surface orphaned / zombie
|
|
4
|
+
# background workers at session start via `claude daemon status`.
|
|
5
|
+
# ================================================================
|
|
6
|
+
# PURPOSE:
|
|
7
|
+
# Detect background workers that are still registered (and may still
|
|
8
|
+
# be consuming tokens) from PRIOR sessions, and surface them at the
|
|
9
|
+
# start of a new session — when the operator can actually act.
|
|
10
|
+
#
|
|
11
|
+
# WHY THIS MATTERS:
|
|
12
|
+
# Background subagents/workers can keep running after the operator
|
|
13
|
+
# stops them. The "Background tasks" panel showing "Stopped" is not
|
|
14
|
+
# always terminal, and the zombie state is INVISIBLE unless you run
|
|
15
|
+
# `claude daemon status`. Real reports:
|
|
16
|
+
# #66339 — two background subagents resurrected after being stopped
|
|
17
|
+
# multiple times, ran 21+ hours, consumed ~160k tokens,
|
|
18
|
+
# burned a 4-hour usage limit and triggered overage charges;
|
|
19
|
+
# deleting the PARENT session was the only thing that stopped
|
|
20
|
+
# them.
|
|
21
|
+
# #66358 — after an auto-update the daemon orphaned the prior version's
|
|
22
|
+
# workers (control-key version skew): alive but unreachable.
|
|
23
|
+
# The harness fix is provider-side. This hook is the operator-side
|
|
24
|
+
# detector: it runs `claude daemon status` at session start and, if any
|
|
25
|
+
# workers are still registered or a version skew is present, surfaces an
|
|
26
|
+
# advisory so the operator can inspect (`claude agents --json`) or restart.
|
|
27
|
+
#
|
|
28
|
+
# TRIGGER: SessionStart
|
|
29
|
+
# MATCHER: "" (SessionStart has no matcher)
|
|
30
|
+
# DECISION CONTROL: none — advisory only, non-blocking, fail-open.
|
|
31
|
+
#
|
|
32
|
+
# CONFIGURATION (environment variables):
|
|
33
|
+
# CC_DAEMON_SURFACER_DISABLE set "1" to disable the hook entirely
|
|
34
|
+
# CC_DAEMON_STATUS_TIMEOUT seconds to wait for `claude daemon status`
|
|
35
|
+
# (default 8)
|
|
36
|
+
# CC_DAEMON_STATUS_CMD override the status command (used by tests
|
|
37
|
+
# to inject canned output)
|
|
38
|
+
#
|
|
39
|
+
# USAGE (settings.json):
|
|
40
|
+
# {
|
|
41
|
+
# "hooks": {
|
|
42
|
+
# "SessionStart": [{
|
|
43
|
+
# "matcher": "",
|
|
44
|
+
# "hooks": [{
|
|
45
|
+
# "type": "command",
|
|
46
|
+
# "command": "~/.claude/hooks/daemon-zombie-worker-surfacer.sh"
|
|
47
|
+
# }]
|
|
48
|
+
# }]
|
|
49
|
+
# }
|
|
50
|
+
# }
|
|
51
|
+
#
|
|
52
|
+
# RELATED ISSUES:
|
|
53
|
+
# https://github.com/anthropics/claude-code/issues/66339
|
|
54
|
+
# https://github.com/anthropics/claude-code/issues/66358
|
|
55
|
+
# ================================================================
|
|
56
|
+
|
|
57
|
+
set -uo pipefail
|
|
58
|
+
|
|
59
|
+
[ "${CC_DAEMON_SURFACER_DISABLE:-0}" = "1" ] && exit 0
|
|
60
|
+
|
|
61
|
+
TIMEOUT="${CC_DAEMON_STATUS_TIMEOUT:-8}"
|
|
62
|
+
|
|
63
|
+
# Obtain the daemon status text. Tests inject canned output via
|
|
64
|
+
# CC_DAEMON_STATUS_CMD; otherwise call the real CLI (fail-open if absent).
|
|
65
|
+
if [ -n "${CC_DAEMON_STATUS_CMD:-}" ]; then
|
|
66
|
+
STATUS=$(eval "$CC_DAEMON_STATUS_CMD" 2>/dev/null)
|
|
67
|
+
else
|
|
68
|
+
command -v claude >/dev/null 2>&1 || exit 0
|
|
69
|
+
STATUS=$(timeout "$TIMEOUT" claude daemon status 2>/dev/null)
|
|
70
|
+
fi
|
|
71
|
+
|
|
72
|
+
# Empty output (timeout, error, no such subcommand) → fail-open silently.
|
|
73
|
+
[ -z "$STATUS" ] && exit 0
|
|
74
|
+
|
|
75
|
+
# Background-worker count. The status prints a line such as:
|
|
76
|
+
# bg workers: 8 running (control.sock), 8 in roster.json
|
|
77
|
+
# bg workers: 0 in roster.json (control unreachable)
|
|
78
|
+
# Take the largest integer on the "bg workers:" line as the count.
|
|
79
|
+
WORKER_LINE=$(printf '%s\n' "$STATUS" | grep -iE 'bg workers:' | head -1)
|
|
80
|
+
WORKERS=$(printf '%s' "$WORKER_LINE" | grep -oE '[0-9]+' | sort -nr | head -1)
|
|
81
|
+
WORKERS="${WORKERS:-0}"
|
|
82
|
+
|
|
83
|
+
# Version skew = workers orphaned by an auto-update, locked to an old
|
|
84
|
+
# control key (e.g. "5 from a different CLI version").
|
|
85
|
+
SKEW_LINE=$(printf '%s\n' "$STATUS" | grep -iE 'from a different (CLI )?version' | head -1)
|
|
86
|
+
SKEW=$(printf '%s' "$SKEW_LINE" | grep -oE '[0-9]+' | head -1)
|
|
87
|
+
SKEW="${SKEW:-0}"
|
|
88
|
+
|
|
89
|
+
# Healthy / common case: nothing registered, no skew → silent no-op.
|
|
90
|
+
if [ "$WORKERS" -eq 0 ] && [ "$SKEW" -eq 0 ]; then
|
|
91
|
+
exit 0
|
|
92
|
+
fi
|
|
93
|
+
|
|
94
|
+
DETAIL=""
|
|
95
|
+
[ "$WORKERS" -gt 0 ] && DETAIL="${DETAIL} - ${WORKERS} background worker(s) still registered (from a prior session).\n"
|
|
96
|
+
[ "$SKEW" -gt 0 ] && DETAIL="${DETAIL} - ${SKEW} of them are from a different CLI version — orphaned by an auto-update, alive but unreachable.\n"
|
|
97
|
+
|
|
98
|
+
cat >&2 <<EOF
|
|
99
|
+
<system-reminder>
|
|
100
|
+
BACKGROUND WORKER CHECK — possible zombie / orphaned background work detected.
|
|
101
|
+
|
|
102
|
+
$(printf '%b' "$DETAIL")
|
|
103
|
+
Background workers can keep running (and consuming tokens) after you stop them
|
|
104
|
+
— the "Background tasks" panel showing "Stopped" is not always terminal
|
|
105
|
+
(#66339: ~160k tokens burned over 21h after repeated stops; #66358: auto-update
|
|
106
|
+
orphans). If you did NOT intend these to be running:
|
|
107
|
+
|
|
108
|
+
1. Inspect them: claude agents --json
|
|
109
|
+
2. The stop that worked in #66339 was deleting the PARENT session — the
|
|
110
|
+
panel "Stop" alone did not stop them.
|
|
111
|
+
3. Orphans from a version skew (#66358) cannot be re-attached; restart the
|
|
112
|
+
daemon / Claude Code fully to clear them.
|
|
113
|
+
|
|
114
|
+
Advisory only — nothing is blocked. Set CC_DAEMON_SURFACER_DISABLE=1 to silence.
|
|
115
|
+
</system-reminder>
|
|
116
|
+
EOF
|
|
117
|
+
|
|
118
|
+
exit 0
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# ================================================================
|
|
3
|
+
# daily-cost-guard.sh — Track per-day API-equivalent token cost
|
|
4
|
+
# and warn / block when the daily budget is
|
|
5
|
+
# exceeded
|
|
6
|
+
# ================================================================
|
|
7
|
+
# PURPOSE:
|
|
8
|
+
# Anthropic's billing dashboard reflects with a multi-day delay,
|
|
9
|
+
# so it cannot serve as a real-time spend guard. This hook reads
|
|
10
|
+
# the actual usage data from the transcript file on every Stop
|
|
11
|
+
# event, accumulates an API-equivalent cost estimate per day, and
|
|
12
|
+
# warns at a soft threshold or signals when the daily budget is
|
|
13
|
+
# exceeded.
|
|
14
|
+
#
|
|
15
|
+
# Solves the May 2026 r/ClaudeAI report (735 points): an operator
|
|
16
|
+
# left a 30-minute polling loop running overnight and woke up to
|
|
17
|
+
# approximately $6,000 in cost because each polling iteration
|
|
18
|
+
# re-sent an 800K-token conversation history without cache benefit
|
|
19
|
+
# (loop interval > 5-minute cache TTL).
|
|
20
|
+
#
|
|
21
|
+
# TRIGGER: Stop
|
|
22
|
+
# MATCHER: ""
|
|
23
|
+
#
|
|
24
|
+
# WHY THIS MATTERS:
|
|
25
|
+
# The hook runs once per turn at conversation end (zero per-turn
|
|
26
|
+
# latency). It reads the transcript file to find the most recent
|
|
27
|
+
# message.usage block, computes API-equivalent cost using
|
|
28
|
+
# Sonnet 4.6 pricing, and writes a daily JSONL log. The daily
|
|
29
|
+
# total accumulates across multiple sessions on the same date.
|
|
30
|
+
#
|
|
31
|
+
# Subscription-plan users are not billed by API rate; the cost
|
|
32
|
+
# estimate is a proxy for actual token consumption. Use it to
|
|
33
|
+
# detect anomalous spend before the dashboard catches up.
|
|
34
|
+
#
|
|
35
|
+
# WHAT IT CHECKS:
|
|
36
|
+
# 1. Reads transcript_path from Stop hook input
|
|
37
|
+
# 2. Extracts the most recent message.usage block (input, output,
|
|
38
|
+
# cache_read, cache_creation)
|
|
39
|
+
# 3. Computes Sonnet 4.6 API-equivalent cost for that turn
|
|
40
|
+
# 4. Appends the turn cost to today's JSONL log
|
|
41
|
+
# 5. Sums today's log to get the daily total
|
|
42
|
+
# 6. Warns at soft threshold, signals at daily limit
|
|
43
|
+
#
|
|
44
|
+
# OUTPUT:
|
|
45
|
+
# Soft warning (exit 0) at WARN_THRESHOLD_USD.
|
|
46
|
+
# Daily-limit-exceeded signal (exit 0 by default, exit 2 with
|
|
47
|
+
# CC_DAILY_COST_BLOCK=1) at DAILY_LIMIT_USD.
|
|
48
|
+
#
|
|
49
|
+
# CONFIGURATION:
|
|
50
|
+
# CC_DAILY_LIMIT_USD — daily budget cap (default $5.00)
|
|
51
|
+
# CC_DAILY_WARN_USD — soft warning threshold (default $3.50)
|
|
52
|
+
# CC_DAILY_COST_BLOCK — set to "1" to exit 2 (signal context)
|
|
53
|
+
# when daily limit is exceeded; default
|
|
54
|
+
# is advisory (exit 0)
|
|
55
|
+
# CC_DAILY_COST_LOG_DIR — log directory (default
|
|
56
|
+
# ~/.claude/cost-log)
|
|
57
|
+
# CC_DAILY_COST_MODEL — pricing model (default "sonnet"; set
|
|
58
|
+
# to "opus" to use Opus 4.7 rates 5x
|
|
59
|
+
# higher)
|
|
60
|
+
#
|
|
61
|
+
# RELATED ISSUES:
|
|
62
|
+
# https://github.com/anthropics/claude-code/issues/47049
|
|
63
|
+
# r/ClaudeAI 2026-05-01 "$6000 overnight" report
|
|
64
|
+
# ================================================================
|
|
65
|
+
|
|
66
|
+
set -u
|
|
67
|
+
|
|
68
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
69
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
70
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
71
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
72
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
73
|
+
_nojq_warned="/tmp/cc-nojq-warned-daily-cost-guard-$PPID"
|
|
74
|
+
[ -f "$_nojq_warned" ] || {
|
|
75
|
+
echo "WARNING [daily-cost-guard]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
76
|
+
: > "$_nojq_warned"
|
|
77
|
+
}
|
|
78
|
+
fi
|
|
79
|
+
|
|
80
|
+
DAILY_LIMIT_USD="${CC_DAILY_LIMIT_USD:-5.00}"
|
|
81
|
+
WARN_THRESHOLD_USD="${CC_DAILY_WARN_USD:-3.50}"
|
|
82
|
+
LOG_DIR="${CC_DAILY_COST_LOG_DIR:-${HOME}/.claude/cost-log}"
|
|
83
|
+
MODEL="${CC_DAILY_COST_MODEL:-sonnet}"
|
|
84
|
+
|
|
85
|
+
# Pricing tables (USD per 1M tokens) as of 2026-05
|
|
86
|
+
case "$MODEL" in
|
|
87
|
+
opus)
|
|
88
|
+
# Opus 4.7: input $15 / output $75 / cache write $18.75 / cache read $1.50
|
|
89
|
+
P_IN=15
|
|
90
|
+
P_OUT=75
|
|
91
|
+
P_CW=18.75
|
|
92
|
+
P_CR=1.50
|
|
93
|
+
;;
|
|
94
|
+
sonnet|*)
|
|
95
|
+
# Sonnet 4.6: input $3 / output $15 / cache write $3.75 / cache read $0.30
|
|
96
|
+
P_IN=3
|
|
97
|
+
P_OUT=15
|
|
98
|
+
P_CW=3.75
|
|
99
|
+
P_CR=0.30
|
|
100
|
+
;;
|
|
101
|
+
esac
|
|
102
|
+
|
|
103
|
+
mkdir -p "${LOG_DIR}"
|
|
104
|
+
TODAY=$(date +%Y-%m-%d)
|
|
105
|
+
LOG_FILE="${LOG_DIR}/${TODAY}.jsonl"
|
|
106
|
+
|
|
107
|
+
INPUT=$(cat)
|
|
108
|
+
|
|
109
|
+
TRANSCRIPT_PATH=$(printf '%s' "$INPUT" | jq -r '.transcript_path // empty' 2>/dev/null)
|
|
110
|
+
|
|
111
|
+
if [ -z "$TRANSCRIPT_PATH" ] || [ ! -f "$TRANSCRIPT_PATH" ]; then
|
|
112
|
+
exit 0
|
|
113
|
+
fi
|
|
114
|
+
|
|
115
|
+
# Extract the most recent message.usage block
|
|
116
|
+
LATEST_USAGE=$(grep -h '"usage"' "$TRANSCRIPT_PATH" 2>/dev/null \
|
|
117
|
+
| tail -1 \
|
|
118
|
+
| jq -r '.message.usage // empty' 2>/dev/null || true)
|
|
119
|
+
|
|
120
|
+
if [ -z "$LATEST_USAGE" ]; then
|
|
121
|
+
exit 0
|
|
122
|
+
fi
|
|
123
|
+
|
|
124
|
+
TURN_INPUT=$(printf '%s' "$LATEST_USAGE" | jq -r '.input_tokens // 0' 2>/dev/null || echo 0)
|
|
125
|
+
TURN_OUTPUT=$(printf '%s' "$LATEST_USAGE" | jq -r '.output_tokens // 0' 2>/dev/null || echo 0)
|
|
126
|
+
TURN_CACHE_READ=$(printf '%s' "$LATEST_USAGE" | jq -r '.cache_read_input_tokens // 0' 2>/dev/null || echo 0)
|
|
127
|
+
TURN_CACHE_WRITE=$(printf '%s' "$LATEST_USAGE" | jq -r '.cache_creation_input_tokens // 0' 2>/dev/null || echo 0)
|
|
128
|
+
|
|
129
|
+
COST_USD=$(awk -v i="$TURN_INPUT" -v o="$TURN_OUTPUT" -v cr="$TURN_CACHE_READ" -v cw="$TURN_CACHE_WRITE" \
|
|
130
|
+
-v pi="$P_IN" -v po="$P_OUT" -v pcr="$P_CR" -v pcw="$P_CW" '
|
|
131
|
+
BEGIN {
|
|
132
|
+
printf "%.6f\n", (i * pi + o * po + cw * pcw + cr * pcr) / 1000000
|
|
133
|
+
}')
|
|
134
|
+
|
|
135
|
+
printf '{"ts":"%s","turn_cost_usd":%s,"input":%s,"output":%s,"cache_read":%s,"cache_write":%s,"model":"%s"}\n' \
|
|
136
|
+
"$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$COST_USD" "$TURN_INPUT" "$TURN_OUTPUT" "$TURN_CACHE_READ" "$TURN_CACHE_WRITE" "$MODEL" \
|
|
137
|
+
>> "$LOG_FILE"
|
|
138
|
+
|
|
139
|
+
# Sum today's entries to get the daily total
|
|
140
|
+
TODAY_TOTAL=$(awk -F'"turn_cost_usd":' 'NF>1 {split($2, a, ","); sum += a[1]} END {printf "%.4f", sum+0}' "$LOG_FILE")
|
|
141
|
+
|
|
142
|
+
# Threshold checks
|
|
143
|
+
if awk "BEGIN {exit !($TODAY_TOTAL >= $DAILY_LIMIT_USD)}"; then
|
|
144
|
+
cat >&2 <<EOF
|
|
145
|
+
🛑 daily-cost-guard: 当日累計が想定上限を超えました
|
|
146
|
+
当日累計: \$${TODAY_TOTAL}
|
|
147
|
+
想定上限: \$${DAILY_LIMIT_USD}
|
|
148
|
+
ログ: ${LOG_FILE}
|
|
149
|
+
原因の確認まで作業を止めることをお勧めします。
|
|
150
|
+
Reference: https://github.com/anthropics/claude-code/issues/47049
|
|
151
|
+
EOF
|
|
152
|
+
if [ "${CC_DAILY_COST_BLOCK:-0}" = "1" ]; then
|
|
153
|
+
exit 2
|
|
154
|
+
fi
|
|
155
|
+
elif awk "BEGIN {exit !($TODAY_TOTAL >= $WARN_THRESHOLD_USD)}"; then
|
|
156
|
+
cat >&2 <<EOF
|
|
157
|
+
⚠ daily-cost-guard: 当日累計が警告閾値に達しました
|
|
158
|
+
当日累計: \$${TODAY_TOTAL}
|
|
159
|
+
警告閾値: \$${WARN_THRESHOLD_USD}
|
|
160
|
+
想定上限: \$${DAILY_LIMIT_USD}
|
|
161
|
+
EOF
|
|
162
|
+
fi
|
|
163
|
+
|
|
164
|
+
exit 0
|
|
File without changes
|
|
@@ -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-dangerous-pip-flag-guard-$PPID"
|
|
28
|
+
[ -f "$_nojq_warned" ] || {
|
|
29
|
+
echo "WARNING [dangerous-pip-flag-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
|
|
@@ -24,7 +24,19 @@
|
|
|
24
24
|
# psql (local connection)
|
|
25
25
|
# prisma generate (code generation, not DB change)
|
|
26
26
|
#
|
|
27
|
-
# TRIGGER: PreToolUse MATCHER: "Bash"
|
|
27
|
+
# TRIGGER: PreToolUse MATCHER: "Bash|PowerShell"
|
|
28
|
+
|
|
29
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
30
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
31
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
32
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
33
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
34
|
+
_nojq_warned="/tmp/cc-nojq-warned-db-connect-guard-$PPID"
|
|
35
|
+
[ -f "$_nojq_warned" ] || {
|
|
36
|
+
echo "WARNING [db-connect-guard]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
37
|
+
: > "$_nojq_warned"
|
|
38
|
+
}
|
|
39
|
+
fi
|
|
28
40
|
|
|
29
41
|
INPUT=$(cat)
|
|
30
42
|
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null)
|
|
@@ -13,6 +13,18 @@
|
|
|
13
13
|
|
|
14
14
|
set -euo pipefail
|
|
15
15
|
|
|
16
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
17
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
18
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
19
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
20
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
21
|
+
_nojq_warned="/tmp/cc-nojq-warned-denied-action-retry-guard-$PPID"
|
|
22
|
+
[ -f "$_nojq_warned" ] || {
|
|
23
|
+
echo "WARNING [denied-action-retry-guard]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
24
|
+
: > "$_nojq_warned"
|
|
25
|
+
}
|
|
26
|
+
fi
|
|
27
|
+
|
|
16
28
|
INPUT=$(cat)
|
|
17
29
|
TOOL=$(echo "$INPUT" | jq -r '.tool_name // empty' 2>/dev/null)
|
|
18
30
|
COMMAND=""
|
|
@@ -33,6 +33,18 @@
|
|
|
33
33
|
|
|
34
34
|
set -euo pipefail
|
|
35
35
|
|
|
36
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
37
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
38
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
39
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
40
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
41
|
+
_nojq_warned="/tmp/cc-nojq-warned-deny-bypass-detector-$PPID"
|
|
42
|
+
[ -f "$_nojq_warned" ] || {
|
|
43
|
+
echo "WARNING [deny-bypass-detector]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
44
|
+
: > "$_nojq_warned"
|
|
45
|
+
}
|
|
46
|
+
fi
|
|
47
|
+
|
|
36
48
|
DENY_LOG="/tmp/cc-deny-bypass-log"
|
|
37
49
|
mkdir -p "$(dirname "$DENY_LOG")" 2>/dev/null || true
|
|
38
50
|
|