@su-record/vibe 2.4.23 → 2.4.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CLAUDE.md CHANGED
@@ -37,6 +37,18 @@ SPEC 주도 AI 코딩 프레임워크 (Claude Code 전용)
37
37
  - `@ts-ignore` 금지 → 타입 문제 근본 해결
38
38
  - 모든 함수에 반환 타입 명시
39
39
 
40
+ ### TypeScript 규칙
41
+ - `any` 타입 사용 금지 → `unknown` + 타입 가드 사용
42
+ - `as any` 캐스팅 금지 → 적절한 인터페이스 정의
43
+ - `@ts-ignore` 금지 → 타입 문제 근본 해결
44
+ - 모든 함수에 반환 타입 명시
45
+
46
+ ### TypeScript 규칙
47
+ - `any` 타입 사용 금지 → `unknown` + 타입 가드 사용
48
+ - `as any` 캐스팅 금지 → 적절한 인터페이스 정의
49
+ - `@ts-ignore` 금지 → 타입 문제 근본 해결
50
+ - 모든 함수에 반환 타입 명시
51
+
40
52
  ### 에러 처리 필수
41
53
  - try-catch 또는 error state 필수
42
54
  - 로딩 상태 처리
package/hooks/hooks.json CHANGED
@@ -10,7 +10,7 @@
10
10
  "hooks": [
11
11
  {
12
12
  "type": "command",
13
- "command": "node -e \"const {execSync}=require('child_process');const B=process.platform==='win32'?'file:///'+process.env.APPDATA.replace(/\\\\/g,'/')+'/npm/node_modules/@su-record/vibe/dist/tools/':'file://'+execSync('npm root -g',{encoding:'utf-8'}).trim()+'/@su-record/vibe/dist/tools/';const p='$CLAUDE_PROJECT_DIR';Promise.all([import(B+'memory/index.js').then(t=>t.startSession({projectPath:p})),import(B+'time/index.js').then(t=>t.getCurrentTime({format:'human',timezone:'Asia/Seoul'})),import(B+'memory/index.js').then(t=>t.listMemories({limit:5,projectPath:p}))]).then(([s,t,m])=>console.log(s.content[0].text+'\\n\\n'+t.content[0].text+'\\n\\n[Recent Memories]\\n'+m.content[0].text)).catch(e=>console.log('[Session] Error:',e.message))\""
13
+ "command": "node --input-type=module -e \"import{execSync}from'child_process';const r=execSync('npm root -g',{encoding:'utf-8'}).trim();const B='file://'+r+'/@su-record/vibe/dist/tools/';const p=process.env.CLAUDE_PROJECT_DIR||process.cwd();const[m,t]=await Promise.all([import(B+'memory/index.js'),import(B+'time/index.js')]);const[s,ti,me]=await Promise.all([m.startSession({projectPath:p}),t.getCurrentTime({format:'human',timezone:'Asia/Seoul'}),m.listMemories({limit:5,projectPath:p})]);console.log(s.content[0].text+'\\n\\n'+ti.content[0].text+'\\n\\n[Recent Memories]\\n'+me.content[0].text)\""
14
14
  }
15
15
  ]
16
16
  }
@@ -32,7 +32,7 @@
32
32
  "hooks": [
33
33
  {
34
34
  "type": "command",
35
- "command": "node -e \"const {execSync}=require('child_process');const B=process.platform==='win32'?'file:///'+process.env.APPDATA.replace(/\\\\/g,'/')+'/npm/node_modules/@su-record/vibe/dist/tools/convention/index.js':'file://'+execSync('npm root -g',{encoding:'utf-8'}).trim()+'/@su-record/vibe/dist/tools/convention/index.js';const p='$CLAUDE_PROJECT_DIR';import(B).then(t=>t.validateCodeQuality({targetPath:'.',projectPath:p}).then(r=>console.log('[CODE CHECK]',r.content[0].text.split('\\n').slice(0,3).join(' | ')))).catch(()=>console.log('[AUTO-CONTINUE] Code written. Continue.'))\""
35
+ "command": "node --input-type=module -e \"import{execSync}from'child_process';const r=execSync('npm root -g',{encoding:'utf-8'}).trim();const m=await import('file://'+r+'/@su-record/vibe/dist/tools/convention/index.js');const p=process.env.CLAUDE_PROJECT_DIR||process.cwd();try{const res=await m.validateCodeQuality({targetPath:'.',projectPath:p});console.log('[CODE CHECK]',res.content[0].text.split('\\n').slice(0,3).join(' | '))}catch(e){console.log('[AUTO-CONTINUE] Code written.')}\""
36
36
  }
37
37
  ]
