@su-record/vibe 2.9.37 → 2.9.40
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 +1 -1
- package/commands/vibe.verify.md +6 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +14 -11
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +5 -3
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/llm/gpt-commands.js +1 -1
- package/dist/cli/postinstall/constants.js +1 -1
- package/dist/cli/postinstall/global-config.d.ts.map +1 -1
- package/dist/cli/postinstall/global-config.js +21 -15
- package/dist/cli/postinstall/global-config.js.map +1 -1
- package/dist/cli/setup/LegacyMigration.d.ts.map +1 -1
- package/dist/cli/setup/LegacyMigration.js +28 -6
- package/dist/cli/setup/LegacyMigration.js.map +1 -1
- package/dist/cli/utils.d.ts +6 -0
- package/dist/cli/utils.d.ts.map +1 -1
- package/dist/cli/utils.js +23 -0
- package/dist/cli/utils.js.map +1 -1
- package/dist/infra/lib/ReviewRace.js +1 -1
- package/dist/infra/lib/codex-proxy.js +1 -1
- package/dist/infra/lib/gpt/chat.d.ts +1 -1
- package/dist/infra/lib/gpt/chat.js +24 -24
- package/dist/infra/lib/gpt/chat.js.map +1 -1
- package/dist/infra/lib/gpt/orchestration.js +1 -1
- package/dist/infra/lib/gpt/specializations.d.ts +2 -2
- package/dist/infra/lib/gpt/specializations.js +3 -3
- package/hooks/scripts/__tests__/curation-index.test.js +157 -0
- package/hooks/scripts/__tests__/recipe-extractor.test.js +244 -0
- package/hooks/scripts/__tests__/step-counter.test.js +358 -0
- package/hooks/scripts/lib/curation-index.js +101 -0
- package/hooks/scripts/lib/scope-from-spec.js +30 -0
- package/hooks/scripts/llm-orchestrate.js +2 -2
- package/hooks/scripts/recipe-extractor.js +249 -0
- package/hooks/scripts/session-start.js +26 -5
- package/hooks/scripts/step-counter.js +230 -21
- package/hooks/scripts/utils.js +2 -1
- package/package.json +1 -1
|
@@ -13,20 +13,20 @@ let instructionsCacheTime = 0;
|
|
|
13
13
|
const INSTRUCTIONS_CACHE_TTL = 15 * 60 * 1000; // 15분
|
|
14
14
|
// 사용 가능한 모델 목록
|
|
15
15
|
export const GPT_MODELS = {
|
|
16
|
-
// GPT-5.
|
|
17
|
-
'gpt-5.
|
|
18
|
-
id: 'gpt-5.
|
|
19
|
-
name: 'GPT-5.
|
|
20
|
-
description: 'Pro plan,
|
|
21
|
-
maxTokens:
|
|
16
|
+
// GPT-5.5 Pro (Pro plan — highest accuracy, complex tasks)
|
|
17
|
+
'gpt-5.5-pro': {
|
|
18
|
+
id: 'gpt-5.5-pro',
|
|
19
|
+
name: 'GPT-5.5 Pro',
|
|
20
|
+
description: 'Pro plan, highest accuracy for complex reasoning',
|
|
21
|
+
maxTokens: 1_000_000,
|
|
22
22
|
reasoning: { effort: 'high', summary: 'auto' },
|
|
23
23
|
},
|
|
24
|
-
// GPT-5.
|
|
25
|
-
'gpt-5.
|
|
26
|
-
id: 'gpt-5.
|
|
27
|
-
name: 'GPT-5.
|
|
28
|
-
description: 'Plus plan, frontier model
|
|
29
|
-
maxTokens:
|
|
24
|
+
// GPT-5.5 (Plus plan, frontier model — faster, sharper thinker for fewer tokens)
|
|
25
|
+
'gpt-5.5': {
|
|
26
|
+
id: 'gpt-5.5',
|
|
27
|
+
name: 'GPT-5.5',
|
|
28
|
+
description: 'Plus plan, frontier model with 1M context and autonomous multi-step workflows',
|
|
29
|
+
maxTokens: 1_000_000,
|
|
30
30
|
reasoning: { effort: 'high', summary: 'auto' },
|
|
31
31
|
},
|
|
32
32
|
// GPT-5.3 Codex (코딩 특화)
|
|
@@ -59,8 +59,8 @@ function resolveGptModelOverride() {
|
|
|
59
59
|
const ENV_MODEL = resolveGptModelOverride();
|
|
60
60
|
// 플랜별 기본 모델 매핑
|
|
61
61
|
const PLAN_MODEL_MAP = {
|
|
62
|
-
pro: 'gpt-5.
|
|
63
|
-
plus: 'gpt-5.
|
|
62
|
+
pro: 'gpt-5.5-pro',
|
|
63
|
+
plus: 'gpt-5.5',
|
|
64
64
|
free: 'gpt-5.3-codex',
|
|
65
65
|
};
|
|
66
66
|
/**
|
|
@@ -71,14 +71,14 @@ export function getDefaultModel(plan) {
|
|
|
71
71
|
return ENV_MODEL;
|
|
72
72
|
if (plan)
|
|
73
73
|
return PLAN_MODEL_MAP[plan];
|
|
74
|
-
return 'gpt-5.
|
|
74
|
+
return 'gpt-5.5';
|
|
75
75
|
}
|
|
76
76
|
// 하위 호환용
|
|
77
|
-
export const DEFAULT_MODEL = ENV_MODEL || 'gpt-5.
|
|
77
|
+
export const DEFAULT_MODEL = ENV_MODEL || 'gpt-5.5';
|
|
78
78
|
/**
|
|
79
79
|
* GitHub에서 Codex instructions 가져오기
|
|
80
80
|
*/
|
|
81
|
-
export async function getCodexInstructions(model = 'gpt-5.
|
|
81
|
+
export async function getCodexInstructions(model = 'gpt-5.5') {
|
|
82
82
|
// 캐시 확인
|
|
83
83
|
if (cachedInstructions && Date.now() - instructionsCacheTime < INSTRUCTIONS_CACHE_TTL) {
|
|
84
84
|
return cachedInstructions;
|
|
@@ -157,13 +157,13 @@ async function parseSSEStream(stream) {
|
|
|
157
157
|
*/
|
|
158
158
|
async function chatWithApiKey(apiKey, options) {
|
|
159
159
|
const { model = DEFAULT_MODEL, messages = [], maxTokens = 4096, temperature = 0.7, systemPrompt = '', } = options;
|
|
160
|
-
// API Key 방식은 OpenAI 모델 사용 (5.
|
|
160
|
+
// API Key 방식은 OpenAI 모델 사용 (5.5 계열 + 5.3-codex만 지원)
|
|
161
161
|
const apiKeyModelMap = {
|
|
162
|
-
'gpt-5.
|
|
163
|
-
'gpt-5.
|
|
162
|
+
'gpt-5.5': 'gpt-5.5',
|
|
163
|
+
'gpt-5.5-pro': 'gpt-5.5',
|
|
164
164
|
'gpt-5.3-codex': 'gpt-5.3-codex',
|
|
165
165
|
};
|
|
166
|
-
const actualModel = apiKeyModelMap[model] || 'gpt-5.
|
|
166
|
+
const actualModel = apiKeyModelMap[model] || 'gpt-5.5';
|
|
167
167
|
// 메시지 구성
|
|
168
168
|
const apiMessages = [];
|
|
169
169
|
if (systemPrompt) {
|
|
@@ -178,7 +178,7 @@ async function chatWithApiKey(apiKey, options) {
|
|
|
178
178
|
const requestBody = {
|
|
179
179
|
model: actualModel,
|
|
180
180
|
messages: apiMessages,
|
|
181
|
-
max_completion_tokens: maxTokens, // GPT-5
|
|
181
|
+
max_completion_tokens: maxTokens, // GPT-5 family uses max_completion_tokens instead of max_tokens
|
|
182
182
|
temperature,
|
|
183
183
|
};
|
|
184
184
|
const response = await fetch('https://api.openai.com/v1/chat/completions', {
|
|
@@ -481,11 +481,11 @@ export async function ask(prompt, options = {}) {
|
|
|
481
481
|
return result.content;
|
|
482
482
|
}
|
|
483
483
|
/**
|
|
484
|
-
* 빠른 질문 (GPT-5.
|
|
484
|
+
* 빠른 질문 (GPT-5.5 사용)
|
|
485
485
|
*/
|
|
486
486
|
export async function quickAsk(prompt) {
|
|
487
487
|
return ask(prompt, {
|
|
488
|
-
model: 'gpt-5.
|
|
488
|
+
model: 'gpt-5.5',
|
|
489
489
|
maxTokens: 2048,
|
|
490
490
|
temperature: 0.3,
|
|
491
491
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../../src/infra/lib/gpt/chat.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../../src/infra/lib/gpt/chat.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@ import { chat } from './chat.js';
|
|
|
11
11
|
export async function coreGptOrchestrate(prompt, systemPrompt, options = {}) {
|
|
12
12
|
const { maxTokens = 4096, jsonMode = true } = options;
|
|
13
13
|
const result = await chat({
|
|
14
|
-
model: 'gpt-5.
|
|
14
|
+
model: 'gpt-5.5',
|
|
15
15
|
messages: [{ role: 'user', content: prompt }],
|
|
16
16
|
maxTokens,
|
|
17
17
|
temperature: 0,
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
* GPT 특수 기능 (아키텍처 분석, 디버깅)
|
|
3
3
|
*/
|
|
4
4
|
/**
|
|
5
|
-
* 아키텍처/디버깅 분석 (GPT-5.
|
|
5
|
+
* 아키텍처/디버깅 분석 (GPT-5.5 사용)
|
|
6
6
|
*/
|
|
7
7
|
export declare function analyzeArchitecture(prompt: string): Promise<string>;
|
|
8
8
|
/**
|
|
9
|
-
* 코드 디버깅 (GPT-5.
|
|
9
|
+
* 코드 디버깅 (GPT-5.3 Codex 사용 — 코딩 특화)
|
|
10
10
|
*/
|
|
11
11
|
export declare function debugCode(prompt: string): Promise<string>;
|
|
12
12
|
//# sourceMappingURL=specializations.d.ts.map
|
|
@@ -4,20 +4,20 @@
|
|
|
4
4
|
import { ask } from './chat.js';
|
|
5
5
|
import { isCodexAvailable } from '../llm-availability.js';
|
|
6
6
|
/**
|
|
7
|
-
* 아키텍처/디버깅 분석 (GPT-5.
|
|
7
|
+
* 아키텍처/디버깅 분석 (GPT-5.5 사용)
|
|
8
8
|
*/
|
|
9
9
|
export async function analyzeArchitecture(prompt) {
|
|
10
10
|
if (!isCodexAvailable())
|
|
11
11
|
return '';
|
|
12
12
|
return ask(prompt, {
|
|
13
|
-
model: 'gpt-5.
|
|
13
|
+
model: 'gpt-5.5',
|
|
14
14
|
maxTokens: 8192,
|
|
15
15
|
temperature: 0.5,
|
|
16
16
|
systemPrompt: 'You are a senior software architect. Analyze the given code or architecture and provide detailed insights, potential issues, and recommendations.',
|
|
17
17
|
});
|
|
18
18
|
}
|
|
19
19
|
/**
|
|
20
|
-
* 코드 디버깅 (GPT-5.
|
|
20
|
+
* 코드 디버깅 (GPT-5.3 Codex 사용 — 코딩 특화)
|
|
21
21
|
*/
|
|
22
22
|
export async function debugCode(prompt) {
|
|
23
23
|
if (!isCodexAvailable())
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* curation-index.js — Phase 3 인덱스 로더 테스트
|
|
3
|
+
*
|
|
4
|
+
* session-start.js 가 다음 세션에 prepend 할 1줄 요약을 만드는 모듈.
|
|
5
|
+
* 본격 YAML parser 의존 없이 우리가 작성한 frontmatter 형식만 처리한다.
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
8
|
+
import fs from 'fs';
|
|
9
|
+
import os from 'os';
|
|
10
|
+
import path from 'path';
|
|
11
|
+
import { loadCurationIndex, _internal } from '../lib/curation-index.js';
|
|
12
|
+
|
|
13
|
+
const { parseFrontmatter } = _internal;
|
|
14
|
+
|
|
15
|
+
function makeTmpProject() {
|
|
16
|
+
return fs.mkdtempSync(path.join(os.tmpdir(), 'vibe-curation-index-'));
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function writeRecipe(projectDir, filename, frontmatter, body = 'body text') {
|
|
20
|
+
const dir = path.join(projectDir, '.vibe', 'recipes');
|
|
21
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
22
|
+
const fm = Object.entries(frontmatter)
|
|
23
|
+
.map(([k, v]) => typeof v === 'string' ? `${k}: "${v}"` : `${k}: ${v}`)
|
|
24
|
+
.join('\n');
|
|
25
|
+
fs.writeFileSync(path.join(dir, filename), `---\n${fm}\n---\n\n${body}\n`);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function writeAntiPattern(projectDir, filename, frontmatter, body = 'body') {
|
|
29
|
+
const dir = path.join(projectDir, '.vibe', 'anti-patterns');
|
|
30
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
31
|
+
const fm = Object.entries(frontmatter)
|
|
32
|
+
.map(([k, v]) => typeof v === 'string' ? `${k}: "${v}"` : `${k}: ${v}`)
|
|
33
|
+
.join('\n');
|
|
34
|
+
fs.writeFileSync(path.join(dir, filename), `---\n${fm}\n---\n\n${body}\n`);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
describe('parseFrontmatter', () => {
|
|
38
|
+
it('단순 key-value 파싱', () => {
|
|
39
|
+
const input = `---\nslug: foo\ntype: recipe\n---\nbody`;
|
|
40
|
+
expect(parseFrontmatter(input)).toEqual({ slug: 'foo', type: 'recipe' });
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('따옴표로 감싼 값', () => {
|
|
44
|
+
const input = `---\nrecipe: "use claude --model"\n---\n`;
|
|
45
|
+
expect(parseFrontmatter(input).recipe).toBe('use claude --model');
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('이스케이프된 따옴표', () => {
|
|
49
|
+
const input = `---\nmsg: "say \\"hi\\""\n---\n`;
|
|
50
|
+
expect(parseFrontmatter(input).msg).toBe('say "hi"');
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it('frontmatter 가 없으면 null', () => {
|
|
54
|
+
expect(parseFrontmatter('no frontmatter here')).toBeNull();
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('알 수 없는 라인 무시', () => {
|
|
58
|
+
const input = `---\nslug: foo\n# comment line\nrandom garbage\ntype: recipe\n---\n`;
|
|
59
|
+
expect(parseFrontmatter(input)).toEqual({ slug: 'foo', type: 'recipe' });
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
describe('loadCurationIndex', () => {
|
|
64
|
+
let projectDir;
|
|
65
|
+
|
|
66
|
+
beforeEach(() => {
|
|
67
|
+
projectDir = makeTmpProject();
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it('빈 .vibe/ 면 빈 인덱스', () => {
|
|
71
|
+
const idx = loadCurationIndex(projectDir);
|
|
72
|
+
expect(idx.recipes).toEqual([]);
|
|
73
|
+
expect(idx.antiPatterns).toEqual([]);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it('recipe 1개 로드', () => {
|
|
77
|
+
writeRecipe(projectDir, 'a.md', {
|
|
78
|
+
slug: 'login__20260507-100000',
|
|
79
|
+
type: 'recipe',
|
|
80
|
+
'symptom-context': 'login flow',
|
|
81
|
+
recipe: 'pin model and retry transient',
|
|
82
|
+
created: '2026-05-07',
|
|
83
|
+
});
|
|
84
|
+
const idx = loadCurationIndex(projectDir);
|
|
85
|
+
expect(idx.recipes).toHaveLength(1);
|
|
86
|
+
expect(idx.recipes[0]).toEqual({
|
|
87
|
+
slug: 'login__20260507-100000',
|
|
88
|
+
summary: 'pin model and retry transient',
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
it('recipe 정렬: created 내림차순', () => {
|
|
93
|
+
writeRecipe(projectDir, 'old.md', { slug: 'old', recipe: 'old', created: '2026-01-01' });
|
|
94
|
+
writeRecipe(projectDir, 'mid.md', { slug: 'mid', recipe: 'mid', created: '2026-03-01' });
|
|
95
|
+
writeRecipe(projectDir, 'new.md', { slug: 'new', recipe: 'new', created: '2026-05-01' });
|
|
96
|
+
const idx = loadCurationIndex(projectDir);
|
|
97
|
+
expect(idx.recipes.map((r) => r.slug)).toEqual(['new', 'mid', 'old']);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it('limit 적용', () => {
|
|
101
|
+
for (let i = 0; i < 10; i++) {
|
|
102
|
+
writeRecipe(projectDir, `r${i}.md`, {
|
|
103
|
+
slug: `r${i}`,
|
|
104
|
+
recipe: `recipe ${i}`,
|
|
105
|
+
created: `2026-05-${String(i + 1).padStart(2, '0')}`,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
const idx = loadCurationIndex(projectDir, { recipeLimit: 3 });
|
|
109
|
+
expect(idx.recipes).toHaveLength(3);
|
|
110
|
+
expect(idx.recipes[0].slug).toBe('r9');
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it('anti-pattern 로드 — tag + suggested-stop', () => {
|
|
114
|
+
writeAntiPattern(projectDir, 'a.md', {
|
|
115
|
+
slug: 'nullability__src__20260507',
|
|
116
|
+
type: 'anti-pattern',
|
|
117
|
+
'root-cause-tag': 'nullability',
|
|
118
|
+
'trigger-signature': '(file=src/x.ts, category=nullability)',
|
|
119
|
+
'suggested-stop': '같은 위치 null 처리 반복 — 타입 가드 필요',
|
|
120
|
+
created: '2026-05-07',
|
|
121
|
+
});
|
|
122
|
+
const idx = loadCurationIndex(projectDir);
|
|
123
|
+
expect(idx.antiPatterns).toHaveLength(1);
|
|
124
|
+
expect(idx.antiPatterns[0].tag).toBe('nullability');
|
|
125
|
+
expect(idx.antiPatterns[0].summary).toBe('같은 위치 null 처리 반복 — 타입 가드 필요');
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it('frontmatter 손상 파일은 스킵', () => {
|
|
129
|
+
writeRecipe(projectDir, 'good.md', { slug: 'good', recipe: 'works', created: '2026-05-07' });
|
|
130
|
+
fs.writeFileSync(path.join(projectDir, '.vibe', 'recipes', 'broken.md'), 'no frontmatter');
|
|
131
|
+
fs.writeFileSync(path.join(projectDir, '.vibe', 'recipes', 'no-slug.md'), '---\ntype: recipe\n---\n');
|
|
132
|
+
const idx = loadCurationIndex(projectDir);
|
|
133
|
+
expect(idx.recipes).toHaveLength(1);
|
|
134
|
+
expect(idx.recipes[0].slug).toBe('good');
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
it('README.md, _cluster*.md 등 메타 파일 제외', () => {
|
|
138
|
+
writeRecipe(projectDir, 'r.md', { slug: 'r', recipe: 'good', created: '2026-05-07' });
|
|
139
|
+
fs.writeFileSync(path.join(projectDir, '.vibe', 'recipes', 'README.md'), '---\nslug: should-skip\n---\n');
|
|
140
|
+
fs.writeFileSync(path.join(projectDir, '.vibe', 'recipes', '_cluster-x.md'), '---\nslug: should-skip\n---\n');
|
|
141
|
+
const idx = loadCurationIndex(projectDir);
|
|
142
|
+
expect(idx.recipes.map((r) => r.slug)).toEqual(['r']);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
it('recipe + anti-pattern 동시 로드 (독립)', () => {
|
|
146
|
+
writeRecipe(projectDir, 'r.md', { slug: 'r', recipe: 'do this', created: '2026-05-07' });
|
|
147
|
+
writeAntiPattern(projectDir, 'a.md', {
|
|
148
|
+
slug: 'a',
|
|
149
|
+
'root-cause-tag': 'auth',
|
|
150
|
+
'suggested-stop': 'check tokens',
|
|
151
|
+
created: '2026-05-07',
|
|
152
|
+
});
|
|
153
|
+
const idx = loadCurationIndex(projectDir);
|
|
154
|
+
expect(idx.recipes).toHaveLength(1);
|
|
155
|
+
expect(idx.antiPatterns).toHaveLength(1);
|
|
156
|
+
});
|
|
157
|
+
});
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* recipe-extractor.js — Phase 3 테스트
|
|
3
|
+
*
|
|
4
|
+
* 검증 범위:
|
|
5
|
+
* - 휴리스틱 게이트: total_tools≥8 AND fails≥3 AND last=success
|
|
6
|
+
* - VIBE_RECIPE_LLM=mock 으로 LLM 우회 (외부 의존 0)
|
|
7
|
+
* - frontmatter schema 충족
|
|
8
|
+
* - silent fail 정책 (jsonl 없음 / 게이트 실패 / 디렉토리 부재)
|
|
9
|
+
*
|
|
10
|
+
* 외부 의존:
|
|
11
|
+
* - 실제 claude CLI 는 호출하지 않음 (mock 모드 사용)
|
|
12
|
+
*/
|
|
13
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
14
|
+
import { spawnSync } from 'child_process';
|
|
15
|
+
import fs from 'fs';
|
|
16
|
+
import os from 'os';
|
|
17
|
+
import path from 'path';
|
|
18
|
+
import { fileURLToPath } from 'url';
|
|
19
|
+
|
|
20
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
21
|
+
const SCRIPT = path.resolve(__dirname, '..', 'recipe-extractor.js');
|
|
22
|
+
|
|
23
|
+
function makeTmpProject() {
|
|
24
|
+
return fs.mkdtempSync(path.join(os.tmpdir(), 'vibe-recipe-extractor-'));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function writeJsonl(projectDir, records) {
|
|
28
|
+
const dir = path.join(projectDir, '.vibe', 'metrics');
|
|
29
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
30
|
+
const lines = records.map((r) => JSON.stringify(r)).join('\n') + '\n';
|
|
31
|
+
fs.writeFileSync(path.join(dir, 'current-run.jsonl'), lines);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function writeRunMeta(projectDir, meta) {
|
|
35
|
+
const dir = path.join(projectDir, '.vibe', 'metrics');
|
|
36
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
37
|
+
fs.writeFileSync(path.join(dir, 'current-run.json'), JSON.stringify(meta));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function runExtractor(projectDir, { mock = true } = {}) {
|
|
41
|
+
const result = spawnSync('node', [SCRIPT], {
|
|
42
|
+
encoding: 'utf-8',
|
|
43
|
+
timeout: 5000,
|
|
44
|
+
env: {
|
|
45
|
+
...process.env,
|
|
46
|
+
CLAUDE_PROJECT_DIR: projectDir,
|
|
47
|
+
...(mock ? { VIBE_RECIPE_LLM: 'mock' } : {}),
|
|
48
|
+
VIBE_HOOK_DEPTH: '0',
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function listRecipes(projectDir) {
|
|
55
|
+
const dir = path.join(projectDir, '.vibe', 'recipes');
|
|
56
|
+
if (!fs.existsSync(dir)) return [];
|
|
57
|
+
return fs.readdirSync(dir).filter((f) => f.endsWith('.md'));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function makeRecord({ tool = 'Bash', ok = true, file = null, category = null }) {
|
|
61
|
+
return {
|
|
62
|
+
ts: new Date().toISOString(),
|
|
63
|
+
tool,
|
|
64
|
+
ok,
|
|
65
|
+
target_file: file,
|
|
66
|
+
error_category: ok ? null : category,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
describe('recipe-extractor (Phase 3)', () => {
|
|
71
|
+
let projectDir;
|
|
72
|
+
|
|
73
|
+
beforeEach(() => {
|
|
74
|
+
projectDir = makeTmpProject();
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
// ───────── 게이트 통과 조건 ─────────
|
|
78
|
+
describe('휴리스틱 게이트', () => {
|
|
79
|
+
it('총 ≥8 + 실패 ≥3 + 마지막 성공 → recipe 생성', () => {
|
|
80
|
+
const records = [
|
|
81
|
+
makeRecord({ ok: false, category: 'integration' }),
|
|
82
|
+
makeRecord({ ok: false, category: 'integration' }),
|
|
83
|
+
makeRecord({ ok: false, category: 'auth' }),
|
|
84
|
+
makeRecord({ ok: true }),
|
|
85
|
+
makeRecord({ ok: true }),
|
|
86
|
+
makeRecord({ ok: true, tool: 'Edit', file: 'src/foo.ts' }),
|
|
87
|
+
makeRecord({ ok: true, tool: 'Read', file: 'src/foo.ts' }),
|
|
88
|
+
makeRecord({ ok: true, tool: 'Bash' }), // 마지막=성공
|
|
89
|
+
];
|
|
90
|
+
writeJsonl(projectDir, records);
|
|
91
|
+
writeRunMeta(projectDir, { feature: 'auth-fix', startedAt: '2026-05-07T00:00:00.000Z', steps: 8 });
|
|
92
|
+
|
|
93
|
+
const r = runExtractor(projectDir);
|
|
94
|
+
expect(r.status).toBe(0);
|
|
95
|
+
expect(listRecipes(projectDir)).toHaveLength(1);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it('툴콜 부족 (<8) → 생성 안 함', () => {
|
|
99
|
+
const records = [
|
|
100
|
+
makeRecord({ ok: false, category: 'integration' }),
|
|
101
|
+
makeRecord({ ok: false, category: 'integration' }),
|
|
102
|
+
makeRecord({ ok: false, category: 'integration' }),
|
|
103
|
+
makeRecord({ ok: true }),
|
|
104
|
+
];
|
|
105
|
+
writeJsonl(projectDir, records);
|
|
106
|
+
writeRunMeta(projectDir, { feature: 'x' });
|
|
107
|
+
runExtractor(projectDir);
|
|
108
|
+
expect(listRecipes(projectDir)).toHaveLength(0);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it('실패 부족 (<3) → 생성 안 함', () => {
|
|
112
|
+
const records = Array.from({ length: 10 }, () => makeRecord({ ok: true }));
|
|
113
|
+
records[0] = makeRecord({ ok: false, category: 'other' });
|
|
114
|
+
records[1] = makeRecord({ ok: false, category: 'other' });
|
|
115
|
+
writeJsonl(projectDir, records);
|
|
116
|
+
writeRunMeta(projectDir, { feature: 'x' });
|
|
117
|
+
runExtractor(projectDir);
|
|
118
|
+
expect(listRecipes(projectDir)).toHaveLength(0);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it('마지막 호출이 실패 → 생성 안 함 (task 미완료)', () => {
|
|
122
|
+
const records = [
|
|
123
|
+
...Array.from({ length: 5 }, () => makeRecord({ ok: true })),
|
|
124
|
+
makeRecord({ ok: false, category: 'integration' }),
|
|
125
|
+
makeRecord({ ok: false, category: 'integration' }),
|
|
126
|
+
makeRecord({ ok: false, category: 'integration' }),
|
|
127
|
+
];
|
|
128
|
+
writeJsonl(projectDir, records);
|
|
129
|
+
writeRunMeta(projectDir, { feature: 'x' });
|
|
130
|
+
runExtractor(projectDir);
|
|
131
|
+
expect(listRecipes(projectDir)).toHaveLength(0);
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
// ───────── frontmatter 검증 ─────────
|
|
136
|
+
describe('frontmatter schema', () => {
|
|
137
|
+
function makeQualifyingRun() {
|
|
138
|
+
const records = [
|
|
139
|
+
makeRecord({ tool: 'Bash', ok: false, category: 'integration' }),
|
|
140
|
+
makeRecord({ tool: 'Bash', ok: false, category: 'integration' }),
|
|
141
|
+
makeRecord({ tool: 'Edit', file: 'src/foo.ts', ok: false, category: 'type-narrow' }),
|
|
142
|
+
makeRecord({ tool: 'Edit', file: 'src/foo.ts', ok: true }),
|
|
143
|
+
makeRecord({ tool: 'Read', file: 'src/foo.ts', ok: true }),
|
|
144
|
+
makeRecord({ tool: 'Bash', ok: true }),
|
|
145
|
+
makeRecord({ tool: 'Bash', ok: true }),
|
|
146
|
+
makeRecord({ tool: 'Bash', ok: true }),
|
|
147
|
+
];
|
|
148
|
+
writeJsonl(projectDir, records);
|
|
149
|
+
writeRunMeta(projectDir, { feature: 'login flow', startedAt: '2026-05-07T10:00:00.000Z', steps: 8 });
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
it('생성된 recipe 의 frontmatter 가 schema 충족', () => {
|
|
153
|
+
makeQualifyingRun();
|
|
154
|
+
runExtractor(projectDir);
|
|
155
|
+
const [filename] = listRecipes(projectDir);
|
|
156
|
+
const content = fs.readFileSync(path.join(projectDir, '.vibe', 'recipes', filename), 'utf-8');
|
|
157
|
+
|
|
158
|
+
expect(content).toMatch(/^---\n/);
|
|
159
|
+
expect(content).toMatch(/^slug: login-flow__\d{8}-\d{6}$/m);
|
|
160
|
+
expect(content).toMatch(/^type: recipe$/m);
|
|
161
|
+
expect(content).toMatch(/^symptom-context: "login flow"$/m);
|
|
162
|
+
expect(content).toMatch(/^recipe: ".+"$/m);
|
|
163
|
+
expect(content).toMatch(/^tools-touched: \[/m);
|
|
164
|
+
expect(content).toMatch(/^retry-count-saved: 3$/m);
|
|
165
|
+
expect(content).toMatch(/^created: \d{4}-\d{2}-\d{2}$/m);
|
|
166
|
+
expect(content).toMatch(/^source-run: "2026-05-07T10:00:00\.000Z"$/m);
|
|
167
|
+
expect(content).toMatch(/^confidence: low$/m);
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
it('파일명이 timestamp slug 포함', () => {
|
|
171
|
+
makeQualifyingRun();
|
|
172
|
+
runExtractor(projectDir);
|
|
173
|
+
const [filename] = listRecipes(projectDir);
|
|
174
|
+
expect(filename).toMatch(/^login-flow__\d{8}-\d{6}\.md$/);
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
it('feature 누락 시 anon slug', () => {
|
|
178
|
+
const records = Array.from({ length: 8 }, (_, i) => makeRecord({
|
|
179
|
+
ok: i < 3 ? false : true,
|
|
180
|
+
category: i < 3 ? 'integration' : null,
|
|
181
|
+
}));
|
|
182
|
+
writeJsonl(projectDir, records);
|
|
183
|
+
writeRunMeta(projectDir, { feature: null });
|
|
184
|
+
runExtractor(projectDir);
|
|
185
|
+
const [filename] = listRecipes(projectDir);
|
|
186
|
+
expect(filename).toMatch(/^anon__/);
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
// ───────── 안전성 ─────────
|
|
191
|
+
describe('silent fail 정책', () => {
|
|
192
|
+
it('jsonl 없음 → exit 0, 파일 생성 안 함', () => {
|
|
193
|
+
const r = runExtractor(projectDir);
|
|
194
|
+
expect(r.status).toBe(0);
|
|
195
|
+
expect(listRecipes(projectDir)).toHaveLength(0);
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
it('빈 jsonl → exit 0, 생성 안 함', () => {
|
|
199
|
+
writeJsonl(projectDir, []);
|
|
200
|
+
const r = runExtractor(projectDir);
|
|
201
|
+
expect(r.status).toBe(0);
|
|
202
|
+
expect(listRecipes(projectDir)).toHaveLength(0);
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
it('VIBE_HOOK_DEPTH≥1 → 재귀 가드, 생성 안 함', () => {
|
|
206
|
+
const records = [
|
|
207
|
+
...Array.from({ length: 5 }, () => makeRecord({ ok: false, category: 'integration' })),
|
|
208
|
+
makeRecord({ ok: true }), makeRecord({ ok: true }), makeRecord({ ok: true }),
|
|
209
|
+
];
|
|
210
|
+
writeJsonl(projectDir, records);
|
|
211
|
+
writeRunMeta(projectDir, { feature: 'x' });
|
|
212
|
+
|
|
213
|
+
const r = spawnSync('node', [SCRIPT], {
|
|
214
|
+
encoding: 'utf-8',
|
|
215
|
+
timeout: 5000,
|
|
216
|
+
env: {
|
|
217
|
+
...process.env,
|
|
218
|
+
CLAUDE_PROJECT_DIR: projectDir,
|
|
219
|
+
VIBE_RECIPE_LLM: 'mock',
|
|
220
|
+
VIBE_HOOK_DEPTH: '1',
|
|
221
|
+
},
|
|
222
|
+
});
|
|
223
|
+
expect(r.status).toBe(0);
|
|
224
|
+
expect(listRecipes(projectDir)).toHaveLength(0);
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
it('손상된 jsonl 라인은 무시', () => {
|
|
228
|
+
const dir = path.join(projectDir, '.vibe', 'metrics');
|
|
229
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
230
|
+
// 일부 라인 손상 + 8개 정상
|
|
231
|
+
const good = Array.from({ length: 8 }, (_, i) => JSON.stringify(makeRecord({
|
|
232
|
+
ok: i < 3 ? false : true,
|
|
233
|
+
category: i < 3 ? 'integration' : null,
|
|
234
|
+
})));
|
|
235
|
+
const lines = ['{ broken', ...good].join('\n') + '\n';
|
|
236
|
+
fs.writeFileSync(path.join(dir, 'current-run.jsonl'), lines);
|
|
237
|
+
writeRunMeta(projectDir, { feature: 'x' });
|
|
238
|
+
|
|
239
|
+
const r = runExtractor(projectDir);
|
|
240
|
+
expect(r.status).toBe(0);
|
|
241
|
+
expect(listRecipes(projectDir)).toHaveLength(1);
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
});
|