npx claudepluginhub chkim-su/forge-editor --plugin forge-editorDefined in hooks/hooks.json
{
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/workflow-completion-gate.py\"",
"timeout": 10
},
{
"type": "command",
"command": "python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/enforce-plugin-test.py\"",
"timeout": 5
}
]
}
],
"PreToolUse": [
{
"hooks": [
{
"type": "command",
"command": "python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/daemon-gate.py\"",
"timeout": 5
}
],
"matcher": "Write|Edit|Bash|Task|NotebookEdit",
"$comment": "MANDATORY: All tool uses must pass daemon-gate FIRST"
},
{
"hooks": [
{
"type": "command",
"command": "python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/step-validation-gate.py\"",
"timeout": 5
}
],
"matcher": "Write|Edit|Bash|Task|Skill",
"$comment": "Step validation gate - blocks tools not allowed in current step"
},
{
"hooks": [
{
"type": "command",
"command": "python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/skill-access-guard.py\"",
"timeout": 3
}
],
"matcher": "Read|Grep|Glob"
},
{
"hooks": [
{
"type": "command",
"command": "python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/workflow-sequence-hook.py\"",
"timeout": 5
},
{
"type": "command",
"command": "python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/validate_all.py\" --skip-git --pre-edit --quiet",
"timeout": 15
},
{
"type": "command",
"command": "python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/pattern-compliance-guard.py\"",
"timeout": 3
}
],
"matcher": "Edit|Write|NotebookEdit"
},
{
"hooks": [
{
"type": "command",
"command": "python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/validate_all.py\" --skip-git",
"timeout": 30
},
{
"type": "command",
"command": "python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/plugin-test-gate.py\" --quiet",
"timeout": 60
}
],
"matcher": "Bash"
},
{
"hooks": [
{
"type": "command",
"command": "python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/wizard-routing-hook.py\"",
"timeout": 3
},
{
"type": "command",
"command": "python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/validate_all.py\" --skip-git --quiet",
"timeout": 15
},
{
"type": "command",
"command": "python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/pattern-compliance-guard.py\"",
"timeout": 3
}
],
"matcher": "Skill"
},
{
"hooks": [
{
"type": "command",
"command": "python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/task-validation-router.py\"",
"timeout": 5
},
{
"type": "command",
"command": "python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/pattern-compliance-guard.py\"",
"timeout": 5
}
],
"matcher": "Task"
}
],
"PostToolUse": [
{
"hooks": [
{
"type": "command",
"command": "python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/validate_all.py\" --skip-git --schema-only",
"timeout": 15
},
{
"type": "command",
"command": "python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/check_language.py\"",
"timeout": 5
},
{
"type": "command",
"command": "python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/workflow-phase-updater.py\" post_write",
"timeout": 3
}
],
"matcher": "Write|Edit|NotebookEdit"
},
{
"hooks": [
{
"type": "command",
"command": "python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/bash-post-router.py\"",
"timeout": 5
},
{
"type": "command",
"command": "python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/step-completion-detector.py\"",
"timeout": 5
}
],
"matcher": "Bash"
},
{
"hooks": [
{
"type": "command",
"command": "python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/task-post-router.py\"",
"timeout": 5
},
{
"type": "command",
"command": "python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/step-completion-detector.py\"",
"timeout": 5
},
{
"type": "command",
"command": "python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/validate_all.py\" --skip-git",
"timeout": 20
},
{
"type": "command",
"command": "python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/solution-synthesis-gate.py\"",
"timeout": 5
},
{
"type": "command",
"command": "python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/workflow-phase-updater.py\" post_task",
"timeout": 3
}
],
"matcher": "Task"
},
{
"hooks": [
{
"type": "command",
"command": "python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/wizard-routing-hook.py\"",
"timeout": 3
},
{
"type": "command",
"command": "python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/validate_all.py\" --skip-git",
"timeout": 20
}
],
"matcher": "Skill"
}
],
"SessionStart": [
{
"hooks": [
{
"type": "command",
"command": "bash \"${CLAUDE_PLUGIN_ROOT}/scripts/mcp-startup.sh\"",
"timeout": 30
},
{
"type": "command",
"command": "python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/forge-state-daemon.py\" start &",
"timeout": 5
}
]
}
],
"UserPromptSubmit": [
{
"hooks": [
{
"type": "command",
"command": "python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/command-workflow-init-hook.py\"",
"timeout": 5
},
{
"type": "command",
"command": "python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/skill-activation-hook.py\"",
"timeout": 5
},
{
"type": "command",
"command": "python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/workflow-skill-injector-hook.py\"",
"timeout": 5
}
]
}
]
}"Executes Node.js scripts for batch linting/extraction/aggregation on Stop, config protection pre-Edit/Write, post-edit accumulation/PR polling after tools, correction detection on prompts, bash session init. Touches bash/files."