Stats
Actions
Tags
From gsd
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 d=p.join(o.homedir(),'.claude/plugins/cache/gsd-plugin/gsd');try{for(const v of f.readdirSync(d).filter(x=>/^\d+\.\d+\.\d+$/.test(x)).sort((a,b)=>{const A=a.split('.').map(Number),B=b.split('.').map(Number);return B[0]-A[0]||B[1]-A[1]||B[2]-A[2];}))c.push(p.join(d,v,'bin/gsd-tools.cjs'));}catch(e){}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 d=p.join(o.homedir(),'.claude/plugins/cache/gsd-plugin/gsd');try{for(const v of f.readdirSync(d).filter(x=>/^\d+\.\d+\.\d+$/.test(x)).sort((a,b)=>{const A=a.split('.').map(Number),B=b.split('.').map(Number);return B[0]-A[0]||B[1]-A[1]||B[2]-A[2];}))c.push(p.join(d,v,'bin/gsd-tools.cjs'));}catch(e){}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 d=p.join(o.homedir(),'.claude/plugins/cache/gsd-plugin/gsd');try{for(const v of f.readdirSync(d).filter(x=>/^\d+\.\d+\.\d+$/.test(x)).sort((a,b)=>{const A=a.split('.').map(Number),B=b.split('.').map(Number);return B[0]-A[0]||B[1]-A[1]||B[2]-A[2];}))c.push(p.join(d,v,'bin/gsd-tools.cjs'));}catch(e){}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 d=p.join(o.homedir(),'.claude/plugins/cache/gsd-plugin/gsd');try{for(const v of f.readdirSync(d).filter(x=>/^\d+\.\d+\.\d+$/.test(x)).sort((a,b)=>{const A=a.split('.').map(Number),B=b.split('.').map(Number);return B[0]-A[0]||B[1]-A[1]||B[2]-A[2];}))c.push(p.join(d,v,'hooks/gsd-prompt-guard.js'));}catch(e){}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 d=p.join(o.homedir(),'.claude/plugins/cache/gsd-plugin/gsd');try{for(const v of f.readdirSync(d).filter(x=>/^\d+\.\d+\.\d+$/.test(x)).sort((a,b)=>{const A=a.split('.').map(Number),B=b.split('.').map(Number);return B[0]-A[0]||B[1]-A[1]||B[2]-A[2];}))c.push(p.join(d,v,'hooks/gsd-workflow-guard.js'));}catch(e){}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 d=p.join(o.homedir(),'.claude/plugins/cache/gsd-plugin/gsd');try{for(const v of f.readdirSync(d).filter(x=>/^\d+\.\d+\.\d+$/.test(x)).sort((a,b)=>{const A=a.split('.').map(Number),B=b.split('.').map(Number);return B[0]-A[0]||B[1]-A[1]||B[2]-A[2];}))c.push(p.join(d,v,'hooks/gsd-read-guard.js'));}catch(e){}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 d=p.join(o.homedir(),'.claude/plugins/cache/gsd-plugin/gsd');try{for(const v of f.readdirSync(d).filter(x=>/^\d+\.\d+\.\d+$/.test(x)).sort((a,b)=>{const A=a.split('.').map(Number),B=b.split('.').map(Number);return B[0]-A[0]||B[1]-A[1]||B[2]-A[2];}))c.push(p.join(d,v,'hooks/run-bash-hook.cjs'));}catch(e){}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 d=p.join(o.homedir(),'.claude/plugins/cache/gsd-plugin/gsd');try{for(const v of f.readdirSync(d).filter(x=>/^\d+\.\d+\.\d+$/.test(x)).sort((a,b)=>{const A=a.split('.').map(Number),B=b.split('.').map(Number);return B[0]-A[0]||B[1]-A[1]||B[2]-A[2];}))c.push(p.join(d,v,'bin/gsd-tools.cjs'));}catch(e){}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 d=p.join(o.homedir(),'.claude/plugins/cache/gsd-plugin/gsd');try{for(const v of f.readdirSync(d).filter(x=>/^\d+\.\d+\.\d+$/.test(x)).sort((a,b)=>{const A=a.split('.').map(Number),B=b.split('.').map(Number);return B[0]-A[0]||B[1]-A[1]||B[2]-A[2];}))c.push(p.join(d,v,'hooks/gsd-auth-detector.js'));}catch(e){}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 d=p.join(o.homedir(),'.claude/plugins/cache/gsd-plugin/gsd');try{for(const v of f.readdirSync(d).filter(x=>/^\d+\.\d+\.\d+$/.test(x)).sort((a,b)=>{const A=a.split('.').map(Number),B=b.split('.').map(Number);return B[0]-A[0]||B[1]-A[1]||B[2]-A[2];}))c.push(p.join(d,v,'hooks/gsd-read-injection-scanner.js'));}catch(e){}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 d=p.join(o.homedir(),'.claude/plugins/cache/gsd-plugin/gsd');try{for(const v of f.readdirSync(d).filter(x=>/^\d+\.\d+\.\d+$/.test(x)).sort((a,b)=>{const A=a.split('.').map(Number),B=b.split('.').map(Number);return B[0]-A[0]||B[1]-A[1]||B[2]-A[2];}))c.push(p.join(d,v,'hooks/run-bash-hook.cjs'));}catch(e){}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 d=p.join(o.homedir(),'.claude/plugins/cache/gsd-plugin/gsd');try{for(const v of f.readdirSync(d).filter(x=>/^\d+\.\d+\.\d+$/.test(x)).sort((a,b)=>{const A=a.split('.').map(Number),B=b.split('.').map(Number);return B[0]-A[0]||B[1]-A[1]||B[2]-A[2];}))c.push(p.join(d,v,'hooks/gsd-context-monitor.js'));}catch(e){}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 d=p.join(o.homedir(),'.claude/plugins/cache/gsd-plugin/gsd');try{for(const v of f.readdirSync(d).filter(x=>/^\d+\.\d+\.\d+$/.test(x)).sort((a,b)=>{const A=a.split('.').map(Number),B=b.split('.').map(Number);return B[0]-A[0]||B[1]-A[1]||B[2]-A[2];}))c.push(p.join(d,v,'bin/gsd-tools.cjs'));}catch(e){}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 d=p.join(o.homedir(),'.claude/plugins/cache/gsd-plugin/gsd');try{for(const v of f.readdirSync(d).filter(x=>/^\d+\.\d+\.\d+$/.test(x)).sort((a,b)=>{const A=a.split('.').map(Number),B=b.split('.').map(Number);return B[0]-A[0]||B[1]-A[1]||B[2]-A[2];}))c.push(p.join(d,v,'hooks/run-bash-hook.cjs'));}catch(e){}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 d=p.join(o.homedir(),'.claude/plugins/cache/gsd-plugin/gsd');try{for(const v of f.readdirSync(d).filter(x=>/^\d+\.\d+\.\d+$/.test(x)).sort((a,b)=>{const A=a.split('.').map(Number),B=b.split('.').map(Number);return B[0]-A[0]||B[1]-A[1]||B[2]-A[2];}))c.push(p.join(d,v,'hooks/gsd-shadowing-sdk-detector.js'));}catch(e){}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 d=p.join(o.homedir(),'.claude/plugins/cache/gsd-plugin/gsd');try{for(const v of f.readdirSync(d).filter(x=>/^\d+\.\d+\.\d+$/.test(x)).sort((a,b)=>{const A=a.split('.').map(Number),B=b.split('.').map(Number);return B[0]-A[0]||B[1]-A[1]||B[2]-A[2];}))c.push(p.join(d,v,'hooks/gsd-staleness-reminder.js'));}catch(e){}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 d=p.join(o.homedir(),'.claude/plugins/cache/gsd-plugin/gsd');try{for(const v of f.readdirSync(d).filter(x=>/^\d+\.\d+\.\d+$/.test(x)).sort((a,b)=>{const A=a.split('.').map(Number),B=b.split('.').map(Number);return B[0]-A[0]||B[1]-A[1]||B[2]-A[2];}))c.push(p.join(d,v,'hooks/gsd-context-monitor.js'));}catch(e){}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 jnuyens/gsd-plugin2plugins reuse this hooks config
First indexed Jan 9, 2026