cc-safe-setup 29.7.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-circuit-breaker.sh +72 -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 +89 -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/thinking-stall-detector.sh +61 -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-circuit-breaker.sh +134 -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-exploration-budget-guard.sh +164 -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-thinking-stall-detector.sh +151 -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,150 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ================================================================
|
|
3
|
+
# mcp-config-poisoning-audit.sh — Read-only audit for supply-chain
|
|
4
|
+
# poisoning of your Claude Code config (NOT prevention of Claude's
|
|
5
|
+
# own edits — that's hook-tamper-guard / mcp-config-freeze)
|
|
6
|
+
# ================================================================
|
|
7
|
+
# PURPOSE:
|
|
8
|
+
# A malicious npm package's post-install script, or a malicious MCP
|
|
9
|
+
# server, can rewrite ~/.claude.json / ~/.claude/settings.json
|
|
10
|
+
# *outside* Claude Code entirely — so no PreToolUse hook ever fires.
|
|
11
|
+
# Two reported shapes (June 2026 wave + Mitiga Labs / CVE-2025-59536):
|
|
12
|
+
# - An injected hook (e.g. SessionStart) whose command calls out to
|
|
13
|
+
# the network or evals a payload, to exfiltrate keys on next open.
|
|
14
|
+
# - An mcpServers entry whose endpoint is rewritten to a localhost
|
|
15
|
+
# proxy or an unfamiliar external host, so authenticated MCP
|
|
16
|
+
# traffic (and OAuth tokens) is routed through attacker infra.
|
|
17
|
+
# The existing guards PREVENT Claude from editing config and FREEZE
|
|
18
|
+
# mid-session additions, but nothing AUDITS config that was already
|
|
19
|
+
# poisoned from outside. This fills that gap.
|
|
20
|
+
#
|
|
21
|
+
# HOW IT WORKS: SessionStart hook. Read-only. Scans the config files,
|
|
22
|
+
# flags hook commands containing network/eval indicators and
|
|
23
|
+
# mcpServers entries pointing at external/localhost-proxy endpoints,
|
|
24
|
+
# and prints a warning. It never edits or deletes anything (some of
|
|
25
|
+
# these payloads retaliate by wiping the home dir if tampered with —
|
|
26
|
+
# so this only reports; you review and remediate by hand).
|
|
27
|
+
# Always exits 0 (advisory; never blocks the session).
|
|
28
|
+
#
|
|
29
|
+
# See: CVE-2025-59536 (RCE via malicious hooks in repo settings),
|
|
30
|
+
# CVE-2026-21852 (key exfil via env override), and the Mitiga
|
|
31
|
+
# Labs ~/.claude.json MCP-routing-rewrite disclosure.
|
|
32
|
+
#
|
|
33
|
+
# TRIGGER: SessionStart
|
|
34
|
+
# MATCHER: "" (SessionStart has no matcher)
|
|
35
|
+
#
|
|
36
|
+
# Configuration:
|
|
37
|
+
# CC_MCP_AUDIT_OFF=1 — disable
|
|
38
|
+
# CC_MCP_AUDIT_TRUSTED_HOSTS — colon-separated host substrings to
|
|
39
|
+
# treat as expected (e.g. "githubcopilot.com:api.githubcopilot")
|
|
40
|
+
# ================================================================
|
|
41
|
+
|
|
42
|
+
set -uo pipefail
|
|
43
|
+
|
|
44
|
+
[ "${CC_MCP_AUDIT_OFF:-0}" = "1" ] && exit 0
|
|
45
|
+
command -v jq >/dev/null 2>&1 || exit 0 # fail open: no jq, no audit
|
|
46
|
+
|
|
47
|
+
HOME_DIR="${HOME:-/root}"
|
|
48
|
+
CANDIDATES=(
|
|
49
|
+
"$HOME_DIR/.claude.json"
|
|
50
|
+
"$HOME_DIR/.claude/settings.json"
|
|
51
|
+
"$HOME_DIR/.claude/settings.local.json"
|
|
52
|
+
".claude/settings.json"
|
|
53
|
+
".claude/settings.local.json"
|
|
54
|
+
".mcp.json"
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
# Network / code-exec indicators that almost never belong in a legit
|
|
58
|
+
# hook command. Kept conservative to avoid noise.
|
|
59
|
+
NET_EXEC_RE='curl |wget |\bnc \b|netcat|/dev/tcp/|node +-e|node +--eval|python3? +-c|deno +eval|base64 +-d|base64 +--decode|\beval +"|\beval +\$|bash +-i|sh +-i|powershell +-enc|Invoke-WebRequest|iwr '
|
|
60
|
+
|
|
61
|
+
TRUSTED="${CC_MCP_AUDIT_TRUSTED_HOSTS:-}"
|
|
62
|
+
|
|
63
|
+
findings=0
|
|
64
|
+
note() { echo " ⚠ $*" >&2; findings=$((findings + 1)); }
|
|
65
|
+
|
|
66
|
+
is_trusted() {
|
|
67
|
+
# $1 = string to test; returns 0 if it contains a trusted substring
|
|
68
|
+
[ -n "$TRUSTED" ] || return 1
|
|
69
|
+
local IFS=':' t
|
|
70
|
+
for t in $TRUSTED; do
|
|
71
|
+
[ -n "$t" ] && case "$1" in *"$t"*) return 0;; esac
|
|
72
|
+
done
|
|
73
|
+
return 1
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
audit_file() {
|
|
77
|
+
local f="$1"
|
|
78
|
+
[ -f "$f" ] || return 0
|
|
79
|
+
jq -e . "$f" >/dev/null 2>&1 || return 0 # invalid JSON: other guards handle it
|
|
80
|
+
|
|
81
|
+
# 1) Hook commands (any event) containing network/exec indicators.
|
|
82
|
+
# .hooks is { Event: [ { hooks: [ { command } ] } ] }
|
|
83
|
+
local cmds
|
|
84
|
+
cmds=$(jq -r '
|
|
85
|
+
(.hooks // {}) | to_entries[] | .key as $ev
|
|
86
|
+
| (.value // []) | .[]? | (.hooks // []) | .[]?
|
|
87
|
+
| select(.command != null) | "\($ev)\t\(.command)"
|
|
88
|
+
' "$f" 2>/dev/null)
|
|
89
|
+
if [ -n "$cmds" ]; then
|
|
90
|
+
while IFS=$'\t' read -r ev cmd; do
|
|
91
|
+
[ -z "$cmd" ] && continue
|
|
92
|
+
if printf '%s' "$cmd" | grep -qiE "$NET_EXEC_RE"; then
|
|
93
|
+
is_trusted "$cmd" && continue
|
|
94
|
+
note "[$f] hook '$ev' runs a network/exec command: ${cmd:0:90}"
|
|
95
|
+
fi
|
|
96
|
+
done <<< "$cmds"
|
|
97
|
+
fi
|
|
98
|
+
|
|
99
|
+
# 2) mcpServers endpoints: external URLs / IP literals / localhost proxies.
|
|
100
|
+
# Entry may carry a "url" (http transport) or "command"+"args" (stdio).
|
|
101
|
+
# Use the unit separator (0x1f) — empty fields must NOT collapse, and
|
|
102
|
+
# tab is IFS-whitespace so consecutive tabs around an empty url would
|
|
103
|
+
# merge and shift every field.
|
|
104
|
+
local servers
|
|
105
|
+
servers=$(jq -r '
|
|
106
|
+
(.mcpServers // .mcp_servers // {}) | to_entries[]
|
|
107
|
+
| "\(.key)\((.value.url // ""))\((.value.command // ""))\(((.value.args // []) | join(" ")))"
|
|
108
|
+
' "$f" 2>/dev/null)
|
|
109
|
+
if [ -n "$servers" ]; then
|
|
110
|
+
while IFS=$'\x1f' read -r name url cmd args; do
|
|
111
|
+
[ -z "$name" ] && continue
|
|
112
|
+
local blob="$url $cmd $args"
|
|
113
|
+
is_trusted "$blob" && continue
|
|
114
|
+
# external http(s) endpoint
|
|
115
|
+
if printf '%s' "$url" | grep -qiE '^https?://'; then
|
|
116
|
+
case "$url" in
|
|
117
|
+
http://127.0.0.1*|http://localhost*|http://[::1]*)
|
|
118
|
+
note "[$f] MCP server '$name' routes through a localhost proxy: $url" ;;
|
|
119
|
+
*)
|
|
120
|
+
note "[$f] MCP server '$name' uses an external HTTP endpoint: $url" ;;
|
|
121
|
+
esac
|
|
122
|
+
fi
|
|
123
|
+
# raw IP literal or pipe-to-shell hidden in command/args
|
|
124
|
+
if printf '%s' "$cmd $args" | grep -qiE "$NET_EXEC_RE"; then
|
|
125
|
+
note "[$f] MCP server '$name' command contains a network/exec indicator: ${cmd} ${args}"
|
|
126
|
+
fi
|
|
127
|
+
done <<< "$servers"
|
|
128
|
+
fi
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
for f in "${CANDIDATES[@]}"; do
|
|
132
|
+
audit_file "$f"
|
|
133
|
+
done
|
|
134
|
+
|
|
135
|
+
if [ "$findings" -gt 0 ]; then
|
|
136
|
+
{
|
|
137
|
+
echo ""
|
|
138
|
+
echo "⚠ cc-safe-setup: possible Claude Code config poisoning ($findings finding(s) above)."
|
|
139
|
+
echo " A malicious npm post-install or MCP server can rewrite ~/.claude.json /"
|
|
140
|
+
echo " settings.json from outside Claude, so no PreToolUse hook catches it."
|
|
141
|
+
echo " This is a READ-ONLY warning — verify each item by hand. Do NOT blindly delete"
|
|
142
|
+
echo " (some payloads retaliate). If any is unexpected:"
|
|
143
|
+
echo " 1) update Claude Code (CVE-2025-59536 / CVE-2026-21852 are patched in current builds)"
|
|
144
|
+
echo " 2) rotate the OAuth tokens / API keys reachable from that config"
|
|
145
|
+
echo " 3) remove the injected hook/server entry by hand and review recent npm installs"
|
|
146
|
+
echo " Silence expected entries with CC_MCP_AUDIT_TRUSTED_HOSTS, or CC_MCP_AUDIT_OFF=1."
|
|
147
|
+
} >&2
|
|
148
|
+
fi
|
|
149
|
+
|
|
150
|
+
exit 0
|
|
@@ -34,7 +34,7 @@ if echo "$OUTPUT" | grep -qiE "$SENSITIVE_PATHS"; then
|
|
|
34
34
|
fi
|
|
35
35
|
|
|
36
36
|
# Check for data that looks like secrets in output
|
|
37
|
-
if echo "$OUTPUT" | grep -qE 'sk-[
|
|
37
|
+
if echo "$OUTPUT" | grep -qE '(^|[^A-Za-z0-9])sk-[A-Za-z0-9_-]{20,}|ghp_[a-zA-Z0-9]{30,}|-----BEGIN.*KEY|AKIA[A-Z0-9]{16}'; then
|
|
38
38
|
echo "⚠ MCP DATA BOUNDARY: MCP tool output contains potential secrets" >&2
|
|
39
39
|
echo " Tool: $TOOL" >&2
|
|
40
40
|
echo " Review output for leaked credentials." >&2
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# mcp-misdiagnosis-arrest.sh — Catch the assistant misdiagnosing a silently-
|
|
3
|
+
# dropped MCP connector as "the connector isn't installed", and surface the
|
|
4
|
+
# actual recovery path before the operator wastes a reinstall round-trip.
|
|
5
|
+
#
|
|
6
|
+
# Solves: #60428 ("Slack MCP tools silently deactivate mid-session ~1h
|
|
7
|
+
# uptime; claude mcp list still reports Connected").
|
|
8
|
+
#
|
|
9
|
+
# In that case, an installed MCP connector (Slack, in the reported instance)
|
|
10
|
+
# silently drops out of the model's deferred-tool registry after ~1 hour of
|
|
11
|
+
# uptime. The model then attempts a tool call, gets a missing-tool result,
|
|
12
|
+
# and — guided by current docs/skill prompts — frequently suggests the
|
|
13
|
+
# operator "install the Connector" as the remediation. The reporter
|
|
14
|
+
# documents this as the secondary issue:
|
|
15
|
+
#
|
|
16
|
+
# "That's wrong: the Connector *is* already installed, it was working in
|
|
17
|
+
# this session, and the suggestion sends users on a 30-second wild goose
|
|
18
|
+
# chase before they realize the real fix is restart / new chat /
|
|
19
|
+
# plugin toggle."
|
|
20
|
+
#
|
|
21
|
+
# The actual recovery path the reporter verified (2026-05-19):
|
|
22
|
+
#
|
|
23
|
+
# 1. Open a new chat in the same Claude Code window (re-binds tools in the
|
|
24
|
+
# original session without losing context).
|
|
25
|
+
# 2. Toggle the Connector's Plugin off → on in Customize → Personal plugins.
|
|
26
|
+
# 3. Restart Claude Code (loses session).
|
|
27
|
+
# 4. /clear (nukes context — not a real fix).
|
|
28
|
+
#
|
|
29
|
+
# What does NOT restore the tools: /mcp, /compact, /resume, /config, waiting.
|
|
30
|
+
#
|
|
31
|
+
# This hook runs on Stop, scans the assistant's most recent turn for
|
|
32
|
+
# misdiagnosis patterns ("you need to install the X Connector", "the X
|
|
33
|
+
# Plugin isn't installed", "the MCP server seems missing"), cross-references
|
|
34
|
+
# against ~/.claude/settings.json to confirm the named connector IS
|
|
35
|
+
# installed, and — if so — emits an advisory with the correct recovery path.
|
|
36
|
+
#
|
|
37
|
+
# Advisory-default (exit 0 + stderr). Strict mode (exit 2) is opt-in via
|
|
38
|
+
# CC_MCP_MISDIAGNOSIS_MODE=strict.
|
|
39
|
+
#
|
|
40
|
+
# Related Issues:
|
|
41
|
+
# #60428 — Slack MCP tools silently deactivate (the primary)
|
|
42
|
+
#
|
|
43
|
+
# TRIGGER: Stop
|
|
44
|
+
# MATCHER: ""
|
|
45
|
+
#
|
|
46
|
+
# CONFIGURATION (environment variables):
|
|
47
|
+
# CC_MCP_MISDIAGNOSIS_MODE "strict" → exit 2 when misdiagnosis is
|
|
48
|
+
# detected against an installed connector.
|
|
49
|
+
# Default: advisory (exit 0).
|
|
50
|
+
# CC_MCP_MISDIAGNOSIS_DISABLE "1" → skip the gate entirely.
|
|
51
|
+
# CC_MCP_SETTINGS_PATH Override the settings.json path used to
|
|
52
|
+
# confirm connector installation. Default:
|
|
53
|
+
# ~/.claude/settings.json. Tests use this
|
|
54
|
+
# to point at a fixture file.
|
|
55
|
+
#
|
|
56
|
+
# USAGE (settings.json):
|
|
57
|
+
# {
|
|
58
|
+
# "hooks": {
|
|
59
|
+
# "Stop": [{
|
|
60
|
+
# "matcher": "",
|
|
61
|
+
# "hooks": [{
|
|
62
|
+
# "type": "command",
|
|
63
|
+
# "command": "~/.claude/hooks/mcp-misdiagnosis-arrest.sh"
|
|
64
|
+
# }]
|
|
65
|
+
# }]
|
|
66
|
+
# }
|
|
67
|
+
# }
|
|
68
|
+
|
|
69
|
+
set -uo pipefail
|
|
70
|
+
|
|
71
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
72
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
73
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
74
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
75
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
76
|
+
_nojq_warned="/tmp/cc-nojq-warned-mcp-misdiagnosis-arrest-$PPID"
|
|
77
|
+
[ -f "$_nojq_warned" ] || {
|
|
78
|
+
echo "WARNING [mcp-misdiagnosis-arrest]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
79
|
+
: > "$_nojq_warned"
|
|
80
|
+
}
|
|
81
|
+
fi
|
|
82
|
+
|
|
83
|
+
[ "${CC_MCP_MISDIAGNOSIS_DISABLE:-0}" = "1" ] && exit 0
|
|
84
|
+
|
|
85
|
+
INPUT=$(cat 2>/dev/null || true)
|
|
86
|
+
[ -z "$INPUT" ] && exit 0
|
|
87
|
+
|
|
88
|
+
SETTINGS_PATH="${CC_MCP_SETTINGS_PATH:-$HOME/.claude/settings.json}"
|
|
89
|
+
|
|
90
|
+
# Extract the assistant's last message text. Stop-hook input shape varies
|
|
91
|
+
# across Claude Code versions; try several keys (matching the precedent set
|
|
92
|
+
# in closure-word-verify-gate.sh).
|
|
93
|
+
ASSISTANT_TEXT=$(printf '%s' "$INPUT" | jq -r '
|
|
94
|
+
.transcript[-1].content //
|
|
95
|
+
.last_assistant_message //
|
|
96
|
+
.stop_input.assistant_text //
|
|
97
|
+
.assistant_message //
|
|
98
|
+
empty
|
|
99
|
+
' 2>/dev/null)
|
|
100
|
+
|
|
101
|
+
[ -z "$ASSISTANT_TEXT" ] && exit 0
|
|
102
|
+
|
|
103
|
+
# Misdiagnosis patterns. The shape we want to catch is:
|
|
104
|
+
# "<thing> Connector/Plugin/MCP server isn't installed / needs to be
|
|
105
|
+
# installed / is missing / not configured"
|
|
106
|
+
# We intentionally over-match a little; the false-positive cost is a
|
|
107
|
+
# stderr advisory, the false-negative cost is the operator on a reinstall
|
|
108
|
+
# wild goose chase.
|
|
109
|
+
MISDIAG_PATTERN='(([Cc]onnector|[Pp]lugin|[Mm]CP[[:space:]]+[Ss]erver)[[:space:]]+(isn'\''t|is[[:space:]]+not|needs[[:space:]]+to[[:space:]]+be|appears[[:space:]]+to[[:space:]]+be|seems[[:space:]]+to[[:space:]]+be|is)[[:space:]]+(installed|configured|missing|unavailable|set[[:space:]]+up)|need[[:space:]]+to[[:space:]]+install[[:space:]]+the[[:space:]]+[A-Za-z][A-Za-z0-9_-]*[[:space:]]+(Connector|Plugin)|install[[:space:]]+the[[:space:]]+[A-Za-z][A-Za-z0-9_-]*[[:space:]]+(Connector|Plugin)[[:space:]]+(first|to[[:space:]]+use|before)|[Mm]CP[[:space:]]+(tool|tools)[[:space:]]+(are|aren'\''t|is|isn'\''t)[[:space:]]+(missing|unavailable|registered|available))'
|
|
110
|
+
|
|
111
|
+
if ! printf '%s' "$ASSISTANT_TEXT" | grep -Eq "$MISDIAG_PATTERN"; then
|
|
112
|
+
exit 0
|
|
113
|
+
fi
|
|
114
|
+
|
|
115
|
+
# Misdiagnosis language matched. Now check: is any MCP connector / plugin
|
|
116
|
+
# actually installed? If yes, the misdiagnosis is wrong and we should warn.
|
|
117
|
+
# If no installed connectors, the assistant's "isn't installed" claim might
|
|
118
|
+
# be correct — stay silent rather than false-positive.
|
|
119
|
+
|
|
120
|
+
if [ ! -r "$SETTINGS_PATH" ]; then
|
|
121
|
+
# No readable settings to confirm against — refuse to false-positive.
|
|
122
|
+
exit 0
|
|
123
|
+
fi
|
|
124
|
+
|
|
125
|
+
# Look for any of:
|
|
126
|
+
# * an enabledPlugins entry like "slack@claude-plugins-official": true
|
|
127
|
+
# * an mcpServers entry (any key under .mcpServers)
|
|
128
|
+
# * a plugins block with any entry
|
|
129
|
+
INSTALLED_CONNECTORS=$(jq -r '
|
|
130
|
+
[
|
|
131
|
+
(.enabledPlugins // {} | to_entries | map(select(.value == true) | .key)),
|
|
132
|
+
(.mcpServers // {} | keys),
|
|
133
|
+
(.plugins // {} | keys)
|
|
134
|
+
] | add | unique | .[]
|
|
135
|
+
' "$SETTINGS_PATH" 2>/dev/null)
|
|
136
|
+
|
|
137
|
+
if [ -z "$INSTALLED_CONNECTORS" ]; then
|
|
138
|
+
# Nothing installed → assistant's "isn't installed" may be correct.
|
|
139
|
+
exit 0
|
|
140
|
+
fi
|
|
141
|
+
|
|
142
|
+
# Try to extract the specific connector name the assistant referenced, so
|
|
143
|
+
# we can match it against the installed set (most precise warning). If we
|
|
144
|
+
# cannot extract a name, we still warn — any installed connector means the
|
|
145
|
+
# generic "you need to install one" advice is at least partly wrong.
|
|
146
|
+
NAMED_CONNECTOR=$(printf '%s' "$ASSISTANT_TEXT" \
|
|
147
|
+
| grep -Eio '(install[[:space:]]+the[[:space:]]+)?[A-Za-z][A-Za-z0-9_-]*[[:space:]]+(Connector|Plugin|MCP[[:space:]]+Server)' \
|
|
148
|
+
| head -1 \
|
|
149
|
+
| sed -E 's/^install[[:space:]]+the[[:space:]]+//I; s/[[:space:]]+(Connector|Plugin|MCP[[:space:]]+Server)$//I')
|
|
150
|
+
|
|
151
|
+
NAMED_MATCH=""
|
|
152
|
+
if [ -n "$NAMED_CONNECTOR" ]; then
|
|
153
|
+
# Case-insensitive substring match against installed connector keys.
|
|
154
|
+
NAMED_LOWER=$(printf '%s' "$NAMED_CONNECTOR" | tr '[:upper:]' '[:lower:]')
|
|
155
|
+
while IFS= read -r installed; do
|
|
156
|
+
installed_lower=$(printf '%s' "$installed" | tr '[:upper:]' '[:lower:]')
|
|
157
|
+
if printf '%s' "$installed_lower" | grep -Fq "$NAMED_LOWER"; then
|
|
158
|
+
NAMED_MATCH="$installed"
|
|
159
|
+
break
|
|
160
|
+
fi
|
|
161
|
+
done <<EOF
|
|
162
|
+
$INSTALLED_CONNECTORS
|
|
163
|
+
EOF
|
|
164
|
+
fi
|
|
165
|
+
|
|
166
|
+
# Build advisory.
|
|
167
|
+
{
|
|
168
|
+
echo "<system-reminder>"
|
|
169
|
+
echo "MCP MISDIAGNOSIS LIKELY — the assistant's last turn suggested an MCP"
|
|
170
|
+
echo "connector/plugin needs to be installed, but the operator's settings"
|
|
171
|
+
echo "already show installed MCP connectors:"
|
|
172
|
+
echo ""
|
|
173
|
+
printf '%s\n' "$INSTALLED_CONNECTORS" | sed 's/^/ - /'
|
|
174
|
+
echo ""
|
|
175
|
+
if [ -n "$NAMED_MATCH" ]; then
|
|
176
|
+
echo "Specifically, '$NAMED_MATCH' is already installed and configured."
|
|
177
|
+
elif [ -n "$NAMED_CONNECTOR" ]; then
|
|
178
|
+
echo "The named connector '$NAMED_CONNECTOR' was not found in settings,"
|
|
179
|
+
echo "but other connectors are installed — double-check the name before"
|
|
180
|
+
echo "recommending a reinstall."
|
|
181
|
+
fi
|
|
182
|
+
echo ""
|
|
183
|
+
echo "Known pattern (#60428): MCP connectors can silently drop out of the"
|
|
184
|
+
echo "session's deferred-tool registry after ~1h uptime while 'claude mcp"
|
|
185
|
+
echo "list' continues to report 'Connected'. The model then misdiagnoses"
|
|
186
|
+
echo "this as missing installation."
|
|
187
|
+
echo ""
|
|
188
|
+
echo "Actual recovery path (verified 2026-05-19):"
|
|
189
|
+
echo " 1. Open a new chat in the same Claude Code window."
|
|
190
|
+
echo " (Re-binds tools in the original session without losing context.)"
|
|
191
|
+
echo " 2. Toggle the connector's Plugin off → on in Customize → Personal"
|
|
192
|
+
echo " plugins."
|
|
193
|
+
echo " 3. Restart Claude Code (loses session)."
|
|
194
|
+
echo ""
|
|
195
|
+
echo "What does NOT restore them: /mcp, /compact, /resume, /config, waiting,"
|
|
196
|
+
echo "or reinstalling the connector."
|
|
197
|
+
echo ""
|
|
198
|
+
echo "Before sending the assistant's last turn to the operator, replace the"
|
|
199
|
+
echo "installation advice with the recovery steps above."
|
|
200
|
+
echo ""
|
|
201
|
+
echo "To disable this gate (for genuinely uninstalled-connector flows),"
|
|
202
|
+
echo "set CC_MCP_MISDIAGNOSIS_DISABLE=1 in your environment."
|
|
203
|
+
echo "</system-reminder>"
|
|
204
|
+
} >&2
|
|
205
|
+
|
|
206
|
+
if [ "${CC_MCP_MISDIAGNOSIS_MODE:-advisory}" = "strict" ]; then
|
|
207
|
+
exit 2
|
|
208
|
+
fi
|
|
209
|
+
exit 0
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# mcp-orphan-leak-warner.sh — At session start, warn if leaked MCP / sub-agent
|
|
3
|
+
# server processes from earlier sessions are still alive and piling up, before
|
|
4
|
+
# they exhaust RAM/swap into an OOM / kernel panic.
|
|
5
|
+
#
|
|
6
|
+
# Solves a recurring May–June 2026 class (anthropics/claude-code #64366, #68647,
|
|
7
|
+
# #66020, #68933, #61748, …): MCP servers and sub-agent children outlive the
|
|
8
|
+
# session that spawned them — reparented to PID 1 — and accumulate until the box
|
|
9
|
+
# swaps to death or kernel-panics. This is *process/memory* exhaustion, distinct
|
|
10
|
+
# from MCP token/context bloat. The actionable moment is the start of your NEXT
|
|
11
|
+
# session, before you spawn more.
|
|
12
|
+
#
|
|
13
|
+
# Precision: ADVISORY ONLY. This hook never kills anything. Being reparented to
|
|
14
|
+
# PID 1 is not sufficient to call a process an orphan (legitimate daemons are
|
|
15
|
+
# PID-1-parented too), so it flags a process ONLY when it is BOTH (a) reparented
|
|
16
|
+
# to PID 1 AND (b) matches an MCP/agent-server command signature, and even then
|
|
17
|
+
# it only *reports*. You decide what to reap. It also stays silent unless the
|
|
18
|
+
# leak is real (>= MIN_COUNT orphans), to avoid nagging.
|
|
19
|
+
#
|
|
20
|
+
# TRIGGER: SessionStart
|
|
21
|
+
|
|
22
|
+
MIN_COUNT=${CC_MCP_ORPHAN_MIN_COUNT:-3} # warn only at/above this many orphans
|
|
23
|
+
MIN_AGE=${CC_MCP_ORPHAN_MIN_AGE:-300} # seconds; ignore freshly-started servers
|
|
24
|
+
|
|
25
|
+
# MCP / agent-server signatures: how Claude Code spawns MCP servers (npx/uvx
|
|
26
|
+
# launchers, @modelcontextprotocol packages, *mcp-server* binaries). Tuned to
|
|
27
|
+
# avoid matching editors, shells, or your own long-running daemons.
|
|
28
|
+
SIG='@modelcontextprotocol|mcp-server-|modelcontextprotocol|[/ ]mcp([ _-]|$)|uvx[^|]*mcp|npx[^|]*mcp'
|
|
29
|
+
|
|
30
|
+
read -r COUNT TOTAL_KB < <(ps -eo ppid=,etimes=,rss=,args= 2>/dev/null \
|
|
31
|
+
| awk -v sig="$SIG" -v minage="$MIN_AGE" '
|
|
32
|
+
$1==1 && $2>=minage {
|
|
33
|
+
args=""; for(i=4;i<=NF;i++) args=args (i>4?" ":"") $i
|
|
34
|
+
if (args ~ sig) { c++; kb+=$3 }
|
|
35
|
+
}
|
|
36
|
+
END { print c+0, kb+0 }')
|
|
37
|
+
|
|
38
|
+
[ "${COUNT:-0}" -lt "$MIN_COUNT" ] && exit 0
|
|
39
|
+
|
|
40
|
+
{
|
|
41
|
+
echo "NOTE: $COUNT leaked MCP / sub-agent server process(es) from earlier sessions"
|
|
42
|
+
echo "are still alive (~$((TOTAL_KB/1024)) MB resident, reparented to PID 1). Left to"
|
|
43
|
+
echo "pile up these can exhaust RAM/swap into an OOM or kernel panic (#64366, #68647)."
|
|
44
|
+
echo "Review them: ps -o pid,etimes,rss,args -p \$(pgrep -f 'mcp-server-|@modelcontextprotocol')"
|
|
45
|
+
echo "Reap safely: kill the ones you recognize as dead-session leftovers."
|
|
46
|
+
echo "Prevent a panic: cap memory for heavy sessions: ( ulimit -v 8000000; claude )"
|
|
47
|
+
} >&2
|
|
48
|
+
|
|
49
|
+
exit 0
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# mcp-permissions-ask-warner.sh — Warn when permissions.ask has MCP entries
|
|
3
|
+
#
|
|
4
|
+
# Solves: github.com/anthropics/claude-code/issues/58289
|
|
5
|
+
# "permissions.ask is ignored for MCP tools in default mode"
|
|
6
|
+
#
|
|
7
|
+
# Reporter (2026-05-13, Claude Code 2.1.139 + Bedrock): MCP tool
|
|
8
|
+
# entries in the `permissions.ask` array of `~/.claude/settings.json`
|
|
9
|
+
# do not trigger a confirmation prompt. The MCP tool call executes
|
|
10
|
+
# immediately, the same as if the entry were in `allow`. The user's
|
|
11
|
+
# intent ("ask before running this MCP tool") diverges from the
|
|
12
|
+
# system's behavior ("run without asking") with no visible signal.
|
|
13
|
+
#
|
|
14
|
+
# WHY THIS MATTERS:
|
|
15
|
+
# permissions.ask is the gating mechanism users rely on to keep a human
|
|
16
|
+
# in the loop for sensitive MCP tools (database writes, deployment, file
|
|
17
|
+
# delete, payment). If this gating is silently bypassed, sensitive MCP
|
|
18
|
+
# tools fire without the user's review. This is a textbook claim-verify
|
|
19
|
+
# gap: the user believes "this is gated" while the system has already
|
|
20
|
+
# run the tool. Worse, the MCP surface is where many irreversible
|
|
21
|
+
# operations live (cloud resource changes, payment processing, message
|
|
22
|
+
# sending).
|
|
23
|
+
#
|
|
24
|
+
# TRIGGER: SessionStart MATCHER: ""
|
|
25
|
+
#
|
|
26
|
+
# HOW IT WORKS:
|
|
27
|
+
# At session start:
|
|
28
|
+
# 1. Find the relevant settings.json files.
|
|
29
|
+
# Default order: ~/.claude/settings.json, then $CLAUDE_PROJECT_DIR/.claude/settings.json
|
|
30
|
+
# 2. For each file, parse the permissions.ask array.
|
|
31
|
+
# 3. Filter entries to MCP tools (starting with "mcp__").
|
|
32
|
+
# 4. If any MCP entries are found, emit a clear warning listing them,
|
|
33
|
+
# explaining the known bypass, and suggesting two workarounds:
|
|
34
|
+
# (a) Move sensitive MCP entries from permissions.ask to permissions.deny
|
|
35
|
+
# (deny still works correctly per the reporter)
|
|
36
|
+
# (b) Use `--permission-mode plan` mode for the session if MCP-heavy
|
|
37
|
+
#
|
|
38
|
+
# CONFIGURATION:
|
|
39
|
+
# CC_MCP_ASK_DISABLE=1 — disable the hook entirely
|
|
40
|
+
# CC_MCP_ASK_ACTION — "warn" (default) or "block" (exit 2)
|
|
41
|
+
# CC_MCP_ASK_LOG — log file path (default /tmp/cc-mcp-ask.log)
|
|
42
|
+
# CC_MCP_ASK_FILES — comma-separated settings.json paths to scan
|
|
43
|
+
# (default: $HOME/.claude/settings.json plus
|
|
44
|
+
# $CLAUDE_PROJECT_DIR/.claude/settings.json)
|
|
45
|
+
#
|
|
46
|
+
# Usage:
|
|
47
|
+
# {
|
|
48
|
+
# "hooks": {
|
|
49
|
+
# "SessionStart": [{
|
|
50
|
+
# "hooks": [{ "type": "command", "command": "~/.claude/hooks/mcp-permissions-ask-warner.sh" }]
|
|
51
|
+
# }]
|
|
52
|
+
# }
|
|
53
|
+
# }
|
|
54
|
+
|
|
55
|
+
if [ "${CC_MCP_ASK_DISABLE:-0}" = "1" ]; then
|
|
56
|
+
exit 0
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
60
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
61
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
62
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
63
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
64
|
+
_nojq_warned="/tmp/cc-nojq-warned-mcp-permissions-ask-warner-$PPID"
|
|
65
|
+
[ -f "$_nojq_warned" ] || {
|
|
66
|
+
echo "WARNING [mcp-permissions-ask-warner]: jq not found - this hook cannot read your settings files and is NOT protecting you. Install jq." >&2
|
|
67
|
+
: > "$_nojq_warned"
|
|
68
|
+
}
|
|
69
|
+
fi
|
|
70
|
+
|
|
71
|
+
ACTION="${CC_MCP_ASK_ACTION:-warn}"
|
|
72
|
+
LOG_FILE="${CC_MCP_ASK_LOG:-/tmp/cc-mcp-ask.log}"
|
|
73
|
+
|
|
74
|
+
# Determine which settings.json files to scan
|
|
75
|
+
if [ -n "$CC_MCP_ASK_FILES" ]; then
|
|
76
|
+
IFS=',' read -ra FILES <<< "$CC_MCP_ASK_FILES"
|
|
77
|
+
else
|
|
78
|
+
FILES=()
|
|
79
|
+
[ -f "$HOME/.claude/settings.json" ] && FILES+=("$HOME/.claude/settings.json")
|
|
80
|
+
if [ -n "$CLAUDE_PROJECT_DIR" ] && [ -f "$CLAUDE_PROJECT_DIR/.claude/settings.json" ]; then
|
|
81
|
+
FILES+=("$CLAUDE_PROJECT_DIR/.claude/settings.json")
|
|
82
|
+
fi
|
|
83
|
+
fi
|
|
84
|
+
|
|
85
|
+
# Collect MCP entries across all files
|
|
86
|
+
MCP_ENTRIES=()
|
|
87
|
+
SOURCE_FILES=()
|
|
88
|
+
|
|
89
|
+
for f in "${FILES[@]}"; do
|
|
90
|
+
f=$(echo "$f" | xargs) # trim
|
|
91
|
+
[ -z "$f" ] && continue
|
|
92
|
+
[ ! -f "$f" ] && continue
|
|
93
|
+
# Extract permissions.ask entries that look like MCP tools
|
|
94
|
+
ENTRIES=$(jq -r '
|
|
95
|
+
(.permissions.ask // [])
|
|
96
|
+
| map(select(type == "string" and startswith("mcp__")))
|
|
97
|
+
| .[]
|
|
98
|
+
' "$f" 2>/dev/null)
|
|
99
|
+
if [ -n "$ENTRIES" ]; then
|
|
100
|
+
while IFS= read -r entry; do
|
|
101
|
+
[ -z "$entry" ] && continue
|
|
102
|
+
MCP_ENTRIES+=("$entry")
|
|
103
|
+
SOURCE_FILES+=("$f")
|
|
104
|
+
done <<< "$ENTRIES"
|
|
105
|
+
fi
|
|
106
|
+
done
|
|
107
|
+
|
|
108
|
+
# No MCP ask entries → silent pass
|
|
109
|
+
if [ ${#MCP_ENTRIES[@]} -eq 0 ]; then
|
|
110
|
+
exit 0
|
|
111
|
+
fi
|
|
112
|
+
|
|
113
|
+
# Log + emit
|
|
114
|
+
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
|
|
115
|
+
for i in "${!MCP_ENTRIES[@]}"; do
|
|
116
|
+
echo "[$TIMESTAMP] mcp_in_ask entry=${MCP_ENTRIES[$i]} source=${SOURCE_FILES[$i]} action=$ACTION" >> "$LOG_FILE"
|
|
117
|
+
done
|
|
118
|
+
|
|
119
|
+
MSG="⚠️ permissions.ask contains MCP tool entries that may be silently bypassed"
|
|
120
|
+
MSG+=$'\n'
|
|
121
|
+
MSG+=$'\n'" Affected entries:"
|
|
122
|
+
for i in "${!MCP_ENTRIES[@]}"; do
|
|
123
|
+
MSG+=$'\n'" - ${MCP_ENTRIES[$i]} (in ${SOURCE_FILES[$i]})"
|
|
124
|
+
done
|
|
125
|
+
MSG+=$'\n'
|
|
126
|
+
MSG+=$'\n'" Known bug: github.com/anthropics/claude-code/issues/58289"
|
|
127
|
+
MSG+=$'\n'" In Claude Code 2.1.139 (and possibly other versions), permissions.ask"
|
|
128
|
+
MSG+=$'\n'" entries for MCP tools (names starting with mcp__) do not trigger a"
|
|
129
|
+
MSG+=$'\n'" confirmation prompt in default mode. The tool executes immediately,"
|
|
130
|
+
MSG+=$'\n'" as if it were in permissions.allow. Reported on Bedrock (us.anthropic."
|
|
131
|
+
MSG+=$'\n'" claude-opus-4-7), likely also affects other providers."
|
|
132
|
+
MSG+=$'\n'
|
|
133
|
+
MSG+=$'\n'" Workarounds (pick one):"
|
|
134
|
+
MSG+=$'\n'" 1. Move the listed entries from permissions.ask to permissions.deny."
|
|
135
|
+
MSG+=$'\n'" deny still gates correctly per the bug report. The tool will be"
|
|
136
|
+
MSG+=$'\n'" refused outright; you can override case-by-case in the chat."
|
|
137
|
+
MSG+=$'\n'" 2. Run the session with --permission-mode plan, which forces an"
|
|
138
|
+
MSG+=$'\n'" explicit plan-approval step before any tool execution."
|
|
139
|
+
MSG+=$'\n'" 3. Remove the entry from permissions.ask if the tool is acceptable"
|
|
140
|
+
MSG+=$'\n'" to run without confirmation."
|
|
141
|
+
MSG+=$'\n'
|
|
142
|
+
MSG+=$'\n'" This warning fires once per session start. To silence it after you've"
|
|
143
|
+
MSG+=$'\n'" adopted a workaround, set CC_MCP_ASK_DISABLE=1 in your environment."
|
|
144
|
+
|
|
145
|
+
if [ "$ACTION" = "block" ]; then
|
|
146
|
+
printf '%s\n' "$MSG" >&2
|
|
147
|
+
exit 2
|
|
148
|
+
else
|
|
149
|
+
printf '%s\n' "$MSG" >&2
|
|
150
|
+
exit 0
|
|
151
|
+
fi
|