38
38
  }
@@ -61,7 +61,7 @@
61
61
  "hooks": [
62
62
  {
63
63
  "type": "command",
64
- "command": "node -e \"const {execSync}=require('child_process');const B=process.platform==='win32'?'file:///'+process.env.APPDATA.replace(/\\\\/g,'/')+'/npm/node_modules/@su-record/vibe/dist/tools/memory/index.js':'file://'+execSync('npm root -g',{encoding:'utf-8'}).trim()+'/@su-record/vibe/dist/tools/memory/index.js';const p='$CLAUDE_PROJECT_DIR';import(B).then(t=>t.saveMemory({key:'solution-'+Date.now(),value:'Solution documented at '+new Date().toISOString(),category:'solution',projectPath:p}).then(r=>console.log('[COMPOUND]',r.content[0].text))).catch(()=>console.log('[COMPOUND TRIGGER] Consider /vibe.utils --compound'))\""
64
+ "command": "node --input-type=module -e \"import{execSync}from'child_process';const r=execSync('npm root -g',{encoding:'utf-8'}).trim();const m=await import('file://'+r+'/@su-record/vibe/dist/tools/memory/index.js');const p=process.env.CLAUDE_PROJECT_DIR||process.cwd();try{const res=await m.saveMemory({content:'Bug fix completed',category:'solution',tags:['bug-fix','resolved'],projectPath:p});console.log('[COMPOUND]',res.content[0].text)}catch(e){console.log('[COMPOUND] Error:',e.message)}\""
65
65
  }
66
66
  ]
67
67
  },
@@ -70,7 +70,7 @@
70
70
  "hooks": [
71
71
  {
72
72
  "type": "command",
73
- "command": "node -e \"const {execSync}=require('child_process');const B=process.platform==='win32'?'file:///'+process.env.APPDATA.replace(/\\\\/g,'/')+'/npm/node_modules/@su-record/vibe/dist/tools/convention/index.js':'file://'+execSync('npm root -g',{encoding:'utf-8'}).trim()+'/@su-record/vibe/dist/tools/convention/index.js';const p='$CLAUDE_PROJECT_DIR';import(B).then(t=>t.validateCodeQuality({targetPath:'.',projectPath:p}).then(r=>console.log('[REVIEW PREP]',r.content[0].text.split('\\n').slice(0,5).join(' | ')))).catch(()=>console.log('[REVIEW MODE] Use /vibe.review'))\""
73
+ "command": "node --input-type=module -e \"import{execSync}from'child_process';const r=execSync('npm root -g',{encoding:'utf-8'}).trim();const m=await import('file://'+r+'/@su-record/vibe/dist/tools/convention/index.js');const p=process.env.CLAUDE_PROJECT_DIR||process.cwd();try{const res=await m.validateCodeQuality({targetPath:'.',projectPath:p});console.log('[CODE REVIEW]',res.content[0].text.split('\\n').slice(0,5).join(' | '))}catch(e){console.log('[CODE REVIEW] Error:',e.message)}\""
74
74
  }
75
75
  ]
76
76
  },
