cc-safe-setup 29.8.0 → 30.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +72 -19
- package/.claude-plugin/plugin.json +1 -1
- package/CONTRIBUTING.md +7 -2
- package/COOKBOOK.md +50 -46
- package/LICENSE +21 -0
- package/MIGRATION.md +8 -8
- package/README.md +421 -512
- package/SAFETY_CHECKLIST.md +15 -7
- package/SERVICES.md +194 -0
- package/SETTINGS_REFERENCE.md +236 -17
- package/SKILL.md +5 -5
- package/TROUBLESHOOTING.md +35 -14
- package/action.yml +12 -4
- package/audit/README.md +84 -0
- package/audit/audit-checklist.md +152 -0
- package/audit/boundary-selftest.sh +85 -0
- package/audit/boundary.sh +123 -0
- package/audit/count-hooks.py +42 -0
- package/audit/find-dead-hooks.sh +82 -0
- package/audit/find-unfirable-rules.sh +142 -0
- package/audit/fire.sh +97 -0
- package/audit/selftest.sh +42 -0
- package/audit/unfirable-selftest.sh +81 -0
- package/audit-web/index.html +9 -9
- package/examples/README.md +54 -17
- package/examples/account-billing-log.sh +98 -0
- package/examples/account-routing-preflight.sh +123 -0
- package/examples/agent-sdk-credit-pool-monitor.sh +145 -0
- package/examples/agent-view-quota-decrement.sh +32 -0
- package/examples/agent-view-quota-warn.sh +94 -0
- package/examples/agents-md-edit-drift-warner.sh +223 -0
- package/examples/agents-md-loader.sh +160 -0
- package/examples/agents-md-sync-checker.sh +102 -0
- package/examples/ai-slop-punctuation-arrest.sh +210 -0
- package/examples/allowlist.sh +70 -10
- package/examples/always-allow-pattern-suggester.sh +125 -0
- package/examples/ansible-vault-guard.sh +2 -1
- package/examples/anthropic-base-url-guard.sh +76 -0
- package/examples/api-busyloop-guard.sh +123 -0
- package/examples/api-endpoint-guard.sh +12 -0
- package/examples/api-key-in-url-guard.sh +17 -1
- package/examples/api-rate-limit-guard.sh +36 -1
- package/examples/api-rate-limit-tracker.sh +12 -0
- package/examples/articulated-scope-capture.sh +101 -0
- package/examples/askuserquestion-autonomy-gate.sh +102 -0
- package/examples/attachment-traversal-guard.sh +118 -0
- package/examples/aup-block-pattern-logger.sh +161 -0
- package/examples/aup-false-positive-helper.sh +124 -0
- package/examples/aup-large-tool-output-warner.sh +282 -0
- package/examples/aup-retry-loop-guard.sh +229 -0
- package/examples/auth-expiry-reminder.sh +157 -0
- package/examples/auth-macos-sleep-detector.sh +185 -0
- package/examples/auth-path-detector.sh +171 -0
- package/examples/auth-status-checker.sh +157 -0
- package/examples/authorized-reconfirmation-detector.sh +195 -0
- package/examples/auto-approve-build.sh +39 -0
- package/examples/auto-approve-cargo.sh +31 -1
- package/examples/auto-approve-docker.sh +35 -0
- package/examples/auto-approve-git-read.sh +37 -14
- package/examples/auto-approve-go.sh +30 -1
- package/examples/auto-approve-gradle.sh +29 -1
- package/examples/auto-approve-make.sh +29 -1
- package/examples/auto-approve-maven.sh +29 -1
- package/examples/auto-approve-python.sh +41 -1
- package/examples/auto-approve-readonly-tools.sh +1 -0
- package/examples/auto-approve-readonly.sh +110 -33
- package/examples/auto-approve-ssh.sh +30 -1
- package/examples/auto-approve-test.sh +44 -0
- package/examples/auto-checkpoint.sh +1 -1
- package/examples/auto-compact-prep.sh +0 -0
- package/examples/auto-git-checkpoint.sh +0 -0
- package/examples/auto-mode-safe-commands.sh +53 -1
- package/examples/auto-mode-safety-enforcer.sh +151 -4
- package/examples/auto-push-session-branch.sh +22 -0
- package/examples/aws-production-guard.sh +13 -1
- package/examples/aws-region-guard.sh +1 -1
- package/examples/background-cost-launch-guard.sh +82 -0
- package/examples/background-task-guard.sh +12 -0
- package/examples/backup-before-refactor.sh +0 -0
- package/examples/banned-command-guard.sh +12 -0
- package/examples/bash-allowlist-secondary-check.sh +157 -0
- package/examples/bash-domain-allowlist.sh +12 -0
- package/examples/bash-fanout-bounded-rewriter.sh +191 -0
- package/examples/bash-heuristic-approver.sh +112 -10
- package/examples/bash-project-fence.sh +194 -0
- package/examples/bash-safety-auto-deny.sh +12 -0
- package/examples/bash-secret-output-detector.sh +44 -3
- package/examples/bash-trace-guard.sh +12 -0
- package/examples/bashrc-safety-check.sh +0 -0
- package/examples/bg-permission-prompt-warner.sh +182 -0
- package/examples/bg-task-cooldown-guard.sh +12 -0
- package/examples/binary-read-detector.sh +135 -0
- package/examples/binary-upload-guard.sh +12 -0
- package/examples/block-database-wipe.sh +35 -10
- package/examples/branch-name-check.sh +8 -3
- package/examples/branch-naming-convention.sh +0 -0
- package/examples/broad-find-guard.sh +12 -0
- package/examples/broad-prefix-session-trap-warner.sh +106 -0
- package/examples/bulk-file-delete-guard.sh +45 -0
- package/examples/bypass-mode-effective-verifier.sh +203 -0
- package/examples/cache-creation-drift-detector.sh +120 -0
- package/examples/cache-residue-detector.sh +195 -0
- package/examples/cache-tier-logger.sh +70 -0
- package/examples/cache-ttl-eviction-detector.sh +149 -0
- package/examples/cargo-publish-guard.sh +14 -1
- package/examples/case-insensitive-path-guard.sh +21 -2
- package/examples/case-sensitive-guard.sh +23 -2
- package/examples/cch-cache-guard.sh +0 -0
- package/examples/cch-sentinel-precommit-guard.sh +47 -0
- package/examples/check-abort-controller.sh +1 -1
- package/examples/check-accessibility.sh +0 -0
- package/examples/check-aria-labels.sh +0 -0
- package/examples/check-before-act-enforcer.sh +12 -0
- package/examples/check-charset-meta.sh +0 -0
- package/examples/check-cookie-flags.sh +0 -0
- package/examples/check-cors-config.sh +0 -0
- package/examples/check-csp-headers.sh +0 -0
- package/examples/check-csrf-protection.sh +0 -0
- package/examples/check-debounce.sh +1 -1
- package/examples/check-dependency-age.sh +0 -0
- package/examples/check-dependency-license.sh +0 -0
- package/examples/check-dockerfile-best-practice.sh +0 -0
- package/examples/check-error-boundaries.sh +0 -0
- package/examples/check-error-class.sh +1 -1
- package/examples/check-error-handling.sh +0 -0
- package/examples/check-error-logging.sh +1 -1
- package/examples/check-error-message.sh +0 -0
- package/examples/check-error-stack.sh +0 -0
- package/examples/check-favicon.sh +0 -0
- package/examples/check-git-hooks-compat.sh +0 -0
- package/examples/check-gitattributes.sh +0 -0
- package/examples/check-https-redirect.sh +0 -0
- package/examples/check-input-validation.sh +0 -0
- package/examples/check-lang-attribute.sh +0 -0
- package/examples/check-npm-scripts-exist.sh +0 -0
- package/examples/check-package-size.sh +0 -0
- package/examples/check-port-availability.sh +0 -0
- package/examples/check-promise-all.sh +1 -1
- package/examples/check-rate-limiting.sh +0 -0
- package/examples/check-return-types.sh +0 -0
- package/examples/check-semantic-versioning.sh +0 -0
- package/examples/check-suspense-fallback.sh +1 -1
- package/examples/check-test-exists.sh +0 -0
- package/examples/check-test-naming.sh +0 -0
- package/examples/check-timeout-cleanup.sh +1 -1
- package/examples/check-tls-version.sh +0 -0
- package/examples/check-unsubscribe.sh +1 -1
- package/examples/check-viewport-meta.sh +0 -0
- package/examples/check-worker-terminate.sh +1 -1
- package/examples/checkpoint-tamper-guard.sh +12 -0
- package/examples/chmod-guard.sh +12 -0
- package/examples/chown-guard.sh +24 -0
- package/examples/ci-workflow-guard.sh +6 -1
- package/examples/claim-verify-detector.sh +109 -0
- package/examples/claim-vs-caveat-checker.sh +77 -0
- package/examples/classifier-fallback-allow.sh +114 -40
- package/examples/claude-cache-gc.sh +1 -0
- package/examples/claude-code-version-pin-advisor.sh +183 -0
- package/examples/claude-md-reinjector.sh +129 -0
- package/examples/claude-md-size-monitor.sh +66 -0
- package/examples/claude-update-budget-guard.sh +123 -0
- package/examples/claude-update-smart.sh +113 -0
- package/examples/claudeignore-enforce-guard.sh +12 -0
- package/examples/claudemd-enforcer.sh +0 -0
- package/examples/claudemd-tool-prohibition.sh +128 -0
- package/examples/clear-command-confirm-guard.sh +32 -15
- package/examples/cli-config-pinning-detector.sh +162 -0
- package/examples/cliff-countdown-advisor.sh +96 -0
- package/examples/clipboard-secret-guard.sh +12 -0
- package/examples/closure-word-verify-gate.sh +150 -0
- package/examples/cloud-cli-guard.sh +39 -2
- package/examples/commit-all-scope-guard.sh +44 -0
- package/examples/commit-message-check.sh +1 -1
- package/examples/commit-message-quality.sh +6 -1
- package/examples/commitment-carry-forward-arrest.sh +361 -0
- package/examples/compact-alert-notification.sh +0 -0
- package/examples/compact-dispatch-watchdog.sh +149 -0
- package/examples/completion-claim-without-verification-detector.sh +207 -0
- package/examples/composer-guard.sh +12 -0
- package/examples/compound-bash-permission-resolver.sh +156 -0
- package/examples/compound-command-allow.sh +1 -1
- package/examples/compound-command-deny-enforcer.sh +183 -0
- package/examples/compound-inject-guard.sh +12 -0
- package/examples/concurrent-edit-lock.sh +12 -0
- package/examples/conflict-marker-guard.sh +12 -0
- package/examples/consecutive-error-breaker.sh +0 -0
- package/examples/console-log-count.sh +1 -0
- package/examples/context-compact-advisor.sh +29 -2
- package/examples/context-length-budget.sh +69 -0
- package/examples/context-threshold-alert.sh +12 -0
- package/examples/context-usage-drift-alert.sh +41 -13
- package/examples/conversation-history-guard.sh +12 -0
- package/examples/core-file-protect-guard.sh +12 -0
- package/examples/cors-star-warn.sh +0 -0
- package/examples/cost-incident-self-audit.sh +162 -0
- package/examples/cowork-claude-md-load-checker.sh +100 -0
- package/examples/cowork-fuse-staleness-watcher.sh +140 -0
- package/examples/cowork-hook-absence-warner.sh +167 -0
- package/examples/cowork-model-picker-advisor.sh +115 -0
- package/examples/credential-exfil-guard.sh +65 -4
- package/examples/credential-file-cat-guard.sh +17 -1
- package/examples/cron-create-receipt.sh +112 -0
- package/examples/cron-modification-guard.sh +12 -0
- package/examples/cross-product-mcp-spawn-detector.sh +178 -0
- package/examples/cwd-project-boundary-guard.sh +0 -0
- package/examples/daemon-zombie-worker-surfacer.sh +118 -0
- package/examples/daily-cost-guard.sh +164 -0
- package/examples/daily-usage-tracker.sh +0 -0
- package/examples/dangerous-pip-flag-guard.sh +12 -0
- package/examples/db-connect-guard.sh +13 -1
- package/examples/denied-action-retry-guard.sh +12 -0
- package/examples/deny-bypass-detector.sh +12 -0
- package/examples/deny-rule-integrity-verifier.sh +181 -0
- package/examples/dependency-install-guard.sh +12 -0
- package/examples/deploy-guard.sh +14 -2
- package/examples/deploy-path-verify-guard.sh +12 -0
- package/examples/deployment-readback-gate.sh +135 -0
- package/examples/deployment-readback-gh-adapter.sh +247 -0
- package/examples/deployment-verify-guard.sh +25 -2
- package/examples/destructive-db-script-write-guard.sh +166 -0
- package/examples/destructive-migration-write-guard.sh +163 -0
- package/examples/diff-size-guard.sh +12 -0
- package/examples/disabled-feature-toggle-advisor.sh +88 -0
- package/examples/disk-partition-guard.sh +12 -0
- package/examples/dispatch-allowlist-preflight.sh +301 -0
- package/examples/dispatch-liveness-watchdog.sh +216 -0
- package/examples/dispatch-receipt.sh +174 -0
- package/examples/django-migrate-guard.sh +12 -0
- package/examples/dns-config-guard.sh +12 -0
- package/examples/docker-dangerous-guard.sh +12 -0
- package/examples/docker-volume-guard.sh +0 -0
- package/examples/dockerfile-latest-guard.sh +1 -0
- package/examples/dotenv-anthropic-key-billing-guard.sh +99 -0
- package/examples/dotenv-commit-guard.sh +12 -0
- package/examples/dotenv-read-guard.sh +12 -0
- package/examples/dotfile-protection-guard.sh +12 -0
- package/examples/dotnet-build-on-edit.sh +1 -1
- package/examples/drizzle-migrate-guard.sh +27 -2
- package/examples/echo-probe-spam-detector.sh +176 -0
- package/examples/edit-counter-test-gate.sh +12 -0
- package/examples/edit-error-counter.sh +1 -1
- package/examples/edit-guard.sh +12 -0
- package/examples/edit-old-string-validator.sh +12 -0
- package/examples/edit-quote-ambiguity-guard.sh +97 -0
- package/examples/edit-retry-loop-guard.sh +0 -0
- package/examples/edit-verify.sh +0 -0
- package/examples/env-inline-secret-guard.sh +14 -2
- package/examples/env-naming-convention.sh +0 -0
- package/examples/env-prod-guard.sh +0 -0
- package/examples/env-required-check.sh +0 -0
- package/examples/env-source-guard.sh +12 -0
- package/examples/env-var-check.sh +24 -1
- package/examples/ephemeral-container-detector.sh +147 -0
- package/examples/error-memory-guard.sh +12 -0
- package/examples/evidence-claim-gate.sh +187 -0
- package/examples/exploration-budget-guard.sh +12 -0
- package/examples/expo-eject-guard.sh +13 -0
- package/examples/extended-thinking-loop-guard.sh +139 -0
- package/examples/extended-thinking-resume-warning.sh +119 -0
- package/examples/extended-thinking-tool-use-mismatch-detector.sh +212 -0
- package/examples/fabricated-command-detector.sh +145 -0
- package/examples/false-disk-full-guard.sh +63 -0
- package/examples/feature-deprecation-detector.sh +109 -0
- package/examples/file-change-tracker.sh +1 -1
- package/examples/file-change-undo-tracker.sh +0 -0
- package/examples/file-edit-backup.sh +63 -14
- package/examples/file-reference-check.sh +0 -0
- package/examples/file-size-limit.sh +12 -0
- package/examples/financial-operation-guard.sh +12 -0
- package/examples/firewall-guard.sh +12 -0
- package/examples/fish-shell-wrapper.sh +125 -7
- package/examples/five-hundred-milestone.sh +1 -0
- package/examples/flask-static-route-guard.sh +89 -0
- package/examples/forbidden-response-phrase-detector.sh +161 -0
- package/examples/gem-push-guard.sh +13 -0
- package/examples/gh-cli-destructive-guard.sh +13 -1
- package/examples/git-checkout-safety-guard.sh +12 -0
- package/examples/git-checkout-uncommitted-guard.sh +12 -0
- package/examples/git-config-guard.sh +12 -0
- package/examples/git-crypt-worktree-guard.sh +12 -0
- package/examples/git-filter-repo-guard.sh +56 -0
- package/examples/git-history-rewrite-guard.sh +12 -0
- package/examples/git-hook-bypass-guard.sh +0 -0
- package/examples/git-maintenance-guard.sh +83 -0
- package/examples/git-merge-conflict-prevent.sh +0 -0
- package/examples/git-message-length-check.sh +0 -0
- package/examples/git-message-length.sh +0 -0
- package/examples/git-operations-require-approval.sh +68 -14
- package/examples/git-pack-temp-cleanup-guard.sh +102 -0
- package/examples/git-push-blast-radius-guard.sh +218 -0
- package/examples/git-remote-guard.sh +24 -3
- package/examples/git-rm-orphan-wipe-guard.sh +85 -0
- package/examples/git-stash-before-checkout.sh +12 -0
- package/examples/git-stash-before-danger.sh +0 -0
- package/examples/git-submodule-guard.sh +69 -2
- package/examples/git-tag-guard.sh +12 -0
- package/examples/github-actions-secret-guard.sh +0 -0
- package/examples/gitignore-check.sh +0 -0
- package/examples/gitops-drift-guard.sh +12 -0
- package/examples/go-mod-tidy-warn.sh +1 -0
- package/examples/go-vet-after-edit.sh +12 -0
- package/examples/goal-iteration-limit-warner.sh +152 -0
- package/examples/grep-nul-false-negative-guard.sh +30 -0
- package/examples/growthbook-flag-monitor.sh +257 -0
- package/examples/hallucination-url-check.sh +1 -1
- package/examples/halt-signal-detector.sh +135 -0
- package/examples/handoff-on-clear.sh +65 -0
- package/examples/hardcoded-ip-guard.sh +1 -0
- package/examples/headless-empty-result-guard.sh +0 -0
- package/examples/headless-stop-guard.sh +0 -0
- package/examples/helm-install-guard.sh +2 -1
- package/examples/home-critical-bash-guard.sh +17 -1
- package/examples/hook-debug-wrapper.sh +6 -2
- package/examples/hook-permission-fixer.sh +0 -0
- package/examples/hook-self-disable-detector.sh +99 -0
- package/examples/hook-stdout-sanitizer.sh +6 -2
- package/examples/hook-tamper-guard.sh +12 -0
- package/examples/idle-session-cost-alert.sh +0 -0
- package/examples/image-dimension-guard.sh +109 -0
- package/examples/image-file-validator.sh +0 -0
- package/examples/iteration-quality-degradation-detector.sh +170 -0
- package/examples/java-compile-on-edit.sh +1 -1
- package/examples/json-syntax-check.sh +0 -0
- package/examples/k8s-production-guard.sh +13 -1
- package/examples/kill-process-guard.sh +12 -0
- package/examples/kubernetes-guard.sh +13 -1
- package/examples/laravel-artisan-guard.sh +13 -0
- package/examples/large-file-guard.sh +1 -1
- package/examples/log-level-guard.sh +0 -0
- package/examples/log-truncation-guard.sh +12 -0
- package/examples/long-session-malformed-tool-call-detector.sh +183 -0
- package/examples/loop-detector.sh +12 -0
- package/examples/magic-number-warn.sh +1 -0
- package/examples/main-branch-warn.sh +12 -0
- package/examples/markdown-link-check.sh +0 -0
- package/examples/max-concurrent-agents.sh +12 -0
- package/examples/max-edit-size-guard.sh +13 -0
- package/examples/max-file-count-guard.sh +0 -0
- package/examples/max-file-delete-count.sh +0 -0
- package/examples/max-function-length.sh +1 -0
- package/examples/max-import-count.sh +0 -0
- package/examples/max-subagent-count.sh +0 -0
- package/examples/mcp-config-freeze.sh +12 -0
- package/examples/mcp-config-poisoning-audit.sh +150 -0
- package/examples/mcp-data-boundary.sh +1 -1
- package/examples/mcp-misdiagnosis-arrest.sh +209 -0
- package/examples/mcp-orphan-leak-warner.sh +49 -0
- package/examples/mcp-permissions-ask-warner.sh +151 -0
- package/examples/mcp-routine-approval-detector.sh +154 -0
- package/examples/mcp-server-allowlist.sh +12 -0
- package/examples/mcp-server-guard.sh +12 -0
- package/examples/mcp-startup-bloat-detector.sh +87 -0
- package/examples/mcp-stdio-compatibility-test.sh +153 -0
- package/examples/mcp-tool-audit-log.sh +0 -0
- package/examples/mcp-tool-guard.sh +101 -1
- package/examples/mcp-warmup-wait.sh +0 -0
- package/examples/memory-chain-audit.sh +56 -0
- package/examples/memory-orphan-detector.sh +188 -0
- package/examples/memory-write-guard.sh +99 -17
- package/examples/migration-verify-guard.sh +12 -0
- package/examples/model-swap-suggester.sh +177 -0
- package/examples/model-version-alert.sh +5 -1
- package/examples/model-version-lock.sh +63 -0
- package/examples/move-delete-sequence-guard.sh +33 -2
- package/examples/multi-file-plan-routing-gate.sh +192 -0
- package/examples/multi-vendor-concurrent-warner.sh +108 -0
- package/examples/multi-window-auth-drift-detector.sh +183 -0
- package/examples/multiline-command-approver.sh +161 -23
- package/examples/nested-background-agent-guard.sh +109 -0
- package/examples/nested-spawn-inflight-guard.sh +178 -0
- package/examples/network-exfil-guard.sh +12 -0
- package/examples/network-guard.sh +12 -0
- package/examples/network-interface-guard.sh +12 -0
- package/examples/nextjs-env-guard.sh +1 -1
- package/examples/no-absolute-import.sh +0 -0
- package/examples/no-alert-confirm-prompt.sh +0 -0
- package/examples/no-anonymous-default-export.sh +0 -0
- package/examples/no-any-type.sh +0 -0
- package/examples/no-any-typescript.sh +1 -0
- package/examples/no-ask-human.sh +12 -0
- package/examples/no-assignment-in-condition.sh +0 -0
- package/examples/no-base64-exfil.sh +12 -0
- package/examples/no-callback-hell.sh +0 -0
- package/examples/no-circular-dependency.sh +0 -0
- package/examples/no-cleartext-storage.sh +0 -0
- package/examples/no-commented-code.sh +0 -0
- package/examples/no-commit-fixup.sh +0 -0
- package/examples/no-console-assert.sh +0 -0
- package/examples/no-console-error-swallow.sh +0 -0
- package/examples/no-console-in-prod.sh +0 -0
- package/examples/no-console-log-commit.sh +12 -0
- package/examples/no-console-log.sh +0 -0
- package/examples/no-console-time.sh +0 -0
- package/examples/no-cors-wildcard.sh +4 -1
- package/examples/no-curl-upload.sh +0 -0
- package/examples/no-dangerouslySetInnerHTML.sh +0 -0
- package/examples/no-dangling-await.sh +1 -0
- package/examples/no-debug-commit.sh +12 -0
- package/examples/no-debug-in-commit.sh +0 -0
- package/examples/no-deep-nesting.sh +0 -0
- package/examples/no-deep-relative-import.sh +1 -0
- package/examples/no-default-credentials.sh +0 -0
- package/examples/no-deploy-friday.sh +13 -1
- package/examples/no-disabled-test.sh +0 -0
- package/examples/no-document-write.sh +0 -0
- package/examples/no-empty-function.sh +0 -0
- package/examples/no-eval-in-template.sh +0 -0
- package/examples/no-eval-template.sh +3 -1
- package/examples/no-eval.sh +0 -0
- package/examples/no-exec-user-input.sh +0 -0
- package/examples/no-fixme-ship.sh +12 -0
- package/examples/no-floating-promises.sh +0 -0
- package/examples/no-force-flag.sh +22 -5
- package/examples/no-force-install.sh +0 -0
- package/examples/no-git-amend.sh +12 -0
- package/examples/no-git-rebase-public.sh +0 -0
- package/examples/no-global-install.sh +12 -0
- package/examples/no-global-state.sh +0 -0
- package/examples/no-hardcoded-port.sh +1 -0
- package/examples/no-hardcoded-url.sh +0 -0
- package/examples/no-helmet-missing.sh +0 -0
- package/examples/no-http-url.sh +1 -0
- package/examples/no-http-without-https.sh +0 -0
- package/examples/no-inline-style.sh +0 -0
- package/examples/no-inline-styles.sh +1 -0
- package/examples/no-innerhtml.sh +0 -0
- package/examples/no-install-global.sh +12 -0
- package/examples/no-jwt-in-url.sh +0 -0
- package/examples/no-large-commit.sh +0 -0
- package/examples/no-localhost-expose.sh +0 -0
- package/examples/no-magic-number.sh +0 -0
- package/examples/no-md5-sha1.sh +0 -0
- package/examples/no-mixed-line-endings.sh +8 -1
- package/examples/no-mutation-in-reducer.sh +0 -0
- package/examples/no-nested-ternary.sh +0 -0
- package/examples/no-network-exfil.sh +0 -0
- package/examples/no-open-redirect.sh +0 -0
- package/examples/no-output-truncation.sh +12 -0
- package/examples/no-package-downgrade.sh +0 -0
- package/examples/no-package-lock-edit.sh +12 -0
- package/examples/no-path-join-user-input.sh +0 -0
- package/examples/no-port-bind.sh +0 -0
- package/examples/no-process-exit.sh +0 -0
- package/examples/no-prototype-pollution.sh +0 -0
- package/examples/no-push-without-ci.sh +0 -0
- package/examples/no-push-without-tests.sh +12 -0
- package/examples/no-raw-password-in-url.sh +0 -0
- package/examples/no-root-user-docker.sh +1 -0
- package/examples/no-root-write.sh +12 -0
- package/examples/no-secrets-in-args.sh +4 -1
- package/examples/no-secrets-in-logs.sh +0 -0
- package/examples/no-sensitive-log.sh +0 -0
- package/examples/no-sleep-in-hooks.sh +0 -0
- package/examples/no-star-import-python.sh +1 -0
- package/examples/no-string-concat-sql.sh +0 -0
- package/examples/no-sudo-guard.sh +12 -0
- package/examples/no-sync-fs.sh +0 -0
- package/examples/no-todo-in-merge.sh +0 -0
- package/examples/no-todo-in-production.sh +1 -0
- package/examples/no-todo-without-issue.sh +0 -0
- package/examples/no-unused-import.sh +0 -0
- package/examples/no-var-keyword.sh +0 -0
- package/examples/no-verify-blocker.sh +12 -0
- package/examples/no-wget-piped-bash.sh +12 -0
- package/examples/no-wildcard-cors.sh +0 -0
- package/examples/no-wildcard-delete.sh +0 -0
- package/examples/no-wildcard-import.sh +0 -0
- package/examples/no-with-statement.sh +0 -0
- package/examples/no-write-outside-src.sh +0 -0
- package/examples/no-xml-external-entity.sh +0 -0
- package/examples/non-english-quality-warner.sh +156 -0
- package/examples/notify-waiting.sh +1 -1
- package/examples/npm-audit-warn.sh +0 -0
- package/examples/npm-global-install-guard.sh +12 -0
- package/examples/npm-publish-guard.sh +12 -0
- package/examples/npm-script-injection.sh +0 -0
- package/examples/npm-supply-chain-guard.sh +0 -0
- package/examples/nuxt-config-guard.sh +1 -0
- package/examples/oauth-refresh-monitor.sh +210 -0
- package/examples/opus-degradation-tracker.sh +187 -0
- package/examples/opus48-routine-task-warning.sh +196 -0
- package/examples/opus48-thinking-wedge-advisor.sh +143 -0
- package/examples/output-credential-scan.sh +1 -1
- package/examples/output-secret-mask.sh +31 -9
- package/examples/output-token-spike-detector.sh +145 -0
- package/examples/package-json-guard.sh +12 -0
- package/examples/package-lock-frozen.sh +12 -0
- package/examples/parallel-batch-size-limiter.sh +121 -0
- package/examples/parallel-cascade-detector.sh +116 -0
- package/examples/partial-view-claim-arrest.sh +174 -0
- package/examples/path-deny-bash-guard.sh +12 -0
- package/examples/path-traversal-guard.sh +12 -0
- package/examples/per-prompt-token-cap.sh +124 -0
- package/examples/permission-audit-log.sh +1 -1
- package/examples/permission-denial-enforcer.sh +12 -0
- package/examples/permission-entry-validator.sh +0 -0
- package/examples/persisted-1m-model-advisor.sh +88 -0
- package/examples/php-lint-on-edit.sh +1 -1
- package/examples/pii-upload-guard.sh +12 -0
- package/examples/pip-publish-guard.sh +13 -0
- package/examples/pip-requirements-guard.sh +12 -0
- package/examples/pip-venv-required.sh +12 -0
- package/examples/plan-mode-edit-guard.sh +12 -0
- package/examples/plan-mode-enforcer.sh +12 -0
- package/examples/plan-mode-strict-guard.sh +12 -0
- package/examples/plugin-hooks-json-bloat-detector.sh +169 -0
- package/examples/plugin-process-cleanup.sh +0 -0
- package/examples/polyglot-rm-guard.sh +12 -0
- package/examples/post-compact-safety.sh +12 -0
- package/examples/post-edit-disk-verify.sh +152 -0
- package/examples/powershell-remove-item-guard.sh +85 -0
- package/examples/pr-description-check.sh +0 -0
- package/examples/pr-duplicate-guard.sh +13 -0
- package/examples/pre-bash-sed-line-ending-windows.sh +87 -0
- package/examples/pre-compact-knowledge-save.sh +0 -0
- package/examples/pre-compact-transcript-backup.sh +0 -0
- package/examples/pre-execution-claim-detector.sh +179 -0
- package/examples/prefer-builtin-tools.sh +10 -1
- package/examples/prefer-const.sh +0 -0
- package/examples/prefer-dedicated-tools.sh +12 -0
- package/examples/prefer-optional-chaining.sh +0 -0
- package/examples/prisma-migrate-guard.sh +24 -7
- package/examples/production-port-kill-guard.sh +12 -0
- package/examples/prompt-injection-guard.sh +2 -1
- package/examples/prompt-usage-logger.sh +0 -0
- package/examples/protect-claudemd.sh +12 -0
- package/examples/protect-dotfiles.sh +12 -0
- package/examples/proxy-capture-suggester.sh +159 -0
- package/examples/public-artefact-socratic-narrowing.sh +232 -0
- package/examples/public-repo-push-guard.sh +12 -0
- package/examples/push-requires-test-pass-record.sh +0 -0
- package/examples/push-requires-test-pass.sh +12 -0
- package/examples/quota-anomaly-detector.sh +173 -0
- package/examples/quota-reset-audit.sh +58 -0
- package/examples/quoted-flag-approver.sh +99 -10
- package/examples/rails-migration-guard.sh +12 -0
- package/examples/rate-limit-guard.sh +0 -0
- package/examples/read-all-files-enforcer.sh +0 -0
- package/examples/read-budget-guard.sh +12 -0
- package/examples/read-loop-detector.sh +59 -0
- package/examples/read-once-guard.sh +96 -0
- package/examples/read-only-mode.sh +12 -0
- package/examples/readme-exists-check.sh +0 -0
- package/examples/record-read-coverage.sh +73 -0
- package/examples/redirect-fragment-warner.sh +149 -0
- package/examples/redis-flushall-guard.sh +13 -0
- package/examples/redundant-read-blocker.sh +132 -0
- package/examples/refusal-arrest-gate.sh +248 -0
- package/examples/registry-publish-guard.sh +13 -1
- package/examples/remote-control-billing-classifier.sh +135 -0
- package/examples/replace-all-guard.sh +12 -0
- package/examples/repo-visibility-guard.sh +12 -0
- package/examples/reroute-after-block-guard.sh +150 -0
- package/examples/response-budget-guard.sh +0 -0
- package/examples/resume-drift-watcher.sh +57 -0
- package/examples/rg-replace-flag-detector.sh +125 -0
- package/examples/rhetorical-verification-prompt-detector.sh +102 -0
- package/examples/ripgrep-permission-fix.sh +0 -0
- package/examples/rm-safety-net.sh +151 -8
- package/examples/role-tool-guard.sh +12 -0
- package/examples/route-handler-emptiness-gate.sh +324 -0
- package/examples/ruby-lint-on-edit.sh +1 -1
- package/examples/runtime-binary-change-detector.sh +102 -0
- package/examples/same-command-repeat-detector.sh +196 -0
- package/examples/same-correction-arrest.sh +169 -0
- package/examples/sandbox-denywrite-enforcer.sh +78 -0
- package/examples/sandbox-relative-path-audit.sh +83 -25
- package/examples/sandbox-write-verify.sh +12 -0
- package/examples/schema-migration-guard.sh +0 -0
- package/examples/scope-expansion-receipt.sh +178 -0
- package/examples/scope-guard.sh +88 -9
- package/examples/secret-file-read-guard.sh +12 -0
- package/examples/secret-file-write-guard.sh +150 -0
- package/examples/self-modify-bypass-guard.sh +0 -0
- package/examples/sensitive-file-read-guard.sh +23 -3
- package/examples/sensitive-log-guard.sh +1 -0
- package/examples/server-side-prompt-injection-detector.sh +69 -0
- package/examples/session-agent-cost-limiter.sh +12 -0
- package/examples/session-backup-on-start.sh +1 -1
- package/examples/session-cost-alert.sh +12 -0
- package/examples/session-drift-guard.sh +12 -0
- package/examples/session-duration-guard.sh +25 -2
- package/examples/session-end-logger.sh +0 -0
- package/examples/session-health-monitor.sh +0 -0
- package/examples/session-index-repair.sh +1 -1
- package/examples/session-memory-watchdog.sh +1 -0
- package/examples/session-permission-reset-guard.sh +12 -0
- package/examples/session-persistence-verifier.sh +93 -0
- package/examples/session-plugin-pin-watch.sh +68 -0
- package/examples/session-rate-monitor.sh +176 -0
- package/examples/session-resume-env-fix.sh +0 -0
- package/examples/session-start-quota-status.sh +193 -0
- package/examples/session-start-safety-check.sh +55 -3
- package/examples/session-state-saver.sh +0 -0
- package/examples/session-summary-stop.sh +1 -1
- package/examples/session-summary.sh +0 -0
- package/examples/session-token-counter.sh +1 -1
- package/examples/settings-hooks-key-restorer.sh +99 -0
- package/examples/settings-json-health-check.sh +57 -0
- package/examples/settings-json-model-guard.sh +0 -0
- package/examples/settings-regression-tester.sh +188 -0
- package/examples/shell-config-truncation-guard.sh +12 -0
- package/examples/shell-wrapper-guard.sh +12 -0
- package/examples/skill-cumulative-size-detector.sh +104 -0
- package/examples/skill-description-drop-detector.sh +148 -0
- package/examples/skill-gate.sh +0 -0
- package/examples/skill-truncation-detector.sh +154 -0
- package/examples/skills-context-recorder.sh +167 -0
- package/examples/skills-load-verifier.sh +96 -0
- package/examples/skills-settings-validator.sh +139 -0
- package/examples/sonnet-45-deprecation-helper.sh +85 -0
- package/examples/spec-file-scope-guard.sh +12 -0
- package/examples/spring-profile-guard.sh +1 -0
- package/examples/spurious-malformed-notice-detector.sh +247 -0
- package/examples/sql-bulk-delete-warn.sh +88 -0
- package/examples/sql-injection-detect.sh +0 -0
- package/examples/ssh-key-protect.sh +12 -0
- package/examples/staged-secret-scan.sh +22 -1
- package/examples/stale-temp-settings-detector.sh +86 -0
- package/examples/standing-rule-session-surfacer.sh +137 -0
- package/examples/stop-hook-sigterm-wrapper.sh +182 -0
- package/examples/stop-transcript-write-health.sh +64 -0
- package/examples/strict-allowlist.sh +57 -15
- package/examples/strip-coauthored-by.sh +50 -10
- package/examples/subagent-blast-radius-guard.sh +184 -0
- package/examples/subagent-boundary-precheck.sh +126 -0
- package/examples/subagent-budget-guard.sh +12 -0
- package/examples/subagent-claudemd-inject.sh +0 -0
- package/examples/subagent-closure-verify-gate.sh +164 -0
- package/examples/subagent-destructive-git-guard.sh +120 -0
- package/examples/subagent-error-detector.sh +0 -0
- package/examples/subagent-forged-system-reminder-guard.sh +156 -0
- package/examples/subagent-identity-leak-guard.sh +102 -0
- package/examples/subagent-identity-reassertion.sh +51 -0
- package/examples/subagent-inheritance-tester.sh +179 -0
- package/examples/subagent-permission-mode-guard.sh +110 -0
- package/examples/subagent-scope-guard.sh +12 -0
- package/examples/subagent-spawn-verification-enforcer.sh +102 -0
- package/examples/subagent-tool-allowlist-enforcer.sh +101 -0
- package/examples/subagent-tool-call-limiter.sh +87 -15
- package/examples/subcommand-chain-guard.sh +12 -0
- package/examples/subscription-api-billing-warner.sh +160 -0
- package/examples/subscription-bypass-detector.sh +152 -0
- package/examples/svelte-lint-on-edit.sh +1 -0
- package/examples/swift-build-on-edit.sh +1 -1
- package/examples/symlink-guard.sh +27 -2
- package/examples/symlink-protect.sh +1 -0
- package/examples/system-dir-protection-guard.sh +73 -8
- package/examples/system-message-workaround.sh +38 -13
- package/examples/system-package-guard.sh +12 -0
- package/examples/systemd-service-guard.sh +12 -0
- package/examples/task-integrity-guard.sh +12 -0
- package/examples/temp-file-cleanup.sh +1 -1
- package/examples/temporal-suggestion-detector.sh +135 -0
- package/examples/terraform-guard.sh +27 -6
- package/examples/test-after-edit.sh +1 -1
- package/examples/test-before-push.sh +12 -0
- package/examples/test-coverage-reminder.sh +24 -1
- package/examples/thinking-budget-effort-mismatch-detector.sh +149 -0
- package/examples/timezone-guard.sh +0 -0
- package/examples/tmp-output-size-guard.sh +0 -0
- package/examples/todo-check.sh +1 -1
- package/examples/token-budget-guard.sh +12 -0
- package/examples/token-budget-per-task.sh +12 -0
- package/examples/token-usage-tracker.sh +7 -1
- package/examples/tokenizer-ratio-alert-corpus.sh +90 -0
- package/examples/tokenizer-ratio-alert.sh +104 -0
- package/examples/tool-call-rate-limiter.sh +0 -0
- package/examples/tool-result-correlation-checker.sh +167 -0
- package/examples/tool-result-size-guard.sh +132 -0
- package/examples/tool-retry-budget-guard.sh +12 -0
- package/examples/transcript-contamination-detector.sh +138 -0
- package/examples/trustfall-mcp-injection-guard.sh +103 -0
- package/examples/ultrareview-large-diff-advisor.sh +184 -0
- package/examples/unbounded-output-guard.sh +94 -0
- package/examples/uncommitted-changes-stop.sh +1 -0
- package/examples/uncommitted-discard-guard.sh +23 -5
- package/examples/uncommitted-work-guard.sh +12 -0
- package/examples/usage-warn.sh +0 -0
- package/examples/user-account-guard.sh +12 -0
- package/examples/userprompt-submit-receipt.sh +123 -0
- package/examples/variable-expansion-guard.sh +12 -0
- package/examples/verify-after-publish-reminder.sh +93 -0
- package/examples/verify-before-commit.sh +12 -0
- package/examples/version-bump-detector.sh +156 -0
- package/examples/version-regression-warner.sh +144 -0
- package/examples/vue-lint-on-edit.sh +1 -0
- package/examples/warn-cron-cost-trap.sh +173 -0
- package/examples/webfetch-runaway-guard.sh +89 -0
- package/examples/wellness-break-reminder.sh +118 -0
- package/examples/windows-destructive-command-guard.sh +177 -0
- package/examples/windows-path-guard.sh +12 -0
- package/examples/windows-python-stub-detector.sh +63 -0
- package/examples/work-hours-guard.sh +12 -0
- package/examples/working-directory-fence.sh +12 -0
- package/examples/workspace-lease-guard.sh +205 -0
- package/examples/worktree-create-log.sh +1 -0
- package/examples/worktree-delete-guard.sh +12 -0
- package/examples/worktree-edit-boundary-guard.sh +127 -0
- package/examples/worktree-escape-write-guard.sh +114 -0
- package/examples/worktree-hook-linker.sh +0 -0
- package/examples/worktree-hooks-path-fix.sh +111 -0
- package/examples/worktree-parent-write-guard.sh +43 -0
- package/examples/worktree-project-unify.sh +2 -1
- package/examples/worktree-remove-uncommitted-guard.sh +13 -0
- package/examples/worktree-unmerged-guard.sh +7 -1
- package/examples/write-byte-integrity-verifier.sh +190 -0
- package/examples/write-empty-content-guard.sh +67 -0
- package/examples/write-nul-corruption-detector.sh +61 -0
- package/examples/write-overwrite-confirm.sh +160 -14
- package/examples/write-secret-guard.sh +27 -5
- package/examples/write-shrink-guard.sh +12 -0
- package/examples/write-test-ratio.sh +0 -0
- package/examples/wsl-host-disk-space-guard.sh +97 -0
- package/examples/xml-format-leak-detector.sh +266 -0
- package/examples/yaml-syntax-check.sh +12 -0
- package/hooks/hooks.json +6 -6
- package/index.mjs +1718 -183
- package/mission.md +2 -0
- package/package.json +4 -4
- package/plugins/credential-guard/.claude-plugin/plugin.json +9 -7
- package/plugins/git-protection/.claude-plugin/plugin.json +10 -8
- package/plugins/safety-essentials/.claude-plugin/plugin.json +9 -7
- package/plugins/token-guard/.claude-plugin/plugin.json +10 -8
- package/scripts/agents-md-sync-setup.sh +156 -0
- package/scripts/autonomy-blocked-summary.sh +148 -0
- package/scripts/build-search-index.py +43 -0
- package/scripts/build-sitemap.py +119 -0
- package/scripts/cc-doctor.sh +192 -0
- package/scripts/check-hook-event-names.py +127 -0
- package/scripts/check-misfire-instrument.sh +64 -0
- package/scripts/claim-verify-audit.sh +467 -0
- package/scripts/cowork-claudemd-helper.sh +136 -0
- package/scripts/june-15-deprecated-model-scan.sh +111 -0
- package/scripts/measure-heredoc-shapes.sh +67 -0
- package/scripts/measure-literal-match-misfire.sh +110 -0
- package/scripts/probe-scope-guard-branches.sh +48 -0
- package/scripts/probe-skip-line-both-ways.sh +65 -0
- package/scripts/receipts-aggregate.py +199 -0
- package/scripts/session-forensic-audit.py +360 -0
- package/scripts.json +9 -9
- package/scripts.json.bak-2026-07-27-find +13 -0
- package/skills/safety-setup/SKILL.md +5 -5
- package/tests/approve-side-remaining-two.test.sh +129 -0
- package/tests/approver-list-granularity.test.sh +145 -0
- package/tests/askuserquestion-autonomy-gate.test.sh +181 -0
- package/tests/audit-ci-gate.test.sh +87 -0
- package/tests/audit-cross-layer-claudemd.test.sh +170 -0
- package/tests/audit-fail-open-parse.test.sh +100 -0
- package/tests/auto-approve-compound-tail.test.sh +194 -0
- package/tests/auto-mode-path-invoked-commands.test.sh +89 -0
- package/tests/auto-mode-quoted-targets.test.sh +127 -0
- package/tests/auto-mode-unquoted-targets.test.sh +112 -0
- package/tests/bash-secret-output-detector-detects.test.sh +102 -0
- package/tests/blindspots-cross-layer.test.sh +177 -0
- package/tests/block-database-wipe.test.sh +64 -0
- package/tests/bundled-short-flags-bypass.test.sh +85 -0
- package/tests/cd-git-allow-compound-tail.test.sh +67 -0
- package/tests/chown-guard-filesystem-root.test.sh +64 -0
- package/tests/ci-workflow-guard-skip-rule.test.sh +115 -0
- package/tests/compound-deny-safe-rm-targets.test.sh +105 -0
- package/tests/core-scripts-parser-fallback.test.sh +140 -0
- package/tests/destructive-guard-bare-glob.test.sh +74 -0
- package/tests/destructive-guard-every-operand.test.sh +100 -0
- package/tests/destructive-guard-find-deletion.test.sh +114 -0
- package/tests/destructive-guard-flag-order.test.sh +106 -0
- package/tests/destructive-guard-mentions-vs-invocations.test.sh +107 -0
- package/tests/destructive-guard-quoted-target.test.sh +89 -0
- package/tests/destructive-guard-separators.test.sh +105 -0
- package/tests/destructive-guard-variable-target.test.sh +98 -0
- package/tests/destructive-guard-wrapped-command.test.sh +91 -0
- package/tests/doctor-hook-disabling-env.test.sh +92 -0
- package/tests/doctor-misspelled-settings-keys.test.sh +106 -0
- package/tests/example-guards-wrapped-command.test.sh +169 -0
- package/tests/file-edit-backup.test.sh +93 -0
- package/tests/git-filter-repo-guard.test.sh +60 -0
- package/tests/git-global-options-bypass.test.sh +141 -0
- package/tests/git-invocation-prefixes-all-guards.test.sh +114 -0
- package/tests/git-maintenance-guard.test.sh +83 -0
- package/tests/git-pack-temp-cleanup-guard.test.sh +133 -0
- package/tests/git-rm-orphan-wipe-guard.test.sh +66 -0
- package/tests/git-submodule-guard.test.sh +50 -0
- package/tests/grep-pcre-portability.test.sh +155 -0
- package/tests/hook-registration-matches-input.test.sh +73 -0
- package/tests/hook-trigger-matches-envelope.test.sh +178 -0
- package/tests/install-does-not-claim-protection.test.sh +110 -0
- package/tests/install-example-standalone-tools.test.sh +139 -0
- package/tests/line-continuation-bypass.test.sh +114 -0
- package/tests/mcp-config-poisoning-audit.test.sh +106 -0
- package/tests/nested-background-agent-guard.test.sh +58 -0
- package/tests/no-unqualified-safety-claims.test.sh +114 -0
- package/tests/option-eating-grep-patterns.test.sh +130 -0
- package/tests/outdated-core-guards.test.sh +134 -0
- package/tests/outdated-report.test.sh +155 -0
- package/tests/output-secret-mask-warns.test.sh +73 -0
- package/tests/plugin-hooks-fail-open-under-sh.test.sh +165 -0
- package/tests/plugins-word-order.test.sh +126 -0
- package/tests/powershell-remove-item-guard.test.sh +85 -0
- package/tests/project-dir-naming.test.sh +103 -0
- package/tests/quoted-safe-targets-and-mentions.test.sh +190 -0
- package/tests/reroute-after-block-guard.test.sh +104 -0
- package/tests/secret-guard-documented-promises.test.sh +97 -0
- package/tests/session-plugin-pin-watch.test.sh +45 -0
- package/tests/settings-unreadable-refuses-to-write.test.sh +95 -0
- package/tests/shield-no-silent-adoption.test.py +110 -0
- package/tests/shield-no-silent-adoption.test.sh +46 -0
- package/tests/stop-transcript-write-health.test.sh +46 -0
- package/tests/system-dir-guard-root-erased.test.sh +66 -0
- package/tests/test-account-billing-log.sh +100 -0
- package/tests/test-account-routing-preflight.sh +77 -0
- package/tests/test-agent-sdk-credit-pool-monitor.sh +157 -0
- package/tests/test-agent-view-quota-warn.sh +184 -0
- package/tests/test-agents-md-edit-drift-warner.sh +176 -0
- package/tests/test-agents-md-loader.sh +204 -0
- package/tests/test-agents-md-sync-checker.sh +125 -0
- package/tests/test-ai-slop-punctuation-arrest.sh +280 -0
- package/tests/test-allowlist.sh +60 -0
- package/tests/test-always-allow-pattern-suggester.sh +147 -0
- package/tests/test-anthropic-base-url-guard.sh +88 -0
- package/tests/test-articulated-scope-capture.sh +139 -0
- package/tests/test-attachment-traversal-guard.sh +168 -0
- package/tests/test-aup-block-pattern-logger.sh +315 -0
- package/tests/test-aup-false-positive-helper.sh +188 -0
- package/tests/test-aup-large-tool-output-warner.sh +370 -0
- package/tests/test-aup-retry-loop-guard.sh +341 -0
- package/tests/test-auth-expiry-reminder.sh +303 -0
- package/tests/test-auth-macos-sleep-detector.sh +254 -0
- package/tests/test-auth-path-detector.sh +232 -0
- package/tests/test-auth-status-checker.sh +233 -0
- package/tests/test-authorized-reconfirmation-detector.sh +280 -0
- package/tests/test-background-cost-launch-guard.sh +62 -0
- package/tests/test-bash-allowlist-secondary-check.sh +143 -0
- package/tests/test-bash-fanout-bounded-rewriter.sh +186 -0
- package/tests/test-bash-project-fence.sh +127 -0
- package/tests/test-bg-permission-prompt-warner.sh +221 -0
- package/tests/test-binary-read-detector.sh +173 -0
- package/tests/test-broad-prefix-session-trap-warner.sh +167 -0
- package/tests/test-bulk-delete-target-resolution.sh +49 -0
- package/tests/test-bypass-mode-effective-verifier.sh +179 -0
- package/tests/test-cache-creation-drift-detector.sh +244 -0
- package/tests/test-cache-residue-detector.sh +429 -0
- package/tests/test-cache-tier-logger.sh +59 -0
- package/tests/test-cache-ttl-eviction-detector.sh +282 -0
- package/tests/test-cch-sentinel-precommit-guard.sh +64 -0
- package/tests/test-claim-verify-detector.sh +222 -0
- package/tests/test-claim-vs-caveat-checker.sh +134 -0
- package/tests/test-claude-code-version-pin-advisor.sh +353 -0
- package/tests/test-claude-md-reinjector.sh +173 -0
- package/tests/test-claude-md-size-monitor.sh +107 -0
- package/tests/test-claude-update-budget-guard.sh +132 -0
- package/tests/test-claude-update-smart.sh +91 -0
- package/tests/test-claudemd-tool-prohibition.sh +239 -0
- package/tests/test-cli-config-pinning-detector.sh +233 -0
- package/tests/test-cliff-countdown-advisor.sh +138 -0
- package/tests/test-closure-word-verify-gate.sh +158 -0
- package/tests/test-commit-all-scope-guard.sh +73 -0
- package/tests/test-commitment-carry-forward-arrest.sh +250 -0
- package/tests/test-compact-dispatch-watchdog.sh +147 -0
- package/tests/test-completion-claim-without-verification-detector.sh +326 -0
- package/tests/test-compound-bash-permission-resolver.sh +264 -0
- package/tests/test-compound-command-deny-enforcer.sh +67 -0
- package/tests/test-context-length-budget.sh +68 -0
- package/tests/test-context-usage-drift-alert.sh +52 -22
- package/tests/test-cost-incident-self-audit.sh +94 -0
- package/tests/test-cowork-claude-md-load-checker.sh +257 -0
- package/tests/test-cowork-claudemd-helper.sh +141 -0
- package/tests/test-cowork-fuse-staleness-watcher.sh +287 -0
- package/tests/test-cowork-hook-absence-warner.sh +230 -0
- package/tests/test-cowork-model-picker-advisor.sh +317 -0
- package/tests/test-credential-exfil-guard.sh +62 -0
- package/tests/test-cron-create-receipt.sh +165 -0
- package/tests/test-cross-product-mcp-spawn-detector.sh +112 -0
- package/tests/test-daemon-zombie-worker-surfacer.sh +71 -0
- package/tests/test-daily-cost-guard.sh +131 -0
- package/tests/test-deny-rule-integrity-verifier.sh +288 -0
- package/tests/test-deployment-readback-gate.sh +92 -0
- package/tests/test-deployment-readback-gh-adapter.sh +163 -0
- package/tests/test-disabled-feature-toggle-advisor.sh +78 -0
- package/tests/test-dispatch-allowlist-preflight.sh +385 -0
- package/tests/test-dispatch-liveness-watchdog.sh +319 -0
- package/tests/test-dispatch-receipt.sh +314 -0
- package/tests/test-dotenv-anthropic-key-billing-guard.sh +160 -0
- package/tests/test-echo-probe-spam-detector.sh +143 -0
- package/tests/test-edit-quote-ambiguity-guard.sh +75 -0
- package/tests/test-ephemeral-container-detector.sh +251 -0
- package/tests/test-evidence-claim-gate.sh +291 -0
- package/tests/test-extended-thinking-loop-guard.sh +289 -0
- package/tests/test-extended-thinking-resume-warning.sh +240 -0
- package/tests/test-extended-thinking-tool-use-mismatch-detector.sh +236 -0
- package/tests/test-fabricated-command-detector.sh +296 -0
- package/tests/test-false-disk-full-guard.sh +36 -0
- package/tests/test-feature-deprecation-detector.sh +117 -0
- package/tests/test-forbidden-response-phrase-detector.sh +246 -0
- package/tests/test-git-operations-require-approval.sh +53 -0
- package/tests/test-git-push-blast-radius-guard.sh +115 -0
- package/tests/test-goal-iteration-limit-warner.sh +128 -0
- package/tests/test-growthbook-flag-monitor.sh +428 -0
- package/tests/test-halt-signal-detector.sh +120 -0
- package/tests/test-hook-self-disable-detector.sh +232 -0
- package/tests/test-iteration-quality-degradation-detector.sh +244 -0
- package/tests/test-long-session-malformed-tool-call-detector.sh +185 -0
- package/tests/test-marketplace-plugins.sh +193 -0
- package/tests/test-mcp-misdiagnosis-arrest.sh +235 -0
- package/tests/test-mcp-orphan-leak-warner.sh +71 -0
- package/tests/test-mcp-permissions-ask-warner.sh +207 -0
- package/tests/test-mcp-routine-approval-detector.sh +229 -0
- package/tests/test-mcp-startup-bloat-detector.sh +141 -0
- package/tests/test-mcp-stdio-compatibility-test.sh +112 -0
- package/tests/test-memory-chain-audit.sh +59 -0
- package/tests/test-memory-orphan-detector.sh +227 -0
- package/tests/test-model-swap-suggester.sh +368 -0
- package/tests/test-model-version-lock.sh +83 -0
- package/tests/test-multi-file-plan-routing-gate.sh +277 -0
- package/tests/test-multi-window-auth-drift-detector.sh +262 -0
- package/tests/test-nested-spawn-inflight-guard.sh +281 -0
- package/tests/test-no-force-flag.sh +49 -0
- package/tests/test-non-english-quality-warner.sh +229 -0
- package/tests/test-oauth-refresh-monitor.sh +311 -0
- package/tests/test-opus-degradation-tracker.sh +274 -0
- package/tests/test-opus48-routine-task-warning.sh +201 -0
- package/tests/test-opus48-thinking-wedge-advisor.sh +249 -0
- package/tests/test-output-token-spike-detector.sh +315 -0
- package/tests/test-parallel-batch-size-limiter.sh +228 -0
- package/tests/test-parallel-cascade-detector.sh +191 -0
- package/tests/test-partial-view-claim-arrest.sh +272 -0
- package/tests/test-per-prompt-token-cap.sh +136 -0
- package/tests/test-persisted-1m-model-advisor.sh +71 -0
- package/tests/test-plugin-hooks-json-bloat-detector.sh +267 -0
- package/tests/test-post-edit-disk-verify.sh +294 -0
- package/tests/test-pre-bash-sed-line-ending-windows.sh +108 -0
- package/tests/test-pre-execution-claim-detector.sh +366 -0
- package/tests/test-private-key-backup-and-git-credentials.sh +100 -0
- package/tests/test-proxy-capture-suggester.sh +214 -0
- package/tests/test-public-artefact-socratic-narrowing.sh +346 -0
- package/tests/test-quota-anomaly-detector.sh +321 -0
- package/tests/test-quota-reset-audit.sh +81 -0
- package/tests/test-read-loop-detector.sh +137 -0
- package/tests/test-read-once-guard.sh +85 -0
- package/tests/test-receipts-aggregate.sh +143 -0
- package/tests/test-redirect-fragment-warner.sh +130 -0
- package/tests/test-redundant-read-blocker.sh +155 -0
- package/tests/test-refusal-arrest-gate.sh +303 -0
- package/tests/test-remote-control-billing-classifier.sh +125 -0
- package/tests/test-resume-drift-watcher.sh +65 -0
- package/tests/test-rg-replace-flag-detector.sh +175 -0
- package/tests/test-rhetorical-verification-prompt-detector.sh +237 -0
- package/tests/test-rm-safety-net.sh +115 -0
- package/tests/test-route-handler-emptiness-gate.sh +300 -0
- package/tests/test-runtime-binary-change-detector.sh +196 -0
- package/tests/test-same-command-repeat-detector.sh +165 -0
- package/tests/test-same-correction-arrest.sh +165 -0
- package/tests/test-scope-expansion-receipt.sh +207 -0
- package/tests/test-server-side-prompt-injection-detector.sh +181 -0
- package/tests/test-session-persistence-verifier.sh +128 -0
- package/tests/test-session-rate-monitor.sh +284 -0
- package/tests/test-session-start-quota-status.sh +210 -0
- package/tests/test-session-start-safety-check.sh +138 -0
- package/tests/test-settings-hooks-key-restorer.sh +257 -0
- package/tests/test-settings-json-health-check.sh +70 -0
- package/tests/test-settings-regression-tester.sh +197 -0
- package/tests/test-skill-cumulative-size-detector.sh +198 -0
- package/tests/test-skill-description-drop-detector.sh +236 -0
- package/tests/test-skill-truncation-detector.sh +263 -0
- package/tests/test-skills-context-recorder.sh +329 -0
- package/tests/test-skills-load-verifier.sh +184 -0
- package/tests/test-skills-settings-validator.sh +242 -0
- package/tests/test-sonnet-45-deprecation-helper.sh +150 -0
- package/tests/test-spurious-malformed-notice-detector.sh +290 -0
- package/tests/test-sql-bulk-delete-warn.sh +123 -0
- package/tests/test-ssh-key-protect.sh +81 -0
- package/tests/test-stale-temp-settings-detector.sh +161 -0
- package/tests/test-standing-rule-session-surfacer.sh +215 -0
- package/tests/test-starter-hooks-manifest.sh +96 -0
- package/tests/test-stop-hook-sigterm-wrapper.sh +258 -0
- package/tests/test-strict-allowlist.sh +72 -0
- package/tests/test-subagent-boundary-precheck.sh +137 -0
- package/tests/test-subagent-closure-verify-gate.sh +193 -0
- package/tests/test-subagent-destructive-git-guard.sh +86 -0
- package/tests/test-subagent-identity-leak-guard.sh +62 -0
- package/tests/test-subagent-identity-reassertion.sh +61 -0
- package/tests/test-subagent-inheritance-tester.sh +319 -0
- package/tests/test-subagent-permission-mode-guard.sh +61 -0
- package/tests/test-subagent-spawn-verification-enforcer.sh +60 -0
- package/tests/test-subagent-tool-allowlist-enforcer.sh +62 -0
- package/tests/test-subagent-tool-call-limiter.sh +97 -0
- package/tests/test-subscription-api-billing-warner.sh +138 -0
- package/tests/test-subscription-bypass-detector.sh +255 -0
- package/tests/test-temporal-suggestion-detector.sh +183 -0
- package/tests/test-thinking-budget-effort-mismatch-detector.sh +327 -0
- package/tests/test-tokenizer-ratio-alert-corpus.sh +77 -0
- package/tests/test-tokenizer-ratio-alert.sh +93 -0
- package/tests/test-tool-result-correlation-checker.sh +264 -0
- package/tests/test-tool-result-size-guard.sh +121 -0
- package/tests/test-transcript-contamination-detector.sh +264 -0
- package/tests/test-trigger-header-parsing.sh +151 -0
- package/tests/test-ultrareview-large-diff-advisor.sh +192 -0
- package/tests/test-userprompt-submit-receipt.sh +181 -0
- package/tests/test-verify-after-publish-reminder.sh +184 -0
- package/tests/test-version-bump-detector.sh +212 -0
- package/tests/test-version-regression-warner.sh +165 -0
- package/tests/test-warn-cron-cost-trap.sh +82 -0
- package/tests/test-webfetch-runaway-guard.sh +77 -0
- package/tests/test-wellness-break-reminder.sh +138 -0
- package/tests/test-windows-destructive-command-guard.sh +169 -0
- package/tests/test-windows-python-stub-detector.sh +146 -0
- package/tests/test-worktree-edit-boundary-guard.sh +219 -0
- package/tests/test-write-byte-integrity-verifier.sh +192 -0
- package/tests/test-xml-format-leak-detector.sh +299 -0
- package/tests/trustfall-mcp-injection-guard.test.sh +183 -0
- package/tests/workspace-lease-guard.test.sh +144 -0
- package/tests/worktree-escape-write-guard.test.sh +68 -0
- package/tests/worktree-hooks-path-fix.test.sh +181 -0
- package/tests/worktree-parent-write-guard.test.sh +51 -0
- package/tests/write-empty-content-guard.test.sh +39 -0
- package/tests/write-nul-corruption-detector.test.sh +29 -0
- package/tests/write-overwrite-unread-content.test.sh +178 -0
- package/tests/wsl-host-disk-space-guard.test.sh +55 -0
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ================================================================
|
|
3
|
+
# agents-md-edit-drift-warner.sh — Warn at the moment CLAUDE.md (or
|
|
4
|
+
# AGENTS.md) is edited that the sibling instruction file is now
|
|
5
|
+
# stale. Complements the SessionStart-only agents-md-sync-checker
|
|
6
|
+
# (PR #377) with a PostToolUse signal at the actual drift event.
|
|
7
|
+
# ================================================================
|
|
8
|
+
# PURPOSE:
|
|
9
|
+
# anthropics/claude-code#6235 (5,233 reactions, 13+ months open,
|
|
10
|
+
# the largest single feature request in the Claude Code tracker)
|
|
11
|
+
# asks Claude Code to read AGENTS.md as a fallback to CLAUDE.md.
|
|
12
|
+
# The companion SessionStart hook agents-md-sync-checker (PR
|
|
13
|
+
# #377) detects drift at the start of a session — but the
|
|
14
|
+
# actionable moment is the edit itself. By the time the next
|
|
15
|
+
# session starts the operator has often moved on; an in-the-loop
|
|
16
|
+
# warning at the moment of the edit is the cheapest correction
|
|
17
|
+
# point.
|
|
18
|
+
#
|
|
19
|
+
# This PostToolUse hook fires on Edit and Write tool calls whose
|
|
20
|
+
# file_path resolves to one of the candidate instruction files
|
|
21
|
+
# (CLAUDE.md, AGENTS.md, .claude/CLAUDE.md, .agents/AGENTS.md).
|
|
22
|
+
# It then checks whether the sibling file exists and emits a
|
|
23
|
+
# one-screen advisory naming the edit and the sibling that now
|
|
24
|
+
# needs reconciliation.
|
|
25
|
+
#
|
|
26
|
+
# TRIGGER: PostToolUse MATCHER: "Edit|Write|MultiEdit"
|
|
27
|
+
# CLUSTER: 3 (AGENTS.md interop)
|
|
28
|
+
# COMPANION HOOK: agents-md-sync-checker.sh (SessionStart, PR #377)
|
|
29
|
+
#
|
|
30
|
+
# DETECTION LOGIC:
|
|
31
|
+
# 1. Read tool name and tool_input.file_path from PostToolUse
|
|
32
|
+
# hook input.
|
|
33
|
+
# 2. If the tool is not Edit / Write / MultiEdit, exit silent.
|
|
34
|
+
# 3. If the file_path basename is not in the instruction-file
|
|
35
|
+
# candidate set, exit silent.
|
|
36
|
+
# 4. Determine which instruction file was edited
|
|
37
|
+
# (CLAUDE.md or AGENTS.md).
|
|
38
|
+
# 5. Locate the sibling instruction file in the same directory
|
|
39
|
+
# or in the standard sibling-directory location
|
|
40
|
+
# (.claude/CLAUDE.md ↔ .agents/AGENTS.md).
|
|
41
|
+
# 6. If the sibling exists and is not the same inode (i.e. not
|
|
42
|
+
# a symlink to the same file), emit a warning. If the sibling
|
|
43
|
+
# is symlinked to this file, no drift is possible — exit
|
|
44
|
+
# silent.
|
|
45
|
+
# 7. If the sibling does not exist, emit a softer note: the
|
|
46
|
+
# sibling-tool agent (Codex / Cursor / Amp / etc., or Claude
|
|
47
|
+
# Code itself depending on direction) will run without these
|
|
48
|
+
# instructions until the sibling is created.
|
|
49
|
+
#
|
|
50
|
+
# CONFIGURATION (env vars):
|
|
51
|
+
# CC_AGENTS_MD_DRIFT_WARN_DISABLE Set to "1" to silence.
|
|
52
|
+
# CC_AGENTS_MD_DRIFT_WARN_QUIET Set to "1" to suppress the
|
|
53
|
+
# verbose advisory and emit
|
|
54
|
+
# only the one-line state.
|
|
55
|
+
#
|
|
56
|
+
# UPSTREAM REFERENCES:
|
|
57
|
+
# #6235 (5,233 reactions, the central feature request)
|
|
58
|
+
# #31005 (community plea, six issues, 7-month silence)
|
|
59
|
+
# #34235, #62371, #53223 (sibling angles)
|
|
60
|
+
#
|
|
61
|
+
# WHY POSTTOOLUSE, NOT PRETOOLUSE:
|
|
62
|
+
# PreToolUse would block the edit until the operator reconciles,
|
|
63
|
+
# which is wrong for this cluster — the operator is intentionally
|
|
64
|
+
# editing the file and the sibling is meant to track the edit.
|
|
65
|
+
# PostToolUse fires after the edit lands and surfaces the
|
|
66
|
+
# sibling-file gap so the operator can decide whether to mirror
|
|
67
|
+
# the change now or defer it. The hook never blocks; it advises.
|
|
68
|
+
# ================================================================
|
|
69
|
+
|
|
70
|
+
set -u
|
|
71
|
+
|
|
72
|
+
if [ "${CC_AGENTS_MD_DRIFT_WARN_DISABLE:-0}" = "1" ]; then
|
|
73
|
+
exit 0
|
|
74
|
+
fi
|
|
75
|
+
|
|
76
|
+
QUIET="${CC_AGENTS_MD_DRIFT_WARN_QUIET:-0}"
|
|
77
|
+
|
|
78
|
+
INPUT=$(cat 2>/dev/null || true)
|
|
79
|
+
if [ -z "$INPUT" ]; then
|
|
80
|
+
exit 0
|
|
81
|
+
fi
|
|
82
|
+
|
|
83
|
+
TOOL_NAME=$(printf '%s' "$INPUT" | jq -r '.tool_name // .tool_input.tool_name // empty' 2>/dev/null)
|
|
84
|
+
FILE_PATH=$(printf '%s' "$INPUT" | jq -r '.tool_input.file_path // empty' 2>/dev/null)
|
|
85
|
+
|
|
86
|
+
if [ -z "$TOOL_NAME" ] || [ -z "$FILE_PATH" ]; then
|
|
87
|
+
exit 0
|
|
88
|
+
fi
|
|
89
|
+
|
|
90
|
+
# Only fire on file-modifying tool families.
|
|
91
|
+
case "$TOOL_NAME" in
|
|
92
|
+
Edit|Write|MultiEdit) ;;
|
|
93
|
+
*) exit 0 ;;
|
|
94
|
+
esac
|
|
95
|
+
|
|
96
|
+
BASENAME=$(basename "$FILE_PATH")
|
|
97
|
+
|
|
98
|
+
# Only fire on the instruction-file candidates.
|
|
99
|
+
case "$BASENAME" in
|
|
100
|
+
CLAUDE.md|AGENTS.md) ;;
|
|
101
|
+
*) exit 0 ;;
|
|
102
|
+
esac
|
|
103
|
+
|
|
104
|
+
DIR=$(dirname "$FILE_PATH")
|
|
105
|
+
|
|
106
|
+
# Determine the sibling basename.
|
|
107
|
+
if [ "$BASENAME" = "CLAUDE.md" ]; then
|
|
108
|
+
SIBLING_BASENAME="AGENTS.md"
|
|
109
|
+
EDITED_TOOL="Claude Code"
|
|
110
|
+
SIBLING_TOOLS="Codex / Cursor / Amp / Copilot / Aider / etc."
|
|
111
|
+
else
|
|
112
|
+
SIBLING_BASENAME="CLAUDE.md"
|
|
113
|
+
EDITED_TOOL="Codex / Cursor / Amp / Copilot / Aider / etc."
|
|
114
|
+
SIBLING_TOOLS="Claude Code"
|
|
115
|
+
fi
|
|
116
|
+
|
|
117
|
+
# Look for the sibling in the same directory first.
|
|
118
|
+
SIBLING_PATH="${DIR}/${SIBLING_BASENAME}"
|
|
119
|
+
|
|
120
|
+
# If the sibling is not in the same directory, also check the
|
|
121
|
+
# cross-mounted standard location (.claude/CLAUDE.md ↔
|
|
122
|
+
# .agents/AGENTS.md).
|
|
123
|
+
SIBLING_EXISTS=0
|
|
124
|
+
if [ -f "$SIBLING_PATH" ]; then
|
|
125
|
+
SIBLING_EXISTS=1
|
|
126
|
+
fi
|
|
127
|
+
|
|
128
|
+
if [ "$SIBLING_EXISTS" = "0" ]; then
|
|
129
|
+
ALT_PATH=""
|
|
130
|
+
case "$FILE_PATH" in
|
|
131
|
+
*/.claude/CLAUDE.md)
|
|
132
|
+
ALT_PATH="${FILE_PATH%/.claude/CLAUDE.md}/.agents/AGENTS.md"
|
|
133
|
+
;;
|
|
134
|
+
*/.agents/AGENTS.md)
|
|
135
|
+
ALT_PATH="${FILE_PATH%/.agents/AGENTS.md}/.claude/CLAUDE.md"
|
|
136
|
+
;;
|
|
137
|
+
esac
|
|
138
|
+
if [ -n "$ALT_PATH" ] && [ -f "$ALT_PATH" ]; then
|
|
139
|
+
SIBLING_PATH="$ALT_PATH"
|
|
140
|
+
SIBLING_EXISTS=1
|
|
141
|
+
fi
|
|
142
|
+
fi
|
|
143
|
+
|
|
144
|
+
# If the sibling does not exist anywhere we recognize, emit a
|
|
145
|
+
# softer note about the sibling tool running without instructions.
|
|
146
|
+
if [ "$SIBLING_EXISTS" = "0" ]; then
|
|
147
|
+
cat >&2 <<EOF
|
|
148
|
+
|
|
149
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
150
|
+
[agents-md-edit-drift-warner] Edited: ${FILE_PATH}
|
|
151
|
+
No sibling ${SIBLING_BASENAME} found in this directory.
|
|
152
|
+
${SIBLING_TOOLS} will read no project instructions for this repo
|
|
153
|
+
unless you create ${DIR}/${SIBLING_BASENAME}.
|
|
154
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
155
|
+
|
|
156
|
+
EOF
|
|
157
|
+
exit 0
|
|
158
|
+
fi
|
|
159
|
+
|
|
160
|
+
# If the sibling exists and is the same inode (symlink), no drift
|
|
161
|
+
# is possible — exit silent.
|
|
162
|
+
if [ "$SIBLING_PATH" -ef "$FILE_PATH" ]; then
|
|
163
|
+
exit 0
|
|
164
|
+
fi
|
|
165
|
+
|
|
166
|
+
# If the two files are byte-identical right now, the edit may have
|
|
167
|
+
# just brought them in sync (or they were synced before and the
|
|
168
|
+
# edit was idempotent). Either way, no warning needed.
|
|
169
|
+
if cmp -s "$FILE_PATH" "$SIBLING_PATH" 2>/dev/null; then
|
|
170
|
+
exit 0
|
|
171
|
+
fi
|
|
172
|
+
|
|
173
|
+
# Sibling exists, different content. Emit the drift warning.
|
|
174
|
+
EDITED_SIZE=$(wc -c < "$FILE_PATH" 2>/dev/null || echo 0)
|
|
175
|
+
SIBLING_SIZE=$(wc -c < "$SIBLING_PATH" 2>/dev/null || echo 0)
|
|
176
|
+
|
|
177
|
+
if [ "$QUIET" = "1" ]; then
|
|
178
|
+
echo "[agents-md-edit-drift-warner] Drift: ${BASENAME} edited; ${SIBLING_BASENAME} now stale." >&2
|
|
179
|
+
exit 0
|
|
180
|
+
fi
|
|
181
|
+
|
|
182
|
+
cat >&2 <<EOF
|
|
183
|
+
|
|
184
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
185
|
+
[agents-md-edit-drift-warner] Drift detected at edit time
|
|
186
|
+
|
|
187
|
+
Edited: ${FILE_PATH} (${EDITED_SIZE} bytes)
|
|
188
|
+
Sibling: ${SIBLING_PATH} (${SIBLING_SIZE} bytes, NOT updated)
|
|
189
|
+
|
|
190
|
+
The sibling instruction file did not receive this edit. The next
|
|
191
|
+
session of ${SIBLING_TOOLS} will read the older ${SIBLING_BASENAME}
|
|
192
|
+
rather than what ${EDITED_TOOL} now sees.
|
|
193
|
+
|
|
194
|
+
Cluster 3 (AGENTS.md interop): #6235 has 5,233 reactions and
|
|
195
|
+
13+ months without an official Anthropic position. Until Claude
|
|
196
|
+
Code reads AGENTS.md natively, the operator-side burden is to
|
|
197
|
+
keep both files in sync at edit time.
|
|
198
|
+
|
|
199
|
+
Three reconciliation options at this moment:
|
|
200
|
+
|
|
201
|
+
1. Mirror the edit now. Open ${SIBLING_PATH} and apply the same
|
|
202
|
+
change while the diff is fresh in your head.
|
|
203
|
+
|
|
204
|
+
2. Symlink the two files. \`ln -sf ${FILE_PATH} ${SIBLING_PATH}\`
|
|
205
|
+
(or the reverse direction) makes future edits update both
|
|
206
|
+
at once. Caveat: if you symlink at the directory level
|
|
207
|
+
between .claude/ and .agents/, Claude Code writes .system/
|
|
208
|
+
files into the shared directory (#20820 / #31005).
|
|
209
|
+
|
|
210
|
+
3. Defer with intent. If you know you are mid-experiment and
|
|
211
|
+
do not want the sibling to track this revision yet, the
|
|
212
|
+
warning is informational only — no action required.
|
|
213
|
+
|
|
214
|
+
Silence: set CC_AGENTS_MD_DRIFT_WARN_DISABLE=1.
|
|
215
|
+
Compact mode: set CC_AGENTS_MD_DRIFT_WARN_QUIET=1.
|
|
216
|
+
|
|
217
|
+
Companion: agents-md-sync-checker (SessionStart, PR #377) catches
|
|
218
|
+
the drift at the start of the next session if you defer here.
|
|
219
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
220
|
+
|
|
221
|
+
EOF
|
|
222
|
+
|
|
223
|
+
exit 0
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# agents-md-loader.sh — Detect AGENTS.md in the project tree at session start
|
|
3
|
+
# and surface its contents to Claude Code as a system-reminder, so the agent
|
|
4
|
+
# reads it alongside (or in place of) CLAUDE.md.
|
|
5
|
+
#
|
|
6
|
+
# Addresses: anthropics/claude-code#6235 (Feature Request: Support AGENTS.md),
|
|
7
|
+
# the highest-engagement feature request on the tracker (6,358 reactions),
|
|
8
|
+
# closed as completed on 2026-08-17.
|
|
9
|
+
#
|
|
10
|
+
# DOES CLAUDE CODE READ AGENTS.md NOW? Measured on v2.1.233, 2026-08-21: NO.
|
|
11
|
+
# The issue is closed, but AGENTS.md is still not loaded into the model's
|
|
12
|
+
# context the way CLAUDE.md is. The official CHANGELOG.md (5,693 lines, up
|
|
13
|
+
# to 2.1.238) does not mention AGENTS.md anywhere.
|
|
14
|
+
#
|
|
15
|
+
# This is easy to get wrong, so here is the method. Asking `claude -p` for a
|
|
16
|
+
# token planted in AGENTS.md is NOT a valid test: the agent will often find the
|
|
17
|
+
# file on its own with ls/cat and answer correctly, which looks identical to
|
|
18
|
+
# native loading. Stream the transcript instead and look at the tool calls:
|
|
19
|
+
#
|
|
20
|
+
# claude -p "<question>" --output-format stream-json --verbose
|
|
21
|
+
#
|
|
22
|
+
# CLAUDE.md planted ... answered with no file read -> loaded into context
|
|
23
|
+
# AGENTS.md planted ... agent ran `ls` then `cat` -> NOT loaded; it looked
|
|
24
|
+
#
|
|
25
|
+
# So whether the agent sees AGENTS.md depends on whether it happens to go
|
|
26
|
+
# looking, which is not something you can rely on — and it costs tool calls
|
|
27
|
+
# every session when it does.
|
|
28
|
+
#
|
|
29
|
+
# This hook makes it deterministic instead: a SessionStart hook that
|
|
30
|
+
# detects AGENTS.md (in cwd or any parent up to git root), reads its
|
|
31
|
+
# contents (subject to a size cap to protect the context budget), and
|
|
32
|
+
# emits a <system-reminder> so the agent reads it the same way it reads
|
|
33
|
+
# CLAUDE.md.
|
|
34
|
+
#
|
|
35
|
+
# Precedence: the AGENTS.md specification specifies "closest file wins"
|
|
36
|
+
# for monorepos with nested AGENTS.md files. This hook follows the same
|
|
37
|
+
# rule — it walks upward from cwd and uses the first AGENTS.md found.
|
|
38
|
+
#
|
|
39
|
+
# Coexistence with CLAUDE.md: this hook does NOT replace CLAUDE.md.
|
|
40
|
+
# Both files load. If both exist, both are surfaced to the agent. The
|
|
41
|
+
# operator's CLAUDE.md takes precedence on Claude-specific conventions;
|
|
42
|
+
# AGENTS.md provides the vendor-neutral context.
|
|
43
|
+
#
|
|
44
|
+
# TRIGGER: SessionStart
|
|
45
|
+
# MATCHER: ""
|
|
46
|
+
#
|
|
47
|
+
# CONFIGURATION (environment variables):
|
|
48
|
+
# CC_AGENTS_MD_MAX_BYTES default 16384 (16 KiB) — file size cap
|
|
49
|
+
# to protect context budget; AGENTS.md
|
|
50
|
+
# larger than this is truncated and a
|
|
51
|
+
# warning is appended.
|
|
52
|
+
# CC_AGENTS_MD_SEARCH_PARENTS default "1" — walk up to git root looking
|
|
53
|
+
# for AGENTS.md. Set "0" to check only cwd.
|
|
54
|
+
# CC_AGENTS_MD_LOADER_DISABLE set to "1" to disable the hook entirely.
|
|
55
|
+
#
|
|
56
|
+
# USAGE (settings.json):
|
|
57
|
+
# {
|
|
58
|
+
# "hooks": {
|
|
59
|
+
# "SessionStart": [{
|
|
60
|
+
# "matcher": "",
|
|
61
|
+
# "hooks": [{
|
|
62
|
+
# "type": "command",
|
|
63
|
+
# "command": "~/.claude/hooks/agents-md-loader.sh"
|
|
64
|
+
# }]
|
|
65
|
+
# }]
|
|
66
|
+
# }
|
|
67
|
+
# }
|
|
68
|
+
|
|
69
|
+
set -uo pipefail
|
|
70
|
+
|
|
71
|
+
[ "${CC_AGENTS_MD_LOADER_DISABLE:-0}" = "1" ] && exit 0
|
|
72
|
+
|
|
73
|
+
MAX_BYTES="${CC_AGENTS_MD_MAX_BYTES:-16384}"
|
|
74
|
+
SEARCH_PARENTS="${CC_AGENTS_MD_SEARCH_PARENTS:-1}"
|
|
75
|
+
|
|
76
|
+
# Find AGENTS.md by walking up from cwd. Stop at:
|
|
77
|
+
# - first AGENTS.md found, OR
|
|
78
|
+
# - filesystem root, OR
|
|
79
|
+
# - top of git working tree (if inside one), OR
|
|
80
|
+
# - $HOME, whichever comes first.
|
|
81
|
+
|
|
82
|
+
find_agents_md() {
|
|
83
|
+
local dir="$PWD"
|
|
84
|
+
local git_root=""
|
|
85
|
+
|
|
86
|
+
git_root=$(git rev-parse --show-toplevel 2>/dev/null || true)
|
|
87
|
+
|
|
88
|
+
while [ -n "$dir" ] && [ "$dir" != "/" ]; do
|
|
89
|
+
if [ -f "$dir/AGENTS.md" ]; then
|
|
90
|
+
printf '%s\n' "$dir/AGENTS.md"
|
|
91
|
+
return 0
|
|
92
|
+
fi
|
|
93
|
+
# Stop at git root if found.
|
|
94
|
+
[ -n "$git_root" ] && [ "$dir" = "$git_root" ] && return 1
|
|
95
|
+
# Stop at $HOME.
|
|
96
|
+
[ "$dir" = "$HOME" ] && return 1
|
|
97
|
+
# If SEARCH_PARENTS is disabled, only check cwd.
|
|
98
|
+
[ "$SEARCH_PARENTS" = "0" ] && return 1
|
|
99
|
+
dir=$(dirname "$dir")
|
|
100
|
+
done
|
|
101
|
+
return 1
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
AGENTS_MD_PATH=$(find_agents_md)
|
|
105
|
+
[ -z "$AGENTS_MD_PATH" ] && exit 0 # No AGENTS.md → silent no-op.
|
|
106
|
+
|
|
107
|
+
# Read the file with a byte cap. If the file is larger than MAX_BYTES,
|
|
108
|
+
# truncate and append a notice so the agent knows.
|
|
109
|
+
FILE_SIZE=$(wc -c < "$AGENTS_MD_PATH" 2>/dev/null || echo 0)
|
|
110
|
+
TRUNCATED=""
|
|
111
|
+
|
|
112
|
+
if [ "$FILE_SIZE" -gt "$MAX_BYTES" ]; then
|
|
113
|
+
CONTENT=$(head -c "$MAX_BYTES" "$AGENTS_MD_PATH" 2>/dev/null)
|
|
114
|
+
TRUNCATED="
|
|
115
|
+
|
|
116
|
+
[NOTE: AGENTS.md is $FILE_SIZE bytes; truncated to $MAX_BYTES bytes by agents-md-loader. Increase CC_AGENTS_MD_MAX_BYTES or read the full file with the Read tool if you need the rest.]"
|
|
117
|
+
else
|
|
118
|
+
CONTENT=$(cat "$AGENTS_MD_PATH" 2>/dev/null)
|
|
119
|
+
fi
|
|
120
|
+
|
|
121
|
+
[ -z "$CONTENT" ] && exit 0
|
|
122
|
+
|
|
123
|
+
# Detect whether CLAUDE.md is also present (sibling or parent) so the
|
|
124
|
+
# reminder can name the coexistence.
|
|
125
|
+
CLAUDE_MD_SIBLING=""
|
|
126
|
+
PROJECT_DIR=$(dirname "$AGENTS_MD_PATH")
|
|
127
|
+
[ -f "$PROJECT_DIR/CLAUDE.md" ] && CLAUDE_MD_SIBLING="$PROJECT_DIR/CLAUDE.md"
|
|
128
|
+
|
|
129
|
+
# Emit the system-reminder on stderr (SessionStart hooks use stderr for
|
|
130
|
+
# context-augmenting reminders; exit 0 = non-blocking).
|
|
131
|
+
|
|
132
|
+
cat >&2 <<EOF
|
|
133
|
+
<system-reminder>
|
|
134
|
+
AGENTS.md detected at $AGENTS_MD_PATH ($FILE_SIZE bytes).
|
|
135
|
+
|
|
136
|
+
AGENTS.md is the vendor-neutral "README for agents" convention adopted by
|
|
137
|
+
Codex, Cursor, Aider, Zed, VS Code, Devin, JetBrains Junie, Amp, Gemini CLI,
|
|
138
|
+
GitHub Copilot, Windsurf, and 10+ other coding agents. Claude Code does
|
|
139
|
+
not yet natively read this file (see anthropics/claude-code#6235). This
|
|
140
|
+
hook surfaces its contents to you in the same way native CLAUDE.md loading
|
|
141
|
+
would.
|
|
142
|
+
|
|
143
|
+
The repository operator has chosen to keep cross-vendor context in
|
|
144
|
+
AGENTS.md so the same content serves every agent that visits the repo.
|
|
145
|
+
Treat the content below as project context with the same authority you
|
|
146
|
+
treat CLAUDE.md content.
|
|
147
|
+
$( [ -n "$CLAUDE_MD_SIBLING" ] && printf '%s\n' "
|
|
148
|
+
NOTE: CLAUDE.md is also present at $CLAUDE_MD_SIBLING. Both files are
|
|
149
|
+
in scope. CLAUDE.md takes precedence on Claude-Code-specific conventions
|
|
150
|
+
(hook configurations, slash commands, model-specific behaviour). AGENTS.md
|
|
151
|
+
governs cross-vendor project context (build commands, code style, test
|
|
152
|
+
instructions, security considerations).")
|
|
153
|
+
|
|
154
|
+
--- BEGIN $AGENTS_MD_PATH ---
|
|
155
|
+
$CONTENT$TRUNCATED
|
|
156
|
+
--- END $AGENTS_MD_PATH ---
|
|
157
|
+
</system-reminder>
|
|
158
|
+
EOF
|
|
159
|
+
|
|
160
|
+
exit 0
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ================================================================
|
|
3
|
+
# agents-md-sync-checker.sh — Warn when AGENTS.md and CLAUDE.md drift apart
|
|
4
|
+
# ================================================================
|
|
5
|
+
# PURPOSE:
|
|
6
|
+
# This hook reports at session start via hookSpecificOutput /
|
|
7
|
+
# additionalContext. Without the TRIGGER header below, the
|
|
8
|
+
# installer registered it under the default PreToolUse/Bash,
|
|
9
|
+
# so it fired on every Bash call and never ran at session start.
|
|
10
|
+
#
|
|
11
|
+
# TRIGGER: SessionStart
|
|
12
|
+
# MATCHER: ""
|
|
13
|
+
# ================================================================
|
|
14
|
+
|
|
15
|
+
set -u
|
|
16
|
+
INPUT=$(cat)
|
|
17
|
+
DELTA_PCT="${CC_AGENTS_MD_SIZE_DELTA_PCT:-20}"
|
|
18
|
+
if [ -n "${CC_AGENTS_MD_FILES:-}" ]; then
|
|
19
|
+
IFS=':' read -ra AGENTS_MD_FILES <<< "$CC_AGENTS_MD_FILES"
|
|
20
|
+
else
|
|
21
|
+
AGENTS_MD_FILES=(
|
|
22
|
+
"./AGENTS.md"
|
|
23
|
+
".agents/AGENTS.md"
|
|
24
|
+
)
|
|
25
|
+
fi
|
|
26
|
+
if [ -n "${CC_CLAUDE_MD_FILES_FOR_SYNC:-}" ]; then
|
|
27
|
+
IFS=':' read -ra CLAUDE_MD_FILES <<< "$CC_CLAUDE_MD_FILES_FOR_SYNC"
|
|
28
|
+
else
|
|
29
|
+
CLAUDE_MD_FILES=(
|
|
30
|
+
"./CLAUDE.md"
|
|
31
|
+
".claude/CLAUDE.md"
|
|
32
|
+
)
|
|
33
|
+
fi
|
|
34
|
+
AGENTS_PATH=""
|
|
35
|
+
AGENTS_SIZE=0
|
|
36
|
+
for path in "${AGENTS_MD_FILES[@]}"; do
|
|
37
|
+
if [ -f "$path" ] && [ -r "$path" ]; then
|
|
38
|
+
AGENTS_PATH="$path"
|
|
39
|
+
AGENTS_SIZE=$(wc -c < "$path" 2>/dev/null | tr -d ' ')
|
|
40
|
+
break
|
|
41
|
+
fi
|
|
42
|
+
done
|
|
43
|
+
CLAUDE_PATH=""
|
|
44
|
+
CLAUDE_SIZE=0
|
|
45
|
+
for path in "${CLAUDE_MD_FILES[@]}"; do
|
|
46
|
+
if [ -f "$path" ] && [ -r "$path" ]; then
|
|
47
|
+
CLAUDE_PATH="$path"
|
|
48
|
+
CLAUDE_SIZE=$(wc -c < "$path" 2>/dev/null | tr -d ' ')
|
|
49
|
+
break
|
|
50
|
+
fi
|
|
51
|
+
done
|
|
52
|
+
[ -z "$AGENTS_PATH" ] && [ -z "$CLAUDE_PATH" ] && exit 0
|
|
53
|
+
[ -z "$AGENTS_PATH" ] && exit 0
|
|
54
|
+
FINDINGS=()
|
|
55
|
+
if [ -z "$CLAUDE_PATH" ]; then
|
|
56
|
+
FINDINGS+=("AGENTS.md present at $AGENTS_PATH ($AGENTS_SIZE bytes) but no CLAUDE.md found. Claude Code does not read AGENTS.md natively. If you want these instructions in this Claude Code session, copy or symlink AGENTS.md to CLAUDE.md.")
|
|
57
|
+
else
|
|
58
|
+
if [ "$AGENTS_PATH" -ef "$CLAUDE_PATH" ]; then
|
|
59
|
+
exit 0
|
|
60
|
+
fi
|
|
61
|
+
if cmp -s "$AGENTS_PATH" "$CLAUDE_PATH" 2>/dev/null; then
|
|
62
|
+
FINDINGS+=("AGENTS.md and CLAUDE.md have identical content but are separate files at $AGENTS_PATH and $CLAUDE_PATH. Consider replacing one with a symlink to the other to prevent future drift.")
|
|
63
|
+
else
|
|
64
|
+
if [ "$AGENTS_SIZE" -eq 0 ] || [ "$CLAUDE_SIZE" -eq 0 ]; then
|
|
65
|
+
PCT_DELTA=100
|
|
66
|
+
else
|
|
67
|
+
if [ "$AGENTS_SIZE" -gt "$CLAUDE_SIZE" ]; then
|
|
68
|
+
PCT_DELTA=$(awk -v a="$AGENTS_SIZE" -v c="$CLAUDE_SIZE" 'BEGIN { printf "%d", (a - c) * 100 / a }')
|
|
69
|
+
else
|
|
70
|
+
PCT_DELTA=$(awk -v a="$AGENTS_SIZE" -v c="$CLAUDE_SIZE" 'BEGIN { printf "%d", (c - a) * 100 / c }')
|
|
71
|
+
fi
|
|
72
|
+
fi
|
|
73
|
+
if [ "$PCT_DELTA" -ge "$DELTA_PCT" ]; then
|
|
74
|
+
FINDINGS+=("AGENTS.md ($AGENTS_PATH: $AGENTS_SIZE bytes) and CLAUDE.md ($CLAUDE_PATH: $CLAUDE_SIZE bytes) differ by $PCT_DELTA% in size. Likely drift between the two instruction sources.")
|
|
75
|
+
else
|
|
76
|
+
FINDINGS+=("AGENTS.md and CLAUDE.md present at $AGENTS_PATH ($AGENTS_SIZE bytes) and $CLAUDE_PATH ($CLAUDE_SIZE bytes), close in size ($PCT_DELTA% delta) but content differs. Confirm intentional divergence or sync.")
|
|
77
|
+
fi
|
|
78
|
+
fi
|
|
79
|
+
fi
|
|
80
|
+
[ ${#FINDINGS[@]} -eq 0 ] && exit 0
|
|
81
|
+
MSG="DETECTED: AGENTS.md / CLAUDE.md state requires operator review.
|
|
82
|
+
Multiple coding agents (Codex, Amp, Cursor, Aider, others) are converging on AGENTS.md as a shared instruction standard. Claude Code does not read AGENTS.md natively as of this session — the only operator-side mitigation while issue #6235 (5,268 reactions, 13+ months open) is unresolved is to maintain CLAUDE.md alongside.
|
|
83
|
+
Findings:"
|
|
84
|
+
for finding in "${FINDINGS[@]}"; do
|
|
85
|
+
MSG="$MSG
|
|
86
|
+
- $finding"
|
|
87
|
+
done
|
|
88
|
+
MSG="$MSG
|
|
89
|
+
Mitigation patterns:
|
|
90
|
+
1. Single source of truth: write instructions in CLAUDE.md, symlink AGENTS.md to it (or vice versa). Other agents read AGENTS.md; Claude Code reads CLAUDE.md; one edit updates both. Run scripts/agents-md-sync-setup.sh to do this safely in one command (dry-run by default; backs up any file before replacing it; refuses to touch the files when their contents differ).
|
|
91
|
+
2. Git pre-commit hook that fails when AGENTS.md and CLAUDE.md content drifts.
|
|
92
|
+
3. Pick one tool and remove the other file. Multi-agent workflows are not required.
|
|
93
|
+
See https://github.com/anthropics/claude-code/issues/6235 for the upstream feature request thread.
|
|
94
|
+
This hook is advisory only. The session continues normally."
|
|
95
|
+
jq -n --arg msg "$MSG" '
|
|
96
|
+
{
|
|
97
|
+
"hookSpecificOutput": {
|
|
98
|
+
"hookEventName": "SessionStart",
|
|
99
|
+
"additionalContext": $msg
|
|
100
|
+
}
|
|
101
|
+
}'
|
|
102
|
+
exit 0
|