@@ -63,6 +63,8 @@ export interface HookQuickTemplatesProps {
6363}
6464
6565// ========== Hook Templates ==========
66+ // NOTE: Hook input is received via stdin (not environment variable)
67+ // Use: const fs=require('fs');const p=JSON.parse(fs.readFileSync(0,'utf8')||'{}');
6668
6769/**
6870 * Predefined hook templates for quick installation
@@ -90,7 +92,7 @@ export const HOOK_TEMPLATES: readonly HookTemplate[] = [
9092 command : 'node' ,
9193 args : [
9294 '-e' ,
93- 'const p=JSON.parse(process.env.HOOK_INPUT ||"{}");const file=(p.tool_input&&p.tool_input.file_path)||"";if(/workflow-session\\.json$|session-metadata\\.json$/.test(file)){const fs=require("fs"); try{const content=fs.readFileSync(file,"utf8");const data=JSON.parse(content);const cp=require("child_process");const payload=JSON.stringify({type:"SESSION_STATE_CHANGED",file:file,sessionId:data.session_id||"",status:data.status||"unknown",project:process.env.CLAUDE_PROJECT_DIR||process.cwd(),timestamp:Date.now()});cp.spawnSync("curl",["-s","-X","POST","-H","Content-Type: application/json","-d",payload,"http://localhost:3456/api/hook"],{stdio:"inherit",shell:true})}catch(e){}}'
95+ 'const fs=require("fs");const p=JSON.parse(fs.readFileSync(0,"utf8") ||"{}");const file=(p.tool_input&&p.tool_input.file_path)||"";if(/workflow-session\\.json$|session-metadata\\.json$/.test(file)){try{const content=fs.readFileSync(file,"utf8");const data=JSON.parse(content);const cp=require("child_process");const payload=JSON.stringify({type:"SESSION_STATE_CHANGED",file:file,sessionId:data.session_id||"",status:data.status||"unknown",project:process.env.CLAUDE_PROJECT_DIR||process.cwd(),timestamp:Date.now()});cp.spawnSync("curl",["-s","-X","POST","-H","Content-Type: application/json","-d",payload,"http://localhost:3456/api/hook"],{stdio:"inherit",shell:true})}catch(e){}}'
9496 ]
9597 } ,
9698 // --- Notification ---
@@ -117,7 +119,7 @@ export const HOOK_TEMPLATES: readonly HookTemplate[] = [
117119 command : 'node' ,
118120 args : [
119121 '-e' ,
120- 'const p=JSON.parse(process.env.HOOK_INPUT ||"{}");const file=(p.tool_input&&p.tool_input.file_path)||"";if(file){const cp=require("child_process");cp.spawnSync("npx",["prettier","--write",file],{stdio:"inherit",shell:true})}'
122+ 'const fs=require("fs");const p=JSON.parse(fs.readFileSync(0,"utf8") ||"{}");const file=(p.tool_input&&p.tool_input.file_path)||"";if(file){const cp=require("child_process");cp.spawnSync("npx",["prettier","--write",file],{stdio:"inherit",shell:true})}'
121123 ]
122124 } ,
123125 {
@@ -130,7 +132,7 @@ export const HOOK_TEMPLATES: readonly HookTemplate[] = [
130132 command : 'node' ,
131133 args : [
132134 '-e' ,
133- 'const p=JSON.parse(process.env.HOOK_INPUT ||"{}");const file=(p.tool_input&&p.tool_input.file_path)||"";if(file){const cp=require("child_process");cp.spawnSync("npx",["eslint","--fix",file],{stdio:"inherit",shell:true})}'
135+ 'const fs=require("fs");const p=JSON.parse(fs.readFileSync(0,"utf8") ||"{}");const file=(p.tool_input&&p.tool_input.file_path)||"";if(file){const cp=require("child_process");cp.spawnSync("npx",["eslint","--fix",file],{stdio:"inherit",shell:true})}'
134136 ]
135137 } ,
136138 {
@@ -143,7 +145,7 @@ export const HOOK_TEMPLATES: readonly HookTemplate[] = [
143145 command : 'node' ,
144146 args : [
145147 '-e' ,
146- 'const p=JSON.parse(process.env.HOOK_INPUT ||"{}");const file=(p.tool_input&&p.tool_input.file_path)||"";if(/\\.env|secret|credential|\\.key$/.test(file)){process.stderr.write("Blocked: modifying sensitive file "+file);process.exit(2)}'
148+ 'const fs=require("fs");const p=JSON.parse(fs.readFileSync(0,"utf8") ||"{}");const file=(p.tool_input&&p.tool_input.file_path)||"";if(/\\.env|secret|credential|\\.key$/.test(file)){process.stderr.write("Blocked: modifying sensitive file "+file);process.exit(2)}'
147149 ]
148150 } ,
149151 {
@@ -169,7 +171,7 @@ export const HOOK_TEMPLATES: readonly HookTemplate[] = [
169171 command : 'node' ,
170172 args : [
171173 '-e' ,
172- 'const p=JSON.parse(process.env.HOOK_INPUT ||"{}");const file=(p.tool_input&&p.tool_input.file_path)||"";if(file){const cp=require("child_process");const payload=JSON.stringify({type:"FILE_MODIFIED",file:file,project:process.env.CLAUDE_PROJECT_DIR||process.cwd(),timestamp:Date.now()});cp.spawnSync("curl",["-s","-X","POST","-H","Content-Type: application/json","-d",payload,"http://localhost:3456/api/hook"],{stdio:"inherit",shell:true})}'
174+ 'const fs=require("fs");const p=JSON.parse(fs.readFileSync(0,"utf8") ||"{}");const file=(p.tool_input&&p.tool_input.file_path)||"";if(file){const cp=require("child_process");const payload=JSON.stringify({type:"FILE_MODIFIED",file:file,project:process.env.CLAUDE_PROJECT_DIR||process.cwd(),timestamp:Date.now()});cp.spawnSync("curl",["-s","-X","POST","-H","Content-Type: application/json","-d",payload,"http://localhost:3456/api/hook"],{stdio:"inherit",shell:true})}'
173175 ]
174176 } ,
175177 {
@@ -181,7 +183,7 @@ export const HOOK_TEMPLATES: readonly HookTemplate[] = [
181183 command : 'node' ,
182184 args : [
183185 '-e' ,
184- 'const p=JSON.parse(process.env.HOOK_INPUT ||"{}");const cp=require("child_process");const payload=JSON.stringify({type:"SESSION_SUMMARY",transcript:p.transcript_path||"",project:process.env.CLAUDE_PROJECT_DIR||process.cwd(),timestamp:Date.now()});cp.spawnSync("curl",["-s","-X","POST","-H","Content-Type: application/json","-d",payload,"http://localhost:3456/api/hook"],{stdio:"inherit",shell:true})'
186+ 'const fs=require("fs");const p=JSON.parse(fs.readFileSync(0,"utf8") ||"{}");const cp=require("child_process");const payload=JSON.stringify({type:"SESSION_SUMMARY",transcript:p.transcript_path||"",project:process.env.CLAUDE_PROJECT_DIR||process.cwd(),timestamp:Date.now()});cp.spawnSync("curl",["-s","-X","POST","-H","Content-Type: application/json","-d",payload,"http://localhost:3456/api/hook"],{stdio:"inherit",shell:true})'
185187 ]
186188 } ,
187189 {
@@ -221,7 +223,7 @@ export const HOOK_TEMPLATES: readonly HookTemplate[] = [
221223 description : 'Sync memory V2 status to dashboard on changes' ,
222224 category : 'notification' ,
223225 trigger : 'PostToolUse' ,
224- matcher : 'core_memory ' ,
226+ matcher : 'mcp__ccw-tools__core_memory ' ,
225227 command : 'node' ,
226228 args : [
227229 '-e' ,
0 commit comments