@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.
Files changed (81) hide show
  1. package/CLAUDE.md +154 -2
  2. package/README.md +132 -2
  3. package/commands/vibe.run.md +69 -44
  4. package/commands/vibe.spec.md +83 -0
  5. package/commands/vibe.trace.md +161 -0
  6. package/dist/cli/index.d.ts.map +1 -1
  7. package/dist/cli/index.js +5 -3
  8. package/dist/cli/index.js.map +1 -1
  9. package/dist/lib/IterationTracker.d.ts +3 -1
  10. package/dist/lib/IterationTracker.d.ts.map +1 -1
  11. package/dist/lib/IterationTracker.js +2 -1
  12. package/dist/lib/IterationTracker.js.map +1 -1
  13. package/dist/lib/constants.d.ts +14 -0
  14. package/dist/lib/constants.d.ts.map +1 -1
  15. package/dist/lib/constants.js +26 -0
  16. package/dist/lib/constants.js.map +1 -1
  17. package/dist/orchestrator/BackgroundManager.d.ts +109 -0
  18. package/dist/orchestrator/BackgroundManager.d.ts.map +1 -0
  19. package/dist/orchestrator/BackgroundManager.js +456 -0
  20. package/dist/orchestrator/BackgroundManager.js.map +1 -0
  21. package/dist/orchestrator/BackgroundManager.test.d.ts +6 -0
  22. package/dist/orchestrator/BackgroundManager.test.d.ts.map +1 -0
  23. package/dist/orchestrator/BackgroundManager.test.js +162 -0
  24. package/dist/orchestrator/BackgroundManager.test.js.map +1 -0
  25. package/dist/orchestrator/PhasePipeline.d.ts +106 -0
  26. package/dist/orchestrator/PhasePipeline.d.ts.map +1 -0
  27. package/dist/orchestrator/PhasePipeline.js +279 -0
  28. package/dist/orchestrator/PhasePipeline.js.map +1 -0
  29. package/dist/orchestrator/backgroundAgent.d.ts +2 -0
  30. package/dist/orchestrator/backgroundAgent.d.ts.map +1 -1
  31. package/dist/orchestrator/backgroundAgent.js +2 -0
  32. package/dist/orchestrator/backgroundAgent.js.map +1 -1
  33. package/dist/orchestrator/index.d.ts +4 -1
  34. package/dist/orchestrator/index.d.ts.map +1 -1
  35. package/dist/orchestrator/index.js +5 -1
  36. package/dist/orchestrator/index.js.map +1 -1
  37. package/dist/tools/index.d.ts +4 -0
  38. package/dist/tools/index.d.ts.map +1 -1
  39. package/dist/tools/index.js +14 -0
  40. package/dist/tools/index.js.map +1 -1
  41. package/dist/tools/interaction/askUser.d.ts +115 -0
  42. package/dist/tools/interaction/askUser.d.ts.map +1 -0
  43. package/dist/tools/interaction/askUser.js +504 -0
  44. package/dist/tools/interaction/askUser.js.map +1 -0
  45. package/dist/tools/interaction/index.d.ts +8 -0
  46. package/dist/tools/interaction/index.d.ts.map +1 -0
  47. package/dist/tools/interaction/index.js +17 -0
  48. package/dist/tools/interaction/index.js.map +1 -0
  49. package/dist/tools/spec/index.d.ts +14 -0
  50. package/dist/tools/spec/index.d.ts.map +1 -0
  51. package/dist/tools/spec/index.js +15 -0
  52. package/dist/tools/spec/index.js.map +1 -0
  53. package/dist/tools/spec/prdParser.d.ts +43 -0
  54. package/dist/tools/spec/prdParser.d.ts.map +1 -0
  55. package/dist/tools/spec/prdParser.js +291 -0
  56. package/dist/tools/spec/prdParser.js.map +1 -0
  57. package/dist/tools/spec/prdParser.test.d.ts +6 -0
  58. package/dist/tools/spec/prdParser.test.d.ts.map +1 -0
  59. package/dist/tools/spec/prdParser.test.js +332 -0
  60. package/dist/tools/spec/prdParser.test.js.map +1 -0
  61. package/dist/tools/spec/requirementId.d.ts +65 -0
  62. package/dist/tools/spec/requirementId.d.ts.map +1 -0
  63. package/dist/tools/spec/requirementId.js +161 -0
  64. package/dist/tools/spec/requirementId.js.map +1 -0
  65. package/dist/tools/spec/specGenerator.d.ts +39 -0
  66. package/dist/tools/spec/specGenerator.d.ts.map +1 -0
  67. package/dist/tools/spec/specGenerator.js +426 -0
  68. package/dist/tools/spec/specGenerator.js.map +1 -0
  69. package/dist/tools/spec/specVersioning.d.ts +77 -0
  70. package/dist/tools/spec/specVersioning.d.ts.map +1 -0
  71. package/dist/tools/spec/specVersioning.js +237 -0
  72. package/dist/tools/spec/specVersioning.js.map +1 -0
  73. package/dist/tools/spec/traceabilityMatrix.d.ts +55 -0
  74. package/dist/tools/spec/traceabilityMatrix.d.ts.map +1 -0
  75. package/dist/tools/spec/traceabilityMatrix.js +396 -0
  76. package/dist/tools/spec/traceabilityMatrix.js.map +1 -0
  77. package/dist/tools/spec/traceabilityMatrix.test.d.ts +6 -0
  78. package/dist/tools/spec/traceabilityMatrix.test.d.ts.map +1 -0
  79. package/dist/tools/spec/traceabilityMatrix.test.js +340 -0
  80. package/dist/tools/spec/traceabilityMatrix.test.js.map +1 -0
  81. 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,6 @@
1
+ /**
2
+ * PRD Parser Tests
3
+ * Markdown/YAML parsing, requirement extraction
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=prdParser.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prdParser.test.d.ts","sourceRoot":"","sources":["../../../src/tools/spec/prdParser.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}