cc-safe-setup 29.8.0 → 30.0.5
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 +421 -512
- package/SAFETY_CHECKLIST.md +15 -7
- package/SERVICES.md +194 -0
- package/SETTINGS_REFERENCE.md +236 -17
- package/SKILL.md +5 -5
- package/TROUBLESHOOTING.md +35 -14
- package/action.yml +12 -4
- package/audit/README.md +84 -0
- package/audit/audit-checklist.md +152 -0
- package/audit/boundary-selftest.sh +85 -0
- package/audit/boundary.sh +123 -0
- package/audit/count-hooks.py +42 -0
- package/audit/find-dead-hooks.sh +82 -0
- package/audit/find-unfirable-rules.sh +142 -0
- package/audit/fire.sh +97 -0
- package/audit/selftest.sh +42 -0
- package/audit/unfirable-selftest.sh +81 -0
- package/audit-web/index.html +9 -9
- package/examples/README.md +54 -17
- package/examples/account-billing-log.sh +98 -0
- package/examples/account-routing-preflight.sh +123 -0
- package/examples/agent-sdk-credit-pool-monitor.sh +145 -0
- package/examples/agent-view-quota-decrement.sh +32 -0
- package/examples/agent-view-quota-warn.sh +94 -0
- package/examples/agents-md-edit-drift-warner.sh +223 -0
- package/examples/agents-md-loader.sh +160 -0
- package/examples/agents-md-sync-checker.sh +102 -0
- package/examples/ai-slop-punctuation-arrest.sh +210 -0
- package/examples/allowlist.sh +70 -10
- package/examples/always-allow-pattern-suggester.sh +125 -0
- package/examples/ansible-vault-guard.sh +2 -1
- package/examples/anthropic-base-url-guard.sh +76 -0
- package/examples/api-busyloop-guard.sh +123 -0
- package/examples/api-endpoint-guard.sh +12 -0
- package/examples/api-key-in-url-guard.sh +17 -1
- package/examples/api-rate-limit-guard.sh +36 -1
- package/examples/api-rate-limit-tracker.sh +12 -0
- package/examples/articulated-scope-capture.sh +101 -0
- package/examples/askuserquestion-autonomy-gate.sh +102 -0
- package/examples/attachment-traversal-guard.sh +118 -0
- package/examples/aup-block-pattern-logger.sh +161 -0
- package/examples/aup-false-positive-helper.sh +124 -0
- package/examples/aup-large-tool-output-warner.sh +282 -0
- package/examples/aup-retry-loop-guard.sh +229 -0
- package/examples/auth-expiry-reminder.sh +157 -0
- package/examples/auth-macos-sleep-detector.sh +185 -0
- package/examples/auth-path-detector.sh +171 -0
- package/examples/auth-status-checker.sh +157 -0
- package/examples/authorized-reconfirmation-detector.sh +195 -0
- package/examples/auto-approve-build.sh +39 -0
- package/examples/auto-approve-cargo.sh +31 -1
- package/examples/auto-approve-docker.sh +35 -0
- package/examples/auto-approve-git-read.sh +37 -14
- package/examples/auto-approve-go.sh +30 -1
- package/examples/auto-approve-gradle.sh +29 -1
- package/examples/auto-approve-make.sh +29 -1
- package/examples/auto-approve-maven.sh +29 -1
- package/examples/auto-approve-python.sh +41 -1
- package/examples/auto-approve-readonly-tools.sh +1 -0
- package/examples/auto-approve-readonly.sh +110 -33
- package/examples/auto-approve-ssh.sh +30 -1
- package/examples/auto-approve-test.sh +44 -0
- package/examples/auto-checkpoint.sh +1 -1
- package/examples/auto-compact-prep.sh +0 -0
- package/examples/auto-git-checkpoint.sh +0 -0
- package/examples/auto-mode-safe-commands.sh +53 -1
- package/examples/auto-mode-safety-enforcer.sh +151 -4
- package/examples/auto-push-session-branch.sh +22 -0
- package/examples/aws-production-guard.sh +13 -1
- package/examples/aws-region-guard.sh +1 -1
- package/examples/background-cost-launch-guard.sh +82 -0
- package/examples/background-task-guard.sh +12 -0
- package/examples/backup-before-refactor.sh +0 -0
- package/examples/banned-command-guard.sh +12 -0
- package/examples/bash-allowlist-secondary-check.sh +157 -0
- package/examples/bash-domain-allowlist.sh +12 -0
- package/examples/bash-fanout-bounded-rewriter.sh +191 -0
- package/examples/bash-heuristic-approver.sh +112 -10
- package/examples/bash-project-fence.sh +194 -0
- package/examples/bash-safety-auto-deny.sh +12 -0
- package/examples/bash-secret-output-detector.sh +44 -3
- package/examples/bash-trace-guard.sh +12 -0
- package/examples/bashrc-safety-check.sh +0 -0
- package/examples/bg-permission-prompt-warner.sh +182 -0
- package/examples/bg-task-cooldown-guard.sh +12 -0
- package/examples/binary-read-detector.sh +135 -0
- package/examples/binary-upload-guard.sh +12 -0
- package/examples/block-database-wipe.sh +35 -10
- package/examples/branch-name-check.sh +8 -3
- package/examples/branch-naming-convention.sh +0 -0
- package/examples/broad-find-guard.sh +12 -0
- package/examples/broad-prefix-session-trap-warner.sh +106 -0
- package/examples/bulk-file-delete-guard.sh +45 -0
- package/examples/bypass-mode-effective-verifier.sh +203 -0
- package/examples/cache-creation-drift-detector.sh +120 -0
- package/examples/cache-residue-detector.sh +195 -0
- package/examples/cache-tier-logger.sh +70 -0
- package/examples/cache-ttl-eviction-detector.sh +149 -0
- package/examples/cargo-publish-guard.sh +14 -1
- package/examples/case-insensitive-path-guard.sh +21 -2
- package/examples/case-sensitive-guard.sh +23 -2
- package/examples/cch-cache-guard.sh +0 -0
- package/examples/cch-sentinel-precommit-guard.sh +47 -0
- package/examples/check-abort-controller.sh +1 -1
- package/examples/check-accessibility.sh +0 -0
- package/examples/check-aria-labels.sh +0 -0
- package/examples/check-before-act-enforcer.sh +12 -0
- package/examples/check-charset-meta.sh +0 -0
- package/examples/check-cookie-flags.sh +0 -0
- package/examples/check-cors-config.sh +0 -0
- package/examples/check-csp-headers.sh +0 -0
- package/examples/check-csrf-protection.sh +0 -0
- package/examples/check-debounce.sh +1 -1
- package/examples/check-dependency-age.sh +0 -0
- package/examples/check-dependency-license.sh +0 -0
- package/examples/check-dockerfile-best-practice.sh +0 -0
- package/examples/check-error-boundaries.sh +0 -0
- package/examples/check-error-class.sh +1 -1
- package/examples/check-error-handling.sh +0 -0
- package/examples/check-error-logging.sh +1 -1
- package/examples/check-error-message.sh +0 -0
- package/examples/check-error-stack.sh +0 -0
- package/examples/check-favicon.sh +0 -0
- package/examples/check-git-hooks-compat.sh +0 -0
- package/examples/check-gitattributes.sh +0 -0
- package/examples/check-https-redirect.sh +0 -0
- package/examples/check-input-validation.sh +0 -0
- package/examples/check-lang-attribute.sh +0 -0
- package/examples/check-npm-scripts-exist.sh +0 -0
- package/examples/check-package-size.sh +0 -0
- package/examples/check-port-availability.sh +0 -0
- package/examples/check-promise-all.sh +1 -1
- package/examples/check-rate-limiting.sh +0 -0
- package/examples/check-return-types.sh +0 -0
- package/examples/check-semantic-versioning.sh +0 -0
- package/examples/check-suspense-fallback.sh +1 -1
- package/examples/check-test-exists.sh +0 -0
- package/examples/check-test-naming.sh +0 -0
- package/examples/check-timeout-cleanup.sh +1 -1
- package/examples/check-tls-version.sh +0 -0
- package/examples/check-unsubscribe.sh +1 -1
- package/examples/check-viewport-meta.sh +0 -0
- package/examples/check-worker-terminate.sh +1 -1
- package/examples/checkpoint-tamper-guard.sh +12 -0
- package/examples/chmod-guard.sh +12 -0
- package/examples/chown-guard.sh +24 -0
- package/examples/ci-workflow-guard.sh +6 -1
- package/examples/claim-verify-detector.sh +109 -0
- package/examples/claim-vs-caveat-checker.sh +77 -0
- package/examples/classifier-fallback-allow.sh +114 -40
- package/examples/claude-cache-gc.sh +1 -0
- package/examples/claude-code-version-pin-advisor.sh +183 -0
- package/examples/claude-md-reinjector.sh +129 -0
- package/examples/claude-md-size-monitor.sh +66 -0
- package/examples/claude-update-budget-guard.sh +123 -0
- package/examples/claude-update-smart.sh +113 -0
- package/examples/claudeignore-enforce-guard.sh +12 -0
- package/examples/claudemd-enforcer.sh +0 -0
- package/examples/claudemd-tool-prohibition.sh +128 -0
- package/examples/clear-command-confirm-guard.sh +32 -15
- package/examples/cli-config-pinning-detector.sh +162 -0
- package/examples/cliff-countdown-advisor.sh +96 -0
- package/examples/clipboard-secret-guard.sh +12 -0
- package/examples/closure-word-verify-gate.sh +150 -0
- package/examples/cloud-cli-guard.sh +39 -2
- package/examples/commit-all-scope-guard.sh +44 -0
- package/examples/commit-message-check.sh +1 -1
- package/examples/commit-message-quality.sh +6 -1
- package/examples/commitment-carry-forward-arrest.sh +361 -0
- package/examples/compact-alert-notification.sh +0 -0
- package/examples/compact-dispatch-watchdog.sh +149 -0
- package/examples/completion-claim-without-verification-detector.sh +207 -0
- package/examples/composer-guard.sh +12 -0
- package/examples/compound-bash-permission-resolver.sh +156 -0
- package/examples/compound-command-allow.sh +1 -1
- package/examples/compound-command-deny-enforcer.sh +183 -0
- package/examples/compound-inject-guard.sh +12 -0
- package/examples/concurrent-edit-lock.sh +12 -0
- package/examples/conflict-marker-guard.sh +12 -0
- package/examples/consecutive-error-breaker.sh +0 -0
- package/examples/console-log-count.sh +1 -0
- package/examples/context-compact-advisor.sh +29 -2
- package/examples/context-length-budget.sh +69 -0
- package/examples/context-threshold-alert.sh +12 -0
- package/examples/context-usage-drift-alert.sh +41 -13
- package/examples/conversation-history-guard.sh +12 -0
- package/examples/core-file-protect-guard.sh +12 -0
- package/examples/cors-star-warn.sh +0 -0
- package/examples/cost-incident-self-audit.sh +162 -0
- package/examples/cowork-claude-md-load-checker.sh +100 -0
- package/examples/cowork-fuse-staleness-watcher.sh +140 -0
- package/examples/cowork-hook-absence-warner.sh +167 -0
- package/examples/cowork-model-picker-advisor.sh +115 -0
- package/examples/credential-exfil-guard.sh +65 -4
- package/examples/credential-file-cat-guard.sh +17 -1
- package/examples/cron-create-receipt.sh +112 -0
- package/examples/cron-modification-guard.sh +12 -0
- package/examples/cross-product-mcp-spawn-detector.sh +178 -0
- package/examples/cwd-project-boundary-guard.sh +0 -0
- package/examples/daemon-zombie-worker-surfacer.sh +118 -0
- package/examples/daily-cost-guard.sh +164 -0
- package/examples/daily-usage-tracker.sh +0 -0
- package/examples/dangerous-pip-flag-guard.sh +12 -0
- package/examples/db-connect-guard.sh +13 -1
- package/examples/denied-action-retry-guard.sh +12 -0
- package/examples/deny-bypass-detector.sh +12 -0
- package/examples/deny-rule-integrity-verifier.sh +181 -0
- package/examples/dependency-install-guard.sh +12 -0
- package/examples/deploy-guard.sh +14 -2
- package/examples/deploy-path-verify-guard.sh +12 -0
- package/examples/deployment-readback-gate.sh +135 -0
- package/examples/deployment-readback-gh-adapter.sh +247 -0
- package/examples/deployment-verify-guard.sh +25 -2
- package/examples/destructive-db-script-write-guard.sh +166 -0
- package/examples/destructive-migration-write-guard.sh +163 -0
- package/examples/diff-size-guard.sh +12 -0
- package/examples/disabled-feature-toggle-advisor.sh +88 -0
- package/examples/disk-partition-guard.sh +12 -0
- package/examples/dispatch-allowlist-preflight.sh +301 -0
- package/examples/dispatch-liveness-watchdog.sh +216 -0
- package/examples/dispatch-receipt.sh +174 -0
- package/examples/django-migrate-guard.sh +12 -0
- package/examples/dns-config-guard.sh +12 -0
- package/examples/docker-dangerous-guard.sh +12 -0
- package/examples/docker-volume-guard.sh +0 -0
- package/examples/dockerfile-latest-guard.sh +1 -0
- package/examples/dotenv-anthropic-key-billing-guard.sh +99 -0
- package/examples/dotenv-commit-guard.sh +12 -0
- package/examples/dotenv-read-guard.sh +12 -0
- package/examples/dotfile-protection-guard.sh +12 -0
- package/examples/dotnet-build-on-edit.sh +1 -1
- package/examples/drizzle-migrate-guard.sh +27 -2
- package/examples/echo-probe-spam-detector.sh +176 -0
- package/examples/edit-counter-test-gate.sh +12 -0
- package/examples/edit-error-counter.sh +1 -1
- package/examples/edit-guard.sh +12 -0
- package/examples/edit-old-string-validator.sh +12 -0
- package/examples/edit-quote-ambiguity-guard.sh +97 -0
- package/examples/edit-retry-loop-guard.sh +0 -0
- package/examples/edit-verify.sh +0 -0
- package/examples/env-inline-secret-guard.sh +14 -2
- package/examples/env-naming-convention.sh +0 -0
- package/examples/env-prod-guard.sh +0 -0
- package/examples/env-required-check.sh +0 -0
- package/examples/env-source-guard.sh +12 -0
- package/examples/env-var-check.sh +24 -1
- package/examples/ephemeral-container-detector.sh +147 -0
- package/examples/error-memory-guard.sh +12 -0
- package/examples/evidence-claim-gate.sh +187 -0
- package/examples/exploration-budget-guard.sh +12 -0
- package/examples/expo-eject-guard.sh +13 -0
- package/examples/extended-thinking-loop-guard.sh +139 -0
- package/examples/extended-thinking-resume-warning.sh +119 -0
- package/examples/extended-thinking-tool-use-mismatch-detector.sh +212 -0
- package/examples/fabricated-command-detector.sh +145 -0
- package/examples/false-disk-full-guard.sh +63 -0
- package/examples/feature-deprecation-detector.sh +109 -0
- package/examples/file-change-tracker.sh +1 -1
- package/examples/file-change-undo-tracker.sh +0 -0
- package/examples/file-edit-backup.sh +63 -14
- package/examples/file-reference-check.sh +0 -0
- package/examples/file-size-limit.sh +12 -0
- package/examples/financial-operation-guard.sh +12 -0
- package/examples/firewall-guard.sh +12 -0
- package/examples/fish-shell-wrapper.sh +125 -7
- package/examples/five-hundred-milestone.sh +1 -0
- package/examples/flask-static-route-guard.sh +89 -0
- package/examples/forbidden-response-phrase-detector.sh +161 -0
- package/examples/gem-push-guard.sh +13 -0
- package/examples/gh-cli-destructive-guard.sh +13 -1
- package/examples/git-checkout-safety-guard.sh +12 -0
- package/examples/git-checkout-uncommitted-guard.sh +12 -0
- package/examples/git-config-guard.sh +12 -0
- package/examples/git-crypt-worktree-guard.sh +12 -0
- package/examples/git-filter-repo-guard.sh +56 -0
- package/examples/git-history-rewrite-guard.sh +12 -0
- package/examples/git-hook-bypass-guard.sh +0 -0
- package/examples/git-maintenance-guard.sh +83 -0
- package/examples/git-merge-conflict-prevent.sh +0 -0
- package/examples/git-message-length-check.sh +0 -0
- package/examples/git-message-length.sh +0 -0
- package/examples/git-operations-require-approval.sh +68 -14
- package/examples/git-pack-temp-cleanup-guard.sh +102 -0
- package/examples/git-push-blast-radius-guard.sh +218 -0
- package/examples/git-remote-guard.sh +24 -3
- package/examples/git-rm-orphan-wipe-guard.sh +85 -0
- package/examples/git-stash-before-checkout.sh +12 -0
- package/examples/git-stash-before-danger.sh +0 -0
- package/examples/git-submodule-guard.sh +69 -2
- package/examples/git-tag-guard.sh +12 -0
- package/examples/github-actions-secret-guard.sh +0 -0
- package/examples/gitignore-check.sh +0 -0
- package/examples/gitops-drift-guard.sh +12 -0
- package/examples/go-mod-tidy-warn.sh +1 -0
- package/examples/go-vet-after-edit.sh +12 -0
- package/examples/goal-iteration-limit-warner.sh +152 -0
- package/examples/grep-nul-false-negative-guard.sh +30 -0
- package/examples/growthbook-flag-monitor.sh +257 -0
- package/examples/hallucination-url-check.sh +1 -1
- package/examples/halt-signal-detector.sh +135 -0
- package/examples/handoff-on-clear.sh +65 -0
- package/examples/hardcoded-ip-guard.sh +1 -0
- package/examples/headless-empty-result-guard.sh +0 -0
- package/examples/headless-stop-guard.sh +0 -0
- package/examples/helm-install-guard.sh +2 -1
- package/examples/home-critical-bash-guard.sh +17 -1
- package/examples/hook-debug-wrapper.sh +6 -2
- package/examples/hook-permission-fixer.sh +0 -0
- package/examples/hook-self-disable-detector.sh +99 -0
- package/examples/hook-stdout-sanitizer.sh +6 -2
- package/examples/hook-tamper-guard.sh +12 -0
- package/examples/idle-session-cost-alert.sh +0 -0
- package/examples/image-dimension-guard.sh +109 -0
- package/examples/image-file-validator.sh +0 -0
- package/examples/iteration-quality-degradation-detector.sh +170 -0
- package/examples/java-compile-on-edit.sh +1 -1
- package/examples/json-syntax-check.sh +0 -0
- package/examples/k8s-production-guard.sh +13 -1
- package/examples/kill-process-guard.sh +12 -0
- package/examples/kubernetes-guard.sh +13 -1
- package/examples/laravel-artisan-guard.sh +13 -0
- package/examples/large-file-guard.sh +1 -1
- package/examples/log-level-guard.sh +0 -0
- package/examples/log-truncation-guard.sh +12 -0
- package/examples/long-session-malformed-tool-call-detector.sh +183 -0
- package/examples/loop-detector.sh +12 -0
- package/examples/magic-number-warn.sh +1 -0
- package/examples/main-branch-warn.sh +12 -0
- package/examples/markdown-link-check.sh +0 -0
- package/examples/max-concurrent-agents.sh +12 -0
- package/examples/max-edit-size-guard.sh +13 -0
- package/examples/max-file-count-guard.sh +0 -0
- package/examples/max-file-delete-count.sh +0 -0
- package/examples/max-function-length.sh +1 -0
- package/examples/max-import-count.sh +0 -0
- package/examples/max-subagent-count.sh +0 -0
- package/examples/mcp-config-freeze.sh +12 -0
- package/examples/mcp-config-poisoning-audit.sh +150 -0
- package/examples/mcp-data-boundary.sh +1 -1
- package/examples/mcp-misdiagnosis-arrest.sh +209 -0
- package/examples/mcp-orphan-leak-warner.sh +49 -0
- package/examples/mcp-permissions-ask-warner.sh +151 -0
- package/examples/mcp-routine-approval-detector.sh +154 -0
- package/examples/mcp-server-allowlist.sh +12 -0
- package/examples/mcp-server-guard.sh +12 -0
- package/examples/mcp-startup-bloat-detector.sh +87 -0
- package/examples/mcp-stdio-compatibility-test.sh +153 -0
- package/examples/mcp-tool-audit-log.sh +0 -0
- package/examples/mcp-tool-guard.sh +101 -1
- package/examples/mcp-warmup-wait.sh +0 -0
- package/examples/memory-chain-audit.sh +56 -0
- package/examples/memory-orphan-detector.sh +188 -0
- package/examples/memory-write-guard.sh +99 -17
- package/examples/migration-verify-guard.sh +12 -0
- package/examples/model-swap-suggester.sh +177 -0
- package/examples/model-version-alert.sh +5 -1
- package/examples/model-version-lock.sh +63 -0
- package/examples/move-delete-sequence-guard.sh +33 -2
- package/examples/multi-file-plan-routing-gate.sh +192 -0
- package/examples/multi-vendor-concurrent-warner.sh +108 -0
- package/examples/multi-window-auth-drift-detector.sh +183 -0
- package/examples/multiline-command-approver.sh +161 -23
- package/examples/nested-background-agent-guard.sh +109 -0
- package/examples/nested-spawn-inflight-guard.sh +178 -0
- package/examples/network-exfil-guard.sh +12 -0
- package/examples/network-guard.sh +12 -0
- package/examples/network-interface-guard.sh +12 -0
- package/examples/nextjs-env-guard.sh +1 -1
- package/examples/no-absolute-import.sh +0 -0
- package/examples/no-alert-confirm-prompt.sh +0 -0
- package/examples/no-anonymous-default-export.sh +0 -0
- package/examples/no-any-type.sh +0 -0
- package/examples/no-any-typescript.sh +1 -0
- package/examples/no-ask-human.sh +12 -0
- package/examples/no-assignment-in-condition.sh +0 -0
- package/examples/no-base64-exfil.sh +12 -0
- package/examples/no-callback-hell.sh +0 -0
- package/examples/no-circular-dependency.sh +0 -0
- package/examples/no-cleartext-storage.sh +0 -0
- package/examples/no-commented-code.sh +0 -0
- package/examples/no-commit-fixup.sh +0 -0
- package/examples/no-console-assert.sh +0 -0
- package/examples/no-console-error-swallow.sh +0 -0
- package/examples/no-console-in-prod.sh +0 -0
- package/examples/no-console-log-commit.sh +12 -0
- package/examples/no-console-log.sh +0 -0
- package/examples/no-console-time.sh +0 -0
- package/examples/no-cors-wildcard.sh +4 -1
- package/examples/no-curl-upload.sh +0 -0
- package/examples/no-dangerouslySetInnerHTML.sh +0 -0
- package/examples/no-dangling-await.sh +1 -0
- package/examples/no-debug-commit.sh +12 -0
- package/examples/no-debug-in-commit.sh +0 -0
- package/examples/no-deep-nesting.sh +0 -0
- package/examples/no-deep-relative-import.sh +1 -0
- package/examples/no-default-credentials.sh +0 -0
- package/examples/no-deploy-friday.sh +13 -1
- package/examples/no-disabled-test.sh +0 -0
- package/examples/no-document-write.sh +0 -0
- package/examples/no-empty-function.sh +0 -0
- package/examples/no-eval-in-template.sh +0 -0
- package/examples/no-eval-template.sh +3 -1
- package/examples/no-eval.sh +0 -0
- package/examples/no-exec-user-input.sh +0 -0
- package/examples/no-fixme-ship.sh +12 -0
- package/examples/no-floating-promises.sh +0 -0
- package/examples/no-force-flag.sh +22 -5
- package/examples/no-force-install.sh +0 -0
- package/examples/no-git-amend.sh +12 -0
- package/examples/no-git-rebase-public.sh +0 -0
- package/examples/no-global-install.sh +12 -0
- package/examples/no-global-state.sh +0 -0
- package/examples/no-hardcoded-port.sh +1 -0
- package/examples/no-hardcoded-url.sh +0 -0
- package/examples/no-helmet-missing.sh +0 -0
- package/examples/no-http-url.sh +1 -0
- package/examples/no-http-without-https.sh +0 -0
- package/examples/no-inline-style.sh +0 -0
- package/examples/no-inline-styles.sh +1 -0
- package/examples/no-innerhtml.sh +0 -0
- package/examples/no-install-global.sh +12 -0
- package/examples/no-jwt-in-url.sh +0 -0
- package/examples/no-large-commit.sh +0 -0
- package/examples/no-localhost-expose.sh +0 -0
- package/examples/no-magic-number.sh +0 -0
- package/examples/no-md5-sha1.sh +0 -0
- package/examples/no-mixed-line-endings.sh +8 -1
- package/examples/no-mutation-in-reducer.sh +0 -0
- package/examples/no-nested-ternary.sh +0 -0
- package/examples/no-network-exfil.sh +0 -0
- package/examples/no-open-redirect.sh +0 -0
- package/examples/no-output-truncation.sh +12 -0
- package/examples/no-package-downgrade.sh +0 -0
- package/examples/no-package-lock-edit.sh +12 -0
- package/examples/no-path-join-user-input.sh +0 -0
- package/examples/no-port-bind.sh +0 -0
- package/examples/no-process-exit.sh +0 -0
- package/examples/no-prototype-pollution.sh +0 -0
- package/examples/no-push-without-ci.sh +0 -0
- package/examples/no-push-without-tests.sh +12 -0
- package/examples/no-raw-password-in-url.sh +0 -0
- package/examples/no-root-user-docker.sh +1 -0
- package/examples/no-root-write.sh +12 -0
- package/examples/no-secrets-in-args.sh +4 -1
- package/examples/no-secrets-in-logs.sh +0 -0
- package/examples/no-sensitive-log.sh +0 -0
- package/examples/no-sleep-in-hooks.sh +0 -0
- package/examples/no-star-import-python.sh +1 -0
- package/examples/no-string-concat-sql.sh +0 -0
- package/examples/no-sudo-guard.sh +12 -0
- package/examples/no-sync-fs.sh +0 -0
- package/examples/no-todo-in-merge.sh +0 -0
- package/examples/no-todo-in-production.sh +1 -0
- package/examples/no-todo-without-issue.sh +0 -0
- package/examples/no-unused-import.sh +0 -0
- package/examples/no-var-keyword.sh +0 -0
- package/examples/no-verify-blocker.sh +12 -0
- package/examples/no-wget-piped-bash.sh +12 -0
- package/examples/no-wildcard-cors.sh +0 -0
- package/examples/no-wildcard-delete.sh +0 -0
- package/examples/no-wildcard-import.sh +0 -0
- package/examples/no-with-statement.sh +0 -0
- package/examples/no-write-outside-src.sh +0 -0
- package/examples/no-xml-external-entity.sh +0 -0
- package/examples/non-english-quality-warner.sh +156 -0
- package/examples/notify-waiting.sh +1 -1
- package/examples/npm-audit-warn.sh +0 -0
- package/examples/npm-global-install-guard.sh +12 -0
- package/examples/npm-publish-guard.sh +12 -0
- package/examples/npm-script-injection.sh +0 -0
- package/examples/npm-supply-chain-guard.sh +0 -0
- package/examples/nuxt-config-guard.sh +1 -0
- package/examples/oauth-refresh-monitor.sh +210 -0
- package/examples/opus-degradation-tracker.sh +187 -0
- package/examples/opus48-routine-task-warning.sh +196 -0
- package/examples/opus48-thinking-wedge-advisor.sh +143 -0
- package/examples/output-credential-scan.sh +1 -1
- package/examples/output-secret-mask.sh +31 -9
- package/examples/output-token-spike-detector.sh +145 -0
- package/examples/package-json-guard.sh +12 -0
- package/examples/package-lock-frozen.sh +12 -0
- package/examples/parallel-batch-size-limiter.sh +121 -0
- package/examples/parallel-cascade-detector.sh +116 -0
- package/examples/partial-view-claim-arrest.sh +174 -0
- package/examples/path-deny-bash-guard.sh +12 -0
- package/examples/path-traversal-guard.sh +12 -0
- package/examples/per-prompt-token-cap.sh +124 -0
- package/examples/permission-audit-log.sh +1 -1
- package/examples/permission-denial-enforcer.sh +12 -0
- package/examples/permission-entry-validator.sh +0 -0
- package/examples/persisted-1m-model-advisor.sh +88 -0
- package/examples/php-lint-on-edit.sh +1 -1
- package/examples/pii-upload-guard.sh +12 -0
- package/examples/pip-publish-guard.sh +13 -0
- package/examples/pip-requirements-guard.sh +12 -0
- package/examples/pip-venv-required.sh +12 -0
- package/examples/plan-mode-edit-guard.sh +12 -0
- package/examples/plan-mode-enforcer.sh +12 -0
- package/examples/plan-mode-strict-guard.sh +12 -0
- package/examples/plugin-hooks-json-bloat-detector.sh +169 -0
- package/examples/plugin-process-cleanup.sh +0 -0
- package/examples/polyglot-rm-guard.sh +12 -0
- package/examples/post-compact-safety.sh +12 -0
- package/examples/post-edit-disk-verify.sh +152 -0
- package/examples/powershell-remove-item-guard.sh +85 -0
- package/examples/pr-description-check.sh +0 -0
- package/examples/pr-duplicate-guard.sh +13 -0
- package/examples/pre-bash-sed-line-ending-windows.sh +87 -0
- package/examples/pre-compact-knowledge-save.sh +0 -0
- package/examples/pre-compact-transcript-backup.sh +0 -0
- package/examples/pre-execution-claim-detector.sh +179 -0
- package/examples/prefer-builtin-tools.sh +10 -1
- package/examples/prefer-const.sh +0 -0
- package/examples/prefer-dedicated-tools.sh +12 -0
- package/examples/prefer-optional-chaining.sh +0 -0
- package/examples/prisma-migrate-guard.sh +24 -7
- package/examples/production-port-kill-guard.sh +12 -0
- package/examples/prompt-injection-guard.sh +2 -1
- package/examples/prompt-usage-logger.sh +0 -0
- package/examples/protect-claudemd.sh +12 -0
- package/examples/protect-dotfiles.sh +12 -0
- package/examples/proxy-capture-suggester.sh +159 -0
- package/examples/public-artefact-socratic-narrowing.sh +232 -0
- package/examples/public-repo-push-guard.sh +12 -0
- package/examples/push-requires-test-pass-record.sh +0 -0
- package/examples/push-requires-test-pass.sh +12 -0
- package/examples/quota-anomaly-detector.sh +173 -0
- package/examples/quota-reset-audit.sh +58 -0
- package/examples/quoted-flag-approver.sh +99 -10
- package/examples/rails-migration-guard.sh +12 -0
- package/examples/rate-limit-guard.sh +0 -0
- package/examples/read-all-files-enforcer.sh +0 -0
- package/examples/read-budget-guard.sh +12 -0
- package/examples/read-loop-detector.sh +59 -0
- package/examples/read-once-guard.sh +96 -0
- package/examples/read-only-mode.sh +12 -0
- package/examples/readme-exists-check.sh +0 -0
- package/examples/record-read-coverage.sh +73 -0
- package/examples/redirect-fragment-warner.sh +149 -0
- package/examples/redis-flushall-guard.sh +13 -0
- package/examples/redundant-read-blocker.sh +132 -0
- package/examples/refusal-arrest-gate.sh +248 -0
- package/examples/registry-publish-guard.sh +13 -1
- package/examples/remote-control-billing-classifier.sh +135 -0
- package/examples/replace-all-guard.sh +12 -0
- package/examples/repo-visibility-guard.sh +12 -0
- package/examples/reroute-after-block-guard.sh +150 -0
- package/examples/response-budget-guard.sh +0 -0
- package/examples/resume-drift-watcher.sh +57 -0
- package/examples/rg-replace-flag-detector.sh +125 -0
- package/examples/rhetorical-verification-prompt-detector.sh +102 -0
- package/examples/ripgrep-permission-fix.sh +0 -0
- package/examples/rm-safety-net.sh +151 -8
- package/examples/role-tool-guard.sh +12 -0
- package/examples/route-handler-emptiness-gate.sh +324 -0
- package/examples/ruby-lint-on-edit.sh +1 -1
- package/examples/runtime-binary-change-detector.sh +102 -0
- package/examples/same-command-repeat-detector.sh +196 -0
- package/examples/same-correction-arrest.sh +169 -0
- package/examples/sandbox-denywrite-enforcer.sh +78 -0
- package/examples/sandbox-relative-path-audit.sh +83 -25
- package/examples/sandbox-write-verify.sh +12 -0
- package/examples/schema-migration-guard.sh +0 -0
- package/examples/scope-expansion-receipt.sh +178 -0
- package/examples/scope-guard.sh +88 -9
- package/examples/secret-file-read-guard.sh +12 -0
- package/examples/secret-file-write-guard.sh +150 -0
- package/examples/self-modify-bypass-guard.sh +0 -0
- package/examples/sensitive-file-read-guard.sh +23 -3
- package/examples/sensitive-log-guard.sh +1 -0
- package/examples/server-side-prompt-injection-detector.sh +69 -0
- package/examples/session-agent-cost-limiter.sh +12 -0
- package/examples/session-backup-on-start.sh +1 -1
- package/examples/session-cost-alert.sh +12 -0
- package/examples/session-drift-guard.sh +12 -0
- package/examples/session-duration-guard.sh +25 -2
- package/examples/session-end-logger.sh +0 -0
- package/examples/session-health-monitor.sh +0 -0
- package/examples/session-index-repair.sh +1 -1
- package/examples/session-memory-watchdog.sh +1 -0
- package/examples/session-permission-reset-guard.sh +12 -0
- package/examples/session-persistence-verifier.sh +93 -0
- package/examples/session-plugin-pin-watch.sh +68 -0
- package/examples/session-rate-monitor.sh +176 -0
- package/examples/session-resume-env-fix.sh +0 -0
- package/examples/session-start-quota-status.sh +193 -0
- package/examples/session-start-safety-check.sh +55 -3
- package/examples/session-state-saver.sh +0 -0
- package/examples/session-summary-stop.sh +1 -1
- package/examples/session-summary.sh +0 -0
- package/examples/session-token-counter.sh +1 -1
- package/examples/settings-hooks-key-restorer.sh +99 -0
- package/examples/settings-json-health-check.sh +57 -0
- package/examples/settings-json-model-guard.sh +0 -0
- package/examples/settings-regression-tester.sh +188 -0
- package/examples/shell-config-truncation-guard.sh +12 -0
- package/examples/shell-wrapper-guard.sh +12 -0
- package/examples/skill-cumulative-size-detector.sh +104 -0
- package/examples/skill-description-drop-detector.sh +148 -0
- package/examples/skill-gate.sh +0 -0
- package/examples/skill-truncation-detector.sh +154 -0
- package/examples/skills-context-recorder.sh +167 -0
- package/examples/skills-load-verifier.sh +96 -0
- package/examples/skills-settings-validator.sh +139 -0
- package/examples/sonnet-45-deprecation-helper.sh +85 -0
- package/examples/spec-file-scope-guard.sh +12 -0
- package/examples/spring-profile-guard.sh +1 -0
- package/examples/spurious-malformed-notice-detector.sh +247 -0
- package/examples/sql-bulk-delete-warn.sh +88 -0
- package/examples/sql-injection-detect.sh +0 -0
- package/examples/ssh-key-protect.sh +12 -0
- package/examples/staged-secret-scan.sh +22 -1
- package/examples/stale-temp-settings-detector.sh +86 -0
- package/examples/standing-rule-session-surfacer.sh +137 -0
- package/examples/stop-hook-sigterm-wrapper.sh +182 -0
- package/examples/stop-transcript-write-health.sh +64 -0
- package/examples/strict-allowlist.sh +57 -15
- package/examples/strip-coauthored-by.sh +50 -10
- package/examples/subagent-blast-radius-guard.sh +184 -0
- package/examples/subagent-boundary-precheck.sh +126 -0
- package/examples/subagent-budget-guard.sh +12 -0
- package/examples/subagent-claudemd-inject.sh +0 -0
- package/examples/subagent-closure-verify-gate.sh +164 -0
- package/examples/subagent-destructive-git-guard.sh +120 -0
- package/examples/subagent-error-detector.sh +0 -0
- package/examples/subagent-forged-system-reminder-guard.sh +156 -0
- package/examples/subagent-identity-leak-guard.sh +102 -0
- package/examples/subagent-identity-reassertion.sh +51 -0
- package/examples/subagent-inheritance-tester.sh +179 -0
- package/examples/subagent-permission-mode-guard.sh +110 -0
- package/examples/subagent-scope-guard.sh +12 -0
- package/examples/subagent-spawn-verification-enforcer.sh +102 -0
- package/examples/subagent-tool-allowlist-enforcer.sh +101 -0
- package/examples/subagent-tool-call-limiter.sh +87 -15
- package/examples/subcommand-chain-guard.sh +12 -0
- package/examples/subscription-api-billing-warner.sh +160 -0
- package/examples/subscription-bypass-detector.sh +152 -0
- package/examples/svelte-lint-on-edit.sh +1 -0
- package/examples/swift-build-on-edit.sh +1 -1
- package/examples/symlink-guard.sh +27 -2
- package/examples/symlink-protect.sh +1 -0
- package/examples/system-dir-protection-guard.sh +73 -8
- package/examples/system-message-workaround.sh +38 -13
- package/examples/system-package-guard.sh +12 -0
- package/examples/systemd-service-guard.sh +12 -0
- package/examples/task-integrity-guard.sh +12 -0
- package/examples/temp-file-cleanup.sh +1 -1
- package/examples/temporal-suggestion-detector.sh +135 -0
- package/examples/terraform-guard.sh +27 -6
- package/examples/test-after-edit.sh +1 -1
- package/examples/test-before-push.sh +12 -0
- package/examples/test-coverage-reminder.sh +24 -1
- package/examples/thinking-budget-effort-mismatch-detector.sh +149 -0
- package/examples/timezone-guard.sh +0 -0
- package/examples/tmp-output-size-guard.sh +0 -0
- package/examples/todo-check.sh +1 -1
- package/examples/token-budget-guard.sh +12 -0
- package/examples/token-budget-per-task.sh +12 -0
- package/examples/token-usage-tracker.sh +7 -1
- package/examples/tokenizer-ratio-alert-corpus.sh +90 -0
- package/examples/tokenizer-ratio-alert.sh +104 -0
- package/examples/tool-call-rate-limiter.sh +0 -0
- package/examples/tool-result-correlation-checker.sh +167 -0
- package/examples/tool-result-size-guard.sh +132 -0
- package/examples/tool-retry-budget-guard.sh +12 -0
- package/examples/transcript-contamination-detector.sh +138 -0
- package/examples/trustfall-mcp-injection-guard.sh +103 -0
- package/examples/ultrareview-large-diff-advisor.sh +184 -0
- package/examples/unbounded-output-guard.sh +94 -0
- package/examples/uncommitted-changes-stop.sh +1 -0
- package/examples/uncommitted-discard-guard.sh +23 -5
- package/examples/uncommitted-work-guard.sh +12 -0
- package/examples/usage-warn.sh +0 -0
- package/examples/user-account-guard.sh +12 -0
- package/examples/userprompt-submit-receipt.sh +123 -0
- package/examples/variable-expansion-guard.sh +12 -0
- package/examples/verify-after-publish-reminder.sh +93 -0
- package/examples/verify-before-commit.sh +12 -0
- package/examples/version-bump-detector.sh +156 -0
- package/examples/version-regression-warner.sh +144 -0
- package/examples/vue-lint-on-edit.sh +1 -0
- package/examples/warn-cron-cost-trap.sh +173 -0
- package/examples/webfetch-runaway-guard.sh +89 -0
- package/examples/wellness-break-reminder.sh +118 -0
- package/examples/windows-destructive-command-guard.sh +177 -0
- package/examples/windows-path-guard.sh +12 -0
- package/examples/windows-python-stub-detector.sh +63 -0
- package/examples/work-hours-guard.sh +12 -0
- package/examples/working-directory-fence.sh +12 -0
- package/examples/workspace-lease-guard.sh +205 -0
- package/examples/worktree-create-log.sh +1 -0
- package/examples/worktree-delete-guard.sh +12 -0
- package/examples/worktree-edit-boundary-guard.sh +127 -0
- package/examples/worktree-escape-write-guard.sh +114 -0
- package/examples/worktree-hook-linker.sh +0 -0
- package/examples/worktree-hooks-path-fix.sh +111 -0
- package/examples/worktree-parent-write-guard.sh +43 -0
- package/examples/worktree-project-unify.sh +2 -1
- package/examples/worktree-remove-uncommitted-guard.sh +13 -0
- package/examples/worktree-unmerged-guard.sh +7 -1
- package/examples/write-byte-integrity-verifier.sh +190 -0
- package/examples/write-empty-content-guard.sh +67 -0
- package/examples/write-nul-corruption-detector.sh +61 -0
- package/examples/write-overwrite-confirm.sh +160 -14
- package/examples/write-secret-guard.sh +27 -5
- package/examples/write-shrink-guard.sh +12 -0
- package/examples/write-test-ratio.sh +0 -0
- package/examples/wsl-host-disk-space-guard.sh +97 -0
- package/examples/xml-format-leak-detector.sh +266 -0
- package/examples/yaml-syntax-check.sh +12 -0
- package/hooks/hooks.json +6 -6
- package/index.mjs +1718 -183
- package/mission.md +2 -0
- package/package.json +4 -4
- package/plugins/credential-guard/.claude-plugin/plugin.json +9 -7
- package/plugins/git-protection/.claude-plugin/plugin.json +10 -8
- package/plugins/safety-essentials/.claude-plugin/plugin.json +9 -7
- package/plugins/token-guard/.claude-plugin/plugin.json +10 -8
- package/scripts/agents-md-sync-setup.sh +156 -0
- package/scripts/autonomy-blocked-summary.sh +148 -0
- package/scripts/build-search-index.py +43 -0
- package/scripts/build-sitemap.py +119 -0
- package/scripts/cc-doctor.sh +192 -0
- package/scripts/check-hook-event-names.py +127 -0
- package/scripts/check-misfire-instrument.sh +64 -0
- package/scripts/claim-verify-audit.sh +467 -0
- package/scripts/cowork-claudemd-helper.sh +136 -0
- package/scripts/june-15-deprecated-model-scan.sh +111 -0
- package/scripts/measure-heredoc-shapes.sh +67 -0
- package/scripts/measure-literal-match-misfire.sh +110 -0
- package/scripts/probe-scope-guard-branches.sh +48 -0
- package/scripts/probe-skip-line-both-ways.sh +65 -0
- package/scripts/receipts-aggregate.py +199 -0
- package/scripts/session-forensic-audit.py +360 -0
- package/scripts.json +9 -9
- package/scripts.json.bak-2026-07-27-find +13 -0
- package/skills/safety-setup/SKILL.md +5 -5
- package/tests/approve-side-remaining-two.test.sh +129 -0
- package/tests/approver-list-granularity.test.sh +145 -0
- package/tests/askuserquestion-autonomy-gate.test.sh +181 -0
- package/tests/audit-ci-gate.test.sh +87 -0
- package/tests/audit-cross-layer-claudemd.test.sh +170 -0
- package/tests/audit-fail-open-parse.test.sh +100 -0
- package/tests/auto-approve-compound-tail.test.sh +194 -0
- package/tests/auto-mode-path-invoked-commands.test.sh +89 -0
- package/tests/auto-mode-quoted-targets.test.sh +127 -0
- package/tests/auto-mode-unquoted-targets.test.sh +112 -0
- package/tests/bash-secret-output-detector-detects.test.sh +102 -0
- package/tests/blindspots-cross-layer.test.sh +177 -0
- package/tests/block-database-wipe.test.sh +64 -0
- package/tests/bundled-short-flags-bypass.test.sh +85 -0
- package/tests/cd-git-allow-compound-tail.test.sh +67 -0
- package/tests/chown-guard-filesystem-root.test.sh +64 -0
- package/tests/ci-workflow-guard-skip-rule.test.sh +115 -0
- package/tests/compound-deny-safe-rm-targets.test.sh +105 -0
- package/tests/core-scripts-parser-fallback.test.sh +140 -0
- package/tests/destructive-guard-bare-glob.test.sh +74 -0
- package/tests/destructive-guard-every-operand.test.sh +100 -0
- package/tests/destructive-guard-find-deletion.test.sh +114 -0
- package/tests/destructive-guard-flag-order.test.sh +106 -0
- package/tests/destructive-guard-mentions-vs-invocations.test.sh +107 -0
- package/tests/destructive-guard-quoted-target.test.sh +89 -0
- package/tests/destructive-guard-separators.test.sh +105 -0
- package/tests/destructive-guard-variable-target.test.sh +98 -0
- package/tests/destructive-guard-wrapped-command.test.sh +91 -0
- package/tests/doctor-hook-disabling-env.test.sh +92 -0
- package/tests/doctor-misspelled-settings-keys.test.sh +106 -0
- package/tests/example-guards-wrapped-command.test.sh +169 -0
- package/tests/file-edit-backup.test.sh +93 -0
- package/tests/git-filter-repo-guard.test.sh +60 -0
- package/tests/git-global-options-bypass.test.sh +141 -0
- package/tests/git-invocation-prefixes-all-guards.test.sh +114 -0
- package/tests/git-maintenance-guard.test.sh +83 -0
- package/tests/git-pack-temp-cleanup-guard.test.sh +133 -0
- package/tests/git-rm-orphan-wipe-guard.test.sh +66 -0
- package/tests/git-submodule-guard.test.sh +50 -0
- package/tests/grep-pcre-portability.test.sh +155 -0
- package/tests/hook-registration-matches-input.test.sh +73 -0
- package/tests/hook-trigger-matches-envelope.test.sh +178 -0
- package/tests/install-does-not-claim-protection.test.sh +110 -0
- package/tests/install-example-standalone-tools.test.sh +139 -0
- package/tests/line-continuation-bypass.test.sh +114 -0
- package/tests/mcp-config-poisoning-audit.test.sh +106 -0
- package/tests/nested-background-agent-guard.test.sh +58 -0
- package/tests/no-unqualified-safety-claims.test.sh +114 -0
- package/tests/option-eating-grep-patterns.test.sh +130 -0
- package/tests/outdated-core-guards.test.sh +134 -0
- package/tests/outdated-report.test.sh +155 -0
- package/tests/output-secret-mask-warns.test.sh +73 -0
- package/tests/plugin-hooks-fail-open-under-sh.test.sh +165 -0
- package/tests/plugins-word-order.test.sh +126 -0
- package/tests/powershell-remove-item-guard.test.sh +85 -0
- package/tests/project-dir-naming.test.sh +103 -0
- package/tests/quoted-safe-targets-and-mentions.test.sh +190 -0
- package/tests/reroute-after-block-guard.test.sh +104 -0
- package/tests/secret-guard-documented-promises.test.sh +97 -0
- package/tests/session-plugin-pin-watch.test.sh +45 -0
- package/tests/settings-unreadable-refuses-to-write.test.sh +95 -0
- package/tests/shield-no-silent-adoption.test.py +110 -0
- package/tests/shield-no-silent-adoption.test.sh +46 -0
- package/tests/stop-transcript-write-health.test.sh +46 -0
- package/tests/system-dir-guard-root-erased.test.sh +66 -0
- package/tests/test-account-billing-log.sh +100 -0
- package/tests/test-account-routing-preflight.sh +77 -0
- package/tests/test-agent-sdk-credit-pool-monitor.sh +157 -0
- package/tests/test-agent-view-quota-warn.sh +184 -0
- package/tests/test-agents-md-edit-drift-warner.sh +176 -0
- package/tests/test-agents-md-loader.sh +204 -0
- package/tests/test-agents-md-sync-checker.sh +125 -0
- package/tests/test-ai-slop-punctuation-arrest.sh +280 -0
- package/tests/test-allowlist.sh +60 -0
- package/tests/test-always-allow-pattern-suggester.sh +147 -0
- package/tests/test-anthropic-base-url-guard.sh +88 -0
- package/tests/test-articulated-scope-capture.sh +139 -0
- package/tests/test-attachment-traversal-guard.sh +168 -0
- package/tests/test-aup-block-pattern-logger.sh +315 -0
- package/tests/test-aup-false-positive-helper.sh +188 -0
- package/tests/test-aup-large-tool-output-warner.sh +370 -0
- package/tests/test-aup-retry-loop-guard.sh +341 -0
- package/tests/test-auth-expiry-reminder.sh +303 -0
- package/tests/test-auth-macos-sleep-detector.sh +254 -0
- package/tests/test-auth-path-detector.sh +232 -0
- package/tests/test-auth-status-checker.sh +233 -0
- package/tests/test-authorized-reconfirmation-detector.sh +280 -0
- package/tests/test-background-cost-launch-guard.sh +62 -0
- package/tests/test-bash-allowlist-secondary-check.sh +143 -0
- package/tests/test-bash-fanout-bounded-rewriter.sh +186 -0
- package/tests/test-bash-project-fence.sh +127 -0
- package/tests/test-bg-permission-prompt-warner.sh +221 -0
- package/tests/test-binary-read-detector.sh +173 -0
- package/tests/test-broad-prefix-session-trap-warner.sh +167 -0
- package/tests/test-bulk-delete-target-resolution.sh +49 -0
- package/tests/test-bypass-mode-effective-verifier.sh +179 -0
- package/tests/test-cache-creation-drift-detector.sh +244 -0
- package/tests/test-cache-residue-detector.sh +429 -0
- package/tests/test-cache-tier-logger.sh +59 -0
- package/tests/test-cache-ttl-eviction-detector.sh +282 -0
- package/tests/test-cch-sentinel-precommit-guard.sh +64 -0
- package/tests/test-claim-verify-detector.sh +222 -0
- package/tests/test-claim-vs-caveat-checker.sh +134 -0
- package/tests/test-claude-code-version-pin-advisor.sh +353 -0
- package/tests/test-claude-md-reinjector.sh +173 -0
- package/tests/test-claude-md-size-monitor.sh +107 -0
- package/tests/test-claude-update-budget-guard.sh +132 -0
- package/tests/test-claude-update-smart.sh +91 -0
- package/tests/test-claudemd-tool-prohibition.sh +239 -0
- package/tests/test-cli-config-pinning-detector.sh +233 -0
- package/tests/test-cliff-countdown-advisor.sh +138 -0
- package/tests/test-closure-word-verify-gate.sh +158 -0
- package/tests/test-commit-all-scope-guard.sh +73 -0
- package/tests/test-commitment-carry-forward-arrest.sh +250 -0
- package/tests/test-compact-dispatch-watchdog.sh +147 -0
- package/tests/test-completion-claim-without-verification-detector.sh +326 -0
- package/tests/test-compound-bash-permission-resolver.sh +264 -0
- package/tests/test-compound-command-deny-enforcer.sh +67 -0
- package/tests/test-context-length-budget.sh +68 -0
- package/tests/test-context-usage-drift-alert.sh +52 -22
- package/tests/test-cost-incident-self-audit.sh +94 -0
- package/tests/test-cowork-claude-md-load-checker.sh +257 -0
- package/tests/test-cowork-claudemd-helper.sh +141 -0
- package/tests/test-cowork-fuse-staleness-watcher.sh +287 -0
- package/tests/test-cowork-hook-absence-warner.sh +230 -0
- package/tests/test-cowork-model-picker-advisor.sh +317 -0
- package/tests/test-credential-exfil-guard.sh +62 -0
- package/tests/test-cron-create-receipt.sh +165 -0
- package/tests/test-cross-product-mcp-spawn-detector.sh +112 -0
- package/tests/test-daemon-zombie-worker-surfacer.sh +71 -0
- package/tests/test-daily-cost-guard.sh +131 -0
- package/tests/test-deny-rule-integrity-verifier.sh +288 -0
- package/tests/test-deployment-readback-gate.sh +92 -0
- package/tests/test-deployment-readback-gh-adapter.sh +163 -0
- package/tests/test-disabled-feature-toggle-advisor.sh +78 -0
- package/tests/test-dispatch-allowlist-preflight.sh +385 -0
- package/tests/test-dispatch-liveness-watchdog.sh +319 -0
- package/tests/test-dispatch-receipt.sh +314 -0
- package/tests/test-dotenv-anthropic-key-billing-guard.sh +160 -0
- package/tests/test-echo-probe-spam-detector.sh +143 -0
- package/tests/test-edit-quote-ambiguity-guard.sh +75 -0
- package/tests/test-ephemeral-container-detector.sh +251 -0
- package/tests/test-evidence-claim-gate.sh +291 -0
- package/tests/test-extended-thinking-loop-guard.sh +289 -0
- package/tests/test-extended-thinking-resume-warning.sh +240 -0
- package/tests/test-extended-thinking-tool-use-mismatch-detector.sh +236 -0
- package/tests/test-fabricated-command-detector.sh +296 -0
- package/tests/test-false-disk-full-guard.sh +36 -0
- package/tests/test-feature-deprecation-detector.sh +117 -0
- package/tests/test-forbidden-response-phrase-detector.sh +246 -0
- package/tests/test-git-operations-require-approval.sh +53 -0
- package/tests/test-git-push-blast-radius-guard.sh +115 -0
- package/tests/test-goal-iteration-limit-warner.sh +128 -0
- package/tests/test-growthbook-flag-monitor.sh +428 -0
- package/tests/test-halt-signal-detector.sh +120 -0
- package/tests/test-hook-self-disable-detector.sh +232 -0
- package/tests/test-iteration-quality-degradation-detector.sh +244 -0
- package/tests/test-long-session-malformed-tool-call-detector.sh +185 -0
- package/tests/test-marketplace-plugins.sh +193 -0
- package/tests/test-mcp-misdiagnosis-arrest.sh +235 -0
- package/tests/test-mcp-orphan-leak-warner.sh +71 -0
- package/tests/test-mcp-permissions-ask-warner.sh +207 -0
- package/tests/test-mcp-routine-approval-detector.sh +229 -0
- package/tests/test-mcp-startup-bloat-detector.sh +141 -0
- package/tests/test-mcp-stdio-compatibility-test.sh +112 -0
- package/tests/test-memory-chain-audit.sh +59 -0
- package/tests/test-memory-orphan-detector.sh +227 -0
- package/tests/test-model-swap-suggester.sh +368 -0
- package/tests/test-model-version-lock.sh +83 -0
- package/tests/test-multi-file-plan-routing-gate.sh +277 -0
- package/tests/test-multi-window-auth-drift-detector.sh +262 -0
- package/tests/test-nested-spawn-inflight-guard.sh +281 -0
- package/tests/test-no-force-flag.sh +49 -0
- package/tests/test-non-english-quality-warner.sh +229 -0
- package/tests/test-oauth-refresh-monitor.sh +311 -0
- package/tests/test-opus-degradation-tracker.sh +274 -0
- package/tests/test-opus48-routine-task-warning.sh +201 -0
- package/tests/test-opus48-thinking-wedge-advisor.sh +249 -0
- package/tests/test-output-token-spike-detector.sh +315 -0
- package/tests/test-parallel-batch-size-limiter.sh +228 -0
- package/tests/test-parallel-cascade-detector.sh +191 -0
- package/tests/test-partial-view-claim-arrest.sh +272 -0
- package/tests/test-per-prompt-token-cap.sh +136 -0
- package/tests/test-persisted-1m-model-advisor.sh +71 -0
- package/tests/test-plugin-hooks-json-bloat-detector.sh +267 -0
- package/tests/test-post-edit-disk-verify.sh +294 -0
- package/tests/test-pre-bash-sed-line-ending-windows.sh +108 -0
- package/tests/test-pre-execution-claim-detector.sh +366 -0
- package/tests/test-private-key-backup-and-git-credentials.sh +100 -0
- package/tests/test-proxy-capture-suggester.sh +214 -0
- package/tests/test-public-artefact-socratic-narrowing.sh +346 -0
- package/tests/test-quota-anomaly-detector.sh +321 -0
- package/tests/test-quota-reset-audit.sh +81 -0
- package/tests/test-read-loop-detector.sh +137 -0
- package/tests/test-read-once-guard.sh +85 -0
- package/tests/test-receipts-aggregate.sh +143 -0
- package/tests/test-redirect-fragment-warner.sh +130 -0
- package/tests/test-redundant-read-blocker.sh +155 -0
- package/tests/test-refusal-arrest-gate.sh +303 -0
- package/tests/test-remote-control-billing-classifier.sh +125 -0
- package/tests/test-resume-drift-watcher.sh +65 -0
- package/tests/test-rg-replace-flag-detector.sh +175 -0
- package/tests/test-rhetorical-verification-prompt-detector.sh +237 -0
- package/tests/test-rm-safety-net.sh +115 -0
- package/tests/test-route-handler-emptiness-gate.sh +300 -0
- package/tests/test-runtime-binary-change-detector.sh +196 -0
- package/tests/test-same-command-repeat-detector.sh +165 -0
- package/tests/test-same-correction-arrest.sh +165 -0
- package/tests/test-scope-expansion-receipt.sh +207 -0
- package/tests/test-server-side-prompt-injection-detector.sh +181 -0
- package/tests/test-session-persistence-verifier.sh +128 -0
- package/tests/test-session-rate-monitor.sh +284 -0
- package/tests/test-session-start-quota-status.sh +210 -0
- package/tests/test-session-start-safety-check.sh +138 -0
- package/tests/test-settings-hooks-key-restorer.sh +257 -0
- package/tests/test-settings-json-health-check.sh +70 -0
- package/tests/test-settings-regression-tester.sh +197 -0
- package/tests/test-skill-cumulative-size-detector.sh +198 -0
- package/tests/test-skill-description-drop-detector.sh +236 -0
- package/tests/test-skill-truncation-detector.sh +263 -0
- package/tests/test-skills-context-recorder.sh +329 -0
- package/tests/test-skills-load-verifier.sh +184 -0
- package/tests/test-skills-settings-validator.sh +242 -0
- package/tests/test-sonnet-45-deprecation-helper.sh +150 -0
- package/tests/test-spurious-malformed-notice-detector.sh +290 -0
- package/tests/test-sql-bulk-delete-warn.sh +123 -0
- package/tests/test-ssh-key-protect.sh +81 -0
- package/tests/test-stale-temp-settings-detector.sh +161 -0
- package/tests/test-standing-rule-session-surfacer.sh +215 -0
- package/tests/test-starter-hooks-manifest.sh +96 -0
- package/tests/test-stop-hook-sigterm-wrapper.sh +258 -0
- package/tests/test-strict-allowlist.sh +72 -0
- package/tests/test-subagent-boundary-precheck.sh +137 -0
- package/tests/test-subagent-closure-verify-gate.sh +193 -0
- package/tests/test-subagent-destructive-git-guard.sh +86 -0
- package/tests/test-subagent-identity-leak-guard.sh +62 -0
- package/tests/test-subagent-identity-reassertion.sh +61 -0
- package/tests/test-subagent-inheritance-tester.sh +319 -0
- package/tests/test-subagent-permission-mode-guard.sh +61 -0
- package/tests/test-subagent-spawn-verification-enforcer.sh +60 -0
- package/tests/test-subagent-tool-allowlist-enforcer.sh +62 -0
- package/tests/test-subagent-tool-call-limiter.sh +97 -0
- package/tests/test-subscription-api-billing-warner.sh +138 -0
- package/tests/test-subscription-bypass-detector.sh +255 -0
- package/tests/test-temporal-suggestion-detector.sh +183 -0
- package/tests/test-thinking-budget-effort-mismatch-detector.sh +327 -0
- package/tests/test-tokenizer-ratio-alert-corpus.sh +77 -0
- package/tests/test-tokenizer-ratio-alert.sh +93 -0
- package/tests/test-tool-result-correlation-checker.sh +264 -0
- package/tests/test-tool-result-size-guard.sh +121 -0
- package/tests/test-transcript-contamination-detector.sh +264 -0
- package/tests/test-trigger-header-parsing.sh +151 -0
- package/tests/test-ultrareview-large-diff-advisor.sh +192 -0
- package/tests/test-userprompt-submit-receipt.sh +181 -0
- package/tests/test-verify-after-publish-reminder.sh +184 -0
- package/tests/test-version-bump-detector.sh +212 -0
- package/tests/test-version-regression-warner.sh +165 -0
- package/tests/test-warn-cron-cost-trap.sh +82 -0
- package/tests/test-webfetch-runaway-guard.sh +77 -0
- package/tests/test-wellness-break-reminder.sh +138 -0
- package/tests/test-windows-destructive-command-guard.sh +169 -0
- package/tests/test-windows-python-stub-detector.sh +146 -0
- package/tests/test-worktree-edit-boundary-guard.sh +219 -0
- package/tests/test-write-byte-integrity-verifier.sh +192 -0
- package/tests/test-xml-format-leak-detector.sh +299 -0
- package/tests/trustfall-mcp-injection-guard.test.sh +183 -0
- package/tests/workspace-lease-guard.test.sh +144 -0
- package/tests/worktree-escape-write-guard.test.sh +68 -0
- package/tests/worktree-hooks-path-fix.test.sh +181 -0
- package/tests/worktree-parent-write-guard.test.sh +51 -0
- package/tests/write-empty-content-guard.test.sh +39 -0
- package/tests/write-nul-corruption-detector.test.sh +29 -0
- package/tests/write-overwrite-unread-content.test.sh +178 -0
- package/tests/wsl-host-disk-space-guard.test.sh +55 -0
|
@@ -1,11 +1,38 @@
|
|
|
1
|
+
#!/bin/bash
|
|
1
2
|
INPUT=$(cat)
|
|
2
|
-
|
|
3
|
+
__CC_HOOK_INPUT="$INPUT"
|
|
4
|
+
# --- セッション識別子でファイルを分ける (2026-08-09 修正) ---
|
|
5
|
+
# 旧実装は "$$" を使っていたが、$$ はこのスクリプト自身のPIDで呼び出しごとに変わるため、
|
|
6
|
+
# 状態が一度も持続しなかった(実測: 200回呼ぶとファイルが200個でき、中身は全部 1)。
|
|
7
|
+
__CC_SID=""
|
|
8
|
+
if [ -n "${__CC_HOOK_INPUT:-}" ]; then
|
|
9
|
+
if command -v jq >/dev/null 2>&1; then
|
|
10
|
+
__CC_SID=$(printf '%s' "$__CC_HOOK_INPUT" | jq -r '.session_id // .sessionId // empty' 2>/dev/null)
|
|
11
|
+
fi
|
|
12
|
+
if [ -z "$__CC_SID" ] && command -v python3 >/dev/null 2>&1; then
|
|
13
|
+
__CC_SID=$(printf '%s' "$__CC_HOOK_INPUT" | python3 -c 'import sys,json
|
|
14
|
+
try:
|
|
15
|
+
d=json.load(sys.stdin); print(d.get("session_id") or d.get("sessionId") or "")
|
|
16
|
+
except Exception: print("")' 2>/dev/null)
|
|
17
|
+
fi
|
|
18
|
+
fi
|
|
19
|
+
if [ -n "$__CC_SID" ]; then
|
|
20
|
+
__CC_KEY=$(printf '%s' "$__CC_SID" | tr -c 'A-Za-z0-9_-' '_' | cut -c1-64)
|
|
21
|
+
else
|
|
22
|
+
__CC_KEY="nosession-$(date +%Y%m%d)"
|
|
23
|
+
fi
|
|
24
|
+
# --- ここまで ---
|
|
25
|
+
|
|
26
|
+
COUNTER="/tmp/cc-tool-count-$__CC_KEY"
|
|
3
27
|
COUNT=$(cat "$COUNTER" 2>/dev/null || echo 0)
|
|
4
28
|
COUNT=$((COUNT + 1))
|
|
5
29
|
echo "$COUNT" > "$COUNTER"
|
|
6
30
|
THRESHOLD="${CC_COMPACT_THRESHOLD:-50}"
|
|
7
31
|
if [ "$((COUNT % THRESHOLD))" -eq 0 ]; then
|
|
8
|
-
|
|
32
|
+
# 記録の場所を推測しない(旧: projects/*/sessions/*/transcript.jsonl は実在せず、
|
|
33
|
+
# glob が空のまま黙って何も助言しなかった)。
|
|
34
|
+
TRANSCRIPT=$(printf '%s' "$INPUT" | jq -r '.transcript_path // empty' 2>/dev/null)
|
|
35
|
+
[ -f "$TRANSCRIPT" ] || TRANSCRIPT=$(ls -t "$HOME"/.claude/projects/*/*.jsonl 2>/dev/null | head -1)
|
|
9
36
|
if [ -f "$TRANSCRIPT" ]; then
|
|
10
37
|
SIZE_KB=$(($(wc -c < "$TRANSCRIPT") / 1024))
|
|
11
38
|
if [ "$SIZE_KB" -gt 200 ]; then
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# context-length-budget.sh — long-context retrieval regression guard (Incident 6)
|
|
3
|
+
# Why: Opus 4.7 shows significant retrieval accuracy regressions above 200K
|
|
4
|
+
# tokens of context (MRCR -46pt, 256k-8-needle -32.7pt). This hook
|
|
5
|
+
# tracks cumulative input-token usage across a session and emits an
|
|
6
|
+
# advisory when the budget threshold is crossed, so you can split the
|
|
7
|
+
# workflow before results start degrading. The same 200K line is also a
|
|
8
|
+
# billing-tier boundary on 1M-context models (the 200k-1M tier bills at a
|
|
9
|
+
# higher rate, #65870), so the advisory doubles as a cost warning when
|
|
10
|
+
# auto-compaction fails to fire and a session silently grows past it.
|
|
11
|
+
# Event: PreToolUse MATCHER: "*"
|
|
12
|
+
# Action: Read the latest usage total from the transcript, append to the
|
|
13
|
+
# session's context-budget log, and warn once per session when the
|
|
14
|
+
# cumulative input tokens cross the budget line.
|
|
15
|
+
#
|
|
16
|
+
# Environment:
|
|
17
|
+
# CONTEXT_BUDGET_THRESHOLD tokens above which to warn (default 200000)
|
|
18
|
+
#
|
|
19
|
+
# The threshold is advisory, not absolute. Sessions can run above 200K and
|
|
20
|
+
# perform fine if retrieval is not multi-round. Treat the alert as a reason
|
|
21
|
+
# to verify accuracy, not a reason to abort.
|
|
22
|
+
|
|
23
|
+
set -u
|
|
24
|
+
|
|
25
|
+
THRESHOLD="${CONTEXT_BUDGET_THRESHOLD:-200000}"
|
|
26
|
+
LOG_DIR="${HOME}/.claude/logs"
|
|
27
|
+
mkdir -p "$LOG_DIR" 2>/dev/null
|
|
28
|
+
|
|
29
|
+
INPUT=$(cat)
|
|
30
|
+
|
|
31
|
+
SESSION_ID=$(printf '%s' "$INPUT" | jq -r '.session_id // "unknown"' 2>/dev/null)
|
|
32
|
+
[ "$SESSION_ID" = "unknown" ] && exit 0
|
|
33
|
+
|
|
34
|
+
TRANSCRIPT=$(printf '%s' "$INPUT" | jq -r '.transcript_path // empty' 2>/dev/null)
|
|
35
|
+
[ -z "$TRANSCRIPT" ] && exit 0
|
|
36
|
+
[ ! -r "$TRANSCRIPT" ] && exit 0
|
|
37
|
+
|
|
38
|
+
# Read the most recent usage record and compute cumulative input = input +
|
|
39
|
+
# cache_read + cache_creation. cache_read counts against the context window
|
|
40
|
+
# even when it did not cost extra tokens, because retrieval happens over the
|
|
41
|
+
# reconstructed context.
|
|
42
|
+
LAST_USAGE=$(tac "$TRANSCRIPT" 2>/dev/null | grep -m1 '"usage"' || true)
|
|
43
|
+
[ -z "$LAST_USAGE" ] && exit 0
|
|
44
|
+
|
|
45
|
+
INPUT_TOK=$(printf '%s' "$LAST_USAGE" | jq -r '.message.usage.input_tokens // .usage.input_tokens // 0' 2>/dev/null)
|
|
46
|
+
CACHE_READ=$(printf '%s' "$LAST_USAGE" | jq -r '.message.usage.cache_read_input_tokens // .usage.cache_read_input_tokens // 0' 2>/dev/null)
|
|
47
|
+
CACHE_CREATE=$(printf '%s' "$LAST_USAGE" | jq -r '.message.usage.cache_creation_input_tokens // .usage.cache_creation_input_tokens // 0' 2>/dev/null)
|
|
48
|
+
|
|
49
|
+
INPUT_TOK=${INPUT_TOK:-0}
|
|
50
|
+
CACHE_READ=${CACHE_READ:-0}
|
|
51
|
+
CACHE_CREATE=${CACHE_CREATE:-0}
|
|
52
|
+
|
|
53
|
+
CUMULATIVE=$((INPUT_TOK + CACHE_READ + CACHE_CREATE))
|
|
54
|
+
|
|
55
|
+
LOG_FILE="${LOG_DIR}/context-budget-${SESSION_ID}.log"
|
|
56
|
+
TS=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
|
57
|
+
printf '%s\t%s\t%s\t%s\t%s\n' "$TS" "$CUMULATIVE" "$INPUT_TOK" "$CACHE_READ" "$CACHE_CREATE" >> "$LOG_FILE"
|
|
58
|
+
|
|
59
|
+
# Warn once per session when the threshold is first crossed. Track with a
|
|
60
|
+
# sentinel file so we do not re-warn on every subsequent turn.
|
|
61
|
+
SENTINEL="${LOG_DIR}/context-budget-${SESSION_ID}.warned"
|
|
62
|
+
if [ "$CUMULATIVE" -gt "$THRESHOLD" ] && [ ! -f "$SENTINEL" ]; then
|
|
63
|
+
echo "⚠ context-length-budget: $CUMULATIVE tokens in session context (threshold ${THRESHOLD})" >&2
|
|
64
|
+
echo " Opus 4.7 shows retrieval accuracy drops above 200K (MRCR -46pt). Consider splitting the workflow or running /compact." >&2
|
|
65
|
+
echo " Cost: on 1M-context models, crossing 200K also moves requests into the higher-priced 200k-1M billing tier (#65870), so a long session can silently bill at the premium rate when auto-compaction does not fire." >&2
|
|
66
|
+
touch "$SENTINEL"
|
|
67
|
+
fi
|
|
68
|
+
|
|
69
|
+
exit 0
|
|
@@ -18,6 +18,18 @@
|
|
|
18
18
|
# TRIGGER: PostToolUse
|
|
19
19
|
# MATCHER: "" (all tools — checks context on every call)
|
|
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-context-threshold-alert-$PPID"
|
|
27
|
+
[ -f "$_nojq_warned" ] || {
|
|
28
|
+
echo "WARNING [context-threshold-alert]: 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
|
|
|
23
35
|
# Extract context percentage from tool output if available
|
|
@@ -5,29 +5,57 @@
|
|
|
5
5
|
# ツール呼び出し回数でコンテキスト消費を推定し、警告する。
|
|
6
6
|
# Event: PostToolUse MATCHER: ""
|
|
7
7
|
# Action: セッション内のツール呼び出し回数が閾値を超えたら警告
|
|
8
|
+
#
|
|
9
|
+
# 2026-08-09 修正: カウンターがセッション単位で分かれていなかった。
|
|
10
|
+
# 旧実装は "/tmp/cc-context-usage-counter-$$" を先に見ていたが、$$ は
|
|
11
|
+
# このスクリプト自身のPIDで**呼び出しごとに変わる**ため、そのファイルは
|
|
12
|
+
# 決して存在せず、常に日付単位のフォールバックへ落ちていた。
|
|
13
|
+
# 結果、カウンターはその日の全セッションで共有され、しかも判定が -eq の
|
|
14
|
+
# 完全一致だったので、150を一度超えると**その日はもう二度と鳴らなかった**。
|
|
15
|
+
# 実測(隔離HOME): 160回呼ぶと 50/100/150 で3回発火するが、続けて別セッション
|
|
16
|
+
# 相当の160回を呼ぶと発火は0回(カウンターは160→320と進むだけ)。
|
|
17
|
+
# 自律運用では1日に何本もセッションが立つので、2本目以降は無警告だった。
|
|
18
|
+
# 修正: hookの入力JSONの session_id でカウンターを分ける。閾値の判定は
|
|
19
|
+
# 「跨いだ回だけ鳴らす」形にして、-eq の取りこぼしも塞ぐ。
|
|
8
20
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
if
|
|
13
|
-
|
|
21
|
+
INPUT=$(cat 2>/dev/null)
|
|
22
|
+
SESSION_ID=""
|
|
23
|
+
if [ -n "$INPUT" ]; then
|
|
24
|
+
if command -v jq >/dev/null 2>&1; then
|
|
25
|
+
SESSION_ID=$(printf '%s' "$INPUT" | jq -r '.session_id // .sessionId // empty' 2>/dev/null)
|
|
26
|
+
elif command -v python3 >/dev/null 2>&1; then
|
|
27
|
+
SESSION_ID=$(printf '%s' "$INPUT" | python3 -c 'import sys,json;d=json.load(sys.stdin);print(d.get("session_id") or d.get("sessionId") or "")' 2>/dev/null)
|
|
28
|
+
fi
|
|
14
29
|
fi
|
|
15
30
|
|
|
31
|
+
# session_id が取れない場合だけ日付へ落ちる。落ちたことが分かるよう接尾辞を分ける
|
|
32
|
+
# (旧実装はここが既定になっていて、しかも黙っていた)
|
|
33
|
+
if [ -n "$SESSION_ID" ]; then
|
|
34
|
+
KEY=$(printf '%s' "$SESSION_ID" | tr -c 'A-Za-z0-9_-' '_' | cut -c1-64)
|
|
35
|
+
else
|
|
36
|
+
KEY="nosession-$(date +%Y%m%d)"
|
|
37
|
+
fi
|
|
38
|
+
COUNTER_FILE="/tmp/cc-context-usage-counter-$KEY"
|
|
39
|
+
|
|
16
40
|
COUNT=$(cat "$COUNTER_FILE" 2>/dev/null || echo "0")
|
|
41
|
+
case "$COUNT" in ''|*[!0-9]*) COUNT=0 ;; esac
|
|
42
|
+
PREV=$COUNT
|
|
17
43
|
COUNT=$((COUNT + 1))
|
|
18
44
|
echo "$COUNT" > "$COUNTER_FILE"
|
|
19
45
|
|
|
20
|
-
#
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
46
|
+
# 閾値を「跨いだ」回だけ鳴らす。PostToolUse が数を飛ばしても取りこぼさない
|
|
47
|
+
crossed() { [ "$PREV" -lt "$1" ] && [ "$COUNT" -ge "$1" ]; }
|
|
48
|
+
|
|
49
|
+
if crossed 150; then
|
|
50
|
+
echo "🚨 VERY HIGH CONTEXT: $COUNT tool calls. Auto-compact likely imminent." >&2
|
|
51
|
+
echo "Save important state to files NOW. Run /compact manually to control what's kept." >&2
|
|
52
|
+
elif crossed 100; then
|
|
25
53
|
echo "⚠ HIGH CONTEXT USAGE: $COUNT tool calls this session." >&2
|
|
26
54
|
echo "UI may show ~50% when actual usage is near 100%. Consider /compact." >&2
|
|
27
55
|
echo "Unexpected auto-compact can erase your working context. See: #50204" >&2
|
|
28
|
-
elif
|
|
29
|
-
echo "
|
|
30
|
-
echo "
|
|
56
|
+
elif crossed 50; then
|
|
57
|
+
echo "📊 Session checkpoint: $COUNT tool calls. Context may be growing large." >&2
|
|
58
|
+
echo "Run /cost to check actual usage. UI display may undercount by 2x (#50204)." >&2
|
|
31
59
|
fi
|
|
32
60
|
|
|
33
61
|
exit 0
|
|
@@ -39,6 +39,18 @@
|
|
|
39
39
|
|
|
40
40
|
set -u
|
|
41
41
|
|
|
42
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
43
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
44
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
45
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
46
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
47
|
+
_nojq_warned="/tmp/cc-nojq-warned-conversation-history-guard-$PPID"
|
|
48
|
+
[ -f "$_nojq_warned" ] || {
|
|
49
|
+
echo "WARNING [conversation-history-guard]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
50
|
+
: > "$_nojq_warned"
|
|
51
|
+
}
|
|
52
|
+
fi
|
|
53
|
+
|
|
42
54
|
[ "${CC_ALLOW_HISTORY_ACCESS:-0}" = "1" ] && exit 0
|
|
43
55
|
|
|
44
56
|
INPUT=$(cat)
|
|
@@ -23,6 +23,18 @@
|
|
|
23
23
|
# Default: "*rules*:*config*:*core*"
|
|
24
24
|
# ================================================================
|
|
25
25
|
|
|
26
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
27
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
28
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
29
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
30
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
31
|
+
_nojq_warned="/tmp/cc-nojq-warned-core-file-protect-guard-$PPID"
|
|
32
|
+
[ -f "$_nojq_warned" ] || {
|
|
33
|
+
echo "WARNING [core-file-protect-guard]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
34
|
+
: > "$_nojq_warned"
|
|
35
|
+
}
|
|
36
|
+
fi
|
|
37
|
+
|
|
26
38
|
INPUT=$(cat)
|
|
27
39
|
TOOL=$(echo "$INPUT" | jq -r '.tool_name // empty' 2>/dev/null)
|
|
28
40
|
|
|
File without changes
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# cost-incident-self-audit.sh — Tell me which real Claude Code cost accidents
|
|
3
|
+
# my current setup is still exposed to
|
|
4
|
+
#
|
|
5
|
+
# This is NOT a hook — it is a one-shot diagnostic you run by hand:
|
|
6
|
+
#
|
|
7
|
+
# bash examples/cost-incident-self-audit.sh
|
|
8
|
+
#
|
|
9
|
+
# Why this exists: the cost/billing cluster is the single largest pain cluster
|
|
10
|
+
# in the Claude Code tracker (200+ open issues), and the danger is not "my bill
|
|
11
|
+
# is a bit high" — it is sudden, irreversible loss: a fan-out of pushes burning
|
|
12
|
+
# a month of GitHub Actions minutes in 3 hours (#65944), a research loop running
|
|
13
|
+
# ~98 WebFetch calls before anyone notices (#65684), an oversized image retried
|
|
14
|
+
# until cost is ~35x (#65636), 1M-context credits draining without opt-in (#64445).
|
|
15
|
+
# Generic cost trackers and the official spend page tell you what you ALREADY
|
|
16
|
+
# spent. None of them tell you which of these specific accidents your setup has
|
|
17
|
+
# no guard against *before* one happens. That is the gap this fills.
|
|
18
|
+
#
|
|
19
|
+
# It only reports what it can actually verify in your settings + environment.
|
|
20
|
+
# It never edits anything, never phones home, and fails open: if it cannot read
|
|
21
|
+
# something it stays quiet rather than guessing. Every finding cites the real
|
|
22
|
+
# issue it comes from so you can read the incident yourself.
|
|
23
|
+
#
|
|
24
|
+
# Always exits 0 (it is a report, not a gate). The exposure count is in the
|
|
25
|
+
# output and, with --json, in the "exposures" field. CC_COST_AUDIT_SETTINGS
|
|
26
|
+
# overrides the settings glob (mainly for testing).
|
|
27
|
+
|
|
28
|
+
set -u
|
|
29
|
+
|
|
30
|
+
JSON=0
|
|
31
|
+
for a in "$@"; do
|
|
32
|
+
case "$a" in
|
|
33
|
+
--json) JSON=1 ;;
|
|
34
|
+
-h|--help)
|
|
35
|
+
echo "Usage: bash cost-incident-self-audit.sh [--json]"
|
|
36
|
+
echo "Reports which documented Claude Code cost accidents your setup is exposed to."
|
|
37
|
+
exit 0 ;;
|
|
38
|
+
esac
|
|
39
|
+
done
|
|
40
|
+
|
|
41
|
+
# --- Gather settings content (best effort, fail open) ---------------------
|
|
42
|
+
# Hooks are configured in settings.json / settings.local.json at user or
|
|
43
|
+
# project scope. We just need the raw text to see which guard commands are
|
|
44
|
+
# wired in; we do not parse the schema so a slightly unusual layout still works.
|
|
45
|
+
SETTINGS_GLOB="${CC_COST_AUDIT_SETTINGS:-}"
|
|
46
|
+
SETTINGS_TEXT=""
|
|
47
|
+
if [ -n "$SETTINGS_GLOB" ]; then
|
|
48
|
+
for f in $SETTINGS_GLOB; do
|
|
49
|
+
[ -f "$f" ] && SETTINGS_TEXT="$SETTINGS_TEXT
|
|
50
|
+
$(cat "$f" 2>/dev/null)"
|
|
51
|
+
done
|
|
52
|
+
else
|
|
53
|
+
for f in \
|
|
54
|
+
"$HOME/.claude/settings.json" \
|
|
55
|
+
"$HOME/.claude/settings.local.json" \
|
|
56
|
+
"./.claude/settings.json" \
|
|
57
|
+
"./.claude/settings.local.json"; do
|
|
58
|
+
[ -f "$f" ] && SETTINGS_TEXT="$SETTINGS_TEXT
|
|
59
|
+
$(cat "$f" 2>/dev/null)"
|
|
60
|
+
done
|
|
61
|
+
fi
|
|
62
|
+
|
|
63
|
+
# A guard is considered "wired in" if its script name appears anywhere in the
|
|
64
|
+
# settings text (the hook command references the file by name).
|
|
65
|
+
has_guard() { printf '%s' "$SETTINGS_TEXT" | grep -q "$1"; }
|
|
66
|
+
|
|
67
|
+
# Does this project have CI workflows that an agentic push could fan out onto?
|
|
68
|
+
HAS_WORKFLOWS=0
|
|
69
|
+
if [ -d "./.github/workflows" ] && ls ./.github/workflows/*.y*ml >/dev/null 2>&1; then
|
|
70
|
+
HAS_WORKFLOWS=1
|
|
71
|
+
fi
|
|
72
|
+
|
|
73
|
+
# --- Define the checks ----------------------------------------------------
|
|
74
|
+
# Each check appends "issue|title|fix" to FINDINGS when the setup is exposed.
|
|
75
|
+
FINDINGS=()
|
|
76
|
+
|
|
77
|
+
# 1. CI minutes blast from multi-branch pushes — only relevant if CI exists.
|
|
78
|
+
if [ "$HAS_WORKFLOWS" -eq 1 ] && ! has_guard "git-push-blast-radius-guard"; then
|
|
79
|
+
FINDINGS+=("65944|Pushing one fix across many branches fans out CI runs and can burn a month of GitHub Actions minutes in hours|add examples/git-push-blast-radius-guard.sh as a PreToolUse(Bash) hook")
|
|
80
|
+
fi
|
|
81
|
+
|
|
82
|
+
# 2. WebFetch / research runaway cost.
|
|
83
|
+
if ! has_guard "webfetch-runaway-guard"; then
|
|
84
|
+
FINDINGS+=("65684|A research loop can run dozens of WebFetch calls without pausing, spending real money before you notice|add examples/webfetch-runaway-guard.sh as a PreToolUse(WebFetch) hook")
|
|
85
|
+
fi
|
|
86
|
+
|
|
87
|
+
# 3. Oversized image retried into a cost loop.
|
|
88
|
+
if ! has_guard "image-dimension-guard"; then
|
|
89
|
+
FINDINGS+=("65636|An oversized image can be retried until prompt caching breaks and cost climbs ~35x|add examples/image-dimension-guard.sh as a PreToolUse(Read) hook")
|
|
90
|
+
fi
|
|
91
|
+
|
|
92
|
+
# 4. Unbounded command output exhausting the session (and re-processing cost).
|
|
93
|
+
if ! has_guard "unbounded-output-guard"; then
|
|
94
|
+
FINDINGS+=("65789|An unbounded-output command (yes, cat /dev/zero, ...) floods the session and inflates re-processing cost|add examples/unbounded-output-guard.sh as a PreToolUse(Bash) hook")
|
|
95
|
+
fi
|
|
96
|
+
|
|
97
|
+
# 5. No spend visibility at all — none of the cost/budget signals are wired in.
|
|
98
|
+
if ! has_guard "daily-cost-guard" && ! has_guard "session-cost-alert" \
|
|
99
|
+
&& ! has_guard "token-budget-guard" && ! has_guard "cost-tracker"; then
|
|
100
|
+
FINDINGS+=("0|No session/daily cost signal is configured, so a runaway has nothing watching the running total|add one of examples/daily-cost-guard.sh, session-cost-alert.sh, or token-budget-guard.sh")
|
|
101
|
+
fi
|
|
102
|
+
|
|
103
|
+
# 6. 1M context left on — silently drains the weekly quota faster.
|
|
104
|
+
# Exposure only when the user has not explicitly turned it off.
|
|
105
|
+
if [ "${CLAUDE_CODE_DISABLE_1M_CONTEXT:-}" != "1" ]; then
|
|
106
|
+
FINDINGS+=("64445|1M context can consume credits/quota without you explicitly selecting 1M mode, draining the weekly limit faster via larger re-processed context|set CLAUDE_CODE_DISABLE_1M_CONTEXT=1 (and prefer opusplan) if you do not need the 1M window")
|
|
107
|
+
fi
|
|
108
|
+
|
|
109
|
+
COUNT=${#FINDINGS[@]}
|
|
110
|
+
|
|
111
|
+
# --- Output ---------------------------------------------------------------
|
|
112
|
+
if [ "$JSON" -eq 1 ]; then
|
|
113
|
+
printf '{"exposures":%d,"findings":[' "$COUNT"
|
|
114
|
+
first=1
|
|
115
|
+
for f in "${FINDINGS[@]}"; do
|
|
116
|
+
IFS='|' read -r issue title fix <<EOF
|
|
117
|
+
$f
|
|
118
|
+
EOF
|
|
119
|
+
[ "$first" -eq 0 ] && printf ','
|
|
120
|
+
first=0
|
|
121
|
+
# JSON-escape the two free-text fields minimally (quotes/backslashes).
|
|
122
|
+
et=$(printf '%s' "$title" | sed 's/\\/\\\\/g; s/"/\\"/g')
|
|
123
|
+
ef=$(printf '%s' "$fix" | sed 's/\\/\\\\/g; s/"/\\"/g')
|
|
124
|
+
printf '{"issue":"%s","title":"%s","fix":"%s"}' "$issue" "$et" "$ef"
|
|
125
|
+
done
|
|
126
|
+
printf ']}\n'
|
|
127
|
+
exit 0
|
|
128
|
+
fi
|
|
129
|
+
|
|
130
|
+
echo ""
|
|
131
|
+
echo " Claude Code cost-accident self-audit"
|
|
132
|
+
echo " ===================================="
|
|
133
|
+
if [ "$COUNT" -eq 0 ]; then
|
|
134
|
+
echo ""
|
|
135
|
+
echo " No exposures found against the documented cost accidents checked here."
|
|
136
|
+
echo " (This only covers the patterns above — it is not a guarantee.)"
|
|
137
|
+
echo ""
|
|
138
|
+
exit 0
|
|
139
|
+
fi
|
|
140
|
+
|
|
141
|
+
echo ""
|
|
142
|
+
echo " Exposed to $COUNT of the documented cost accidents below:"
|
|
143
|
+
echo ""
|
|
144
|
+
for f in "${FINDINGS[@]}"; do
|
|
145
|
+
IFS='|' read -r issue title fix <<EOF
|
|
146
|
+
$f
|
|
147
|
+
EOF
|
|
148
|
+
if [ "$issue" = "0" ]; then
|
|
149
|
+
echo " [!] $title"
|
|
150
|
+
else
|
|
151
|
+
echo " [!] $title (#$issue)"
|
|
152
|
+
fi
|
|
153
|
+
echo " fix: $fix"
|
|
154
|
+
echo ""
|
|
155
|
+
done
|
|
156
|
+
echo " These guards ship in this repo; wire the ones you want into your"
|
|
157
|
+
echo " .claude/settings.json hooks, or run 'npx cc-safe-setup' to set them up."
|
|
158
|
+
echo " Worked examples of these exact incidents (free chapter):"
|
|
159
|
+
echo " https://yurukusa.github.io/cc-safe-setup/token-book.html"
|
|
160
|
+
echo ""
|
|
161
|
+
|
|
162
|
+
exit 0
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# cowork-claude-md-load-checker.sh — Surface ~/.claude/CLAUDE.md at SessionStart
|
|
3
|
+
#
|
|
4
|
+
# Solves: #62859 — Cowork (Claude desktop app) does NOT load ~/.claude/CLAUDE.md
|
|
5
|
+
# at session start. Users who keep safety-critical standing instructions
|
|
6
|
+
# (e.g. "Always ask before write operations to MCP tools") in
|
|
7
|
+
# ~/.claude/CLAUDE.md lose those guardrails whenever they open a Cowork
|
|
8
|
+
# session, because Cowork only honors part of the ~/.claude/ directory.
|
|
9
|
+
# Related: #50669 (Cowork loads only 3/27 personal skills).
|
|
10
|
+
#
|
|
11
|
+
# WHO THIS PROTECTS:
|
|
12
|
+
# CLI users who also use Cowork on the same machine. The hook runs in the
|
|
13
|
+
# CLI (where hooks DO fire), and:
|
|
14
|
+
# (a) confirms ~/.claude/CLAUDE.md is loaded in this CLI session by
|
|
15
|
+
# echoing a short header + the file's first lines to stderr at
|
|
16
|
+
# SessionStart;
|
|
17
|
+
# (b) reminds the operator that the same file will NOT auto-load in
|
|
18
|
+
# Cowork, so they should paste it manually when switching surfaces.
|
|
19
|
+
#
|
|
20
|
+
# Cowork itself ignores ~/.claude/, so the hook cannot run inside Cowork.
|
|
21
|
+
# The protection is the operator-side awareness this hook builds in CLI.
|
|
22
|
+
#
|
|
23
|
+
# HOW IT WORKS:
|
|
24
|
+
# On SessionStart, if ~/.claude/CLAUDE.md exists and is non-trivial
|
|
25
|
+
# (>= CC_COWORK_MD_MIN_BYTES, default 50 bytes), print a warning block to
|
|
26
|
+
# stderr with the first N bytes of the file and a one-line note linking
|
|
27
|
+
# to #62859. Always exit 0 (advisory only).
|
|
28
|
+
#
|
|
29
|
+
# TRIGGER: SessionStart
|
|
30
|
+
# MATCHER: ""
|
|
31
|
+
#
|
|
32
|
+
# CONFIGURATION:
|
|
33
|
+
# CC_COWORK_MD_PATH=path override file (default ~/.claude/CLAUDE.md)
|
|
34
|
+
# CC_COWORK_MD_MIN_BYTES=N skip if file smaller than N (default 50)
|
|
35
|
+
# CC_COWORK_MD_MAX_CHARS=N truncate display at N (default 1500)
|
|
36
|
+
# CC_COWORK_MD_QUIET=1 suppress the reminder line about Cowork
|
|
37
|
+
# CC_COWORK_MD_LOG=path append load events (default off)
|
|
38
|
+
#
|
|
39
|
+
# USAGE:
|
|
40
|
+
# {
|
|
41
|
+
# "hooks": {
|
|
42
|
+
# "SessionStart": [{
|
|
43
|
+
# "hooks": [{
|
|
44
|
+
# "type": "command",
|
|
45
|
+
# "command": "~/.claude/hooks/cowork-claude-md-load-checker.sh"
|
|
46
|
+
# }]
|
|
47
|
+
# }]
|
|
48
|
+
# }
|
|
49
|
+
# }
|
|
50
|
+
|
|
51
|
+
MD_PATH="${CC_COWORK_MD_PATH:-$HOME/.claude/CLAUDE.md}"
|
|
52
|
+
MIN_BYTES="${CC_COWORK_MD_MIN_BYTES:-50}"
|
|
53
|
+
MAX_CHARS="${CC_COWORK_MD_MAX_CHARS:-1500}"
|
|
54
|
+
|
|
55
|
+
# Drain stdin (SessionStart hooks may or may not receive payload)
|
|
56
|
+
INPUT=$(cat 2>/dev/null || true)
|
|
57
|
+
|
|
58
|
+
if [ ! -f "$MD_PATH" ]; then
|
|
59
|
+
exit 0
|
|
60
|
+
fi
|
|
61
|
+
|
|
62
|
+
ACTUAL_SIZE=$(wc -c < "$MD_PATH" 2>/dev/null || echo 0)
|
|
63
|
+
if [ "$ACTUAL_SIZE" -lt "$MIN_BYTES" ]; then
|
|
64
|
+
exit 0
|
|
65
|
+
fi
|
|
66
|
+
|
|
67
|
+
CONTENT=$(head -c "$MAX_CHARS" "$MD_PATH" 2>/dev/null)
|
|
68
|
+
|
|
69
|
+
cat >&2 <<EOF
|
|
70
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
71
|
+
[cowork-claude-md-load-checker] SessionStart — surfacing ${MD_PATH}
|
|
72
|
+
Addresses #62859: Cowork (Claude desktop app) does NOT load
|
|
73
|
+
~/.claude/CLAUDE.md at session start. This hook runs in CLI only
|
|
74
|
+
and re-states the file's contents so the rules remain in context.
|
|
75
|
+
These are standing instructions that apply across all projects.
|
|
76
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
77
|
+
${CONTENT}
|
|
78
|
+
EOF
|
|
79
|
+
|
|
80
|
+
if [ "$ACTUAL_SIZE" -gt "$MAX_CHARS" ]; then
|
|
81
|
+
echo "" >&2
|
|
82
|
+
echo "[...truncated at ${MAX_CHARS} chars of ${ACTUAL_SIZE}. Full file: ${MD_PATH}]" >&2
|
|
83
|
+
fi
|
|
84
|
+
|
|
85
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" >&2
|
|
86
|
+
|
|
87
|
+
if [ -z "${CC_COWORK_MD_QUIET:-}" ]; then
|
|
88
|
+
cat >&2 <<'EOF'
|
|
89
|
+
[cowork-claude-md-load-checker] Reminder: if you switch to Cowork on the same
|
|
90
|
+
machine, the file above will NOT auto-load there. Paste it manually into the
|
|
91
|
+
Cowork chat until #62859 is resolved.
|
|
92
|
+
EOF
|
|
93
|
+
fi
|
|
94
|
+
|
|
95
|
+
if [ -n "${CC_COWORK_MD_LOG:-}" ]; then
|
|
96
|
+
mkdir -p "$(dirname "$CC_COWORK_MD_LOG")" 2>/dev/null
|
|
97
|
+
echo "$(date -Iseconds) file=${MD_PATH} size=${ACTUAL_SIZE}" >> "$CC_COWORK_MD_LOG"
|
|
98
|
+
fi
|
|
99
|
+
|
|
100
|
+
exit 0
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# cowork-fuse-staleness-watcher.sh — Warn before bash git ops in Cowork FUSE mounts
|
|
3
|
+
#
|
|
4
|
+
# Solves: #62932 (P1 critical) — In Cowork, the FUSE bridge that mounts a
|
|
5
|
+
# Windows host folder into the Linux sandbox at
|
|
6
|
+
# /sessions/<id>/mnt/<folder>/ caches inode metadata for the entire
|
|
7
|
+
# session. After the first read, the sandbox bash environment sees
|
|
8
|
+
# the file's original size, mtime, and content even when Windows
|
|
9
|
+
# modifies it. The wedge is SELECTIVE:
|
|
10
|
+
# - file content + stat: stale
|
|
11
|
+
# - working-tree git walks (status / add / commit): return garbage
|
|
12
|
+
# - ref-walking git commands (rev-parse / log / show): stay clean
|
|
13
|
+
# - Cowork's first-class file tools (Read/Edit/Write): bypass FUSE
|
|
14
|
+
# and are authoritative
|
|
15
|
+
#
|
|
16
|
+
# The danger: bash `git add` / `git commit` against the working tree
|
|
17
|
+
# silently commits the stale content, corrupting the repo's view of
|
|
18
|
+
# the Windows-side truth. Bash `git status` returns "No commits yet"
|
|
19
|
+
# on a repo with hundreds of commits.
|
|
20
|
+
#
|
|
21
|
+
# HOW IT WORKS:
|
|
22
|
+
# PreToolUse hook on Bash. If the command looks like a working-tree git
|
|
23
|
+
# operation (git status / add / commit / diff / restore / checkout --) AND
|
|
24
|
+
# the current working directory matches the Cowork FUSE mount pattern
|
|
25
|
+
# (/sessions/*/mnt/), print a stderr warning explaining:
|
|
26
|
+
# - the wedge exists for THIS session and won't self-clear
|
|
27
|
+
# - working-tree views are untrustworthy; ref views are still clean
|
|
28
|
+
# - prefer Cowork's first-class Read/Edit/Write tools instead of bash
|
|
29
|
+
# - if a parser error fires on .git/config, the file likely needs a
|
|
30
|
+
# full rewrite via `cat > .git/config`
|
|
31
|
+
#
|
|
32
|
+
# Always exit 0 (advisory only). The hook does NOT block, because the
|
|
33
|
+
# user may consciously be running ref-only ops (rev-parse / log) that
|
|
34
|
+
# stay clean even under the wedge.
|
|
35
|
+
#
|
|
36
|
+
# TRIGGER: PreToolUse MATCHER: "Bash"
|
|
37
|
+
#
|
|
38
|
+
# CONFIGURATION:
|
|
39
|
+
# CC_COWORK_FUSE_PATTERN=regex custom path regex (default Cowork sandbox)
|
|
40
|
+
# CC_COWORK_FUSE_QUIET=1 suppress the recommendation block
|
|
41
|
+
# CC_COWORK_FUSE_LOG=path append warning events (default off)
|
|
42
|
+
#
|
|
43
|
+
# USAGE:
|
|
44
|
+
# {
|
|
45
|
+
# "hooks": {
|
|
46
|
+
# "PreToolUse": [{
|
|
47
|
+
# "matcher": "Bash",
|
|
48
|
+
# "hooks": [{
|
|
49
|
+
# "type": "command",
|
|
50
|
+
# "command": "~/.claude/hooks/cowork-fuse-staleness-watcher.sh"
|
|
51
|
+
# }]
|
|
52
|
+
# }]
|
|
53
|
+
# }
|
|
54
|
+
# }
|
|
55
|
+
|
|
56
|
+
INPUT=$(cat 2>/dev/null || true)
|
|
57
|
+
|
|
58
|
+
# Extract the bash command. Hook input is JSON via stdin.
|
|
59
|
+
CMD=$(echo "$INPUT" | jq -r '.tool_input.command // ""' 2>/dev/null)
|
|
60
|
+
if [ -z "$CMD" ]; then
|
|
61
|
+
exit 0
|
|
62
|
+
fi
|
|
63
|
+
|
|
64
|
+
# Detect the Cowork FUSE mount path. The pattern is /sessions/<id>/mnt/<folder>/.
|
|
65
|
+
# Match either CWD or any path inside the command itself.
|
|
66
|
+
FUSE_PATTERN="${CC_COWORK_FUSE_PATTERN:-/sessions/[^/]+/mnt/}"
|
|
67
|
+
|
|
68
|
+
cwd=$(echo "$INPUT" | jq -r '.cwd // ""' 2>/dev/null)
|
|
69
|
+
if [ -z "$cwd" ]; then
|
|
70
|
+
cwd="$PWD"
|
|
71
|
+
fi
|
|
72
|
+
|
|
73
|
+
in_fuse_mount=0
|
|
74
|
+
if echo "$cwd" | grep -qE "$FUSE_PATTERN"; then
|
|
75
|
+
in_fuse_mount=1
|
|
76
|
+
elif echo "$CMD" | grep -qE "$FUSE_PATTERN"; then
|
|
77
|
+
in_fuse_mount=1
|
|
78
|
+
fi
|
|
79
|
+
|
|
80
|
+
if [ "$in_fuse_mount" -eq 0 ]; then
|
|
81
|
+
exit 0
|
|
82
|
+
fi
|
|
83
|
+
|
|
84
|
+
# Detect a working-tree git command. Ref-only ops (rev-parse, log, show, cat-file)
|
|
85
|
+
# are safe under the wedge, so we deliberately do NOT warn on those. Matcher
|
|
86
|
+
# allows arbitrary git prefix args like `git -C <path>` or `git --git-dir=...`.
|
|
87
|
+
is_worktree_git=0
|
|
88
|
+
if echo "$CMD" | grep -qE '\bgit\b[^|;&]*\b(status|add|commit|diff|restore|stash|clean|ls-files|rm|mv)\b'; then
|
|
89
|
+
is_worktree_git=1
|
|
90
|
+
elif echo "$CMD" | grep -qE '\bgit\b[^|;&]*\bcheckout\b[^|;&]*(-- |\.\s*$|\.\s*[|;&])'; then
|
|
91
|
+
# `git checkout <branch>` is safe; only warn on path-discard variants
|
|
92
|
+
# like `git checkout -- file` or `git checkout .`.
|
|
93
|
+
is_worktree_git=1
|
|
94
|
+
fi
|
|
95
|
+
|
|
96
|
+
if [ "$is_worktree_git" -eq 0 ]; then
|
|
97
|
+
exit 0
|
|
98
|
+
fi
|
|
99
|
+
|
|
100
|
+
cat >&2 <<EOF
|
|
101
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
102
|
+
[cowork-fuse-staleness-watcher] Cowork FUSE mount detected
|
|
103
|
+
This bash command runs against a working-tree git view on a Cowork
|
|
104
|
+
Windows-host FUSE bridge (path matches ${FUSE_PATTERN}).
|
|
105
|
+
|
|
106
|
+
Known wedge (#62932, P1 critical): once a file is read in this session,
|
|
107
|
+
its size / mtime / content are frozen for the rest of the session even
|
|
108
|
+
when Windows modifies it. Working-tree git ops will see the FROZEN
|
|
109
|
+
content; bash 'git add' / 'git commit' will silently commit the stale
|
|
110
|
+
content. 'git status' may report "No commits yet" on a repo with hundreds
|
|
111
|
+
of commits.
|
|
112
|
+
|
|
113
|
+
What still works under the wedge:
|
|
114
|
+
- ref-walking git: rev-parse, log, show, cat-file
|
|
115
|
+
- Cowork's first-class Read / Edit / Write file tools (they bypass FUSE)
|
|
116
|
+
|
|
117
|
+
What does NOT work:
|
|
118
|
+
- bash git status / add / commit / diff / restore / checkout / stash
|
|
119
|
+
- bash file reads of any file modified by Windows in this session
|
|
120
|
+
|
|
121
|
+
If '.git/config' parsing fails with NUL bytes, rewrite the file via
|
|
122
|
+
'cat > .git/config' from inside the sandbox before any further git op.
|
|
123
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
124
|
+
EOF
|
|
125
|
+
|
|
126
|
+
if [ -z "${CC_COWORK_FUSE_QUIET:-}" ]; then
|
|
127
|
+
cat >&2 <<'EOF'
|
|
128
|
+
[cowork-fuse-staleness-watcher] Recommended: replace this bash git op with
|
|
129
|
+
the Cowork file tools (Read / Edit / Write), or use a ref-only command
|
|
130
|
+
(rev-parse / log / show) when you just need ref info. The wedge will NOT
|
|
131
|
+
clear for the rest of this session.
|
|
132
|
+
EOF
|
|
133
|
+
fi
|
|
134
|
+
|
|
135
|
+
if [ -n "${CC_COWORK_FUSE_LOG:-}" ]; then
|
|
136
|
+
mkdir -p "$(dirname "$CC_COWORK_FUSE_LOG")" 2>/dev/null
|
|
137
|
+
echo "$(date -Iseconds) cwd=${cwd} cmd=${CMD}" >> "$CC_COWORK_FUSE_LOG"
|
|
138
|
+
fi
|
|
139
|
+
|
|
140
|
+
exit 0
|