@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.
Files changed (39) hide show
  1. package/CLAUDE.md +1 -1
  2. package/commands/vibe.verify.md +6 -0
  3. package/dist/cli/commands/init.d.ts.map +1 -1
  4. package/dist/cli/commands/init.js +14 -11
  5. package/dist/cli/commands/init.js.map +1 -1
  6. package/dist/cli/commands/update.d.ts.map +1 -1
  7. package/dist/cli/commands/update.js +5 -3
  8. package/dist/cli/commands/update.js.map +1 -1
  9. package/dist/cli/llm/gpt-commands.js +1 -1
  10. package/dist/cli/postinstall/constants.js +1 -1
  11. package/dist/cli/postinstall/global-config.d.ts.map +1 -1
  12. package/dist/cli/postinstall/global-config.js +21 -15
  13. package/dist/cli/postinstall/global-config.js.map +1 -1
  14. package/dist/cli/setup/LegacyMigration.d.ts.map +1 -1
  15. package/dist/cli/setup/LegacyMigration.js +28 -6
  16. package/dist/cli/setup/LegacyMigration.js.map +1 -1
  17. package/dist/cli/utils.d.ts +6 -0
  18. package/dist/cli/utils.d.ts.map +1 -1
  19. package/dist/cli/utils.js +23 -0
  20. package/dist/cli/utils.js.map +1 -1
  21. package/dist/infra/lib/ReviewRace.js +1 -1
  22. package/dist/infra/lib/codex-proxy.js +1 -1
  23. package/dist/infra/lib/gpt/chat.d.ts +1 -1
  24. package/dist/infra/lib/gpt/chat.js +24 -24
  25. package/dist/infra/lib/gpt/chat.js.map +1 -1
  26. package/dist/infra/lib/gpt/orchestration.js +1 -1
  27. package/dist/infra/lib/gpt/specializations.d.ts +2 -2
  28. package/dist/infra/lib/gpt/specializations.js +3 -3
  29. package/hooks/scripts/__tests__/curation-index.test.js +157 -0
  30. package/hooks/scripts/__tests__/recipe-extractor.test.js +244 -0
  31. package/hooks/scripts/__tests__/step-counter.test.js +358 -0
  32. package/hooks/scripts/lib/curation-index.js +101 -0
  33. package/hooks/scripts/lib/scope-from-spec.js +30 -0
  34. package/hooks/scripts/llm-orchestrate.js +2 -2
  35. package/hooks/scripts/recipe-extractor.js +249 -0
  36. package/hooks/scripts/session-start.js +26 -5
  37. package/hooks/scripts/step-counter.js +230 -21
  38. package/hooks/scripts/utils.js +2 -1
  39. 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.4 Pro (Pro plan — highest quality, complex tasks)
17
- 'gpt-5.4-pro': {
18
- id: 'gpt-5.4-pro',
19
- name: 'GPT-5.4 Pro',
20
- description: 'Pro plan, smarter and more precise responses',
21
- maxTokens: 128000,
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.4 (Plus plan, frontier model for professional work)
25
- 'gpt-5.4': {
26
- id: 'gpt-5.4',
27
- name: 'GPT-5.4',
28
- description: 'Plus plan, frontier model for professional work',
29
- maxTokens: 128000,
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.4-pro',
63
- plus: 'gpt-5.4',
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.4';
74
+ return 'gpt-5.5';
75
75
  }
76
76
  // 하위 호환용
77
- export const DEFAULT_MODEL = ENV_MODEL || 'gpt-5.4';
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.4') {
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.4 계열 + 5.3-codex만 지원)
160
+ // API Key 방식은 OpenAI 모델 사용 (5.5 계열 + 5.3-codex만 지원)
161
161
  const apiKeyModelMap = {
162
- 'gpt-5.4': 'gpt-5.4',
163
- 'gpt-5.4-pro': 'gpt-5.4',
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.4';
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.2 uses max_completion_tokens instead of max_tokens
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.4 사용)
484
+ * 빠른 질문 (GPT-5.5 사용)
485
485
  */
486
486
  export async function quickAsk(prompt) {
487
487
  return ask(prompt, {
488
- model: 'gpt-5.4',
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.4',
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.4 사용)
5
+ * 아키텍처/디버깅 분석 (GPT-5.5 사용)
6
6
  */
7
7
  export declare function analyzeArchitecture(prompt: string): Promise<string>;
8
8
  /**
9
- * 코드 디버깅 (GPT-5.4 Codex 사용 — 코딩 특화)
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.4 사용)
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.4',
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.4 Codex 사용 — 코딩 특화)
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
+ });