@@ -88,7 +88,7 @@
88
88
  "hooks": [
89
89
  {
90
90
  "type": "command",
91
- "command": "node -e \"const {execSync}=require('child_process');const B=process.platform==='win32'?'file:///'+process.env.APPDATA.replace(/\\\\/g,'/')+'/npm/node_modules/@su-record/vibe/dist/tools/convention/index.js':'file://'+execSync('npm root -g',{encoding:'utf-8'}).trim()+'/@su-record/vibe/dist/tools/convention/index.js';const p='$CLAUDE_PROJECT_DIR';import(B).then(t=>t.analyzeComplexity({targetPath:'.',projectPath:p}).then(r=>console.log('[COMPLEXITY]',r.content[0].text.split('\\n').slice(0,5).join(' | ')))).catch(()=>console.log('[ANALYZE] Use analyzeComplexity tool'))\""
91
+ "command": "node --input-type=module -e \"import{execSync}from'child_process';const r=execSync('npm root -g',{encoding:'utf-8'}).trim();const m=await import('file://'+r+'/@su-record/vibe/dist/tools/convention/index.js');const p=process.env.CLAUDE_PROJECT_DIR||process.cwd();try{const res=await m.analyzeComplexity({targetPath:'.',projectPath:p});console.log('[COMPLEXITY]',res.content[0].text.split('\\n').slice(0,5).join(' | '))}catch(e){console.log('[COMPLEXITY] Error:',e.message)}\""
92
92
  }
93
93
  ]
94
94
  },
@@ -97,7 +97,7 @@
97
97
  "hooks": [
98
98
  {
99
99
  "type": "command",
100
- "command": "node -e \"const {execSync}=require('child_process');const B=process.platform==='win32'?'file:///'+process.env.APPDATA.replace(/\\\\/g,'/')+'/npm/node_modules/@su-record/vibe/dist/tools/memory/index.js':'file://'+execSync('npm root -g',{encoding:'utf-8'}).trim()+'/@su-record/vibe/dist/tools/memory/index.js';const p='$CLAUDE_PROJECT_DIR';import(B).then(t=>t.listMemories({limit:10,projectPath:p}).then(r=>console.log('[RECALL]',r.content[0].text.split('\\n').slice(0,7).join(' | ')))).catch(()=>console.log('[RECALL] Use recallMemory tool'))\""
100
+ "command": "node --input-type=module -e \"import{execSync}from'child_process';const r=execSync('npm root -g',{encoding:'utf-8'}).trim();const m=await import('file://'+r+'/@su-record/vibe/dist/tools/memory/index.js');const p=process.env.CLAUDE_PROJECT_DIR||process.cwd();try{const res=await m.listMemories({limit:10,projectPath:p});console.log('[RECALL]',res.content[0].text.split('\\n').slice(0,7).join(' | '))}catch(e){console.log('[RECALL] Use recallMemory tool')}\""
101
101
  }
102
102
  ]
103
103
  },
@@ -106,7 +106,7 @@
106
106
  "hooks": [
107
107
  {
108
108
  "type": "command",
109
- "command": "node -e \"const {execSync}=require('child_process');const V=process.platform==='win32'?'file:///'+process.env.APPDATA.replace(/\\\\/g,'/')+'/npm/node_modules/@su-record/vibe/dist/lib/gpt-api.js':'file://'+execSync('npm root -g',{encoding:'utf-8'}).trim()+'/@su-record/vibe/dist/lib/gpt-api.js';let d='';process.stdin.setEncoding('utf8');process.stdin.on('data',c=>d+=c);process.stdin.on('end',()=>{try{const j=JSON.parse(d||'{}');const q=j.prompt||'';if(!q){console.log('[GPT] No prompt');return}import(V).then(g=>g.chat({messages:[{role:'user',content:q}],systemPrompt:'You are a software architect. Analyze and review the architecture.'})).then(r=>console.log('GPT-5.2 응답: '+r.content)).catch(e=>console.log('[GPT] Error:',e.message))}catch(e){console.log('[GPT] Parse error')}});setTimeout(()=>{if(!d)process.exit(0)},100)\"",
109
+ "command": "node --input-type=module -e \"import{execSync}from'child_process';const r=execSync('npm root -g',{encoding:'utf-8'}).trim();const m=await import('file://'+r+'/@su-record/vibe/dist/lib/gpt-api.js');let d='';process.stdin.on('data',c=>d+=c);process.stdin.on('end',async()=>{try{const j=JSON.parse(d||'{}');if(j.prompt){const res=await m.chat({messages:[{role:'user',content:j.prompt}],systemPrompt:'You are a software architect. Analyze architecture.'});console.log('GPT-5.2:',res.content)}else{console.log('[GPT] No prompt')}}catch(e){console.log('[GPT] Error:',e.message)}})\"",
110
110
  "statusMessage": "GPT analyzing architecture..."
111
111
  }
112
112
  ]
