Stats
Actions
Tags
From git-flow
Prompts for user consent before executing bash commands, acting as a security gate for Bash tool calls. Blocks execution if consent is denied.
1 event · 1 hook
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
Bash'node' '-e' 'const {spawnSync}=require("node:child_process");
const fs=require("node:fs");
const os=require("node:os");
const path=require("node:path");
const [protocol,identity,program,...args]=process.argv.slice(1);
const raw=fs.readFileSync(0,"utf8");
let vendor={};
try{vendor=JSON.parse(raw||"{}")}catch{}
const toolName=vendor.tool_name??vendor.toolName??vendor.tool??"";
const toolInput=vendor.tool_input??vendor.toolInput??vendor.input??{};
const canonical=JSON.stringify({event:"pre-tool",hook:identity,piEvent:{toolName,input:toolInput},vendorEvent:vendor})+"\n";
const temporary=fs.mkdtempSync(path.join(os.tmpdir(),"agentbundler-hook-"));
const inputPath=path.join(temporary,"input.json");
fs.writeFileSync(inputPath,canonical,{mode:0o600});
const input=fs.openSync(inputPath,"r");
let result;
try{result=spawnSync(program,args,{stdio:[input,"pipe","pipe"],encoding:"utf8",env:process.env})}finally{fs.closeSync(input);fs.rmSync(temporary,{recursive:true,force:true})}
const reason=(result.stderr||"").trim()||"blocked by hook";
if(result.error){process.stderr.write(String(result.error));process.exit(1)}
if(result.status===2){write({decision:"deny",reason});process.exit(0)}
if(result.status!==0){process.stdout.write(result.stdout||"");process.stderr.write(result.stderr||"");process.exit(result.status??1)}
const text=(result.stdout||"").trim();
if(text==="")process.exit(0);
let decision;
try{decision=JSON.parse(text)}catch{process.stderr.write("hook stdout must be one decision object\n");process.exit(1)}
if(decision.decision==="allow")process.exit(0);
if(decision.decision==="deny"){write({decision:"deny",reason:typeof decision.reason==="string"?decision.reason:"blocked by hook"});process.exit(0)}
if(decision.decision==="rewrite-input"&&decision.input&&typeof decision.input==="object"&&!Array.isArray(decision.input)){write({decision:"rewrite",input:decision.input});process.exit(0)}
process.stderr.write("unsupported hook decision\n");process.exit(1);
function write(value){let output;if(protocol==="claude"||protocol==="codex")output={hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:value.decision==="deny"?"deny":"allow",...(value.decision==="deny"?{permissionDecisionReason:value.reason}:{updatedInput:value.input})}};else if(protocol==="copilot")output=value.decision==="deny"?{permissionDecision:"deny",permissionDecisionReason:value.reason}:{permissionDecision:"allow",modifiedArgs:value.input};else if(protocol==="cursor")output=value.decision==="deny"?{permission:"deny",user_message:value.reason,agent_message:value.reason}:{permission:"allow",updated_input:value.input};else if(protocol==="grok"&&value.decision==="deny")output={decision:"deny",reason:value.reason};else{process.stderr.write("hook decision is unsupported by target\n");process.exit(1)}fs.writeSync(1,JSON.stringify(output))}' '--' 'claude' 'hook/git-guardrails' '/bin/sh' '-c' ''"'"'bash'"'"' "${CLAUDE_PLUGIN_ROOT}"'"'"'/hooks/git-guardrails/hook.sh'"'"''10msnpx claudepluginhub alexei-led/cc-thingz --plugin git-flow427plugins reuse this hooks config
First indexed Nov 28, 2025
Showing the 6 earliest of 427 plugins