@su-record/vibe 2.12.4 → 2.12.5
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 +2 -1
- package/dist/cli/commands/init.d.ts +8 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +24 -1
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/postinstall/claude-agents.d.ts +11 -1
- package/dist/cli/postinstall/claude-agents.d.ts.map +1 -1
- package/dist/cli/postinstall/claude-agents.js +22 -2
- package/dist/cli/postinstall/claude-agents.js.map +1 -1
- package/dist/cli/postinstall/constants.d.ts +18 -0
- package/dist/cli/postinstall/constants.d.ts.map +1 -1
- package/dist/cli/postinstall/constants.js +50 -0
- package/dist/cli/postinstall/constants.js.map +1 -1
- package/dist/cli/postinstall/index.d.ts +1 -1
- package/dist/cli/postinstall/index.d.ts.map +1 -1
- package/dist/cli/postinstall/index.js +1 -1
- package/dist/cli/postinstall/index.js.map +1 -1
- package/dist/cli/postinstall/main.d.ts.map +1 -1
- package/dist/cli/postinstall/main.js +4 -3
- package/dist/cli/postinstall/main.js.map +1 -1
- package/dist/cli/postinstall.d.ts +1 -1
- package/dist/cli/postinstall.d.ts.map +1 -1
- package/dist/cli/postinstall.js +1 -1
- package/dist/cli/postinstall.js.map +1 -1
- package/dist/infra/lib/ContextCompressor.d.ts +11 -2
- package/dist/infra/lib/ContextCompressor.d.ts.map +1 -1
- package/dist/infra/lib/ContextCompressor.js +26 -41
- package/dist/infra/lib/ContextCompressor.js.map +1 -1
- package/dist/infra/lib/ContextCompressor.test.d.ts +2 -0
- package/dist/infra/lib/ContextCompressor.test.d.ts.map +1 -0
- package/dist/infra/lib/ContextCompressor.test.js +25 -0
- package/dist/infra/lib/ContextCompressor.test.js.map +1 -0
- package/dist/infra/lib/embedding/VectorStore.d.ts +9 -2
- package/dist/infra/lib/embedding/VectorStore.d.ts.map +1 -1
- package/dist/infra/lib/embedding/VectorStore.js +42 -19
- package/dist/infra/lib/embedding/VectorStore.js.map +1 -1
- package/dist/infra/lib/memory/MemoryStorage.d.ts +12 -0
- package/dist/infra/lib/memory/MemoryStorage.d.ts.map +1 -1
- package/dist/infra/lib/memory/MemoryStorage.js +57 -0
- package/dist/infra/lib/memory/MemoryStorage.js.map +1 -1
- package/dist/infra/lib/memory/ReflectionStore.d.ts.map +1 -1
- package/dist/infra/lib/memory/ReflectionStore.js +8 -27
- package/dist/infra/lib/memory/ReflectionStore.js.map +1 -1
- package/dist/infra/orchestrator/LLMCluster.d.ts +4 -0
- package/dist/infra/orchestrator/LLMCluster.d.ts.map +1 -1
- package/dist/infra/orchestrator/LLMCluster.js +35 -8
- package/dist/infra/orchestrator/LLMCluster.js.map +1 -1
- package/hooks/hooks.json +2 -9
- package/hooks/scripts/auto-commit.js +3 -10
- package/hooks/scripts/auto-format.js +11 -6
- package/hooks/scripts/code-check.js +17 -20
- package/hooks/scripts/session-start.js +28 -15
- package/hooks/scripts/utils.js +33 -9
- package/package.json +1 -1
- package/skills/arch-guard/SKILL.md +2 -2
- package/skills/characterization-test/SKILL.md +2 -2
- package/skills/exec-plan/SKILL.md +2 -2
- package/skills/spec/SKILL.md +6 -312
- package/skills/spec/references/askuser-examples.md +57 -0
- package/skills/spec/references/example-session.md +87 -0
- package/skills/spec/references/templates.md +189 -0
- package/skills/vibe.run/SKILL.md +2 -2
- package/vibe/templates/claudemd-template.md +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReflectionStore.js","sourceRoot":"","sources":["../../../../src/infra/lib/memory/ReflectionStore.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ReflectionStore.js","sourceRoot":"","sources":["../../../../src/infra/lib/memory/ReflectionStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,8 +36,12 @@ export interface LLMClusterOptions {
|
|
|
36
36
|
export declare class LLMCluster {
|
|
37
37
|
private defaultSystemPrompt;
|
|
38
38
|
constructor(options?: LLMClusterOptions);
|
|
39
|
+
private static readonly CLAUDE_CLI_TIMEOUT_MS;
|
|
39
40
|
/**
|
|
40
41
|
* Claude CLI 오케스트레이션 (claude --print)
|
|
42
|
+
*
|
|
43
|
+
* 비동기 spawn — execSync는 최대 180초 이벤트 루프를 블로킹해
|
|
44
|
+
* multiQuery의 GPT/Antigravity 병렬성을 무효화하므로 사용하지 않는다.
|
|
41
45
|
*/
|
|
42
46
|
claudeOrchestrate(prompt: string, systemPrompt?: string): Promise<string>;
|
|
43
47
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LLMCluster.d.ts","sourceRoot":"","sources":["../../../src/infra/orchestrator/LLMCluster.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;IAC5B,WAAW,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;IACpC,MAAM,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,mBAAmB,CAAS;gBAExB,OAAO,GAAE,iBAAsB;
|
|
1
|
+
{"version":3,"file":"LLMCluster.d.ts","sourceRoot":"","sources":["../../../src/infra/orchestrator/LLMCluster.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;IAC5B,WAAW,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;IACpC,MAAM,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,mBAAmB,CAAS;gBAExB,OAAO,GAAE,iBAAsB;IAM3C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAU;IAEvD;;;;;OAKG;IACG,iBAAiB,CACrB,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC;IAuClB;;OAEG;IACG,cAAc,CAClB,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAC/B,OAAO,CAAC,MAAM,CAAC;IAQlB;;OAEG;IACG,sBAAsB,CAC1B,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAC/B,OAAO,CAAC,MAAM,CAAC;IAQlB;;OAEG;IACG,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI1D;;;OAGG;IACG,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIlD;;OAEG;IACG,UAAU,CACd,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAC5E,OAAO,CAAC,mBAAmB,CAAC;IAkC/B;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,eAAe,CAAC;CAyB9C;AAKD,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,UAAU,CAKrE"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* LLMCluster - Multi-LLM 병렬 쿼리 및 상태 관리
|
|
3
3
|
* GPT, Antigravity, Claude 지원
|
|
4
4
|
*/
|
|
5
|
-
import {
|
|
5
|
+
import { spawn } from 'child_process';
|
|
6
6
|
import * as gptApi from '../lib/gpt/index.js';
|
|
7
7
|
import * as antigravityApi from '../lib/antigravity/index.js';
|
|
8
8
|
import { warnLog } from '../lib/utils.js';
|
|
@@ -14,8 +14,14 @@ export class LLMCluster {
|
|
|
14
14
|
constructor(options = {}) {
|
|
15
15
|
this.defaultSystemPrompt = options.defaultSystemPrompt ?? 'You are a helpful assistant.';
|
|
16
16
|
}
|
|
17
|
+
// WHY 180s: claude --print는 긴 추론에서 수 분까지 걸릴 수 있으나,
|
|
18
|
+
// 그 이상은 행으로 간주하고 종료한다 (기존 execSync timeout과 동일).
|
|
19
|
+
static CLAUDE_CLI_TIMEOUT_MS = 180000;
|
|
17
20
|
/**
|
|
18
21
|
* Claude CLI 오케스트레이션 (claude --print)
|
|
22
|
+
*
|
|
23
|
+
* 비동기 spawn — execSync는 최대 180초 이벤트 루프를 블로킹해
|
|
24
|
+
* multiQuery의 GPT/Antigravity 병렬성을 무효화하므로 사용하지 않는다.
|
|
19
25
|
*/
|
|
20
26
|
async claudeOrchestrate(prompt, systemPrompt) {
|
|
21
27
|
const sys = systemPrompt ?? this.defaultSystemPrompt;
|
|
@@ -23,14 +29,35 @@ export class LLMCluster {
|
|
|
23
29
|
// 재귀 가드 — spawn된 자식 claude 세션의 UserPromptSubmit/Stop hook이
|
|
24
30
|
// 다시 외부 LLM/오케스트레이션을 돌리는 fork 폭주를 차단한다.
|
|
25
31
|
// hook 스크립트는 VIBE_HOOK_DEPTH 가 존재하면 즉시 종료한다.
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
+
return new Promise((resolve, reject) => {
|
|
33
|
+
const child = spawn('claude', ['--print', '--dangerously-skip-permissions'], {
|
|
34
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
35
|
+
env: { ...process.env, VIBE_HOOK_DEPTH: process.env.VIBE_HOOK_DEPTH ?? '1' },
|
|
36
|
+
});
|
|
37
|
+
let stdout = '';
|
|
38
|
+
let stderr = '';
|
|
39
|
+
const timer = setTimeout(() => {
|
|
40
|
+
child.kill('SIGKILL');
|
|
41
|
+
reject(new Error(`claude --print timed out after ${LLMCluster.CLAUDE_CLI_TIMEOUT_MS}ms`));
|
|
42
|
+
}, LLMCluster.CLAUDE_CLI_TIMEOUT_MS);
|
|
43
|
+
child.stdout.on('data', (chunk) => { stdout += chunk.toString(); });
|
|
44
|
+
child.stderr.on('data', (chunk) => { stderr += chunk.toString(); });
|
|
45
|
+
child.on('error', (err) => {
|
|
46
|
+
clearTimeout(timer);
|
|
47
|
+
reject(err);
|
|
48
|
+
});
|
|
49
|
+
child.on('close', (code) => {
|
|
50
|
+
clearTimeout(timer);
|
|
51
|
+
if (code === 0) {
|
|
52
|
+
resolve(stdout.trim());
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
reject(new Error(`claude --print failed (code ${code}): ${stderr.slice(0, 500)}`));
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
child.stdin.write(fullPrompt);
|
|
59
|
+
child.stdin.end();
|
|
32
60
|
});
|
|
33
|
-
return result.trim();
|
|
34
61
|
}
|
|
35
62
|
/**
|
|
36
63
|
* GPT 오케스트레이션
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LLMCluster.js","sourceRoot":"","sources":["../../../src/infra/orchestrator/LLMCluster.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"LLMCluster.js","sourceRoot":"","sources":["../../../src/infra/orchestrator/LLMCluster.ts"],"names":[],"mappings":"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"}
|
package/hooks/hooks.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"_comment": "Dispatcher pattern — PreToolUse/PostToolUse/Stop는 단일 디스패처가 stdin을 한 번 읽어 순차 실행 (병렬 spawn 폭주 제거, cascade 격리, config.hooks.{name}.enabled 토글 지원). UserPromptSubmit은 VIBE_HOOK_DEPTH 재귀 가드 탑재된 prompt-dispatcher 사용.",
|
|
2
|
+
"_comment": "Dispatcher pattern — PreToolUse/PostToolUse/Stop는 단일 디스패처가 stdin을 한 번 읽어 순차 실행 (병렬 spawn 폭주 제거, cascade 격리, config.hooks.{name}.enabled 토글 지원). UserPromptSubmit은 VIBE_HOOK_DEPTH 재귀 가드 탑재된 prompt-dispatcher 사용. SessionStart matcher가 compact를 제외하는 이유: session-start.js가 컨텍스트 앞단에 현재 시각/24h 카운트 등 동적 값을 주입하므로, compact마다 재발화하면 압축 후 프리픽스가 매번 달라져 prefix cache를 무효화한다.",
|
|
3
3
|
"permissions": {
|
|
4
4
|
"allow": [],
|
|
5
5
|
"deny": [],
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
"hooks": {
|
|
9
9
|
"SessionStart": [
|
|
10
10
|
{
|
|
11
|
+
"matcher": "startup|resume|clear",
|
|
11
12
|
"hooks": [
|
|
12
13
|
{
|
|
13
14
|
"type": "command",
|
|
@@ -74,14 +75,6 @@
|
|
|
74
75
|
}
|
|
75
76
|
],
|
|
76
77
|
"UserPromptSubmit": [
|
|
77
|
-
{
|
|
78
|
-
"hooks": [
|
|
79
|
-
{
|
|
80
|
-
"type": "command",
|
|
81
|
-
"command": "echo '[INTERRUPT RULE] If this message follows a user interrupt (Ctrl+C/Escape), the previous task is CANCELLED. Do NOT resume interrupted work. Respond ONLY to this new message.'"
|
|
82
|
-
}
|
|
83
|
-
]
|
|
84
|
-
},
|
|
85
78
|
{
|
|
86
79
|
"hooks": [
|
|
87
80
|
{
|
|
@@ -31,14 +31,6 @@ function getCurrentBranch() {
|
|
|
31
31
|
}).trim();
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
function hasChanges() {
|
|
35
|
-
const status = execSync('git status --porcelain', {
|
|
36
|
-
cwd: PROJECT_DIR,
|
|
37
|
-
encoding: 'utf-8',
|
|
38
|
-
}).trim();
|
|
39
|
-
return status.length > 0;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
34
|
function getChangedFiles() {
|
|
43
35
|
const status = execSync('git status --porcelain', {
|
|
44
36
|
cwd: PROJECT_DIR,
|
|
@@ -88,9 +80,10 @@ try {
|
|
|
88
80
|
process.exit(0);
|
|
89
81
|
}
|
|
90
82
|
|
|
91
|
-
|
|
92
|
-
|
|
83
|
+
// 변경 유무와 파일 목록을 단일 `git status --porcelain` 호출로 처리
|
|
93
84
|
const files = getChangedFiles();
|
|
85
|
+
if (files.length === 0) process.exit(0);
|
|
86
|
+
|
|
94
87
|
const msg = buildCommitMessage(files);
|
|
95
88
|
|
|
96
89
|
execSync('git add -A', { cwd: PROJECT_DIR, stdio: 'ignore' });
|
|
@@ -19,13 +19,18 @@ function getFilePath() {
|
|
|
19
19
|
return input.file_path || input.path || '';
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
+
// PATH 직접 스캔 — `which` execSync는 매 파일 저장마다 자식 프로세스를 동기
|
|
23
|
+
// spawn하므로, fs.existsSync로 대체하고 프로세스 내 캐싱한다.
|
|
24
|
+
const _binCache = new Map();
|
|
22
25
|
function hasBin(name) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
const cached = _binCache.get(name);
|
|
27
|
+
if (cached !== undefined) return cached;
|
|
28
|
+
const candidates = process.platform === 'win32' ? [`${name}.exe`, `${name}.cmd`, name] : [name];
|
|
29
|
+
const found = (process.env.PATH || '').split(path.delimiter).some(
|
|
30
|
+
dir => dir && candidates.some(c => existsSync(path.join(dir, c))),
|
|
31
|
+
);
|
|
32
|
+
_binCache.set(name, found);
|
|
33
|
+
return found;
|
|
29
34
|
}
|
|
30
35
|
|
|
31
36
|
function hasPrettier() {
|
|
@@ -225,35 +225,32 @@ function clearFailure(filePath) {
|
|
|
225
225
|
}
|
|
226
226
|
|
|
227
227
|
async function main() {
|
|
228
|
+
const files = getModifiedFiles();
|
|
229
|
+
if (files.length === 0) return;
|
|
230
|
+
|
|
228
231
|
// 1. Code quality check (changed files only — never scan entire project)
|
|
229
232
|
try {
|
|
230
|
-
const
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
} else {
|
|
244
|
-
clearFailure(files[0]);
|
|
245
|
-
}
|
|
246
|
-
emitSelfHealMessages(files[0]);
|
|
233
|
+
const module = await import(`${BASE_URL}convention/index.js`);
|
|
234
|
+
const result = await module.validateCodeQuality({
|
|
235
|
+
targetPath: files[0],
|
|
236
|
+
projectPath: PROJECT_DIR,
|
|
237
|
+
});
|
|
238
|
+
const text = result.content[0].text;
|
|
239
|
+
// Output P1/P2 only — skip P3 (style)
|
|
240
|
+
const critical = text.split('\n').filter(l => /\b(error|critical|P1|P2)\b/i.test(l)).slice(0, 3);
|
|
241
|
+
if (critical.length > 0) {
|
|
242
|
+
console.log('[CODE CHECK]', critical.join(' | '));
|
|
243
|
+
trackFailure(files[0], critical);
|
|
244
|
+
} else {
|
|
245
|
+
clearFailure(files[0]);
|
|
247
246
|
}
|
|
247
|
+
emitSelfHealMessages(files[0]);
|
|
248
248
|
} catch {
|
|
249
249
|
// Silently continue on check failure — never block progress
|
|
250
250
|
}
|
|
251
251
|
|
|
252
252
|
// 2. 관찰 자동 캡처
|
|
253
253
|
try {
|
|
254
|
-
const files = getModifiedFiles();
|
|
255
|
-
if (files.length === 0) return;
|
|
256
|
-
|
|
257
254
|
const memModule = await import(`${BASE_URL}memory/index.js`);
|
|
258
255
|
const { type, title } = classifyObservation(files);
|
|
259
256
|
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SessionStart Hook - 세션 시작 시 메모리/시간 로드 + 버전 체크
|
|
3
3
|
*/
|
|
4
|
-
import { getToolsBaseUrl, PROJECT_DIR, projectVibePath, projectVibeRoot } from './utils.js';
|
|
4
|
+
import { getToolsBaseUrl, getGlobalNpmPath, PROJECT_DIR, projectVibePath, projectVibeRoot } from './utils.js';
|
|
5
5
|
import fs from 'fs';
|
|
6
6
|
import path from 'path';
|
|
7
7
|
import os from 'os';
|
|
8
8
|
import https from 'https';
|
|
9
|
-
import { execSync } from 'child_process';
|
|
10
9
|
|
|
11
10
|
const BASE_URL = getToolsBaseUrl();
|
|
12
11
|
|
|
@@ -33,6 +32,30 @@ function fetchLatestVersion() {
|
|
|
33
32
|
});
|
|
34
33
|
}
|
|
35
34
|
|
|
35
|
+
// 버전 체크 결과 24시간 파일 캐시 — 매 SessionStart마다 npm registry에
|
|
36
|
+
// HTTP 요청(타임아웃 시 3초 블로킹)을 보내지 않도록 한다. 릴리즈 주기 대비
|
|
37
|
+
// 하루 1회 확인이면 충분하다.
|
|
38
|
+
const VERSION_CACHE_PATH = path.join(os.homedir(), '.vibe', 'version-check.json');
|
|
39
|
+
const VERSION_CACHE_TTL_MS = 24 * 60 * 60 * 1000;
|
|
40
|
+
|
|
41
|
+
async function getLatestVersionCached() {
|
|
42
|
+
try {
|
|
43
|
+
const cached = JSON.parse(fs.readFileSync(VERSION_CACHE_PATH, 'utf8'));
|
|
44
|
+
if (cached.version && Date.now() - cached.checkedAt < VERSION_CACHE_TTL_MS) {
|
|
45
|
+
return cached.version;
|
|
46
|
+
}
|
|
47
|
+
} catch { /* 캐시 없음/손상 → 네트워크 조회 */ }
|
|
48
|
+
|
|
49
|
+
const version = await fetchLatestVersion();
|
|
50
|
+
if (version) {
|
|
51
|
+
try {
|
|
52
|
+
fs.mkdirSync(path.dirname(VERSION_CACHE_PATH), { recursive: true });
|
|
53
|
+
fs.writeFileSync(VERSION_CACHE_PATH, JSON.stringify({ version, checkedAt: Date.now() }));
|
|
54
|
+
} catch { /* 캐시 기록 실패는 무시 */ }
|
|
55
|
+
}
|
|
56
|
+
return version;
|
|
57
|
+
}
|
|
58
|
+
|
|
36
59
|
function compareVersions(a, b) {
|
|
37
60
|
const partsA = a.replace(/^v/, '').split('.').map(Number);
|
|
38
61
|
const partsB = b.replace(/^v/, '').split('.').map(Number);
|
|
@@ -47,18 +70,8 @@ function compareVersions(a, b) {
|
|
|
47
70
|
|
|
48
71
|
function getCurrentVersion() {
|
|
49
72
|
try {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
globalNpmPath = execSync('npm root -g', { encoding: 'utf8', timeout: 3000 }).trim();
|
|
53
|
-
} catch {
|
|
54
|
-
const homeDir = os.homedir();
|
|
55
|
-
const fallbacks = [
|
|
56
|
-
'/usr/local/lib/node_modules',
|
|
57
|
-
path.join(homeDir, '.npm-global', 'lib', 'node_modules'),
|
|
58
|
-
];
|
|
59
|
-
globalNpmPath = fallbacks.find(p => fs.existsSync(p)) || fallbacks[0];
|
|
60
|
-
}
|
|
61
|
-
const pkgPath = path.join(globalNpmPath, '@su-record', 'vibe', 'package.json');
|
|
73
|
+
// getToolsBaseUrl()이 이미 `npm root -g` 결과를 캐싱하므로 재사용 — 중복 spawn 제거
|
|
74
|
+
const pkgPath = path.join(getGlobalNpmPath(), '@su-record', 'vibe', 'package.json');
|
|
62
75
|
if (fs.existsSync(pkgPath)) {
|
|
63
76
|
return JSON.parse(fs.readFileSync(pkgPath, 'utf8')).version || null;
|
|
64
77
|
}
|
|
@@ -77,7 +90,7 @@ async function main() {
|
|
|
77
90
|
memoryModule.startSession({ projectPath: PROJECT_DIR }),
|
|
78
91
|
timeModule.getCurrentTime({ format: 'human', timezone: 'Asia/Seoul' }),
|
|
79
92
|
memoryModule.listMemories({ limit: 5, projectPath: PROJECT_DIR }),
|
|
80
|
-
|
|
93
|
+
getLatestVersionCached(),
|
|
81
94
|
]);
|
|
82
95
|
|
|
83
96
|
console.log(session.content[0].text);
|
package/hooks/scripts/utils.js
CHANGED
|
@@ -75,32 +75,44 @@ export function projectMemoryDir(projectDir = PROJECT_DIR) {
|
|
|
75
75
|
return path.join(projectDir, '.vibe', 'memories');
|
|
76
76
|
}
|
|
77
77
|
|
|
78
|
+
// config 캐시 — 훅 스크립트는 단명 프로세스이므로 프로세스 생명주기 내에서
|
|
79
|
+
// config 파일이 바뀌지 않는다고 가정한다 (llm-orchestrate처럼 한 프로세스에서
|
|
80
|
+
// 3회 이상 읽는 경로의 중복 read+parse 제거).
|
|
81
|
+
let _vibeConfigCache = null;
|
|
82
|
+
let _projectConfigCache = null;
|
|
83
|
+
|
|
78
84
|
/**
|
|
79
|
-
* ~/.vibe/config.json 읽기
|
|
85
|
+
* ~/.vibe/config.json 읽기 (프로세스 내 캐시)
|
|
80
86
|
* @returns {object} 파싱된 config 또는 빈 객체
|
|
81
87
|
*/
|
|
82
88
|
export function readVibeConfig() {
|
|
89
|
+
if (_vibeConfigCache !== null) return _vibeConfigCache;
|
|
83
90
|
const configPath = path.join(VIBE_HOME_DIR, 'config.json');
|
|
84
91
|
try {
|
|
85
92
|
if (fs.existsSync(configPath)) {
|
|
86
|
-
|
|
93
|
+
_vibeConfigCache = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
94
|
+
return _vibeConfigCache;
|
|
87
95
|
}
|
|
88
96
|
} catch { /* ignore */ }
|
|
89
|
-
|
|
97
|
+
_vibeConfigCache = {};
|
|
98
|
+
return _vibeConfigCache;
|
|
90
99
|
}
|
|
91
100
|
|
|
92
101
|
/**
|
|
93
|
-
* 프로젝트 설정(.vibe/config.json) 읽기 — legacy `.claude/vibe/` fallback 포함
|
|
102
|
+
* 프로젝트 설정(.vibe/config.json) 읽기 — legacy `.claude/vibe/` fallback 포함 (프로세스 내 캐시)
|
|
94
103
|
* @returns {object} 파싱된 config 또는 빈 객체
|
|
95
104
|
*/
|
|
96
105
|
export function readProjectConfig() {
|
|
106
|
+
if (_projectConfigCache !== null) return _projectConfigCache;
|
|
97
107
|
const configPath = projectVibePath(PROJECT_DIR, 'config.json');
|
|
98
108
|
try {
|
|
99
109
|
if (fs.existsSync(configPath)) {
|
|
100
|
-
|
|
110
|
+
_projectConfigCache = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
111
|
+
return _projectConfigCache;
|
|
101
112
|
}
|
|
102
113
|
} catch { /* ignore */ }
|
|
103
|
-
|
|
114
|
+
_projectConfigCache = {};
|
|
115
|
+
return _projectConfigCache;
|
|
104
116
|
}
|
|
105
117
|
|
|
106
118
|
/**
|
|
@@ -153,7 +165,7 @@ function toFileUrl(fsPath) {
|
|
|
153
165
|
|
|
154
166
|
// 전역 npm 경로 캐시
|
|
155
167
|
let _globalNpmPath = null;
|
|
156
|
-
function getGlobalNpmPath() {
|
|
168
|
+
export function getGlobalNpmPath() {
|
|
157
169
|
if (_globalNpmPath === null) {
|
|
158
170
|
try {
|
|
159
171
|
_globalNpmPath = execSync('npm root -g', { encoding: 'utf8' }).trim();
|
|
@@ -190,20 +202,32 @@ function hasRuntimeDeps(packageRoot) {
|
|
|
190
202
|
* 패키지 하위 경로의 file:// URL 반환 (크로스 플랫폼)
|
|
191
203
|
* 우선순위: 로컬 빌드 → ~/.vibe/ → 전역 npm
|
|
192
204
|
* 각 후보는 probeFile 존재 + 런타임 deps 해석 가능해야 채택 (dist-only 복사본 회피)
|
|
205
|
+
*
|
|
206
|
+
* 프로세스 내 메모이제이션: getToolsBaseUrl/getLibBaseUrl/getCliBaseUrl이 한 훅
|
|
207
|
+
* 프로세스에서 각각 호출되면 최악 6회 동기 stat이 반복되므로 결과를 캐싱한다.
|
|
193
208
|
*/
|
|
209
|
+
const _packageUrlCache = new Map();
|
|
194
210
|
function getPackageUrl(subpath, probeFile) {
|
|
211
|
+
const cacheKey = `${subpath}|${probeFile}`;
|
|
212
|
+
const cached = _packageUrlCache.get(cacheKey);
|
|
213
|
+
if (cached) return cached;
|
|
214
|
+
|
|
195
215
|
const localRoot = VIBE_PATH;
|
|
196
216
|
const vibeRoot = path.join(VIBE_HOME_DIR, 'node_modules', '@su-record', 'vibe');
|
|
197
217
|
const globalRoot = path.join(getGlobalNpmPath(), '@su-record', 'vibe');
|
|
198
218
|
|
|
199
219
|
const candidates = [localRoot, vibeRoot, globalRoot];
|
|
220
|
+
let result = null;
|
|
200
221
|
for (const root of candidates) {
|
|
201
222
|
const target = path.join(root, subpath);
|
|
202
223
|
if (fs.existsSync(path.join(target, probeFile)) && hasRuntimeDeps(root)) {
|
|
203
|
-
|
|
224
|
+
result = toFileUrl(target);
|
|
225
|
+
break;
|
|
204
226
|
}
|
|
205
227
|
}
|
|
206
|
-
|
|
228
|
+
if (result === null) result = toFileUrl(path.join(globalRoot, subpath));
|
|
229
|
+
_packageUrlCache.set(cacheKey, result);
|
|
230
|
+
return result;
|
|
207
231
|
}
|
|
208
232
|
|
|
209
233
|
export function getToolsBaseUrl() {
|
package/package.json
CHANGED
|
@@ -3,8 +3,8 @@ name: arch-guard
|
|
|
3
3
|
user-invocable: false
|
|
4
4
|
invocation: [auto]
|
|
5
5
|
tier: core
|
|
6
|
-
description: "Generate
|
|
7
|
-
triggers: [arch guard, architecture test, layer test, boundary test, structural test, arch validation]
|
|
6
|
+
description: "Generate import-rule tests that mechanically enforce architecture layer constraints (e.g., 'UI must not import DB') — for new modules, layer refactors, or circular dependencies."
|
|
7
|
+
triggers: [arch guard, architecture test, layer test, boundary test, structural test, arch validation, layer enforcement, dependency rules, architectural boundaries, circular dependency]
|
|
8
8
|
priority: 60
|
|
9
9
|
---
|
|
10
10
|
|
|
@@ -3,8 +3,8 @@ name: characterization-test
|
|
|
3
3
|
user-invocable: false
|
|
4
4
|
invocation: [auto]
|
|
5
5
|
tier: core
|
|
6
|
-
description: "Lock existing behavior with characterization tests
|
|
7
|
-
triggers: [legacy, characterization test, lock behavior, regression prevention, before refactor, large file]
|
|
6
|
+
description: "Lock existing behavior with characterization tests BEFORE refactoring or modifying legacy/untested code (files >200 lines without tests)."
|
|
7
|
+
triggers: [legacy, characterization test, lock behavior, regression prevention, before refactor, large file, refactor, rewrite, modernize, clean up]
|
|
8
8
|
priority: 65
|
|
9
9
|
---
|
|
10
10
|
|
|
@@ -3,8 +3,8 @@ name: exec-plan
|
|
|
3
3
|
user-invocable: false
|
|
4
4
|
invocation: [auto, chain]
|
|
5
5
|
tier: core
|
|
6
|
-
description: "Convert
|
|
7
|
-
triggers: [exec plan, execution plan, autonomous plan, self-contained plan, long-running]
|
|
6
|
+
description: "Convert a SPEC (3+ phases or multi-file) into a self-contained execution plan — explicit file paths, interfaces, acceptance criteria — that agents can run autonomously."
|
|
7
|
+
triggers: [exec plan, execution plan, autonomous plan, self-contained plan, long-running, execute this spec, run this plan, parallel implementation]
|
|
8
8
|
priority: 70
|
|
9
9
|
chain-next: [commit-push-pr]
|
|
10
10
|
---
|