@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 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/interaction/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO;AACL,gBAAgB;AAChB,OAAO,EACP,YAAY;AACZ,oBAAoB;AACpB,0BAA0B,EAC1B,yBAAyB,EACzB,kBAAkB;AAClB,aAAa;AACb,wBAAwB,EACxB,sBAAsB;AACtB,UAAU;AACV,iBAAiB;AACjB,YAAY;AACZ,kBAAkB,GACnB,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SPEC Tools - PRD-to-SPEC 자동화 도구 모음
|
|
3
|
+
* v2.6.0
|
|
4
|
+
*/
|
|
5
|
+
export { generateRequirementId, generateRequirementIds, validateRequirementId, checkDuplicateId, registerExistingId, registerExistingIds, extractFeatureFromId, extractNumberFromId, getIdsByFeature, getAllUsedIds, resetCounters, getCounterStatus } from './requirementId.js';
|
|
6
|
+
export { parsePRD, parsePRDFile } from './prdParser.js';
|
|
7
|
+
export type { Requirement, ParsedPRD, PRDMetadata } from './prdParser.js';
|
|
8
|
+
export { generateSpec } from './specGenerator.js';
|
|
9
|
+
export type { SpecGeneratorOptions, GeneratedSpec } from './specGenerator.js';
|
|
10
|
+
export { generateTraceabilityMatrix, formatMatrixAsMarkdown, formatMatrixAsHtml } from './traceabilityMatrix.js';
|
|
11
|
+
export type { TraceItem, TraceabilityMatrix, TraceSummary, TraceMatrixOptions } from './traceabilityMatrix.js';
|
|
12
|
+
export { bumpSpecVersion, extractVersion, incrementVersion, generateChangelog, createGitTag, detectSpecChanges, getLatestSpecCommit, loadVersionHistory, saveVersionHistory, createBaseline } from './specVersioning.js';
|
|
13
|
+
export type { SpecVersion, ChangeEntry, VersionHistory, BumpType } from './specVersioning.js';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/spec/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,aAAa,EACb,gBAAgB,EACjB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,QAAQ,EACR,YAAY,EACb,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,WAAW,EACX,SAAS,EACT,WAAW,EACZ,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,YAAY,EACb,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,oBAAoB,EACpB,aAAa,EACd,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,0BAA0B,EAC1B,sBAAsB,EACtB,kBAAkB,EACnB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,SAAS,EACT,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,EACnB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EACL,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACf,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,WAAW,EACX,WAAW,EACX,cAAc,EACd,QAAQ,EACT,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SPEC Tools - PRD-to-SPEC 자동화 도구 모음
|
|
3
|
+
* v2.6.0
|
|
4
|
+
*/
|
|
5
|
+
// Requirement ID
|
|
6
|
+
export { generateRequirementId, generateRequirementIds, validateRequirementId, checkDuplicateId, registerExistingId, registerExistingIds, extractFeatureFromId, extractNumberFromId, getIdsByFeature, getAllUsedIds, resetCounters, getCounterStatus } from './requirementId.js';
|
|
7
|
+
// PRD Parser
|
|
8
|
+
export { parsePRD, parsePRDFile } from './prdParser.js';
|
|
9
|
+
// SPEC Generator
|
|
10
|
+
export { generateSpec } from './specGenerator.js';
|
|
11
|
+
// Traceability Matrix
|
|
12
|
+
export { generateTraceabilityMatrix, formatMatrixAsMarkdown, formatMatrixAsHtml } from './traceabilityMatrix.js';
|
|
13
|
+
// SPEC Versioning
|
|
14
|
+
export { bumpSpecVersion, extractVersion, incrementVersion, generateChangelog, createGitTag, detectSpecChanges, getLatestSpecCommit, loadVersionHistory, saveVersionHistory, createBaseline } from './specVersioning.js';
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/spec/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,iBAAiB;AACjB,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,aAAa,EACb,gBAAgB,EACjB,MAAM,oBAAoB,CAAC;AAE5B,aAAa;AACb,OAAO,EACL,QAAQ,EACR,YAAY,EACb,MAAM,gBAAgB,CAAC;AAOxB,iBAAiB;AACjB,OAAO,EACL,YAAY,EACb,MAAM,oBAAoB,CAAC;AAM5B,sBAAsB;AACtB,OAAO,EACL,0BAA0B,EAC1B,sBAAsB,EACtB,kBAAkB,EACnB,MAAM,yBAAyB,CAAC;AAQjC,kBAAkB;AAClB,OAAO,EACL,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACf,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRD Parser - PRD 문서에서 요구사항 추출
|
|
3
|
+
* v2.6.0: Markdown/YAML 형식 지원
|
|
4
|
+
*
|
|
5
|
+
* 지원 형식:
|
|
6
|
+
* - Markdown 섹션 기반 (## Requirements, ## Acceptance Criteria)
|
|
7
|
+
* - YAML 프론트매터
|
|
8
|
+
* - 번호/불릿 리스트
|
|
9
|
+
*/
|
|
10
|
+
/** 추출된 요구사항 */
|
|
11
|
+
export interface Requirement {
|
|
12
|
+
id: string;
|
|
13
|
+
description: string;
|
|
14
|
+
acceptanceCriteria: string[];
|
|
15
|
+
priority: 'high' | 'medium' | 'low';
|
|
16
|
+
category?: string;
|
|
17
|
+
source?: string;
|
|
18
|
+
}
|
|
19
|
+
/** PRD 파싱 결과 */
|
|
20
|
+
export interface ParsedPRD {
|
|
21
|
+
title: string;
|
|
22
|
+
description?: string;
|
|
23
|
+
requirements: Requirement[];
|
|
24
|
+
metadata: PRDMetadata;
|
|
25
|
+
raw: string;
|
|
26
|
+
}
|
|
27
|
+
/** PRD 메타데이터 */
|
|
28
|
+
export interface PRDMetadata {
|
|
29
|
+
format: 'markdown' | 'yaml' | 'mixed';
|
|
30
|
+
hasYamlFrontmatter: boolean;
|
|
31
|
+
sectionCount: number;
|
|
32
|
+
requirementCount: number;
|
|
33
|
+
parseWarnings: string[];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* PRD 문서 파싱 (메인 함수)
|
|
37
|
+
*/
|
|
38
|
+
export declare function parsePRD(content: string, featureName: string): ParsedPRD;
|
|
39
|
+
/**
|
|
40
|
+
* 파일에서 PRD 파싱 (파일 경로)
|
|
41
|
+
*/
|
|
42
|
+
export declare function parsePRDFile(filePath: string, featureName: string): Promise<ParsedPRD>;
|
|
43
|
+
//# sourceMappingURL=prdParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prdParser.d.ts","sourceRoot":"","sources":["../../../src/tools/spec/prdParser.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,eAAe;AACf,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,gBAAgB;AAChB,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,QAAQ,EAAE,WAAW,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,gBAAgB;AAChB,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC;IACtC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAMD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,CA0CxE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAI5F"}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRD Parser - PRD 문서에서 요구사항 추출
|
|
3
|
+
* v2.6.0: Markdown/YAML 형식 지원
|
|
4
|
+
*
|
|
5
|
+
* 지원 형식:
|
|
6
|
+
* - Markdown 섹션 기반 (## Requirements, ## Acceptance Criteria)
|
|
7
|
+
* - YAML 프론트매터
|
|
8
|
+
* - 번호/불릿 리스트
|
|
9
|
+
*/
|
|
10
|
+
import { generateRequirementId } from './requirementId.js';
|
|
11
|
+
// ============================================
|
|
12
|
+
// Main Parser
|
|
13
|
+
// ============================================
|
|
14
|
+
/**
|
|
15
|
+
* PRD 문서 파싱 (메인 함수)
|
|
16
|
+
*/
|
|
17
|
+
export function parsePRD(content, featureName) {
|
|
18
|
+
const warnings = [];
|
|
19
|
+
let format = 'markdown';
|
|
20
|
+
// YAML 프론트매터 추출
|
|
21
|
+
const { frontmatter, body } = extractYamlFrontmatter(content);
|
|
22
|
+
const hasYamlFrontmatter = frontmatter !== null;
|
|
23
|
+
if (hasYamlFrontmatter) {
|
|
24
|
+
format = body.trim() ? 'mixed' : 'yaml';
|
|
25
|
+
}
|
|
26
|
+
// 제목 추출
|
|
27
|
+
const title = extractTitle(body) || featureName;
|
|
28
|
+
// 설명 추출
|
|
29
|
+
const description = extractDescription(body);
|
|
30
|
+
// 요구사항 추출
|
|
31
|
+
const requirements = extractRequirements(body, featureName, warnings);
|
|
32
|
+
// YAML에서 추가 요구사항 추출
|
|
33
|
+
if (frontmatter) {
|
|
34
|
+
const yamlReqs = extractRequirementsFromYaml(frontmatter, featureName, warnings);
|
|
35
|
+
requirements.push(...yamlReqs);
|
|
36
|
+
}
|
|
37
|
+
// 중복 제거 및 ID 재할당
|
|
38
|
+
const uniqueReqs = deduplicateRequirements(requirements);
|
|
39
|
+
return {
|
|
40
|
+
title,
|
|
41
|
+
description,
|
|
42
|
+
requirements: uniqueReqs,
|
|
43
|
+
metadata: {
|
|
44
|
+
format,
|
|
45
|
+
hasYamlFrontmatter,
|
|
46
|
+
sectionCount: countSections(body),
|
|
47
|
+
requirementCount: uniqueReqs.length,
|
|
48
|
+
parseWarnings: warnings,
|
|
49
|
+
},
|
|
50
|
+
raw: content,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 파일에서 PRD 파싱 (파일 경로)
|
|
55
|
+
*/
|
|
56
|
+
export async function parsePRDFile(filePath, featureName) {
|
|
57
|
+
const fs = await import('fs');
|
|
58
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
59
|
+
return parsePRD(content, featureName);
|
|
60
|
+
}
|
|
61
|
+
// ============================================
|
|
62
|
+
// Extraction Functions
|
|
63
|
+
// ============================================
|
|
64
|
+
/**
|
|
65
|
+
* YAML 프론트매터 추출
|
|
66
|
+
*/
|
|
67
|
+
function extractYamlFrontmatter(content) {
|
|
68
|
+
const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);
|
|
69
|
+
if (match) {
|
|
70
|
+
return { frontmatter: match[1], body: match[2] };
|
|
71
|
+
}
|
|
72
|
+
return { frontmatter: null, body: content };
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* 제목 추출 (첫 번째 # 헤더)
|
|
76
|
+
*/
|
|
77
|
+
function extractTitle(content) {
|
|
78
|
+
const match = content.match(/^#\s+(.+)$/m);
|
|
79
|
+
return match ? match[1].trim() : null;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 설명 추출 (제목 다음 첫 번째 문단)
|
|
83
|
+
*/
|
|
84
|
+
function extractDescription(content) {
|
|
85
|
+
const lines = content.split('\n');
|
|
86
|
+
let foundTitle = false;
|
|
87
|
+
const descLines = [];
|
|
88
|
+
for (const line of lines) {
|
|
89
|
+
if (line.match(/^#\s+/)) {
|
|
90
|
+
foundTitle = true;
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
if (foundTitle) {
|
|
94
|
+
if (line.match(/^##\s+/) || line.trim() === '') {
|
|
95
|
+
if (descLines.length > 0)
|
|
96
|
+
break;
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
descLines.push(line);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return descLines.length > 0 ? descLines.join('\n').trim() : undefined;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Markdown에서 요구사항 추출
|
|
106
|
+
*/
|
|
107
|
+
function extractRequirements(content, featureName, warnings) {
|
|
108
|
+
const requirements = [];
|
|
109
|
+
// Requirements 섹션 찾기
|
|
110
|
+
const reqSection = extractSection(content, ['Requirements', 'Functional Requirements', '요구사항', '기능 요구사항']);
|
|
111
|
+
if (reqSection) {
|
|
112
|
+
const items = extractListItems(reqSection);
|
|
113
|
+
for (const item of items) {
|
|
114
|
+
requirements.push({
|
|
115
|
+
id: generateRequirementId(featureName),
|
|
116
|
+
description: item.text,
|
|
117
|
+
acceptanceCriteria: [],
|
|
118
|
+
priority: inferPriority(item.text),
|
|
119
|
+
source: `Requirements section`,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Acceptance Criteria 섹션에서 AC 추출
|
|
124
|
+
const acSection = extractSection(content, ['Acceptance Criteria', 'AC', '인수 조건', '승인 기준']);
|
|
125
|
+
if (acSection) {
|
|
126
|
+
const acItems = extractListItems(acSection);
|
|
127
|
+
// AC를 기존 요구사항에 매핑 또는 새 요구사항 생성
|
|
128
|
+
for (const ac of acItems) {
|
|
129
|
+
// 이미 있는 요구사항과 매칭 시도
|
|
130
|
+
const matched = requirements.find(r => r.description.toLowerCase().includes(ac.text.toLowerCase().slice(0, 30)));
|
|
131
|
+
if (matched) {
|
|
132
|
+
matched.acceptanceCriteria.push(ac.text);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
// 새 요구사항으로 추가 (AC만 있는 경우)
|
|
136
|
+
requirements.push({
|
|
137
|
+
id: generateRequirementId(featureName),
|
|
138
|
+
description: `Acceptance Criteria: ${ac.text}`,
|
|
139
|
+
acceptanceCriteria: [ac.text],
|
|
140
|
+
priority: 'medium',
|
|
141
|
+
source: `Acceptance Criteria section`,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// User Stories 섹션
|
|
147
|
+
const userStorySection = extractSection(content, ['User Stories', 'User Story', '사용자 스토리']);
|
|
148
|
+
if (userStorySection) {
|
|
149
|
+
const stories = extractUserStories(userStorySection);
|
|
150
|
+
for (const story of stories) {
|
|
151
|
+
requirements.push({
|
|
152
|
+
id: generateRequirementId(featureName),
|
|
153
|
+
description: story,
|
|
154
|
+
acceptanceCriteria: [],
|
|
155
|
+
priority: 'medium',
|
|
156
|
+
source: `User Stories section`,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
if (requirements.length === 0) {
|
|
161
|
+
warnings.push('No requirements found in standard sections. Trying fallback extraction.');
|
|
162
|
+
// Fallback: 모든 리스트 아이템 추출
|
|
163
|
+
const allItems = extractListItems(content);
|
|
164
|
+
for (const item of allItems) {
|
|
165
|
+
if (item.text.length > 20) { // 너무 짧은 것 제외
|
|
166
|
+
requirements.push({
|
|
167
|
+
id: generateRequirementId(featureName),
|
|
168
|
+
description: item.text,
|
|
169
|
+
acceptanceCriteria: [],
|
|
170
|
+
priority: 'medium',
|
|
171
|
+
source: `Fallback extraction`,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return requirements;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* YAML에서 요구사항 추출
|
|
180
|
+
*/
|
|
181
|
+
function extractRequirementsFromYaml(yaml, featureName, warnings) {
|
|
182
|
+
const requirements = [];
|
|
183
|
+
// 간단한 YAML 파싱 (requirements: 배열)
|
|
184
|
+
const reqMatch = yaml.match(/requirements:\s*\n((?:\s+-\s+.+\n?)+)/);
|
|
185
|
+
if (reqMatch) {
|
|
186
|
+
const items = reqMatch[1].match(/-\s+(.+)/g);
|
|
187
|
+
if (items) {
|
|
188
|
+
for (const item of items) {
|
|
189
|
+
const text = item.replace(/^-\s+/, '').trim();
|
|
190
|
+
requirements.push({
|
|
191
|
+
id: generateRequirementId(featureName),
|
|
192
|
+
description: text,
|
|
193
|
+
acceptanceCriteria: [],
|
|
194
|
+
priority: 'medium',
|
|
195
|
+
source: 'YAML frontmatter',
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return requirements;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* 섹션 추출
|
|
204
|
+
*/
|
|
205
|
+
function extractSection(content, sectionNames) {
|
|
206
|
+
for (const name of sectionNames) {
|
|
207
|
+
const pattern = new RegExp(`^##\\s*${name}[:\\s]*\\n([\\s\\S]*?)(?=^##\\s|$)`, 'mi');
|
|
208
|
+
const match = content.match(pattern);
|
|
209
|
+
if (match) {
|
|
210
|
+
return match[1].trim();
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* 리스트 아이템 추출 (불릿/번호)
|
|
217
|
+
*/
|
|
218
|
+
function extractListItems(content) {
|
|
219
|
+
const items = [];
|
|
220
|
+
const lines = content.split('\n');
|
|
221
|
+
for (const line of lines) {
|
|
222
|
+
// 불릿 리스트: -, *, •
|
|
223
|
+
const bulletMatch = line.match(/^(\s*)[-*•]\s+(.+)/);
|
|
224
|
+
if (bulletMatch) {
|
|
225
|
+
items.push({
|
|
226
|
+
text: bulletMatch[2].trim(),
|
|
227
|
+
indent: bulletMatch[1].length,
|
|
228
|
+
});
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
// 번호 리스트: 1., 1), (1)
|
|
232
|
+
const numberMatch = line.match(/^(\s*)(?:\d+[.)]\s*|\(\d+\)\s*)(.+)/);
|
|
233
|
+
if (numberMatch) {
|
|
234
|
+
items.push({
|
|
235
|
+
text: numberMatch[2].trim(),
|
|
236
|
+
indent: numberMatch[1].length,
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return items;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* User Story 추출 (As a... I want... So that...)
|
|
244
|
+
*/
|
|
245
|
+
function extractUserStories(content) {
|
|
246
|
+
const stories = [];
|
|
247
|
+
const pattern = /(?:As\s+(?:a|an)\s+.+?(?:,|\s))?I\s+want\s+.+?(?:so\s+that|because|in\s+order\s+to)\s+.+?[.!]/gi;
|
|
248
|
+
const matches = content.match(pattern);
|
|
249
|
+
if (matches) {
|
|
250
|
+
stories.push(...matches.map(m => m.trim()));
|
|
251
|
+
}
|
|
252
|
+
return stories;
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* 섹션 수 카운트
|
|
256
|
+
*/
|
|
257
|
+
function countSections(content) {
|
|
258
|
+
const matches = content.match(/^##\s+/gm);
|
|
259
|
+
return matches ? matches.length : 0;
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* 우선순위 추론
|
|
263
|
+
*/
|
|
264
|
+
function inferPriority(text) {
|
|
265
|
+
const lowerText = text.toLowerCase();
|
|
266
|
+
if (lowerText.includes('must') || lowerText.includes('critical') || lowerText.includes('required')) {
|
|
267
|
+
return 'high';
|
|
268
|
+
}
|
|
269
|
+
if (lowerText.includes('should') || lowerText.includes('important')) {
|
|
270
|
+
return 'medium';
|
|
271
|
+
}
|
|
272
|
+
if (lowerText.includes('nice to have') || lowerText.includes('optional') || lowerText.includes('could')) {
|
|
273
|
+
return 'low';
|
|
274
|
+
}
|
|
275
|
+
return 'medium';
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* 중복 요구사항 제거
|
|
279
|
+
*/
|
|
280
|
+
function deduplicateRequirements(requirements) {
|
|
281
|
+
const seen = new Set();
|
|
282
|
+
return requirements.filter(req => {
|
|
283
|
+
const key = req.description.toLowerCase().slice(0, 50);
|
|
284
|
+
if (seen.has(key)) {
|
|
285
|
+
return false;
|
|
286
|
+
}
|
|
287
|
+
seen.add(key);
|
|
288
|
+
return true;
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=prdParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prdParser.js","sourceRoot":"","sources":["../../../src/tools/spec/prdParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prdParser.test.d.ts","sourceRoot":"","sources":["../../../src/tools/spec/prdParser.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|