mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-04-20 14:30:41 +00:00
## Summary Add Claude Code PreToolUse hooks to block agents from bypassing package.json scripts with raw tool invocations. ## Changes - **What**: 15 PreToolUse hooks in `.claude/settings.json` that intercept `npx`/`pnpx`/bare invocations of tsc, vitest, eslint, prettier, oxlint, stylelint, and knip — redirecting agents to the correct `pnpm` script (`pnpm typecheck`, `pnpm test:unit`, `pnpm lint`, etc.) - Also removes stale `permissions.allow` entries left over from a debugging session ## Review Focus - Pattern coverage: are there common agent invocations we're missing? - The `if` field only supports simple `*` globs (no alternation), so each pattern needs its own hook entry ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-11201-feat-add-PreToolUse-hooks-to-enforce-pnpm-scripts-3416d73d365081a59a38c86ee4669aee) by [Unito](https://www.unito.io) Co-authored-by: Amp <amp@ampcode.com>
87 lines
3.0 KiB
JSON
87 lines
3.0 KiB
JSON
{
|
|
"hooks": {
|
|
"PreToolUse": [
|
|
{
|
|
"matcher": "Bash",
|
|
"hooks": [
|
|
{
|
|
"type": "command",
|
|
"if": "Bash(tsc *)",
|
|
"command": "echo 'Use `pnpm typecheck` instead of running tsc directly.' >&2 && exit 2"
|
|
},
|
|
{
|
|
"type": "command",
|
|
"if": "Bash(vue-tsc *)",
|
|
"command": "echo 'Use `pnpm typecheck` instead of running vue-tsc directly.' >&2 && exit 2"
|
|
},
|
|
{
|
|
"type": "command",
|
|
"if": "Bash(npx tsc *)",
|
|
"command": "echo 'Use `pnpm typecheck` instead of running tsc via npx.' >&2 && exit 2"
|
|
},
|
|
{
|
|
"type": "command",
|
|
"if": "Bash(pnpx tsc *)",
|
|
"command": "echo 'Use `pnpm typecheck` instead of running tsc via pnpx.' >&2 && exit 2"
|
|
},
|
|
{
|
|
"type": "command",
|
|
"if": "Bash(pnpm exec tsc *)",
|
|
"command": "echo 'Use `pnpm typecheck` instead of `pnpm exec tsc`.' >&2 && exit 2"
|
|
},
|
|
{
|
|
"type": "command",
|
|
"if": "Bash(npx vitest *)",
|
|
"command": "echo 'Use `pnpm test:unit` (or `pnpm test:unit -- <path>`) instead of npx vitest.' >&2 && exit 2"
|
|
},
|
|
{
|
|
"type": "command",
|
|
"if": "Bash(pnpx vitest *)",
|
|
"command": "echo 'Use `pnpm test:unit` (or `pnpm test:unit -- <path>`) instead of pnpx vitest.' >&2 && exit 2"
|
|
},
|
|
{
|
|
"type": "command",
|
|
"if": "Bash(npx eslint *)",
|
|
"command": "echo 'Use `pnpm lint` or `pnpm lint:fix` instead of npx eslint.' >&2 && exit 2"
|
|
},
|
|
{
|
|
"type": "command",
|
|
"if": "Bash(pnpx eslint *)",
|
|
"command": "echo 'Use `pnpm lint` or `pnpm lint:fix` instead of pnpx eslint.' >&2 && exit 2"
|
|
},
|
|
{
|
|
"type": "command",
|
|
"if": "Bash(npx prettier *)",
|
|
"command": "echo 'This project uses oxfmt, not prettier. Use `pnpm format` or `pnpm format:check`.' >&2 && exit 2"
|
|
},
|
|
{
|
|
"type": "command",
|
|
"if": "Bash(pnpx prettier *)",
|
|
"command": "echo 'This project uses oxfmt, not prettier. Use `pnpm format` or `pnpm format:check`.' >&2 && exit 2"
|
|
},
|
|
{
|
|
"type": "command",
|
|
"if": "Bash(npx oxlint *)",
|
|
"command": "echo 'Use `pnpm oxlint` instead of npx oxlint.' >&2 && exit 2"
|
|
},
|
|
{
|
|
"type": "command",
|
|
"if": "Bash(npx stylelint *)",
|
|
"command": "echo 'Use `pnpm stylelint` instead of npx stylelint.' >&2 && exit 2"
|
|
},
|
|
{
|
|
"type": "command",
|
|
"if": "Bash(npx knip *)",
|
|
"command": "echo 'Use `pnpm knip` instead of npx knip.' >&2 && exit 2"
|
|
},
|
|
{
|
|
"type": "command",
|
|
"if": "Bash(pnpx knip *)",
|
|
"command": "echo 'Use `pnpm knip` instead of pnpx knip.' >&2 && exit 2"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
}
|