@@ -116,7 +116,7 @@
116
116
  "hooks": [
117
117
  {
118
118
  "type": "command",
119
- "command": "node -e \"const {execSync}=require('child_process');const V=process.platform==='win32'?'file:///'+process.env.APPDATA.replace(/\\\\/g,'/')+'/npm/node_modules/@su-record/vibe/dist/lib/gemini-api.js':'file://'+execSync('npm root -g',{encoding:'utf-8'}).trim()+'/@su-record/vibe/dist/lib/gemini-api.js';let d='';process.stdin.setEncoding('utf8');process.stdin.on('data',c=>d+=c);process.stdin.on('end',()=>{try{const j=JSON.parse(d||'{}');const q=j.prompt||'';if(!q){console.log('[Gemini] No prompt');return}import(V).then(g=>g.chat({messages:[{role:'user',content:q}],systemPrompt:'You are a UI/UX expert. Analyze and provide feedback.'})).then(r=>console.log('Gemini-3 응답: '+r.content)).catch(e=>console.log('[Gemini] Error:',e.message))}catch(e){console.log('[Gemini] Parse error')}});setTimeout(()=>{if(!d)process.exit(0)},100)\"",
119
+ "command": "node --input-type=module -e \"import{execSync}from'child_process';const r=execSync('npm root -g',{encoding:'utf-8'}).trim();const m=await import('file://'+r+'/@su-record/vibe/dist/lib/gemini-api.js');let d='';process.stdin.on('data',c=>d+=c);process.stdin.on('end',async()=>{try{const j=JSON.parse(d||'{}');if(j.prompt){const res=await m.chat({messages:[{role:'user',content:j.prompt}],systemPrompt:'You are a UI/UX expert. Provide feedback.'});console.log('Gemini-3:',res.content)}else{console.log('[Gemini] No prompt')}}catch(e){console.log('[Gemini] Error:',e.message)}})\"",
120
120
  "statusMessage": "Gemini reviewing UI/UX..."
121
121
  }
122
122
  ]
@@ -126,7 +126,7 @@
126
126
  "hooks": [
127
127
  {
128
128
  "type": "command",
129
- "command": "node -e \"const {execSync}=require('child_process');const V=process.platform==='win32'?'file:///'+process.env.APPDATA.replace(/\\\\/g,'/')+'/npm/node_modules/@su-record/vibe/dist/lib/gpt-api.js':'file://'+execSync('npm root -g',{encoding:'utf-8'}).trim()+'/@su-record/vibe/dist/lib/gpt-api.js';let d='';process.stdin.setEncoding('utf8');process.stdin.on('data',c=>d+=c);process.stdin.on('end',()=>{try{const j=JSON.parse(d||'{}');const q=(j.prompt||'').replace(/gpt.*?(물어|질문|한테|분석)[^가-힣]*/i,'').trim();if(!q){console.log('[GPT] No prompt');return}import(V).then(g=>g.quickAsk(q)).then(r=>console.log('GPT-5.2 응답: '+r)).catch(e=>console.log('[GPT] Error:',e.message))}catch(e){console.log('[GPT] Parse error')}});setTimeout(()=>{if(!d)process.exit(0)},100)\"",
129
+ "command": "node --input-type=module -e \"import{execSync}from'child_process';const r=execSync('npm root -g',{encoding:'utf-8'}).trim();const m=await import('file://'+r+'/@su-record/vibe/dist/lib/gpt-api.js');let d='';process.stdin.on('data',c=>d+=c);process.stdin.on('end',async()=>{try{const j=JSON.parse(d||'{}');const q=(j.prompt||'').replace(/gpt.*?(물어|질문|한테|분석)[^가-힣]*/i,'').trim();if(q){const res=await m.quickAsk(q);console.log('GPT-5.2:',res)}else{console.log('[GPT] No query')}}catch(e){console.log('[GPT] Error:',e.message)}})\"",
130
130
  "statusMessage": "Asking GPT-5.2..."
131
131
  }
132
132
  ]
