@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,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SPEC Versioning - SPEC 버전 관리 및 Changelog 자동 생성
|
|
3
|
+
* v2.6.0: Git 연동 버전 관리
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'fs';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
import { execSync } from 'child_process';
|
|
8
|
+
// ============================================
|
|
9
|
+
// Version Management
|
|
10
|
+
// ============================================
|
|
11
|
+
/**
|
|
12
|
+
* SPEC 버전 범프
|
|
13
|
+
*/
|
|
14
|
+
export function bumpSpecVersion(specPath, bumpType, changes) {
|
|
15
|
+
const content = fs.readFileSync(specPath, 'utf-8');
|
|
16
|
+
const currentVersion = extractVersion(content) || '0.0.0';
|
|
17
|
+
const newVersion = incrementVersion(currentVersion, bumpType);
|
|
18
|
+
// 프론트매터 업데이트
|
|
19
|
+
const updatedContent = updateFrontmatterVersion(content, newVersion);
|
|
20
|
+
fs.writeFileSync(specPath, updatedContent);
|
|
21
|
+
const version = {
|
|
22
|
+
version: newVersion,
|
|
23
|
+
date: new Date().toISOString().split('T')[0],
|
|
24
|
+
changes,
|
|
25
|
+
};
|
|
26
|
+
return version;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 버전 추출
|
|
30
|
+
*/
|
|
31
|
+
export function extractVersion(content) {
|
|
32
|
+
const match = content.match(/version:\s*['"]?(\d+\.\d+\.\d+)['"]?/);
|
|
33
|
+
return match ? match[1] : null;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 버전 증가
|
|
37
|
+
*/
|
|
38
|
+
export function incrementVersion(version, bumpType) {
|
|
39
|
+
const parts = version.split('.').map(Number);
|
|
40
|
+
switch (bumpType) {
|
|
41
|
+
case 'major':
|
|
42
|
+
return `${parts[0] + 1}.0.0`;
|
|
43
|
+
case 'minor':
|
|
44
|
+
return `${parts[0]}.${parts[1] + 1}.0`;
|
|
45
|
+
case 'patch':
|
|
46
|
+
return `${parts[0]}.${parts[1]}.${parts[2] + 1}`;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 프론트매터 버전 업데이트
|
|
51
|
+
*/
|
|
52
|
+
function updateFrontmatterVersion(content, newVersion) {
|
|
53
|
+
const now = new Date().toISOString();
|
|
54
|
+
// version 필드 업데이트 또는 추가
|
|
55
|
+
if (content.match(/version:/)) {
|
|
56
|
+
content = content.replace(/version:\s*['"]?\d+\.\d+\.\d+['"]?/, `version: ${newVersion}`);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
// 프론트매터에 version 추가
|
|
60
|
+
content = content.replace(/^(---\n)/, `$1version: ${newVersion}\n`);
|
|
61
|
+
}
|
|
62
|
+
// lastUpdated 업데이트
|
|
63
|
+
if (content.match(/lastUpdated:/)) {
|
|
64
|
+
content = content.replace(/lastUpdated:\s*[^\n]+/, `lastUpdated: ${now}`);
|
|
65
|
+
}
|
|
66
|
+
return content;
|
|
67
|
+
}
|
|
68
|
+
// ============================================
|
|
69
|
+
// Changelog Generation
|
|
70
|
+
// ============================================
|
|
71
|
+
/**
|
|
72
|
+
* Changelog 생성
|
|
73
|
+
*/
|
|
74
|
+
export function generateChangelog(history) {
|
|
75
|
+
let changelog = `# Changelog: ${history.featureName}\n\n`;
|
|
76
|
+
changelog += `Current Version: ${history.currentVersion}\n\n`;
|
|
77
|
+
for (const version of history.versions.slice().reverse()) {
|
|
78
|
+
changelog += `## [${version.version}] - ${version.date}\n\n`;
|
|
79
|
+
if (version.gitTag) {
|
|
80
|
+
changelog += `Git Tag: ${version.gitTag}\n\n`;
|
|
81
|
+
}
|
|
82
|
+
// 타입별 그룹화
|
|
83
|
+
const grouped = groupChangesByType(version.changes);
|
|
84
|
+
for (const [type, entries] of Object.entries(grouped)) {
|
|
85
|
+
changelog += `### ${capitalizeFirst(type)}\n\n`;
|
|
86
|
+
for (const entry of entries) {
|
|
87
|
+
const prefix = entry.requirementId ? `[${entry.requirementId}] ` : '';
|
|
88
|
+
const section = entry.section ? ` (${entry.section})` : '';
|
|
89
|
+
changelog += `- ${prefix}${entry.description}${section}\n`;
|
|
90
|
+
}
|
|
91
|
+
changelog += '\n';
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return changelog;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* 변경사항을 타입별로 그룹화
|
|
98
|
+
*/
|
|
99
|
+
function groupChangesByType(changes) {
|
|
100
|
+
const grouped = {};
|
|
101
|
+
for (const change of changes) {
|
|
102
|
+
if (!grouped[change.type]) {
|
|
103
|
+
grouped[change.type] = [];
|
|
104
|
+
}
|
|
105
|
+
grouped[change.type].push(change);
|
|
106
|
+
}
|
|
107
|
+
return grouped;
|
|
108
|
+
}
|
|
109
|
+
// ============================================
|
|
110
|
+
// Git Integration
|
|
111
|
+
// ============================================
|
|
112
|
+
/**
|
|
113
|
+
* Git 태그 생성
|
|
114
|
+
*/
|
|
115
|
+
export function createGitTag(featureName, version, message) {
|
|
116
|
+
const tag = `spec/${featureName}/v${version}`;
|
|
117
|
+
const tagMessage = message || `SPEC ${featureName} version ${version}`;
|
|
118
|
+
try {
|
|
119
|
+
execSync(`git tag -a "${tag}" -m "${tagMessage}"`, { encoding: 'utf-8' });
|
|
120
|
+
return { success: true, tag };
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
return {
|
|
124
|
+
success: false,
|
|
125
|
+
tag,
|
|
126
|
+
error: error instanceof Error ? error.message : String(error),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* SPEC 변경사항 감지 (Git diff 기반)
|
|
132
|
+
*/
|
|
133
|
+
export function detectSpecChanges(specPath, baseRef = 'HEAD~1') {
|
|
134
|
+
const changes = [];
|
|
135
|
+
try {
|
|
136
|
+
const diff = execSync(`git diff ${baseRef} -- "${specPath}"`, { encoding: 'utf-8' });
|
|
137
|
+
// 추가된 라인 분석
|
|
138
|
+
const addedLines = diff.match(/^\+[^+].*/gm) || [];
|
|
139
|
+
for (const line of addedLines) {
|
|
140
|
+
const cleanLine = line.slice(1).trim();
|
|
141
|
+
if (cleanLine.match(/^- \[ \]/) || cleanLine.match(/^1\. \[ \]/)) {
|
|
142
|
+
changes.push({
|
|
143
|
+
type: 'added',
|
|
144
|
+
description: cleanLine.replace(/^[-\d.]+\s*\[ \]\s*/, ''),
|
|
145
|
+
section: 'Task',
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// 삭제된 라인 분석
|
|
150
|
+
const removedLines = diff.match(/^-[^-].*/gm) || [];
|
|
151
|
+
for (const line of removedLines) {
|
|
152
|
+
const cleanLine = line.slice(1).trim();
|
|
153
|
+
if (cleanLine.match(/^- \[ \]/) || cleanLine.match(/^1\. \[ \]/)) {
|
|
154
|
+
changes.push({
|
|
155
|
+
type: 'removed',
|
|
156
|
+
description: cleanLine.replace(/^[-\d.]+\s*\[ \]\s*/, ''),
|
|
157
|
+
section: 'Task',
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
// Git diff 실패 (파일이 새로 생성됨 등)
|
|
164
|
+
changes.push({
|
|
165
|
+
type: 'added',
|
|
166
|
+
description: 'Initial SPEC creation',
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
return changes;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* 최신 SPEC 커밋 조회
|
|
173
|
+
*/
|
|
174
|
+
export function getLatestSpecCommit(specPath) {
|
|
175
|
+
try {
|
|
176
|
+
const commit = execSync(`git log -1 --format=%H -- "${specPath}"`, { encoding: 'utf-8' });
|
|
177
|
+
return commit.trim() || null;
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* SPEC 버전 히스토리 로드
|
|
185
|
+
*/
|
|
186
|
+
export function loadVersionHistory(specDir, featureName) {
|
|
187
|
+
const historyPath = path.join(specDir, `${featureName}.versions.json`);
|
|
188
|
+
try {
|
|
189
|
+
const content = fs.readFileSync(historyPath, 'utf-8');
|
|
190
|
+
return JSON.parse(content);
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
return {
|
|
194
|
+
featureName,
|
|
195
|
+
currentVersion: '0.0.0',
|
|
196
|
+
versions: [],
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* SPEC 버전 히스토리 저장
|
|
202
|
+
*/
|
|
203
|
+
export function saveVersionHistory(specDir, history) {
|
|
204
|
+
const historyPath = path.join(specDir, `${history.featureName}.versions.json`);
|
|
205
|
+
fs.writeFileSync(historyPath, JSON.stringify(history, null, 2));
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Baseline 태깅 (릴리즈 준비 완료 표시)
|
|
209
|
+
*/
|
|
210
|
+
export function createBaseline(featureName, specPath) {
|
|
211
|
+
const content = fs.readFileSync(specPath, 'utf-8');
|
|
212
|
+
const version = extractVersion(content) || '1.0.0';
|
|
213
|
+
const timestamp = new Date().toISOString().replace(/[:-]/g, '').split('.')[0];
|
|
214
|
+
const baselineName = `baseline/${featureName}-v${version}-${timestamp}`;
|
|
215
|
+
try {
|
|
216
|
+
// Baseline 커밋
|
|
217
|
+
execSync(`git add "${specPath}"`, { encoding: 'utf-8' });
|
|
218
|
+
execSync(`git commit -m "SPEC baseline: ${featureName} v${version}"`, { encoding: 'utf-8' });
|
|
219
|
+
// Baseline 태그
|
|
220
|
+
execSync(`git tag "${baselineName}" -m "Baseline for ${featureName} v${version}"`, { encoding: 'utf-8' });
|
|
221
|
+
return { success: true, baselineName };
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
return {
|
|
225
|
+
success: false,
|
|
226
|
+
baselineName,
|
|
227
|
+
error: error instanceof Error ? error.message : String(error),
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
// ============================================
|
|
232
|
+
// Helpers
|
|
233
|
+
// ============================================
|
|
234
|
+
function capitalizeFirst(str) {
|
|
235
|
+
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=specVersioning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"specVersioning.js","sourceRoot":"","sources":["../../../src/tools/spec/specVersioning.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Traceability Matrix - 요구사항 추적 매트릭스 자동 생성
|
|
3
|
+
* v2.6.0: RTM (Requirements Traceability Matrix) 자동화
|
|
4
|
+
*
|
|
5
|
+
* 매핑: REQ → SPEC → Feature → Test
|
|
6
|
+
*/
|
|
7
|
+
/** 추적 항목 */
|
|
8
|
+
export interface TraceItem {
|
|
9
|
+
requirementId: string;
|
|
10
|
+
requirementDesc: string;
|
|
11
|
+
specSection?: string;
|
|
12
|
+
specFile?: string;
|
|
13
|
+
featureScenario?: string;
|
|
14
|
+
featureFile?: string;
|
|
15
|
+
testFile?: string;
|
|
16
|
+
testName?: string;
|
|
17
|
+
coverage: 'full' | 'partial' | 'none';
|
|
18
|
+
}
|
|
19
|
+
/** 추적 매트릭스 */
|
|
20
|
+
export interface TraceabilityMatrix {
|
|
21
|
+
featureName: string;
|
|
22
|
+
items: TraceItem[];
|
|
23
|
+
summary: TraceSummary;
|
|
24
|
+
generatedAt: string;
|
|
25
|
+
}
|
|
26
|
+
/** 추적 요약 */
|
|
27
|
+
export interface TraceSummary {
|
|
28
|
+
totalRequirements: number;
|
|
29
|
+
specCovered: number;
|
|
30
|
+
featureCovered: number;
|
|
31
|
+
testCovered: number;
|
|
32
|
+
coveragePercent: number;
|
|
33
|
+
uncoveredRequirements: string[];
|
|
34
|
+
partialRequirements: string[];
|
|
35
|
+
}
|
|
36
|
+
/** 매트릭스 생성 옵션 */
|
|
37
|
+
export interface TraceMatrixOptions {
|
|
38
|
+
specPath?: string;
|
|
39
|
+
featurePath?: string;
|
|
40
|
+
testPath?: string;
|
|
41
|
+
projectPath?: string;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* 추적 매트릭스 생성 (메인 함수)
|
|
45
|
+
*/
|
|
46
|
+
export declare function generateTraceabilityMatrix(featureName: string, options?: TraceMatrixOptions): TraceabilityMatrix;
|
|
47
|
+
/**
|
|
48
|
+
* 매트릭스를 Markdown 테이블로 출력
|
|
49
|
+
*/
|
|
50
|
+
export declare function formatMatrixAsMarkdown(matrix: TraceabilityMatrix): string;
|
|
51
|
+
/**
|
|
52
|
+
* 매트릭스를 HTML로 출력
|
|
53
|
+
*/
|
|
54
|
+
export declare function formatMatrixAsHtml(matrix: TraceabilityMatrix): string;
|
|
55
|
+
//# sourceMappingURL=traceabilityMatrix.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traceabilityMatrix.d.ts","sourceRoot":"","sources":["../../../src/tools/spec/traceabilityMatrix.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,YAAY;AACZ,MAAM,WAAW,SAAS;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;CACvC;AAED,cAAc;AACd,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,OAAO,EAAE,YAAY,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,YAAY;AACZ,MAAM,WAAW,YAAY;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,mBAAmB,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED,iBAAiB;AACjB,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAMD;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,kBAAuB,GAC/B,kBAAkB,CA+DpB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAsDzE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CA0ErE"}
|