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.
Files changed (1022) hide show
  1. package/.claude-plugin/marketplace.json +72 -19
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CONTRIBUTING.md +7 -2
  4. package/COOKBOOK.md +50 -46
  5. package/LICENSE +21 -0
  6. package/MIGRATION.md +8 -8
  7. package/README.md +419 -512
  8. package/SAFETY_CHECKLIST.md +15 -7
  9. package/SERVICES.md +194 -0
  10. package/SETTINGS_REFERENCE.md +236 -17
  11. package/SKILL.md +5 -5
  12. package/TROUBLESHOOTING.md +35 -14
  13. package/action.yml +12 -4
  14. package/audit/README.md +84 -0
  15. package/audit/audit-checklist.md +152 -0
  16. package/audit/boundary-selftest.sh +85 -0
  17. package/audit/boundary.sh +123 -0
  18. package/audit/count-hooks.py +42 -0
  19. package/audit/find-dead-hooks.sh +82 -0
  20. package/audit/find-unfirable-rules.sh +142 -0
  21. package/audit/fire.sh +97 -0
  22. package/audit/selftest.sh +42 -0
  23. package/audit/unfirable-selftest.sh +81 -0
  24. package/audit-web/index.html +9 -9
  25. package/examples/README.md +54 -17
  26. package/examples/account-billing-log.sh +98 -0
  27. package/examples/account-routing-preflight.sh +123 -0
  28. package/examples/agent-sdk-credit-pool-monitor.sh +145 -0
  29. package/examples/agent-view-quota-decrement.sh +32 -0
  30. package/examples/agent-view-quota-warn.sh +94 -0
  31. package/examples/agents-md-edit-drift-warner.sh +223 -0
  32. package/examples/agents-md-loader.sh +160 -0
  33. package/examples/agents-md-sync-checker.sh +102 -0
  34. package/examples/ai-slop-punctuation-arrest.sh +210 -0
  35. package/examples/allowlist.sh +70 -10
  36. package/examples/always-allow-pattern-suggester.sh +125 -0
  37. package/examples/ansible-vault-guard.sh +2 -1
  38. package/examples/anthropic-base-url-guard.sh +76 -0
  39. package/examples/api-busyloop-guard.sh +123 -0
  40. package/examples/api-endpoint-guard.sh +12 -0
  41. package/examples/api-key-in-url-guard.sh +17 -1
  42. package/examples/api-rate-limit-guard.sh +36 -1
  43. package/examples/api-rate-limit-tracker.sh +12 -0
  44. package/examples/articulated-scope-capture.sh +101 -0
  45. package/examples/askuserquestion-autonomy-gate.sh +102 -0
  46. package/examples/attachment-traversal-guard.sh +118 -0
  47. package/examples/aup-block-pattern-logger.sh +161 -0
  48. package/examples/aup-false-positive-helper.sh +124 -0
  49. package/examples/aup-large-tool-output-warner.sh +282 -0
  50. package/examples/aup-retry-loop-guard.sh +229 -0
  51. package/examples/auth-expiry-reminder.sh +157 -0
  52. package/examples/auth-macos-sleep-detector.sh +185 -0
  53. package/examples/auth-path-detector.sh +171 -0
  54. package/examples/auth-status-checker.sh +157 -0
  55. package/examples/authorized-reconfirmation-detector.sh +195 -0
  56. package/examples/auto-approve-build.sh +39 -0
  57. package/examples/auto-approve-cargo.sh +31 -1
  58. package/examples/auto-approve-docker.sh +35 -0
  59. package/examples/auto-approve-git-read.sh +37 -14
  60. package/examples/auto-approve-go.sh +30 -1
  61. package/examples/auto-approve-gradle.sh +29 -1
  62. package/examples/auto-approve-make.sh +29 -1
  63. package/examples/auto-approve-maven.sh +29 -1
  64. package/examples/auto-approve-python.sh +41 -1
  65. package/examples/auto-approve-readonly-tools.sh +1 -0
  66. package/examples/auto-approve-readonly.sh +110 -33
  67. package/examples/auto-approve-ssh.sh +30 -1
  68. package/examples/auto-approve-test.sh +44 -0
  69. package/examples/auto-checkpoint.sh +1 -1
  70. package/examples/auto-compact-prep.sh +0 -0
  71. package/examples/auto-git-checkpoint.sh +0 -0
  72. package/examples/auto-mode-safe-commands.sh +53 -1
  73. package/examples/auto-mode-safety-enforcer.sh +151 -4
  74. package/examples/auto-push-session-branch.sh +22 -0
  75. package/examples/aws-production-guard.sh +13 -1
  76. package/examples/aws-region-guard.sh +1 -1
  77. package/examples/background-cost-launch-guard.sh +82 -0
  78. package/examples/background-task-guard.sh +12 -0
  79. package/examples/backup-before-refactor.sh +0 -0
  80. package/examples/banned-command-guard.sh +12 -0
  81. package/examples/bash-allowlist-secondary-check.sh +157 -0
  82. package/examples/bash-domain-allowlist.sh +12 -0
  83. package/examples/bash-fanout-bounded-rewriter.sh +191 -0
  84. package/examples/bash-heuristic-approver.sh +112 -10
  85. package/examples/bash-project-fence.sh +194 -0
  86. package/examples/bash-safety-auto-deny.sh +12 -0
  87. package/examples/bash-secret-output-detector.sh +44 -3
  88. package/examples/bash-trace-guard.sh +12 -0
  89. package/examples/bashrc-safety-check.sh +0 -0
  90. package/examples/bg-permission-prompt-warner.sh +182 -0
  91. package/examples/bg-task-cooldown-guard.sh +12 -0
  92. package/examples/binary-read-detector.sh +135 -0
  93. package/examples/binary-upload-guard.sh +12 -0
  94. package/examples/block-database-wipe.sh +35 -10
  95. package/examples/branch-name-check.sh +8 -3
  96. package/examples/branch-naming-convention.sh +0 -0
  97. package/examples/broad-find-guard.sh +12 -0
  98. package/examples/broad-prefix-session-trap-warner.sh +106 -0
  99. package/examples/bulk-file-delete-guard.sh +45 -0
  100. package/examples/bypass-mode-effective-verifier.sh +203 -0
  101. package/examples/cache-creation-drift-detector.sh +120 -0
  102. package/examples/cache-residue-detector.sh +195 -0
  103. package/examples/cache-tier-logger.sh +70 -0
  104. package/examples/cache-ttl-eviction-detector.sh +149 -0
  105. package/examples/cargo-publish-guard.sh +14 -1
  106. package/examples/case-insensitive-path-guard.sh +21 -2
  107. package/examples/case-sensitive-guard.sh +23 -2
  108. package/examples/cch-cache-guard.sh +0 -0
  109. package/examples/cch-sentinel-precommit-guard.sh +47 -0
  110. package/examples/check-abort-controller.sh +1 -1
  111. package/examples/check-accessibility.sh +0 -0
  112. package/examples/check-aria-labels.sh +0 -0
  113. package/examples/check-before-act-enforcer.sh +12 -0
  114. package/examples/check-charset-meta.sh +0 -0
  115. package/examples/check-cookie-flags.sh +0 -0
  116. package/examples/check-cors-config.sh +0 -0
  117. package/examples/check-csp-headers.sh +0 -0
  118. package/examples/check-csrf-protection.sh +0 -0
  119. package/examples/check-debounce.sh +1 -1
  120. package/examples/check-dependency-age.sh +0 -0
  121. package/examples/check-dependency-license.sh +0 -0
  122. package/examples/check-dockerfile-best-practice.sh +0 -0
  123. package/examples/check-error-boundaries.sh +0 -0
  124. package/examples/check-error-class.sh +1 -1
  125. package/examples/check-error-handling.sh +0 -0
  126. package/examples/check-error-logging.sh +1 -1
  127. package/examples/check-error-message.sh +0 -0
  128. package/examples/check-error-stack.sh +0 -0
  129. package/examples/check-favicon.sh +0 -0
  130. package/examples/check-git-hooks-compat.sh +0 -0
  131. package/examples/check-gitattributes.sh +0 -0
  132. package/examples/check-https-redirect.sh +0 -0
  133. package/examples/check-input-validation.sh +0 -0
  134. package/examples/check-lang-attribute.sh +0 -0
  135. package/examples/check-npm-scripts-exist.sh +0 -0
  136. package/examples/check-package-size.sh +0 -0
  137. package/examples/check-port-availability.sh +0 -0
  138. package/examples/check-promise-all.sh +1 -1
  139. package/examples/check-rate-limiting.sh +0 -0
  140. package/examples/check-return-types.sh +0 -0
  141. package/examples/check-semantic-versioning.sh +0 -0
  142. package/examples/check-suspense-fallback.sh +1 -1
  143. package/examples/check-test-exists.sh +0 -0
  144. package/examples/check-test-naming.sh +0 -0
  145. package/examples/check-timeout-cleanup.sh +1 -1
  146. package/examples/check-tls-version.sh +0 -0
  147. package/examples/check-unsubscribe.sh +1 -1
  148. package/examples/check-viewport-meta.sh +0 -0
  149. package/examples/check-worker-terminate.sh +1 -1
  150. package/examples/checkpoint-tamper-guard.sh +12 -0
  151. package/examples/chmod-guard.sh +12 -0
  152. package/examples/chown-guard.sh +24 -0
  153. package/examples/ci-workflow-guard.sh +6 -1
  154. package/examples/claim-verify-detector.sh +109 -0
  155. package/examples/claim-vs-caveat-checker.sh +77 -0
  156. package/examples/classifier-fallback-allow.sh +114 -40
  157. package/examples/claude-cache-gc.sh +1 -0
  158. package/examples/claude-code-version-pin-advisor.sh +183 -0
  159. package/examples/claude-md-reinjector.sh +129 -0
  160. package/examples/claude-md-size-monitor.sh +66 -0
  161. package/examples/claude-update-budget-guard.sh +123 -0
  162. package/examples/claude-update-smart.sh +113 -0
  163. package/examples/claudeignore-enforce-guard.sh +12 -0
  164. package/examples/claudemd-enforcer.sh +0 -0
  165. package/examples/claudemd-tool-prohibition.sh +128 -0
  166. package/examples/clear-command-confirm-guard.sh +32 -15
  167. package/examples/cli-config-pinning-detector.sh +162 -0
  168. package/examples/cliff-countdown-advisor.sh +96 -0
  169. package/examples/clipboard-secret-guard.sh +12 -0
  170. package/examples/closure-word-verify-gate.sh +150 -0
  171. package/examples/cloud-cli-guard.sh +39 -2
  172. package/examples/commit-all-scope-guard.sh +44 -0
  173. package/examples/commit-message-check.sh +1 -1
  174. package/examples/commit-message-quality.sh +6 -1
  175. package/examples/commitment-carry-forward-arrest.sh +361 -0
  176. package/examples/compact-alert-notification.sh +0 -0
  177. package/examples/compact-circuit-breaker.sh +72 -0
  178. package/examples/compact-dispatch-watchdog.sh +149 -0
  179. package/examples/completion-claim-without-verification-detector.sh +207 -0
  180. package/examples/composer-guard.sh +12 -0
  181. package/examples/compound-bash-permission-resolver.sh +156 -0
  182. package/examples/compound-command-allow.sh +1 -1
  183. package/examples/compound-command-deny-enforcer.sh +183 -0
  184. package/examples/compound-inject-guard.sh +12 -0
  185. package/examples/concurrent-edit-lock.sh +12 -0
  186. package/examples/conflict-marker-guard.sh +12 -0
  187. package/examples/consecutive-error-breaker.sh +0 -0
  188. package/examples/console-log-count.sh +1 -0
  189. package/examples/context-compact-advisor.sh +29 -2
  190. package/examples/context-length-budget.sh +69 -0
  191. package/examples/context-threshold-alert.sh +12 -0
  192. package/examples/context-usage-drift-alert.sh +41 -13
  193. package/examples/conversation-history-guard.sh +12 -0
  194. package/examples/core-file-protect-guard.sh +12 -0
  195. package/examples/cors-star-warn.sh +0 -0
  196. package/examples/cost-incident-self-audit.sh +162 -0
  197. package/examples/cowork-claude-md-load-checker.sh +100 -0
  198. package/examples/cowork-fuse-staleness-watcher.sh +140 -0
  199. package/examples/cowork-hook-absence-warner.sh +167 -0
  200. package/examples/cowork-model-picker-advisor.sh +115 -0
  201. package/examples/credential-exfil-guard.sh +65 -4
  202. package/examples/credential-file-cat-guard.sh +17 -1
  203. package/examples/cron-create-receipt.sh +112 -0
  204. package/examples/cron-modification-guard.sh +12 -0
  205. package/examples/cross-product-mcp-spawn-detector.sh +178 -0
  206. package/examples/cwd-project-boundary-guard.sh +0 -0
  207. package/examples/daemon-zombie-worker-surfacer.sh +118 -0
  208. package/examples/daily-cost-guard.sh +164 -0
  209. package/examples/daily-usage-tracker.sh +0 -0
  210. package/examples/dangerous-pip-flag-guard.sh +12 -0
  211. package/examples/db-connect-guard.sh +13 -1
  212. package/examples/denied-action-retry-guard.sh +12 -0
  213. package/examples/deny-bypass-detector.sh +12 -0
  214. package/examples/deny-rule-integrity-verifier.sh +181 -0
  215. package/examples/dependency-install-guard.sh +12 -0
  216. package/examples/deploy-guard.sh +14 -2
  217. package/examples/deploy-path-verify-guard.sh +12 -0
  218. package/examples/deployment-readback-gate.sh +135 -0
  219. package/examples/deployment-readback-gh-adapter.sh +247 -0
  220. package/examples/deployment-verify-guard.sh +25 -2
  221. package/examples/destructive-db-script-write-guard.sh +166 -0
  222. package/examples/destructive-migration-write-guard.sh +163 -0
  223. package/examples/diff-size-guard.sh +12 -0
  224. package/examples/disabled-feature-toggle-advisor.sh +88 -0
  225. package/examples/disk-partition-guard.sh +12 -0
  226. package/examples/dispatch-allowlist-preflight.sh +301 -0
  227. package/examples/dispatch-liveness-watchdog.sh +216 -0
  228. package/examples/dispatch-receipt.sh +174 -0
  229. package/examples/django-migrate-guard.sh +12 -0
  230. package/examples/dns-config-guard.sh +12 -0
  231. package/examples/docker-dangerous-guard.sh +12 -0
  232. package/examples/docker-volume-guard.sh +0 -0
  233. package/examples/dockerfile-latest-guard.sh +1 -0
  234. package/examples/dotenv-anthropic-key-billing-guard.sh +99 -0
  235. package/examples/dotenv-commit-guard.sh +12 -0
  236. package/examples/dotenv-read-guard.sh +12 -0
  237. package/examples/dotfile-protection-guard.sh +12 -0
  238. package/examples/dotnet-build-on-edit.sh +1 -1
  239. package/examples/drizzle-migrate-guard.sh +27 -2
  240. package/examples/echo-probe-spam-detector.sh +176 -0
  241. package/examples/edit-counter-test-gate.sh +12 -0
  242. package/examples/edit-error-counter.sh +1 -1
  243. package/examples/edit-guard.sh +12 -0
  244. package/examples/edit-old-string-validator.sh +12 -0
  245. package/examples/edit-quote-ambiguity-guard.sh +97 -0
  246. package/examples/edit-retry-loop-guard.sh +0 -0
  247. package/examples/edit-verify.sh +0 -0
  248. package/examples/env-inline-secret-guard.sh +14 -2
  249. package/examples/env-naming-convention.sh +0 -0
  250. package/examples/env-prod-guard.sh +0 -0
  251. package/examples/env-required-check.sh +0 -0
  252. package/examples/env-source-guard.sh +12 -0
  253. package/examples/env-var-check.sh +24 -1
  254. package/examples/ephemeral-container-detector.sh +147 -0
  255. package/examples/error-memory-guard.sh +12 -0
  256. package/examples/evidence-claim-gate.sh +187 -0
  257. package/examples/exploration-budget-guard.sh +89 -0
  258. package/examples/expo-eject-guard.sh +13 -0
  259. package/examples/extended-thinking-loop-guard.sh +139 -0
  260. package/examples/extended-thinking-resume-warning.sh +119 -0
  261. package/examples/extended-thinking-tool-use-mismatch-detector.sh +212 -0
  262. package/examples/fabricated-command-detector.sh +145 -0
  263. package/examples/false-disk-full-guard.sh +63 -0
  264. package/examples/feature-deprecation-detector.sh +109 -0
  265. package/examples/file-change-tracker.sh +1 -1
  266. package/examples/file-change-undo-tracker.sh +0 -0
  267. package/examples/file-edit-backup.sh +63 -14
  268. package/examples/file-reference-check.sh +0 -0
  269. package/examples/file-size-limit.sh +12 -0
  270. package/examples/financial-operation-guard.sh +12 -0
  271. package/examples/firewall-guard.sh +12 -0
  272. package/examples/fish-shell-wrapper.sh +125 -7
  273. package/examples/five-hundred-milestone.sh +1 -0
  274. package/examples/flask-static-route-guard.sh +89 -0
  275. package/examples/forbidden-response-phrase-detector.sh +161 -0
  276. package/examples/gem-push-guard.sh +13 -0
  277. package/examples/gh-cli-destructive-guard.sh +13 -1
  278. package/examples/git-checkout-safety-guard.sh +12 -0
  279. package/examples/git-checkout-uncommitted-guard.sh +12 -0
  280. package/examples/git-config-guard.sh +12 -0
  281. package/examples/git-crypt-worktree-guard.sh +12 -0
  282. package/examples/git-filter-repo-guard.sh +56 -0
  283. package/examples/git-history-rewrite-guard.sh +12 -0
  284. package/examples/git-hook-bypass-guard.sh +0 -0
  285. package/examples/git-maintenance-guard.sh +83 -0
  286. package/examples/git-merge-conflict-prevent.sh +0 -0
  287. package/examples/git-message-length-check.sh +0 -0
  288. package/examples/git-message-length.sh +0 -0
  289. package/examples/git-operations-require-approval.sh +68 -14
  290. package/examples/git-pack-temp-cleanup-guard.sh +102 -0
  291. package/examples/git-push-blast-radius-guard.sh +218 -0
  292. package/examples/git-remote-guard.sh +24 -3
  293. package/examples/git-rm-orphan-wipe-guard.sh +85 -0
  294. package/examples/git-stash-before-checkout.sh +12 -0
  295. package/examples/git-stash-before-danger.sh +0 -0
  296. package/examples/git-submodule-guard.sh +69 -2
  297. package/examples/git-tag-guard.sh +12 -0
  298. package/examples/github-actions-secret-guard.sh +0 -0
  299. package/examples/gitignore-check.sh +0 -0
  300. package/examples/gitops-drift-guard.sh +12 -0
  301. package/examples/go-mod-tidy-warn.sh +1 -0
  302. package/examples/go-vet-after-edit.sh +12 -0
  303. package/examples/goal-iteration-limit-warner.sh +152 -0
  304. package/examples/grep-nul-false-negative-guard.sh +30 -0
  305. package/examples/growthbook-flag-monitor.sh +257 -0
  306. package/examples/hallucination-url-check.sh +1 -1
  307. package/examples/halt-signal-detector.sh +135 -0
  308. package/examples/handoff-on-clear.sh +65 -0
  309. package/examples/hardcoded-ip-guard.sh +1 -0
  310. package/examples/headless-empty-result-guard.sh +0 -0
  311. package/examples/headless-stop-guard.sh +0 -0
  312. package/examples/helm-install-guard.sh +2 -1
  313. package/examples/home-critical-bash-guard.sh +17 -1
  314. package/examples/hook-debug-wrapper.sh +6 -2
  315. package/examples/hook-permission-fixer.sh +0 -0
  316. package/examples/hook-self-disable-detector.sh +99 -0
  317. package/examples/hook-stdout-sanitizer.sh +6 -2
  318. package/examples/hook-tamper-guard.sh +12 -0
  319. package/examples/idle-session-cost-alert.sh +0 -0
  320. package/examples/image-dimension-guard.sh +109 -0
  321. package/examples/image-file-validator.sh +0 -0
  322. package/examples/iteration-quality-degradation-detector.sh +170 -0
  323. package/examples/java-compile-on-edit.sh +1 -1
  324. package/examples/json-syntax-check.sh +0 -0
  325. package/examples/k8s-production-guard.sh +13 -1
  326. package/examples/kill-process-guard.sh +12 -0
  327. package/examples/kubernetes-guard.sh +13 -1
  328. package/examples/laravel-artisan-guard.sh +13 -0
  329. package/examples/large-file-guard.sh +1 -1
  330. package/examples/log-level-guard.sh +0 -0
  331. package/examples/log-truncation-guard.sh +12 -0
  332. package/examples/long-session-malformed-tool-call-detector.sh +183 -0
  333. package/examples/loop-detector.sh +12 -0
  334. package/examples/magic-number-warn.sh +1 -0
  335. package/examples/main-branch-warn.sh +12 -0
  336. package/examples/markdown-link-check.sh +0 -0
  337. package/examples/max-concurrent-agents.sh +12 -0
  338. package/examples/max-edit-size-guard.sh +13 -0
  339. package/examples/max-file-count-guard.sh +0 -0
  340. package/examples/max-file-delete-count.sh +0 -0
  341. package/examples/max-function-length.sh +1 -0
  342. package/examples/max-import-count.sh +0 -0
  343. package/examples/max-subagent-count.sh +0 -0
  344. package/examples/mcp-config-freeze.sh +12 -0
  345. package/examples/mcp-config-poisoning-audit.sh +150 -0
  346. package/examples/mcp-data-boundary.sh +1 -1
  347. package/examples/mcp-misdiagnosis-arrest.sh +209 -0
  348. package/examples/mcp-orphan-leak-warner.sh +49 -0
  349. package/examples/mcp-permissions-ask-warner.sh +151 -0
  350. package/examples/mcp-routine-approval-detector.sh +154 -0
  351. package/examples/mcp-server-allowlist.sh +12 -0
  352. package/examples/mcp-server-guard.sh +12 -0
  353. package/examples/mcp-startup-bloat-detector.sh +87 -0
  354. package/examples/mcp-stdio-compatibility-test.sh +153 -0
  355. package/examples/mcp-tool-audit-log.sh +0 -0
  356. package/examples/mcp-tool-guard.sh +101 -1
  357. package/examples/mcp-warmup-wait.sh +0 -0
  358. package/examples/memory-chain-audit.sh +56 -0
  359. package/examples/memory-orphan-detector.sh +188 -0
  360. package/examples/memory-write-guard.sh +99 -17
  361. package/examples/migration-verify-guard.sh +12 -0
  362. package/examples/model-swap-suggester.sh +177 -0
  363. package/examples/model-version-alert.sh +5 -1
  364. package/examples/model-version-lock.sh +63 -0
  365. package/examples/move-delete-sequence-guard.sh +33 -2
  366. package/examples/multi-file-plan-routing-gate.sh +192 -0
  367. package/examples/multi-vendor-concurrent-warner.sh +108 -0
  368. package/examples/multi-window-auth-drift-detector.sh +183 -0
  369. package/examples/multiline-command-approver.sh +161 -23
  370. package/examples/nested-background-agent-guard.sh +109 -0
  371. package/examples/nested-spawn-inflight-guard.sh +178 -0
  372. package/examples/network-exfil-guard.sh +12 -0
  373. package/examples/network-guard.sh +12 -0
  374. package/examples/network-interface-guard.sh +12 -0
  375. package/examples/nextjs-env-guard.sh +1 -1
  376. package/examples/no-absolute-import.sh +0 -0
  377. package/examples/no-alert-confirm-prompt.sh +0 -0
  378. package/examples/no-anonymous-default-export.sh +0 -0
  379. package/examples/no-any-type.sh +0 -0
  380. package/examples/no-any-typescript.sh +1 -0
  381. package/examples/no-ask-human.sh +12 -0
  382. package/examples/no-assignment-in-condition.sh +0 -0
  383. package/examples/no-base64-exfil.sh +12 -0
  384. package/examples/no-callback-hell.sh +0 -0
  385. package/examples/no-circular-dependency.sh +0 -0
  386. package/examples/no-cleartext-storage.sh +0 -0
  387. package/examples/no-commented-code.sh +0 -0
  388. package/examples/no-commit-fixup.sh +0 -0
  389. package/examples/no-console-assert.sh +0 -0
  390. package/examples/no-console-error-swallow.sh +0 -0
  391. package/examples/no-console-in-prod.sh +0 -0
  392. package/examples/no-console-log-commit.sh +12 -0
  393. package/examples/no-console-log.sh +0 -0
  394. package/examples/no-console-time.sh +0 -0
  395. package/examples/no-cors-wildcard.sh +4 -1
  396. package/examples/no-curl-upload.sh +0 -0
  397. package/examples/no-dangerouslySetInnerHTML.sh +0 -0
  398. package/examples/no-dangling-await.sh +1 -0
  399. package/examples/no-debug-commit.sh +12 -0
  400. package/examples/no-debug-in-commit.sh +0 -0
  401. package/examples/no-deep-nesting.sh +0 -0
  402. package/examples/no-deep-relative-import.sh +1 -0
  403. package/examples/no-default-credentials.sh +0 -0
  404. package/examples/no-deploy-friday.sh +13 -1
  405. package/examples/no-disabled-test.sh +0 -0
  406. package/examples/no-document-write.sh +0 -0
  407. package/examples/no-empty-function.sh +0 -0
  408. package/examples/no-eval-in-template.sh +0 -0
  409. package/examples/no-eval-template.sh +3 -1
  410. package/examples/no-eval.sh +0 -0
  411. package/examples/no-exec-user-input.sh +0 -0
  412. package/examples/no-fixme-ship.sh +12 -0
  413. package/examples/no-floating-promises.sh +0 -0
  414. package/examples/no-force-flag.sh +22 -5
  415. package/examples/no-force-install.sh +0 -0
  416. package/examples/no-git-amend.sh +12 -0
  417. package/examples/no-git-rebase-public.sh +0 -0
  418. package/examples/no-global-install.sh +12 -0
  419. package/examples/no-global-state.sh +0 -0
  420. package/examples/no-hardcoded-port.sh +1 -0
  421. package/examples/no-hardcoded-url.sh +0 -0
  422. package/examples/no-helmet-missing.sh +0 -0
  423. package/examples/no-http-url.sh +1 -0
  424. package/examples/no-http-without-https.sh +0 -0
  425. package/examples/no-inline-style.sh +0 -0
  426. package/examples/no-inline-styles.sh +1 -0
  427. package/examples/no-innerhtml.sh +0 -0
  428. package/examples/no-install-global.sh +12 -0
  429. package/examples/no-jwt-in-url.sh +0 -0
  430. package/examples/no-large-commit.sh +0 -0
  431. package/examples/no-localhost-expose.sh +0 -0
  432. package/examples/no-magic-number.sh +0 -0
  433. package/examples/no-md5-sha1.sh +0 -0
  434. package/examples/no-mixed-line-endings.sh +8 -1
  435. package/examples/no-mutation-in-reducer.sh +0 -0
  436. package/examples/no-nested-ternary.sh +0 -0
  437. package/examples/no-network-exfil.sh +0 -0
  438. package/examples/no-open-redirect.sh +0 -0
  439. package/examples/no-output-truncation.sh +12 -0
  440. package/examples/no-package-downgrade.sh +0 -0
  441. package/examples/no-package-lock-edit.sh +12 -0
  442. package/examples/no-path-join-user-input.sh +0 -0
  443. package/examples/no-port-bind.sh +0 -0
  444. package/examples/no-process-exit.sh +0 -0
  445. package/examples/no-prototype-pollution.sh +0 -0
  446. package/examples/no-push-without-ci.sh +0 -0
  447. package/examples/no-push-without-tests.sh +12 -0
  448. package/examples/no-raw-password-in-url.sh +0 -0
  449. package/examples/no-root-user-docker.sh +1 -0
  450. package/examples/no-root-write.sh +12 -0
  451. package/examples/no-secrets-in-args.sh +4 -1
  452. package/examples/no-secrets-in-logs.sh +0 -0
  453. package/examples/no-sensitive-log.sh +0 -0
  454. package/examples/no-sleep-in-hooks.sh +0 -0
  455. package/examples/no-star-import-python.sh +1 -0
  456. package/examples/no-string-concat-sql.sh +0 -0
  457. package/examples/no-sudo-guard.sh +12 -0
  458. package/examples/no-sync-fs.sh +0 -0
  459. package/examples/no-todo-in-merge.sh +0 -0
  460. package/examples/no-todo-in-production.sh +1 -0
  461. package/examples/no-todo-without-issue.sh +0 -0
  462. package/examples/no-unused-import.sh +0 -0
  463. package/examples/no-var-keyword.sh +0 -0
  464. package/examples/no-verify-blocker.sh +12 -0
  465. package/examples/no-wget-piped-bash.sh +12 -0
  466. package/examples/no-wildcard-cors.sh +0 -0
  467. package/examples/no-wildcard-delete.sh +0 -0
  468. package/examples/no-wildcard-import.sh +0 -0
  469. package/examples/no-with-statement.sh +0 -0
  470. package/examples/no-write-outside-src.sh +0 -0
  471. package/examples/no-xml-external-entity.sh +0 -0
  472. package/examples/non-english-quality-warner.sh +156 -0
  473. package/examples/notify-waiting.sh +1 -1
  474. package/examples/npm-audit-warn.sh +0 -0
  475. package/examples/npm-global-install-guard.sh +12 -0
  476. package/examples/npm-publish-guard.sh +12 -0
  477. package/examples/npm-script-injection.sh +0 -0
  478. package/examples/npm-supply-chain-guard.sh +0 -0
  479. package/examples/nuxt-config-guard.sh +1 -0
  480. package/examples/oauth-refresh-monitor.sh +210 -0
  481. package/examples/opus-degradation-tracker.sh +187 -0
  482. package/examples/opus48-routine-task-warning.sh +196 -0
  483. package/examples/opus48-thinking-wedge-advisor.sh +143 -0
  484. package/examples/output-credential-scan.sh +1 -1
  485. package/examples/output-secret-mask.sh +31 -9
  486. package/examples/output-token-spike-detector.sh +145 -0
  487. package/examples/package-json-guard.sh +12 -0
  488. package/examples/package-lock-frozen.sh +12 -0
  489. package/examples/parallel-batch-size-limiter.sh +121 -0
  490. package/examples/parallel-cascade-detector.sh +116 -0
  491. package/examples/partial-view-claim-arrest.sh +174 -0
  492. package/examples/path-deny-bash-guard.sh +12 -0
  493. package/examples/path-traversal-guard.sh +12 -0
  494. package/examples/per-prompt-token-cap.sh +124 -0
  495. package/examples/permission-audit-log.sh +1 -1
  496. package/examples/permission-denial-enforcer.sh +12 -0
  497. package/examples/permission-entry-validator.sh +0 -0
  498. package/examples/persisted-1m-model-advisor.sh +88 -0
  499. package/examples/php-lint-on-edit.sh +1 -1
  500. package/examples/pii-upload-guard.sh +12 -0
  501. package/examples/pip-publish-guard.sh +13 -0
  502. package/examples/pip-requirements-guard.sh +12 -0
  503. package/examples/pip-venv-required.sh +12 -0
  504. package/examples/plan-mode-edit-guard.sh +12 -0
  505. package/examples/plan-mode-enforcer.sh +12 -0
  506. package/examples/plan-mode-strict-guard.sh +12 -0
  507. package/examples/plugin-hooks-json-bloat-detector.sh +169 -0
  508. package/examples/plugin-process-cleanup.sh +0 -0
  509. package/examples/polyglot-rm-guard.sh +12 -0
  510. package/examples/post-compact-safety.sh +12 -0
  511. package/examples/post-edit-disk-verify.sh +152 -0
  512. package/examples/powershell-remove-item-guard.sh +85 -0
  513. package/examples/pr-description-check.sh +0 -0
  514. package/examples/pr-duplicate-guard.sh +13 -0
  515. package/examples/pre-bash-sed-line-ending-windows.sh +87 -0
  516. package/examples/pre-compact-knowledge-save.sh +0 -0
  517. package/examples/pre-compact-transcript-backup.sh +0 -0
  518. package/examples/pre-execution-claim-detector.sh +179 -0
  519. package/examples/prefer-builtin-tools.sh +10 -1
  520. package/examples/prefer-const.sh +0 -0
  521. package/examples/prefer-dedicated-tools.sh +12 -0
  522. package/examples/prefer-optional-chaining.sh +0 -0
  523. package/examples/prisma-migrate-guard.sh +24 -7
  524. package/examples/production-port-kill-guard.sh +12 -0
  525. package/examples/prompt-injection-guard.sh +2 -1
  526. package/examples/prompt-usage-logger.sh +0 -0
  527. package/examples/protect-claudemd.sh +12 -0
  528. package/examples/protect-dotfiles.sh +12 -0
  529. package/examples/proxy-capture-suggester.sh +159 -0
  530. package/examples/public-artefact-socratic-narrowing.sh +232 -0
  531. package/examples/public-repo-push-guard.sh +12 -0
  532. package/examples/push-requires-test-pass-record.sh +0 -0
  533. package/examples/push-requires-test-pass.sh +12 -0
  534. package/examples/quota-anomaly-detector.sh +173 -0
  535. package/examples/quota-reset-audit.sh +58 -0
  536. package/examples/quoted-flag-approver.sh +99 -10
  537. package/examples/rails-migration-guard.sh +12 -0
  538. package/examples/rate-limit-guard.sh +0 -0
  539. package/examples/read-all-files-enforcer.sh +0 -0
  540. package/examples/read-budget-guard.sh +12 -0
  541. package/examples/read-loop-detector.sh +59 -0
  542. package/examples/read-once-guard.sh +96 -0
  543. package/examples/read-only-mode.sh +12 -0
  544. package/examples/readme-exists-check.sh +0 -0
  545. package/examples/record-read-coverage.sh +73 -0
  546. package/examples/redirect-fragment-warner.sh +149 -0
  547. package/examples/redis-flushall-guard.sh +13 -0
  548. package/examples/redundant-read-blocker.sh +132 -0
  549. package/examples/refusal-arrest-gate.sh +248 -0
  550. package/examples/registry-publish-guard.sh +13 -1
  551. package/examples/remote-control-billing-classifier.sh +135 -0
  552. package/examples/replace-all-guard.sh +12 -0
  553. package/examples/repo-visibility-guard.sh +12 -0
  554. package/examples/reroute-after-block-guard.sh +150 -0
  555. package/examples/response-budget-guard.sh +0 -0
  556. package/examples/resume-drift-watcher.sh +57 -0
  557. package/examples/rg-replace-flag-detector.sh +125 -0
  558. package/examples/rhetorical-verification-prompt-detector.sh +102 -0
  559. package/examples/ripgrep-permission-fix.sh +0 -0
  560. package/examples/rm-safety-net.sh +151 -8
  561. package/examples/role-tool-guard.sh +12 -0
  562. package/examples/route-handler-emptiness-gate.sh +324 -0
  563. package/examples/ruby-lint-on-edit.sh +1 -1
  564. package/examples/runtime-binary-change-detector.sh +102 -0
  565. package/examples/same-command-repeat-detector.sh +196 -0
  566. package/examples/same-correction-arrest.sh +169 -0
  567. package/examples/sandbox-denywrite-enforcer.sh +78 -0
  568. package/examples/sandbox-relative-path-audit.sh +83 -25
  569. package/examples/sandbox-write-verify.sh +12 -0
  570. package/examples/schema-migration-guard.sh +0 -0
  571. package/examples/scope-expansion-receipt.sh +178 -0
  572. package/examples/scope-guard.sh +88 -9
  573. package/examples/secret-file-read-guard.sh +12 -0
  574. package/examples/secret-file-write-guard.sh +150 -0
  575. package/examples/self-modify-bypass-guard.sh +0 -0
  576. package/examples/sensitive-file-read-guard.sh +23 -3
  577. package/examples/sensitive-log-guard.sh +1 -0
  578. package/examples/server-side-prompt-injection-detector.sh +69 -0
  579. package/examples/session-agent-cost-limiter.sh +12 -0
  580. package/examples/session-backup-on-start.sh +1 -1
  581. package/examples/session-cost-alert.sh +12 -0
  582. package/examples/session-drift-guard.sh +12 -0
  583. package/examples/session-duration-guard.sh +25 -2
  584. package/examples/session-end-logger.sh +0 -0
  585. package/examples/session-health-monitor.sh +0 -0
  586. package/examples/session-index-repair.sh +1 -1
  587. package/examples/session-memory-watchdog.sh +1 -0
  588. package/examples/session-permission-reset-guard.sh +12 -0
  589. package/examples/session-persistence-verifier.sh +93 -0
  590. package/examples/session-plugin-pin-watch.sh +68 -0
  591. package/examples/session-rate-monitor.sh +176 -0
  592. package/examples/session-resume-env-fix.sh +0 -0
  593. package/examples/session-start-quota-status.sh +193 -0
  594. package/examples/session-start-safety-check.sh +55 -3
  595. package/examples/session-state-saver.sh +0 -0
  596. package/examples/session-summary-stop.sh +1 -1
  597. package/examples/session-summary.sh +0 -0
  598. package/examples/session-token-counter.sh +1 -1
  599. package/examples/settings-hooks-key-restorer.sh +99 -0
  600. package/examples/settings-json-health-check.sh +57 -0
  601. package/examples/settings-json-model-guard.sh +0 -0
  602. package/examples/settings-regression-tester.sh +188 -0
  603. package/examples/shell-config-truncation-guard.sh +12 -0
  604. package/examples/shell-wrapper-guard.sh +12 -0
  605. package/examples/skill-cumulative-size-detector.sh +104 -0
  606. package/examples/skill-description-drop-detector.sh +148 -0
  607. package/examples/skill-gate.sh +0 -0
  608. package/examples/skill-truncation-detector.sh +154 -0
  609. package/examples/skills-context-recorder.sh +167 -0
  610. package/examples/skills-load-verifier.sh +96 -0
  611. package/examples/skills-settings-validator.sh +139 -0
  612. package/examples/sonnet-45-deprecation-helper.sh +85 -0
  613. package/examples/spec-file-scope-guard.sh +12 -0
  614. package/examples/spring-profile-guard.sh +1 -0
  615. package/examples/spurious-malformed-notice-detector.sh +247 -0
  616. package/examples/sql-bulk-delete-warn.sh +88 -0
  617. package/examples/sql-injection-detect.sh +0 -0
  618. package/examples/ssh-key-protect.sh +12 -0
  619. package/examples/staged-secret-scan.sh +22 -1
  620. package/examples/stale-temp-settings-detector.sh +86 -0
  621. package/examples/standing-rule-session-surfacer.sh +137 -0
  622. package/examples/stop-hook-sigterm-wrapper.sh +182 -0
  623. package/examples/stop-transcript-write-health.sh +64 -0
  624. package/examples/strict-allowlist.sh +57 -15
  625. package/examples/strip-coauthored-by.sh +50 -10
  626. package/examples/subagent-blast-radius-guard.sh +184 -0
  627. package/examples/subagent-boundary-precheck.sh +126 -0
  628. package/examples/subagent-budget-guard.sh +12 -0
  629. package/examples/subagent-claudemd-inject.sh +0 -0
  630. package/examples/subagent-closure-verify-gate.sh +164 -0
  631. package/examples/subagent-destructive-git-guard.sh +120 -0
  632. package/examples/subagent-error-detector.sh +0 -0
  633. package/examples/subagent-forged-system-reminder-guard.sh +156 -0
  634. package/examples/subagent-identity-leak-guard.sh +102 -0
  635. package/examples/subagent-identity-reassertion.sh +51 -0
  636. package/examples/subagent-inheritance-tester.sh +179 -0
  637. package/examples/subagent-permission-mode-guard.sh +110 -0
  638. package/examples/subagent-scope-guard.sh +12 -0
  639. package/examples/subagent-spawn-verification-enforcer.sh +102 -0
  640. package/examples/subagent-tool-allowlist-enforcer.sh +101 -0
  641. package/examples/subagent-tool-call-limiter.sh +87 -15
  642. package/examples/subcommand-chain-guard.sh +12 -0
  643. package/examples/subscription-api-billing-warner.sh +160 -0
  644. package/examples/subscription-bypass-detector.sh +152 -0
  645. package/examples/svelte-lint-on-edit.sh +1 -0
  646. package/examples/swift-build-on-edit.sh +1 -1
  647. package/examples/symlink-guard.sh +27 -2
  648. package/examples/symlink-protect.sh +1 -0
  649. package/examples/system-dir-protection-guard.sh +73 -8
  650. package/examples/system-message-workaround.sh +38 -13
  651. package/examples/system-package-guard.sh +12 -0
  652. package/examples/systemd-service-guard.sh +12 -0
  653. package/examples/task-integrity-guard.sh +12 -0
  654. package/examples/temp-file-cleanup.sh +1 -1
  655. package/examples/temporal-suggestion-detector.sh +135 -0
  656. package/examples/terraform-guard.sh +27 -6
  657. package/examples/test-after-edit.sh +1 -1
  658. package/examples/test-before-push.sh +12 -0
  659. package/examples/test-coverage-reminder.sh +24 -1
  660. package/examples/thinking-budget-effort-mismatch-detector.sh +149 -0
  661. package/examples/thinking-stall-detector.sh +61 -0
  662. package/examples/timezone-guard.sh +0 -0
  663. package/examples/tmp-output-size-guard.sh +0 -0
  664. package/examples/todo-check.sh +1 -1
  665. package/examples/token-budget-guard.sh +12 -0
  666. package/examples/token-budget-per-task.sh +12 -0
  667. package/examples/token-usage-tracker.sh +7 -1
  668. package/examples/tokenizer-ratio-alert-corpus.sh +90 -0
  669. package/examples/tokenizer-ratio-alert.sh +104 -0
  670. package/examples/tool-call-rate-limiter.sh +0 -0
  671. package/examples/tool-result-correlation-checker.sh +167 -0
  672. package/examples/tool-result-size-guard.sh +132 -0
  673. package/examples/tool-retry-budget-guard.sh +12 -0
  674. package/examples/transcript-contamination-detector.sh +138 -0
  675. package/examples/trustfall-mcp-injection-guard.sh +103 -0
  676. package/examples/ultrareview-large-diff-advisor.sh +184 -0
  677. package/examples/unbounded-output-guard.sh +94 -0
  678. package/examples/uncommitted-changes-stop.sh +1 -0
  679. package/examples/uncommitted-discard-guard.sh +23 -5
  680. package/examples/uncommitted-work-guard.sh +12 -0
  681. package/examples/usage-warn.sh +0 -0
  682. package/examples/user-account-guard.sh +12 -0
  683. package/examples/userprompt-submit-receipt.sh +123 -0
  684. package/examples/variable-expansion-guard.sh +12 -0
  685. package/examples/verify-after-publish-reminder.sh +93 -0
  686. package/examples/verify-before-commit.sh +12 -0
  687. package/examples/version-bump-detector.sh +156 -0
  688. package/examples/version-regression-warner.sh +144 -0
  689. package/examples/vue-lint-on-edit.sh +1 -0
  690. package/examples/warn-cron-cost-trap.sh +173 -0
  691. package/examples/webfetch-runaway-guard.sh +89 -0
  692. package/examples/wellness-break-reminder.sh +118 -0
  693. package/examples/windows-destructive-command-guard.sh +177 -0
  694. package/examples/windows-path-guard.sh +12 -0
  695. package/examples/windows-python-stub-detector.sh +63 -0
  696. package/examples/work-hours-guard.sh +12 -0
  697. package/examples/working-directory-fence.sh +12 -0
  698. package/examples/workspace-lease-guard.sh +205 -0
  699. package/examples/worktree-create-log.sh +1 -0
  700. package/examples/worktree-delete-guard.sh +12 -0
  701. package/examples/worktree-edit-boundary-guard.sh +127 -0
  702. package/examples/worktree-escape-write-guard.sh +114 -0
  703. package/examples/worktree-hook-linker.sh +0 -0
  704. package/examples/worktree-hooks-path-fix.sh +111 -0
  705. package/examples/worktree-parent-write-guard.sh +43 -0
  706. package/examples/worktree-project-unify.sh +2 -1
  707. package/examples/worktree-remove-uncommitted-guard.sh +13 -0
  708. package/examples/worktree-unmerged-guard.sh +7 -1
  709. package/examples/write-byte-integrity-verifier.sh +190 -0
  710. package/examples/write-empty-content-guard.sh +67 -0
  711. package/examples/write-nul-corruption-detector.sh +61 -0
  712. package/examples/write-overwrite-confirm.sh +160 -14
  713. package/examples/write-secret-guard.sh +27 -5
  714. package/examples/write-shrink-guard.sh +12 -0
  715. package/examples/write-test-ratio.sh +0 -0
  716. package/examples/wsl-host-disk-space-guard.sh +97 -0
  717. package/examples/xml-format-leak-detector.sh +266 -0
  718. package/examples/yaml-syntax-check.sh +12 -0
  719. package/hooks/hooks.json +6 -6
  720. package/index.mjs +1699 -183
  721. package/mission.md +2 -0
  722. package/package.json +4 -4
  723. package/plugins/credential-guard/.claude-plugin/plugin.json +9 -7
  724. package/plugins/git-protection/.claude-plugin/plugin.json +10 -8
  725. package/plugins/safety-essentials/.claude-plugin/plugin.json +9 -7
  726. package/plugins/token-guard/.claude-plugin/plugin.json +10 -8
  727. package/scripts/agents-md-sync-setup.sh +156 -0
  728. package/scripts/autonomy-blocked-summary.sh +148 -0
  729. package/scripts/build-search-index.py +43 -0
  730. package/scripts/build-sitemap.py +119 -0
  731. package/scripts/cc-doctor.sh +192 -0
  732. package/scripts/check-hook-event-names.py +127 -0
  733. package/scripts/check-misfire-instrument.sh +64 -0
  734. package/scripts/claim-verify-audit.sh +467 -0
  735. package/scripts/cowork-claudemd-helper.sh +136 -0
  736. package/scripts/june-15-deprecated-model-scan.sh +111 -0
  737. package/scripts/measure-heredoc-shapes.sh +67 -0
  738. package/scripts/measure-literal-match-misfire.sh +110 -0
  739. package/scripts/probe-scope-guard-branches.sh +48 -0
  740. package/scripts/probe-skip-line-both-ways.sh +65 -0
  741. package/scripts/receipts-aggregate.py +199 -0
  742. package/scripts/session-forensic-audit.py +360 -0
  743. package/scripts.json +9 -9
  744. package/scripts.json.bak-2026-07-27-find +13 -0
  745. package/skills/safety-setup/SKILL.md +5 -5
  746. package/tests/approve-side-remaining-two.test.sh +129 -0
  747. package/tests/approver-list-granularity.test.sh +145 -0
  748. package/tests/askuserquestion-autonomy-gate.test.sh +181 -0
  749. package/tests/audit-ci-gate.test.sh +87 -0
  750. package/tests/audit-cross-layer-claudemd.test.sh +170 -0
  751. package/tests/audit-fail-open-parse.test.sh +100 -0
  752. package/tests/auto-approve-compound-tail.test.sh +194 -0
  753. package/tests/auto-mode-path-invoked-commands.test.sh +89 -0
  754. package/tests/auto-mode-quoted-targets.test.sh +127 -0
  755. package/tests/auto-mode-unquoted-targets.test.sh +112 -0
  756. package/tests/bash-secret-output-detector-detects.test.sh +102 -0
  757. package/tests/blindspots-cross-layer.test.sh +177 -0
  758. package/tests/block-database-wipe.test.sh +64 -0
  759. package/tests/bundled-short-flags-bypass.test.sh +85 -0
  760. package/tests/cd-git-allow-compound-tail.test.sh +67 -0
  761. package/tests/chown-guard-filesystem-root.test.sh +64 -0
  762. package/tests/ci-workflow-guard-skip-rule.test.sh +115 -0
  763. package/tests/compound-deny-safe-rm-targets.test.sh +105 -0
  764. package/tests/core-scripts-parser-fallback.test.sh +140 -0
  765. package/tests/destructive-guard-bare-glob.test.sh +74 -0
  766. package/tests/destructive-guard-every-operand.test.sh +100 -0
  767. package/tests/destructive-guard-find-deletion.test.sh +114 -0
  768. package/tests/destructive-guard-flag-order.test.sh +106 -0
  769. package/tests/destructive-guard-mentions-vs-invocations.test.sh +107 -0
  770. package/tests/destructive-guard-quoted-target.test.sh +89 -0
  771. package/tests/destructive-guard-separators.test.sh +105 -0
  772. package/tests/destructive-guard-variable-target.test.sh +98 -0
  773. package/tests/destructive-guard-wrapped-command.test.sh +91 -0
  774. package/tests/doctor-hook-disabling-env.test.sh +92 -0
  775. package/tests/doctor-misspelled-settings-keys.test.sh +106 -0
  776. package/tests/example-guards-wrapped-command.test.sh +169 -0
  777. package/tests/file-edit-backup.test.sh +93 -0
  778. package/tests/git-filter-repo-guard.test.sh +60 -0
  779. package/tests/git-global-options-bypass.test.sh +141 -0
  780. package/tests/git-invocation-prefixes-all-guards.test.sh +114 -0
  781. package/tests/git-maintenance-guard.test.sh +83 -0
  782. package/tests/git-pack-temp-cleanup-guard.test.sh +133 -0
  783. package/tests/git-rm-orphan-wipe-guard.test.sh +66 -0
  784. package/tests/git-submodule-guard.test.sh +50 -0
  785. package/tests/grep-pcre-portability.test.sh +155 -0
  786. package/tests/hook-registration-matches-input.test.sh +73 -0
  787. package/tests/hook-trigger-matches-envelope.test.sh +178 -0
  788. package/tests/install-does-not-claim-protection.test.sh +110 -0
  789. package/tests/install-example-standalone-tools.test.sh +139 -0
  790. package/tests/line-continuation-bypass.test.sh +114 -0
  791. package/tests/mcp-config-poisoning-audit.test.sh +106 -0
  792. package/tests/nested-background-agent-guard.test.sh +58 -0
  793. package/tests/no-unqualified-safety-claims.test.sh +114 -0
  794. package/tests/option-eating-grep-patterns.test.sh +130 -0
  795. package/tests/outdated-core-guards.test.sh +134 -0
  796. package/tests/outdated-report.test.sh +155 -0
  797. package/tests/output-secret-mask-warns.test.sh +73 -0
  798. package/tests/plugin-hooks-fail-open-under-sh.test.sh +165 -0
  799. package/tests/plugins-word-order.test.sh +126 -0
  800. package/tests/powershell-remove-item-guard.test.sh +85 -0
  801. package/tests/project-dir-naming.test.sh +103 -0
  802. package/tests/quoted-safe-targets-and-mentions.test.sh +190 -0
  803. package/tests/reroute-after-block-guard.test.sh +104 -0
  804. package/tests/secret-guard-documented-promises.test.sh +97 -0
  805. package/tests/session-plugin-pin-watch.test.sh +45 -0
  806. package/tests/settings-unreadable-refuses-to-write.test.sh +95 -0
  807. package/tests/shield-no-silent-adoption.test.py +110 -0
  808. package/tests/shield-no-silent-adoption.test.sh +46 -0
  809. package/tests/stop-transcript-write-health.test.sh +46 -0
  810. package/tests/system-dir-guard-root-erased.test.sh +66 -0
  811. package/tests/test-account-billing-log.sh +100 -0
  812. package/tests/test-account-routing-preflight.sh +77 -0
  813. package/tests/test-agent-sdk-credit-pool-monitor.sh +157 -0
  814. package/tests/test-agent-view-quota-warn.sh +184 -0
  815. package/tests/test-agents-md-edit-drift-warner.sh +176 -0
  816. package/tests/test-agents-md-loader.sh +204 -0
  817. package/tests/test-agents-md-sync-checker.sh +125 -0
  818. package/tests/test-ai-slop-punctuation-arrest.sh +280 -0
  819. package/tests/test-allowlist.sh +60 -0
  820. package/tests/test-always-allow-pattern-suggester.sh +147 -0
  821. package/tests/test-anthropic-base-url-guard.sh +88 -0
  822. package/tests/test-articulated-scope-capture.sh +139 -0
  823. package/tests/test-attachment-traversal-guard.sh +168 -0
  824. package/tests/test-aup-block-pattern-logger.sh +315 -0
  825. package/tests/test-aup-false-positive-helper.sh +188 -0
  826. package/tests/test-aup-large-tool-output-warner.sh +370 -0
  827. package/tests/test-aup-retry-loop-guard.sh +341 -0
  828. package/tests/test-auth-expiry-reminder.sh +303 -0
  829. package/tests/test-auth-macos-sleep-detector.sh +254 -0
  830. package/tests/test-auth-path-detector.sh +232 -0
  831. package/tests/test-auth-status-checker.sh +233 -0
  832. package/tests/test-authorized-reconfirmation-detector.sh +280 -0
  833. package/tests/test-background-cost-launch-guard.sh +62 -0
  834. package/tests/test-bash-allowlist-secondary-check.sh +143 -0
  835. package/tests/test-bash-fanout-bounded-rewriter.sh +186 -0
  836. package/tests/test-bash-project-fence.sh +127 -0
  837. package/tests/test-bg-permission-prompt-warner.sh +221 -0
  838. package/tests/test-binary-read-detector.sh +173 -0
  839. package/tests/test-broad-prefix-session-trap-warner.sh +167 -0
  840. package/tests/test-bulk-delete-target-resolution.sh +49 -0
  841. package/tests/test-bypass-mode-effective-verifier.sh +179 -0
  842. package/tests/test-cache-creation-drift-detector.sh +244 -0
  843. package/tests/test-cache-residue-detector.sh +429 -0
  844. package/tests/test-cache-tier-logger.sh +59 -0
  845. package/tests/test-cache-ttl-eviction-detector.sh +282 -0
  846. package/tests/test-cch-sentinel-precommit-guard.sh +64 -0
  847. package/tests/test-claim-verify-detector.sh +222 -0
  848. package/tests/test-claim-vs-caveat-checker.sh +134 -0
  849. package/tests/test-claude-code-version-pin-advisor.sh +353 -0
  850. package/tests/test-claude-md-reinjector.sh +173 -0
  851. package/tests/test-claude-md-size-monitor.sh +107 -0
  852. package/tests/test-claude-update-budget-guard.sh +132 -0
  853. package/tests/test-claude-update-smart.sh +91 -0
  854. package/tests/test-claudemd-tool-prohibition.sh +239 -0
  855. package/tests/test-cli-config-pinning-detector.sh +233 -0
  856. package/tests/test-cliff-countdown-advisor.sh +138 -0
  857. package/tests/test-closure-word-verify-gate.sh +158 -0
  858. package/tests/test-commit-all-scope-guard.sh +73 -0
  859. package/tests/test-commitment-carry-forward-arrest.sh +250 -0
  860. package/tests/test-compact-circuit-breaker.sh +134 -0
  861. package/tests/test-compact-dispatch-watchdog.sh +147 -0
  862. package/tests/test-completion-claim-without-verification-detector.sh +326 -0
  863. package/tests/test-compound-bash-permission-resolver.sh +264 -0
  864. package/tests/test-compound-command-deny-enforcer.sh +67 -0
  865. package/tests/test-context-length-budget.sh +68 -0
  866. package/tests/test-context-usage-drift-alert.sh +52 -22
  867. package/tests/test-cost-incident-self-audit.sh +94 -0
  868. package/tests/test-cowork-claude-md-load-checker.sh +257 -0
  869. package/tests/test-cowork-claudemd-helper.sh +141 -0
  870. package/tests/test-cowork-fuse-staleness-watcher.sh +287 -0
  871. package/tests/test-cowork-hook-absence-warner.sh +230 -0
  872. package/tests/test-cowork-model-picker-advisor.sh +317 -0
  873. package/tests/test-credential-exfil-guard.sh +62 -0
  874. package/tests/test-cron-create-receipt.sh +165 -0
  875. package/tests/test-cross-product-mcp-spawn-detector.sh +112 -0
  876. package/tests/test-daemon-zombie-worker-surfacer.sh +71 -0
  877. package/tests/test-daily-cost-guard.sh +131 -0
  878. package/tests/test-deny-rule-integrity-verifier.sh +288 -0
  879. package/tests/test-deployment-readback-gate.sh +92 -0
  880. package/tests/test-deployment-readback-gh-adapter.sh +163 -0
  881. package/tests/test-disabled-feature-toggle-advisor.sh +78 -0
  882. package/tests/test-dispatch-allowlist-preflight.sh +385 -0
  883. package/tests/test-dispatch-liveness-watchdog.sh +319 -0
  884. package/tests/test-dispatch-receipt.sh +314 -0
  885. package/tests/test-dotenv-anthropic-key-billing-guard.sh +160 -0
  886. package/tests/test-echo-probe-spam-detector.sh +143 -0
  887. package/tests/test-edit-quote-ambiguity-guard.sh +75 -0
  888. package/tests/test-ephemeral-container-detector.sh +251 -0
  889. package/tests/test-evidence-claim-gate.sh +291 -0
  890. package/tests/test-exploration-budget-guard.sh +164 -0
  891. package/tests/test-extended-thinking-loop-guard.sh +289 -0
  892. package/tests/test-extended-thinking-resume-warning.sh +240 -0
  893. package/tests/test-extended-thinking-tool-use-mismatch-detector.sh +236 -0
  894. package/tests/test-fabricated-command-detector.sh +296 -0
  895. package/tests/test-false-disk-full-guard.sh +36 -0
  896. package/tests/test-feature-deprecation-detector.sh +117 -0
  897. package/tests/test-forbidden-response-phrase-detector.sh +246 -0
  898. package/tests/test-git-operations-require-approval.sh +53 -0
  899. package/tests/test-git-push-blast-radius-guard.sh +115 -0
  900. package/tests/test-goal-iteration-limit-warner.sh +128 -0
  901. package/tests/test-growthbook-flag-monitor.sh +428 -0
  902. package/tests/test-halt-signal-detector.sh +120 -0
  903. package/tests/test-hook-self-disable-detector.sh +232 -0
  904. package/tests/test-iteration-quality-degradation-detector.sh +244 -0
  905. package/tests/test-long-session-malformed-tool-call-detector.sh +185 -0
  906. package/tests/test-marketplace-plugins.sh +193 -0
  907. package/tests/test-mcp-misdiagnosis-arrest.sh +235 -0
  908. package/tests/test-mcp-orphan-leak-warner.sh +71 -0
  909. package/tests/test-mcp-permissions-ask-warner.sh +207 -0
  910. package/tests/test-mcp-routine-approval-detector.sh +229 -0
  911. package/tests/test-mcp-startup-bloat-detector.sh +141 -0
  912. package/tests/test-mcp-stdio-compatibility-test.sh +112 -0
  913. package/tests/test-memory-chain-audit.sh +59 -0
  914. package/tests/test-memory-orphan-detector.sh +227 -0
  915. package/tests/test-model-swap-suggester.sh +368 -0
  916. package/tests/test-model-version-lock.sh +83 -0
  917. package/tests/test-multi-file-plan-routing-gate.sh +277 -0
  918. package/tests/test-multi-window-auth-drift-detector.sh +262 -0
  919. package/tests/test-nested-spawn-inflight-guard.sh +281 -0
  920. package/tests/test-no-force-flag.sh +49 -0
  921. package/tests/test-non-english-quality-warner.sh +229 -0
  922. package/tests/test-oauth-refresh-monitor.sh +311 -0
  923. package/tests/test-opus-degradation-tracker.sh +274 -0
  924. package/tests/test-opus48-routine-task-warning.sh +201 -0
  925. package/tests/test-opus48-thinking-wedge-advisor.sh +249 -0
  926. package/tests/test-output-token-spike-detector.sh +315 -0
  927. package/tests/test-parallel-batch-size-limiter.sh +228 -0
  928. package/tests/test-parallel-cascade-detector.sh +191 -0
  929. package/tests/test-partial-view-claim-arrest.sh +272 -0
  930. package/tests/test-per-prompt-token-cap.sh +136 -0
  931. package/tests/test-persisted-1m-model-advisor.sh +71 -0
  932. package/tests/test-plugin-hooks-json-bloat-detector.sh +267 -0
  933. package/tests/test-post-edit-disk-verify.sh +294 -0
  934. package/tests/test-pre-bash-sed-line-ending-windows.sh +108 -0
  935. package/tests/test-pre-execution-claim-detector.sh +366 -0
  936. package/tests/test-private-key-backup-and-git-credentials.sh +100 -0
  937. package/tests/test-proxy-capture-suggester.sh +214 -0
  938. package/tests/test-public-artefact-socratic-narrowing.sh +346 -0
  939. package/tests/test-quota-anomaly-detector.sh +321 -0
  940. package/tests/test-quota-reset-audit.sh +81 -0
  941. package/tests/test-read-loop-detector.sh +137 -0
  942. package/tests/test-read-once-guard.sh +85 -0
  943. package/tests/test-receipts-aggregate.sh +143 -0
  944. package/tests/test-redirect-fragment-warner.sh +130 -0
  945. package/tests/test-redundant-read-blocker.sh +155 -0
  946. package/tests/test-refusal-arrest-gate.sh +303 -0
  947. package/tests/test-remote-control-billing-classifier.sh +125 -0
  948. package/tests/test-resume-drift-watcher.sh +65 -0
  949. package/tests/test-rg-replace-flag-detector.sh +175 -0
  950. package/tests/test-rhetorical-verification-prompt-detector.sh +237 -0
  951. package/tests/test-rm-safety-net.sh +115 -0
  952. package/tests/test-route-handler-emptiness-gate.sh +300 -0
  953. package/tests/test-runtime-binary-change-detector.sh +196 -0
  954. package/tests/test-same-command-repeat-detector.sh +165 -0
  955. package/tests/test-same-correction-arrest.sh +165 -0
  956. package/tests/test-scope-expansion-receipt.sh +207 -0
  957. package/tests/test-server-side-prompt-injection-detector.sh +181 -0
  958. package/tests/test-session-persistence-verifier.sh +128 -0
  959. package/tests/test-session-rate-monitor.sh +284 -0
  960. package/tests/test-session-start-quota-status.sh +210 -0
  961. package/tests/test-session-start-safety-check.sh +138 -0
  962. package/tests/test-settings-hooks-key-restorer.sh +257 -0
  963. package/tests/test-settings-json-health-check.sh +70 -0
  964. package/tests/test-settings-regression-tester.sh +197 -0
  965. package/tests/test-skill-cumulative-size-detector.sh +198 -0
  966. package/tests/test-skill-description-drop-detector.sh +236 -0
  967. package/tests/test-skill-truncation-detector.sh +263 -0
  968. package/tests/test-skills-context-recorder.sh +329 -0
  969. package/tests/test-skills-load-verifier.sh +184 -0
  970. package/tests/test-skills-settings-validator.sh +242 -0
  971. package/tests/test-sonnet-45-deprecation-helper.sh +150 -0
  972. package/tests/test-spurious-malformed-notice-detector.sh +290 -0
  973. package/tests/test-sql-bulk-delete-warn.sh +123 -0
  974. package/tests/test-ssh-key-protect.sh +81 -0
  975. package/tests/test-stale-temp-settings-detector.sh +161 -0
  976. package/tests/test-standing-rule-session-surfacer.sh +215 -0
  977. package/tests/test-starter-hooks-manifest.sh +96 -0
  978. package/tests/test-stop-hook-sigterm-wrapper.sh +258 -0
  979. package/tests/test-strict-allowlist.sh +72 -0
  980. package/tests/test-subagent-boundary-precheck.sh +137 -0
  981. package/tests/test-subagent-closure-verify-gate.sh +193 -0
  982. package/tests/test-subagent-destructive-git-guard.sh +86 -0
  983. package/tests/test-subagent-identity-leak-guard.sh +62 -0
  984. package/tests/test-subagent-identity-reassertion.sh +61 -0
  985. package/tests/test-subagent-inheritance-tester.sh +319 -0
  986. package/tests/test-subagent-permission-mode-guard.sh +61 -0
  987. package/tests/test-subagent-spawn-verification-enforcer.sh +60 -0
  988. package/tests/test-subagent-tool-allowlist-enforcer.sh +62 -0
  989. package/tests/test-subagent-tool-call-limiter.sh +97 -0
  990. package/tests/test-subscription-api-billing-warner.sh +138 -0
  991. package/tests/test-subscription-bypass-detector.sh +255 -0
  992. package/tests/test-temporal-suggestion-detector.sh +183 -0
  993. package/tests/test-thinking-budget-effort-mismatch-detector.sh +327 -0
  994. package/tests/test-thinking-stall-detector.sh +151 -0
  995. package/tests/test-tokenizer-ratio-alert-corpus.sh +77 -0
  996. package/tests/test-tokenizer-ratio-alert.sh +93 -0
  997. package/tests/test-tool-result-correlation-checker.sh +264 -0
  998. package/tests/test-tool-result-size-guard.sh +121 -0
  999. package/tests/test-transcript-contamination-detector.sh +264 -0
  1000. package/tests/test-trigger-header-parsing.sh +151 -0
  1001. package/tests/test-ultrareview-large-diff-advisor.sh +192 -0
  1002. package/tests/test-userprompt-submit-receipt.sh +181 -0
  1003. package/tests/test-verify-after-publish-reminder.sh +184 -0
  1004. package/tests/test-version-bump-detector.sh +212 -0
  1005. package/tests/test-version-regression-warner.sh +165 -0
  1006. package/tests/test-warn-cron-cost-trap.sh +82 -0
  1007. package/tests/test-webfetch-runaway-guard.sh +77 -0
  1008. package/tests/test-wellness-break-reminder.sh +138 -0
  1009. package/tests/test-windows-destructive-command-guard.sh +169 -0
  1010. package/tests/test-windows-python-stub-detector.sh +146 -0
  1011. package/tests/test-worktree-edit-boundary-guard.sh +219 -0
  1012. package/tests/test-write-byte-integrity-verifier.sh +192 -0
  1013. package/tests/test-xml-format-leak-detector.sh +299 -0
  1014. package/tests/trustfall-mcp-injection-guard.test.sh +183 -0
  1015. package/tests/workspace-lease-guard.test.sh +144 -0
  1016. package/tests/worktree-escape-write-guard.test.sh +68 -0
  1017. package/tests/worktree-hooks-path-fix.test.sh +181 -0
  1018. package/tests/worktree-parent-write-guard.test.sh +51 -0
  1019. package/tests/write-empty-content-guard.test.sh +39 -0
  1020. package/tests/write-nul-corruption-detector.test.sh +29 -0
  1021. package/tests/write-overwrite-unread-content.test.sh +178 -0
  1022. package/tests/wsl-host-disk-space-guard.test.sh +55 -0
