aiag-cli 2.2.2 → 2.3.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.
- package/README.md +72 -37
- package/dist/cli.js +30 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/auto.js +45 -41
- package/dist/commands/auto.js.map +1 -1
- package/dist/commands/feature.d.ts +11 -0
- package/dist/commands/feature.d.ts.map +1 -0
- package/dist/commands/feature.js +153 -0
- package/dist/commands/feature.js.map +1 -0
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +29 -78
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/prd.d.ts +12 -0
- package/dist/commands/prd.d.ts.map +1 -0
- package/dist/commands/prd.js +179 -0
- package/dist/commands/prd.js.map +1 -0
- package/dist/prompts/coding.d.ts.map +1 -1
- package/dist/prompts/coding.js +12 -0
- package/dist/prompts/coding.js.map +1 -1
- package/dist/prompts/index.d.ts +2 -0
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +2 -0
- package/dist/prompts/index.js.map +1 -1
- package/dist/prompts/initializer.d.ts.map +1 -1
- package/dist/prompts/initializer.js +6 -0
- package/dist/prompts/initializer.js.map +1 -1
- package/dist/prompts/prd.d.ts +28 -0
- package/dist/prompts/prd.d.ts.map +1 -0
- package/dist/prompts/prd.js +105 -0
- package/dist/prompts/prd.js.map +1 -0
- package/dist/skills/index.d.ts +12 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +12 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/installer.d.ts +38 -0
- package/dist/skills/installer.d.ts.map +1 -0
- package/dist/skills/installer.js +153 -0
- package/dist/skills/installer.js.map +1 -0
- package/dist/skills/loader.d.ts +34 -0
- package/dist/skills/loader.d.ts.map +1 -0
- package/dist/skills/loader.js +134 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/runner.d.ts +14 -0
- package/dist/skills/runner.d.ts.map +1 -0
- package/dist/skills/runner.js +238 -0
- package/dist/skills/runner.js.map +1 -0
- package/dist/types.d.ts +127 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/prd.d.ts +21 -0
- package/dist/utils/prd.d.ts.map +1 -1
- package/dist/utils/prd.js +69 -0
- package/dist/utils/prd.js.map +1 -1
- package/dist/utils/taskmasterConverter.d.ts +72 -0
- package/dist/utils/taskmasterConverter.d.ts.map +1 -0
- package/dist/utils/taskmasterConverter.js +401 -0
- package/dist/utils/taskmasterConverter.js.map +1 -0
- package/dist/utils/taskmasterParser.d.ts +35 -0
- package/dist/utils/taskmasterParser.d.ts.map +1 -0
- package/dist/utils/taskmasterParser.js +259 -0
- package/dist/utils/taskmasterParser.js.map +1 -0
- package/package.json +1 -1
- package/templates/skills/prd-taskmaster/.taskmaster/docs/prd.md +2571 -0
- package/templates/skills/prd-taskmaster/.taskmaster/scripts/execution-state.py +87 -0
- package/templates/skills/prd-taskmaster/.taskmaster/scripts/learn-accuracy.py +113 -0
- package/templates/skills/prd-taskmaster/.taskmaster/scripts/rollback.sh +71 -0
- package/templates/skills/prd-taskmaster/.taskmaster/scripts/security-audit.py +130 -0
- package/templates/skills/prd-taskmaster/.taskmaster/scripts/track-time.py +133 -0
- package/templates/skills/prd-taskmaster/LICENSE +21 -0
- package/templates/skills/prd-taskmaster/README.md +608 -0
- package/templates/skills/prd-taskmaster/SKILL.md +1258 -0
- package/templates/skills/prd-taskmaster/reference/taskmaster-integration-guide.md +645 -0
- package/templates/skills/prd-taskmaster/reference/validation-checklist.md +394 -0
- package/templates/skills/prd-taskmaster/scripts/setup-taskmaster.sh +112 -0
- package/templates/skills/prd-taskmaster/templates/CLAUDE.md.template +635 -0
- package/templates/skills/prd-taskmaster/templates/taskmaster-prd-comprehensive.md +983 -0
- package/templates/skills/prd-taskmaster/templates/taskmaster-prd-minimal.md +103 -0
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Taskmaster → aiag Feature 변환기
|
|
3
|
+
*
|
|
4
|
+
* prd-taskmaster에서 파싱된 TaskmasterRequirement 객체를
|
|
5
|
+
* aiag의 Feature 객체로 변환합니다.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* 카테고리 추론을 위한 키워드 패턴
|
|
9
|
+
*/
|
|
10
|
+
const CATEGORY_PATTERNS = {
|
|
11
|
+
auth: [
|
|
12
|
+
/\bauth/i,
|
|
13
|
+
/\blogin/i,
|
|
14
|
+
/\blogout/i,
|
|
15
|
+
/\bpassword/i,
|
|
16
|
+
/\b2fa\b/i,
|
|
17
|
+
/\btoken\b/i,
|
|
18
|
+
/\bjwt\b/i,
|
|
19
|
+
/\bsession/i,
|
|
20
|
+
/\boauth/i,
|
|
21
|
+
/\bsso\b/i,
|
|
22
|
+
],
|
|
23
|
+
api: [
|
|
24
|
+
/\bapi\b/i,
|
|
25
|
+
/\bendpoint/i,
|
|
26
|
+
/\brest\b/i,
|
|
27
|
+
/\bgraphql/i,
|
|
28
|
+
/\brequest/i,
|
|
29
|
+
/\bresponse/i,
|
|
30
|
+
/\bwebhook/i,
|
|
31
|
+
/\bhttp/i,
|
|
32
|
+
],
|
|
33
|
+
ui: [
|
|
34
|
+
/\bui\b/i,
|
|
35
|
+
/\bcomponent/i,
|
|
36
|
+
/\bform\b/i,
|
|
37
|
+
/\bbutton/i,
|
|
38
|
+
/\bpage\b/i,
|
|
39
|
+
/\bmodal/i,
|
|
40
|
+
/\bdialog/i,
|
|
41
|
+
/\blayout/i,
|
|
42
|
+
/\bstyle/i,
|
|
43
|
+
/\bcss\b/i,
|
|
44
|
+
/\btheme/i,
|
|
45
|
+
],
|
|
46
|
+
cli: [
|
|
47
|
+
/\bcli\b/i,
|
|
48
|
+
/\bcommand/i,
|
|
49
|
+
/\bterminal/i,
|
|
50
|
+
/\bconsole/i,
|
|
51
|
+
/\bargument/i,
|
|
52
|
+
/\bflag\b/i,
|
|
53
|
+
/\boption\b/i,
|
|
54
|
+
],
|
|
55
|
+
data: [
|
|
56
|
+
/\bdatabase/i,
|
|
57
|
+
/\bschema/i,
|
|
58
|
+
/\bmigration/i,
|
|
59
|
+
/\bquery/i,
|
|
60
|
+
/\bmodel/i,
|
|
61
|
+
/\bdb\b/i,
|
|
62
|
+
/\bsql\b/i,
|
|
63
|
+
/\borm\b/i,
|
|
64
|
+
/\bprisma/i,
|
|
65
|
+
/\bmongo/i,
|
|
66
|
+
],
|
|
67
|
+
test: [
|
|
68
|
+
/\btest/i,
|
|
69
|
+
/\bspec\b/i,
|
|
70
|
+
/\bcoverage/i,
|
|
71
|
+
/\bmock/i,
|
|
72
|
+
/\bfixture/i,
|
|
73
|
+
/\be2e\b/i,
|
|
74
|
+
/\bunit\b/i,
|
|
75
|
+
/\bintegration\b/i,
|
|
76
|
+
],
|
|
77
|
+
docs: [
|
|
78
|
+
/\bdoc/i,
|
|
79
|
+
/\breadme/i,
|
|
80
|
+
/\bguide/i,
|
|
81
|
+
/\btutorial/i,
|
|
82
|
+
/\bmarkdown/i,
|
|
83
|
+
/\bchangelog/i,
|
|
84
|
+
],
|
|
85
|
+
devops: [
|
|
86
|
+
/\bdeploy/i,
|
|
87
|
+
/\bci\b/i,
|
|
88
|
+
/\bcd\b/i,
|
|
89
|
+
/\bdocker/i,
|
|
90
|
+
/\bkubernetes/i,
|
|
91
|
+
/\bbuild/i,
|
|
92
|
+
/\bpipeline/i,
|
|
93
|
+
/\baction/i,
|
|
94
|
+
/\bworkflow/i,
|
|
95
|
+
/\bmonitor/i,
|
|
96
|
+
],
|
|
97
|
+
core: [
|
|
98
|
+
/\bcore\b/i,
|
|
99
|
+
/\binfrastructure/i,
|
|
100
|
+
/\bsetup/i,
|
|
101
|
+
/\bconfig/i,
|
|
102
|
+
/\binit/i,
|
|
103
|
+
/\bbase\b/i,
|
|
104
|
+
/\bfoundation/i,
|
|
105
|
+
],
|
|
106
|
+
agent: [
|
|
107
|
+
/\bagent/i,
|
|
108
|
+
/\bclaude/i,
|
|
109
|
+
/\bai\b/i,
|
|
110
|
+
/\bllm\b/i,
|
|
111
|
+
/\bautonomous/i,
|
|
112
|
+
/\bautomation/i,
|
|
113
|
+
],
|
|
114
|
+
claude: [
|
|
115
|
+
/\bclaude\b/i,
|
|
116
|
+
/\banthropic/i,
|
|
117
|
+
],
|
|
118
|
+
feature: [], // 기본 카테고리 (매칭 없을 때)
|
|
119
|
+
};
|
|
120
|
+
/**
|
|
121
|
+
* 우선순위 매핑
|
|
122
|
+
*/
|
|
123
|
+
const PRIORITY_MAP = {
|
|
124
|
+
P0: 'critical',
|
|
125
|
+
P1: 'high',
|
|
126
|
+
P2: 'medium',
|
|
127
|
+
};
|
|
128
|
+
/**
|
|
129
|
+
* 카테고리별 기본 testCommand
|
|
130
|
+
*/
|
|
131
|
+
const DEFAULT_TEST_COMMANDS = {
|
|
132
|
+
api: 'bun test -- --grep "API"',
|
|
133
|
+
ui: 'bun test -- --grep "Component"',
|
|
134
|
+
cli: 'bun test -- --grep "CLI"',
|
|
135
|
+
auth: 'bun test -- --grep "Auth"',
|
|
136
|
+
data: 'bun test -- --grep "Database"',
|
|
137
|
+
test: 'bun test',
|
|
138
|
+
core: 'bun test -- --grep "Core"',
|
|
139
|
+
agent: 'bun test -- --grep "Agent"',
|
|
140
|
+
docs: 'echo "Documentation feature - manual review"',
|
|
141
|
+
devops: 'echo "DevOps feature - manual verification"',
|
|
142
|
+
};
|
|
143
|
+
/**
|
|
144
|
+
* 기본 변환 옵션
|
|
145
|
+
*/
|
|
146
|
+
const DEFAULT_OPTIONS = {
|
|
147
|
+
splitTasks: false,
|
|
148
|
+
inferCategory: true,
|
|
149
|
+
generateTestCommands: true,
|
|
150
|
+
};
|
|
151
|
+
/**
|
|
152
|
+
* 파싱된 PRD를 FeatureList로 변환합니다
|
|
153
|
+
*
|
|
154
|
+
* @param parsedPrd 파싱된 PRD 결과
|
|
155
|
+
* @param options 변환 옵션
|
|
156
|
+
* @returns FeatureList 객체
|
|
157
|
+
*/
|
|
158
|
+
export function convertPrdToFeatureList(parsedPrd, options = {}) {
|
|
159
|
+
const mergedOptions = { ...DEFAULT_OPTIONS, ...options };
|
|
160
|
+
const features = convertToFeatures(parsedPrd.requirements, mergedOptions);
|
|
161
|
+
return {
|
|
162
|
+
project: {
|
|
163
|
+
name: parsedPrd.metadata?.projectName || 'Untitled Project',
|
|
164
|
+
version: parsedPrd.metadata?.version || '1.0.0',
|
|
165
|
+
description: `Generated from prd-taskmaster PRD (${parsedPrd.requirements.length} requirements)`,
|
|
166
|
+
totalFeatures: features.length,
|
|
167
|
+
completedFeatures: 0,
|
|
168
|
+
},
|
|
169
|
+
features,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* TaskmasterRequirement 배열을 Feature 배열로 변환합니다
|
|
174
|
+
*
|
|
175
|
+
* @param requirements 파싱된 요구사항 배열
|
|
176
|
+
* @param options 변환 옵션
|
|
177
|
+
* @returns Feature 배열
|
|
178
|
+
*/
|
|
179
|
+
export function convertToFeatures(requirements, options = DEFAULT_OPTIONS) {
|
|
180
|
+
const features = [];
|
|
181
|
+
const idMap = new Map(); // REQ-XXX -> CATEGORY-XXX 매핑
|
|
182
|
+
// 1단계: 모든 요구사항의 카테고리와 새 ID 결정
|
|
183
|
+
for (const req of requirements) {
|
|
184
|
+
const category = options.inferCategory
|
|
185
|
+
? inferCategory(req.title, req.description)
|
|
186
|
+
: 'feature';
|
|
187
|
+
const newId = generateFeatureId(category, features.length + idMap.size + 1);
|
|
188
|
+
idMap.set(req.id, newId);
|
|
189
|
+
}
|
|
190
|
+
// 2단계: Feature 객체 생성
|
|
191
|
+
for (const req of requirements) {
|
|
192
|
+
const newId = idMap.get(req.id);
|
|
193
|
+
const category = options.inferCategory
|
|
194
|
+
? inferCategory(req.title, req.description)
|
|
195
|
+
: 'feature';
|
|
196
|
+
const feature = createFeatureFromRequirement(req, newId, category, options, idMap);
|
|
197
|
+
features.push(feature);
|
|
198
|
+
}
|
|
199
|
+
return features;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* 개별 요구사항을 Feature로 변환합니다
|
|
203
|
+
*/
|
|
204
|
+
function createFeatureFromRequirement(req, newId, category, options, idMap) {
|
|
205
|
+
// 의존성 ID 변환
|
|
206
|
+
const dependsOn = req.dependencies
|
|
207
|
+
.map(depId => idMap.get(depId))
|
|
208
|
+
.filter((id) => id !== undefined);
|
|
209
|
+
// Task Hints를 notes로 변환
|
|
210
|
+
const taskNotes = formatTaskHintsAsNotes(req.taskBreakdown);
|
|
211
|
+
// testCommand 생성
|
|
212
|
+
const testCommand = options.generateTestCommands
|
|
213
|
+
? generateTestCommand(req.acceptanceCriteria, category)
|
|
214
|
+
: undefined;
|
|
215
|
+
return {
|
|
216
|
+
id: newId,
|
|
217
|
+
category,
|
|
218
|
+
priority: convertPriority(req.priority),
|
|
219
|
+
description: req.title,
|
|
220
|
+
acceptanceCriteria: req.acceptanceCriteria,
|
|
221
|
+
testCommand,
|
|
222
|
+
passes: false,
|
|
223
|
+
lastTestedAt: null,
|
|
224
|
+
implementedBy: null,
|
|
225
|
+
notes: taskNotes || undefined,
|
|
226
|
+
dependsOn: dependsOn.length > 0 ? dependsOn : undefined,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* 제목과 설명에서 카테고리를 추론합니다
|
|
231
|
+
*
|
|
232
|
+
* @param title 요구사항 제목
|
|
233
|
+
* @param description 요구사항 설명
|
|
234
|
+
* @returns 추론된 카테고리
|
|
235
|
+
*/
|
|
236
|
+
export function inferCategory(title, description) {
|
|
237
|
+
const text = `${title} ${description}`.toLowerCase();
|
|
238
|
+
// 우선순위 순서대로 매칭 (더 구체적인 카테고리 우선)
|
|
239
|
+
const priorityOrder = [
|
|
240
|
+
'auth',
|
|
241
|
+
'api',
|
|
242
|
+
'cli',
|
|
243
|
+
'ui',
|
|
244
|
+
'data',
|
|
245
|
+
'test',
|
|
246
|
+
'docs',
|
|
247
|
+
'devops',
|
|
248
|
+
'agent',
|
|
249
|
+
'claude',
|
|
250
|
+
'core',
|
|
251
|
+
'feature',
|
|
252
|
+
];
|
|
253
|
+
for (const category of priorityOrder) {
|
|
254
|
+
const patterns = CATEGORY_PATTERNS[category];
|
|
255
|
+
if (patterns.some(pattern => pattern.test(text))) {
|
|
256
|
+
return category;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return 'feature';
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Taskmaster 우선순위를 aiag 우선순위로 변환합니다
|
|
263
|
+
*
|
|
264
|
+
* @param priority Taskmaster 우선순위 (P0, P1, P2)
|
|
265
|
+
* @returns aiag 우선순위
|
|
266
|
+
*/
|
|
267
|
+
export function convertPriority(priority) {
|
|
268
|
+
return PRIORITY_MAP[priority] || 'medium';
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Feature ID를 생성합니다
|
|
272
|
+
*
|
|
273
|
+
* @param category 카테고리
|
|
274
|
+
* @param index 순서 번호
|
|
275
|
+
* @returns 생성된 ID (예: AUTH-001)
|
|
276
|
+
*/
|
|
277
|
+
export function generateFeatureId(category, index) {
|
|
278
|
+
const prefix = category.toUpperCase();
|
|
279
|
+
const number = String(index).padStart(3, '0');
|
|
280
|
+
return `${prefix}-${number}`;
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Acceptance Criteria와 카테고리를 기반으로 testCommand를 생성합니다
|
|
284
|
+
*
|
|
285
|
+
* @param criteria Acceptance Criteria 목록
|
|
286
|
+
* @param category 카테고리
|
|
287
|
+
* @returns 생성된 testCommand
|
|
288
|
+
*/
|
|
289
|
+
export function generateTestCommand(criteria, category) {
|
|
290
|
+
// 카테고리 기본 명령어 사용
|
|
291
|
+
const defaultCommand = DEFAULT_TEST_COMMANDS[category] || 'bun test';
|
|
292
|
+
// Acceptance Criteria에서 패턴 감지하여 추가 명령어 생성
|
|
293
|
+
const additionalChecks = [];
|
|
294
|
+
for (const criterion of criteria) {
|
|
295
|
+
// 파일 존재 체크 패턴
|
|
296
|
+
const fileMatch = criterion.match(/(?:create|exists?|file)\s+([^\s,]+\.[a-z]+)/i);
|
|
297
|
+
if (fileMatch) {
|
|
298
|
+
additionalChecks.push(`[ -f "${fileMatch[1]}" ]`);
|
|
299
|
+
}
|
|
300
|
+
// API 엔드포인트 패턴
|
|
301
|
+
const apiMatch = criterion.match(/(GET|POST|PUT|DELETE|PATCH)\s+([^\s]+)/i);
|
|
302
|
+
if (apiMatch) {
|
|
303
|
+
// API 테스트는 기본 테스트 명령어에 포함
|
|
304
|
+
break;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
// 추가 체크가 있으면 조합
|
|
308
|
+
if (additionalChecks.length > 0) {
|
|
309
|
+
return `${defaultCommand} && ${additionalChecks.join(' && ')}`;
|
|
310
|
+
}
|
|
311
|
+
return defaultCommand;
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Task Breakdown Hints를 notes 문자열로 포맷팅합니다
|
|
315
|
+
*/
|
|
316
|
+
function formatTaskHintsAsNotes(taskBreakdown) {
|
|
317
|
+
if (taskBreakdown.length === 0) {
|
|
318
|
+
return null;
|
|
319
|
+
}
|
|
320
|
+
const hints = taskBreakdown
|
|
321
|
+
.map(hint => `${hint.description} (${hint.complexity}, ${hint.estimatedHours}h)`)
|
|
322
|
+
.join(', ');
|
|
323
|
+
return `Task Hints: ${hints}`;
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* 의존성 그래프를 분석하여 순환 의존성을 감지합니다
|
|
327
|
+
*
|
|
328
|
+
* @param features Feature 배열
|
|
329
|
+
* @returns 순환 의존성이 있으면 해당 ID 쌍, 없으면 null
|
|
330
|
+
*/
|
|
331
|
+
export function detectCircularDependencies(features) {
|
|
332
|
+
const cycles = [];
|
|
333
|
+
const visited = new Set();
|
|
334
|
+
const recursionStack = new Set();
|
|
335
|
+
const featureMap = new Map(features.map(f => [f.id, f]));
|
|
336
|
+
function dfs(id, path) {
|
|
337
|
+
if (recursionStack.has(id)) {
|
|
338
|
+
// 순환 감지
|
|
339
|
+
const cycleStart = path.indexOf(id);
|
|
340
|
+
for (let i = cycleStart; i < path.length - 1; i++) {
|
|
341
|
+
cycles.push([path[i], path[i + 1]]);
|
|
342
|
+
}
|
|
343
|
+
return true;
|
|
344
|
+
}
|
|
345
|
+
if (visited.has(id)) {
|
|
346
|
+
return false;
|
|
347
|
+
}
|
|
348
|
+
visited.add(id);
|
|
349
|
+
recursionStack.add(id);
|
|
350
|
+
const feature = featureMap.get(id);
|
|
351
|
+
if (feature?.dependsOn) {
|
|
352
|
+
for (const depId of feature.dependsOn) {
|
|
353
|
+
dfs(depId, [...path, depId]);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
recursionStack.delete(id);
|
|
357
|
+
return false;
|
|
358
|
+
}
|
|
359
|
+
for (const feature of features) {
|
|
360
|
+
if (!visited.has(feature.id)) {
|
|
361
|
+
dfs(feature.id, [feature.id]);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
return cycles.length > 0 ? cycles : null;
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* 변환 결과 통계를 반환합니다
|
|
368
|
+
*/
|
|
369
|
+
export function getConversionStats(features) {
|
|
370
|
+
const byCategory = {};
|
|
371
|
+
const byPriority = {
|
|
372
|
+
critical: 0,
|
|
373
|
+
high: 0,
|
|
374
|
+
medium: 0,
|
|
375
|
+
low: 0,
|
|
376
|
+
};
|
|
377
|
+
let withDependencies = 0;
|
|
378
|
+
let withTestCommands = 0;
|
|
379
|
+
for (const feature of features) {
|
|
380
|
+
// 카테고리별
|
|
381
|
+
byCategory[feature.category] = (byCategory[feature.category] || 0) + 1;
|
|
382
|
+
// 우선순위별
|
|
383
|
+
byPriority[feature.priority]++;
|
|
384
|
+
// 의존성 있는 항목
|
|
385
|
+
if (feature.dependsOn && feature.dependsOn.length > 0) {
|
|
386
|
+
withDependencies++;
|
|
387
|
+
}
|
|
388
|
+
// testCommand 있는 항목
|
|
389
|
+
if (feature.testCommand) {
|
|
390
|
+
withTestCommands++;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
return {
|
|
394
|
+
total: features.length,
|
|
395
|
+
byCategory,
|
|
396
|
+
byPriority,
|
|
397
|
+
withDependencies,
|
|
398
|
+
withTestCommands,
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
//# sourceMappingURL=taskmasterConverter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taskmasterConverter.js","sourceRoot":"","sources":["../../src/utils/taskmasterConverter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* prd-taskmaster PRD 파서
|
|
3
|
+
*
|
|
4
|
+
* prd-taskmaster가 생성하는 구조화된 PRD를 파싱하여
|
|
5
|
+
* TaskmasterRequirement 객체 배열로 변환합니다.
|
|
6
|
+
*/
|
|
7
|
+
import type { TaskmasterRequirement, TaskmasterPriority, TaskHint, ParsedPrd } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* prd-taskmaster PRD를 파싱합니다
|
|
10
|
+
*
|
|
11
|
+
* @param content PRD 파일 전체 내용
|
|
12
|
+
* @returns 파싱된 PRD 결과
|
|
13
|
+
*/
|
|
14
|
+
export declare function parseTaskmasterPrd(content: string): ParsedPrd;
|
|
15
|
+
/**
|
|
16
|
+
* Acceptance Criteria 체크리스트 항목들을 추출합니다
|
|
17
|
+
*/
|
|
18
|
+
export declare function extractChecklistItems(block: string): string[];
|
|
19
|
+
/**
|
|
20
|
+
* Task Breakdown Hints를 추출합니다
|
|
21
|
+
*/
|
|
22
|
+
export declare function extractTaskBreakdown(block: string): TaskHint[];
|
|
23
|
+
/**
|
|
24
|
+
* 요구사항 개수를 우선순위별로 집계합니다
|
|
25
|
+
*/
|
|
26
|
+
export declare function countRequirementsByPriority(requirements: TaskmasterRequirement[]): Record<TaskmasterPriority, number>;
|
|
27
|
+
/**
|
|
28
|
+
* 요구사항 ID 목록을 반환합니다
|
|
29
|
+
*/
|
|
30
|
+
export declare function getRequirementIds(requirements: TaskmasterRequirement[]): string[];
|
|
31
|
+
/**
|
|
32
|
+
* 특정 ID의 요구사항을 찾습니다
|
|
33
|
+
*/
|
|
34
|
+
export declare function findRequirementById(requirements: TaskmasterRequirement[], id: string): TaskmasterRequirement | undefined;
|
|
35
|
+
//# sourceMappingURL=taskmasterParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taskmasterParser.d.ts","sourceRoot":"","sources":["../../src/utils/taskmasterParser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,qBAAqB,EACrB,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACV,MAAM,aAAa,CAAC;AA6CrB;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAmB7D;AA2HD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAqB7D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,EAAE,CA0B9D;AAyDD;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,YAAY,EAAE,qBAAqB,EAAE,GACpC,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAMpC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,qBAAqB,EAAE,GAAG,MAAM,EAAE,CAEjF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,qBAAqB,EAAE,EACrC,EAAE,EAAE,MAAM,GACT,qBAAqB,GAAG,SAAS,CAEnC"}
|