@@ -136,8 +136,8 @@
136
136
  "hooks": [
137
137
  {
138
138
  "type": "command",
139
- "command": "node -e \"const {execSync}=require('child_process');const V=process.platform==='win32'?'file:///'+process.env.APPDATA.replace(/\\\\/g,'/')+'/npm/node_modules/@su-record/vibe/dist/lib/gemini-api.js':'file://'+execSync('npm root -g',{encoding:'utf-8'}).trim()+'/@su-record/vibe/dist/lib/gemini-api.js';let d='';process.stdin.setEncoding('utf8');process.stdin.on('data',c=>d+=c);process.stdin.on('end',()=>{try{const j=JSON.parse(d||'{}');const q=(j.prompt||'').replace(/(gemini|제미나이).*?(물어|질문|한테|분석)[^가-힣]*/i,'').trim();if(!q){console.log('[Gemini] No prompt');return}import(V).then(g=>g.quickAsk(q)).then(r=>console.log('Gemini-3 응답: '+r)).catch(e=>console.log('[Gemini] Error:',e.message))}catch(e){console.log('[Gemini] Parse error')}});setTimeout(()=>{if(!d)process.exit(0)},100)\"",
140
- "statusMessage": "Asking Gemini 3..."
139
+ "command": "node --input-type=module -e \"import{execSync}from'child_process';const r=execSync('npm root -g',{encoding:'utf-8'}).trim();const m=await import('file://'+r+'/@su-record/vibe/dist/lib/gemini-api.js');let d='';process.stdin.on('data',c=>d+=c);process.stdin.on('end',async()=>{try{const j=JSON.parse(d||'{}');const q=(j.prompt||'').replace(/(gemini|제미나이).*?(물어|질문|한테|분석)[^가-힣]*/i,'').trim();if(q){const res=await m.quickAsk(q);console.log('Gemini-3:',res)}else{console.log('[Gemini] No query')}}catch(e){console.log('[Gemini] Error:',e.message)}})\"",
140
+ "statusMessage": "Asking Gemini-3..."
141
141
  }
142
142
  ]
143
143
  },
@@ -146,7 +146,7 @@
146
146
  "hooks": [
147
147
  {
148
148
  "type": "command",
149
- "command": "node -e \"const {execSync}=require('child_process');const V=process.platform==='win32'?'file:///'+process.env.APPDATA.replace(/\\\\/g,'/')+'/npm/node_modules/@su-record/vibe/dist/lib/gpt-api.js':'file://'+execSync('npm root -g',{encoding:'utf-8'}).trim()+'/@su-record/vibe/dist/lib/gpt-api.js';let d='';process.stdin.setEncoding('utf8');process.stdin.on('data',c=>d+=c);process.stdin.on('end',()=>{try{const j=JSON.parse(d||'{}');const q=j.prompt||'';if(!q){console.log('[GPT] No prompt');return}import(V).then(g=>g.chat({messages:[{role:'user',content:q}],systemPrompt:'You are a debugging expert. Find bugs and suggest fixes.'})).then(r=>console.log('GPT-5.2 응답: '+r.content)).catch(e=>console.log('[GPT] Error:',e.message))}catch(e){console.log('[GPT] Parse error')}});setTimeout(()=>{if(!d)process.exit(0)},100)\"",
149
+ "command": "node --input-type=module -e \"import{execSync}from'child_process';const r=execSync('npm root -g',{encoding:'utf-8'}).trim();const m=await import('file://'+r+'/@su-record/vibe/dist/lib/gpt-api.js');let d='';process.stdin.on('data',c=>d+=c);process.stdin.on('end',async()=>{try{const j=JSON.parse(d||'{}');if(j.prompt){const res=await m.chat({messages:[{role:'user',content:j.prompt}],systemPrompt:'You are a debugging expert. Find and fix bugs.'});console.log('GPT-5.2:',res.content)}else{console.log('[GPT] No prompt')}}catch(e){console.log('[GPT] Error:',e.message)}})\"",
150
150
  "statusMessage": "GPT debugging..."
151
151
  }
152
152
  ]
