@su-record/vibe 2.5.21 → 2.6.1
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 +154 -2
- package/README.md +132 -2
- package/commands/vibe.run.md +69 -44
- package/commands/vibe.spec.md +83 -0
- package/commands/vibe.trace.md +161 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +5 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/lib/IterationTracker.d.ts +3 -1
- package/dist/lib/IterationTracker.d.ts.map +1 -1
- package/dist/lib/IterationTracker.js +2 -1
- package/dist/lib/IterationTracker.js.map +1 -1
- package/dist/lib/constants.d.ts +14 -0
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +26 -0
- package/dist/lib/constants.js.map +1 -1
- package/dist/orchestrator/BackgroundManager.d.ts +109 -0
- package/dist/orchestrator/BackgroundManager.d.ts.map +1 -0
- package/dist/orchestrator/BackgroundManager.js +456 -0
- package/dist/orchestrator/BackgroundManager.js.map +1 -0
- package/dist/orchestrator/BackgroundManager.test.d.ts +6 -0
- package/dist/orchestrator/BackgroundManager.test.d.ts.map +1 -0
- package/dist/orchestrator/BackgroundManager.test.js +162 -0
- package/dist/orchestrator/BackgroundManager.test.js.map +1 -0
- package/dist/orchestrator/PhasePipeline.d.ts +106 -0
- package/dist/orchestrator/PhasePipeline.d.ts.map +1 -0
- package/dist/orchestrator/PhasePipeline.js +279 -0
- package/dist/orchestrator/PhasePipeline.js.map +1 -0
- package/dist/orchestrator/backgroundAgent.d.ts +2 -0
- package/dist/orchestrator/backgroundAgent.d.ts.map +1 -1
- package/dist/orchestrator/backgroundAgent.js +2 -0
- package/dist/orchestrator/backgroundAgent.js.map +1 -1
- package/dist/orchestrator/index.d.ts +4 -1
- package/dist/orchestrator/index.d.ts.map +1 -1
- package/dist/orchestrator/index.js +5 -1
- package/dist/orchestrator/index.js.map +1 -1
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +14 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/interaction/askUser.d.ts +115 -0
- package/dist/tools/interaction/askUser.d.ts.map +1 -0
- package/dist/tools/interaction/askUser.js +504 -0
- package/dist/tools/interaction/askUser.js.map +1 -0
- package/dist/tools/interaction/index.d.ts +8 -0
- package/dist/tools/interaction/index.d.ts.map +1 -0
- package/dist/tools/interaction/index.js +17 -0
- package/dist/tools/interaction/index.js.map +1 -0
- package/dist/tools/spec/index.d.ts +14 -0
- package/dist/tools/spec/index.d.ts.map +1 -0
- package/dist/tools/spec/index.js +15 -0
- package/dist/tools/spec/index.js.map +1 -0
- package/dist/tools/spec/prdParser.d.ts +43 -0
- package/dist/tools/spec/prdParser.d.ts.map +1 -0
- package/dist/tools/spec/prdParser.js +291 -0
- package/dist/tools/spec/prdParser.js.map +1 -0
- package/dist/tools/spec/prdParser.test.d.ts +6 -0
- package/dist/tools/spec/prdParser.test.d.ts.map +1 -0
- package/dist/tools/spec/prdParser.test.js +332 -0
- package/dist/tools/spec/prdParser.test.js.map +1 -0
- package/dist/tools/spec/requirementId.d.ts +65 -0
- package/dist/tools/spec/requirementId.d.ts.map +1 -0
- package/dist/tools/spec/requirementId.js +161 -0
- package/dist/tools/spec/requirementId.js.map +1 -0
- package/dist/tools/spec/specGenerator.d.ts +39 -0
- package/dist/tools/spec/specGenerator.d.ts.map +1 -0
- package/dist/tools/spec/specGenerator.js +426 -0
- package/dist/tools/spec/specGenerator.js.map +1 -0
- package/dist/tools/spec/specVersioning.d.ts +77 -0
- package/dist/tools/spec/specVersioning.d.ts.map +1 -0
- package/dist/tools/spec/specVersioning.js +237 -0
- package/dist/tools/spec/specVersioning.js.map +1 -0
- package/dist/tools/spec/traceabilityMatrix.d.ts +55 -0
- package/dist/tools/spec/traceabilityMatrix.d.ts.map +1 -0
- package/dist/tools/spec/traceabilityMatrix.js +396 -0
- package/dist/tools/spec/traceabilityMatrix.js.map +1 -0
- package/dist/tools/spec/traceabilityMatrix.test.d.ts +6 -0
- package/dist/tools/spec/traceabilityMatrix.test.d.ts.map +1 -0
- package/dist/tools/spec/traceabilityMatrix.test.js +340 -0
- package/dist/tools/spec/traceabilityMatrix.test.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SPEC Generator - PRD에서 PTCF 구조 SPEC 자동 생성
|
|
3
|
+
* v2.6.0: PRD-to-SPEC 자동화
|
|
4
|
+
*
|
|
5
|
+
* PTCF: Persona, Task, Context, Format (Gemini 프롬프트 최적화)
|
|
6
|
+
*/
|
|
7
|
+
// ============================================
|
|
8
|
+
// Main Generator
|
|
9
|
+
// ============================================
|
|
10
|
+
/**
|
|
11
|
+
* PRD에서 SPEC 생성 (메인 함수)
|
|
12
|
+
*/
|
|
13
|
+
export function generateSpec(prd, featureName, options = {}) {
|
|
14
|
+
const { techStack = [], phaseThreshold = 5, relatedCodePaths = [], designReference, additionalConstraints = [], additionalOutputs = [], } = options;
|
|
15
|
+
// Phase 분리 결정
|
|
16
|
+
const shouldSplit = prd.requirements.length > phaseThreshold * 3;
|
|
17
|
+
const phases = groupRequirementsIntoPhases(prd.requirements, phaseThreshold);
|
|
18
|
+
if (shouldSplit) {
|
|
19
|
+
return generateSplitSpec(prd, featureName, phases, options);
|
|
20
|
+
}
|
|
21
|
+
return generateSingleSpec(prd, featureName, phases, options);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 단일 SPEC 파일 생성
|
|
25
|
+
*/
|
|
26
|
+
function generateSingleSpec(prd, featureName, phases, options) {
|
|
27
|
+
const content = buildSpecContent(prd, featureName, phases, options);
|
|
28
|
+
return {
|
|
29
|
+
content,
|
|
30
|
+
featureName,
|
|
31
|
+
phaseCount: phases.length,
|
|
32
|
+
requirementCount: prd.requirements.length,
|
|
33
|
+
isSplit: false,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 분할 SPEC 파일 생성
|
|
38
|
+
*/
|
|
39
|
+
function generateSplitSpec(prd, featureName, phases, options) {
|
|
40
|
+
const splitFiles = [];
|
|
41
|
+
// 마스터 SPEC
|
|
42
|
+
const masterContent = buildMasterSpecContent(prd, featureName, phases, options);
|
|
43
|
+
splitFiles.push({
|
|
44
|
+
path: `_index.md`,
|
|
45
|
+
content: masterContent,
|
|
46
|
+
});
|
|
47
|
+
// Phase별 SPEC
|
|
48
|
+
for (let i = 0; i < phases.length; i++) {
|
|
49
|
+
const phase = phases[i];
|
|
50
|
+
const phaseContent = buildPhaseSpecContent(prd, featureName, phase, i + 1, phases.length, options);
|
|
51
|
+
const phaseName = normalizeFileName(phase.name);
|
|
52
|
+
splitFiles.push({
|
|
53
|
+
path: `phase-${i + 1}-${phaseName}.md`,
|
|
54
|
+
content: phaseContent,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
content: masterContent,
|
|
59
|
+
featureName,
|
|
60
|
+
phaseCount: phases.length,
|
|
61
|
+
requirementCount: prd.requirements.length,
|
|
62
|
+
isSplit: true,
|
|
63
|
+
splitFiles,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
// ============================================
|
|
67
|
+
// Content Builders
|
|
68
|
+
// ============================================
|
|
69
|
+
/**
|
|
70
|
+
* 단일 SPEC 콘텐츠 빌드
|
|
71
|
+
*/
|
|
72
|
+
function buildSpecContent(prd, featureName, phases, options) {
|
|
73
|
+
const { techStack = [], relatedCodePaths = [], designReference, additionalConstraints = [], additionalOutputs = [] } = options;
|
|
74
|
+
const now = new Date().toISOString();
|
|
75
|
+
let content = `---
|
|
76
|
+
status: pending
|
|
77
|
+
currentPhase: 0
|
|
78
|
+
totalPhases: ${phases.length}
|
|
79
|
+
createdAt: ${now}
|
|
80
|
+
lastUpdated: ${now}
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
# SPEC: ${featureName}
|
|
84
|
+
|
|
85
|
+
## Persona
|
|
86
|
+
<role>
|
|
87
|
+
Senior developer implementing ${featureName}.
|
|
88
|
+
- Follow existing code patterns and conventions
|
|
89
|
+
- Write testable, maintainable code
|
|
90
|
+
- Consider security and performance implications
|
|
91
|
+
</role>
|
|
92
|
+
|
|
93
|
+
## Context
|
|
94
|
+
<context>
|
|
95
|
+
### Background
|
|
96
|
+
${prd.description || `Implementation of ${prd.title}`}
|
|
97
|
+
|
|
98
|
+
### Tech Stack
|
|
99
|
+
${techStack.length > 0 ? techStack.map(t => `- ${t}`).join('\n') : '- (To be determined based on project)'}
|
|
100
|
+
|
|
101
|
+
### Related Code
|
|
102
|
+
${relatedCodePaths.length > 0 ? relatedCodePaths.map(p => `- \`${p}\``).join('\n') : '- (Analyze existing codebase for patterns)'}
|
|
103
|
+
|
|
104
|
+
### Design Reference
|
|
105
|
+
${designReference || '- (None specified)'}
|
|
106
|
+
|
|
107
|
+
### Requirements Source
|
|
108
|
+
- Parsed from PRD: ${prd.requirements.length} requirements
|
|
109
|
+
- Format: ${prd.metadata.format}
|
|
110
|
+
</context>
|
|
111
|
+
|
|
112
|
+
## Task
|
|
113
|
+
<task>
|
|
114
|
+
`;
|
|
115
|
+
// Phase별 태스크 추가
|
|
116
|
+
for (let i = 0; i < phases.length; i++) {
|
|
117
|
+
const phase = phases[i];
|
|
118
|
+
content += `### Phase ${i + 1}: ${phase.name}\n`;
|
|
119
|
+
content += `**Goal**: ${getPhaseGoal(phase)}\n\n`;
|
|
120
|
+
for (const task of phase.tasks) {
|
|
121
|
+
content += `1. [ ] ${task}\n`;
|
|
122
|
+
}
|
|
123
|
+
content += '\n';
|
|
124
|
+
}
|
|
125
|
+
content += `</task>
|
|
126
|
+
|
|
127
|
+
## Constraints
|
|
128
|
+
<constraints>
|
|
129
|
+
### Must Follow
|
|
130
|
+
- Follow existing code patterns (ES Module, async/await)
|
|
131
|
+
- Maintain backward compatibility
|
|
132
|
+
- TypeScript strict mode compliance
|
|
133
|
+
- No \`any\` type → Use \`unknown\` + type guards
|
|
134
|
+
- Functions ≤30 lines recommended, ≤50 lines max
|
|
135
|
+
- Nesting ≤3 levels
|
|
136
|
+
|
|
137
|
+
### Error Handling
|
|
138
|
+
- Proper try-catch with meaningful error messages
|
|
139
|
+
- Loading state handling for async operations
|
|
140
|
+
- User-friendly error messages
|
|
141
|
+
|
|
142
|
+
### Security
|
|
143
|
+
- Input validation for all user inputs
|
|
144
|
+
- Authentication/authorization checks where needed
|
|
145
|
+
- No sensitive data in logs
|
|
146
|
+
${additionalConstraints.map(c => `\n- ${c}`).join('')}
|
|
147
|
+
</constraints>
|
|
148
|
+
|
|
149
|
+
## Output Format
|
|
150
|
+
<output_format>
|
|
151
|
+
### Files to Create
|
|
152
|
+
${generateFileList(phases, 'create')}
|
|
153
|
+
|
|
154
|
+
### Files to Modify
|
|
155
|
+
${generateFileList(phases, 'modify')}
|
|
156
|
+
|
|
157
|
+
### Verification Commands
|
|
158
|
+
- \`npm run build\` (build success)
|
|
159
|
+
- \`npm test\` (tests pass)
|
|
160
|
+
- \`tsc --noEmit\` (type check)
|
|
161
|
+
${additionalOutputs.map(o => `- ${o}`).join('\n')}
|
|
162
|
+
</output_format>
|
|
163
|
+
|
|
164
|
+
## Acceptance Criteria
|
|
165
|
+
<acceptance>
|
|
166
|
+
`;
|
|
167
|
+
// 요구사항별 AC 추가
|
|
168
|
+
for (const req of prd.requirements) {
|
|
169
|
+
content += `### ${req.id}: ${truncateText(req.description, 60)}\n`;
|
|
170
|
+
if (req.acceptanceCriteria.length > 0) {
|
|
171
|
+
for (const ac of req.acceptanceCriteria) {
|
|
172
|
+
content += `- [ ] ${ac}\n`;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
content += `- [ ] ${req.description} - implemented and verified\n`;
|
|
177
|
+
}
|
|
178
|
+
content += '\n';
|
|
179
|
+
}
|
|
180
|
+
content += `### Build & Test
|
|
181
|
+
- [ ] \`npm run build\` succeeds
|
|
182
|
+
- [ ] All tests pass
|
|
183
|
+
- [ ] No TypeScript errors
|
|
184
|
+
</acceptance>
|
|
185
|
+
`;
|
|
186
|
+
return content;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* 마스터 SPEC 콘텐츠 빌드 (분할용)
|
|
190
|
+
*/
|
|
191
|
+
function buildMasterSpecContent(prd, featureName, phases, options) {
|
|
192
|
+
const now = new Date().toISOString();
|
|
193
|
+
let content = `---
|
|
194
|
+
status: pending
|
|
195
|
+
currentPhase: 0
|
|
196
|
+
totalPhases: ${phases.length}
|
|
197
|
+
createdAt: ${now}
|
|
198
|
+
lastUpdated: ${now}
|
|
199
|
+
isMaster: true
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
# SPEC: ${featureName} (Master)
|
|
203
|
+
|
|
204
|
+
## Overview
|
|
205
|
+
- **Feature**: ${prd.title}
|
|
206
|
+
- **Total Phases**: ${phases.length}
|
|
207
|
+
- **Total Requirements**: ${prd.requirements.length}
|
|
208
|
+
- **Format**: Split SPEC (large scope)
|
|
209
|
+
|
|
210
|
+
## Sub-SPECs
|
|
211
|
+
|
|
212
|
+
| Order | SPEC File | Description | Status |
|
|
213
|
+
|-------|-----------|-------------|--------|
|
|
214
|
+
`;
|
|
215
|
+
for (let i = 0; i < phases.length; i++) {
|
|
216
|
+
const phase = phases[i];
|
|
217
|
+
const fileName = `phase-${i + 1}-${normalizeFileName(phase.name)}.md`;
|
|
218
|
+
content += `| ${i + 1} | ${fileName} | ${phase.name} | ⬜ |\n`;
|
|
219
|
+
}
|
|
220
|
+
content += `
|
|
221
|
+
## Shared Context
|
|
222
|
+
|
|
223
|
+
### Tech Stack
|
|
224
|
+
${options.techStack?.map(t => `- ${t}`).join('\n') || '- (See project configuration)'}
|
|
225
|
+
|
|
226
|
+
### Constraints (Apply to All Phases)
|
|
227
|
+
- Follow existing code patterns
|
|
228
|
+
- TypeScript strict mode
|
|
229
|
+
- No \`any\` type
|
|
230
|
+
- Functions ≤50 lines max
|
|
231
|
+
${options.additionalConstraints?.map(c => `- ${c}`).join('\n') || ''}
|
|
232
|
+
|
|
233
|
+
## Execution Order
|
|
234
|
+
\`\`\`
|
|
235
|
+
${phases.map((p, i) => `Phase ${i + 1}: ${p.name}`).join(' → ')}
|
|
236
|
+
\`\`\`
|
|
237
|
+
|
|
238
|
+
## Dependencies
|
|
239
|
+
${generateDependencyList(phases)}
|
|
240
|
+
`;
|
|
241
|
+
return content;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Phase별 SPEC 콘텐츠 빌드
|
|
245
|
+
*/
|
|
246
|
+
function buildPhaseSpecContent(prd, featureName, phase, phaseNumber, totalPhases, options) {
|
|
247
|
+
const now = new Date().toISOString();
|
|
248
|
+
let content = `---
|
|
249
|
+
status: pending
|
|
250
|
+
phase: ${phaseNumber}
|
|
251
|
+
totalPhases: ${totalPhases}
|
|
252
|
+
masterSpec: _index.md
|
|
253
|
+
createdAt: ${now}
|
|
254
|
+
lastUpdated: ${now}
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
# SPEC: ${featureName} - Phase ${phaseNumber}: ${phase.name}
|
|
258
|
+
|
|
259
|
+
## Persona
|
|
260
|
+
<role>
|
|
261
|
+
Developer implementing Phase ${phaseNumber} of ${featureName}.
|
|
262
|
+
- Focus on ${phase.name}
|
|
263
|
+
- Follow project conventions
|
|
264
|
+
- Write testable code
|
|
265
|
+
</role>
|
|
266
|
+
|
|
267
|
+
## Context
|
|
268
|
+
<context>
|
|
269
|
+
### Phase Goal
|
|
270
|
+
${getPhaseGoal(phase)}
|
|
271
|
+
|
|
272
|
+
### Requirements (${phase.requirements.length})
|
|
273
|
+
${phase.requirements.map(r => `- ${r.id}: ${truncateText(r.description, 50)}`).join('\n')}
|
|
274
|
+
|
|
275
|
+
### Dependencies
|
|
276
|
+
${phaseNumber > 1 ? `- Requires Phase ${phaseNumber - 1} completion` : '- No dependencies (first phase)'}
|
|
277
|
+
</context>
|
|
278
|
+
|
|
279
|
+
## Task
|
|
280
|
+
<task>
|
|
281
|
+
`;
|
|
282
|
+
for (const task of phase.tasks) {
|
|
283
|
+
content += `1. [ ] ${task}\n`;
|
|
284
|
+
}
|
|
285
|
+
content += `</task>
|
|
286
|
+
|
|
287
|
+
## Acceptance Criteria
|
|
288
|
+
<acceptance>
|
|
289
|
+
`;
|
|
290
|
+
for (const req of phase.requirements) {
|
|
291
|
+
content += `- [ ] ${req.id}: ${truncateText(req.description, 60)}\n`;
|
|
292
|
+
}
|
|
293
|
+
content += `- [ ] Phase ${phaseNumber} build succeeds
|
|
294
|
+
- [ ] Phase ${phaseNumber} tests pass
|
|
295
|
+
</acceptance>
|
|
296
|
+
`;
|
|
297
|
+
return content;
|
|
298
|
+
}
|
|
299
|
+
// ============================================
|
|
300
|
+
// Helper Functions
|
|
301
|
+
// ============================================
|
|
302
|
+
/**
|
|
303
|
+
* 요구사항을 Phase로 그룹화
|
|
304
|
+
*/
|
|
305
|
+
function groupRequirementsIntoPhases(requirements, threshold) {
|
|
306
|
+
if (requirements.length <= threshold) {
|
|
307
|
+
return [{
|
|
308
|
+
name: 'Implementation',
|
|
309
|
+
requirements,
|
|
310
|
+
tasks: requirements.map(r => generateTaskFromRequirement(r)),
|
|
311
|
+
}];
|
|
312
|
+
}
|
|
313
|
+
// 우선순위별 그룹화
|
|
314
|
+
const high = requirements.filter(r => r.priority === 'high');
|
|
315
|
+
const medium = requirements.filter(r => r.priority === 'medium');
|
|
316
|
+
const low = requirements.filter(r => r.priority === 'low');
|
|
317
|
+
const phases = [];
|
|
318
|
+
// Phase 1: 설정/기반
|
|
319
|
+
const setupReqs = requirements.slice(0, Math.ceil(threshold / 2));
|
|
320
|
+
if (setupReqs.length > 0) {
|
|
321
|
+
phases.push({
|
|
322
|
+
name: 'Setup & Foundation',
|
|
323
|
+
requirements: setupReqs,
|
|
324
|
+
tasks: setupReqs.map(r => generateTaskFromRequirement(r)),
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
// Phase 2+: 핵심 기능 (high priority)
|
|
328
|
+
if (high.length > 0) {
|
|
329
|
+
phases.push({
|
|
330
|
+
name: 'Core Features',
|
|
331
|
+
requirements: high,
|
|
332
|
+
tasks: high.map(r => generateTaskFromRequirement(r)),
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
// Phase 3+: 중요 기능 (medium priority)
|
|
336
|
+
const remainingMedium = medium.filter(r => !setupReqs.includes(r));
|
|
337
|
+
if (remainingMedium.length > 0) {
|
|
338
|
+
phases.push({
|
|
339
|
+
name: 'Additional Features',
|
|
340
|
+
requirements: remainingMedium,
|
|
341
|
+
tasks: remainingMedium.map(r => generateTaskFromRequirement(r)),
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
// Phase 4+: 부가 기능 (low priority)
|
|
345
|
+
if (low.length > 0) {
|
|
346
|
+
phases.push({
|
|
347
|
+
name: 'Enhancements',
|
|
348
|
+
requirements: low,
|
|
349
|
+
tasks: low.map(r => generateTaskFromRequirement(r)),
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
// 마지막 Phase: 테스트 & 검증
|
|
353
|
+
phases.push({
|
|
354
|
+
name: 'Testing & Verification',
|
|
355
|
+
requirements: [],
|
|
356
|
+
tasks: [
|
|
357
|
+
'Write unit tests for all new code',
|
|
358
|
+
'Write integration tests',
|
|
359
|
+
'Update documentation',
|
|
360
|
+
'Final verification and cleanup',
|
|
361
|
+
],
|
|
362
|
+
});
|
|
363
|
+
return phases;
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* 요구사항에서 태스크 생성
|
|
367
|
+
*/
|
|
368
|
+
function generateTaskFromRequirement(req) {
|
|
369
|
+
const desc = truncateText(req.description, 80);
|
|
370
|
+
return `${req.id}: ${desc}\n - Verify: Test coverage for this requirement`;
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Phase 목표 추출
|
|
374
|
+
*/
|
|
375
|
+
function getPhaseGoal(phase) {
|
|
376
|
+
if (phase.requirements.length === 0) {
|
|
377
|
+
return phase.name;
|
|
378
|
+
}
|
|
379
|
+
const firstReq = phase.requirements[0];
|
|
380
|
+
return truncateText(firstReq.description, 100);
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* 파일 목록 생성
|
|
384
|
+
*/
|
|
385
|
+
function generateFileList(phases, type) {
|
|
386
|
+
// 실제로는 요구사항을 분석해서 추론해야 하지만, 기본 템플릿 제공
|
|
387
|
+
if (type === 'create') {
|
|
388
|
+
return `- (To be determined based on implementation)
|
|
389
|
+
- \`src/[feature]/index.ts\`
|
|
390
|
+
- \`src/[feature]/[feature].test.ts\``;
|
|
391
|
+
}
|
|
392
|
+
return `- (Analyze existing codebase)
|
|
393
|
+
- Relevant existing files`;
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* 의존성 목록 생성
|
|
397
|
+
*/
|
|
398
|
+
function generateDependencyList(phases) {
|
|
399
|
+
if (phases.length <= 1) {
|
|
400
|
+
return '- No inter-phase dependencies';
|
|
401
|
+
}
|
|
402
|
+
let deps = '';
|
|
403
|
+
for (let i = 1; i < phases.length; i++) {
|
|
404
|
+
deps += `- Phase ${i + 1} depends on Phase ${i}\n`;
|
|
405
|
+
}
|
|
406
|
+
return deps;
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* 파일명 정규화
|
|
410
|
+
*/
|
|
411
|
+
function normalizeFileName(name) {
|
|
412
|
+
return name
|
|
413
|
+
.toLowerCase()
|
|
414
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
415
|
+
.replace(/^-|-$/g, '')
|
|
416
|
+
.slice(0, 30);
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* 텍스트 자르기
|
|
420
|
+
*/
|
|
421
|
+
function truncateText(text, maxLength) {
|
|
422
|
+
if (text.length <= maxLength)
|
|
423
|
+
return text;
|
|
424
|
+
return text.slice(0, maxLength - 3) + '...';
|
|
425
|
+
}
|
|
426
|
+
//# sourceMappingURL=specGenerator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"specGenerator.js","sourceRoot":"","sources":["../../../src/tools/spec/specGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SPEC Versioning - SPEC 버전 관리 및 Changelog 자동 생성
|
|
3
|
+
* v2.6.0: Git 연동 버전 관리
|
|
4
|
+
*/
|
|
5
|
+
/** SPEC 버전 정보 */
|
|
6
|
+
export interface SpecVersion {
|
|
7
|
+
version: string;
|
|
8
|
+
date: string;
|
|
9
|
+
author?: string;
|
|
10
|
+
changes: ChangeEntry[];
|
|
11
|
+
gitTag?: string;
|
|
12
|
+
gitCommit?: string;
|
|
13
|
+
}
|
|
14
|
+
/** 변경 항목 */
|
|
15
|
+
export interface ChangeEntry {
|
|
16
|
+
type: 'added' | 'changed' | 'removed' | 'fixed';
|
|
17
|
+
description: string;
|
|
18
|
+
section?: string;
|
|
19
|
+
requirementId?: string;
|
|
20
|
+
}
|
|
21
|
+
/** 버전 히스토리 */
|
|
22
|
+
export interface VersionHistory {
|
|
23
|
+
featureName: string;
|
|
24
|
+
currentVersion: string;
|
|
25
|
+
versions: SpecVersion[];
|
|
26
|
+
}
|
|
27
|
+
/** 버전 범프 타입 */
|
|
28
|
+
export type BumpType = 'major' | 'minor' | 'patch';
|
|
29
|
+
/**
|
|
30
|
+
* SPEC 버전 범프
|
|
31
|
+
*/
|
|
32
|
+
export declare function bumpSpecVersion(specPath: string, bumpType: BumpType, changes: ChangeEntry[]): SpecVersion;
|
|
33
|
+
/**
|
|
34
|
+
* 버전 추출
|
|
35
|
+
*/
|
|
36
|
+
export declare function extractVersion(content: string): string | null;
|
|
37
|
+
/**
|
|
38
|
+
* 버전 증가
|
|
39
|
+
*/
|
|
40
|
+
export declare function incrementVersion(version: string, bumpType: BumpType): string;
|
|
41
|
+
/**
|
|
42
|
+
* Changelog 생성
|
|
43
|
+
*/
|
|
44
|
+
export declare function generateChangelog(history: VersionHistory): string;
|
|
45
|
+
/**
|
|
46
|
+
* Git 태그 생성
|
|
47
|
+
*/
|
|
48
|
+
export declare function createGitTag(featureName: string, version: string, message?: string): {
|
|
49
|
+
success: boolean;
|
|
50
|
+
tag: string;
|
|
51
|
+
error?: string;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* SPEC 변경사항 감지 (Git diff 기반)
|
|
55
|
+
*/
|
|
56
|
+
export declare function detectSpecChanges(specPath: string, baseRef?: string): ChangeEntry[];
|
|
57
|
+
/**
|
|
58
|
+
* 최신 SPEC 커밋 조회
|
|
59
|
+
*/
|
|
60
|
+
export declare function getLatestSpecCommit(specPath: string): string | null;
|
|
61
|
+
/**
|
|
62
|
+
* SPEC 버전 히스토리 로드
|
|
63
|
+
*/
|
|
64
|
+
export declare function loadVersionHistory(specDir: string, featureName: string): VersionHistory;
|
|
65
|
+
/**
|
|
66
|
+
* SPEC 버전 히스토리 저장
|
|
67
|
+
*/
|
|
68
|
+
export declare function saveVersionHistory(specDir: string, history: VersionHistory): void;
|
|
69
|
+
/**
|
|
70
|
+
* Baseline 태깅 (릴리즈 준비 완료 표시)
|
|
71
|
+
*/
|
|
72
|
+
export declare function createBaseline(featureName: string, specPath: string): {
|
|
73
|
+
success: boolean;
|
|
74
|
+
baselineName: string;
|
|
75
|
+
error?: string;
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=specVersioning.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"specVersioning.d.ts","sourceRoot":"","sources":["../../../src/tools/spec/specVersioning.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,iBAAiB;AACjB,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,YAAY;AACZ,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,cAAc;AACd,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,eAAe;AACf,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAMnD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,WAAW,EAAE,GACrB,WAAW,CAgBb;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG7D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAU5E;AA4BD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CA0BjE;AAoBD;;GAEG;AACH,wBAAgB,YAAY,CAC1B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAcnD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,MAAiB,GACzB,WAAW,EAAE,CAyCf;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOnE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,cAAc,CAavF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAGjF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAsB5D"}
|