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
|
@@ -18,6 +18,18 @@
|
|
|
18
18
|
#
|
|
19
19
|
# TRIGGER: PreToolUse MATCHER: "Bash"
|
|
20
20
|
|
|
21
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
22
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
23
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
24
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
25
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
26
|
+
_nojq_warned="/tmp/cc-nojq-warned-api-key-in-url-guard-$PPID"
|
|
27
|
+
[ -f "$_nojq_warned" ] || {
|
|
28
|
+
echo "WARNING [api-key-in-url-guard]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
29
|
+
: > "$_nojq_warned"
|
|
30
|
+
}
|
|
31
|
+
fi
|
|
32
|
+
|
|
21
33
|
INPUT=$(cat)
|
|
22
34
|
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null)
|
|
23
35
|
|
|
@@ -27,7 +39,11 @@ COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null)
|
|
|
27
39
|
echo "$COMMAND" | grep -qE '\b(curl|wget|http|fetch)\b' || exit 0
|
|
28
40
|
|
|
29
41
|
# Check for API key patterns in URLs
|
|
30
|
-
|
|
42
|
+
# -P は GNU 拡張で、macOS の BSD grep では grep 自体がエラーになる。
|
|
43
|
+
# この条件は遮断(exit 2)の唯一の入口なので、偽になると鍵つきURLが素通しになる。
|
|
44
|
+
# 実測: `curl "https://example.com/v1?api_key=…"` を渡すと -P ありは 2、無しは 0 だった。
|
|
45
|
+
# \s を [:space:] に置き換えれば POSIX の拡張正規表現で同じことができる。
|
|
46
|
+
if echo "$COMMAND" | grep -qiE '[?&](api[_-]?key|token|secret|password|auth|access[_-]?key|client[_-]?secret)=[^$[:space:]&"'\'']{8,}'; then
|
|
31
47
|
echo "BLOCKED: API key detected in URL query parameter." >&2
|
|
32
48
|
echo "" >&2
|
|
33
49
|
echo "Command: $(echo "$COMMAND" | head -1)" >&2
|
|
@@ -27,7 +27,42 @@
|
|
|
27
27
|
# }
|
|
28
28
|
# ================================================================
|
|
29
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-api-rate-limit-guard-$PPID"
|
|
36
|
+
[ -f "$_nojq_warned" ] || {
|
|
37
|
+
echo "WARNING [api-rate-limit-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
|
+
|
|
30
42
|
INPUT=$(cat)
|
|
43
|
+
__CC_HOOK_INPUT="$INPUT"
|
|
44
|
+
# --- セッション識別子でファイルを分ける (2026-08-09 修正) ---
|
|
45
|
+
# 旧実装は "$$" を使っていたが、$$ はこのスクリプト自身のPIDで呼び出しごとに変わるため、
|
|
46
|
+
# 状態が一度も持続しなかった(実測: 200回呼ぶとファイルが200個でき、中身は全部 1)。
|
|
47
|
+
__CC_SID=""
|
|
48
|
+
if [ -n "${__CC_HOOK_INPUT:-}" ]; then
|
|
49
|
+
if command -v jq >/dev/null 2>&1; then
|
|
50
|
+
__CC_SID=$(printf '%s' "$__CC_HOOK_INPUT" | jq -r '.session_id // .sessionId // empty' 2>/dev/null)
|
|
51
|
+
fi
|
|
52
|
+
if [ -z "$__CC_SID" ] && command -v python3 >/dev/null 2>&1; then
|
|
53
|
+
__CC_SID=$(printf '%s' "$__CC_HOOK_INPUT" | python3 -c 'import sys,json
|
|
54
|
+
try:
|
|
55
|
+
d=json.load(sys.stdin); print(d.get("session_id") or d.get("sessionId") or "")
|
|
56
|
+
except Exception: print("")' 2>/dev/null)
|
|
57
|
+
fi
|
|
58
|
+
fi
|
|
59
|
+
if [ -n "$__CC_SID" ]; then
|
|
60
|
+
__CC_KEY=$(printf '%s' "$__CC_SID" | tr -c 'A-Za-z0-9_-' '_' | cut -c1-64)
|
|
61
|
+
else
|
|
62
|
+
__CC_KEY="nosession-$(date +%Y%m%d)"
|
|
63
|
+
fi
|
|
64
|
+
# --- ここまで ---
|
|
65
|
+
|
|
31
66
|
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null)
|
|
32
67
|
[ -z "$COMMAND" ] && exit 0
|
|
33
68
|
|
|
@@ -37,7 +72,7 @@ echo "$COMMAND" | grep -qE '^\s*(curl|wget|http|https)\s' || exit 0
|
|
|
37
72
|
# Configurable minimum interval (milliseconds)
|
|
38
73
|
MIN_INTERVAL_MS="${CC_API_RATE_LIMIT_MS:-1000}"
|
|
39
74
|
|
|
40
|
-
TIMESTAMP_FILE="/tmp/.cc-api-rate-limit
|
|
75
|
+
TIMESTAMP_FILE="/tmp/.cc-api-rate-limit-$__CC_KEY"
|
|
41
76
|
NOW_MS=$(date +%s%N | cut -b1-13 2>/dev/null || date +%s)
|
|
42
77
|
|
|
43
78
|
if [ -f "$TIMESTAMP_FILE" ]; then
|
|
@@ -20,6 +20,18 @@
|
|
|
20
20
|
# }
|
|
21
21
|
# }
|
|
22
22
|
|
|
23
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
24
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
25
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
26
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
27
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
28
|
+
_nojq_warned="/tmp/cc-nojq-warned-api-rate-limit-tracker-$PPID"
|
|
29
|
+
[ -f "$_nojq_warned" ] || {
|
|
30
|
+
echo "WARNING [api-rate-limit-tracker]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
31
|
+
: > "$_nojq_warned"
|
|
32
|
+
}
|
|
33
|
+
fi
|
|
34
|
+
|
|
23
35
|
INPUT=$(cat)
|
|
24
36
|
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null)
|
|
25
37
|
[ -z "$COMMAND" ] && exit 0
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ============================================================================
|
|
3
|
+
# articulated-scope-capture.sh — Capture user prompt's sha256 + byte length
|
|
4
|
+
# as the operator-instrumented Mode 2.6 (Action-Reasoning Mismatch) primitive
|
|
5
|
+
# ============================================================================
|
|
6
|
+
# PURPOSE: pair with scope-expansion-receipt.sh (PR #282, destructive-bash
|
|
7
|
+
# boundary) and dispatch-receipt.sh (PR #283, agent-dispatch boundary) by
|
|
8
|
+
# recording the *user's* verbatim instruction's hash + length at
|
|
9
|
+
# UserPromptSubmit time. The pair `(articulated_scope_hash, paths_argv)` is
|
|
10
|
+
# the operator-instrumented MAST 2.6 measurement primitive:
|
|
11
|
+
# - Mode 2.6 = "did the executed action stay within the user's
|
|
12
|
+
# articulated scope?"
|
|
13
|
+
# - The receipt corpus answers this directly by joining on session_id +
|
|
14
|
+
# articulated_scope_hash, without storing either side's raw text.
|
|
15
|
+
#
|
|
16
|
+
# WHY: yurukusa schema-v2 sketch at
|
|
17
|
+
# https://github.com/anthropics/claude-code/issues/61102#issuecomment-4514215413
|
|
18
|
+
# proposes adding articulated_scope_hash + articulated_scope_length to the
|
|
19
|
+
# receipt fields. This hook is the prompt-side companion that writes those
|
|
20
|
+
# fields independently — joinable to PR #282/#283 receipts via session_id.
|
|
21
|
+
#
|
|
22
|
+
# WHY (cluster context): the effective_arrest_rate = gate_installation_rate ×
|
|
23
|
+
# gate_recall decomposition (waitdeadai
|
|
24
|
+
# https://github.com/anthropics/claude-code/issues/61102#issuecomment-4513977211)
|
|
25
|
+
# requires the *gate_installation_rate* factor to be observable from
|
|
26
|
+
# operator-side substrate. The destructive-bash and dispatch receipts measure
|
|
27
|
+
# the tool-call side; this hook measures the user-prompt side. Joined, they
|
|
28
|
+
# answer "did the operator's stated scope match the executed action?" at the
|
|
29
|
+
# deployed-cohort level — the §6.2 measurement gap of the
|
|
30
|
+
# ianymu/recognition-without-arrest synthesis writeup.
|
|
31
|
+
#
|
|
32
|
+
# PHI / SECRET SAFETY: only the sha256 and byte length are persisted; the
|
|
33
|
+
# raw prompt text is NEVER written to the receipt file. The hash is the
|
|
34
|
+
# correlation key against same-session destructive-bash and dispatch
|
|
35
|
+
# receipts. For healthcare-deployed cohorts (per @nvst18's OpenClaw case at
|
|
36
|
+
# #61167), this is the same PHI-safety property PR #283 chose for the
|
|
37
|
+
# dispatched-prompt hashing.
|
|
38
|
+
#
|
|
39
|
+
# TRIGGER: UserPromptSubmit
|
|
40
|
+
# MATCHER: ""
|
|
41
|
+
#
|
|
42
|
+
# CONFIGURATION (environment variables):
|
|
43
|
+
# CC_RECEIPT_DIR receipts directory (default
|
|
44
|
+
# ~/.claude/receipts)
|
|
45
|
+
# CC_ARTICULATED_SCOPE_DISABLE set to "1" to disable capture entirely
|
|
46
|
+
#
|
|
47
|
+
# USAGE (settings.json):
|
|
48
|
+
# {
|
|
49
|
+
# "hooks": {
|
|
50
|
+
# "UserPromptSubmit": [{
|
|
51
|
+
# "matcher": "",
|
|
52
|
+
# "hooks": [{
|
|
53
|
+
# "type": "command",
|
|
54
|
+
# "command": "~/.claude/hooks/articulated-scope-capture.sh"
|
|
55
|
+
# }]
|
|
56
|
+
# }]
|
|
57
|
+
# }
|
|
58
|
+
# }
|
|
59
|
+
#
|
|
60
|
+
# Related Issues / PRs:
|
|
61
|
+
# #61102 (@Awis13, @yurukusa, @Keesan12, @waitdeadai) — Mode 2.6+3.3
|
|
62
|
+
# composition + receipt-persistence-layer schema v2 proposal
|
|
63
|
+
# #61167 (@nvst18) — healthcare verification-agent fabrication; PHI-safety
|
|
64
|
+
# motivation for hash-only persistence
|
|
65
|
+
# PR #282 — scope-expansion-receipt (destructive-bash boundary)
|
|
66
|
+
# PR #283 — dispatch-receipt (agent-dispatch boundary)
|
|
67
|
+
#
|
|
68
|
+
# Joinable to those receipts via session_id + articulated_scope_hash.
|
|
69
|
+
# ============================================================================
|
|
70
|
+
|
|
71
|
+
INPUT=$(cat)
|
|
72
|
+
|
|
73
|
+
# Empty input → exit 0 per CONTRIBUTING convention
|
|
74
|
+
[ -z "$INPUT" ] && exit 0
|
|
75
|
+
|
|
76
|
+
# Disable switch for operator opt-out
|
|
77
|
+
[ "${CC_ARTICULATED_SCOPE_DISABLE:-0}" = "1" ] && exit 0
|
|
78
|
+
|
|
79
|
+
# Extract user prompt from UserPromptSubmit hook JSON
|
|
80
|
+
PROMPT=$(printf '%s' "$INPUT" | jq -r '.prompt // empty' 2>/dev/null)
|
|
81
|
+
[ -z "$PROMPT" ] && exit 0
|
|
82
|
+
|
|
83
|
+
SESSION_ID=$(printf '%s' "$INPUT" | jq -r '.session_id // "unknown"' 2>/dev/null)
|
|
84
|
+
TS=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
85
|
+
|
|
86
|
+
# sha256 over the verbatim prompt; never persists the raw text
|
|
87
|
+
HASH=$(printf '%s' "$PROMPT" | sha256sum 2>/dev/null | awk '{print $1}')
|
|
88
|
+
LEN=$(printf '%s' "$PROMPT" | wc -c | tr -d ' ')
|
|
89
|
+
|
|
90
|
+
RECEIPT_DIR="${CC_RECEIPT_DIR:-$HOME/.claude/receipts}"
|
|
91
|
+
mkdir -p "$RECEIPT_DIR"
|
|
92
|
+
|
|
93
|
+
DATE=$(date -u +"%Y-%m-%d")
|
|
94
|
+
OUT="${RECEIPT_DIR}/articulated-scope-${DATE}.jsonl"
|
|
95
|
+
|
|
96
|
+
# JSONL line: matches the shape of PR #282/#283 receipts so receipts-aggregate
|
|
97
|
+
# can consume both via a single iterator
|
|
98
|
+
printf '{"ts":"%s","session_id":"%s","articulated_scope_hash":"%s","articulated_scope_length":%s,"boundary_type":"user_prompt_submit"}\n' \
|
|
99
|
+
"$TS" "$SESSION_ID" "$HASH" "$LEN" >> "$OUT"
|
|
100
|
+
|
|
101
|
+
exit 0
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# askuserquestion-autonomy-gate.sh — Block AskUserQuestion in autonomy mode
|
|
3
|
+
#
|
|
4
|
+
# Solves: Claude blocking /goal mode or overnight autonomous runs indefinitely
|
|
5
|
+
# by invoking AskUserQuestion to ask the operator whether to proceed
|
|
6
|
+
# (anthropics/claude-code#61337). Recognition-without-arrest at the
|
|
7
|
+
# PreToolUse-AskUserQuestion lifecycle event.
|
|
8
|
+
#
|
|
9
|
+
# The model recognizes an autonomous-operation constraint
|
|
10
|
+
# (e.g. "operate autonomously, never ask questions"), articulates a reason
|
|
11
|
+
# why the current task is hard enough to warrant asking anyway, then invokes
|
|
12
|
+
# AskUserQuestion. With no operator present, the session blocks indefinitely.
|
|
13
|
+
#
|
|
14
|
+
# This hook arrests AskUserQuestion calls when CC_AUTONOMY_MODE=1 is set.
|
|
15
|
+
# The stderr message gives the model a defensible next action so it does not
|
|
16
|
+
# loop retrying the same blocked tool call.
|
|
17
|
+
#
|
|
18
|
+
# Modes:
|
|
19
|
+
# CC_AUTONOMY_MODE=0 (default): advisory only, no blocking
|
|
20
|
+
# CC_AUTONOMY_MODE=1: blocking, exit 2, structured stderr explanation
|
|
21
|
+
# CC_AUTONOMY_MODE_RECEIPT_DIR: directory for blocked-call receipts
|
|
22
|
+
# (default: ~/.claude/receipts)
|
|
23
|
+
#
|
|
24
|
+
# Usage: Add to settings.json as a PreToolUse hook matching AskUserQuestion
|
|
25
|
+
#
|
|
26
|
+
# {
|
|
27
|
+
# "hooks": {
|
|
28
|
+
# "PreToolUse": [{
|
|
29
|
+
# "matcher": "AskUserQuestion",
|
|
30
|
+
# "hooks": [{
|
|
31
|
+
# "type": "command",
|
|
32
|
+
# "command": "~/.claude/hooks/askuserquestion-autonomy-gate.sh"
|
|
33
|
+
# }]
|
|
34
|
+
# }]
|
|
35
|
+
# }
|
|
36
|
+
# }
|
|
37
|
+
#
|
|
38
|
+
# Then in any shell that runs /goal overnight or autonomous tasks:
|
|
39
|
+
# export CC_AUTONOMY_MODE=1
|
|
40
|
+
#
|
|
41
|
+
# TRIGGER: PreToolUse MATCHER: "AskUserQuestion"
|
|
42
|
+
|
|
43
|
+
set -u
|
|
44
|
+
|
|
45
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
46
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
47
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
48
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
49
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
50
|
+
_nojq_warned="/tmp/cc-nojq-warned-askuserquestion-autonomy-gate-$PPID"
|
|
51
|
+
[ -f "$_nojq_warned" ] || {
|
|
52
|
+
echo "WARNING [askuserquestion-autonomy-gate]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
53
|
+
: > "$_nojq_warned"
|
|
54
|
+
}
|
|
55
|
+
fi
|
|
56
|
+
|
|
57
|
+
INPUT=$(cat)
|
|
58
|
+
TOOL=$(echo "$INPUT" | jq -r '.tool_name // empty' 2>/dev/null)
|
|
59
|
+
|
|
60
|
+
# Only act on AskUserQuestion tool calls
|
|
61
|
+
[[ "$TOOL" != "AskUserQuestion" ]] && exit 0
|
|
62
|
+
|
|
63
|
+
# Advisory mode by default: observe but do not block
|
|
64
|
+
if [[ "${CC_AUTONOMY_MODE:-0}" != "1" ]]; then
|
|
65
|
+
exit 0
|
|
66
|
+
fi
|
|
67
|
+
|
|
68
|
+
# In autonomy mode: write a receipt, then block
|
|
69
|
+
RECEIPT_DIR="${CC_AUTONOMY_MODE_RECEIPT_DIR:-$HOME/.claude/receipts}"
|
|
70
|
+
mkdir -p "$RECEIPT_DIR" 2>/dev/null || true
|
|
71
|
+
TS=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
72
|
+
RECEIPT_FILE="$RECEIPT_DIR/autonomy-blocked-$(date -u +%Y-%m-%d).jsonl"
|
|
73
|
+
|
|
74
|
+
# Extract question summary for the receipt (hash only — never the full prompt
|
|
75
|
+
# text, to keep PHI-safe per cc-safe-setup convention).
|
|
76
|
+
QUESTION=$(echo "$INPUT" | jq -r '.tool_input.question // .tool_input.prompt // empty' 2>/dev/null)
|
|
77
|
+
QUESTION_HASH=""
|
|
78
|
+
QUESTION_LEN=0
|
|
79
|
+
if [[ -n "$QUESTION" ]]; then
|
|
80
|
+
QUESTION_HASH=$(printf '%s' "$QUESTION" | sha256sum 2>/dev/null | awk '{print $1}')
|
|
81
|
+
QUESTION_LEN=$(printf '%s' "$QUESTION" | wc -c | tr -d ' ')
|
|
82
|
+
fi
|
|
83
|
+
|
|
84
|
+
# Append the receipt (best-effort; never block on receipt failure)
|
|
85
|
+
{
|
|
86
|
+
printf '{"ts":"%s","event":"askuserquestion_blocked","question_hash":"%s","question_length":%s,"autonomy_mode":1}\n' \
|
|
87
|
+
"$TS" "$QUESTION_HASH" "$QUESTION_LEN"
|
|
88
|
+
} >> "$RECEIPT_FILE" 2>/dev/null || true
|
|
89
|
+
|
|
90
|
+
# Block the tool call with a stderr message that gives the model a next action
|
|
91
|
+
cat >&2 <<'EOF'
|
|
92
|
+
AskUserQuestion is blocked in autonomy mode (CC_AUTONOMY_MODE=1).
|
|
93
|
+
The operator is not present and cannot answer.
|
|
94
|
+
|
|
95
|
+
You must either (a) make a defensible default choice and document it inline,
|
|
96
|
+
or (b) write a stop-with-explanation note in the working memo (e.g.
|
|
97
|
+
./.claude/autonomy-blocks.md) and proceed to the next task in the goal queue.
|
|
98
|
+
|
|
99
|
+
Do not retry AskUserQuestion in this turn. The same call will be blocked again.
|
|
100
|
+
EOF
|
|
101
|
+
|
|
102
|
+
exit 2
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# ================================================================
|
|
3
|
+
# attachment-traversal-guard.sh — Block @../ attachment bypass
|
|
4
|
+
# ================================================================
|
|
5
|
+
# PURPOSE:
|
|
6
|
+
# Block the `@../path` attachment syntax that bypasses
|
|
7
|
+
# `permissions.deny` rules by reaching file content through
|
|
8
|
+
# the harness's attachment-preprocessing pipeline rather than
|
|
9
|
+
# the `Read`-tool authorization point.
|
|
10
|
+
#
|
|
11
|
+
# Reported case (anthropics/claude-code#61148, v2.1.146):
|
|
12
|
+
# settings.json: { "permissions": { "deny": ["Read(**/Security/**)"] } }
|
|
13
|
+
# workspace: D:\TestProject\Library.Devices
|
|
14
|
+
# target: D:\TestProject\Library\Security\KeyIV.cs (outside workspace)
|
|
15
|
+
#
|
|
16
|
+
# Read D:\...\KeyIV.cs → Blocked ✓
|
|
17
|
+
# Read @Library\Security\KeyIV.cs → Blocked ✓ (workspace attachment)
|
|
18
|
+
# Read @..\Library\Security\KeyIV.cs → BYPASSED ✗
|
|
19
|
+
#
|
|
20
|
+
# The attachment-preprocessing pipeline normalizes `@../`
|
|
21
|
+
# before the permission check runs, so the resolved path
|
|
22
|
+
# never reaches the `Read`-tool authorization point. PreToolUse
|
|
23
|
+
# hooks on `Read` also do not fire (per the reporter's
|
|
24
|
+
# independent verification).
|
|
25
|
+
#
|
|
26
|
+
# This UserPromptSubmit hook intercepts the literal `@../`
|
|
27
|
+
# pattern in the raw user prompt before the harness expands
|
|
28
|
+
# the attachment, closing the bypass surface on the operator
|
|
29
|
+
# side while a runtime fix is pending.
|
|
30
|
+
#
|
|
31
|
+
# TRIGGER: UserPromptSubmit MATCHER: ""
|
|
32
|
+
#
|
|
33
|
+
# BEHAVIOR:
|
|
34
|
+
# - Reads the user prompt from stdin (`.prompt` field).
|
|
35
|
+
# - If the prompt contains `@../` or `@..\` (Windows-style),
|
|
36
|
+
# blocks with exit 2 and an explanatory stderr message.
|
|
37
|
+
# - In advisory mode (CC_ATTACHMENT_TRAVERSAL_BLOCK=0),
|
|
38
|
+
# warns but does not block.
|
|
39
|
+
# - Does NOT match `@./` (current-directory attachment, which
|
|
40
|
+
# stays inside workspace and is enforced by the standard
|
|
41
|
+
# deny rule).
|
|
42
|
+
#
|
|
43
|
+
# CONFIG:
|
|
44
|
+
# CC_ATTACHMENT_TRAVERSAL_BLOCK=1 (1 = block, 0 = warn-only; default 1)
|
|
45
|
+
# CC_ATTACHMENT_TRAVERSAL_ALLOW_REGEX="" (allow paths matching this regex)
|
|
46
|
+
#
|
|
47
|
+
# REFERENCES:
|
|
48
|
+
# - anthropics/claude-code#61148 — original report
|
|
49
|
+
# - RUSE Surface 1 articulation: synonymous edges of the same
|
|
50
|
+
# deny-rule outcome reached through a parallel pipeline.
|
|
51
|
+
#
|
|
52
|
+
# DEPENDENCIES:
|
|
53
|
+
# - jq (for parsing the hook input JSON)
|
|
54
|
+
#
|
|
55
|
+
# LIMITATIONS:
|
|
56
|
+
# - Detects the literal `@../` pattern in the prompt text.
|
|
57
|
+
# Does not catch obfuscated variants (e.g., `@..%2F`,
|
|
58
|
+
# `@%2E%2E/`) — those are not known to be expanded by the
|
|
59
|
+
# attachment preprocessor at time of writing but should be
|
|
60
|
+
# added to the regex if a reproduction surfaces.
|
|
61
|
+
# - Cannot defend against file content already injected into
|
|
62
|
+
# context by a previous prompt in the same session.
|
|
63
|
+
# ================================================================
|
|
64
|
+
|
|
65
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
66
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
67
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
68
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
69
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
70
|
+
_nojq_warned="/tmp/cc-nojq-warned-attachment-traversal-guard-$PPID"
|
|
71
|
+
[ -f "$_nojq_warned" ] || {
|
|
72
|
+
echo "WARNING [attachment-traversal-guard]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
73
|
+
: > "$_nojq_warned"
|
|
74
|
+
}
|
|
75
|
+
fi
|
|
76
|
+
|
|
77
|
+
INPUT=$(cat)
|
|
78
|
+
PROMPT=$(echo "$INPUT" | jq -r '.prompt // empty' 2>/dev/null || true)
|
|
79
|
+
[ -z "$PROMPT" ] && exit 0
|
|
80
|
+
|
|
81
|
+
BLOCK_MODE="${CC_ATTACHMENT_TRAVERSAL_BLOCK:-1}"
|
|
82
|
+
ALLOW_REGEX="${CC_ATTACHMENT_TRAVERSAL_ALLOW_REGEX:-}"
|
|
83
|
+
|
|
84
|
+
# Match @../ or @..\ at any position in the prompt
|
|
85
|
+
TRAVERSAL_REGEX='@\.\.[/\\]'
|
|
86
|
+
|
|
87
|
+
if echo "$PROMPT" | grep -qE "$TRAVERSAL_REGEX"; then
|
|
88
|
+
# If allow-regex is set and matches the offending segment, permit.
|
|
89
|
+
if [ -n "$ALLOW_REGEX" ] && echo "$PROMPT" | grep -qE "$ALLOW_REGEX"; then
|
|
90
|
+
exit 0
|
|
91
|
+
fi
|
|
92
|
+
|
|
93
|
+
cat >&2 <<EOF
|
|
94
|
+
attachment-traversal-guard: blocked @../ attachment syntax.
|
|
95
|
+
|
|
96
|
+
This prompt contains the @../ attachment pattern, which bypasses
|
|
97
|
+
permissions.deny rules by reaching file content through the
|
|
98
|
+
attachment-preprocessing pipeline rather than the Read-tool
|
|
99
|
+
authorization point.
|
|
100
|
+
|
|
101
|
+
See anthropics/claude-code#61148 for the reproduction.
|
|
102
|
+
|
|
103
|
+
If you intentionally need to attach a parent-directory file:
|
|
104
|
+
1. Disable this hook for the session, or
|
|
105
|
+
2. Set CC_ATTACHMENT_TRAVERSAL_ALLOW_REGEX to a pattern that
|
|
106
|
+
matches the specific parent-directory file you intend to
|
|
107
|
+
attach (e.g., '@\\.\\./allowed/specific\\.txt').
|
|
108
|
+
|
|
109
|
+
To convert this hook to warn-only mode:
|
|
110
|
+
CC_ATTACHMENT_TRAVERSAL_BLOCK=0
|
|
111
|
+
EOF
|
|
112
|
+
|
|
113
|
+
if [ "$BLOCK_MODE" = "1" ]; then
|
|
114
|
+
exit 2
|
|
115
|
+
fi
|
|
116
|
+
fi
|
|
117
|
+
|
|
118
|
+
exit 0
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# aup-block-pattern-logger.sh — Persist Usage Policy classifier blocks across sessions
|
|
3
|
+
#
|
|
4
|
+
# Background:
|
|
5
|
+
# Starting 2026-05-18, the Anthropic server-side Usage Policy classifier began
|
|
6
|
+
# over-triggering on benign Claude Code prompts. The block surfaces as one of two
|
|
7
|
+
# stock error strings in tool output:
|
|
8
|
+
# "API Error: Claude Code is unable to respond to this request, which appears to
|
|
9
|
+
# violate our Usage Policy (...). This request triggered cyber-related safeguards."
|
|
10
|
+
# or:
|
|
11
|
+
# "This request triggered safety guardrails. Rephrase your prompt or rewind to continue."
|
|
12
|
+
#
|
|
13
|
+
# The classifier is non-deterministic and shifts over time. 25+ open issues filed
|
|
14
|
+
# between 2026-05-18 and 2026-05-27 across English, Russian, Polish, and Spanish
|
|
15
|
+
# input. The operator has no first-class way to:
|
|
16
|
+
# - reconstruct which sessions hit the block and on what model,
|
|
17
|
+
# - build evidence for a CVP application showing block frequency,
|
|
18
|
+
# - notice when the classifier shifts (drop in block rate / rise after an update).
|
|
19
|
+
#
|
|
20
|
+
# The partner hook aup-false-positive-helper.sh surfaces the four operator-side
|
|
21
|
+
# workarounds at SessionStart. This logger pairs with it by recording each block
|
|
22
|
+
# event PostToolUse, so the operator can review block history later.
|
|
23
|
+
#
|
|
24
|
+
# Reference: https://gist.github.com/yurukusa/4fa4751044be45bd83345601ee79c2db
|
|
25
|
+
#
|
|
26
|
+
# What this hook does:
|
|
27
|
+
# On PostToolUse, scan tool output for AUP-block patterns. When a block is
|
|
28
|
+
# detected, append one line to a persistent log:
|
|
29
|
+
# TIMESTAMP|MODEL|TOOL|PATTERN_KIND|EXCERPT
|
|
30
|
+
# Default log path: ~/.claude/aup-block-history.log
|
|
31
|
+
#
|
|
32
|
+
# Pattern kinds emitted:
|
|
33
|
+
# cyber-safeguards — "triggered cyber-related safeguards"
|
|
34
|
+
# usage-policy — "violate our Usage Policy"
|
|
35
|
+
# safety-guardrails — "triggered safety guardrails"
|
|
36
|
+
# rephrase-rewind — "Rephrase your prompt or rewind to continue"
|
|
37
|
+
# usage-policy-api — "API Error: ... unable to respond" (fallback)
|
|
38
|
+
#
|
|
39
|
+
# By default, a one-line stderr advisory prints the running block count for the
|
|
40
|
+
# current ANTHROPIC_MODEL (or "default-routing" when unset). Silent when no
|
|
41
|
+
# block is detected.
|
|
42
|
+
#
|
|
43
|
+
# When this hook does NOT log or warn:
|
|
44
|
+
# - CC_AUP_BLOCK_LOGGER_DISABLE=1
|
|
45
|
+
# - tool output is empty or unparseable
|
|
46
|
+
# - no AUP block pattern matched
|
|
47
|
+
#
|
|
48
|
+
# Hook config (settings.json):
|
|
49
|
+
# {
|
|
50
|
+
# "hooks": {
|
|
51
|
+
# "PostToolUse": [{
|
|
52
|
+
# "matcher": "",
|
|
53
|
+
# "hooks": [{ "type": "command", "command": "bash ~/.claude/hooks/aup-block-pattern-logger.sh" }]
|
|
54
|
+
# }]
|
|
55
|
+
# }
|
|
56
|
+
# }
|
|
57
|
+
#
|
|
58
|
+
# Env vars:
|
|
59
|
+
# CC_AUP_BLOCK_LOGGER_DISABLE=1 — never log, never warn
|
|
60
|
+
# CC_AUP_BLOCK_LOGGER_QUIET=1 — log silently (no stderr advisory)
|
|
61
|
+
# CC_AUP_BLOCK_LOG_PATH=<path> — override default log path
|
|
62
|
+
# CC_AUP_BLOCK_LOGGER_MAX_LINES=<n> — log rotation threshold (default 500)
|
|
63
|
+
#
|
|
64
|
+
# Output schema (one line per block):
|
|
65
|
+
# ISO8601_UTC | ANTHROPIC_MODEL or "default-routing" | TOOL_NAME | PATTERN_KIND | up-to-120-char excerpt
|
|
66
|
+
#
|
|
67
|
+
# Privacy: only the pattern kind and a short excerpt are recorded. No prompt content,
|
|
68
|
+
# no tool input, no file paths beyond the tool name. The excerpt is the matched line.
|
|
69
|
+
#
|
|
70
|
+
# The registration was missing from this header. The installer reads TRIGGER
|
|
71
|
+
# and MATCHER from here and falls back to PreToolUse / Bash when both are
|
|
72
|
+
# absent, so this hook was being registered at a moment where the field it
|
|
73
|
+
# reads is always empty: it installed, it appeared in the settings, and it
|
|
74
|
+
# did nothing. Measured 2026-08-04 across examples/: 14 files were like this.
|
|
75
|
+
# TRIGGER: PostToolUse
|
|
76
|
+
# MATCHER: ""
|
|
77
|
+
|
|
78
|
+
set -u
|
|
79
|
+
|
|
80
|
+
# Disable path
|
|
81
|
+
if [ "${CC_AUP_BLOCK_LOGGER_DISABLE:-0}" = "1" ]; then
|
|
82
|
+
exit 0
|
|
83
|
+
fi
|
|
84
|
+
|
|
85
|
+
INPUT=$(cat 2>/dev/null || true)
|
|
86
|
+
[ -z "$INPUT" ] && exit 0
|
|
87
|
+
|
|
88
|
+
# Extract tool name and output; fall back to grep if jq is missing.
|
|
89
|
+
if command -v jq >/dev/null 2>&1; then
|
|
90
|
+
TOOL=$(printf '%s' "$INPUT" | jq -r '.tool_name // empty' 2>/dev/null || echo "")
|
|
91
|
+
OUTPUT=$(printf '%s' "$INPUT" | jq -r '.tool_output // .tool_response // empty' 2>/dev/null || echo "")
|
|
92
|
+
else
|
|
93
|
+
TOOL=$(printf '%s' "$INPUT" | grep -oE '"tool_name"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed -E 's/.*"([^"]*)"$/\1/')
|
|
94
|
+
OUTPUT="$INPUT"
|
|
95
|
+
fi
|
|
96
|
+
|
|
97
|
+
[ -z "$OUTPUT" ] && exit 0
|
|
98
|
+
[ -z "$TOOL" ] && TOOL="unknown-tool"
|
|
99
|
+
|
|
100
|
+
# Match patterns in priority order. The first match wins so the recorded kind is
|
|
101
|
+
# the most specific signal available.
|
|
102
|
+
PATTERN_KIND=""
|
|
103
|
+
EXCERPT=""
|
|
104
|
+
match_pattern() {
|
|
105
|
+
local label="$1"
|
|
106
|
+
local regex="$2"
|
|
107
|
+
local line
|
|
108
|
+
line=$(printf '%s' "$OUTPUT" | grep -iE "$regex" | head -1)
|
|
109
|
+
if [ -n "$line" ]; then
|
|
110
|
+
PATTERN_KIND="$label"
|
|
111
|
+
EXCERPT=$(printf '%s' "$line" | tr -d '|\n\r' | head -c 120)
|
|
112
|
+
return 0
|
|
113
|
+
fi
|
|
114
|
+
return 1
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
match_pattern "cyber-safeguards" "triggered cyber-related safeguards" \
|
|
118
|
+
|| match_pattern "safety-guardrails" "triggered safety guardrails" \
|
|
119
|
+
|| match_pattern "rephrase-rewind" "Rephrase your prompt or rewind to continue" \
|
|
120
|
+
|| match_pattern "usage-policy" "violate our Usage Policy" \
|
|
121
|
+
|| match_pattern "usage-policy-api" "API Error.*unable to respond to this request"
|
|
122
|
+
|
|
123
|
+
# No match → silent exit (the overwhelming common case).
|
|
124
|
+
[ -z "$PATTERN_KIND" ] && exit 0
|
|
125
|
+
|
|
126
|
+
LOG_PATH="${CC_AUP_BLOCK_LOG_PATH:-$HOME/.claude/aup-block-history.log}"
|
|
127
|
+
LOG_DIR=$(dirname "$LOG_PATH")
|
|
128
|
+
mkdir -p "$LOG_DIR" 2>/dev/null || exit 0
|
|
129
|
+
|
|
130
|
+
MODEL="${ANTHROPIC_MODEL:-default-routing}"
|
|
131
|
+
TIMESTAMP=$(date -u '+%Y-%m-%dT%H:%M:%SZ')
|
|
132
|
+
|
|
133
|
+
# Append; never block on log failure.
|
|
134
|
+
printf '%s|%s|%s|%s|%s\n' "$TIMESTAMP" "$MODEL" "$TOOL" "$PATTERN_KIND" "$EXCERPT" >> "$LOG_PATH" 2>/dev/null || true
|
|
135
|
+
|
|
136
|
+
# Rotate when the log exceeds the configured threshold. Keep the most recent half.
|
|
137
|
+
MAX_LINES="${CC_AUP_BLOCK_LOGGER_MAX_LINES:-500}"
|
|
138
|
+
if [ -f "$LOG_PATH" ]; then
|
|
139
|
+
CURRENT_LINES=$(wc -l < "$LOG_PATH" 2>/dev/null || echo 0)
|
|
140
|
+
if [ "$CURRENT_LINES" -gt "$MAX_LINES" ] 2>/dev/null; then
|
|
141
|
+
KEEP=$((MAX_LINES / 2))
|
|
142
|
+
[ "$KEEP" -lt 1 ] && KEEP=1
|
|
143
|
+
tail -n "$KEEP" "$LOG_PATH" > "${LOG_PATH}.tmp" 2>/dev/null && mv "${LOG_PATH}.tmp" "$LOG_PATH" 2>/dev/null || true
|
|
144
|
+
fi
|
|
145
|
+
fi
|
|
146
|
+
|
|
147
|
+
# Stderr advisory unless explicitly silenced. Show the running count for the
|
|
148
|
+
# current model so the operator notices when frequency rises.
|
|
149
|
+
if [ "${CC_AUP_BLOCK_LOGGER_QUIET:-0}" != "1" ]; then
|
|
150
|
+
MODEL_COUNT=$(grep -c "|${MODEL}|" "$LOG_PATH" 2>/dev/null || echo 0)
|
|
151
|
+
cat >&2 <<EOF
|
|
152
|
+
[aup-block-pattern-logger] Usage Policy block detected (kind=$PATTERN_KIND, tool=$TOOL).
|
|
153
|
+
Model: $MODEL Cumulative blocks logged for this model: $MODEL_COUNT
|
|
154
|
+
Log: $LOG_PATH
|
|
155
|
+
Workarounds: enable CC_AUP_FALSE_POSITIVE_HELPER_REMIND=1 with aup-false-positive-helper.sh,
|
|
156
|
+
or swap to a Sonnet variant (export ANTHROPIC_MODEL=claude-sonnet-4-7) for sensitive prompts.
|
|
157
|
+
Silence this advisory: export CC_AUP_BLOCK_LOGGER_QUIET=1
|
|
158
|
+
EOF
|
|
159
|
+
fi
|
|
160
|
+
|
|
161
|
+
exit 0
|