@su-record/vibe 2.13.0 → 2.14.0

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 (42) hide show
  1. package/CLAUDE.md +18 -15
  2. package/README.en.md +5 -3
  3. package/README.md +6 -4
  4. package/dist/cli/postinstall/constants.d.ts.map +1 -1
  5. package/dist/cli/postinstall/constants.js +1 -0
  6. package/dist/cli/postinstall/constants.js.map +1 -1
  7. package/dist/cli/setup/ProjectSetup.d.ts.map +1 -1
  8. package/dist/cli/setup/ProjectSetup.js +4 -3
  9. package/dist/cli/setup/ProjectSetup.js.map +1 -1
  10. package/dist/tools/index.d.ts +2 -0
  11. package/dist/tools/index.d.ts.map +1 -1
  12. package/dist/tools/index.js +2 -0
  13. package/dist/tools/index.js.map +1 -1
  14. package/dist/tools/loop/index.d.ts +6 -0
  15. package/dist/tools/loop/index.d.ts.map +1 -0
  16. package/dist/tools/loop/index.js +5 -0
  17. package/dist/tools/loop/index.js.map +1 -0
  18. package/dist/tools/loop/validateLoopDefinition.d.ts +38 -0
  19. package/dist/tools/loop/validateLoopDefinition.d.ts.map +1 -0
  20. package/dist/tools/loop/validateLoopDefinition.js +224 -0
  21. package/dist/tools/loop/validateLoopDefinition.js.map +1 -0
  22. package/dist/tools/loop/validateLoopDefinition.test.d.ts +14 -0
  23. package/dist/tools/loop/validateLoopDefinition.test.d.ts.map +1 -0
  24. package/dist/tools/loop/validateLoopDefinition.test.js +229 -0
  25. package/dist/tools/loop/validateLoopDefinition.test.js.map +1 -0
  26. package/hooks/scripts/__tests__/.vibe/command-log.txt +21 -0
  27. package/hooks/scripts/__tests__/.vibe/memories/memories.db-shm +0 -0
  28. package/hooks/scripts/__tests__/.vibe/memories/memories.db-wal +0 -0
  29. package/hooks/scripts/__tests__/keyword-detector.test.js +26 -18
  30. package/hooks/scripts/__tests__/loop-ledger.test.js +321 -0
  31. package/hooks/scripts/keyword-detector.js +22 -22
  32. package/hooks/scripts/lib/hook-context.js +31 -2
  33. package/hooks/scripts/lib/loop-ledger.js +118 -0
  34. package/hooks/scripts/loop-ledger.js +56 -0
  35. package/package.json +1 -1
  36. package/skills/vibe/SKILL.md +40 -23
  37. package/skills/vibe.loop/SKILL.md +116 -0
  38. package/skills/vibe.run/SKILL.md +22 -18
  39. package/skills/vibe.run/references/ralph-loop.md +18 -17
  40. package/skills/vibe.run/references/ultrawork-mode.md +36 -33
  41. package/vibe/rules/loop-contract.md +54 -0
  42. package/vibe/templates/loop-template.md +69 -0
