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,93 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
set -uo pipefail
|
|
3
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
4
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
5
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
6
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
7
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
8
|
+
_nojq_warned="/tmp/cc-nojq-warned-session-persistence-verifier-$PPID"
|
|
9
|
+
[ -f "$_nojq_warned" ] || {
|
|
10
|
+
echo "WARNING [session-persistence-verifier]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
11
|
+
: > "$_nojq_warned"
|
|
12
|
+
}
|
|
13
|
+
fi
|
|
14
|
+
|
|
15
|
+
if [ "${CC_PERSISTENCE_CHECK_DISABLE:-0}" = "1" ]; then
|
|
16
|
+
exit 0
|
|
17
|
+
fi
|
|
18
|
+
INPUT=$(cat 2>/dev/null || echo '{}')
|
|
19
|
+
SESSION_ID=$(printf '%s' "$INPUT" | jq -r '.session_id // empty' 2>/dev/null)
|
|
20
|
+
if [ -z "$SESSION_ID" ]; then
|
|
21
|
+
exit 0
|
|
22
|
+
fi
|
|
23
|
+
SESSION_DIR="${CC_PERSISTENCE_CHECK_DIR:-${HOME}/.claude/projects}"
|
|
24
|
+
JSONL_FILE=""
|
|
25
|
+
if [ -d "$SESSION_DIR" ]; then
|
|
26
|
+
JSONL_FILE=$(find "$SESSION_DIR" -maxdepth 3 -name "${SESSION_ID}.jsonl" -type f 2>/dev/null | head -1)
|
|
27
|
+
fi
|
|
28
|
+
REQUIRED_REGEX="${CC_PERSISTENCE_REQUIRED:-\"type\":\"(queue-operation|user|assistant)\"}"
|
|
29
|
+
if [ -z "$JSONL_FILE" ] || [ ! -f "$JSONL_FILE" ]; then
|
|
30
|
+
if [ "${CC_PERSISTENCE_STRICT:-0}" = "1" ]; then
|
|
31
|
+
cat >&2 << EOF
|
|
32
|
+
[session-persistence-verifier] Session JSONL file not found for session ${SESSION_ID}.
|
|
33
|
+
The harness may not be persisting this conversation to disk. If this is unexpected:
|
|
34
|
+
1. Back up the in-memory transcript NOW (copy/paste from sidebar to a file)
|
|
35
|
+
2. Check ~/.claude/projects/ for the expected file path
|
|
36
|
+
3. If on 2.1.144/2.1.145, consider downgrading to 2.1.143 (see #60984)
|
|
37
|
+
4. If on the native installer era (2.1.168-2.1.170), a separate write-path
|
|
38
|
+
break is reported (#66486, partially patched in 2.1.170; #66734). It can
|
|
39
|
+
hit interactive sessions while spawned/headless sessions persist fine, and
|
|
40
|
+
can outlive an on-disk binary upgrade because the broken state lives in a
|
|
41
|
+
long-running process. Fully quit ALL Claude Code instances and relaunch --
|
|
42
|
+
a fresh launch has restored persistence per those reports.
|
|
43
|
+
CC_PERSISTENCE_CHECK_DISABLE=1 to skip this check.
|
|
44
|
+
EOF
|
|
45
|
+
exit 2
|
|
46
|
+
fi
|
|
47
|
+
exit 0
|
|
48
|
+
fi
|
|
49
|
+
if [ ! -s "$JSONL_FILE" ]; then
|
|
50
|
+
cat >&2 << EOF
|
|
51
|
+
[session-persistence-verifier] Session JSONL file is empty: ${JSONL_FILE}
|
|
52
|
+
This matches a JSONL writer regression. Two reported windows:
|
|
53
|
+
- #60984 (2.1.144/2.1.145): downgrade to 2.1.143 (last-known-good).
|
|
54
|
+
- #66486 / #66734 (native installer era, 2.1.168-2.1.170): the break can
|
|
55
|
+
outlive an on-disk binary upgrade because it lives in a long-running
|
|
56
|
+
process; fully quit ALL Claude Code instances and relaunch.
|
|
57
|
+
1. Back up the in-memory transcript NOW (copy/paste from sidebar to a file)
|
|
58
|
+
2. Verify your version: claude --version
|
|
59
|
+
3. Apply the matching fix above for your version window
|
|
60
|
+
4. A mirror backup of ~/.claude/projects/**/*.jsonl (size-comparison skip)
|
|
61
|
+
preserves transcripts before an empty file can overwrite them
|
|
62
|
+
CC_PERSISTENCE_CHECK_DISABLE=1 to skip this check.
|
|
63
|
+
EOF
|
|
64
|
+
exit 2
|
|
65
|
+
fi
|
|
66
|
+
if ! grep -qE "$REQUIRED_REGEX" "$JSONL_FILE" 2>/dev/null; then
|
|
67
|
+
has_ai_title=$(grep -c '"type":"ai-title"' "$JSONL_FILE" 2>/dev/null || echo 0)
|
|
68
|
+
line_count=$(wc -l < "$JSONL_FILE" 2>/dev/null || echo 0)
|
|
69
|
+
cat >&2 << EOF
|
|
70
|
+
[session-persistence-verifier] Session JSONL contains no message content: ${JSONL_FILE}
|
|
71
|
+
Found ${line_count} lines, of which ${has_ai_title} are ai-title entries.
|
|
72
|
+
Missing event types: queue-operation, user, assistant.
|
|
73
|
+
This is a metadata-only stub: the file exists but holds no conversation. Two
|
|
74
|
+
reported windows produce this shape:
|
|
75
|
+
- #60984 (2.1.144/2.1.145): JSONL writer broken; downgrade to 2.1.143.
|
|
76
|
+
- #66486 / #66734 (native installer era, 2.1.168-2.1.170): interactive
|
|
77
|
+
sessions stub out while spawned/headless sessions persist fine, and the
|
|
78
|
+
break can outlive an on-disk binary upgrade (it lives in a long-running
|
|
79
|
+
process). Fully quit ALL Claude Code instances and relaunch; a fresh launch
|
|
80
|
+
has restored persistence per those reports.
|
|
81
|
+
Sidebar history for this session will appear empty.
|
|
82
|
+
Action items (do this before exiting):
|
|
83
|
+
1. Back up the in-memory transcript NOW (copy/paste from sidebar to a file)
|
|
84
|
+
2. Verify your version: claude --version
|
|
85
|
+
3. Apply the matching fix above for your version window
|
|
86
|
+
4. A mirror backup of ~/.claude/projects/**/*.jsonl (size-comparison skip)
|
|
87
|
+
preserves transcripts before a stub can overwrite them
|
|
88
|
+
CC_PERSISTENCE_CHECK_DISABLE=1 to skip this check.
|
|
89
|
+
CC_PERSISTENCE_REQUIRED='custom-regex' to override the required event types.
|
|
90
|
+
EOF
|
|
91
|
+
exit 2
|
|
92
|
+
fi
|
|
93
|
+
exit 0
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ================================================================
|
|
3
|
+
# session-plugin-pin-watch.sh — Detect when a marketplace plugin's pinned hooks silently die
|
|
4
|
+
# ================================================================
|
|
5
|
+
# PURPOSE:
|
|
6
|
+
# A running session's plugin hooks are pinned to the plugin version's
|
|
7
|
+
# install path at session start. When a marketplace plugin is updated
|
|
8
|
+
# mid-session, re-materialization removes that old versioned path, so the
|
|
9
|
+
# pinned hook commands become unreachable and silently stop firing — no
|
|
10
|
+
# error, no warning (anthropics/claude-code#73952). Recovery is
|
|
11
|
+
# /reload-plugins or a restart, but nothing tells you the hooks died.
|
|
12
|
+
#
|
|
13
|
+
# HOW IT WORKS:
|
|
14
|
+
# settings.json hooks are NOT plugin-pinned (they are read from
|
|
15
|
+
# settings.json, which re-materialization never touches), so they keep
|
|
16
|
+
# firing and can watch for the plugin-level failure. Register this one
|
|
17
|
+
# script on TWO events:
|
|
18
|
+
# - SessionStart: snapshot the plugin version dirs that exist now.
|
|
19
|
+
# - PreToolUse: if any snapshotted dir has since vanished, the
|
|
20
|
+
# session's pinned hooks for that plugin are dead -> warn
|
|
21
|
+
# (and suggest /reload-plugins). State is refreshed after
|
|
22
|
+
# a warning so it only re-warns on the NEXT disappearance.
|
|
23
|
+
# The warning is emitted via {"systemMessage": ...} so it surfaces to the
|
|
24
|
+
# user without blocking the session.
|
|
25
|
+
#
|
|
26
|
+
# TRIGGER: SessionStart, and PreToolUse
|
|
27
|
+
# MATCHER: PreToolUse "*" (any tool call acts as the heartbeat)
|
|
28
|
+
#
|
|
29
|
+
# CONFIGURATION:
|
|
30
|
+
# CC_PLUGIN_WATCH_GLOB — glob for your plugin's versioned install dirs.
|
|
31
|
+
# Default: $HOME/.claude/plugins/*/*/* (a guess;
|
|
32
|
+
# point it at your actual cache layout).
|
|
33
|
+
# ================================================================
|
|
34
|
+
set -uo pipefail
|
|
35
|
+
|
|
36
|
+
WATCH_GLOB="${CC_PLUGIN_WATCH_GLOB:-$HOME/.claude/plugins/*/*/*}"
|
|
37
|
+
input=$(cat)
|
|
38
|
+
event=$(printf '%s' "$input" | jq -r '.hook_event_name // empty' 2>/dev/null)
|
|
39
|
+
sid=$(printf '%s' "$input" | jq -r '.session_id // "nosid"' 2>/dev/null)
|
|
40
|
+
state="${HOME}/.claude/plugin-pin-watch/${sid}.paths"
|
|
41
|
+
mkdir -p "$(dirname "$state")"
|
|
42
|
+
|
|
43
|
+
# Expand the glob and keep only directories that actually exist, one per line.
|
|
44
|
+
list_dirs() {
|
|
45
|
+
local g="$1" p
|
|
46
|
+
# shellcheck disable=SC2086
|
|
47
|
+
for p in $g; do [ -d "$p" ] && printf '%s\n' "$p"; done
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
case "$event" in
|
|
51
|
+
SessionStart)
|
|
52
|
+
list_dirs "$WATCH_GLOB" | sort -u > "$state"
|
|
53
|
+
exit 0
|
|
54
|
+
;;
|
|
55
|
+
*)
|
|
56
|
+
[ -f "$state" ] || exit 0
|
|
57
|
+
missing=""
|
|
58
|
+
while IFS= read -r d; do
|
|
59
|
+
[ -n "$d" ] && [ ! -d "$d" ] && missing="${missing}\n - ${d}"
|
|
60
|
+
done < "$state"
|
|
61
|
+
if [ -n "$missing" ]; then
|
|
62
|
+
msg="⚠ A plugin version dir present at session start is gone. Marketplace re-materialization may have silently killed this session's pinned hooks (#73952). Run /reload-plugins to rebind, or restart. Missing:$(printf '%b' "$missing")"
|
|
63
|
+
jq -cn --arg m "$msg" '{systemMessage:$m}'
|
|
64
|
+
list_dirs "$WATCH_GLOB" | sort -u > "$state"
|
|
65
|
+
fi
|
|
66
|
+
exit 0
|
|
67
|
+
;;
|
|
68
|
+
esac
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# session-rate-monitor.sh — alert when a single session's token burn rate exceeds an absolute ceiling
|
|
3
|
+
#
|
|
4
|
+
# Why: The Pro Max quota anomaly cluster (#16157 / #38335 / #45756 / #41788 /
|
|
5
|
+
# #29579 / #19673) repeatedly reports the same scenario: a session that
|
|
6
|
+
# hits the usage limit within minutes of starting, before the operator
|
|
7
|
+
# has any chance to see a per-request drift signal or a cross-session
|
|
8
|
+
# rolling-baseline divergence. The two earlier hooks in this family
|
|
9
|
+
# need historical samples before they can speak:
|
|
10
|
+
#
|
|
11
|
+
# - cache-creation-drift-detector.sh needs a 200-sample trailing window
|
|
12
|
+
# and only triggers on per-request server-side inflation (#46917).
|
|
13
|
+
# - quota-anomaly-detector.sh needs 30+ samples and a 24-hour baseline
|
|
14
|
+
# before it has a personal rate to compare against.
|
|
15
|
+
#
|
|
16
|
+
# Neither catches a brand-new session that burns 100K tokens in the
|
|
17
|
+
# first five minutes. This hook closes that gap by tracking per-session
|
|
18
|
+
# elapsed-time and cumulative tokens, then alerting against an absolute
|
|
19
|
+
# tokens-per-minute ceiling. No baseline required; works from request 1.
|
|
20
|
+
#
|
|
21
|
+
# Composes with cache-creation-drift-detector (per-request) and
|
|
22
|
+
# quota-anomaly-detector (cross-session). Three orthogonal signals,
|
|
23
|
+
# three latencies: per-request → per-session → cross-session.
|
|
24
|
+
#
|
|
25
|
+
# Event: PostToolUse MATCHER: "" (all tools)
|
|
26
|
+
# Action: Sum input + output + cache_read + cache_creation tokens from each
|
|
27
|
+
# PostToolUse payload. Maintain per-session state in a small file
|
|
28
|
+
# keyed by session_id, accumulating start_epoch, total_tokens, and
|
|
29
|
+
# sample_count. Compute current rate = total_tokens / minutes_elapsed
|
|
30
|
+
# and emit a one-line stderr warning when it exceeds an absolute
|
|
31
|
+
# threshold (default 50,000 tok/min). Re-alerts at most once every
|
|
32
|
+
# N minutes to avoid spam. Advisory only (exit 0); does not block.
|
|
33
|
+
#
|
|
34
|
+
# Configuration (all optional):
|
|
35
|
+
# CC_SESSION_RATE_DIR State dir (default: ~/.cache/cc-safe-setup/session-rate)
|
|
36
|
+
# CC_SESSION_RATE_THRESHOLD Alert ceiling in tokens/minute (default: 50000)
|
|
37
|
+
# CC_SESSION_RATE_MIN_SAMPLES Minimum samples before alerting (default: 5)
|
|
38
|
+
# CC_SESSION_RATE_MIN_ELAPSED Minimum session-elapsed seconds before alerting (default: 60)
|
|
39
|
+
# CC_SESSION_RATE_REPEAT_MIN Suppress repeat alerts for N minutes (default: 5)
|
|
40
|
+
# CC_SESSION_RATE_SILENT Set to "1" to suppress stderr (still tracks)
|
|
41
|
+
#
|
|
42
|
+
# Inspect state:
|
|
43
|
+
# ls -la ~/.cache/cc-safe-setup/session-rate/
|
|
44
|
+
# cat ~/.cache/cc-safe-setup/session-rate/<session_id>
|
|
45
|
+
#
|
|
46
|
+
# The registration was missing from this header. The installer reads TRIGGER
|
|
47
|
+
# and MATCHER from here and falls back to PreToolUse / Bash when both are
|
|
48
|
+
# absent, so this hook was being registered at a moment where the field it
|
|
49
|
+
# reads is always empty: it installed, it appeared in the settings, and it
|
|
50
|
+
# did nothing. Measured 2026-08-04 across examples/: 14 files were like this.
|
|
51
|
+
# TRIGGER: PostToolUse
|
|
52
|
+
# MATCHER: ""
|
|
53
|
+
|
|
54
|
+
set -u
|
|
55
|
+
|
|
56
|
+
STATE_DIR="${CC_SESSION_RATE_DIR:-${HOME}/.cache/cc-safe-setup/session-rate}"
|
|
57
|
+
THRESHOLD="${CC_SESSION_RATE_THRESHOLD:-50000}"
|
|
58
|
+
MIN_SAMPLES="${CC_SESSION_RATE_MIN_SAMPLES:-5}"
|
|
59
|
+
MIN_ELAPSED="${CC_SESSION_RATE_MIN_ELAPSED:-60}"
|
|
60
|
+
REPEAT_MIN="${CC_SESSION_RATE_REPEAT_MIN:-5}"
|
|
61
|
+
SILENT="${CC_SESSION_RATE_SILENT:-0}"
|
|
62
|
+
|
|
63
|
+
mkdir -p "$STATE_DIR" 2>/dev/null
|
|
64
|
+
|
|
65
|
+
INPUT=$(cat)
|
|
66
|
+
|
|
67
|
+
# Extract session_id; if missing, we can't track per-session state.
|
|
68
|
+
SESSION_ID=$(printf '%s' "$INPUT" | jq -r '.session_id // empty' 2>/dev/null)
|
|
69
|
+
if [ -z "$SESSION_ID" ] || [ "$SESSION_ID" = "null" ]; then
|
|
70
|
+
exit 0
|
|
71
|
+
fi
|
|
72
|
+
|
|
73
|
+
# Sanitize session_id for use as a filename (allow alnum, dash, underscore).
|
|
74
|
+
SAFE_ID=$(printf '%s' "$SESSION_ID" | tr -c 'A-Za-z0-9_-' '_' | cut -c1-128)
|
|
75
|
+
STATE_FILE="$STATE_DIR/$SAFE_ID"
|
|
76
|
+
|
|
77
|
+
# Sum the four token fields from PostToolUse payload.
|
|
78
|
+
TOTAL=$(printf '%s' "$INPUT" | jq -r '
|
|
79
|
+
def num(x): if (x | type) == "number" then x else 0 end;
|
|
80
|
+
(.tool_response.usage // null) as $u |
|
|
81
|
+
if $u == null then empty
|
|
82
|
+
else
|
|
83
|
+
(num($u.input_tokens) + num($u.output_tokens) +
|
|
84
|
+
num($u.cache_read_input_tokens) + num($u.cache_creation_input_tokens))
|
|
85
|
+
end
|
|
86
|
+
' 2>/dev/null)
|
|
87
|
+
|
|
88
|
+
# Fallback: read the last assistant turn's usage from the transcript.
|
|
89
|
+
if [ -z "$TOTAL" ] || [ "$TOTAL" = "0" ]; then
|
|
90
|
+
TRANSCRIPT=$(printf '%s' "$INPUT" | jq -r '.transcript_path // empty' 2>/dev/null)
|
|
91
|
+
if [ -n "$TRANSCRIPT" ] && [ -r "$TRANSCRIPT" ]; then
|
|
92
|
+
LAST_USAGE_LINE=$(tac "$TRANSCRIPT" 2>/dev/null | grep -m1 '"usage"' || true)
|
|
93
|
+
if [ -n "$LAST_USAGE_LINE" ]; then
|
|
94
|
+
TOTAL=$(printf '%s' "$LAST_USAGE_LINE" | jq -r '
|
|
95
|
+
def num(x): if (x | type) == "number" then x else 0 end;
|
|
96
|
+
(.message.usage // .usage // null) as $u |
|
|
97
|
+
if $u == null then empty
|
|
98
|
+
else
|
|
99
|
+
(num($u.input_tokens) + num($u.output_tokens) +
|
|
100
|
+
num($u.cache_read_input_tokens) + num($u.cache_creation_input_tokens))
|
|
101
|
+
end
|
|
102
|
+
' 2>/dev/null)
|
|
103
|
+
fi
|
|
104
|
+
fi
|
|
105
|
+
fi
|
|
106
|
+
|
|
107
|
+
if [ -z "$TOTAL" ] || [ "$TOTAL" = "0" ] || [ "$TOTAL" = "null" ]; then
|
|
108
|
+
exit 0
|
|
109
|
+
fi
|
|
110
|
+
|
|
111
|
+
case "$TOTAL" in
|
|
112
|
+
''|*[!0-9]*) exit 0 ;;
|
|
113
|
+
esac
|
|
114
|
+
|
|
115
|
+
NOW_EPOCH=$(date -u +%s)
|
|
116
|
+
|
|
117
|
+
# Read existing state or initialize. State format (single line, space-separated):
|
|
118
|
+
# start_epoch total_tokens sample_count last_alert_epoch
|
|
119
|
+
if [ -f "$STATE_FILE" ]; then
|
|
120
|
+
read -r START_EPOCH OLD_TOTAL OLD_COUNT LAST_ALERT < "$STATE_FILE" 2>/dev/null
|
|
121
|
+
START_EPOCH="${START_EPOCH:-$NOW_EPOCH}"
|
|
122
|
+
OLD_TOTAL="${OLD_TOTAL:-0}"
|
|
123
|
+
OLD_COUNT="${OLD_COUNT:-0}"
|
|
124
|
+
LAST_ALERT="${LAST_ALERT:-0}"
|
|
125
|
+
else
|
|
126
|
+
START_EPOCH="$NOW_EPOCH"
|
|
127
|
+
OLD_TOTAL=0
|
|
128
|
+
OLD_COUNT=0
|
|
129
|
+
LAST_ALERT=0
|
|
130
|
+
fi
|
|
131
|
+
|
|
132
|
+
NEW_TOTAL=$((OLD_TOTAL + TOTAL))
|
|
133
|
+
NEW_COUNT=$((OLD_COUNT + 1))
|
|
134
|
+
ELAPSED=$((NOW_EPOCH - START_EPOCH))
|
|
135
|
+
|
|
136
|
+
# Write updated state (preserve LAST_ALERT for now; updated below on alert).
|
|
137
|
+
printf '%s %s %s %s\n' "$START_EPOCH" "$NEW_TOTAL" "$NEW_COUNT" "$LAST_ALERT" > "$STATE_FILE"
|
|
138
|
+
|
|
139
|
+
# Need enough samples and enough elapsed time before computing a rate.
|
|
140
|
+
if [ "$NEW_COUNT" -lt "$MIN_SAMPLES" ]; then
|
|
141
|
+
exit 0
|
|
142
|
+
fi
|
|
143
|
+
if [ "$ELAPSED" -lt "$MIN_ELAPSED" ]; then
|
|
144
|
+
exit 0
|
|
145
|
+
fi
|
|
146
|
+
|
|
147
|
+
# Compute rate in tokens/minute. Use awk for float division.
|
|
148
|
+
RATE=$(awk -v t="$NEW_TOTAL" -v e="$ELAPSED" 'BEGIN { if (e > 0) printf "%.0f", t * 60 / e; else print "0" }')
|
|
149
|
+
|
|
150
|
+
# Compare against threshold.
|
|
151
|
+
EXCEEDS=$(awk -v r="$RATE" -v th="$THRESHOLD" 'BEGIN { print (r > th) ? 1 : 0 }')
|
|
152
|
+
if [ "$EXCEEDS" != "1" ]; then
|
|
153
|
+
exit 0
|
|
154
|
+
fi
|
|
155
|
+
|
|
156
|
+
# Repeat-alert suppression: only re-alert every REPEAT_MIN minutes.
|
|
157
|
+
SINCE_LAST=$((NOW_EPOCH - LAST_ALERT))
|
|
158
|
+
REPEAT_SEC=$((REPEAT_MIN * 60))
|
|
159
|
+
if [ "$LAST_ALERT" != "0" ] && [ "$SINCE_LAST" -lt "$REPEAT_SEC" ]; then
|
|
160
|
+
exit 0
|
|
161
|
+
fi
|
|
162
|
+
|
|
163
|
+
# Record this alert time.
|
|
164
|
+
printf '%s %s %s %s\n' "$START_EPOCH" "$NEW_TOTAL" "$NEW_COUNT" "$NOW_EPOCH" > "$STATE_FILE"
|
|
165
|
+
|
|
166
|
+
if [ "$SILENT" = "1" ]; then
|
|
167
|
+
exit 0
|
|
168
|
+
fi
|
|
169
|
+
|
|
170
|
+
ELAPSED_MIN=$(awk -v e="$ELAPSED" 'BEGIN { printf "%.1f", e / 60 }')
|
|
171
|
+
echo "NOTICE: session burning ~${RATE} tok/min over the first ${ELAPSED_MIN}min (${NEW_TOTAL} tokens, ${NEW_COUNT} requests)." >&2
|
|
172
|
+
echo " This exceeds the ${THRESHOLD} tok/min ceiling — at this rate a Max-5x daily quota empties fast." >&2
|
|
173
|
+
echo " Pro Max quota anomaly cluster: anthropics/claude-code #16157 / #38335 / #45756 / #41788." >&2
|
|
174
|
+
echo " Adjust ceiling with CC_SESSION_RATE_THRESHOLD or silence with CC_SESSION_RATE_SILENT=1." >&2
|
|
175
|
+
|
|
176
|
+
exit 0
|
|
File without changes
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# session-start-quota-status.sh — Compute a real-time approximation of the
|
|
3
|
+
# operator's recent token usage from local JSONL transcripts and surface it
|
|
4
|
+
# to Claude Code at session start, so the operator sees their quota
|
|
5
|
+
# posture before issuing the first prompt.
|
|
6
|
+
#
|
|
7
|
+
# Addresses the cluster of issues for which Anthropic does not provide a
|
|
8
|
+
# native dashboard:
|
|
9
|
+
#
|
|
10
|
+
# #16157 (1470+ comments) — "Instantly hitting usage limits with Max
|
|
11
|
+
# subscription"
|
|
12
|
+
# #38335 (723+ comments) — "Claude Max plan session limits exhausted
|
|
13
|
+
# abnormally fast"
|
|
14
|
+
# #29579 (150+ comments) — "Rate limit reached despite Claude Max
|
|
15
|
+
# subscription and only 16% usage"
|
|
16
|
+
#
|
|
17
|
+
# The web-search summary from 2026-05 named the gap explicitly:
|
|
18
|
+
# "There's no official dashboard that shows weekly-cap status in real
|
|
19
|
+
# time, and this gap is one of the most recurring complaints from
|
|
20
|
+
# power users in Anthropic forums."
|
|
21
|
+
#
|
|
22
|
+
# This hook is the operator-side stopgap. It reads
|
|
23
|
+
# `~/.claude/projects/*/[session-id].jsonl` files modified in the last
|
|
24
|
+
# 5 hours (rolling-window approximation of the Anthropic 5-hour cap)
|
|
25
|
+
# and the last 7 days (rolling-window approximation of the weekly cap),
|
|
26
|
+
# sums the input/output/cache tokens by model, computes an estimated
|
|
27
|
+
# dollar-cost at standard API rates, and emits a <system-reminder>
|
|
28
|
+
# surfacing the totals.
|
|
29
|
+
#
|
|
30
|
+
# Important caveats — read these before relying on the numbers:
|
|
31
|
+
#
|
|
32
|
+
# 1. Anthropic's real cap is not directly observable from local
|
|
33
|
+
# transcripts. The hook uses a rolling-window approximation that
|
|
34
|
+
# correlates with cap consumption but does not equal it.
|
|
35
|
+
# 2. Subscription quota is consumed at SUBSCRIPTION rates, not API
|
|
36
|
+
# rates. The dollar figures the hook emits are the EQUIVALENT API
|
|
37
|
+
# cost — useful for comparing against the subscription credit pool
|
|
38
|
+
# (especially the June-15-and-after Pool 2 credit) but not directly
|
|
39
|
+
# equal to what the subscription "spent" against the quota.
|
|
40
|
+
# 3. The 5-hour window calculation is wall-clock-based on file mtime,
|
|
41
|
+
# not based on Anthropic's actual reset timing.
|
|
42
|
+
# 4. The hook is non-blocking. It surfaces information; it does not
|
|
43
|
+
# refuse the session.
|
|
44
|
+
#
|
|
45
|
+
# TRIGGER: SessionStart
|
|
46
|
+
# MATCHER: ""
|
|
47
|
+
#
|
|
48
|
+
# CONFIGURATION (environment variables):
|
|
49
|
+
# CC_QUOTA_5H_WARN_USD default 5.0 — emit a warning if 5-hour
|
|
50
|
+
# equivalent-API-cost exceeds this
|
|
51
|
+
# CC_QUOTA_WEEKLY_WARN_USD default 50.0 — same for weekly
|
|
52
|
+
# CC_QUOTA_PROJECTS_DIR default ~/.claude/projects — JSONL roots
|
|
53
|
+
# CC_QUOTA_STATUS_DISABLE set "1" to disable the hook entirely
|
|
54
|
+
#
|
|
55
|
+
# USAGE (settings.json):
|
|
56
|
+
# {
|
|
57
|
+
# "hooks": {
|
|
58
|
+
# "SessionStart": [{
|
|
59
|
+
# "matcher": "",
|
|
60
|
+
# "hooks": [{
|
|
61
|
+
# "type": "command",
|
|
62
|
+
# "command": "~/.claude/hooks/session-start-quota-status.sh"
|
|
63
|
+
# }]
|
|
64
|
+
# }]
|
|
65
|
+
# }
|
|
66
|
+
# }
|
|
67
|
+
|
|
68
|
+
set -uo pipefail
|
|
69
|
+
|
|
70
|
+
[ "${CC_QUOTA_STATUS_DISABLE:-0}" = "1" ] && exit 0
|
|
71
|
+
|
|
72
|
+
PROJECTS_DIR="${CC_QUOTA_PROJECTS_DIR:-$HOME/.claude/projects}"
|
|
73
|
+
WARN_5H="${CC_QUOTA_5H_WARN_USD:-5.0}"
|
|
74
|
+
WARN_WEEKLY="${CC_QUOTA_WEEKLY_WARN_USD:-50.0}"
|
|
75
|
+
|
|
76
|
+
[ ! -d "$PROJECTS_DIR" ] && exit 0 # No projects directory → silent no-op.
|
|
77
|
+
|
|
78
|
+
# Need jq for JSONL parsing; awk for aggregation.
|
|
79
|
+
command -v jq >/dev/null 2>&1 || exit 0
|
|
80
|
+
|
|
81
|
+
# Compute the rolling sums for one window in minutes.
|
|
82
|
+
# Returns lines: "model:input:output:cache_read:cache_write:dollars"
|
|
83
|
+
compute_window() {
|
|
84
|
+
local window_minutes="$1"
|
|
85
|
+
local out
|
|
86
|
+
|
|
87
|
+
out=$(find "$PROJECTS_DIR" -name '*.jsonl' -mmin "-$window_minutes" 2>/dev/null -exec \
|
|
88
|
+
jq -r 'select(.message.usage and .message.model) | "\(.message.model)\t\(.message.usage.input_tokens // 0)\t\(.message.usage.output_tokens // 0)\t\(.message.usage.cache_read_input_tokens // 0)\t\(.message.usage.cache_creation_input_tokens // 0)"' {} \; 2>/dev/null \
|
|
89
|
+
| awk -F'\t' '
|
|
90
|
+
{
|
|
91
|
+
model = $1
|
|
92
|
+
# Bucket model family for rate lookup
|
|
93
|
+
if (model ~ /opus/) family = "opus"
|
|
94
|
+
else if (model ~ /sonnet/) family = "sonnet"
|
|
95
|
+
else if (model ~ /haiku/) family = "haiku"
|
|
96
|
+
else family = "other"
|
|
97
|
+
|
|
98
|
+
i[family] += $2
|
|
99
|
+
o[family] += $3
|
|
100
|
+
cr[family] += $4
|
|
101
|
+
cw[family] += $5
|
|
102
|
+
}
|
|
103
|
+
END {
|
|
104
|
+
# API rates per million tokens (2026 standard pricing).
|
|
105
|
+
# cache_read is typically 10% of input rate;
|
|
106
|
+
# cache_creation is typically 25% above input rate (1.25x).
|
|
107
|
+
# Using simple input/output rates here for the dollar
|
|
108
|
+
# estimate; cache costs are a refinement.
|
|
109
|
+
rates_in["opus"] = 15.0; rates_out["opus"] = 75.0
|
|
110
|
+
rates_in["sonnet"] = 3.0; rates_out["sonnet"] = 15.0
|
|
111
|
+
rates_in["haiku"] = 1.0; rates_out["haiku"] = 5.0
|
|
112
|
+
rates_in["other"] = 3.0; rates_out["other"] = 15.0
|
|
113
|
+
|
|
114
|
+
for (f in i) {
|
|
115
|
+
# Cost includes cache_read (at 10% of input rate, an
|
|
116
|
+
# approximation) and cache_write (at 1.25x input).
|
|
117
|
+
cost = (i[f] + cw[f] * 1.25 + cr[f] * 0.1) * rates_in[f] / 1000000.0 \
|
|
118
|
+
+ o[f] * rates_out[f] / 1000000.0
|
|
119
|
+
printf "%s\t%d\t%d\t%d\t%d\t%.4f\n", f, i[f], o[f], cr[f], cw[f], cost
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
')
|
|
123
|
+
echo "$out"
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
# 5-hour window (in minutes)
|
|
127
|
+
WINDOW_5H=300
|
|
128
|
+
# 7-day window (in minutes)
|
|
129
|
+
WINDOW_WEEKLY=10080
|
|
130
|
+
|
|
131
|
+
DATA_5H=$(compute_window "$WINDOW_5H")
|
|
132
|
+
DATA_WEEKLY=$(compute_window "$WINDOW_WEEKLY")
|
|
133
|
+
|
|
134
|
+
# If both empty, no recent activity — exit silently.
|
|
135
|
+
[ -z "$DATA_5H" ] && [ -z "$DATA_WEEKLY" ] && exit 0
|
|
136
|
+
|
|
137
|
+
# Compute totals.
|
|
138
|
+
total_5h_cost=$(echo "$DATA_5H" | awk -F'\t' '{s += $6} END {printf "%.2f", s+0}')
|
|
139
|
+
total_weekly_cost=$(echo "$DATA_WEEKLY" | awk -F'\t' '{s += $6} END {printf "%.2f", s+0}')
|
|
140
|
+
|
|
141
|
+
# Format the per-family breakdown.
|
|
142
|
+
format_data() {
|
|
143
|
+
local data="$1"
|
|
144
|
+
[ -z "$data" ] && { echo " (no activity in this window)"; return; }
|
|
145
|
+
echo "$data" | awk -F'\t' '
|
|
146
|
+
{
|
|
147
|
+
family = $1
|
|
148
|
+
i = $2; o = $3; cr = $4; cw = $5; cost = $6
|
|
149
|
+
tot_tokens = i + o + cr + cw
|
|
150
|
+
printf " %-7s input %s output %s cache_read %s cache_write %s est_cost $%.2f\n",
|
|
151
|
+
family, fmt(i), fmt(o), fmt(cr), fmt(cw), cost
|
|
152
|
+
}
|
|
153
|
+
function fmt(n) {
|
|
154
|
+
if (n >= 1000000) return sprintf("%.1fM", n/1000000)
|
|
155
|
+
else if (n >= 1000) return sprintf("%.1fk", n/1000)
|
|
156
|
+
else return sprintf("%d", n)
|
|
157
|
+
}
|
|
158
|
+
'
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
# Determine warning level.
|
|
162
|
+
warn_5h=""
|
|
163
|
+
warn_weekly=""
|
|
164
|
+
if awk -v c="$total_5h_cost" -v t="$WARN_5H" 'BEGIN {exit !(c+0 >= t+0)}'; then
|
|
165
|
+
warn_5h=" [WARN: above CC_QUOTA_5H_WARN_USD threshold of \$$WARN_5H]"
|
|
166
|
+
fi
|
|
167
|
+
if awk -v c="$total_weekly_cost" -v t="$WARN_WEEKLY" 'BEGIN {exit !(c+0 >= t+0)}'; then
|
|
168
|
+
warn_weekly=" [WARN: above CC_QUOTA_WEEKLY_WARN_USD threshold of \$$WARN_WEEKLY]"
|
|
169
|
+
fi
|
|
170
|
+
|
|
171
|
+
# Emit on stderr (SessionStart non-blocking convention).
|
|
172
|
+
cat >&2 <<EOF
|
|
173
|
+
<system-reminder>
|
|
174
|
+
QUOTA STATUS (estimated from local JSONL transcripts; not Anthropic-authoritative)
|
|
175
|
+
|
|
176
|
+
Last 5 hours — estimated API-equivalent cost: \$${total_5h_cost}${warn_5h}
|
|
177
|
+
$(format_data "$DATA_5H")
|
|
178
|
+
|
|
179
|
+
Last 7 days — estimated API-equivalent cost: \$${total_weekly_cost}${warn_weekly}
|
|
180
|
+
$(format_data "$DATA_WEEKLY")
|
|
181
|
+
|
|
182
|
+
Notes:
|
|
183
|
+
- These figures are the equivalent-API cost of your recent token consumption.
|
|
184
|
+
Compare against your subscription tier's Pool 2 credit (June 15 onward:
|
|
185
|
+
\$20 Pro / \$100 Max 5x / \$200 Max 20x per month for programmatic usage).
|
|
186
|
+
- The dashboard Anthropic does not yet provide (#16157, #38335, #29579) lives
|
|
187
|
+
here in the meantime. Set CC_QUOTA_STATUS_DISABLE=1 to silence.
|
|
188
|
+
- Cache cost approximation: cache_read at 10% of input rate, cache_write at
|
|
189
|
+
1.25x input rate. Refine via CC_QUOTA_* env vars if needed.
|
|
190
|
+
</system-reminder>
|
|
191
|
+
EOF
|
|
192
|
+
|
|
193
|
+
exit 0
|
|
@@ -25,6 +25,20 @@
|
|
|
25
25
|
# }
|
|
26
26
|
# }
|
|
27
27
|
|
|
28
|
+
# Verify jq is available BEFORE the git-repo gate, because this concern is not
|
|
29
|
+
# git-specific. Almost every safety hook in this kit parses the tool input with
|
|
30
|
+
# `jq`; when jq is missing, those hooks cannot see the command and most fall
|
|
31
|
+
# through to "allow" (fail-open) — the suite is silently inert while still
|
|
32
|
+
# appearing installed. Surface this loudly at session start so a missing
|
|
33
|
+
# dependency never masquerades as protection. (Fail-open safety hooks: #67917.)
|
|
34
|
+
# Uses only shell builtins, so it works even on a bare PATH.
|
|
35
|
+
if ! command -v jq > /dev/null 2>&1; then
|
|
36
|
+
echo "⚠ WARNING: jq is not installed, but the safety hooks parse tool input with jq." >&2
|
|
37
|
+
echo " Without jq, most blocking hooks fail OPEN (they allow the command instead of" >&2
|
|
38
|
+
echo " blocking it), so your safety hooks are effectively inert until jq is installed." >&2
|
|
39
|
+
echo " Install: (Debian/Ubuntu) sudo apt-get install jq (macOS) brew install jq" >&2
|
|
40
|
+
fi
|
|
41
|
+
|
|
28
42
|
# Only run in git repos
|
|
29
43
|
git rev-parse --git-dir > /dev/null 2>&1 || exit 0
|
|
30
44
|
|
|
@@ -46,11 +60,49 @@ if [ "$UNPUSHED" -gt 0 ]; then
|
|
|
46
60
|
WARNINGS=$((WARNINGS + 1))
|
|
47
61
|
fi
|
|
48
62
|
|
|
49
|
-
# Check for stashes
|
|
63
|
+
# Check for stashes — and specifically surface crash/teleport "auto-stash"
|
|
64
|
+
# entries. When a session crashes or teleports between branches, Claude Code's
|
|
65
|
+
# teardown silently runs `git add` + `git stash push`, so a clean working tree
|
|
66
|
+
# does NOT mean the work was never done — it can be hidden in a stash that other
|
|
67
|
+
# agents/sessions never see. In a shared worktree this is how uncommitted work
|
|
68
|
+
# from research docs and code silently disappears (#66060).
|
|
50
69
|
STASHES=$(git stash list 2>/dev/null | wc -l)
|
|
51
70
|
if [ "$STASHES" -gt 0 ]; then
|
|
52
|
-
|
|
53
|
-
|
|
71
|
+
# The teardown template is "auto-stash: agent <role> (<id>) crashed at <ts>",
|
|
72
|
+
# so matching "auto-stash" is a high-confidence signal with no false positives
|
|
73
|
+
# against the default "WIP on <branch>" messages of manual stashes.
|
|
74
|
+
AUTO_STASHES=$(git stash list 2>/dev/null | grep -cE 'auto-stash|pre-switch' || true)
|
|
75
|
+
if [ "$AUTO_STASHES" -gt 0 ]; then
|
|
76
|
+
echo "⚠ WARNING: $AUTO_STASHES of $STASHES stashes are harness auto-stashes (crash/teleport or branch-switch)." >&2
|
|
77
|
+
# A stash made with --include-untracked has a third parent (the untracked
|
|
78
|
+
UNTRACKED_STASHES=0
|
|
79
|
+
N=$(git stash list 2>/dev/null | wc -l)
|
|
80
|
+
i=0
|
|
81
|
+
while [ "$i" -lt "$N" ]; do
|
|
82
|
+
if git rev-parse --verify --quiet "stash@{$i}^3" >/dev/null 2>&1; then
|
|
83
|
+
UNTRACKED_STASHES=$((UNTRACKED_STASHES + 1))
|
|
84
|
+
fi
|
|
85
|
+
i=$((i + 1))
|
|
86
|
+
done
|
|
87
|
+
if [ "$UNTRACKED_STASHES" -gt 0 ]; then
|
|
88
|
+
echo " ‼ $UNTRACKED_STASHES of these also stashed UNTRACKED files (--include-untracked):" >&2
|
|
89
|
+
echo " those local files vanished from the folder; a sync client may have propagated the deletion." >&2
|
|
90
|
+
echo " List them: git stash show --include-untracked 'stash@{N}'" >&2
|
|
91
|
+
fi
|
|
92
|
+
echo " Uncommitted work is hidden here; a clean working tree is NOT proof it was lost (#66060, #66092)." >&2
|
|
93
|
+
echo " Inspect: git stash list (harness stashes say 'auto-stash' or 'pre-switch')" >&2
|
|
94
|
+
echo " git stash show -p 'stash@{N}'" >&2
|
|
95
|
+
echo " Recover: checkout the branch in the stash's 'On <branch>:' label, then" >&2
|
|
96
|
+
echo " git stash apply 'stash@{N}' (apply, not pop — keeps a safety copy)" >&2
|
|
97
|
+
echo " Root cause for multi-agent setups: agents sharing one worktree." >&2
|
|
98
|
+
echo " Give each agent its own 'git worktree' so a teardown can't reach the others." >&2
|
|
99
|
+
# Hidden work that looks like a clean tree is a real hazard, so don't let
|
|
100
|
+
# the all-clear line below claim everything is fine.
|
|
101
|
+
WARNINGS=$((WARNINGS + 1))
|
|
102
|
+
else
|
|
103
|
+
echo "ℹ NOTE: $STASHES stashed changes exist." >&2
|
|
104
|
+
echo " Review: git stash list" >&2
|
|
105
|
+
fi
|
|
54
106
|
fi
|
|
55
107
|
|
|
56
108
|
if [ "$WARNINGS" -eq 0 ]; then
|
|
File without changes
|
|
File without changes
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
# CC_TOOL_WARN_200 — threshold 2 (default: 200)
|
|
26
26
|
# CC_TOOL_WARN_500 — threshold 3 (default: 500)
|
|
27
27
|
#
|
|
28
|
-
# TRIGGER:
|
|
28
|
+
# TRIGGER: PostToolUse MATCHER: ""
|
|
29
29
|
|
|
30
30
|
INPUT=$(cat)
|
|
31
31
|
TOOL=$(echo "$INPUT" | jq -r '.tool_name // empty' 2>/dev/null)
|