mirror of
https://github.com/affaan-m/ECC.git
synced 2026-11-04 15:15:49 +00:00
On native Windows, Claude Code runs each hook as `bash.exe -c "<command>"` through the Windows command line. That extra unescape layer collapses the backslashes in the WSL path conversion of the inline plugin-root resolver, so `.replace(/\\/g,'/')` reaches node as `.replace(/\/g,'/')` and every hook fails with `SyntaxError: missing ) after argument list`. Build the backslash separator with String.fromCharCode(92) and split/join instead of regex escapes, so the resolver contains no backslash. Conversion behaviour is unchanged. Regenerate every embedded copy (hooks.json, codex-hooks.json, commands/*.md) and refresh hooks.metadata.json fingerprints. Add a test that the resolver and each hook `node -e` program are backslash-free, and run the shipped SessionStart command through bash with backslashes collapsed the way Windows does. Fixes #3746
157 lines
5.8 KiB
JSON
157 lines
5.8 KiB
JSON
{
|
|
"$schema": "../schemas/hooks-metadata.schema.json",
|
|
"entries": {
|
|
"PreToolUse": [
|
|
{
|
|
"id": "pre:bash:dispatcher",
|
|
"description": "Consolidated Bash preflight dispatcher for quality, tmux, push, and GateGuard checks",
|
|
"fingerprint": "73f5c1a01074"
|
|
},
|
|
{
|
|
"id": "pre:powershell:gateguard-fact-force",
|
|
"description": "PowerShell fact-forcing gate: inspect destructive commands without running unrelated Bash-only preflight hooks",
|
|
"fingerprint": "46a805223053"
|
|
},
|
|
{
|
|
"id": "pre:write:doc-file-warning",
|
|
"description": "Doc file warning: warn about non-standard documentation files (exit code 0; warns only)",
|
|
"fingerprint": "7b414e2f33ce"
|
|
},
|
|
{
|
|
"id": "pre:edit-write:suggest-compact",
|
|
"description": "Suggest manual compaction at logical intervals",
|
|
"fingerprint": "c5221aa445cc"
|
|
},
|
|
{
|
|
"id": "pre:observe:continuous-learning",
|
|
"description": "Capture tool use observations for continuous learning",
|
|
"fingerprint": "a77d63149961"
|
|
},
|
|
{
|
|
"id": "pre:governance-capture",
|
|
"description": "Capture governance events (secrets, policy violations, approval requests). Enable with ECC_GOVERNANCE_CAPTURE=1",
|
|
"fingerprint": "5ccfc381eb8a"
|
|
},
|
|
{
|
|
"id": "pre:config-protection",
|
|
"description": "Block modifications to linter/formatter config files. Steers agent to fix code instead of weakening configs.",
|
|
"fingerprint": "b75c69a065b7"
|
|
},
|
|
{
|
|
"id": "pre:mcp-health-check",
|
|
"description": "Check MCP server health before MCP tool execution and block unhealthy MCP calls",
|
|
"fingerprint": "773a20e88ec8"
|
|
},
|
|
{
|
|
"id": "pre:edit-write:gateguard-fact-force",
|
|
"description": "Fact-forcing gate: deny the first Edit/Write/MultiEdit/NotebookEdit of each file with questions chosen by target class and by what the change touches; a completed search naming the file in the current turn, a comment or whitespace-only edit, or a same-turn sibling of a new file already gated passes with a note instead; sensitive targets (secrets, keys, auth/payment code, migrations, CI workflows) and hard-linked files are always gated, also in subagents",
|
|
"fingerprint": "4778e39c56cf"
|
|
},
|
|
{
|
|
"id": "pre:hookify-runtime",
|
|
"description": "Evaluate project-local Hookify rules before Bash, PowerShell, and file tools run",
|
|
"fingerprint": "3577a44df932"
|
|
}
|
|
],
|
|
"UserPromptSubmit": [
|
|
{
|
|
"id": "prompt:hookify-runtime",
|
|
"description": "Evaluate project-local Hookify prompt rules before a user prompt is processed",
|
|
"fingerprint": "e59b2f099bf7"
|
|
}
|
|
],
|
|
"PreCompact": [
|
|
{
|
|
"id": "pre:compact",
|
|
"description": "Save state before context compaction",
|
|
"fingerprint": "28991284118e"
|
|
}
|
|
],
|
|
"SessionStart": [
|
|
{
|
|
"id": "session:start",
|
|
"description": "Load previous context and detect package manager on new session",
|
|
"fingerprint": "e4e7c9f975d2"
|
|
},
|
|
{
|
|
"id": "session-start:plan-canvas-sessions",
|
|
"description": "Surface open Plan Canvas review sessions so a fresh session can resume the loop",
|
|
"fingerprint": "1c23f955ee8b"
|
|
}
|
|
],
|
|
"PostToolUse": [
|
|
{
|
|
"id": "post:dispatcher:sync",
|
|
"description": "Run synchronous PostToolUse hooks in one process while preserving per-hook controls",
|
|
"fingerprint": "ca419a145e5b"
|
|
},
|
|
{
|
|
"id": "post:dispatcher:async",
|
|
"description": "Run background PostToolUse hooks in one process while preserving per-hook controls",
|
|
"fingerprint": "c494e10d87ed"
|
|
}
|
|
],
|
|
"PostToolUseFailure": [
|
|
{
|
|
"id": "post:mcp-health-check",
|
|
"description": "Track failed MCP tool calls, mark unhealthy servers, and attempt reconnect",
|
|
"fingerprint": "42692c6b8819"
|
|
},
|
|
{
|
|
"id": "post:skill:track",
|
|
"description": "Record hard Skill tool failures for skill-health telemetry",
|
|
"fingerprint": "db25a82289aa"
|
|
}
|
|
],
|
|
"Stop": [
|
|
{
|
|
"id": "stop:hookify-runtime",
|
|
"description": "Evaluate project-local Hookify completion rules before Claude stops",
|
|
"fingerprint": "7b319512edb9"
|
|
},
|
|
{
|
|
"id": "stop:plan-canvas-pending",
|
|
"description": "Deliver undelivered Plan Canvas browser feedback before the agent stops",
|
|
"fingerprint": "6f634558e137"
|
|
},
|
|
{
|
|
"id": "stop:format-typecheck",
|
|
"description": "Batch format (Biome/Prettier) and typecheck (tsc) all JS/TS files edited this response — runs once at Stop instead of after every Edit",
|
|
"fingerprint": "243bd81ff17a"
|
|
},
|
|
{
|
|
"id": "stop:check-console-log",
|
|
"description": "Check for console.log in modified files after each response",
|
|
"fingerprint": "8211fdea0cdd"
|
|
},
|
|
{
|
|
"id": "stop:session-end",
|
|
"description": "Persist session state after each response (Stop carries transcript_path)",
|
|
"fingerprint": "bb1cddf9932b"
|
|
},
|
|
{
|
|
"id": "stop:evaluate-session",
|
|
"description": "Evaluate session for extractable patterns",
|
|
"fingerprint": "b2b8c8bc080b"
|
|
},
|
|
{
|
|
"id": "stop:cost-tracker",
|
|
"description": "Track token and cost metrics per session",
|
|
"fingerprint": "c6b1c1c6e9e3"
|
|
},
|
|
{
|
|
"id": "stop:desktop-notify",
|
|
"description": "Send desktop notification (macOS/WSL) with task summary when Claude responds",
|
|
"fingerprint": "23030441f3f5"
|
|
}
|
|
],
|
|
"SessionEnd": [
|
|
{
|
|
"id": "session:end:marker",
|
|
"description": "Session end lifecycle marker (non-blocking)",
|
|
"fingerprint": "a991d34f4d89"
|
|
}
|
|
]
|
|
}
|
|
}
|