@@ -0,0 +1,224 @@
1
+ /**
2
+ * Loop Definition Validator — 루프 정의 파일(.vibe/loops/<name>.md) 검증.
3
+ *
4
+ * frontmatter 필수 필드, enum 값, max_iterations 범위(1–50),
5
+ * 조건부 필드(schedule, test_command)를 결정론적으로 검증한다.
6
+ */
7
+ // ─── Constants ───────────────────────────────────────────────────────
8
+ const TRIGGER_VALUES = new Set(['scheduled', 'manual', 'on-event']);
9
+ const VERIFY_VALUES = new Set(['ledger', 'tests', 'none']);
10
+ const ISOLATION_VALUES = new Set(['worktree', 'none']);
11
+ const STATUS_VALUES = new Set(['active', 'paused']);
12
+ /** 5-필드 cron 기본 패턴 (과도한 검증 금지) */
13
+ const CRON_PATTERN = /^\S+\s+\S+\s+\S+\s+\S+\s+\S+$/;
14
+ const MAX_ITERATIONS_MIN = 1;
15
+ const MAX_ITERATIONS_MAX = 50;
16
+ // ─── Frontmatter Parser ──────────────────────────────────────────────
17
+ /**
18
+ * YAML-like frontmatter 파싱 (scope-from-spec.js#readFrontmatter 의미론 준수).
19
+ * 스칼라 값과 인라인 배열([a, b, c]), 블록 시퀀스(- item)를 처리한다.
20
+ */
21
+ function parseFrontmatter(content) {
22
+ if (!content.startsWith('---'))
23
+ return {};
24
+ const end = content.indexOf('\n---', 3);
25
+ if (end < 0)
26
+ return {};
27
+ const block = content.slice(3, end);
28
+ const out = {};
29
+ const lines = block.split('\n');
30
+ let currentKey = null;
31
+ let blockLines = [];
32
+ const flushBlock = () => {
33
+ if (currentKey !== null && blockLines.length > 0) {
34
+ out[currentKey] = blockLines.join('\n').trim();
35
+ currentKey = null;
36
+ blockLines = [];
37
+ }
38
+ };
39
+ for (const line of lines) {
40
+ // block scalar continuation (indented)
41
+ if (currentKey !== null && (line.startsWith(' ') || line === '')) {
42
+ blockLines.push(line.replace(/^ /, ''));
43
+ continue;
44
+ }
45
+ flushBlock();
46
+ // sequence item
47
+ if (line.match(/^- .+/)) {
48
+ // orphan sequence — attach to last key (pipeline etc. as array)
49
+ continue;
50
+ }
51
+ const kv = line.match(/^([a-zA-Z_][\w-]*)\s*:\s*(.*)$/);
52
+ if (!kv)
53
+ continue;
54
+ const key = kv[1];
55
+ const raw = kv[2].trim();
56
+ if (raw === '|' || raw === '>') {
57
+ // block scalar — collect following lines
58
+ currentKey = key;
59
+ blockLines = [];
60
+ }
61
+ else if (raw.startsWith('[') && raw.endsWith(']')) {
62
+ // inline array: [a, b, c]
63
+ out[key] = raw
64
+ .slice(1, -1)
65
+ .split(',')
66
+ .map((s) => s.trim())
67
+ .filter((s) => s.length > 0);
68
+ }
69
+ else if (raw === '') {
70
+ // key with no value — sequence follows (like `pipeline:\n - vibe.spec`)
71
+ out[key] = [];
72
+ currentKey = key + '__seq';
73
+ blockLines = [];
74
+ }
75
+ else {
76
+ out[key] = raw;
77
+ }
78
+ }
79
+ flushBlock();
80
+ return out;
81
+ }
82
+ /**
83
+ * 시퀀스 블록 파싱 — frontmatter 내 `key:\n - item` 형식 전용.
84
+ * parseFrontmatter 를 보완해 pipeline 배열을 올바르게 추출한다.
85
+ */
86
+ function extractSequences(content) {
87
+ if (!content.startsWith('---'))
88
+ return {};
89
+ const end = content.indexOf('\n---', 3);
90
+ if (end < 0)
91
+ return {};
92
+ const block = content.slice(3, end);
93
+ const result = {};
94
+ const lines = block.split('\n');
95
+ let currentKey = null;
96
+ for (const line of lines) {
97
+ const kv = line.match(/^([a-zA-Z_][\w-]*)\s*:\s*$/);
98
+ if (kv) {
99
+ currentKey = kv[1];
100
+ result[currentKey] = [];
101
+ continue;
102
+ }
103
+ const item = line.match(/^[ \t]*-\s+(.+)$/);
104
+ if (item && currentKey) {
105
+ result[currentKey].push(item[1].trim());
106
+ continue;
107
+ }
108
+ if (line.match(/^[a-zA-Z_][\w-]*\s*:/)) {
109
+ currentKey = null;
110
+ }
111
+ }
112
+ return result;
113
+ }
114
+ // ─── Validator ───────────────────────────────────────────────────────
115
+ /**
116
+ * 루프 정의 마크다운 문자열을 파싱하고 검증한다.
117
+ *
118
+ * @param content - 루프 정의 파일 전체 내용 (frontmatter 포함 마크다운)
119
+ * @returns LoopValidationResult
120
+ */
121
+ export function validateLoopDefinition(content) {
122
+ const errors = [];
123
+ const fm = parseFrontmatter(content);
124
+ const seqs = extractSequences(content);
125
+ // pipeline: 블록 시퀀스 우선, 인라인 배열 폴백
126
+ const pipeline = seqs['pipeline'] ??
127
+ (Array.isArray(fm['pipeline']) ? fm['pipeline'] : []);
128
+ const name = typeof fm['name'] === 'string' ? fm['name'].trim() : '';
129
+ const trigger = typeof fm['trigger'] === 'string' ? fm['trigger'].trim() : '';
130
+ const schedule = typeof fm['schedule'] === 'string' ? fm['schedule'].trim() : undefined;
131
+ const goal = typeof fm['goal'] === 'string' ? fm['goal'].trim() : '';
132
+ const discover = typeof fm['discover'] === 'string' ? fm['discover'].trim() : '';
133
+ const verify = typeof fm['verify'] === 'string' ? fm['verify'].trim() : '';
134
+ const test_command = typeof fm['test_command'] === 'string' ? fm['test_command'].trim() : undefined;
135
+ const maxIterRaw = fm['max_iterations'];
136
+ const isolation = typeof fm['isolation'] === 'string' ? fm['isolation'].trim() : 'none';
137
+ const status = typeof fm['status'] === 'string' ? fm['status'].trim() : '';
138
+ // 필수 필드 존재 검사
139
+ if (!name)
140
+ errors.push('name: 필수 필드가 없거나 비어 있습니다');
141
+ if (!trigger)
142
+ errors.push('trigger: 필수 필드가 없거나 비어 있습니다');
143
+ if (!goal)
144
+ errors.push('goal: 필수 필드가 없거나 비어 있습니다');
145
+ if (!discover)
146
+ errors.push('discover: 필수 필드가 없거나 비어 있습니다');
147
+ if (pipeline.length === 0)
148
+ errors.push('pipeline: 필수 필드가 없거나 비어 있습니다');
149
+ if (!verify)
150
+ errors.push('verify: 필수 필드가 없거나 비어 있습니다');
151
+ if (!status)
152
+ errors.push('status: 필수 필드가 없거나 비어 있습니다');
153
+ if (maxIterRaw === undefined || maxIterRaw === null || maxIterRaw === '') {
154
+ errors.push('max_iterations: 필수 필드가 없거나 비어 있습니다');
155
+ }
156
+ // enum 검사
157
+ if (trigger && !TRIGGER_VALUES.has(trigger)) {
158
+ errors.push(`trigger: 유효하지 않은 값 "${trigger}" — scheduled|manual|on-event 중 하나여야 합니다`);
159
+ }
160
+ if (verify && !VERIFY_VALUES.has(verify)) {
161
+ errors.push(`verify: 유효하지 않은 값 "${verify}" — ledger|tests|none 중 하나여야 합니다`);
162
+ }
163
+ if (isolation && !ISOLATION_VALUES.has(isolation)) {
164
+ errors.push(`isolation: 유효하지 않은 값 "${isolation}" — worktree|none 중 하나여야 합니다`);
165
+ }
166
+ if (status && !STATUS_VALUES.has(status)) {
167
+ errors.push(`status: 유효하지 않은 값 "${status}" — active|paused 중 하나여야 합니다`);
168
+ }
169
+ // 조건부 필드: schedule iff trigger === 'scheduled'
170
+ if (trigger === 'scheduled') {
171
+ if (!schedule) {
172
+ errors.push('schedule: trigger=scheduled 일 때 필수 필드입니다');
173
+ }
174
+ else if (!CRON_PATTERN.test(schedule)) {
175
+ errors.push(`schedule: 5-필드 cron 형식이 아닙니다 (예: "0 2 * * *") — 받은 값: "${schedule}"`);
176
+ }
177
+ }
178
+ else if (schedule !== undefined) {
179
+ errors.push('schedule: trigger=scheduled 일 때만 허용됩니다');
180
+ }
181
+ // 조건부 필드: test_command iff verify === 'tests'
182
+ if (verify === 'tests') {
183
+ if (!test_command) {
184
+ errors.push('test_command: verify=tests 일 때 필수 필드입니다');
185
+ }
186
+ }
187
+ else if (test_command !== undefined) {
188
+ errors.push('test_command: verify=tests 일 때만 허용됩니다');
189
+ }
190
+ // max_iterations 범위 검사
191
+ const maxIter = Number(maxIterRaw);
192
+ if (maxIterRaw !== undefined && maxIterRaw !== null && maxIterRaw !== '') {
193
+ if (!Number.isInteger(maxIter)) {
194
+ errors.push('max_iterations: 정수여야 합니다');
195
+ }
196
+ else if (maxIter < MAX_ITERATIONS_MIN || maxIter > MAX_ITERATIONS_MAX) {
197
+ errors.push(`max_iterations: ${MAX_ITERATIONS_MIN}–${MAX_ITERATIONS_MAX} 범위여야 합니다 — 받은 값: ${maxIter}`);
198
+ }
199
+ }
200
+ // pipeline 항목 검사
201
+ for (const entry of pipeline) {
202
+ if (!entry.startsWith('vibe.')) {
203
+ errors.push(`pipeline: 각 항목은 "vibe."으로 시작해야 합니다 — 받은 값: "${entry}"`);
204
+ }
205
+ }
206
+ if (errors.length > 0) {
207
+ return { valid: false, errors, definition: null };
208
+ }
209
+ const definition = {
210
+ name,
211
+ trigger: trigger,
212
+ ...(schedule !== undefined ? { schedule } : {}),
213
+ goal,
214
+ discover,
215
+ pipeline,
216
+ verify: verify,
217
+ ...(test_command !== undefined ? { test_command } : {}),
218
+ max_iterations: maxIter,
219
+ isolation: isolation,
220
+ status: status,
221
+ };
222
+ return { valid: true, errors: [], definition };
223
+ }
224
+ //# sourceMappingURL=validateLoopDefinition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateLoopDefinition.js","sourceRoot":"","sources":["../../../src/tools/loop/validateLoopDefinition.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * validateLoopDefinition 테스트
3
+ *
4
+ * 커버리지:
5
+ * - 유효한 전체 정의 (scheduled + ledger, manual + tests, on-event + none)
6
+ * - 각 enum 위반
7
+ * - schedule iff scheduled 조건
8
+ * - test_command iff tests 조건
9
+ * - max_iterations 범위 (경계값 포함)
10
+ * - pipeline non-vibe 항목
11
+ * - 필수 필드 누락
12
+ */
13
+ export {};
14
+ //# sourceMappingURL=validateLoopDefinition.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateLoopDefinition.test.d.ts","sourceRoot":"","sources":["../../../src/tools/loop/validateLoopDefinition.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
@@ -0,0 +1,229 @@
1
+ /**
2
+ * validateLoopDefinition 테스트
3
+ *
4
+ * 커버리지:
5
+ * - 유효한 전체 정의 (scheduled + ledger, manual + tests, on-event + none)
6
+ * - 각 enum 위반
7
+ * - schedule iff scheduled 조건
8
+ * - test_command iff tests 조건
9
+ * - max_iterations 범위 (경계값 포함)
10
+ * - pipeline non-vibe 항목
11
+ * - 필수 필드 누락
12
+ */
13
+ import { describe, it, expect } from 'vitest';
14
+ import { validateLoopDefinition } from './validateLoopDefinition.js';
15
+ // ─── Fixture helpers ──────────────────────────────────────────────────
16
+ function makeContent(overrides = {}) {
17
+ const defaults = {
18
+ name: 'nightly-triage',
19
+ trigger: 'scheduled',
20
+ schedule: '0 2 * * *',
21
+ goal: '회귀 항목 자동 처리',
22
+ discover: '오픈 회귀 스캔',
23
+ verify: 'ledger',
24
+ max_iterations: 10,
25
+ isolation: 'none',
26
+ status: 'active',
27
+ };
28
+ const merged = { ...defaults, ...overrides };
29
+ const pipeline = merged['pipeline'] ?? ['vibe.spec', 'vibe.run', 'vibe.verify'];
30
+ delete merged['pipeline'];
31
+ let fm = '---\n';
32
+ for (const [k, v] of Object.entries(merged)) {
33
+ if (v === undefined)
34
+ continue;
35
+ fm += `${k}: ${v}\n`;
36
+ }
37
+ // pipeline 블록 시퀀스
38
+ if (Array.isArray(pipeline) && pipeline.length > 0) {
39
+ fm += 'pipeline:\n';
40
+ for (const item of pipeline) {
41
+ fm += ` - ${item}\n`;
42
+ }
43
+ }
44
+ fm += '---\n\n# 루프 본문\n';
45
+ return fm;
46
+ }
47
+ // ─── 유효한 정의 ──────────────────────────────────────────────────────
48
+ describe('validateLoopDefinition: 유효한 정의', () => {
49
+ it('scheduled + ledger 전체 정의 → valid=true, errors=[]', () => {
50
+ const result = validateLoopDefinition(makeContent());
51
+ expect(result.valid).toBe(true);
52
+ expect(result.errors).toHaveLength(0);
53
+ expect(result.definition).not.toBeNull();
54
+ expect(result.definition?.name).toBe('nightly-triage');
55
+ expect(result.definition?.trigger).toBe('scheduled');
56
+ expect(result.definition?.schedule).toBe('0 2 * * *');
57
+ expect(result.definition?.pipeline).toEqual(['vibe.spec', 'vibe.run', 'vibe.verify']);
58
+ expect(result.definition?.max_iterations).toBe(10);
59
+ });
60
+ it('manual + tests + test_command → valid=true', () => {
61
+ const content = makeContent({
62
+ trigger: 'manual',
63
+ schedule: undefined,
64
+ verify: 'tests',
65
+ test_command: 'npx vitest run',
66
+ });
67
+ const result = validateLoopDefinition(content);
68
+ expect(result.valid).toBe(true);
69
+ expect(result.definition?.trigger).toBe('manual');
70
+ expect(result.definition?.test_command).toBe('npx vitest run');
71
+ });
72
+ it('on-event + none + isolation=worktree → valid=true', () => {
73
+ const content = makeContent({
74
+ trigger: 'on-event',
75
+ schedule: undefined,
76
+ verify: 'none',
77
+ isolation: 'worktree',
78
+ });
79
+ const result = validateLoopDefinition(content);
80
+ expect(result.valid).toBe(true);
81
+ expect(result.definition?.isolation).toBe('worktree');
82
+ });
83
+ it('max_iterations 경계값 1 → valid=true', () => {
84
+ const result = validateLoopDefinition(makeContent({ max_iterations: 1 }));
85
+ expect(result.valid).toBe(true);
86
+ });
87
+ it('max_iterations 경계값 50 → valid=true', () => {
88
+ const result = validateLoopDefinition(makeContent({ max_iterations: 50 }));
89
+ expect(result.valid).toBe(true);
90
+ });
91
+ });
92
+ // ─── enum 위반 ────────────────────────────────────────────────────────
93
+ describe('validateLoopDefinition: enum 위반', () => {
94
+ it('trigger 유효하지 않은 값 → error 포함', () => {
95
+ const result = validateLoopDefinition(makeContent({ trigger: 'daily', schedule: undefined }));
96
+ expect(result.valid).toBe(false);
97
+ expect(result.errors.some((e) => e.includes('trigger'))).toBe(true);
98
+ });
99
+ it('verify 유효하지 않은 값 → error 포함', () => {
100
+ const result = validateLoopDefinition(makeContent({ verify: 'manual-check' }));
101
+ expect(result.valid).toBe(false);
102
+ expect(result.errors.some((e) => e.includes('verify'))).toBe(true);
103
+ });
104
+ it('isolation 유효하지 않은 값 → error 포함', () => {
105
+ const result = validateLoopDefinition(makeContent({ isolation: 'docker' }));
106
+ expect(result.valid).toBe(false);
107
+ expect(result.errors.some((e) => e.includes('isolation'))).toBe(true);
108
+ });
109
+ it('status 유효하지 않은 값 → error 포함', () => {
110
+ const result = validateLoopDefinition(makeContent({ status: 'running' }));
111
+ expect(result.valid).toBe(false);
112
+ expect(result.errors.some((e) => e.includes('status'))).toBe(true);
113
+ });
114
+ });
115
+ // ─── schedule iff scheduled ───────────────────────────────────────────
116
+ describe('validateLoopDefinition: schedule 조건', () => {
117
+ it('trigger=scheduled 인데 schedule 없으면 → error', () => {
118
+ const result = validateLoopDefinition(makeContent({ trigger: 'scheduled', schedule: undefined }));
119
+ expect(result.valid).toBe(false);
120
+ expect(result.errors.some((e) => e.includes('schedule'))).toBe(true);
121
+ });
122
+ it('trigger=scheduled + 잘못된 cron 형식 → error', () => {
123
+ const result = validateLoopDefinition(makeContent({ schedule: 'every day' }));
124
+ expect(result.valid).toBe(false);
125
+ expect(result.errors.some((e) => e.includes('cron'))).toBe(true);
126
+ });
127
+ it('trigger=manual 인데 schedule 있으면 → error', () => {
128
+ const content = makeContent({ trigger: 'manual', schedule: '0 2 * * *' });
129
+ const result = validateLoopDefinition(content);
130
+ expect(result.valid).toBe(false);
131
+ expect(result.errors.some((e) => e.includes('schedule'))).toBe(true);
132
+ });
133
+ it('trigger=on-event 인데 schedule 있으면 → error', () => {
134
+ const content = makeContent({ trigger: 'on-event', schedule: '0 2 * * *' });
135
+ const result = validateLoopDefinition(content);
136
+ expect(result.valid).toBe(false);
137
+ expect(result.errors.some((e) => e.includes('schedule'))).toBe(true);
138
+ });
139
+ });
140
+ // ─── test_command iff tests ───────────────────────────────────────────
141
+ describe('validateLoopDefinition: test_command 조건', () => {
142
+ it('verify=tests 인데 test_command 없으면 → error', () => {
143
+ const content = makeContent({
144
+ trigger: 'manual',
145
+ schedule: undefined,
146
+ verify: 'tests',
147
+ });
148
+ const result = validateLoopDefinition(content);
149
+ expect(result.valid).toBe(false);
150
+ expect(result.errors.some((e) => e.includes('test_command'))).toBe(true);
151
+ });
152
+ it('verify=ledger 인데 test_command 있으면 → error', () => {
153
+ const content = makeContent({ test_command: 'npm test' });
154
+ const result = validateLoopDefinition(content);
155
+ expect(result.valid).toBe(false);
156
+ expect(result.errors.some((e) => e.includes('test_command'))).toBe(true);
157
+ });
158
+ it('verify=none 인데 test_command 있으면 → error', () => {
159
+ const content = makeContent({
160
+ trigger: 'manual',
161
+ schedule: undefined,
162
+ verify: 'none',
163
+ test_command: 'npm test',
164
+ });
165
+ const result = validateLoopDefinition(content);
166
+ expect(result.valid).toBe(false);
167
+ expect(result.errors.some((e) => e.includes('test_command'))).toBe(true);
168
+ });
169
+ });
170
+ // ─── max_iterations 범위 ──────────────────────────────────────────────
171
+ describe('validateLoopDefinition: max_iterations 범위', () => {
172
+ it('max_iterations=0 → error', () => {
173
+ const result = validateLoopDefinition(makeContent({ max_iterations: 0 }));
174
+ expect(result.valid).toBe(false);
175
+ expect(result.errors.some((e) => e.includes('max_iterations'))).toBe(true);
176
+ });
177
+ it('max_iterations=51 → error', () => {
178
+ const result = validateLoopDefinition(makeContent({ max_iterations: 51 }));
179
+ expect(result.valid).toBe(false);
180
+ expect(result.errors.some((e) => e.includes('max_iterations'))).toBe(true);
181
+ });
182
+ it('max_iterations 누락 → error', () => {
183
+ const content = makeContent({ max_iterations: undefined });
184
+ const result = validateLoopDefinition(content);
185
+ expect(result.valid).toBe(false);
186
+ expect(result.errors.some((e) => e.includes('max_iterations'))).toBe(true);
187
+ });
188
+ });
189
+ // ─── pipeline non-vibe 항목 ───────────────────────────────────────────
190
+ describe('validateLoopDefinition: pipeline 항목 검사', () => {
191
+ it('pipeline에 non-vibe 항목 포함 → error', () => {
192
+ const content = makeContent({ pipeline: ['vibe.spec', 'npm-test', 'vibe.verify'] });
193
+ const result = validateLoopDefinition(content);
194
+ expect(result.valid).toBe(false);
195
+ expect(result.errors.some((e) => e.includes('npm-test'))).toBe(true);
196
+ });
197
+ it('pipeline 비어 있음 → error', () => {
198
+ const content = makeContent({ pipeline: [] });
199
+ const result = validateLoopDefinition(content);
200
+ expect(result.valid).toBe(false);
201
+ expect(result.errors.some((e) => e.includes('pipeline'))).toBe(true);
202
+ });
203
+ it('pipeline 모두 vibe. 접두사 → valid=true', () => {
204
+ const content = makeContent({ pipeline: ['vibe.analyze', 'vibe.run', 'vibe.verify'] });
205
+ const result = validateLoopDefinition(content);
206
+ expect(result.valid).toBe(true);
207
+ });
208
+ });
209
+ // ─── 필수 필드 누락 ───────────────────────────────────────────────────
210
+ describe('validateLoopDefinition: 필수 필드 누락', () => {
211
+ it('name 누락 → error', () => {
212
+ const content = makeContent({ name: undefined });
213
+ const result = validateLoopDefinition(content);
214
+ expect(result.valid).toBe(false);
215
+ expect(result.errors.some((e) => e.includes('name'))).toBe(true);
216
+ });
217
+ it('goal 누락 → error', () => {
218
+ const content = makeContent({ goal: undefined });
219
+ const result = validateLoopDefinition(content);
220
+ expect(result.valid).toBe(false);
221
+ expect(result.errors.some((e) => e.includes('goal'))).toBe(true);
222
+ });
223
+ it('frontmatter 없는 문서 → error 다수', () => {
224
+ const result = validateLoopDefinition('# 루프 본문만 있는 파일\n\n내용\n');
225
+ expect(result.valid).toBe(false);
226
+ expect(result.errors.length).toBeGreaterThan(0);
227
+ });
228
+ });
229
+ //# sourceMappingURL=validateLoopDefinition.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateLoopDefinition.test.js","sourceRoot":"","sources":["../../../src/tools/loop/validateLoopDefinition.test.ts"],"names":[],"mappings":"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"}
@@ -37,3 +37,24 @@
37
37
  [2026-06-11T01:30:46.209Z] rm -rf /
