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.
Files changed (1017) 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 +421 -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-dispatch-watchdog.sh +149 -0
  178. package/examples/completion-claim-without-verification-detector.sh +207 -0
  179. package/examples/composer-guard.sh +12 -0
  180. package/examples/compound-bash-permission-resolver.sh +156 -0
  181. package/examples/compound-command-allow.sh +1 -1
  182. package/examples/compound-command-deny-enforcer.sh +183 -0
  183. package/examples/compound-inject-guard.sh +12 -0
  184. package/examples/concurrent-edit-lock.sh +12 -0
  185. package/examples/conflict-marker-guard.sh +12 -0
  186. package/examples/consecutive-error-breaker.sh +0 -0
  187. package/examples/console-log-count.sh +1 -0
  188. package/examples/context-compact-advisor.sh +29 -2
  189. package/examples/context-length-budget.sh +69 -0
  190. package/examples/context-threshold-alert.sh +12 -0
  191. package/examples/context-usage-drift-alert.sh +41 -13
  192. package/examples/conversation-history-guard.sh +12 -0
  193. package/examples/core-file-protect-guard.sh +12 -0
  194. package/examples/cors-star-warn.sh +0 -0
  195. package/examples/cost-incident-self-audit.sh +162 -0
  196. package/examples/cowork-claude-md-load-checker.sh +100 -0
  197. package/examples/cowork-fuse-staleness-watcher.sh +140 -0
  198. package/examples/cowork-hook-absence-warner.sh +167 -0
  199. package/examples/cowork-model-picker-advisor.sh +115 -0
  200. package/examples/credential-exfil-guard.sh +65 -4
  201. package/examples/credential-file-cat-guard.sh +17 -1
  202. package/examples/cron-create-receipt.sh +112 -0
  203. package/examples/cron-modification-guard.sh +12 -0
  204. package/examples/cross-product-mcp-spawn-detector.sh +178 -0
  205. package/examples/cwd-project-boundary-guard.sh +0 -0
  206. package/examples/daemon-zombie-worker-surfacer.sh +118 -0
  207. package/examples/daily-cost-guard.sh +164 -0
  208. package/examples/daily-usage-tracker.sh +0 -0
  209. package/examples/dangerous-pip-flag-guard.sh +12 -0
  210. package/examples/db-connect-guard.sh +13 -1
  211. package/examples/denied-action-retry-guard.sh +12 -0
  212. package/examples/deny-bypass-detector.sh +12 -0
  213. package/examples/deny-rule-integrity-verifier.sh +181 -0
  214. package/examples/dependency-install-guard.sh +12 -0
  215. package/examples/deploy-guard.sh +14 -2
  216. package/examples/deploy-path-verify-guard.sh +12 -0
  217. package/examples/deployment-readback-gate.sh +135 -0
  218. package/examples/deployment-readback-gh-adapter.sh +247 -0
  219. package/examples/deployment-verify-guard.sh +25 -2
  220. package/examples/destructive-db-script-write-guard.sh +166 -0
  221. package/examples/destructive-migration-write-guard.sh +163 -0
  222. package/examples/diff-size-guard.sh +12 -0
  223. package/examples/disabled-feature-toggle-advisor.sh +88 -0
  224. package/examples/disk-partition-guard.sh +12 -0
  225. package/examples/dispatch-allowlist-preflight.sh +301 -0
  226. package/examples/dispatch-liveness-watchdog.sh +216 -0
  227. package/examples/dispatch-receipt.sh +174 -0
  228. package/examples/django-migrate-guard.sh +12 -0
  229. package/examples/dns-config-guard.sh +12 -0
  230. package/examples/docker-dangerous-guard.sh +12 -0
  231. package/examples/docker-volume-guard.sh +0 -0
  232. package/examples/dockerfile-latest-guard.sh +1 -0
  233. package/examples/dotenv-anthropic-key-billing-guard.sh +99 -0
  234. package/examples/dotenv-commit-guard.sh +12 -0
  235. package/examples/dotenv-read-guard.sh +12 -0
  236. package/examples/dotfile-protection-guard.sh +12 -0
  237. package/examples/dotnet-build-on-edit.sh +1 -1
  238. package/examples/drizzle-migrate-guard.sh +27 -2
  239. package/examples/echo-probe-spam-detector.sh +176 -0
  240. package/examples/edit-counter-test-gate.sh +12 -0
  241. package/examples/edit-error-counter.sh +1 -1
  242. package/examples/edit-guard.sh +12 -0
  243. package/examples/edit-old-string-validator.sh +12 -0
  244. package/examples/edit-quote-ambiguity-guard.sh +97 -0
  245. package/examples/edit-retry-loop-guard.sh +0 -0
  246. package/examples/edit-verify.sh +0 -0
  247. package/examples/env-inline-secret-guard.sh +14 -2
  248. package/examples/env-naming-convention.sh +0 -0
  249. package/examples/env-prod-guard.sh +0 -0
  250. package/examples/env-required-check.sh +0 -0
  251. package/examples/env-source-guard.sh +12 -0
  252. package/examples/env-var-check.sh +24 -1
  253. package/examples/ephemeral-container-detector.sh +147 -0
  254. package/examples/error-memory-guard.sh +12 -0
  255. package/examples/evidence-claim-gate.sh +187 -0
  256. package/examples/exploration-budget-guard.sh +12 -0
  257. package/examples/expo-eject-guard.sh +13 -0
  258. package/examples/extended-thinking-loop-guard.sh +139 -0
  259. package/examples/extended-thinking-resume-warning.sh +119 -0
  260. package/examples/extended-thinking-tool-use-mismatch-detector.sh +212 -0
  261. package/examples/fabricated-command-detector.sh +145 -0
  262. package/examples/false-disk-full-guard.sh +63 -0
  263. package/examples/feature-deprecation-detector.sh +109 -0
  264. package/examples/file-change-tracker.sh +1 -1
  265. package/examples/file-change-undo-tracker.sh +0 -0
  266. package/examples/file-edit-backup.sh +63 -14
  267. package/examples/file-reference-check.sh +0 -0
  268. package/examples/file-size-limit.sh +12 -0
  269. package/examples/financial-operation-guard.sh +12 -0
  270. package/examples/firewall-guard.sh +12 -0
  271. package/examples/fish-shell-wrapper.sh +125 -7
  272. package/examples/five-hundred-milestone.sh +1 -0
  273. package/examples/flask-static-route-guard.sh +89 -0
  274. package/examples/forbidden-response-phrase-detector.sh +161 -0
  275. package/examples/gem-push-guard.sh +13 -0
  276. package/examples/gh-cli-destructive-guard.sh +13 -1
  277. package/examples/git-checkout-safety-guard.sh +12 -0
  278. package/examples/git-checkout-uncommitted-guard.sh +12 -0
  279. package/examples/git-config-guard.sh +12 -0
  280. package/examples/git-crypt-worktree-guard.sh +12 -0
  281. package/examples/git-filter-repo-guard.sh +56 -0
  282. package/examples/git-history-rewrite-guard.sh +12 -0
  283. package/examples/git-hook-bypass-guard.sh +0 -0
  284. package/examples/git-maintenance-guard.sh +83 -0
  285. package/examples/git-merge-conflict-prevent.sh +0 -0
  286. package/examples/git-message-length-check.sh +0 -0
  287. package/examples/git-message-length.sh +0 -0
  288. package/examples/git-operations-require-approval.sh +68 -14
  289. package/examples/git-pack-temp-cleanup-guard.sh +102 -0
  290. package/examples/git-push-blast-radius-guard.sh +218 -0
  291. package/examples/git-remote-guard.sh +24 -3
  292. package/examples/git-rm-orphan-wipe-guard.sh +85 -0
  293. package/examples/git-stash-before-checkout.sh +12 -0
  294. package/examples/git-stash-before-danger.sh +0 -0
  295. package/examples/git-submodule-guard.sh +69 -2
  296. package/examples/git-tag-guard.sh +12 -0
  297. package/examples/github-actions-secret-guard.sh +0 -0
  298. package/examples/gitignore-check.sh +0 -0
  299. package/examples/gitops-drift-guard.sh +12 -0
  300. package/examples/go-mod-tidy-warn.sh +1 -0
  301. package/examples/go-vet-after-edit.sh +12 -0
  302. package/examples/goal-iteration-limit-warner.sh +152 -0
  303. package/examples/grep-nul-false-negative-guard.sh +30 -0
  304. package/examples/growthbook-flag-monitor.sh +257 -0
  305. package/examples/hallucination-url-check.sh +1 -1
  306. package/examples/halt-signal-detector.sh +135 -0
  307. package/examples/handoff-on-clear.sh +65 -0
  308. package/examples/hardcoded-ip-guard.sh +1 -0
  309. package/examples/headless-empty-result-guard.sh +0 -0
  310. package/examples/headless-stop-guard.sh +0 -0
  311. package/examples/helm-install-guard.sh +2 -1
  312. package/examples/home-critical-bash-guard.sh +17 -1
  313. package/examples/hook-debug-wrapper.sh +6 -2
  314. package/examples/hook-permission-fixer.sh +0 -0
  315. package/examples/hook-self-disable-detector.sh +99 -0
  316. package/examples/hook-stdout-sanitizer.sh +6 -2
  317. package/examples/hook-tamper-guard.sh +12 -0
  318. package/examples/idle-session-cost-alert.sh +0 -0
  319. package/examples/image-dimension-guard.sh +109 -0
  320. package/examples/image-file-validator.sh +0 -0
  321. package/examples/iteration-quality-degradation-detector.sh +170 -0
  322. package/examples/java-compile-on-edit.sh +1 -1
  323. package/examples/json-syntax-check.sh +0 -0
  324. package/examples/k8s-production-guard.sh +13 -1
  325. package/examples/kill-process-guard.sh +12 -0
  326. package/examples/kubernetes-guard.sh +13 -1
  327. package/examples/laravel-artisan-guard.sh +13 -0
  328. package/examples/large-file-guard.sh +1 -1
  329. package/examples/log-level-guard.sh +0 -0
  330. package/examples/log-truncation-guard.sh +12 -0
  331. package/examples/long-session-malformed-tool-call-detector.sh +183 -0
  332. package/examples/loop-detector.sh +12 -0
  333. package/examples/magic-number-warn.sh +1 -0
  334. package/examples/main-branch-warn.sh +12 -0
  335. package/examples/markdown-link-check.sh +0 -0
  336. package/examples/max-concurrent-agents.sh +12 -0
  337. package/examples/max-edit-size-guard.sh +13 -0
  338. package/examples/max-file-count-guard.sh +0 -0
  339. package/examples/max-file-delete-count.sh +0 -0
  340. package/examples/max-function-length.sh +1 -0
  341. package/examples/max-import-count.sh +0 -0
  342. package/examples/max-subagent-count.sh +0 -0
  343. package/examples/mcp-config-freeze.sh +12 -0
  344. package/examples/mcp-config-poisoning-audit.sh +150 -0
  345. package/examples/mcp-data-boundary.sh +1 -1
  346. package/examples/mcp-misdiagnosis-arrest.sh +209 -0
  347. package/examples/mcp-orphan-leak-warner.sh +49 -0
  348. package/examples/mcp-permissions-ask-warner.sh +151 -0
  349. package/examples/mcp-routine-approval-detector.sh +154 -0
  350. package/examples/mcp-server-allowlist.sh +12 -0
  351. package/examples/mcp-server-guard.sh +12 -0
  352. package/examples/mcp-startup-bloat-detector.sh +87 -0
  353. package/examples/mcp-stdio-compatibility-test.sh +153 -0
  354. package/examples/mcp-tool-audit-log.sh +0 -0
  355. package/examples/mcp-tool-guard.sh +101 -1
  356. package/examples/mcp-warmup-wait.sh +0 -0
  357. package/examples/memory-chain-audit.sh +56 -0
  358. package/examples/memory-orphan-detector.sh +188 -0
  359. package/examples/memory-write-guard.sh +99 -17
  360. package/examples/migration-verify-guard.sh +12 -0
  361. package/examples/model-swap-suggester.sh +177 -0
  362. package/examples/model-version-alert.sh +5 -1
  363. package/examples/model-version-lock.sh +63 -0
  364. package/examples/move-delete-sequence-guard.sh +33 -2
  365. package/examples/multi-file-plan-routing-gate.sh +192 -0
  366. package/examples/multi-vendor-concurrent-warner.sh +108 -0
  367. package/examples/multi-window-auth-drift-detector.sh +183 -0
  368. package/examples/multiline-command-approver.sh +161 -23
  369. package/examples/nested-background-agent-guard.sh +109 -0
  370. package/examples/nested-spawn-inflight-guard.sh +178 -0
  371. package/examples/network-exfil-guard.sh +12 -0
  372. package/examples/network-guard.sh +12 -0
  373. package/examples/network-interface-guard.sh +12 -0
  374. package/examples/nextjs-env-guard.sh +1 -1
  375. package/examples/no-absolute-import.sh +0 -0
  376. package/examples/no-alert-confirm-prompt.sh +0 -0
  377. package/examples/no-anonymous-default-export.sh +0 -0
  378. package/examples/no-any-type.sh +0 -0
  379. package/examples/no-any-typescript.sh +1 -0
  380. package/examples/no-ask-human.sh +12 -0
  381. package/examples/no-assignment-in-condition.sh +0 -0
  382. package/examples/no-base64-exfil.sh +12 -0
  383. package/examples/no-callback-hell.sh +0 -0
  384. package/examples/no-circular-dependency.sh +0 -0
  385. package/examples/no-cleartext-storage.sh +0 -0
  386. package/examples/no-commented-code.sh +0 -0
  387. package/examples/no-commit-fixup.sh +0 -0
  388. package/examples/no-console-assert.sh +0 -0
  389. package/examples/no-console-error-swallow.sh +0 -0
  390. package/examples/no-console-in-prod.sh +0 -0
  391. package/examples/no-console-log-commit.sh +12 -0
  392. package/examples/no-console-log.sh +0 -0
  393. package/examples/no-console-time.sh +0 -0
  394. package/examples/no-cors-wildcard.sh +4 -1
  395. package/examples/no-curl-upload.sh +0 -0
  396. package/examples/no-dangerouslySetInnerHTML.sh +0 -0
  397. package/examples/no-dangling-await.sh +1 -0
  398. package/examples/no-debug-commit.sh +12 -0
  399. package/examples/no-debug-in-commit.sh +0 -0
  400. package/examples/no-deep-nesting.sh +0 -0
  401. package/examples/no-deep-relative-import.sh +1 -0
  402. package/examples/no-default-credentials.sh +0 -0
  403. package/examples/no-deploy-friday.sh +13 -1
  404. package/examples/no-disabled-test.sh +0 -0
  405. package/examples/no-document-write.sh +0 -0
  406. package/examples/no-empty-function.sh +0 -0
  407. package/examples/no-eval-in-template.sh +0 -0
  408. package/examples/no-eval-template.sh +3 -1
  409. package/examples/no-eval.sh +0 -0
  410. package/examples/no-exec-user-input.sh +0 -0
  411. package/examples/no-fixme-ship.sh +12 -0
  412. package/examples/no-floating-promises.sh +0 -0
  413. package/examples/no-force-flag.sh +22 -5
  414. package/examples/no-force-install.sh +0 -0
  415. package/examples/no-git-amend.sh +12 -0
  416. package/examples/no-git-rebase-public.sh +0 -0
  417. package/examples/no-global-install.sh +12 -0
  418. package/examples/no-global-state.sh +0 -0
  419. package/examples/no-hardcoded-port.sh +1 -0
  420. package/examples/no-hardcoded-url.sh +0 -0
  421. package/examples/no-helmet-missing.sh +0 -0
  422. package/examples/no-http-url.sh +1 -0
  423. package/examples/no-http-without-https.sh +0 -0
  424. package/examples/no-inline-style.sh +0 -0
  425. package/examples/no-inline-styles.sh +1 -0
  426. package/examples/no-innerhtml.sh +0 -0
  427. package/examples/no-install-global.sh +12 -0
  428. package/examples/no-jwt-in-url.sh +0 -0
  429. package/examples/no-large-commit.sh +0 -0
  430. package/examples/no-localhost-expose.sh +0 -0
  431. package/examples/no-magic-number.sh +0 -0
  432. package/examples/no-md5-sha1.sh +0 -0
  433. package/examples/no-mixed-line-endings.sh +8 -1
  434. package/examples/no-mutation-in-reducer.sh +0 -0
  435. package/examples/no-nested-ternary.sh +0 -0
  436. package/examples/no-network-exfil.sh +0 -0
  437. package/examples/no-open-redirect.sh +0 -0
  438. package/examples/no-output-truncation.sh +12 -0
  439. package/examples/no-package-downgrade.sh +0 -0
  440. package/examples/no-package-lock-edit.sh +12 -0
  441. package/examples/no-path-join-user-input.sh +0 -0
  442. package/examples/no-port-bind.sh +0 -0
  443. package/examples/no-process-exit.sh +0 -0
  444. package/examples/no-prototype-pollution.sh +0 -0
  445. package/examples/no-push-without-ci.sh +0 -0
  446. package/examples/no-push-without-tests.sh +12 -0
  447. package/examples/no-raw-password-in-url.sh +0 -0
  448. package/examples/no-root-user-docker.sh +1 -0
  449. package/examples/no-root-write.sh +12 -0
  450. package/examples/no-secrets-in-args.sh +4 -1
  451. package/examples/no-secrets-in-logs.sh +0 -0
  452. package/examples/no-sensitive-log.sh +0 -0
  453. package/examples/no-sleep-in-hooks.sh +0 -0
  454. package/examples/no-star-import-python.sh +1 -0
  455. package/examples/no-string-concat-sql.sh +0 -0
  456. package/examples/no-sudo-guard.sh +12 -0
  457. package/examples/no-sync-fs.sh +0 -0
  458. package/examples/no-todo-in-merge.sh +0 -0
  459. package/examples/no-todo-in-production.sh +1 -0
  460. package/examples/no-todo-without-issue.sh +0 -0
  461. package/examples/no-unused-import.sh +0 -0
  462. package/examples/no-var-keyword.sh +0 -0
  463. package/examples/no-verify-blocker.sh +12 -0
  464. package/examples/no-wget-piped-bash.sh +12 -0
  465. package/examples/no-wildcard-cors.sh +0 -0
  466. package/examples/no-wildcard-delete.sh +0 -0
  467. package/examples/no-wildcard-import.sh +0 -0
  468. package/examples/no-with-statement.sh +0 -0
  469. package/examples/no-write-outside-src.sh +0 -0
  470. package/examples/no-xml-external-entity.sh +0 -0
  471. package/examples/non-english-quality-warner.sh +156 -0
  472. package/examples/notify-waiting.sh +1 -1
  473. package/examples/npm-audit-warn.sh +0 -0
  474. package/examples/npm-global-install-guard.sh +12 -0
  475. package/examples/npm-publish-guard.sh +12 -0
  476. package/examples/npm-script-injection.sh +0 -0
  477. package/examples/npm-supply-chain-guard.sh +0 -0
  478. package/examples/nuxt-config-guard.sh +1 -0
  479. package/examples/oauth-refresh-monitor.sh +210 -0
  480. package/examples/opus-degradation-tracker.sh +187 -0
  481. package/examples/opus48-routine-task-warning.sh +196 -0
  482. package/examples/opus48-thinking-wedge-advisor.sh +143 -0
  483. package/examples/output-credential-scan.sh +1 -1
  484. package/examples/output-secret-mask.sh +31 -9
  485. package/examples/output-token-spike-detector.sh +145 -0
  486. package/examples/package-json-guard.sh +12 -0
  487. package/examples/package-lock-frozen.sh +12 -0
  488. package/examples/parallel-batch-size-limiter.sh +121 -0
  489. package/examples/parallel-cascade-detector.sh +116 -0
  490. package/examples/partial-view-claim-arrest.sh +174 -0
  491. package/examples/path-deny-bash-guard.sh +12 -0
  492. package/examples/path-traversal-guard.sh +12 -0
  493. package/examples/per-prompt-token-cap.sh +124 -0
  494. package/examples/permission-audit-log.sh +1 -1
  495. package/examples/permission-denial-enforcer.sh +12 -0
  496. package/examples/permission-entry-validator.sh +0 -0
  497. package/examples/persisted-1m-model-advisor.sh +88 -0
  498. package/examples/php-lint-on-edit.sh +1 -1
  499. package/examples/pii-upload-guard.sh +12 -0
  500. package/examples/pip-publish-guard.sh +13 -0
  501. package/examples/pip-requirements-guard.sh +12 -0
  502. package/examples/pip-venv-required.sh +12 -0
  503. package/examples/plan-mode-edit-guard.sh +12 -0
  504. package/examples/plan-mode-enforcer.sh +12 -0
  505. package/examples/plan-mode-strict-guard.sh +12 -0
  506. package/examples/plugin-hooks-json-bloat-detector.sh +169 -0
  507. package/examples/plugin-process-cleanup.sh +0 -0
  508. package/examples/polyglot-rm-guard.sh +12 -0
  509. package/examples/post-compact-safety.sh +12 -0
  510. package/examples/post-edit-disk-verify.sh +152 -0
  511. package/examples/powershell-remove-item-guard.sh +85 -0
  512. package/examples/pr-description-check.sh +0 -0
  513. package/examples/pr-duplicate-guard.sh +13 -0
  514. package/examples/pre-bash-sed-line-ending-windows.sh +87 -0
  515. package/examples/pre-compact-knowledge-save.sh +0 -0
  516. package/examples/pre-compact-transcript-backup.sh +0 -0
  517. package/examples/pre-execution-claim-detector.sh +179 -0
  518. package/examples/prefer-builtin-tools.sh +10 -1
  519. package/examples/prefer-const.sh +0 -0
  520. package/examples/prefer-dedicated-tools.sh +12 -0
  521. package/examples/prefer-optional-chaining.sh +0 -0
  522. package/examples/prisma-migrate-guard.sh +24 -7
  523. package/examples/production-port-kill-guard.sh +12 -0
  524. package/examples/prompt-injection-guard.sh +2 -1
  525. package/examples/prompt-usage-logger.sh +0 -0
  526. package/examples/protect-claudemd.sh +12 -0
  527. package/examples/protect-dotfiles.sh +12 -0
  528. package/examples/proxy-capture-suggester.sh +159 -0
  529. package/examples/public-artefact-socratic-narrowing.sh +232 -0
  530. package/examples/public-repo-push-guard.sh +12 -0
  531. package/examples/push-requires-test-pass-record.sh +0 -0
  532. package/examples/push-requires-test-pass.sh +12 -0
  533. package/examples/quota-anomaly-detector.sh +173 -0
  534. package/examples/quota-reset-audit.sh +58 -0
  535. package/examples/quoted-flag-approver.sh +99 -10
  536. package/examples/rails-migration-guard.sh +12 -0
  537. package/examples/rate-limit-guard.sh +0 -0
  538. package/examples/read-all-files-enforcer.sh +0 -0
  539. package/examples/read-budget-guard.sh +12 -0
  540. package/examples/read-loop-detector.sh +59 -0
  541. package/examples/read-once-guard.sh +96 -0
  542. package/examples/read-only-mode.sh +12 -0
  543. package/examples/readme-exists-check.sh +0 -0
  544. package/examples/record-read-coverage.sh +73 -0
  545. package/examples/redirect-fragment-warner.sh +149 -0
  546. package/examples/redis-flushall-guard.sh +13 -0
  547. package/examples/redundant-read-blocker.sh +132 -0
  548. package/examples/refusal-arrest-gate.sh +248 -0
  549. package/examples/registry-publish-guard.sh +13 -1
  550. package/examples/remote-control-billing-classifier.sh +135 -0
  551. package/examples/replace-all-guard.sh +12 -0
  552. package/examples/repo-visibility-guard.sh +12 -0
  553. package/examples/reroute-after-block-guard.sh +150 -0
  554. package/examples/response-budget-guard.sh +0 -0
  555. package/examples/resume-drift-watcher.sh +57 -0
  556. package/examples/rg-replace-flag-detector.sh +125 -0
  557. package/examples/rhetorical-verification-prompt-detector.sh +102 -0
  558. package/examples/ripgrep-permission-fix.sh +0 -0
  559. package/examples/rm-safety-net.sh +151 -8
  560. package/examples/role-tool-guard.sh +12 -0
  561. package/examples/route-handler-emptiness-gate.sh +324 -0
  562. package/examples/ruby-lint-on-edit.sh +1 -1
  563. package/examples/runtime-binary-change-detector.sh +102 -0
  564. package/examples/same-command-repeat-detector.sh +196 -0
  565. package/examples/same-correction-arrest.sh +169 -0
  566. package/examples/sandbox-denywrite-enforcer.sh +78 -0
  567. package/examples/sandbox-relative-path-audit.sh +83 -25
  568. package/examples/sandbox-write-verify.sh +12 -0
  569. package/examples/schema-migration-guard.sh +0 -0
  570. package/examples/scope-expansion-receipt.sh +178 -0
  571. package/examples/scope-guard.sh +88 -9
  572. package/examples/secret-file-read-guard.sh +12 -0
  573. package/examples/secret-file-write-guard.sh +150 -0
  574. package/examples/self-modify-bypass-guard.sh +0 -0
  575. package/examples/sensitive-file-read-guard.sh +23 -3
  576. package/examples/sensitive-log-guard.sh +1 -0
  577. package/examples/server-side-prompt-injection-detector.sh +69 -0
  578. package/examples/session-agent-cost-limiter.sh +12 -0
  579. package/examples/session-backup-on-start.sh +1 -1
  580. package/examples/session-cost-alert.sh +12 -0
  581. package/examples/session-drift-guard.sh +12 -0
  582. package/examples/session-duration-guard.sh +25 -2
  583. package/examples/session-end-logger.sh +0 -0
  584. package/examples/session-health-monitor.sh +0 -0
  585. package/examples/session-index-repair.sh +1 -1
  586. package/examples/session-memory-watchdog.sh +1 -0
  587. package/examples/session-permission-reset-guard.sh +12 -0
  588. package/examples/session-persistence-verifier.sh +93 -0
  589. package/examples/session-plugin-pin-watch.sh +68 -0
  590. package/examples/session-rate-monitor.sh +176 -0
  591. package/examples/session-resume-env-fix.sh +0 -0
  592. package/examples/session-start-quota-status.sh +193 -0
  593. package/examples/session-start-safety-check.sh +55 -3
  594. package/examples/session-state-saver.sh +0 -0
  595. package/examples/session-summary-stop.sh +1 -1
  596. package/examples/session-summary.sh +0 -0
  597. package/examples/session-token-counter.sh +1 -1
  598. package/examples/settings-hooks-key-restorer.sh +99 -0
  599. package/examples/settings-json-health-check.sh +57 -0
  600. package/examples/settings-json-model-guard.sh +0 -0
  601. package/examples/settings-regression-tester.sh +188 -0
  602. package/examples/shell-config-truncation-guard.sh +12 -0
  603. package/examples/shell-wrapper-guard.sh +12 -0
  604. package/examples/skill-cumulative-size-detector.sh +104 -0
  605. package/examples/skill-description-drop-detector.sh +148 -0
  606. package/examples/skill-gate.sh +0 -0
  607. package/examples/skill-truncation-detector.sh +154 -0
  608. package/examples/skills-context-recorder.sh +167 -0
  609. package/examples/skills-load-verifier.sh +96 -0
  610. package/examples/skills-settings-validator.sh +139 -0
  611. package/examples/sonnet-45-deprecation-helper.sh +85 -0
  612. package/examples/spec-file-scope-guard.sh +12 -0
  613. package/examples/spring-profile-guard.sh +1 -0
  614. package/examples/spurious-malformed-notice-detector.sh +247 -0
  615. package/examples/sql-bulk-delete-warn.sh +88 -0
  616. package/examples/sql-injection-detect.sh +0 -0
  617. package/examples/ssh-key-protect.sh +12 -0
  618. package/examples/staged-secret-scan.sh +22 -1
  619. package/examples/stale-temp-settings-detector.sh +86 -0
  620. package/examples/standing-rule-session-surfacer.sh +137 -0
  621. package/examples/stop-hook-sigterm-wrapper.sh +182 -0
  622. package/examples/stop-transcript-write-health.sh +64 -0
  623. package/examples/strict-allowlist.sh +57 -15
  624. package/examples/strip-coauthored-by.sh +50 -10
  625. package/examples/subagent-blast-radius-guard.sh +184 -0
  626. package/examples/subagent-boundary-precheck.sh +126 -0
  627. package/examples/subagent-budget-guard.sh +12 -0
  628. package/examples/subagent-claudemd-inject.sh +0 -0
  629. package/examples/subagent-closure-verify-gate.sh +164 -0
  630. package/examples/subagent-destructive-git-guard.sh +120 -0
  631. package/examples/subagent-error-detector.sh +0 -0
  632. package/examples/subagent-forged-system-reminder-guard.sh +156 -0
  633. package/examples/subagent-identity-leak-guard.sh +102 -0
  634. package/examples/subagent-identity-reassertion.sh +51 -0
  635. package/examples/subagent-inheritance-tester.sh +179 -0
  636. package/examples/subagent-permission-mode-guard.sh +110 -0
  637. package/examples/subagent-scope-guard.sh +12 -0
  638. package/examples/subagent-spawn-verification-enforcer.sh +102 -0
  639. package/examples/subagent-tool-allowlist-enforcer.sh +101 -0
  640. package/examples/subagent-tool-call-limiter.sh +87 -15
  641. package/examples/subcommand-chain-guard.sh +12 -0
  642. package/examples/subscription-api-billing-warner.sh +160 -0
  643. package/examples/subscription-bypass-detector.sh +152 -0
  644. package/examples/svelte-lint-on-edit.sh +1 -0
  645. package/examples/swift-build-on-edit.sh +1 -1
  646. package/examples/symlink-guard.sh +27 -2
  647. package/examples/symlink-protect.sh +1 -0
  648. package/examples/system-dir-protection-guard.sh +73 -8
  649. package/examples/system-message-workaround.sh +38 -13
  650. package/examples/system-package-guard.sh +12 -0
  651. package/examples/systemd-service-guard.sh +12 -0
  652. package/examples/task-integrity-guard.sh +12 -0
  653. package/examples/temp-file-cleanup.sh +1 -1
  654. package/examples/temporal-suggestion-detector.sh +135 -0
  655. package/examples/terraform-guard.sh +27 -6
  656. package/examples/test-after-edit.sh +1 -1
  657. package/examples/test-before-push.sh +12 -0
  658. package/examples/test-coverage-reminder.sh +24 -1
  659. package/examples/thinking-budget-effort-mismatch-detector.sh +149 -0
  660. package/examples/timezone-guard.sh +0 -0
  661. package/examples/tmp-output-size-guard.sh +0 -0
  662. package/examples/todo-check.sh +1 -1
  663. package/examples/token-budget-guard.sh +12 -0
  664. package/examples/token-budget-per-task.sh +12 -0
  665. package/examples/token-usage-tracker.sh +7 -1
  666. package/examples/tokenizer-ratio-alert-corpus.sh +90 -0
  667. package/examples/tokenizer-ratio-alert.sh +104 -0
  668. package/examples/tool-call-rate-limiter.sh +0 -0
  669. package/examples/tool-result-correlation-checker.sh +167 -0
  670. package/examples/tool-result-size-guard.sh +132 -0
  671. package/examples/tool-retry-budget-guard.sh +12 -0
  672. package/examples/transcript-contamination-detector.sh +138 -0
  673. package/examples/trustfall-mcp-injection-guard.sh +103 -0
  674. package/examples/ultrareview-large-diff-advisor.sh +184 -0
  675. package/examples/unbounded-output-guard.sh +94 -0
  676. package/examples/uncommitted-changes-stop.sh +1 -0
  677. package/examples/uncommitted-discard-guard.sh +23 -5
  678. package/examples/uncommitted-work-guard.sh +12 -0
  679. package/examples/usage-warn.sh +0 -0
  680. package/examples/user-account-guard.sh +12 -0
  681. package/examples/userprompt-submit-receipt.sh +123 -0
  682. package/examples/variable-expansion-guard.sh +12 -0
  683. package/examples/verify-after-publish-reminder.sh +93 -0
  684. package/examples/verify-before-commit.sh +12 -0
  685. package/examples/version-bump-detector.sh +156 -0
  686. package/examples/version-regression-warner.sh +144 -0
  687. package/examples/vue-lint-on-edit.sh +1 -0
  688. package/examples/warn-cron-cost-trap.sh +173 -0
  689. package/examples/webfetch-runaway-guard.sh +89 -0
  690. package/examples/wellness-break-reminder.sh +118 -0
  691. package/examples/windows-destructive-command-guard.sh +177 -0
  692. package/examples/windows-path-guard.sh +12 -0
  693. package/examples/windows-python-stub-detector.sh +63 -0
  694. package/examples/work-hours-guard.sh +12 -0
  695. package/examples/working-directory-fence.sh +12 -0
  696. package/examples/workspace-lease-guard.sh +205 -0
  697. package/examples/worktree-create-log.sh +1 -0
  698. package/examples/worktree-delete-guard.sh +12 -0
  699. package/examples/worktree-edit-boundary-guard.sh +127 -0
  700. package/examples/worktree-escape-write-guard.sh +114 -0
  701. package/examples/worktree-hook-linker.sh +0 -0
  702. package/examples/worktree-hooks-path-fix.sh +111 -0
  703. package/examples/worktree-parent-write-guard.sh +43 -0
  704. package/examples/worktree-project-unify.sh +2 -1
  705. package/examples/worktree-remove-uncommitted-guard.sh +13 -0
  706. package/examples/worktree-unmerged-guard.sh +7 -1
  707. package/examples/write-byte-integrity-verifier.sh +190 -0
  708. package/examples/write-empty-content-guard.sh +67 -0
  709. package/examples/write-nul-corruption-detector.sh +61 -0
  710. package/examples/write-overwrite-confirm.sh +160 -14
  711. package/examples/write-secret-guard.sh +27 -5
  712. package/examples/write-shrink-guard.sh +12 -0
  713. package/examples/write-test-ratio.sh +0 -0
  714. package/examples/wsl-host-disk-space-guard.sh +97 -0
  715. package/examples/xml-format-leak-detector.sh +266 -0
  716. package/examples/yaml-syntax-check.sh +12 -0
  717. package/hooks/hooks.json +6 -6
  718. package/index.mjs +1718 -183
  719. package/mission.md +2 -0
  720. package/package.json +4 -4
  721. package/plugins/credential-guard/.claude-plugin/plugin.json +9 -7
  722. package/plugins/git-protection/.claude-plugin/plugin.json +10 -8
  723. package/plugins/safety-essentials/.claude-plugin/plugin.json +9 -7
  724. package/plugins/token-guard/.claude-plugin/plugin.json +10 -8
  725. package/scripts/agents-md-sync-setup.sh +156 -0
  726. package/scripts/autonomy-blocked-summary.sh +148 -0
  727. package/scripts/build-search-index.py +43 -0
  728. package/scripts/build-sitemap.py +119 -0
  729. package/scripts/cc-doctor.sh +192 -0
  730. package/scripts/check-hook-event-names.py +127 -0
  731. package/scripts/check-misfire-instrument.sh +64 -0
  732. package/scripts/claim-verify-audit.sh +467 -0
  733. package/scripts/cowork-claudemd-helper.sh +136 -0
  734. package/scripts/june-15-deprecated-model-scan.sh +111 -0
  735. package/scripts/measure-heredoc-shapes.sh +67 -0
  736. package/scripts/measure-literal-match-misfire.sh +110 -0
  737. package/scripts/probe-scope-guard-branches.sh +48 -0
  738. package/scripts/probe-skip-line-both-ways.sh +65 -0
  739. package/scripts/receipts-aggregate.py +199 -0
  740. package/scripts/session-forensic-audit.py +360 -0
  741. package/scripts.json +9 -9
  742. package/scripts.json.bak-2026-07-27-find +13 -0
  743. package/skills/safety-setup/SKILL.md +5 -5
  744. package/tests/approve-side-remaining-two.test.sh +129 -0
  745. package/tests/approver-list-granularity.test.sh +145 -0
  746. package/tests/askuserquestion-autonomy-gate.test.sh +181 -0
  747. package/tests/audit-ci-gate.test.sh +87 -0
  748. package/tests/audit-cross-layer-claudemd.test.sh +170 -0
  749. package/tests/audit-fail-open-parse.test.sh +100 -0
  750. package/tests/auto-approve-compound-tail.test.sh +194 -0
  751. package/tests/auto-mode-path-invoked-commands.test.sh +89 -0
  752. package/tests/auto-mode-quoted-targets.test.sh +127 -0
  753. package/tests/auto-mode-unquoted-targets.test.sh +112 -0
  754. package/tests/bash-secret-output-detector-detects.test.sh +102 -0
  755. package/tests/blindspots-cross-layer.test.sh +177 -0
  756. package/tests/block-database-wipe.test.sh +64 -0
  757. package/tests/bundled-short-flags-bypass.test.sh +85 -0
  758. package/tests/cd-git-allow-compound-tail.test.sh +67 -0
  759. package/tests/chown-guard-filesystem-root.test.sh +64 -0
  760. package/tests/ci-workflow-guard-skip-rule.test.sh +115 -0
  761. package/tests/compound-deny-safe-rm-targets.test.sh +105 -0
  762. package/tests/core-scripts-parser-fallback.test.sh +140 -0
  763. package/tests/destructive-guard-bare-glob.test.sh +74 -0
  764. package/tests/destructive-guard-every-operand.test.sh +100 -0
  765. package/tests/destructive-guard-find-deletion.test.sh +114 -0
  766. package/tests/destructive-guard-flag-order.test.sh +106 -0
  767. package/tests/destructive-guard-mentions-vs-invocations.test.sh +107 -0
  768. package/tests/destructive-guard-quoted-target.test.sh +89 -0
  769. package/tests/destructive-guard-separators.test.sh +105 -0
  770. package/tests/destructive-guard-variable-target.test.sh +98 -0
  771. package/tests/destructive-guard-wrapped-command.test.sh +91 -0
  772. package/tests/doctor-hook-disabling-env.test.sh +92 -0
  773. package/tests/doctor-misspelled-settings-keys.test.sh +106 -0
  774. package/tests/example-guards-wrapped-command.test.sh +169 -0
  775. package/tests/file-edit-backup.test.sh +93 -0
  776. package/tests/git-filter-repo-guard.test.sh +60 -0
  777. package/tests/git-global-options-bypass.test.sh +141 -0
  778. package/tests/git-invocation-prefixes-all-guards.test.sh +114 -0
  779. package/tests/git-maintenance-guard.test.sh +83 -0
  780. package/tests/git-pack-temp-cleanup-guard.test.sh +133 -0
  781. package/tests/git-rm-orphan-wipe-guard.test.sh +66 -0
  782. package/tests/git-submodule-guard.test.sh +50 -0
  783. package/tests/grep-pcre-portability.test.sh +155 -0
  784. package/tests/hook-registration-matches-input.test.sh +73 -0
  785. package/tests/hook-trigger-matches-envelope.test.sh +178 -0
  786. package/tests/install-does-not-claim-protection.test.sh +110 -0
  787. package/tests/install-example-standalone-tools.test.sh +139 -0
  788. package/tests/line-continuation-bypass.test.sh +114 -0
  789. package/tests/mcp-config-poisoning-audit.test.sh +106 -0
  790. package/tests/nested-background-agent-guard.test.sh +58 -0
  791. package/tests/no-unqualified-safety-claims.test.sh +114 -0
  792. package/tests/option-eating-grep-patterns.test.sh +130 -0
  793. package/tests/outdated-core-guards.test.sh +134 -0
  794. package/tests/outdated-report.test.sh +155 -0
  795. package/tests/output-secret-mask-warns.test.sh +73 -0
  796. package/tests/plugin-hooks-fail-open-under-sh.test.sh +165 -0
  797. package/tests/plugins-word-order.test.sh +126 -0
  798. package/tests/powershell-remove-item-guard.test.sh +85 -0
  799. package/tests/project-dir-naming.test.sh +103 -0
  800. package/tests/quoted-safe-targets-and-mentions.test.sh +190 -0
  801. package/tests/reroute-after-block-guard.test.sh +104 -0
  802. package/tests/secret-guard-documented-promises.test.sh +97 -0
  803. package/tests/session-plugin-pin-watch.test.sh +45 -0
  804. package/tests/settings-unreadable-refuses-to-write.test.sh +95 -0
  805. package/tests/shield-no-silent-adoption.test.py +110 -0
  806. package/tests/shield-no-silent-adoption.test.sh +46 -0
  807. package/tests/stop-transcript-write-health.test.sh +46 -0
  808. package/tests/system-dir-guard-root-erased.test.sh +66 -0
  809. package/tests/test-account-billing-log.sh +100 -0
  810. package/tests/test-account-routing-preflight.sh +77 -0
  811. package/tests/test-agent-sdk-credit-pool-monitor.sh +157 -0
  812. package/tests/test-agent-view-quota-warn.sh +184 -0
  813. package/tests/test-agents-md-edit-drift-warner.sh +176 -0
  814. package/tests/test-agents-md-loader.sh +204 -0
  815. package/tests/test-agents-md-sync-checker.sh +125 -0
  816. package/tests/test-ai-slop-punctuation-arrest.sh +280 -0
  817. package/tests/test-allowlist.sh +60 -0
  818. package/tests/test-always-allow-pattern-suggester.sh +147 -0
  819. package/tests/test-anthropic-base-url-guard.sh +88 -0
  820. package/tests/test-articulated-scope-capture.sh +139 -0
  821. package/tests/test-attachment-traversal-guard.sh +168 -0
  822. package/tests/test-aup-block-pattern-logger.sh +315 -0
  823. package/tests/test-aup-false-positive-helper.sh +188 -0
  824. package/tests/test-aup-large-tool-output-warner.sh +370 -0
  825. package/tests/test-aup-retry-loop-guard.sh +341 -0
  826. package/tests/test-auth-expiry-reminder.sh +303 -0
  827. package/tests/test-auth-macos-sleep-detector.sh +254 -0
  828. package/tests/test-auth-path-detector.sh +232 -0
  829. package/tests/test-auth-status-checker.sh +233 -0
  830. package/tests/test-authorized-reconfirmation-detector.sh +280 -0
  831. package/tests/test-background-cost-launch-guard.sh +62 -0
  832. package/tests/test-bash-allowlist-secondary-check.sh +143 -0
  833. package/tests/test-bash-fanout-bounded-rewriter.sh +186 -0
  834. package/tests/test-bash-project-fence.sh +127 -0
  835. package/tests/test-bg-permission-prompt-warner.sh +221 -0
  836. package/tests/test-binary-read-detector.sh +173 -0
  837. package/tests/test-broad-prefix-session-trap-warner.sh +167 -0
  838. package/tests/test-bulk-delete-target-resolution.sh +49 -0
  839. package/tests/test-bypass-mode-effective-verifier.sh +179 -0
  840. package/tests/test-cache-creation-drift-detector.sh +244 -0
  841. package/tests/test-cache-residue-detector.sh +429 -0
  842. package/tests/test-cache-tier-logger.sh +59 -0
  843. package/tests/test-cache-ttl-eviction-detector.sh +282 -0
  844. package/tests/test-cch-sentinel-precommit-guard.sh +64 -0
  845. package/tests/test-claim-verify-detector.sh +222 -0
  846. package/tests/test-claim-vs-caveat-checker.sh +134 -0
  847. package/tests/test-claude-code-version-pin-advisor.sh +353 -0
  848. package/tests/test-claude-md-reinjector.sh +173 -0
  849. package/tests/test-claude-md-size-monitor.sh +107 -0
  850. package/tests/test-claude-update-budget-guard.sh +132 -0
  851. package/tests/test-claude-update-smart.sh +91 -0
  852. package/tests/test-claudemd-tool-prohibition.sh +239 -0
  853. package/tests/test-cli-config-pinning-detector.sh +233 -0
  854. package/tests/test-cliff-countdown-advisor.sh +138 -0
  855. package/tests/test-closure-word-verify-gate.sh +158 -0
  856. package/tests/test-commit-all-scope-guard.sh +73 -0
  857. package/tests/test-commitment-carry-forward-arrest.sh +250 -0
  858. package/tests/test-compact-dispatch-watchdog.sh +147 -0
  859. package/tests/test-completion-claim-without-verification-detector.sh +326 -0
  860. package/tests/test-compound-bash-permission-resolver.sh +264 -0
  861. package/tests/test-compound-command-deny-enforcer.sh +67 -0
  862. package/tests/test-context-length-budget.sh +68 -0
  863. package/tests/test-context-usage-drift-alert.sh +52 -22
  864. package/tests/test-cost-incident-self-audit.sh +94 -0
  865. package/tests/test-cowork-claude-md-load-checker.sh +257 -0
  866. package/tests/test-cowork-claudemd-helper.sh +141 -0
  867. package/tests/test-cowork-fuse-staleness-watcher.sh +287 -0
  868. package/tests/test-cowork-hook-absence-warner.sh +230 -0
  869. package/tests/test-cowork-model-picker-advisor.sh +317 -0
  870. package/tests/test-credential-exfil-guard.sh +62 -0
  871. package/tests/test-cron-create-receipt.sh +165 -0
  872. package/tests/test-cross-product-mcp-spawn-detector.sh +112 -0
  873. package/tests/test-daemon-zombie-worker-surfacer.sh +71 -0
  874. package/tests/test-daily-cost-guard.sh +131 -0
  875. package/tests/test-deny-rule-integrity-verifier.sh +288 -0
  876. package/tests/test-deployment-readback-gate.sh +92 -0
  877. package/tests/test-deployment-readback-gh-adapter.sh +163 -0
  878. package/tests/test-disabled-feature-toggle-advisor.sh +78 -0
  879. package/tests/test-dispatch-allowlist-preflight.sh +385 -0
  880. package/tests/test-dispatch-liveness-watchdog.sh +319 -0
  881. package/tests/test-dispatch-receipt.sh +314 -0
  882. package/tests/test-dotenv-anthropic-key-billing-guard.sh +160 -0
  883. package/tests/test-echo-probe-spam-detector.sh +143 -0
  884. package/tests/test-edit-quote-ambiguity-guard.sh +75 -0
  885. package/tests/test-ephemeral-container-detector.sh +251 -0
  886. package/tests/test-evidence-claim-gate.sh +291 -0
  887. package/tests/test-extended-thinking-loop-guard.sh +289 -0
  888. package/tests/test-extended-thinking-resume-warning.sh +240 -0
  889. package/tests/test-extended-thinking-tool-use-mismatch-detector.sh +236 -0
  890. package/tests/test-fabricated-command-detector.sh +296 -0
  891. package/tests/test-false-disk-full-guard.sh +36 -0
  892. package/tests/test-feature-deprecation-detector.sh +117 -0
  893. package/tests/test-forbidden-response-phrase-detector.sh +246 -0
  894. package/tests/test-git-operations-require-approval.sh +53 -0
  895. package/tests/test-git-push-blast-radius-guard.sh +115 -0
  896. package/tests/test-goal-iteration-limit-warner.sh +128 -0
  897. package/tests/test-growthbook-flag-monitor.sh +428 -0
  898. package/tests/test-halt-signal-detector.sh +120 -0
  899. package/tests/test-hook-self-disable-detector.sh +232 -0
  900. package/tests/test-iteration-quality-degradation-detector.sh +244 -0
  901. package/tests/test-long-session-malformed-tool-call-detector.sh +185 -0
  902. package/tests/test-marketplace-plugins.sh +193 -0
  903. package/tests/test-mcp-misdiagnosis-arrest.sh +235 -0
  904. package/tests/test-mcp-orphan-leak-warner.sh +71 -0
  905. package/tests/test-mcp-permissions-ask-warner.sh +207 -0
  906. package/tests/test-mcp-routine-approval-detector.sh +229 -0
  907. package/tests/test-mcp-startup-bloat-detector.sh +141 -0
  908. package/tests/test-mcp-stdio-compatibility-test.sh +112 -0
  909. package/tests/test-memory-chain-audit.sh +59 -0
  910. package/tests/test-memory-orphan-detector.sh +227 -0
  911. package/tests/test-model-swap-suggester.sh +368 -0
  912. package/tests/test-model-version-lock.sh +83 -0
  913. package/tests/test-multi-file-plan-routing-gate.sh +277 -0
  914. package/tests/test-multi-window-auth-drift-detector.sh +262 -0
  915. package/tests/test-nested-spawn-inflight-guard.sh +281 -0
  916. package/tests/test-no-force-flag.sh +49 -0
  917. package/tests/test-non-english-quality-warner.sh +229 -0
  918. package/tests/test-oauth-refresh-monitor.sh +311 -0
  919. package/tests/test-opus-degradation-tracker.sh +274 -0
  920. package/tests/test-opus48-routine-task-warning.sh +201 -0
  921. package/tests/test-opus48-thinking-wedge-advisor.sh +249 -0
  922. package/tests/test-output-token-spike-detector.sh +315 -0
  923. package/tests/test-parallel-batch-size-limiter.sh +228 -0
  924. package/tests/test-parallel-cascade-detector.sh +191 -0
  925. package/tests/test-partial-view-claim-arrest.sh +272 -0
  926. package/tests/test-per-prompt-token-cap.sh +136 -0
  927. package/tests/test-persisted-1m-model-advisor.sh +71 -0
  928. package/tests/test-plugin-hooks-json-bloat-detector.sh +267 -0
  929. package/tests/test-post-edit-disk-verify.sh +294 -0
  930. package/tests/test-pre-bash-sed-line-ending-windows.sh +108 -0
  931. package/tests/test-pre-execution-claim-detector.sh +366 -0
  932. package/tests/test-private-key-backup-and-git-credentials.sh +100 -0
  933. package/tests/test-proxy-capture-suggester.sh +214 -0
  934. package/tests/test-public-artefact-socratic-narrowing.sh +346 -0
  935. package/tests/test-quota-anomaly-detector.sh +321 -0
  936. package/tests/test-quota-reset-audit.sh +81 -0
  937. package/tests/test-read-loop-detector.sh +137 -0
  938. package/tests/test-read-once-guard.sh +85 -0
  939. package/tests/test-receipts-aggregate.sh +143 -0
  940. package/tests/test-redirect-fragment-warner.sh +130 -0
  941. package/tests/test-redundant-read-blocker.sh +155 -0
  942. package/tests/test-refusal-arrest-gate.sh +303 -0
  943. package/tests/test-remote-control-billing-classifier.sh +125 -0
  944. package/tests/test-resume-drift-watcher.sh +65 -0
  945. package/tests/test-rg-replace-flag-detector.sh +175 -0
  946. package/tests/test-rhetorical-verification-prompt-detector.sh +237 -0
  947. package/tests/test-rm-safety-net.sh +115 -0
  948. package/tests/test-route-handler-emptiness-gate.sh +300 -0
  949. package/tests/test-runtime-binary-change-detector.sh +196 -0
  950. package/tests/test-same-command-repeat-detector.sh +165 -0
  951. package/tests/test-same-correction-arrest.sh +165 -0
  952. package/tests/test-scope-expansion-receipt.sh +207 -0
  953. package/tests/test-server-side-prompt-injection-detector.sh +181 -0
  954. package/tests/test-session-persistence-verifier.sh +128 -0
  955. package/tests/test-session-rate-monitor.sh +284 -0
  956. package/tests/test-session-start-quota-status.sh +210 -0
  957. package/tests/test-session-start-safety-check.sh +138 -0
  958. package/tests/test-settings-hooks-key-restorer.sh +257 -0
  959. package/tests/test-settings-json-health-check.sh +70 -0
  960. package/tests/test-settings-regression-tester.sh +197 -0
  961. package/tests/test-skill-cumulative-size-detector.sh +198 -0
  962. package/tests/test-skill-description-drop-detector.sh +236 -0
  963. package/tests/test-skill-truncation-detector.sh +263 -0
  964. package/tests/test-skills-context-recorder.sh +329 -0
  965. package/tests/test-skills-load-verifier.sh +184 -0
  966. package/tests/test-skills-settings-validator.sh +242 -0
  967. package/tests/test-sonnet-45-deprecation-helper.sh +150 -0
  968. package/tests/test-spurious-malformed-notice-detector.sh +290 -0
  969. package/tests/test-sql-bulk-delete-warn.sh +123 -0
  970. package/tests/test-ssh-key-protect.sh +81 -0
  971. package/tests/test-stale-temp-settings-detector.sh +161 -0
  972. package/tests/test-standing-rule-session-surfacer.sh +215 -0
  973. package/tests/test-starter-hooks-manifest.sh +96 -0
  974. package/tests/test-stop-hook-sigterm-wrapper.sh +258 -0
  975. package/tests/test-strict-allowlist.sh +72 -0
  976. package/tests/test-subagent-boundary-precheck.sh +137 -0
  977. package/tests/test-subagent-closure-verify-gate.sh +193 -0
  978. package/tests/test-subagent-destructive-git-guard.sh +86 -0
  979. package/tests/test-subagent-identity-leak-guard.sh +62 -0
  980. package/tests/test-subagent-identity-reassertion.sh +61 -0
  981. package/tests/test-subagent-inheritance-tester.sh +319 -0
  982. package/tests/test-subagent-permission-mode-guard.sh +61 -0
  983. package/tests/test-subagent-spawn-verification-enforcer.sh +60 -0
  984. package/tests/test-subagent-tool-allowlist-enforcer.sh +62 -0
  985. package/tests/test-subagent-tool-call-limiter.sh +97 -0
  986. package/tests/test-subscription-api-billing-warner.sh +138 -0
  987. package/tests/test-subscription-bypass-detector.sh +255 -0
  988. package/tests/test-temporal-suggestion-detector.sh +183 -0
  989. package/tests/test-thinking-budget-effort-mismatch-detector.sh +327 -0
  990. package/tests/test-tokenizer-ratio-alert-corpus.sh +77 -0
  991. package/tests/test-tokenizer-ratio-alert.sh +93 -0
  992. package/tests/test-tool-result-correlation-checker.sh +264 -0
  993. package/tests/test-tool-result-size-guard.sh +121 -0
  994. package/tests/test-transcript-contamination-detector.sh +264 -0
  995. package/tests/test-trigger-header-parsing.sh +151 -0
  996. package/tests/test-ultrareview-large-diff-advisor.sh +192 -0
  997. package/tests/test-userprompt-submit-receipt.sh +181 -0
  998. package/tests/test-verify-after-publish-reminder.sh +184 -0
  999. package/tests/test-version-bump-detector.sh +212 -0
  1000. package/tests/test-version-regression-warner.sh +165 -0
  1001. package/tests/test-warn-cron-cost-trap.sh +82 -0
  1002. package/tests/test-webfetch-runaway-guard.sh +77 -0
  1003. package/tests/test-wellness-break-reminder.sh +138 -0
  1004. package/tests/test-windows-destructive-command-guard.sh +169 -0
  1005. package/tests/test-windows-python-stub-detector.sh +146 -0
  1006. package/tests/test-worktree-edit-boundary-guard.sh +219 -0
  1007. package/tests/test-write-byte-integrity-verifier.sh +192 -0
  1008. package/tests/test-xml-format-leak-detector.sh +299 -0
  1009. package/tests/trustfall-mcp-injection-guard.test.sh +183 -0
  1010. package/tests/workspace-lease-guard.test.sh +144 -0
  1011. package/tests/worktree-escape-write-guard.test.sh +68 -0
  1012. package/tests/worktree-hooks-path-fix.test.sh +181 -0
  1013. package/tests/worktree-parent-write-guard.test.sh +51 -0
  1014. package/tests/write-empty-content-guard.test.sh +39 -0
  1015. package/tests/write-nul-corruption-detector.test.sh +29 -0
  1016. package/tests/write-overwrite-unread-content.test.sh +178 -0
  1017. package/tests/wsl-host-disk-space-guard.test.sh +55 -0
