Stats
Actions
Tags
From Buildomator
Enforces safe team AI workflows: blocks Write/Edit on secrets/.env/credentials, git commits/pushes to main/production, warns on stale team-state.md, logs states/sessions via bash. Writes files.
6 events · 17 hooks
Safety 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 f=require('fs'),p=require('path'),o=require('os'),c=[];if(process.env.CLAUDE_PLUGIN_ROOT)c.push(p.join(process.env.CLAUDE_PLUGIN_ROOT,'bin/gsd-tools.cjs'));const b=p.join(o.homedir(),'.claude/plugins/cache'),g='bm',t=[];try{for(const m of f.readdirSync(b)){try{for(const v of f.readdirSync(p.join(b,m,g)))if(/^\d+\.\d+\.\d+$/.test(v))t.push([v,p.join(b,m,g,v,'bin/gsd-tools.cjs')]);}catch(e){}}}catch(e){}t.sort((a,z)=>{const A=a[0].split('.').map(Number),B=z[0].split('.').map(Number);return B[0]-A[0]||B[1]-A[1]||B[2]-A[2];});for(const e of t)c.push(e[1]);for(const x of c){if(!f.existsSync(x))continue;if(process.env.CLAUDE_PLUGIN_ROOT&&x!==c[0])process.stderr.write('GSD: plugin path stale, using '+x+'\n');process.argv.splice(1,0,x);require(x);break;}" hook stop3000msnode -e "const f=require('fs'),p=require('path'),o=require('os'),c=[];if(process.env.CLAUDE_PLUGIN_ROOT)c.push(p.join(process.env.CLAUDE_PLUGIN_ROOT,'bin/gsd-tools.cjs'));const b=p.join(o.homedir(),'.claude/plugins/cache'),g='bm',t=[];try{for(const m of f.readdirSync(b)){try{for(const v of f.readdirSync(p.join(b,m,g)))if(/^\d+\.\d+\.\d+$/.test(v))t.push([v,p.join(b,m,g,v,'bin/gsd-tools.cjs')]);}catch(e){}}}catch(e){}t.sort((a,z)=>{const A=a[0].split('.').map(Number),B=z[0].split('.').map(Number);return B[0]-A[0]||B[1]-A[1]||B[2]-A[2];});for(const e of t)c.push(e[1]);for(const x of c){if(!f.existsSync(x))continue;if(process.env.CLAUDE_PLUGIN_ROOT&&x!==c[0])process.stderr.write('GSD: plugin path stale, using '+x+'\n');process.argv.splice(1,0,x);require(x);break;}" hook pre-compact5000msEdit|Writenode -e "const f=require('fs'),p=require('path'),o=require('os'),c=[];if(process.env.CLAUDE_PLUGIN_ROOT)c.push(p.join(process.env.CLAUDE_PLUGIN_ROOT,'bin/gsd-tools.cjs'));const b=p.join(o.homedir(),'.claude/plugins/cache'),g='bm',t=[];try{for(const m of f.readdirSync(b)){try{for(const v of f.readdirSync(p.join(b,m,g)))if(/^\d+\.\d+\.\d+$/.test(v))t.push([v,p.join(b,m,g,v,'bin/gsd-tools.cjs')]);}catch(e){}}}catch(e){}t.sort((a,z)=>{const A=a[0].split('.').map(Number),B=z[0].split('.').map(Number);return B[0]-A[0]||B[1]-A[1]||B[2]-A[2];});for(const e of t)c.push(e[1]);for(const x of c){if(!f.existsSync(x))continue;if(process.env.CLAUDE_PLUGIN_ROOT&&x!==c[0])process.stderr.write('GSD: plugin path stale, using '+x+'\n');process.argv.splice(1,0,x);require(x);break;}" hook pre-tool-use3000msEdit|Writenode -e "const f=require('fs'),p=require('path'),o=require('os'),c=[];if(process.env.CLAUDE_PLUGIN_ROOT)c.push(p.join(process.env.CLAUDE_PLUGIN_ROOT,'hooks/gsd-prompt-guard.js'));const b=p.join(o.homedir(),'.claude/plugins/cache'),g='bm',t=[];try{for(const m of f.readdirSync(b)){try{for(const v of f.readdirSync(p.join(b,m,g)))if(/^\d+\.\d+\.\d+$/.test(v))t.push([v,p.join(b,m,g,v,'hooks/gsd-prompt-guard.js')]);}catch(e){}}}catch(e){}t.sort((a,z)=>{const A=a[0].split('.').map(Number),B=z[0].split('.').map(Number);return B[0]-A[0]||B[1]-A[1]||B[2]-A[2];});for(const e of t)c.push(e[1]);for(const x of c){if(!f.existsSync(x))continue;if(process.env.CLAUDE_PLUGIN_ROOT&&x!==c[0])process.stderr.write('GSD: plugin path stale, using '+x+'\n');process.argv.splice(1,0,x);require(x);break;}"3000msEdit|Writenode -e "const f=require('fs'),p=require('path'),o=require('os'),c=[];if(process.env.CLAUDE_PLUGIN_ROOT)c.push(p.join(process.env.CLAUDE_PLUGIN_ROOT,'hooks/gsd-workflow-guard.js'));const b=p.join(o.homedir(),'.claude/plugins/cache'),g='bm',t=[];try{for(const m of f.readdirSync(b)){try{for(const v of f.readdirSync(p.join(b,m,g)))if(/^\d+\.\d+\.\d+$/.test(v))t.push([v,p.join(b,m,g,v,'hooks/gsd-workflow-guard.js')]);}catch(e){}}}catch(e){}t.sort((a,z)=>{const A=a[0].split('.').map(Number),B=z[0].split('.').map(Number);return B[0]-A[0]||B[1]-A[1]||B[2]-A[2];});for(const e of t)c.push(e[1]);for(const x of c){if(!f.existsSync(x))continue;if(process.env.CLAUDE_PLUGIN_ROOT&&x!==c[0])process.stderr.write('GSD: plugin path stale, using '+x+'\n');process.argv.splice(1,0,x);require(x);break;}"3000msEdit|Writenode -e "const f=require('fs'),p=require('path'),o=require('os'),c=[];if(process.env.CLAUDE_PLUGIN_ROOT)c.push(p.join(process.env.CLAUDE_PLUGIN_ROOT,'hooks/gsd-read-guard.js'));const b=p.join(o.homedir(),'.claude/plugins/cache'),g='bm',t=[];try{for(const m of f.readdirSync(b)){try{for(const v of f.readdirSync(p.join(b,m,g)))if(/^\d+\.\d+\.\d+$/.test(v))t.push([v,p.join(b,m,g,v,'hooks/gsd-read-guard.js')]);}catch(e){}}}catch(e){}t.sort((a,z)=>{const A=a[0].split('.').map(Number),B=z[0].split('.').map(Number);return B[0]-A[0]||B[1]-A[1]||B[2]-A[2];});for(const e of t)c.push(e[1]);for(const x of c){if(!f.existsSync(x))continue;if(process.env.CLAUDE_PLUGIN_ROOT&&x!==c[0])process.stderr.write('GSD: plugin path stale, using '+x+'\n');process.argv.splice(1,0,x);require(x);break;}"3000msBashnode -e "const f=require('fs'),p=require('path'),o=require('os'),cp=require('child_process'),c=[];if(process.env.CLAUDE_PLUGIN_ROOT)c.push(p.join(process.env.CLAUDE_PLUGIN_ROOT,'hooks/run-bash-hook.cjs'));const b=p.join(o.homedir(),'.claude/plugins/cache'),g='bm',t=[];try{for(const m of f.readdirSync(b)){try{for(const v of f.readdirSync(p.join(b,m,g)))if(/^\d+\.\d+\.\d+$/.test(v))t.push([v,p.join(b,m,g,v,'hooks/run-bash-hook.cjs')]);}catch(e){}}}catch(e){}t.sort((a,z)=>{const A=a[0].split('.').map(Number),B=z[0].split('.').map(Number);return B[0]-A[0]||B[1]-A[1]||B[2]-A[2];});for(const e of t)c.push(e[1]);for(const x of c){if(!f.existsSync(x))continue;if(process.env.CLAUDE_PLUGIN_ROOT&&x!==c[0])process.stderr.write('GSD: plugin path stale, using '+x+'\n');const r=cp.spawnSync(process.execPath,[x,'gsd-validate-commit.sh'],{stdio:'inherit'});process.exit(r.status||0);}"3000msBash|Edit|Write|MultiEdit|NotebookEdit|Read|Grep|Glob|WebFetch|WebSearchnode -e "const f=require('fs'),p=require('path'),o=require('os'),c=[];if(process.env.CLAUDE_PLUGIN_ROOT)c.push(p.join(process.env.CLAUDE_PLUGIN_ROOT,'bin/gsd-tools.cjs'));const b=p.join(o.homedir(),'.claude/plugins/cache'),g='bm',t=[];try{for(const m of f.readdirSync(b)){try{for(const v of f.readdirSync(p.join(b,m,g)))if(/^\d+\.\d+\.\d+$/.test(v))t.push([v,p.join(b,m,g,v,'bin/gsd-tools.cjs')]);}catch(e){}}}catch(e){}t.sort((a,z)=>{const A=a[0].split('.').map(Number),B=z[0].split('.').map(Number);return B[0]-A[0]||B[1]-A[1]||B[2]-A[2];});for(const e of t)c.push(e[1]);for(const x of c){if(!f.existsSync(x))continue;if(process.env.CLAUDE_PLUGIN_ROOT&&x!==c[0])process.stderr.write('GSD: plugin path stale, using '+x+'\n');process.argv.splice(1,0,x);require(x);break;}" hook post-tool-use3000msBashnode -e "const f=require('fs'),p=require('path'),o=require('os'),c=[];if(process.env.CLAUDE_PLUGIN_ROOT)c.push(p.join(process.env.CLAUDE_PLUGIN_ROOT,'hooks/gsd-auth-detector.js'));const b=p.join(o.homedir(),'.claude/plugins/cache'),g='bm',t=[];try{for(const m of f.readdirSync(b)){try{for(const v of f.readdirSync(p.join(b,m,g)))if(/^\d+\.\d+\.\d+$/.test(v))t.push([v,p.join(b,m,g,v,'hooks/gsd-auth-detector.js')]);}catch(e){}}}catch(e){}t.sort((a,z)=>{const A=a[0].split('.').map(Number),B=z[0].split('.').map(Number);return B[0]-A[0]||B[1]-A[1]||B[2]-A[2];});for(const e of t)c.push(e[1]);for(const x of c){if(!f.existsSync(x))continue;if(process.env.CLAUDE_PLUGIN_ROOT&&x!==c[0])process.stderr.write('GSD: plugin path stale, using '+x+'\n');process.argv.splice(1,0,x);require(x);break;}"3000msReadnode -e "const f=require('fs'),p=require('path'),o=require('os'),c=[];if(process.env.CLAUDE_PLUGIN_ROOT)c.push(p.join(process.env.CLAUDE_PLUGIN_ROOT,'hooks/gsd-read-injection-scanner.js'));const b=p.join(o.homedir(),'.claude/plugins/cache'),g='bm',t=[];try{for(const m of f.readdirSync(b)){try{for(const v of f.readdirSync(p.join(b,m,g)))if(/^\d+\.\d+\.\d+$/.test(v))t.push([v,p.join(b,m,g,v,'hooks/gsd-read-injection-scanner.js')]);}catch(e){}}}catch(e){}t.sort((a,z)=>{const A=a[0].split('.').map(Number),B=z[0].split('.').map(Number);return B[0]-A[0]||B[1]-A[1]||B[2]-A[2];});for(const e of t)c.push(e[1]);for(const x of c){if(!f.existsSync(x))continue;if(process.env.CLAUDE_PLUGIN_ROOT&&x!==c[0])process.stderr.write('GSD: plugin path stale, using '+x+'\n');process.argv.splice(1,0,x);require(x);break;}"5000msWrite|Edit|MultiEditnode -e "const f=require('fs'),p=require('path'),o=require('os'),cp=require('child_process'),c=[];if(process.env.CLAUDE_PLUGIN_ROOT)c.push(p.join(process.env.CLAUDE_PLUGIN_ROOT,'hooks/run-bash-hook.cjs'));const b=p.join(o.homedir(),'.claude/plugins/cache'),g='bm',t=[];try{for(const m of f.readdirSync(b)){try{for(const v of f.readdirSync(p.join(b,m,g)))if(/^\d+\.\d+\.\d+$/.test(v))t.push([v,p.join(b,m,g,v,'hooks/run-bash-hook.cjs')]);}catch(e){}}}catch(e){}t.sort((a,z)=>{const A=a[0].split('.').map(Number),B=z[0].split('.').map(Number);return B[0]-A[0]||B[1]-A[1]||B[2]-A[2];});for(const e of t)c.push(e[1]);for(const x of c){if(!f.existsSync(x))continue;if(process.env.CLAUDE_PLUGIN_ROOT&&x!==c[0])process.stderr.write('GSD: plugin path stale, using '+x+'\n');const r=cp.spawnSync(process.execPath,[x,'gsd-phase-boundary.sh'],{stdio:'inherit'});process.exit(r.status||0);}"3000msBash|Edit|Write|MultiEdit|Agent|Tasknode -e "const f=require('fs'),p=require('path'),o=require('os'),c=[];if(process.env.CLAUDE_PLUGIN_ROOT)c.push(p.join(process.env.CLAUDE_PLUGIN_ROOT,'hooks/gsd-context-monitor.js'));const b=p.join(o.homedir(),'.claude/plugins/cache'),g='bm',t=[];try{for(const m of f.readdirSync(b)){try{for(const v of f.readdirSync(p.join(b,m,g)))if(/^\d+\.\d+\.\d+$/.test(v))t.push([v,p.join(b,m,g,v,'hooks/gsd-context-monitor.js')]);}catch(e){}}}catch(e){}t.sort((a,z)=>{const A=a[0].split('.').map(Number),B=z[0].split('.').map(Number);return B[0]-A[0]||B[1]-A[1]||B[2]-A[2];});for(const e of t)c.push(e[1]);for(const x of c){if(!f.existsSync(x))continue;if(process.env.CLAUDE_PLUGIN_ROOT&&x!==c[0])process.stderr.write('GSD: plugin path stale, using '+x+'\n');process.argv.splice(1,0,x);require(x);break;}"10000msnode -e "const f=require('fs'),p=require('path'),o=require('os'),c=[];if(process.env.CLAUDE_PLUGIN_ROOT)c.push(p.join(process.env.CLAUDE_PLUGIN_ROOT,'bin/gsd-tools.cjs'));const b=p.join(o.homedir(),'.claude/plugins/cache'),g='bm',t=[];try{for(const m of f.readdirSync(b)){try{for(const v of f.readdirSync(p.join(b,m,g)))if(/^\d+\.\d+\.\d+$/.test(v))t.push([v,p.join(b,m,g,v,'bin/gsd-tools.cjs')]);}catch(e){}}}catch(e){}t.sort((a,z)=>{const A=a[0].split('.').map(Number),B=z[0].split('.').map(Number);return B[0]-A[0]||B[1]-A[1]||B[2]-A[2];});for(const e of t)c.push(e[1]);for(const x of c){if(!f.existsSync(x))continue;if(process.env.CLAUDE_PLUGIN_ROOT&&x!==c[0])process.stderr.write('GSD: plugin path stale, using '+x+'\n');process.argv.splice(1,0,x);require(x);break;}" hook session-start5000msnode -e "const f=require('fs'),p=require('path'),o=require('os'),cp=require('child_process'),c=[];if(process.env.CLAUDE_PLUGIN_ROOT)c.push(p.join(process.env.CLAUDE_PLUGIN_ROOT,'hooks/run-bash-hook.cjs'));const b=p.join(o.homedir(),'.claude/plugins/cache'),g='bm',t=[];try{for(const m of f.readdirSync(b)){try{for(const v of f.readdirSync(p.join(b,m,g)))if(/^\d+\.\d+\.\d+$/.test(v))t.push([v,p.join(b,m,g,v,'hooks/run-bash-hook.cjs')]);}catch(e){}}}catch(e){}t.sort((a,z)=>{const A=a[0].split('.').map(Number),B=z[0].split('.').map(Number);return B[0]-A[0]||B[1]-A[1]||B[2]-A[2];});for(const e of t)c.push(e[1]);for(const x of c){if(!f.existsSync(x))continue;if(process.env.CLAUDE_PLUGIN_ROOT&&x!==c[0])process.stderr.write('GSD: plugin path stale, using '+x+'\n');const r=cp.spawnSync(process.execPath,[x,'gsd-session-state.sh'],{stdio:'inherit'});process.exit(r.status||0);}"3000msnode -e "const f=require('fs'),p=require('path'),o=require('os'),c=[];if(process.env.CLAUDE_PLUGIN_ROOT)c.push(p.join(process.env.CLAUDE_PLUGIN_ROOT,'hooks/gsd-shadowing-sdk-detector.js'));const b=p.join(o.homedir(),'.claude/plugins/cache'),g='bm',t=[];try{for(const m of f.readdirSync(b)){try{for(const v of f.readdirSync(p.join(b,m,g)))if(/^\d+\.\d+\.\d+$/.test(v))t.push([v,p.join(b,m,g,v,'hooks/gsd-shadowing-sdk-detector.js')]);}catch(e){}}}catch(e){}t.sort((a,z)=>{const A=a[0].split('.').map(Number),B=z[0].split('.').map(Number);return B[0]-A[0]||B[1]-A[1]||B[2]-A[2];});for(const e of t)c.push(e[1]);for(const x of c){if(!f.existsSync(x))continue;if(process.env.CLAUDE_PLUGIN_ROOT&&x!==c[0])process.stderr.write('GSD: plugin path stale, using '+x+'\n');process.argv.splice(1,0,x);require(x);break;}"3000msnode -e "const f=require('fs'),p=require('path'),o=require('os'),c=[];if(process.env.CLAUDE_PLUGIN_ROOT)c.push(p.join(process.env.CLAUDE_PLUGIN_ROOT,'hooks/gsd-staleness-reminder.js'));const b=p.join(o.homedir(),'.claude/plugins/cache'),g='bm',t=[];try{for(const m of f.readdirSync(b)){try{for(const v of f.readdirSync(p.join(b,m,g)))if(/^\d+\.\d+\.\d+$/.test(v))t.push([v,p.join(b,m,g,v,'hooks/gsd-staleness-reminder.js')]);}catch(e){}}}catch(e){}t.sort((a,z)=>{const A=a[0].split('.').map(Number),B=z[0].split('.').map(Number);return B[0]-A[0]||B[1]-A[1]||B[2]-A[2];});for(const e of t)c.push(e[1]);for(const x of c){if(!f.existsSync(x))continue;if(process.env.CLAUDE_PLUGIN_ROOT&&x!==c[0])process.stderr.write('GSD: plugin path stale, using '+x+'\n');process.argv.splice(1,0,x);require(x);break;}"3000msnode -e "const f=require('fs'),p=require('path'),o=require('os'),c=[];if(process.env.CLAUDE_PLUGIN_ROOT)c.push(p.join(process.env.CLAUDE_PLUGIN_ROOT,'hooks/gsd-context-monitor.js'));const b=p.join(o.homedir(),'.claude/plugins/cache'),g='bm',t=[];try{for(const m of f.readdirSync(b)){try{for(const v of f.readdirSync(p.join(b,m,g)))if(/^\d+\.\d+\.\d+$/.test(v))t.push([v,p.join(b,m,g,v,'hooks/gsd-context-monitor.js')]);}catch(e){}}}catch(e){}t.sort((a,z)=>{const A=a[0].split('.').map(Number),B=z[0].split('.').map(Number);return B[0]-A[0]||B[1]-A[1]||B[2]-A[2];});for(const e of t)c.push(e[1]);for(const x of c){if(!f.existsSync(x))continue;if(process.env.CLAUDE_PLUGIN_ROOT&&x!==c[0])process.stderr.write('GSD: plugin path stale, using '+x+'\n');process.argv.splice(1,0,x);require(x);break;}"10000msnpx claudepluginhub buildomator/buildomator --plugin bm3plugins reuse this hooks config
First indexed Jan 9, 2026