Stats
Actions
Tags
Help us improve
Share bugs, ideas, or general feedback.
From oh-my-forge
Batch-formats (Biome/Prettier) and type-checks (tsc) all JS/TS files edited in a response, running once at Stop instead of after every Edit. Executes bash and writes files.
7 events · 41 hooks
npx claudepluginhub rlagycks/oh-my-forge --plugin oh-my-forgeSafety signals detected in this hook configuration
Where this hook configuration is defined
Defined in hooks/hooks.json
Event handlers and matchers — expand Raw Configuration for the full JSON
*node -e "const fs=require('fs');const path=require('path');const {spawnSync}=require('child_process');const raw=fs.readFileSync(0,'utf8');const rel=path.join('scripts','hooks','run-with-flags.js');const hasRunnerRoot=candidate=>{const value=typeof candidate==='string'?candidate.trim():'';return value.length>0&&fs.existsSync(path.join(path.resolve(value),rel));};const root=(()=>{const envRoot=process.env.CLAUDE_PLUGIN_ROOT||'';if(hasRunnerRoot(envRoot))return path.resolve(envRoot.trim());const home=require('os').homedir();const claudeDir=path.join(home,'.claude');if(hasRunnerRoot(claudeDir))return claudeDir;for(const candidate of [path.join(claudeDir,'plugins','oh-my-forge'),path.join(claudeDir,'plugins','oh-my-forge@rlagycks'),path.join(claudeDir,'plugins','marketplace','oh-my-forge'),path.join(claudeDir,'plugins','everything-claude-code'),path.join(claudeDir,'plugins','everything-claude-code@everything-claude-code'),path.join(claudeDir,'plugins','marketplace','everything-claude-code')]){if(hasRunnerRoot(candidate))return candidate;}const fromCache=name=>{try{const cacheBase=path.join(claudeDir,'plugins','cache',name);for(const org of fs.readdirSync(cacheBase,{withFileTypes:true})){if(!org.isDirectory())continue;for(const version of fs.readdirSync(path.join(cacheBase,org.name),{withFileTypes:true})){if(!version.isDirectory())continue;const candidate=path.join(cacheBase,org.name,version.name);if(hasRunnerRoot(candidate))return candidate;}}}catch{}return null;};return fromCache('oh-my-forge')||fromCache('everything-claude-code')||claudeDir;})();const script=path.join(root,rel);if(fs.existsSync(script)){const result=spawnSync(process.execPath,[script,'stop:format-typecheck','scripts/hooks/stop-format-typecheck.js','--request-file','scripts/hooks/requests/standard-strict.json'],{input:raw,encoding:'utf8',env:process.env,cwd:process.cwd(),timeout:300000});const stdout=typeof result.stdout==='string'?result.stdout:'';if(stdout)process.stdout.write(stdout);else process.stdout.write(raw);if(result.stderr)process.stderr.write(result.stderr);if(result.error||result.status===null||result.signal){const reason=result.error?result.error.message:(result.signal?'signal '+result.signal:'missing exit status');process.stderr.write('[Stop] ERROR: hook runner failed: '+reason+String.fromCharCode(10));process.exit(1);}process.exit(Number.isInteger(result.status)?result.status:0);}process.stderr.write('[Stop] WARNING: could not resolve OMF plugin root; skipping hook'+String.fromCharCode(10));process.stdout.write(raw);"300ms*node -e "const fs=require('fs');const path=require('path');const {spawnSync}=require('child_process');const raw=fs.readFileSync(0,'utf8');const rel=path.join('scripts','hooks','run-with-flags.js');const hasRunnerRoot=candidate=>{const value=typeof candidate==='string'?candidate.trim():'';return value.length>0&&fs.existsSync(path.join(path.resolve(value),rel));};const root=(()=>{const envRoot=process.env.CLAUDE_PLUGIN_ROOT||'';if(hasRunnerRoot(envRoot))return path.resolve(envRoot.trim());const home=require('os').homedir();const claudeDir=path.join(home,'.claude');if(hasRunnerRoot(claudeDir))return claudeDir;for(const candidate of [path.join(claudeDir,'plugins','oh-my-forge'),path.join(claudeDir,'plugins','oh-my-forge@rlagycks'),path.join(claudeDir,'plugins','marketplace','oh-my-forge'),path.join(claudeDir,'plugins','everything-claude-code'),path.join(claudeDir,'plugins','everything-claude-code@everything-claude-code'),path.join(claudeDir,'plugins','marketplace','everything-claude-code')]){if(hasRunnerRoot(candidate))return candidate;}const fromCache=name=>{try{const cacheBase=path.join(claudeDir,'plugins','cache',name);for(const org of fs.readdirSync(cacheBase,{withFileTypes:true})){if(!org.isDirectory())continue;for(const version of fs.readdirSync(path.join(cacheBase,org.name),{withFileTypes:true})){if(!version.isDirectory())continue;const candidate=path.join(cacheBase,org.name,version.name);if(hasRunnerRoot(candidate))return candidate;}}}catch{}return null;};return fromCache('oh-my-forge')||fromCache('everything-claude-code')||claudeDir;})();const script=path.join(root,rel);if(fs.existsSync(script)){const result=spawnSync(process.execPath,[script,'stop:check-console-log','scripts/hooks/check-console-log.js','--request-file','scripts/hooks/requests/standard-strict.json'],{input:raw,encoding:'utf8',env:process.env,cwd:process.cwd(),timeout:30000});const stdout=typeof result.stdout==='string'?result.stdout:'';if(stdout)process.stdout.write(stdout);else process.stdout.write(raw);if(result.stderr)process.stderr.write(result.stderr);if(result.error||result.status===null||result.signal){const reason=result.error?result.error.message:(result.signal?'signal '+result.signal:'missing exit status');process.stderr.write('[Stop] ERROR: hook runner failed: '+reason+String.fromCharCode(10));process.exit(1);}process.exit(Number.isInteger(result.status)?result.status:0);}process.stderr.write('[Stop] WARNING: could not resolve OMF plugin root; skipping hook'+String.fromCharCode(10));process.stdout.write(raw);"*node -e "const fs=require('fs');const path=require('path');const {spawnSync}=require('child_process');const raw=fs.readFileSync(0,'utf8');const rel=path.join('scripts','hooks','run-with-flags.js');const hasRunnerRoot=candidate=>{const value=typeof candidate==='string'?candidate.trim():'';return value.length>0&&fs.existsSync(path.join(path.resolve(value),rel));};const root=(()=>{const envRoot=process.env.CLAUDE_PLUGIN_ROOT||'';if(hasRunnerRoot(envRoot))return path.resolve(envRoot.trim());const home=require('os').homedir();const claudeDir=path.join(home,'.claude');if(hasRunnerRoot(claudeDir))return claudeDir;for(const candidate of [path.join(claudeDir,'plugins','oh-my-forge'),path.join(claudeDir,'plugins','oh-my-forge@rlagycks'),path.join(claudeDir,'plugins','marketplace','oh-my-forge'),path.join(claudeDir,'plugins','everything-claude-code'),path.join(claudeDir,'plugins','everything-claude-code@everything-claude-code'),path.join(claudeDir,'plugins','marketplace','everything-claude-code')]){if(hasRunnerRoot(candidate))return candidate;}const fromCache=name=>{try{const cacheBase=path.join(claudeDir,'plugins','cache',name);for(const org of fs.readdirSync(cacheBase,{withFileTypes:true})){if(!org.isDirectory())continue;for(const version of fs.readdirSync(path.join(cacheBase,org.name),{withFileTypes:true})){if(!version.isDirectory())continue;const candidate=path.join(cacheBase,org.name,version.name);if(hasRunnerRoot(candidate))return candidate;}}}catch{}return null;};return fromCache('oh-my-forge')||fromCache('everything-claude-code')||claudeDir;})();const script=path.join(root,rel);if(fs.existsSync(script)){const result=spawnSync(process.execPath,[script,'stop:session-end','scripts/hooks/session-end.js','--request-file','scripts/hooks/requests/minimal-standard-strict.json'],{input:raw,encoding:'utf8',env:process.env,cwd:process.cwd(),timeout:30000});const stdout=typeof result.stdout==='string'?result.stdout:'';if(stdout)process.stdout.write(stdout);else process.stdout.write(raw);if(result.stderr)process.stderr.write(result.stderr);if(result.error||result.status===null||result.signal){const reason=result.error?result.error.message:(result.signal?'signal '+result.signal:'missing exit status');process.stderr.write('[Stop] ERROR: hook runner failed: '+reason+String.fromCharCode(10));process.exit(1);}process.exit(Number.isInteger(result.status)?result.status:0);}process.stderr.write('[Stop] WARNING: could not resolve OMF plugin root; skipping hook'+String.fromCharCode(10));process.stdout.write(raw);"10ms*node -e "const fs=require('fs');const path=require('path');const {spawnSync}=require('child_process');const raw=fs.readFileSync(0,'utf8');const rel=path.join('scripts','hooks','run-with-flags.js');const hasRunnerRoot=candidate=>{const value=typeof candidate==='string'?candidate.trim():'';return value.length>0&&fs.existsSync(path.join(path.resolve(value),rel));};const root=(()=>{const envRoot=process.env.CLAUDE_PLUGIN_ROOT||'';if(hasRunnerRoot(envRoot))return path.resolve(envRoot.trim());const home=require('os').homedir();const claudeDir=path.join(home,'.claude');if(hasRunnerRoot(claudeDir))return claudeDir;for(const candidate of [path.join(claudeDir,'plugins','oh-my-forge'),path.join(claudeDir,'plugins','oh-my-forge@rlagycks'),path.join(claudeDir,'plugins','marketplace','oh-my-forge'),path.join(claudeDir,'plugins','everything-claude-code'),path.join(claudeDir,'plugins','everything-claude-code@everything-claude-code'),path.join(claudeDir,'plugins','marketplace','everything-claude-code')]){if(hasRunnerRoot(candidate))return candidate;}const fromCache=name=>{try{const cacheBase=path.join(claudeDir,'plugins','cache',name);for(const org of fs.readdirSync(cacheBase,{withFileTypes:true})){if(!org.isDirectory())continue;for(const version of fs.readdirSync(path.join(cacheBase,org.name),{withFileTypes:true})){if(!version.isDirectory())continue;const candidate=path.join(cacheBase,org.name,version.name);if(hasRunnerRoot(candidate))return candidate;}}}catch{}return null;};return fromCache('oh-my-forge')||fromCache('everything-claude-code')||claudeDir;})();const script=path.join(root,rel);if(fs.existsSync(script)){const result=spawnSync(process.execPath,[script,'stop:evaluate-session','scripts/hooks/evaluate-session.js','--request-file','scripts/hooks/requests/minimal-standard-strict.json'],{input:raw,encoding:'utf8',env:process.env,cwd:process.cwd(),timeout:30000});const stdout=typeof result.stdout==='string'?result.stdout:'';if(stdout)process.stdout.write(stdout);else process.stdout.write(raw);if(result.stderr)process.stderr.write(result.stderr);if(result.error||result.status===null||result.signal){const reason=result.error?result.error.message:(result.signal?'signal '+result.signal:'missing exit status');process.stderr.write('[Stop] ERROR: hook runner failed: '+reason+String.fromCharCode(10));process.exit(1);}process.exit(Number.isInteger(result.status)?result.status:0);}process.stderr.write('[Stop] WARNING: could not resolve OMF plugin root; skipping hook'+String.fromCharCode(10));process.stdout.write(raw);"10ms*node -e "const fs=require('fs');const path=require('path');const {spawnSync}=require('child_process');const raw=fs.readFileSync(0,'utf8');const rel=path.join('scripts','hooks','run-with-flags.js');const hasRunnerRoot=candidate=>{const value=typeof candidate==='string'?candidate.trim():'';return value.length>0&&fs.existsSync(path.join(path.resolve(value),rel));};const root=(()=>{const envRoot=process.env.CLAUDE_PLUGIN_ROOT||'';if(hasRunnerRoot(envRoot))return path.resolve(envRoot.trim());const home=require('os').homedir();const claudeDir=path.join(home,'.claude');if(hasRunnerRoot(claudeDir))return claudeDir;for(const candidate of [path.join(claudeDir,'plugins','oh-my-forge'),path.join(claudeDir,'plugins','oh-my-forge@rlagycks'),path.join(claudeDir,'plugins','marketplace','oh-my-forge'),path.join(claudeDir,'plugins','everything-claude-code'),path.join(claudeDir,'plugins','everything-claude-code@everything-claude-code'),path.join(claudeDir,'plugins','marketplace','everything-claude-code')]){if(hasRunnerRoot(candidate))return candidate;}const fromCache=name=>{try{const cacheBase=path.join(claudeDir,'plugins','cache',name);for(const org of fs.readdirSync(cacheBase,{withFileTypes:true})){if(!org.isDirectory())continue;for(const version of fs.readdirSync(path.join(cacheBase,org.name),{withFileTypes:true})){if(!version.isDirectory())continue;const candidate=path.join(cacheBase,org.name,version.name);if(hasRunnerRoot(candidate))return candidate;}}}catch{}return null;};return fromCache('oh-my-forge')||fromCache('everything-claude-code')||claudeDir;})();const script=path.join(root,rel);if(fs.existsSync(script)){const result=spawnSync(process.execPath,[script,'stop:cost-tracker','scripts/hooks/cost-tracker.js','--request-file','scripts/hooks/requests/minimal-standard-strict.json'],{input:raw,encoding:'utf8',env:process.env,cwd:process.cwd(),timeout:30000});const stdout=typeof result.stdout==='string'?result.stdout:'';if(stdout)process.stdout.write(stdout);else process.stdout.write(raw);if(result.stderr)process.stderr.write(result.stderr);if(result.error||result.status===null||result.signal){const reason=result.error?result.error.message:(result.signal?'signal '+result.signal:'missing exit status');process.stderr.write('[Stop] ERROR: hook runner failed: '+reason+String.fromCharCode(10));process.exit(1);}process.exit(Number.isInteger(result.status)?result.status:0);}process.stderr.write('[Stop] WARNING: could not resolve OMF plugin root; skipping hook'+String.fromCharCode(10));process.stdout.write(raw);"10ms*node -e "const fs=require('fs');const path=require('path');const {spawnSync}=require('child_process');const raw=fs.readFileSync(0,'utf8');const rel=path.join('scripts','hooks','run-with-flags.js');const hasRunnerRoot=candidate=>{const value=typeof candidate==='string'?candidate.trim():'';return value.length>0&&fs.existsSync(path.join(path.resolve(value),rel));};const root=(()=>{const envRoot=process.env.CLAUDE_PLUGIN_ROOT||'';if(hasRunnerRoot(envRoot))return path.resolve(envRoot.trim());const home=require('os').homedir();const claudeDir=path.join(home,'.claude');if(hasRunnerRoot(claudeDir))return claudeDir;for(const candidate of [path.join(claudeDir,'plugins','oh-my-forge'),path.join(claudeDir,'plugins','oh-my-forge@rlagycks'),path.join(claudeDir,'plugins','marketplace','oh-my-forge'),path.join(claudeDir,'plugins','everything-claude-code'),path.join(claudeDir,'plugins','everything-claude-code@everything-claude-code'),path.join(claudeDir,'plugins','marketplace','everything-claude-code')]){if(hasRunnerRoot(candidate))return candidate;}const fromCache=name=>{try{const cacheBase=path.join(claudeDir,'plugins','cache',name);for(const org of fs.readdirSync(cacheBase,{withFileTypes:true})){if(!org.isDirectory())continue;for(const version of fs.readdirSync(path.join(cacheBase,org.name),{withFileTypes:true})){if(!version.isDirectory())continue;const candidate=path.join(cacheBase,org.name,version.name);if(hasRunnerRoot(candidate))return candidate;}}}catch{}return null;};return fromCache('oh-my-forge')||fromCache('everything-claude-code')||claudeDir;})();const script=path.join(root,rel);if(fs.existsSync(script)){const result=spawnSync(process.execPath,[script,'stop:diff-review-guard','scripts/hooks/stop-diff-review-guard.js','--request-file','scripts/hooks/requests/standard-strict.json'],{input:raw,encoding:'utf8',env:process.env,cwd:process.cwd(),timeout:15000});const stdout=typeof result.stdout==='string'?result.stdout:'';if(stdout)process.stdout.write(stdout);else process.stdout.write(raw);if(result.stderr)process.stderr.write(result.stderr);if(result.error||result.status===null||result.signal){const reason=result.error?result.error.message:(result.signal?'signal '+result.signal:'missing exit status');process.stderr.write('[Stop] ERROR: hook runner failed: '+reason+String.fromCharCode(10));process.exit(1);}process.exit(Number.isInteger(result.status)?result.status:0);}process.stderr.write('[Stop] WARNING: could not resolve OMF plugin root; skipping hook'+String.fromCharCode(10));process.stdout.write(raw);"15ms*node -e "const fs=require('fs');const path=require('path');const {spawnSync}=require('child_process');const raw=fs.readFileSync(0,'utf8');const rel=path.join('scripts','hooks','run-with-flags.js');const hasRunnerRoot=candidate=>{const value=typeof candidate==='string'?candidate.trim():'';return value.length>0&&fs.existsSync(path.join(path.resolve(value),rel));};const root=(()=>{const envRoot=process.env.CLAUDE_PLUGIN_ROOT||'';if(hasRunnerRoot(envRoot))return path.resolve(envRoot.trim());const home=require('os').homedir();const claudeDir=path.join(home,'.claude');if(hasRunnerRoot(claudeDir))return claudeDir;for(const candidate of [path.join(claudeDir,'plugins','oh-my-forge'),path.join(claudeDir,'plugins','oh-my-forge@rlagycks'),path.join(claudeDir,'plugins','marketplace','oh-my-forge'),path.join(claudeDir,'plugins','everything-claude-code'),path.join(claudeDir,'plugins','everything-claude-code@everything-claude-code'),path.join(claudeDir,'plugins','marketplace','everything-claude-code')]){if(hasRunnerRoot(candidate))return candidate;}const fromCache=name=>{try{const cacheBase=path.join(claudeDir,'plugins','cache',name);for(const org of fs.readdirSync(cacheBase,{withFileTypes:true})){if(!org.isDirectory())continue;for(const version of fs.readdirSync(path.join(cacheBase,org.name),{withFileTypes:true})){if(!version.isDirectory())continue;const candidate=path.join(cacheBase,org.name,version.name);if(hasRunnerRoot(candidate))return candidate;}}}catch{}return null;};return fromCache('oh-my-forge')||fromCache('everything-claude-code')||claudeDir;})();const script=path.join(root,rel);if(fs.existsSync(script)){const result=spawnSync(process.execPath,[script,'stop:desktop-notify','scripts/hooks/desktop-notify.js','--request-file','scripts/hooks/requests/standard-strict.json'],{input:raw,encoding:'utf8',env:process.env,cwd:process.cwd(),timeout:30000});const stdout=typeof result.stdout==='string'?result.stdout:'';if(stdout)process.stdout.write(stdout);else process.stdout.write(raw);if(result.stderr)process.stderr.write(result.stderr);if(result.error||result.status===null||result.signal){const reason=result.error?result.error.message:(result.signal?'signal '+result.signal:'missing exit status');process.stderr.write('[Stop] ERROR: hook runner failed: '+reason+String.fromCharCode(10));process.exit(1);}process.exit(Number.isInteger(result.status)?result.status:0);}process.stderr.write('[Stop] WARNING: could not resolve OMF plugin root; skipping hook'+String.fromCharCode(10));process.stdout.write(raw);"10ms*node "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags.js" "pre:compact" "scripts/hooks/pre-compact.js" --request-file "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/requests/standard-strict.json"Bashnpx block-no-verify@1.1.2Bashnode "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/auto-tmux-dev.js"Bashnode "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags.js" "pre:bash:tmux-reminder" "scripts/hooks/pre-bash-tmux-reminder.js" --request-file "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/requests/strict.json"Bashnode "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags.js" "pre:bash:codex-guard" "scripts/hooks/pre-bash-codex-guard.js" --request-file "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/requests/standard-strict.json"Bashnode "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags.js" "pre:bash:git-push-reminder" "scripts/hooks/pre-bash-git-push-reminder.js" --request-file "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/requests/strict.json"Bashnode "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags.js" "pre:bash:commit-quality" "scripts/hooks/pre-bash-commit-quality.js" --request-file "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/requests/strict.json"Writenode "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags.js" "pre:write:doc-file-warning" "scripts/hooks/doc-file-warning.js" --request-file "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/requests/standard-strict.json"Edit|Writenode "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags.js" "pre:edit-write:suggest-compact" "scripts/hooks/suggest-compact.js" --request-file "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/requests/standard-strict.json"*bash "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags-shell.sh" "pre:observe" "skills/continuous-learning-v2/hooks/observe.sh" --request-file "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/requests/standard-strict.json"10msBash|Write|Edit|MultiEditnode "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags.js" "pre:insaits-security" "scripts/hooks/insaits-security-wrapper.js" --request-file "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/requests/standard-strict.json"15msBash|Write|Edit|MultiEditnode "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags.js" "pre:governance-capture" "scripts/hooks/governance-capture.js" --request-file "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/requests/standard-strict.json"10msWrite|Edit|MultiEditnode "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags.js" "pre:config-protection" "scripts/hooks/config-protection.js" --request-file "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/requests/standard-strict.json"5msWrite|Edit|MultiEditnode "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags.js" "pre:qa-context-inject" "scripts/hooks/qa-context-inject.js" --request-file "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/requests/standard-strict.json"5msRead|Write|Edit|MultiEditnode "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags.js" "pre:domain-context-inject" "scripts/hooks/domain-context-inject.js" --request-file "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/requests/standard-strict.json"5msWrite|Edit|MultiEditnode "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags.js" "pre:constraint-guard" "scripts/hooks/constraint-guard.js" --request-file "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/requests/standard-strict.json"5msWrite|Edit|MultiEditnode "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags.js" "pre:write-edit:codex-guard" "scripts/hooks/pre-write-edit-codex-guard.js" --request-file "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/requests/standard-strict.json"5ms*node "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags.js" "pre:mcp-health-check" "scripts/hooks/mcp-health-check.js" --request-file "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/requests/standard-strict.json"*node -e "const fs=require('fs');const path=require('path');const {spawnSync}=require('child_process');const raw=fs.readFileSync(0,'utf8');const rel=path.join('scripts','hooks','run-with-flags.js');const hasRunnerRoot=candidate=>{const value=typeof candidate==='string'?candidate.trim():'';return value.length>0&&fs.existsSync(path.join(path.resolve(value),rel));};const root=(()=>{const envRoot=process.env.CLAUDE_PLUGIN_ROOT||'';if(hasRunnerRoot(envRoot))return path.resolve(envRoot.trim());const home=require('os').homedir();const claudeDir=path.join(home,'.claude');if(hasRunnerRoot(claudeDir))return claudeDir;for(const candidate of [path.join(claudeDir,'plugins','oh-my-forge'),path.join(claudeDir,'plugins','oh-my-forge@rlagycks'),path.join(claudeDir,'plugins','marketplace','oh-my-forge'),path.join(claudeDir,'plugins','everything-claude-code'),path.join(claudeDir,'plugins','everything-claude-code@everything-claude-code'),path.join(claudeDir,'plugins','marketplace','everything-claude-code')]){if(hasRunnerRoot(candidate))return candidate;}const fromCache=name=>{try{const cacheBase=path.join(claudeDir,'plugins','cache',name);for(const org of fs.readdirSync(cacheBase,{withFileTypes:true})){if(!org.isDirectory())continue;for(const version of fs.readdirSync(path.join(cacheBase,org.name),{withFileTypes:true})){if(!version.isDirectory())continue;const candidate=path.join(cacheBase,org.name,version.name);if(hasRunnerRoot(candidate))return candidate;}}}catch{}return null;};return fromCache('oh-my-forge')||fromCache('everything-claude-code')||claudeDir;})();const script=path.join(root,rel);if(fs.existsSync(script)){const result=spawnSync(process.execPath,[script,'session:end:marker','scripts/hooks/session-end-marker.js','--request-file','scripts/hooks/requests/minimal-standard-strict.json'],{input:raw,encoding:'utf8',env:process.env,cwd:process.cwd(),timeout:30000});const stdout=typeof result.stdout==='string'?result.stdout:'';if(stdout)process.stdout.write(stdout);else process.stdout.write(raw);if(result.stderr)process.stderr.write(result.stderr);if(result.error||result.status===null||result.signal){const reason=result.error?result.error.message:(result.signal?'signal '+result.signal:'missing exit status');process.stderr.write('[SessionEnd] ERROR: hook runner failed: '+reason+String.fromCharCode(10));process.exit(1);}process.exit(Number.isInteger(result.status)?result.status:0);}process.stderr.write('[SessionEnd] WARNING: could not resolve OMF plugin root; skipping hook'+String.fromCharCode(10));process.stdout.write(raw);"10msBashnode "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags.js" "post:bash:error-tracker" "scripts/hooks/error-tracker.js" --request-file "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/requests/standard-strict.json"Bashnode "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags.js" "post:bash:commit-rca" "scripts/hooks/post-bash-commit-rca.js" --request-file "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/requests/standard-strict.json"Edit|Write|MultiEditnode "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags.js" "post:edit:bug-fix-enforcer" "scripts/hooks/bug-fix-enforcer.js" --request-file "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/requests/standard-strict.json"Bashnode "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags.js" "post:bash:command-log" "scripts/hooks/bash-command-log.js" --request-file "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/requests/standard-strict.json"Bashnode "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags.js" "post:bash:pr-created" "scripts/hooks/post-bash-pr-created.js" --request-file "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/requests/standard-strict.json"Bashnode "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags.js" "post:bash:codex-diff-inject" "scripts/hooks/post-bash-codex-diff-inject.js" --request-file "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/requests/standard-strict.json"20msBashnode "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags.js" "post:bash:build-complete" "scripts/hooks/post-bash-build-complete.js" --request-file "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/requests/standard-strict.json"30msEdit|Write|MultiEditnode "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags.js" "post:quality-gate" "scripts/hooks/quality-gate.js" --request-file "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/requests/standard-strict.json"30msEdit|Write|MultiEditnode "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags.js" "post:edit:accumulate" "scripts/hooks/post-edit-accumulator.js" --request-file "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/requests/standard-strict.json"Editnode "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags.js" "post:edit:console-warn" "scripts/hooks/post-edit-console-warn.js" --request-file "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/requests/standard-strict.json"Edit|Write|MultiEditnode "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags.js" "post:edit:ontology-check" "scripts/hooks/post-edit-ontology-check.js" --request-file "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/requests/standard-strict.json"20msBash|Write|Edit|MultiEditnode "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags.js" "post:governance-capture" "scripts/hooks/governance-capture.js" --request-file "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/requests/standard-strict.json"10ms*bash "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags-shell.sh" "post:observe" "skills/continuous-learning-v2/hooks/observe.sh" --request-file "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/requests/standard-strict.json"10ms*node "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/session-start-bootstrap.js"*node "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags.js" "post:mcp-health-check" "scripts/hooks/mcp-health-check.js" --request-file "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/requests/standard-strict.json"Share bugs, ideas, or general feedback.