@@ -156,7 +156,7 @@
156
156
  "hooks": [
157
157
  {
158
158
  "type": "command",
159
- "command": "node -e \"const {execSync}=require('child_process');const V=process.platform==='win32'?'file:///'+process.env.APPDATA.replace(/\\\\/g,'/')+'/npm/node_modules/@su-record/vibe/dist/lib/gemini-api.js':'file://'+execSync('npm root -g',{encoding:'utf-8'}).trim()+'/@su-record/vibe/dist/lib/gemini-api.js';let d='';process.stdin.setEncoding('utf8');process.stdin.on('data',c=>d+=c);process.stdin.on('end',()=>{try{const j=JSON.parse(d||'{}');const q=j.prompt||'';if(!q){console.log('[Gemini] No prompt');return}import(V).then(g=>g.chat({messages:[{role:'user',content:q}],systemPrompt:'You are a code analysis expert. Review and analyze the code.'})).then(r=>console.log('Gemini-3 응답: '+r.content)).catch(e=>console.log('[Gemini] Error:',e.message))}catch(e){console.log('[Gemini] Parse error')}});setTimeout(()=>{if(!d)process.exit(0)},100)\"",
159
+ "command": "node --input-type=module -e \"import{execSync}from'child_process';const r=execSync('npm root -g',{encoding:'utf-8'}).trim();const m=await import('file://'+r+'/@su-record/vibe/dist/lib/gemini-api.js');let d='';process.stdin.on('data',c=>d+=c);process.stdin.on('end',async()=>{try{const j=JSON.parse(d||'{}');if(j.prompt){const res=await m.chat({messages:[{role:'user',content:j.prompt}],systemPrompt:'You are a code analysis expert. Review code.'});console.log('Gemini-3:',res.content)}else{console.log('[Gemini] No prompt')}}catch(e){console.log('[Gemini] Error:',e.message)}})\"",
160
160
  "statusMessage": "Gemini analyzing code..."
161
161
  }
162
162
  ]
@@ -168,7 +168,7 @@
168
168
  "hooks": [
169
169
  {
170
170
  "type": "command",
171
- "command": "node -e \"const {execSync}=require('child_process');const B=process.platform==='win32'?'file:///'+process.env.APPDATA.replace(/\\\\/g,'/')+'/npm/node_modules/@su-record/vibe/dist/tools/memory/index.js':'file://'+execSync('npm root -g',{encoding:'utf-8'}).trim()+'/@su-record/vibe/dist/tools/memory/index.js';const p='$CLAUDE_PROJECT_DIR';import(B).then(t=>t.autoSaveContext({urgency:'medium',contextType:'progress',summary:'Context at 80% - auto checkpoint',projectPath:p}).then(r=>console.log('[CONTEXT 80%]',r.content[0].text))).catch(()=>{})\""
171
+ "command": "node --input-type=module -e \"import{execSync}from'child_process';const r=execSync('npm root -g',{encoding:'utf-8'}).trim();const m=await import('file://'+r+'/@su-record/vibe/dist/tools/memory/index.js');const p=process.env.CLAUDE_PROJECT_DIR||process.cwd();try{const res=await m.autoSaveContext({urgency:'medium',contextType:'progress',summary:'Context at 80%',projectPath:p});console.log('[CONTEXT 80%]',res.content[0].text)}catch(e){}\""
172
172
  }
173
173
  ]
174
174
  },