@@ -17,6 +17,18 @@
17
17
  #
18
18
  # TRIGGER: PreToolUse MATCHER: "Bash"
19
19
 
20
+ # Without jq, the parse below silently yields empty and this hook stops
21
+ # guarding - with no error anywhere. Say so. We deliberately do not exit
22
+ # here: blocking would halt every tool call, and exiting 0 would change
23
+ # the behaviour of guards that do not depend on the parsed value.
24
+ if ! command -v jq >/dev/null 2>&1; then
25
+ _nojq_warned="/tmp/cc-nojq-warned-scope-guard-$PPID"
26
+ [ -f "$_nojq_warned" ] || {
27
+ echo "WARNING [scope-guard]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
28
+ : > "$_nojq_warned"
29
+ }
30
+ fi
31
+
20
32
  INPUT=$(cat)
21
33
  TOOL=$(echo "$INPUT" | jq -r '.tool_name // empty' 2>/dev/null)
22
34
  CMD=$(echo "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null)
@@ -24,33 +36,100 @@ CMD=$(echo "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null)
24
36
  [[ "$TOOL" != "Bash" ]] && exit 0
25
37
  [[ -z "$CMD" ]] && exit 0
26
38
 
27
- # Skip string output commands
28
- if echo "$CMD" | grep -qE '^\s*(echo|printf|cat\s*<<)'; then
29
- exit 0
30
- fi
39
+ # Remove the parts of the command that are DATA, not instructions, before matching.
40
+ #
41
+ # Why this is needed at all: writing the name of a destructive command inside a file,
42
+ # a commit message or a heredoc used to trip this guard. A guard that fires on prose
43
+ # gets uninstalled, which is worse than a guard that never existed.
44
+ #
45
+ # Why the previous version was wrong in BOTH directions (measured 2026-09-16, and the
46
+ # measurements are in scripts/probe-skip-line-both-ways.sh so you can re-run them):
47
+ # It read `^\s*(echo|printf|cat\s*<<)` and exited 0 on a match — it looked at the
48
+ # START of the whole command only.
49
+ # - It missed real damage: `echo starting && rm -rf /home/x` starts with echo, so the
50
+ # rm was waved through. Four of seven probes were missed this way.
51
+ # - It still fired on prose: `cat > note.md <<'EOF'` puts `>` between `cat` and `<<`,
52
+ # so it never matched the skip pattern. Eight ways of writing the same harmless thing
53
+ # split four-and-four on whether they were blocked.
54
+ #
55
+ # What is data and what is not: a heredoc body is data when the thing receiving it stores
56
+ # it (cat, tee, a file redirect). It is NOT data when the receiver executes it — `bash <<EOF`
57
+ # runs every line. Interpreters (python, node, ruby, perl, php) are also left in: their
58
+ # bodies can shell out, and being wrong in the direction of "looks safe" costs more.
59
+ strip_data_bodies() {
60
+ awk '
61
+ BEGIN { indoc = 0; delim = "" }
62
+ {
63
+ if (indoc) {
64
+ probe = $0
65
+ sub(/^[ \t]+/, "", probe)
66
+ if (probe == delim) { indoc = 0; delim = "" }
67
+ next
68
+ }
69
+ if (match($0, /<<-?[ \t]*("[^"]+"|'"'"'[^'"'"']+'"'"'|[A-Za-z_][A-Za-z0-9_]*)/)) {
70
+ head = substr($0, 1, RSTART - 1)
71
+ executes = 0
72
+ if (head ~ /(^|[|;&(]|[ \t])(ba|z|k|da)?sh([ \t]|$)/) executes = 1
73
+ if (head ~ /(^|[|;&(]|[ \t])(python[0-9.]*|node|ruby|perl|php)([ \t]|$)/) executes = 1
74
+ if (!executes) {
75
+ d = substr($0, RSTART, RLENGTH)
76
+ sub(/^<<-?[ \t]*/, "", d)
77
+ gsub(/["'"'"']/, "", d)
78
+ delim = d
79
+ indoc = 1
80
+ print head
81
+ next
82
+ }
83
+ }
84
+ print
85
+ }'
86
+ }
87
+
88
+ # A commit message is a string git stores; it is never executed. Blank it out so that
89
+ # "guard against rm -rf /x" as a commit message does not read as an rm.
90
+ CHECK=$(printf '%s' "$CMD" | strip_data_bodies \
91
+ | sed -E 's/(git[[:space:]]+commit([[:space:]]+[^|;&]*)?[[:space:]]-m[[:space:]]*)("[^"]*"|'"'"'[^'"'"']*'"'"')/\1""/g')
92
+
93
+ # The arguments to echo and printf are written out, not run. Drop them too.
94
+ #
95
+ # This is the one piece the old skip line got right, and deleting that line took it away:
96
+ # right after the rewrite, `echo "... rm -rf /x ..." > note.md` started being blocked when
97
+ # it had passed before. Removing a sloppy check removes whatever it was quietly holding up.
98
+ #
99
+ # The difference from the old line: that one exited 0 for the WHOLE command as soon as it
100
+ # started with echo, so `echo hi && rm -rf /x` was waved through. This drops only the
101
+ # arguments and leaves everything after the next |, ; or & in place.
102
+ #
103
+ # Command substitution is the exception: in `echo $(rm -rf /x)` the substitution runs before
104
+ # echo ever sees it. If any is present anywhere, leave the command untouched.
105
+ case "$CHECK" in
106
+ *'$('*|*'`'*) : ;;
107
+ *) CHECK=$(printf '%s' "$CHECK" \
108
+ | sed -E 's/(^|[|;&][[:space:]]*)(echo|printf)[[:space:]]+[^|;&]*/\1\2 /g') ;;
109
+ esac
31
110
 
32
111
  # Check for destructive commands with paths outside project
33
- if echo "$CMD" | grep -qE '\brm\b.*(-[a-zA-Z]*[rf]|--(recursive|force))'; then
112
+ if echo "$CHECK" | grep -qE '\brm\b.*(-[a-zA-Z]*[rf]|--(recursive|force))'; then
34
113
  # Block absolute paths
35
- if echo "$CMD" | grep -qE '\brm\b[^|;]*\s+/[a-zA-Z]'; then
114
+ if echo "$CHECK" | grep -qE '\brm\b[^|;]*\s+/[a-zA-Z]'; then
36
115
  echo "BLOCKED: rm with absolute path" >&2
37
116
  echo "Command: $CMD" >&2
38
117
  exit 2
39
118
  fi
40
119
  # Block home directory paths
41
- if echo "$CMD" | grep -qE '\brm\b[^|;]*\s+~/'; then
120
+ if echo "$CHECK" | grep -qE '\brm\b[^|;]*\s+~/'; then
42
121
  echo "BLOCKED: rm targeting home directory" >&2
43
122
  exit 2
44
123
  fi
45
124
  # Block parent directory escapes
46
- if echo "$CMD" | grep -qE '\brm\b[^|;]*\s+\.\./'; then
125
+ if echo "$CHECK" | grep -qE '\brm\b[^|;]*\s+\.\./'; then
47
126
  echo "BLOCKED: rm escaping project directory" >&2
48
127
  exit 2
49
128
  fi
50
129
  fi
51
130
 
52
131
  # Block targeting well-known user/system directories
53
- if echo "$CMD" | grep -qiE '\b(rm|del|Remove-Item)\b.*(Desktop|Applications|Documents|Downloads|Library|Keychain|\.aws|\.ssh)'; then
132
+ if echo "$CHECK" | grep -qiE '\b(rm|del|Remove-Item)\b.*(Desktop|Applications|Documents|Downloads|Library|Keychain|\.aws|\.ssh)'; then
54
133
  echo "BLOCKED: targeting system/user directory" >&2
55
134
  exit 2
56
135
  fi
@@ -22,6 +22,18 @@
22
22
  # }
23
23
  # }
24
24
 
25
+ # Without jq, the parse below silently yields empty and this hook stops
26
+ # guarding - with no error anywhere. Say so. We deliberately do not exit
27
+ # here: blocking would halt every tool call, and exiting 0 would change
28
+ # the behaviour of guards that do not depend on the parsed value.
29
+ if ! command -v jq >/dev/null 2>&1; then
30
+ _nojq_warned="/tmp/cc-nojq-warned-secret-file-read-guard-$PPID"
31
+ [ -f "$_nojq_warned" ] || {
32
+ echo "WARNING [secret-file-read-guard]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
33
+ : > "$_nojq_warned"
34
+ }
35
+ fi
36
+
25
37
  INPUT=$(cat)
26
38
  TOOL=$(echo "$INPUT" | jq -r '.tool_name // empty' 2>/dev/null)
27
39
  FILE=$(echo "$INPUT" | jq -r '.tool_input.file_path // .tool_input.path // empty' 2>/dev/null)
@@ -0,0 +1,150 @@
1
+ #!/bin/bash
2
+ # ================================================================
3
+ # secret-file-write-guard.sh — Block writing to secret files via Bash
4
+ # ================================================================
5
+ # PURPOSE:
6
+ # The bundled Write|Edit guard blocks writing to .env, private keys
7
+ # and credential files. It cannot see the same write done through
8
+ # Bash, because Bash hooks receive a command string, not a file_path.
9
+ #
10
+ # So today the same intent stops or passes depending on the route:
11
+ #
12
+ # Write tool -> ~/app/.env BLOCKED by the bundled guard
13
+ # cp k.env ~/app/.env passes
14
+ # sed -i 's/A/B/' ~/app/.env passes
15
+ # printf '%s' "$K" >> ~/app/.env passes
16
+ # curl -s https://x/k -o ~/app/.env passes
17
+ #
18
+ # Measured on 2026-09-04 against all 914 example hooks: none of them
19
+ # target a Bash write into a secret file. Five of the eleven forms do
20
+ # stop, for adjacent reasons -- ssh-key-protect.sh (private-key copy),
21
+ # dotenv-commit-guard.sh (`git add .env`), no-base64-exfil.sh,
22
+ # env-inline-secret-guard.sh (a key string inline) and a banned-command
23
+ # list. The write itself was not covered anywhere.
24
+ #
25
+ # This matters more because the route changed. In my own transcripts
26
+ # (measured 2026-09-04, 21,938 file-changing operations over 51 days),
27
+ # edits made through Bash were 40.4% up to 08-13 and 64.0% from 08-16,
28
+ # on a near-identical volume (10,880 vs 11,058 operations).
29
+ # Moving the boundary anywhere in August gives +8.7 to +23.6 points and
30
+ # never flips sign, so this is a drift across the month, not a
31
+ # single-day switch. I cannot date it from my own records.
32
+ #
33
+ # Claude Code does tell some sessions to prefer Bash over the
34
+ # Read/Edit/Write tools (feature flag bashActFirstEnabled; assignment is
35
+ # per session, so "it does not happen here" is not evidence it does not
36
+ # happen). My transcripts carry 152 `"type":"auto_mode"` attachments,
37
+ # every one with bashFirst:true -- and 67 of them in sessions that were
38
+ # NOT in bypass permissions mode. Audit your own with:
39
+ # grep -rho '"type":"auto_mode"[^}]*}' ~/.claude/projects/ | sort | uniq -c
40
+ # I have not proven that this caused the shift measured above.
41
+ #
42
+ # TRIGGER: PreToolUse
43
+ # MATCHER: "Bash"
44
+ #
45
+ # (TRIGGER and MATCHER are on separate lines on purpose. Chapter 89 of the
46
+ # incident book measured that the installer cannot pick up MATCHER when the
47
+ # two are written on one line — it falls back to the default "Bash". Here the
48
+ # default happens to be correct, so the mistake would stay invisible until
49
+ # someone changed the matcher. Verified: installing this hook reports
50
+ # `matcher: "Bash"`, and secret-file-read-guard.sh, whose MATCHER is on its
51
+ # own line, correctly reports `matcher: "Read|Grep"`.)
52
+ #
53
+ # DECISION: exit 2 = block. This is a "stop and confirm" guard, not a
54
+ # ban: creating a .env from .env.example is allowed, and so is
55
+ # reading. Only writes into a secret file are stopped.
56
+ # ================================================================
57
+
58
+ if ! command -v jq >/dev/null 2>&1; then
59
+ _nojq_warned="/tmp/cc-nojq-warned-secret-file-write-guard-$PPID"
60
+ [ -f "$_nojq_warned" ] || {
61
+ echo "WARNING [secret-file-write-guard]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
62
+ : > "$_nojq_warned"
63
+ }
64
+ fi
65
+
66
+ COMMAND=$(cat | jq -r '.tool_input.command // empty' 2>/dev/null)
67
+ [ -z "$COMMAND" ] && exit 0
68
+
69
+ # A path that names a secret file. Templates are deliberately excluded:
70
+ # `cp .env.example .env` is how projects are normally set up.
71
+ SECRET='(\.env(\.[A-Za-z0-9_-]+)?|[A-Za-z0-9_.-]+\.(pem|key|p12|pfx)|id_rsa|id_ed25519|credentials|secrets?\.(json|ya?ml|txt)|\.netrc|\.npmrc)'
72
+ TEMPLATE='\.env\.(example|sample|template|dist)'
73
+
74
+ is_template_target() {
75
+ # true when the ONLY secret-looking token being written to is a template
76
+ printf '%s' "$1" | grep -qE "$TEMPLATE\s*$"
77
+ }
78
+
79
+ block() {
80
+ echo "BLOCKED: writing to a secret file through Bash ($1). Check if this is intentional." >&2
81
+ echo " The bundled Write|Edit guard cannot see Bash writes; this hook covers that gap." >&2
82
+ exit 2
83
+ }
84
+
85
+ # 1. Redirection into a secret file: > .env >> ~/app/.env >| ~/app/.env
86
+ TARGET=$(printf '%s' "$COMMAND" | grep -oE '>>?\|?[[:space:]]*[^|;&[:space:]]+' | tail -1 | sed -E 's/^>>?\|?[[:space:]]*//')
87
+ if [ -n "$TARGET" ] && printf '%s' "$TARGET" | grep -qE "$SECRET" && ! printf '%s' "$TARGET" | grep -qE "$TEMPLATE"; then
88
+ block "redirect"
89
+ fi
90
+
91
+ # 2. tee into a secret file
92
+ if printf '%s' "$COMMAND" | grep -qE "\btee\b([[:space:]]+-[A-Za-z]+)*[[:space:]]+[^|;&[:space:]]*$SECRET" \
93
+ && ! printf '%s' "$COMMAND" | grep -qE "\btee\b[^|;&]*$TEMPLATE"; then
94
+ block "tee"
95
+ fi
96
+
97
+ # 3. in-place edit: sed -i ... .env perl -i ... .env
98
+ if printf '%s' "$COMMAND" | grep -qE '\b(sed|perl)\b[^|;&]*[[:space:]]-i' \
99
+ && printf '%s' "$COMMAND" | grep -qE "$SECRET" \
100
+ && ! printf '%s' "$COMMAND" | grep -qE "$TEMPLATE"; then
101
+ block "in-place edit"
102
+ fi
103
+
104
+ # 4. copy/move INTO a secret file (the destination is the last argument).
105
+ # `cp .env.example .env` is how projects are set up, so the SOURCE is
106
+ # checked too: copying a template into place is allowed, copying a real
107
+ # secret file into a new location is not.
108
+ if printf '%s' "$COMMAND" | grep -qE '\b(cp|mv|install|rsync|scp)\b'; then
109
+ FIRST=$(printf '%s' "$COMMAND" | sed -E 's/[|;&].*$//')
110
+ DEST=$(printf '%s' "$FIRST" | awk '{print $NF}')
111
+ SRC=$(printf '%s' "$FIRST" | awk 'NF>2 {print $(NF-1)}')
112
+ if printf '%s' "$DEST" | grep -qE "$SECRET" && ! printf '%s' "$DEST" | grep -qE "$TEMPLATE"; then
113
+ if ! printf '%s' "$SRC" | grep -qE "$TEMPLATE"; then
114
+ block "copy/move into"
115
+ fi
116
+ fi
117
+ fi
118
+
119
+ # 5. write straight into a secret file via an option:
120
+ # curl -o .env / wget -O .env / dd of=.env / openssl -out .env
121
+ # Longest option first: alternation is tried left to right, so `-o` placed
122
+ # before `-out` would match the `-o` of `-out` and capture "ut <path>".
123
+ OPT=$(printf '%s' "$COMMAND" | grep -oE '(--output-document|--output|-out|-o|-O)[[:space:]=]+[^|;&[:space:]]+|\bof=[^|;&[:space:]]+' | tail -1)
124
+ if [ -n "$OPT" ] && printf '%s' "$OPT" | grep -qE "$SECRET" && ! printf '%s' "$OPT" | grep -qE "$TEMPLATE"; then
125
+ block "write via option"
126
+ fi
127
+
128
+ # 6. replace or empty a secret file without writing content into it:
129
+ # truncate -s 0 .env / ln -sf other .env
130
+ if printf '%s' "$COMMAND" | grep -qE '\b(truncate|ln)\b'; then
131
+ LAST=$(printf '%s' "$COMMAND" | sed -E 's/[|;&].*$//' | awk '{print $NF}')
132
+ if printf '%s' "$LAST" | grep -qE "$SECRET" && ! printf '%s' "$LAST" | grep -qE "$TEMPLATE"; then
133
+ block "truncate/symlink"
134
+ fi
135
+ fi
136
+
137
+ # ── Known limits (deliberately not claimed as complete) ───────────
138
+ # A write performed *inside* an interpreter is invisible here, because the
139
+ # command string carries the program, not the file operation:
140
+ # python3 -c "open('.env','w').write(k)"
141
+ # node -e "require('fs').writeFileSync('.env', k)"
142
+ # The same is true of any wrapper script that decides the path at runtime.
143
+ # Measured on 2026-09-04 against 46 forms in total: 29 (12 that must block,
144
+ # 17 that must pass) plus 17 sibling forms. It stops every form except the
145
+ # two interpreter ones above, and raises no false positive on the 17 that
146
+ # must pass. That is a count, not a guarantee: forms absent from the table
147
+ # were never tested. If the interpreter route matters to you,
148
+ # pair this with permissions.deny on the paths themselves, which is enforced
149
+ # by the tool layer rather than by string matching.
150
+ exit 0
File without changes
@@ -21,15 +21,35 @@
21
21
  #
22
22
  # TRIGGER: PreToolUse MATCHER: "Read"
23
23
 
24
+ # Without jq, the parse below silently yields empty and this hook stops
25
+ # guarding - with no error anywhere. Say so. We deliberately do not exit
26
+ # here: blocking would halt every tool call, and exiting 0 would change
27
+ # the behaviour of guards that do not depend on the parsed value.
28
+ if ! command -v jq >/dev/null 2>&1; then
29
+ _nojq_warned="/tmp/cc-nojq-warned-sensitive-file-read-guard-$PPID"
30
+ [ -f "$_nojq_warned" ] || {
31
+ echo "WARNING [sensitive-file-read-guard]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
32
+ : > "$_nojq_warned"
33
+ }
34
+ fi
35
+
24
36
  INPUT=$(cat)
25
37
  FILE=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty' 2>/dev/null)
26
38
 
27
39
  [ -z "$FILE" ] && exit 0
28
40
 
29
- # Block private key files
30
- if echo "$FILE" | grep -qiE '(id_rsa|id_ed25519|id_ecdsa|id_dsa)$'; then
41
+ # Block private key files.
42
+ # The suffix group matters: a backup of a private key is exactly as sensitive
43
+ # as the key. Three rounds of measurement on CC 2.1.246 (2026-08-29) widened it:
44
+ # bare "$" anchor -> id_rsa.bak, id_rsa_old, id_rsa.orig walked through
45
+ # single optional group -> id_rsa~ (editor backup), id_rsa.old.2 (two suffixes)
46
+ # and a trailing space still walked through
47
+ # The last one is why the repeat count is 0-3 and why [[:space:]]* is here:
48
+ # "id_rsa " is a different string to a matcher and the same file to a reader.
49
+ # ".pub" is deliberately NOT in the suffix list, so public keys still pass.
50
+ if echo "$FILE" | grep -qiE '(id_rsa|id_ed25519|id_ecdsa|id_dsa)(([._-](bak|old|orig|save|copy|backup|[0-9]+))|~){0,3}[[:space:]]*$'; then
31
51
  # Allow .pub files
32
- echo "$FILE" | grep -qiE '\.pub$' && exit 0
52
+ echo "$FILE" | grep -qiE '\.pub[[:space:]]*$' && exit 0
33
53
  echo "BLOCKED: Reading private key file: $FILE" >&2
34
54
  echo " Private keys should never be read into conversation context." >&2
35
55
  exit 2
@@ -1,3 +1,4 @@
1
+ #!/bin/bash
1
2
  #
2
3
  # TRIGGER: PreToolUse MATCHER: "Edit|Write"
3
4
  INPUT=$(cat)
@@ -0,0 +1,69 @@
1
+ #!/bin/bash
2
+ # server-side-prompt-injection-detector.sh — Detect missing opt-outs for v2.1.150+ server-side system prompt injection
3
+ #
4
+ # Background:
5
+ # v2.1.150 introduced server-side system prompt injection via the `tengu_heron_brook`
6
+ # GrowthBook feature flag and the `client_data` field of the bootstrap API response.
7
+ # Both are cached to disk and refresh every 60 seconds. The injected string is
8
+ # registered as a peer-level system prompt section alongside `anti_verbosity`,
9
+ # `thinking_guidance`, `action_caution`, etc.
10
+ #
11
+ # This means Anthropic (or anyone who compromises the GrowthBook account or a
12
+ # proxy in front of it) can silently inject arbitrary instructions into an agent
13
+ # with shell access. No notification, no opt-in, no audit trail.
14
+ #
15
+ # Reference: https://github.com/anthropics/claude-code/issues/62061 (46+ reactions)
16
+ # Anthropic's response: they run experiments on system prompts; opt-out via env vars.
17
+ #
18
+ # What this hook does:
19
+ # On SessionStart, check whether the two opt-out env vars are set:
20
+ # - CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 (disables bootstrap client_data)
21
+ # - DISABLE_GROWTHBOOK=1 (disables tengu_heron_brook flag sync)
22
+ # If either is unset, print a one-line advisory to stderr with the env-var name and
23
+ # a reference to #62061. The hook never blocks the session.
24
+ #
25
+ # When this hook does NOT fire a warning:
26
+ # - Both env vars are exported and set to 1
27
+ # - The user has set CC_PROMPT_INJECTION_DETECTOR_QUIET=1 (acknowledged the trade-off)
28
+ #
29
+ # Hook config (settings.json):
30
+ # {
31
+ # "hooks": {
32
+ # "SessionStart": [{
33
+ # "matcher": "",
34
+ # "hooks": [{ "type": "command", "command": "bash ~/.claude/hooks/server-side-prompt-injection-detector.sh" }]
35
+ # }]
36
+ # }
37
+ # }
38
+
39
+ # Allow user to silence the warning entirely after acknowledging
40
+ if [ "${CC_PROMPT_INJECTION_DETECTOR_QUIET:-0}" = "1" ]; then
41
+ exit 0
42
+ fi
43
+
44
+ MISSING=()
45
+
46
+ if [ "${CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC:-0}" != "1" ]; then
47
+ MISSING+=("CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC")
48
+ fi
49
+
50
+ if [ "${DISABLE_GROWTHBOOK:-0}" != "1" ]; then
51
+ MISSING+=("DISABLE_GROWTHBOOK")
52
+ fi
53
+
54
+ if [ "${#MISSING[@]}" -eq 0 ]; then
55
+ exit 0
56
+ fi
57
+
58
+ # Print a compact advisory. The hook is intentionally non-blocking — server-side
59
+ # prompt injection is a documented Anthropic feature, not a fault. The user opts
60
+ # out by exporting the two env vars in their shell rc.
61
+ echo "ADVISORY: v2.1.150+ server-side system-prompt injection is active." >&2
62
+ echo " Missing opt-out env var(s): ${MISSING[*]}" >&2
63
+ echo " Background: Anthropic refreshes the 'tengu_heron_brook' GrowthBook flag every 60s and" >&2
64
+ echo " the bootstrap 'client_data' field on session start; both are injected into your system" >&2
65
+ echo " prompt with no client-side audit trail. Reference: #62061." >&2
66
+ echo " To opt out: export CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 DISABLE_GROWTHBOOK=1" >&2
67
+ echo " To silence this hook (acknowledged): export CC_PROMPT_INJECTION_DETECTOR_QUIET=1" >&2
68
+
69
+ exit 0
@@ -17,6 +17,18 @@
17
17
  # MATCHER: "Agent"
18
18
  # CATEGORY: cost-control
19
19
 
20
+ # Without jq, the parse below silently yields empty and this hook stops
21
+ # guarding - with no error anywhere. Say so. We deliberately do not exit
22
+ # here: blocking would halt every tool call, and exiting 0 would change
23
+ # the behaviour of guards that do not depend on the parsed value.
24
+ if ! command -v jq >/dev/null 2>&1; then
25
+ _nojq_warned="/tmp/cc-nojq-warned-session-agent-cost-limiter-$PPID"
26
+ [ -f "$_nojq_warned" ] || {
27
+ echo "WARNING [session-agent-cost-limiter]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
28
+ : > "$_nojq_warned"
29
+ }
30
+ fi
31
+
20
32
  INPUT=$(cat)
21
33
  TOOL=$(echo "$INPUT" | jq -r '.tool_name // empty' 2>/dev/null)
22
34
  [ "$TOOL" != "Agent" ] && exit 0
@@ -36,7 +36,7 @@ KEEP="${CC_SESSION_BACKUP_KEEP:-5}"
36
36
 
37
37
  # Find the current project's session directory
38
38
  CWD=$(pwd)
39
- PROJECT_NAME=$(printf '%s' "$CWD" | sed 's|/|-|g; s|^-||')
39
+ PROJECT_NAME=$(printf '%s' "$CWD" | sed 's|/|-|g')
40
40
  SESSION_DIR="${HOME}/.claude/projects/${PROJECT_NAME}"
41
41
 
42
42
  if [ ! -d "$SESSION_DIR" ]; then
@@ -18,6 +18,18 @@
18
18
  # MATCHER: ""
19
19
  # CATEGORY: cost-control
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-session-cost-alert-$PPID"
27
+ [ -f "$_nojq_warned" ] || {
28
+ echo "WARNING [session-cost-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
  WARN_THRESHOLD=${CC_COST_WARN:-1}
@@ -28,6 +28,18 @@
28
28
  #
29
29
  # Config: CC_DRIFT_WARN=200 CC_DRIFT_BLOCK=500
30
30
 
31
+ # Without jq, the parse below silently yields empty and this hook stops
32
+ # guarding - with no error anywhere. Say so. We deliberately do not exit
33
+ # here: blocking would halt every tool call, and exiting 0 would change
34
+ # the behaviour of guards that do not depend on the parsed value.
35
+ if ! command -v jq >/dev/null 2>&1; then
36
+ _nojq_warned="/tmp/cc-nojq-warned-session-drift-guard-$PPID"
37
+ [ -f "$_nojq_warned" ] || {
38
+ echo "WARNING [session-drift-guard]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
39
+ : > "$_nojq_warned"
40
+ }
41
+ fi
42
+
31
43
  INPUT=$(cat)
32
44
  COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null)
33
45
 
@@ -18,7 +18,30 @@
18
18
  # CC_SESSION_CRITICAL_HOURS=4 (critical after 4 hours, default)
19
19
  # ================================================================
20
20
 
21
- MARKER="/tmp/cc-session-start-$$"
21
+ __CC_HOOK_INPUT=$(cat 2>/dev/null)
22
+ # --- セッション識別子でファイルを分ける (2026-08-09 修正) ---
23
+ # 旧実装は "$$" を使っていたが、$$ はこのスクリプト自身のPIDで呼び出しごとに変わるため、
24
+ # 状態が一度も持続しなかった(実測: 200回呼ぶとファイルが200個でき、中身は全部 1)。
25
+ __CC_SID=""
26
+ if [ -n "${__CC_HOOK_INPUT:-}" ]; then
27
+ if command -v jq >/dev/null 2>&1; then
28
+ __CC_SID=$(printf '%s' "$__CC_HOOK_INPUT" | jq -r '.session_id // .sessionId // empty' 2>/dev/null)
29
+ fi
30
+ if [ -z "$__CC_SID" ] && command -v python3 >/dev/null 2>&1; then
31
+ __CC_SID=$(printf '%s' "$__CC_HOOK_INPUT" | python3 -c 'import sys,json
32
+ try:
33
+ d=json.load(sys.stdin); print(d.get("session_id") or d.get("sessionId") or "")
34
+ except Exception: print("")' 2>/dev/null)
35
+ fi
36
+ fi
37
+ if [ -n "$__CC_SID" ]; then
38
+ __CC_KEY=$(printf '%s' "$__CC_SID" | tr -c 'A-Za-z0-9_-' '_' | cut -c1-64)
39
+ else
40
+ __CC_KEY="nosession-$(date +%Y%m%d)"
41
+ fi
42
+ # --- ここまで ---
43
+
44
+ MARKER="/tmp/cc-session-start-$__CC_KEY"
22
45
  WARN_HOURS="${CC_SESSION_WARN_HOURS:-2}"
23
46
  CRITICAL_HOURS="${CC_SESSION_CRITICAL_HOURS:-4}"
24
47
 
@@ -29,7 +52,7 @@ if [ ! -f "$MARKER" ]; then
29
52
  fi
30
53
 
31
54
  # Check every 50 tool calls (not every call)
32
- COUNTER="/tmp/cc-duration-counter-$$"
55
+ COUNTER="/tmp/cc-duration-counter-$__CC_KEY"
33
56
  COUNT=$(cat "$COUNTER" 2>/dev/null || echo 0)
34
57
  COUNT=$((COUNT + 1))
35
58
  echo "$COUNT" > "$COUNTER"
File without changes
File without changes
@@ -37,7 +37,7 @@ fi
37
37
  # Claude Code uses the cwd path (with slashes replaced by dashes) as the project dir name
38
38
  CWD=$(pwd)
39
39
  # Convert path to Claude's project directory naming scheme
40
- PROJECT_NAME=$(printf '%s' "$CWD" | sed 's|/|-|g; s|^-||')
40
+ PROJECT_NAME=$(printf '%s' "$CWD" | sed 's|/|-|g')
41
41
  SESSION_DIR="${PROJECT_DIR}/${PROJECT_NAME}"
42
42
 
43
43
  if [ ! -d "$SESSION_DIR" ]; then
@@ -1,3 +1,4 @@
1
+ #!/bin/bash
1
2
  MAX_RSS_MB="${CC_MAX_RSS_MB:-4096}"
2
3
  CHECK_INTERVAL=300
3
4
  PID_FILE="/tmp/cc-memory-watchdog.pid"
@@ -15,6 +15,18 @@
15
15
  # TRIGGER: PreToolUse
16
16
  # MATCHER: "Bash"
17
17
 
18
+ # Without jq, the parse below silently yields empty and this hook stops
19
+ # guarding - with no error anywhere. Say so. We deliberately do not exit
20
+ # here: blocking would halt every tool call, and exiting 0 would change
21
+ # the behaviour of guards that do not depend on the parsed value.
22
+ if ! command -v jq >/dev/null 2>&1; then
23
+ _nojq_warned="/tmp/cc-nojq-warned-session-permission-reset-guard-$PPID"
24
+ [ -f "$_nojq_warned" ] || {
25
+ echo "WARNING [session-permission-reset-guard]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
26
+ : > "$_nojq_warned"
27
+ }
28
+ fi
29
+
18
30
  INPUT=$(cat)
19
31
  COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null)
20
32
  [ -z "$COMMAND" ] && exit 0