38
38
  [2026-06-11T01:30:46.279Z] ls -la
39
39
  [2026-06-11T01:30:46.366Z] rm -rf src/infra/lib/evolution/
40
+ [2026-06-11T05:39:24.632Z] rm -rf /
41
+ [2026-06-11T05:39:24.707Z] ls -la
42
+ [2026-06-11T05:39:24.788Z] rm -rf src/infra/lib/evolution/
43
+ [2026-06-11T05:42:56.571Z] rm -rf /
44
+ [2026-06-11T05:42:56.647Z] ls -la
45
+ [2026-06-11T05:42:56.719Z] rm -rf src/infra/lib/evolution/
46
+ [2026-06-11T05:43:10.797Z] rm -rf /
47
+ [2026-06-11T05:43:10.863Z] ls -la
48
+ [2026-06-11T05:43:10.937Z] rm -rf src/infra/lib/evolution/
49
+ [2026-06-11T05:43:26.675Z] rm -rf /
50
+ [2026-06-11T05:43:26.735Z] ls -la
51
+ [2026-06-11T05:43:26.812Z] rm -rf src/infra/lib/evolution/
52
+ [2026-06-11T06:34:26.211Z] rm -rf /
53
+ [2026-06-11T06:34:26.309Z] ls -la
54
+ [2026-06-11T06:34:26.395Z] rm -rf src/infra/lib/evolution/
55
+ [2026-06-11T06:34:42.990Z] rm -rf /
56
+ [2026-06-11T06:34:43.071Z] ls -la
57
+ [2026-06-11T06:34:43.148Z] rm -rf src/infra/lib/evolution/
58
+ [2026-06-11T06:36:18.231Z] rm -rf /
59
+ [2026-06-11T06:36:18.309Z] ls -la
60
+ [2026-06-11T06:36:18.387Z] rm -rf src/infra/lib/evolution/