@@ -1,11 +1,38 @@
1
+ #!/bin/bash
1
2
  INPUT=$(cat)
2
- COUNTER="/tmp/cc-tool-count-$$"
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
- TRANSCRIPT=$(ls -t ~/.claude/projects/*/sessions/*/transcript.jsonl 2>/dev/null | head -1)
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
- COUNTER_FILE="/tmp/cc-context-usage-counter-$$"
10
- # セッションPIDが変わると新しいカウンターになる
11
- # フォールバック: 親PIDでグループ化
12
- if [ ! -f "$COUNTER_FILE" ]; then
13
- COUNTER_FILE="/tmp/cc-context-usage-counter-$(date +%Y%m%d)"
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
- # 50回: 注意喚起、100回: 強い警告、150回: compact推奨
21
- if [ "$COUNT" -eq 50 ]; then
22
- echo "📊 Session checkpoint: $COUNT tool calls. Context may be growing large." >&2
23
- echo "Run /cost to check actual usage. UI display may undercount by 2x (#50204)." >&2
24
- elif [ "$COUNT" -eq 100 ]; then
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 [ "$COUNT" -eq 150 ]; then
29
- echo "🚨 VERY HIGH CONTEXT: $COUNT tool calls. Auto-compact likely imminent." >&2
30
- echo "Save important state to files NOW. Run /compact manually to control what's kept." >&2
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