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,103 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# trustfall-mcp-injection-guard.sh — Detect TrustFall-style MCP injection settings.
|
|
3
|
+
#
|
|
4
|
+
# CVE class: project-scoped settings as MCP injection vector
|
|
5
|
+
# Reference: Adversa AI 2026-05-07 disclosure (TrustFall PoC)
|
|
6
|
+
# The Register: https://www.theregister.com/security/2026/05/07/claude-code-trust-prompt-can-trigger-one-click-rce/
|
|
7
|
+
# Related CVE: CVE-2026-39861 (sandbox escape via symlink)
|
|
8
|
+
#
|
|
9
|
+
# Solves: A cloned repo can ship .mcp.json + .claude/settings.json that auto-
|
|
10
|
+
# enable MCP servers via enableAllProjectMcpServers / enabledMcpjsonServers
|
|
11
|
+
# and self-allow tool calls via permissions.allow. When the user clicks
|
|
12
|
+
# "Yes, I trust this folder" once, attacker-controlled servers spawn as
|
|
13
|
+
# unsandboxed Node.js processes with full user privileges, with no per-
|
|
14
|
+
# server consent prompt.
|
|
15
|
+
#
|
|
16
|
+
# How it works: SessionStart hook that scans the current workspace's .claude/
|
|
17
|
+
# settings.json and .mcp.json for the three settings Adversa AI flagged. If
|
|
18
|
+
# any are present, prints a warning to stderr with the file path, the matching
|
|
19
|
+
# keys, and the recommended manual review step.
|
|
20
|
+
#
|
|
21
|
+
# CONFIG:
|
|
22
|
+
# CC_TRUSTFALL_BLOCK=1 — exit 2 instead of 0 (advisory by default)
|
|
23
|
+
# CC_TRUSTFALL_EXTRA_KEYS — colon-separated extra keys to flag
|
|
24
|
+
#
|
|
25
|
+
# TRIGGER: SessionStart
|
|
26
|
+
# MATCHER: ""
|
|
27
|
+
|
|
28
|
+
set -euo pipefail
|
|
29
|
+
|
|
30
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
31
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
32
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
33
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
34
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
35
|
+
_nojq_warned="/tmp/cc-nojq-warned-trustfall-mcp-injection-guard-$PPID"
|
|
36
|
+
[ -f "$_nojq_warned" ] || {
|
|
37
|
+
echo "WARNING [trustfall-mcp-injection-guard]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
38
|
+
: > "$_nojq_warned"
|
|
39
|
+
}
|
|
40
|
+
fi
|
|
41
|
+
|
|
42
|
+
INPUT=$(cat 2>/dev/null || true)
|
|
43
|
+
|
|
44
|
+
# SessionStart hooks may receive cwd in the input JSON; fall back to PWD.
|
|
45
|
+
WORKSPACE=$(echo "$INPUT" | jq -r '.cwd // empty' 2>/dev/null)
|
|
46
|
+
[ -z "$WORKSPACE" ] && WORKSPACE="$PWD"
|
|
47
|
+
|
|
48
|
+
DEFAULT_KEYS="enableAllProjectMcpServers enabledMcpjsonServers permissions.allow"
|
|
49
|
+
EXTRA_KEYS="${CC_TRUSTFALL_EXTRA_KEYS:-}"
|
|
50
|
+
EXTRA_KEYS_SPACED=$(echo "$EXTRA_KEYS" | tr ':' ' ')
|
|
51
|
+
ALL_KEYS="$DEFAULT_KEYS $EXTRA_KEYS_SPACED"
|
|
52
|
+
|
|
53
|
+
# Files to scan in the workspace.
|
|
54
|
+
TARGETS=(
|
|
55
|
+
"$WORKSPACE/.claude/settings.json"
|
|
56
|
+
"$WORKSPACE/.claude/settings.local.json"
|
|
57
|
+
"$WORKSPACE/.mcp.json"
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
found_any=0
|
|
61
|
+
for f in "${TARGETS[@]}"; do
|
|
62
|
+
[ -f "$f" ] || continue
|
|
63
|
+
|
|
64
|
+
# Skip non-JSON or empty files cheaply.
|
|
65
|
+
head -c 1 "$f" 2>/dev/null | grep -q '[{[]' || continue
|
|
66
|
+
|
|
67
|
+
matches=""
|
|
68
|
+
for k in $ALL_KEYS; do
|
|
69
|
+
# Use jq path semantics: dot notation expands to nested lookup.
|
|
70
|
+
# `jq -e '.foo.bar' file` exits 0 if non-null, 1 otherwise.
|
|
71
|
+
if jq -e ".${k} // empty" "$f" >/dev/null 2>&1; then
|
|
72
|
+
matches="${matches} ${k}"
|
|
73
|
+
fi
|
|
74
|
+
done
|
|
75
|
+
|
|
76
|
+
if [ -n "$matches" ]; then
|
|
77
|
+
if [ "$found_any" -eq 0 ]; then
|
|
78
|
+
echo "WARNING: TrustFall-style MCP injection settings detected in this workspace." >&2
|
|
79
|
+
echo " Class: project-scoped settings as MCP injection vector (Adversa AI 2026-05-07)." >&2
|
|
80
|
+
echo " Risk: cloned repo could spawn attacker-controlled MCP servers as unsandboxed processes." >&2
|
|
81
|
+
echo "" >&2
|
|
82
|
+
found_any=1
|
|
83
|
+
fi
|
|
84
|
+
echo " File: $f" >&2
|
|
85
|
+
echo " Matched keys:${matches}" >&2
|
|
86
|
+
fi
|
|
87
|
+
done
|
|
88
|
+
|
|
89
|
+
if [ "$found_any" -eq 1 ]; then
|
|
90
|
+
echo "" >&2
|
|
91
|
+
echo " Recommended review:" >&2
|
|
92
|
+
echo " 1. Open each flagged file and check who set those keys." >&2
|
|
93
|
+
echo " 2. If the repo was cloned from an untrusted source, do NOT proceed." >&2
|
|
94
|
+
echo " 3. If you set them intentionally, this hook can be silenced per-project" >&2
|
|
95
|
+
echo " by adding it to .claude/settings.local.json hooks bypass list." >&2
|
|
96
|
+
echo "" >&2
|
|
97
|
+
if [ "${CC_TRUSTFALL_BLOCK:-0}" = "1" ]; then
|
|
98
|
+
echo "BLOCKED: CC_TRUSTFALL_BLOCK=1 set; aborting session start." >&2
|
|
99
|
+
exit 2
|
|
100
|
+
fi
|
|
101
|
+
fi
|
|
102
|
+
|
|
103
|
+
exit 0
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ================================================================
|
|
3
|
+
# ultrareview-large-diff-advisor.sh — SessionStart advisory for
|
|
4
|
+
# Cluster 18 candidate (/ultrareview crash burns credit on large PRs)
|
|
5
|
+
# ================================================================
|
|
6
|
+
# PURPOSE:
|
|
7
|
+
# Between 2026-05-27 and 2026-05-29, six independent issues
|
|
8
|
+
# reported the same shape of failure: invoking /ultrareview on a
|
|
9
|
+
# large PR causes a server-side crash with no findings returned,
|
|
10
|
+
# yet the user's daily credit counter is still decremented.
|
|
11
|
+
#
|
|
12
|
+
# The shared error: `Review crashed before producing findings.
|
|
13
|
+
# See session logs for details.`
|
|
14
|
+
#
|
|
15
|
+
# Issues:
|
|
16
|
+
# #62696 3rd crash burns credit (v2.1.150)
|
|
17
|
+
# #62709 PR #7 review crashed, 0 findings
|
|
18
|
+
# #62787 2 consecutive crashes, 2/3 credits burned
|
|
19
|
+
# (21 files / 84KB diff)
|
|
20
|
+
# #62876 Find phase crash, Setup phase complete
|
|
21
|
+
# #63117 1 crash decrements credit
|
|
22
|
+
# (6 files / 2,185 insertions)
|
|
23
|
+
# #63522 same-branch 2 consecutive crashes, 2/3 credits burned
|
|
24
|
+
#
|
|
25
|
+
# Common structural traits:
|
|
26
|
+
# 1. Large PRs crash at a noticeably higher rate
|
|
27
|
+
# 2. Find phase is the failure point
|
|
28
|
+
# 3. Retrying on the same branch produces the same crash
|
|
29
|
+
#
|
|
30
|
+
# The crash is server-side. A user-side hook cannot prevent it.
|
|
31
|
+
# This hook surfaces the advisory at SessionStart so the operator
|
|
32
|
+
# knows the size thresholds and the three-axis defense BEFORE
|
|
33
|
+
# they invoke /ultrareview against a large PR. It does not block.
|
|
34
|
+
#
|
|
35
|
+
# DETECTION:
|
|
36
|
+
# At SessionStart, the hook measures the current branch's diff
|
|
37
|
+
# against a base branch (default "main") using
|
|
38
|
+
# `git diff --shortstat <base>...HEAD`. It extracts file count
|
|
39
|
+
# and insertion count and compares against thresholds.
|
|
40
|
+
#
|
|
41
|
+
# - file count >= BLOCK threshold OR
|
|
42
|
+
# lines insertions >= BLOCK threshold
|
|
43
|
+
# → elevated crash rate advisory
|
|
44
|
+
# - file count >= WARN threshold OR
|
|
45
|
+
# lines insertions >= WARN threshold
|
|
46
|
+
# → caution advisory
|
|
47
|
+
# - otherwise → silent (fail open)
|
|
48
|
+
#
|
|
49
|
+
# TRIGGER: SessionStart
|
|
50
|
+
# MATCHER: (none)
|
|
51
|
+
#
|
|
52
|
+
# OUTPUT:
|
|
53
|
+
# Advisory only, never blocks. Prints to stderr.
|
|
54
|
+
#
|
|
55
|
+
# CONFIGURATION:
|
|
56
|
+
# CC_ULTRAREVIEW_ADVISOR_DISABLE=1 — disable entirely
|
|
57
|
+
# CC_ULTRAREVIEW_ADVISOR_QUIET=1 — silence after
|
|
58
|
+
# acknowledgment
|
|
59
|
+
# CC_ULTRAREVIEW_FILES_WARN — file count caution
|
|
60
|
+
# threshold (default 6)
|
|
61
|
+
# CC_ULTRAREVIEW_FILES_BLOCK — file count elevated
|
|
62
|
+
# threshold (default 16)
|
|
63
|
+
# CC_ULTRAREVIEW_LINES_WARN — insertion line caution
|
|
64
|
+
# threshold (default 500)
|
|
65
|
+
# CC_ULTRAREVIEW_LINES_BLOCK — insertion line elevated
|
|
66
|
+
# threshold (default 1500)
|
|
67
|
+
# CC_ULTRAREVIEW_BRANCH_BASE — base branch for diff
|
|
68
|
+
# (default "main")
|
|
69
|
+
# CC_ULTRAREVIEW_GIT_DIR — override working tree
|
|
70
|
+
# (default: current dir)
|
|
71
|
+
#
|
|
72
|
+
# RELATED:
|
|
73
|
+
# Cluster 18 candidate entry, tracked since 2026-05-29
|
|
74
|
+
# English field guide:
|
|
75
|
+
# https://gist.github.com/yurukusa/f7363d83e3f4bcbb1bd7cf66a1c64752
|
|
76
|
+
# Anchor case for resolution tracking:
|
|
77
|
+
# https://github.com/anthropics/claude-code/issues/62696
|
|
78
|
+
#
|
|
79
|
+
# DESIGN NOTES:
|
|
80
|
+
# - The hook does NOT block /ultrareview. The operator decides.
|
|
81
|
+
# Many large PRs do succeed; the elevated rate is not a
|
|
82
|
+
# guarantee of failure. The hook surfaces the trade-off.
|
|
83
|
+
# - When the working tree is not a git repository, or when the
|
|
84
|
+
# base branch does not exist, the hook fails open (exit 0
|
|
85
|
+
# silent). It does NOT warn that detection failed.
|
|
86
|
+
# - The hook reads the stdin JSON envelope but does not use it;
|
|
87
|
+
# SessionStart hooks receive context that is not relevant
|
|
88
|
+
# here. The stdin is consumed to avoid SIGPIPE on the caller.
|
|
89
|
+
|
|
90
|
+
set -u
|
|
91
|
+
|
|
92
|
+
if [ "${CC_ULTRAREVIEW_ADVISOR_DISABLE:-0}" = "1" ]; then
|
|
93
|
+
exit 0
|
|
94
|
+
fi
|
|
95
|
+
if [ "${CC_ULTRAREVIEW_ADVISOR_QUIET:-0}" = "1" ]; then
|
|
96
|
+
exit 0
|
|
97
|
+
fi
|
|
98
|
+
|
|
99
|
+
# Consume stdin if provided (SessionStart hooks receive JSON input)
|
|
100
|
+
if [ ! -t 0 ]; then
|
|
101
|
+
cat >/dev/null 2>&1 || true
|
|
102
|
+
fi
|
|
103
|
+
|
|
104
|
+
FILES_WARN="${CC_ULTRAREVIEW_FILES_WARN:-6}"
|
|
105
|
+
FILES_BLOCK="${CC_ULTRAREVIEW_FILES_BLOCK:-16}"
|
|
106
|
+
LINES_WARN="${CC_ULTRAREVIEW_LINES_WARN:-500}"
|
|
107
|
+
LINES_BLOCK="${CC_ULTRAREVIEW_LINES_BLOCK:-1500}"
|
|
108
|
+
BRANCH_BASE="${CC_ULTRAREVIEW_BRANCH_BASE:-main}"
|
|
109
|
+
|
|
110
|
+
# Validate integer thresholds; fall back to defaults silently
|
|
111
|
+
validate_int() {
|
|
112
|
+
case "$1" in
|
|
113
|
+
''|*[!0-9]*) return 1 ;;
|
|
114
|
+
*) return 0 ;;
|
|
115
|
+
esac
|
|
116
|
+
}
|
|
117
|
+
validate_int "$FILES_WARN" || FILES_WARN=6
|
|
118
|
+
validate_int "$FILES_BLOCK" || FILES_BLOCK=16
|
|
119
|
+
validate_int "$LINES_WARN" || LINES_WARN=500
|
|
120
|
+
validate_int "$LINES_BLOCK" || LINES_BLOCK=1500
|
|
121
|
+
|
|
122
|
+
GIT_DIR="${CC_ULTRAREVIEW_GIT_DIR:-$PWD}"
|
|
123
|
+
|
|
124
|
+
# Detect repo + base branch presence; fail open on any missing
|
|
125
|
+
if ! command -v git >/dev/null 2>&1; then
|
|
126
|
+
exit 0
|
|
127
|
+
fi
|
|
128
|
+
if ! git -C "$GIT_DIR" rev-parse --git-dir >/dev/null 2>&1; then
|
|
129
|
+
exit 0
|
|
130
|
+
fi
|
|
131
|
+
if ! git -C "$GIT_DIR" rev-parse --verify "$BRANCH_BASE" >/dev/null 2>&1; then
|
|
132
|
+
exit 0
|
|
133
|
+
fi
|
|
134
|
+
|
|
135
|
+
# Get the merge-base diff stat between the base branch and HEAD
|
|
136
|
+
SHORTSTAT=$(git -C "$GIT_DIR" diff --shortstat "$BRANCH_BASE"...HEAD 2>/dev/null) || exit 0
|
|
137
|
+
|
|
138
|
+
# Parse: " N files changed, M insertions(+), K deletions(-)"
|
|
139
|
+
# Some outputs omit insertions or deletions; handle both.
|
|
140
|
+
if [ -z "$SHORTSTAT" ]; then
|
|
141
|
+
exit 0
|
|
142
|
+
fi
|
|
143
|
+
|
|
144
|
+
FILES=$(echo "$SHORTSTAT" | grep -oE '[0-9]+ file' | head -n 1 | grep -oE '[0-9]+' || echo 0)
|
|
145
|
+
INSERTIONS=$(echo "$SHORTSTAT" | grep -oE '[0-9]+ insertion' | head -n 1 | grep -oE '[0-9]+' || echo 0)
|
|
146
|
+
|
|
147
|
+
# Default to 0 if extraction fails
|
|
148
|
+
[ -z "$FILES" ] && FILES=0
|
|
149
|
+
[ -z "$INSERTIONS" ] && INSERTIONS=0
|
|
150
|
+
|
|
151
|
+
# Decide severity
|
|
152
|
+
SEVERITY=""
|
|
153
|
+
if [ "$FILES" -ge "$FILES_BLOCK" ] || [ "$INSERTIONS" -ge "$LINES_BLOCK" ]; then
|
|
154
|
+
SEVERITY="elevated"
|
|
155
|
+
elif [ "$FILES" -ge "$FILES_WARN" ] || [ "$INSERTIONS" -ge "$LINES_WARN" ]; then
|
|
156
|
+
SEVERITY="caution"
|
|
157
|
+
fi
|
|
158
|
+
|
|
159
|
+
if [ -z "$SEVERITY" ]; then
|
|
160
|
+
exit 0
|
|
161
|
+
fi
|
|
162
|
+
|
|
163
|
+
{
|
|
164
|
+
echo "ADVISORY: Current branch diff vs $BRANCH_BASE is $FILES files / $INSERTIONS insertions."
|
|
165
|
+
if [ "$SEVERITY" = "elevated" ]; then
|
|
166
|
+
echo " Cluster 18 candidate: /ultrareview crashes at an elevated rate above"
|
|
167
|
+
echo " ${FILES_BLOCK} files or ${LINES_BLOCK} insertions. Six issues over three days"
|
|
168
|
+
echo " (#62696 #62709 #62787 #62876 #63117 #63522) burned credits with no findings."
|
|
169
|
+
else
|
|
170
|
+
echo " Cluster 18 candidate: /ultrareview enters the caution range above"
|
|
171
|
+
echo " ${FILES_WARN} files or ${LINES_WARN} insertions. Crash rate climbs as size grows."
|
|
172
|
+
fi
|
|
173
|
+
echo " Three user-side defenses before invoking /ultrareview:"
|
|
174
|
+
echo " 1. Split the PR into logical chunks (git rebase -i + git checkout -b)"
|
|
175
|
+
echo " 2. Do not retry on the same branch; the same crash burns a second credit"
|
|
176
|
+
echo " 3. Fall back to /code-review (local, no cloud crash exposure)"
|
|
177
|
+
echo " Anchor case to subscribe for the upstream fix signal:"
|
|
178
|
+
echo " https://github.com/anthropics/claude-code/issues/62696"
|
|
179
|
+
echo " Field guide (six issues, three structural traits, defenses):"
|
|
180
|
+
echo " https://gist.github.com/yurukusa/f7363d83e3f4bcbb1bd7cf66a1c64752"
|
|
181
|
+
echo " Silence after acknowledgment: export CC_ULTRAREVIEW_ADVISOR_QUIET=1"
|
|
182
|
+
} >&2
|
|
183
|
+
|
|
184
|
+
exit 0
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# unbounded-output-guard.sh — Block commands that generate unbounded output
|
|
3
|
+
# before they run (PreToolUse)
|
|
4
|
+
#
|
|
5
|
+
# Solves: A single command like `yes`, `cat /dev/zero`, or `cat /dev/urandom`
|
|
6
|
+
# produces output forever. When the agent captures that output to a
|
|
7
|
+
# temp file, it fills the disk and hangs or crashes the session
|
|
8
|
+
# (e.g. anthropics/claude-code#65789, #41737, #31858, #11155).
|
|
9
|
+
#
|
|
10
|
+
# Why a PreToolUse pattern check is needed:
|
|
11
|
+
# Existing output guards (output-explosion-detector, tmp-output-size-guard)
|
|
12
|
+
# are PostToolUse — they only measure output AFTER it is produced, so the
|
|
13
|
+
# disk is already filling by the time they react. disk-space-guard is
|
|
14
|
+
# PreToolUse but only blocks when free space is ALREADY low; a generator
|
|
15
|
+
# that writes tens of GB in seconds blows past the threshold between checks.
|
|
16
|
+
# This guard stops the known unbounded generators by command pattern,
|
|
17
|
+
# regardless of current disk level.
|
|
18
|
+
#
|
|
19
|
+
# Detects (only when NOT bounded by head/timeout):
|
|
20
|
+
# yes (infinite line generator)
|
|
21
|
+
# cat /dev/zero|urandom|random (infinite byte stream)
|
|
22
|
+
# base64 /dev/urandom (infinite encoded stream)
|
|
23
|
+
# ... < /dev/urandom (infinite stream via redirection)
|
|
24
|
+
#
|
|
25
|
+
# Does NOT block (bounded forms are legitimate and common):
|
|
26
|
+
# yes | head -n 5 (piped to head)
|
|
27
|
+
# head -c 32 /dev/urandom (head bounds the read)
|
|
28
|
+
# timeout 1 yes (time-bounded)
|
|
29
|
+
# tr -dc 'a-z' < /dev/urandom | head -c 8 (piped to head)
|
|
30
|
+
# echo yes (yes as an argument, not the command)
|
|
31
|
+
#
|
|
32
|
+
# Scope note: this fires on commands run through the Bash tool. The bang
|
|
33
|
+
# form in #65789 (`!yes`, typed directly into Claude Code's own shell) does
|
|
34
|
+
# NOT go through any tool, so no hook can intercept it — that case needs a
|
|
35
|
+
# core output limit in Claude Code itself. This guard covers the Bash-tool
|
|
36
|
+
# vector, which is the one that matters for autonomous agents.
|
|
37
|
+
#
|
|
38
|
+
# TRIGGER: PreToolUse MATCHER: "Bash"
|
|
39
|
+
|
|
40
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
41
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
42
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
43
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
44
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
45
|
+
_nojq_warned="/tmp/cc-nojq-warned-unbounded-output-guard-$PPID"
|
|
46
|
+
[ -f "$_nojq_warned" ] || {
|
|
47
|
+
echo "WARNING [unbounded-output-guard]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
48
|
+
: > "$_nojq_warned"
|
|
49
|
+
}
|
|
50
|
+
fi
|
|
51
|
+
|
|
52
|
+
INPUT=$(cat)
|
|
53
|
+
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null)
|
|
54
|
+
|
|
55
|
+
[ -z "$COMMAND" ] && exit 0
|
|
56
|
+
|
|
57
|
+
# Bounded forms are safe: head caps the byte/line count, timeout caps the time.
|
|
58
|
+
# Every common legitimate use of these generators pairs them with head or
|
|
59
|
+
# timeout, so their presence is a reliable signal that the output is bounded.
|
|
60
|
+
if echo "$COMMAND" | grep -qE '\b(head|timeout)\b'; then
|
|
61
|
+
exit 0
|
|
62
|
+
fi
|
|
63
|
+
|
|
64
|
+
# `yes` in command position (start, or after a pipe/;/&) with no downstream bound.
|
|
65
|
+
# Requiring command position avoids matching `yes` used as an argument (echo yes).
|
|
66
|
+
if echo "$COMMAND" | grep -qE '(^|[;&|])[[:space:]]*yes([[:space:]]|$)'; then
|
|
67
|
+
echo "BLOCKED: 'yes' produces infinite output with no bound." >&2
|
|
68
|
+
echo " Cap it, e.g. 'yes | head -n 5' or 'timeout 1 yes'." >&2
|
|
69
|
+
exit 2
|
|
70
|
+
fi
|
|
71
|
+
|
|
72
|
+
# Infinite byte streams read via cat
|
|
73
|
+
if echo "$COMMAND" | grep -qE '\bcat\s+(-\S+\s+)*/dev/(zero|u?random)\b'; then
|
|
74
|
+
echo "BLOCKED: 'cat /dev/zero|/dev/urandom|/dev/random' is an infinite stream." >&2
|
|
75
|
+
echo " This fills temp storage and can crash the session." >&2
|
|
76
|
+
echo " Use a bound, e.g. 'head -c 100 /dev/urandom'." >&2
|
|
77
|
+
exit 2
|
|
78
|
+
fi
|
|
79
|
+
|
|
80
|
+
# base64 of an infinite device
|
|
81
|
+
if echo "$COMMAND" | grep -qE '\bbase64\s+(-\S+\s+)*/dev/(zero|u?random)\b'; then
|
|
82
|
+
echo "BLOCKED: 'base64 /dev/urandom' encodes an infinite stream." >&2
|
|
83
|
+
echo " Bound the input first, e.g. 'head -c 48 /dev/urandom | base64'." >&2
|
|
84
|
+
exit 2
|
|
85
|
+
fi
|
|
86
|
+
|
|
87
|
+
# Any command reading an infinite device via input redirection (tr/od/xxd/...)
|
|
88
|
+
if echo "$COMMAND" | grep -qE '<[[:space:]]*/dev/(zero|u?random)\b'; then
|
|
89
|
+
echo "BLOCKED: reading /dev/zero|/dev/urandom|/dev/random with no bound." >&2
|
|
90
|
+
echo " Pipe through head, e.g. 'tr -dc a-z < /dev/urandom | head -c 8'." >&2
|
|
91
|
+
exit 2
|
|
92
|
+
fi
|
|
93
|
+
|
|
94
|
+
exit 0
|
|
@@ -10,7 +10,8 @@
|
|
|
10
10
|
# git checkout . (discards all changes)
|
|
11
11
|
# git restore <files> (same effect as checkout --)
|
|
12
12
|
# git restore . (discards all working tree changes)
|
|
13
|
-
# git stash drop (permanently deletes stashed
|
|
13
|
+
# git stash drop (permanently deletes one stashed change)
|
|
14
|
+
# git stash clear (permanently deletes ALL stashed changes — #69850)
|
|
14
15
|
#
|
|
15
16
|
# Does NOT block:
|
|
16
17
|
# git checkout <branch> (switching branches — safe)
|
|
@@ -21,6 +22,18 @@
|
|
|
21
22
|
#
|
|
22
23
|
# TRIGGER: PreToolUse MATCHER: "Bash"
|
|
23
24
|
|
|
25
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
26
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
27
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
28
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
29
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
30
|
+
_nojq_warned="/tmp/cc-nojq-warned-uncommitted-discard-guard-$PPID"
|
|
31
|
+
[ -f "$_nojq_warned" ] || {
|
|
32
|
+
echo "WARNING [uncommitted-discard-guard]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
33
|
+
: > "$_nojq_warned"
|
|
34
|
+
}
|
|
35
|
+
fi
|
|
36
|
+
|
|
24
37
|
INPUT=$(cat)
|
|
25
38
|
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null)
|
|
26
39
|
|
|
@@ -61,11 +74,16 @@ if echo "$COMMAND" | grep -qE 'git\s+restore\s+' && ! echo "$COMMAND" | grep -qE
|
|
|
61
74
|
exit 2
|
|
62
75
|
fi
|
|
63
76
|
|
|
64
|
-
# Block: git stash drop (permanently
|
|
65
|
-
|
|
66
|
-
|
|
77
|
+
# Block: git stash drop / git stash clear (permanently delete stashed changes).
|
|
78
|
+
# clear wipes EVERY stash at once. This is the #69850 loss path: work is moved into
|
|
79
|
+
# a stash (working tree goes clean), then the stash is discarded — equivalent to
|
|
80
|
+
# git reset --hard. Auto-stash-before-danger hooks miss it because the tree is clean
|
|
81
|
+
# at drop/clear time, so blocking the discard itself is the reliable guard.
|
|
82
|
+
if echo "$COMMAND" | grep -qE 'git\s+stash\s+(drop|clear)'; then
|
|
83
|
+
echo "BLOCKED: git stash drop/clear permanently deletes stashed changes (#69850)." >&2
|
|
67
84
|
echo "" >&2
|
|
68
|
-
echo "
|
|
85
|
+
echo "Keep the stash until you are sure it is no longer needed." >&2
|
|
86
|
+
echo "To restore the work, use 'git stash pop'." >&2
|
|
69
87
|
exit 2
|
|
70
88
|
fi
|
|
71
89
|
|
|
@@ -14,6 +14,18 @@
|
|
|
14
14
|
# "Claude runs forbidden destructive git commands, destroys work twice"
|
|
15
15
|
# ================================================================
|
|
16
16
|
|
|
17
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
18
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
19
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
20
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
21
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
22
|
+
_nojq_warned="/tmp/cc-nojq-warned-uncommitted-work-guard-$PPID"
|
|
23
|
+
[ -f "$_nojq_warned" ] || {
|
|
24
|
+
echo "WARNING [uncommitted-work-guard]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
25
|
+
: > "$_nojq_warned"
|
|
26
|
+
}
|
|
27
|
+
fi
|
|
28
|
+
|
|
17
29
|
COMMAND=$(cat | jq -r '.tool_input.command // empty' 2>/dev/null)
|
|
18
30
|
[ -z "$COMMAND" ] && exit 0
|
|
19
31
|
|
package/examples/usage-warn.sh
CHANGED
|
File without changes
|
|
@@ -15,6 +15,18 @@
|
|
|
15
15
|
#
|
|
16
16
|
# TRIGGER: PreToolUse MATCHER: "Bash"
|
|
17
17
|
|
|
18
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
19
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
20
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
21
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
22
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
23
|
+
_nojq_warned="/tmp/cc-nojq-warned-user-account-guard-$PPID"
|
|
24
|
+
[ -f "$_nojq_warned" ] || {
|
|
25
|
+
echo "WARNING [user-account-guard]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
26
|
+
: > "$_nojq_warned"
|
|
27
|
+
}
|
|
28
|
+
fi
|
|
29
|
+
|
|
18
30
|
INPUT=$(cat)
|
|
19
31
|
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null)
|
|
20
32
|
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ================================================================
|
|
3
|
+
# userprompt-submit-receipt.sh — Companion log for the operator's
|
|
4
|
+
# articulated scope at the prompt
|
|
5
|
+
# boundary, joinable to dispatch /
|
|
6
|
+
# bash / edit receipts
|
|
7
|
+
# ================================================================
|
|
8
|
+
# PURPOSE:
|
|
9
|
+
# UserPromptSubmit hook. Writes a structured JSONL receipt of the
|
|
10
|
+
# operator's verbatim prompt's sha256 hash and byte length to a
|
|
11
|
+
# companion log file. The dispatch / bash / edit hooks in the
|
|
12
|
+
# receipt-persistence-layer family read the most recent entry of
|
|
13
|
+
# this log within the current session to populate
|
|
14
|
+
# `articulated_scope_hash` and `articulated_scope_length` fields
|
|
15
|
+
# in their own receipts.
|
|
16
|
+
#
|
|
17
|
+
# The result is that the receipt corpus answers MAST 2.6
|
|
18
|
+
# (Action-Reasoning Mismatch, Cemri et al. NeurIPS 2025
|
|
19
|
+
# arXiv:2503.13657) operationally — the executed action vs the
|
|
20
|
+
# operator's articulated scope at the prompt boundary — distinct
|
|
21
|
+
# from the LLM-judge labelled definition that compares the model's
|
|
22
|
+
# reasoning text against the model's final action. The cluster
|
|
23
|
+
# discussion of this distinction is at:
|
|
24
|
+
# https://github.com/anthropics/claude-code/issues/61102#issuecomment-4514215413
|
|
25
|
+
#
|
|
26
|
+
# TRIGGER: UserPromptSubmit
|
|
27
|
+
# MATCHER: (none — fires on every prompt)
|
|
28
|
+
#
|
|
29
|
+
# RECEIPT FORMAT (one JSONL per prompt):
|
|
30
|
+
# {"ts":"2026-05-22T00:36:29Z",
|
|
31
|
+
# "prompt_hash":"<sha256 of prompt>",
|
|
32
|
+
# "prompt_length":1234,
|
|
33
|
+
# "schema_version":1}
|
|
34
|
+
#
|
|
35
|
+
# The prompt content itself is NEVER persisted. Only the hash and
|
|
36
|
+
# length, so the receipt corpus stays PHI-safe and the
|
|
37
|
+
# articulated-scope-mismatch measurement at downstream boundaries
|
|
38
|
+
# operates on cryptographic correlation keys instead of text.
|
|
39
|
+
#
|
|
40
|
+
# RECEIPT LOCATION:
|
|
41
|
+
# ${CC_DISPATCH_RECEIPT_DIR:-~/.claude/receipts}/
|
|
42
|
+
# userprompt-submit-YYYY-MM-DD.jsonl
|
|
43
|
+
#
|
|
44
|
+
# DOWNSTREAM CONSUMERS:
|
|
45
|
+
# - examples/dispatch-allowlist-preflight.sh (PR #286 / dispatch-start
|
|
46
|
+
# boundary, schema v2)
|
|
47
|
+
# - examples/dispatch-receipt.sh (PR #283 / dispatch-end boundary,
|
|
48
|
+
# schema v2 when adopted)
|
|
49
|
+
# - examples/scope-expansion-receipt.sh (PR #282 / scope-expansion
|
|
50
|
+
# boundary, schema v2 when adopted)
|
|
51
|
+
# - examples/post-edit-disk-verify.sh (PR #285 / Edit-Write boundary,
|
|
52
|
+
# schema v2 when adopted)
|
|
53
|
+
#
|
|
54
|
+
# Downstream hooks read the most recent line of this log within the
|
|
55
|
+
# current day's file. For sessions that span midnight UTC, the
|
|
56
|
+
# downstream hook reads from yesterday's file if today's is empty —
|
|
57
|
+
# a refinement deferred to schema v2.1.
|
|
58
|
+
#
|
|
59
|
+
# CONFIGURATION:
|
|
60
|
+
# CC_DISPATCH_RECEIPT_DIR — override the receipt directory
|
|
61
|
+
# (default: ${HOME}/.claude/receipts)
|
|
62
|
+
#
|
|
63
|
+
# CC_USERPROMPT_RECEIPT_OFF=1 — disable this hook entirely, useful
|
|
64
|
+
# for sessions where the operator does not want the articulated
|
|
65
|
+
# scope tracked (the downstream hooks then write
|
|
66
|
+
# articulated_scope_hash: null in their receipts)
|
|
67
|
+
#
|
|
68
|
+
# AUDIT QUERY:
|
|
69
|
+
# To join a dispatch receipt against the most recent prompt:
|
|
70
|
+
# RECEIPTS=~/.claude/receipts
|
|
71
|
+
# jq -c '. + {linked_articulated_scope:
|
|
72
|
+
# (input_filename | sub("dispatch-preflight-"; "userprompt-submit-")
|
|
73
|
+
# | @sh "" + . + "" | $$(tail -1 .))}' \
|
|
74
|
+
# "$RECEIPTS"/dispatch-preflight-2026-05-22.jsonl
|
|
75
|
+
#
|
|
76
|
+
# In practice, the join is done by the `receipts-aggregate` CLI
|
|
77
|
+
# that is the next load-bearing artifact in the cluster's
|
|
78
|
+
# measurement infrastructure.
|
|
79
|
+
#
|
|
80
|
+
# RELATED:
|
|
81
|
+
# https://github.com/anthropics/claude-code/issues/61102 (Awis case)
|
|
82
|
+
# https://github.com/anthropics/claude-code/issues/61167 (nvst18 case)
|
|
83
|
+
# https://github.com/anthropics/claude-code/issues/61315 (mitselek case)
|
|
84
|
+
# https://github.com/waitdeadai/llm-dark-patterns (MAST measurement)
|
|
85
|
+
# https://gist.github.com/yurukusa/8c0d19d59730868672270e7312492d1d
|
|
86
|
+
# (Receipt-Persistence Layer architecture)
|
|
87
|
+
# ================================================================
|
|
88
|
+
|
|
89
|
+
set -u
|
|
90
|
+
|
|
91
|
+
if [ "${CC_USERPROMPT_RECEIPT_OFF:-0}" = "1" ]; then
|
|
92
|
+
exit 0
|
|
93
|
+
fi
|
|
94
|
+
|
|
95
|
+
INPUT=$(cat)
|
|
96
|
+
|
|
97
|
+
# The UserPromptSubmit hook input contains the verbatim prompt at
|
|
98
|
+
# .user_message or .prompt depending on the runtime version. Try both.
|
|
99
|
+
PROMPT=$(printf '%s' "$INPUT" | jq -r '.user_message // .prompt // empty' 2>/dev/null)
|
|
100
|
+
|
|
101
|
+
# If we cannot extract a prompt, exit silently — a malformed input
|
|
102
|
+
# would create false-positive friction without measurement value.
|
|
103
|
+
if [ -z "$PROMPT" ]; then
|
|
104
|
+
exit 0
|
|
105
|
+
fi
|
|
106
|
+
|
|
107
|
+
# Compute hash and length without storing the prompt.
|
|
108
|
+
PROMPT_LEN=$(printf '%s' "$PROMPT" | wc -c | tr -d ' ')
|
|
109
|
+
PROMPT_HASH=$(printf '%s' "$PROMPT" | sha256sum 2>/dev/null | awk '{print $1}')
|
|
110
|
+
[ -z "$PROMPT_HASH" ] && PROMPT_HASH="$(printf '%s' "$PROMPT" | shasum -a 256 2>/dev/null | awk '{print $1}')"
|
|
111
|
+
|
|
112
|
+
TS=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
|
113
|
+
|
|
114
|
+
# Write receipt.
|
|
115
|
+
RECEIPT_DIR="${CC_DISPATCH_RECEIPT_DIR:-${HOME}/.claude/receipts}"
|
|
116
|
+
mkdir -p "$RECEIPT_DIR" 2>/dev/null
|
|
117
|
+
RECEIPT_FILE="${RECEIPT_DIR}/userprompt-submit-$(date +%Y-%m-%d).jsonl"
|
|
118
|
+
|
|
119
|
+
printf '{"ts":"%s","prompt_hash":"%s","prompt_length":%s,"schema_version":1}\n' \
|
|
120
|
+
"$TS" "$PROMPT_HASH" "$PROMPT_LEN" \
|
|
121
|
+
>> "$RECEIPT_FILE" 2>/dev/null
|
|
122
|
+
|
|
123
|
+
exit 0
|
|
@@ -24,6 +24,18 @@
|
|
|
24
24
|
#
|
|
25
25
|
# The "if" field (v2.1.85+) limits this to rm commands only.
|
|
26
26
|
|
|
27
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
28
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
29
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
30
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
31
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
32
|
+
_nojq_warned="/tmp/cc-nojq-warned-variable-expansion-guard-$PPID"
|
|
33
|
+
[ -f "$_nojq_warned" ] || {
|
|
34
|
+
echo "WARNING [variable-expansion-guard]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
35
|
+
: > "$_nojq_warned"
|
|
36
|
+
}
|
|
37
|
+
fi
|
|
38
|
+
|
|
27
39
|
INPUT=$(cat)
|
|
28
40
|
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null)
|
|
29
41
|
[ -z "$COMMAND" ] && exit 0
|