@@ -177,7 +177,7 @@
177
177
  "hooks": [
178
178
  {
179
179
  "type": "command",
180
- "command": "node -e \"const {execSync}=require('child_process');const B=process.platform==='win32'?'file:///'+process.env.APPDATA.replace(/\\\\/g,'/')+'/npm/node_modules/@su-record/vibe/dist/tools/memory/index.js':'file://'+execSync('npm root -g',{encoding:'utf-8'}).trim()+'/@su-record/vibe/dist/tools/memory/index.js';const p='$CLAUDE_PROJECT_DIR';import(B).then(t=>t.autoSaveContext({urgency:'high',contextType:'progress',summary:'Context at 90% - save before overflow',projectPath:p}).then(r=>console.log('[CONTEXT 90%]',r.content[0].text))).catch(()=>{})\""
180
+ "command": "node --input-type=module -e \"import{execSync}from'child_process';const r=execSync('npm root -g',{encoding:'utf-8'}).trim();const m=await import('file://'+r+'/@su-record/vibe/dist/tools/memory/index.js');const p=process.env.CLAUDE_PROJECT_DIR||process.cwd();try{const res=await m.autoSaveContext({urgency:'high',contextType:'progress',summary:'Context at 90%',projectPath:p});console.log('[CONTEXT 90%]',res.content[0].text)}catch(e){}\""
181
181
  }
182
182
  ]
183
183
  },
@@ -186,7 +186,7 @@
186
186
  "hooks": [
187
187
  {
188
188
  "type": "command",
189
- "command": "node -e \"const {execSync}=require('child_process');const B=process.platform==='win32'?'file:///'+process.env.APPDATA.replace(/\\\\/g,'/')+'/npm/node_modules/@su-record/vibe/dist/tools/memory/index.js':'file://'+execSync('npm root -g',{encoding:'utf-8'}).trim()+'/@su-record/vibe/dist/tools/memory/index.js';const p='$CLAUDE_PROJECT_DIR';import(B).then(t=>t.autoSaveContext({urgency:'critical',contextType:'progress',summary:'Context at 95% - CRITICAL save before session end',projectPath:p}).then(r=>console.log('[CONTEXT 95%]',r.content[0].text))).catch(()=>{})\""
189
+ "command": "node --input-type=module -e \"import{execSync}from'child_process';const r=execSync('npm root -g',{encoding:'utf-8'}).trim();const m=await import('file://'+r+'/@su-record/vibe/dist/tools/memory/index.js');const p=process.env.CLAUDE_PROJECT_DIR||process.cwd();try{const res=await m.autoSaveContext({urgency:'critical',contextType:'progress',summary:'Context at 95%',projectPath:p});console.log('[CONTEXT 95%]',res.content[0].text)}catch(e){}\""
190
190
  }
191
191
  ]
192
192
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@su-record/vibe",
3
- "version": "2.4.23",
3
+ "version": "2.4.25",
4
4
  "description": "Vibe - Claude Code exclusive SPEC-driven AI coding framework with 35+ integrated tools",
5
5
  "type": "module",
6
6
  "main": "dist/cli/index.js",
@@ -1,11 +0,0 @@
1
- {
2
- "permissions": {
3
- "allow": [
4
- "Bash(xargs -I {} sh -c 'echo \"\"=== {} ===\"\" && grep -i \"\"hook.*error\\\\|UserPromptSubmit\"\" {} | head -20')",
5
- "Bash(timeout 10 node -e \"const {execSync}=require\\(''child_process''\\);const V=process.platform===''win32''?''file:///''+process.env.APPDATA.replace\\(/\\\\\\\\/g,''/''\\)+''/npm/node_modules/@su-record/vibe/dist/lib/gpt-api.js'':''file://''+execSync\\(''npm root -g'',{encoding:''utf-8''}\\).trim\\(\\)+''/@su-record/vibe/dist/lib/gpt-api.js'';let d='''';process.stdin.on\\(''data'',c=>d+=c\\);process.stdin.on\\(''end'',\\(\\)=>{const q=JSON.parse\\(d\\).prompt.replace\\(/gpt.*?\\(물어|질문|한테|분석\\)[^가-힣]*/i,''''\\).trim\\(\\);import\\(V\\).then\\(g=>g.quickAsk\\(q\\)\\).then\\(r=>console.log\\(''GPT-5.2 응답: ''+r\\)\\).catch\\(e=>console.log\\(''[GPT] Error:'',e.message\\)\\)}\\)\")",
6
- "Bash(echo:*)",
7
- "Bash(# Check if there were any hook errors in past sessions grep -rn \"\"hook.*error\\\\|error.*hook\"\" ~/.claude/debug/*.txt)",
8
- "Bash(set +H)"
9
- ]
10
- }
11
- }