@bicorne/task-flow 0.2.0 → 0.2.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 (56) hide show
  1. package/README.md +2 -4
  2. package/SKILL.md +2 -4
  3. package/dist/commands/analyze.js +160 -318
  4. package/dist/commands/archive.js +44 -48
  5. package/dist/commands/design.js +225 -400
  6. package/dist/commands/extract.js +174 -303
  7. package/dist/commands/init.js +103 -147
  8. package/dist/commands/merge/index.js +184 -295
  9. package/dist/commands/merge/merger.js +112 -134
  10. package/dist/commands/merge/types.js +3 -5
  11. package/dist/commands/merge/validators.js +115 -132
  12. package/dist/commands/merge.js +46 -13
  13. package/dist/commands/start.js +155 -248
  14. package/dist/commands/status.js +68 -129
  15. package/dist/commands/sync.js +37 -53
  16. package/dist/commands/tasks-gen/doc-parser.js +148 -228
  17. package/dist/commands/tasks-gen/generators.js +104 -116
  18. package/dist/commands/tasks-gen/index.js +206 -314
  19. package/dist/commands/tasks-gen/parsers.js +131 -232
  20. package/dist/commands/tasks-gen/templates.js +9 -10
  21. package/dist/commands/tasks-gen/types.js +36 -14
  22. package/dist/commands/tasks-gen/validators.js +33 -49
  23. package/dist/commands/tasks.js +58 -20
  24. package/dist/commands/worktree.js +167 -249
  25. package/dist/hooks/check-prd-exists.js +45 -55
  26. package/dist/hooks/check-worktree-conflict.js +68 -101
  27. package/dist/hooks/hook-runner/executor.js +134 -126
  28. package/dist/hooks/hook-runner/index.js +181 -196
  29. package/dist/hooks/hook-runner/loader.js +74 -113
  30. package/dist/hooks/hook-runner/types.js +3 -5
  31. package/dist/hooks/hook-runner.js +94 -28
  32. package/dist/hooks/phase-complete-detector.js +125 -191
  33. package/dist/hooks/phase-gate-validator.js +315 -376
  34. package/dist/hooks/save-checkpoint.js +87 -130
  35. package/dist/hooks/start-mcp-servers.js +50 -65
  36. package/dist/hooks/stop-mcp-servers.js +40 -49
  37. package/dist/index.js +84 -153
  38. package/dist/lib/archive.js +126 -209
  39. package/dist/lib/config.js +141 -226
  40. package/dist/lib/constants.js +155 -145
  41. package/dist/lib/interactive.js +98 -148
  42. package/dist/lib/mcp-client.js +197 -320
  43. package/dist/lib/state.js +142 -253
  44. package/dist/slash/executor.js +299 -330
  45. package/dist/slash/index.js +69 -43
  46. package/dist/slash/parser.js +84 -97
  47. package/dist/slash/registry.js +100 -88
  48. package/dist/spec/openspec-to-task/builders.js +96 -109
  49. package/dist/spec/openspec-to-task/index.js +112 -173
  50. package/dist/spec/openspec-to-task/parsers.js +148 -219
  51. package/dist/spec/openspec-to-task/types.js +3 -5
  52. package/dist/spec/sync-openspec-to-task.js +47 -19
  53. package/dist/spec/sync-task-to-openspec.js +241 -272
  54. package/dist/types/ai-context.js +3 -8
  55. package/package.json +8 -6
  56. package/references/CLI-TUTORIAL.md +4 -10
@@ -1,91 +1,47 @@
1
- "use strict";
2
- /**
3
- * commands/extract.ts
4
- * Extract project requirements and generate PRD document
5
- *
6
- * This command is AI-only - use it to summarize existing projects
7
- * and generate structured Product Requirement Documents.
8
- */
9
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- var desc = Object.getOwnPropertyDescriptor(m, k);
12
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
- desc = { enumerable: true, get: function() { return m[k]; } };
14
- }
15
- Object.defineProperty(o, k2, desc);
16
- }) : (function(o, m, k, k2) {
17
- if (k2 === undefined) k2 = k;
18
- o[k2] = m[k];
19
- }));
20
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
- Object.defineProperty(o, "default", { enumerable: true, value: v });
22
- }) : function(o, v) {
23
- o["default"] = v;
24
- });
25
- var __importStar = (this && this.__importStar) || (function () {
26
- var ownKeys = function(o) {
27
- ownKeys = Object.getOwnPropertyNames || function (o) {
28
- var ar = [];
29
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
- return ar;
31
- };
32
- return ownKeys(o);
33
- };
34
- return function (mod) {
35
- if (mod && mod.__esModule) return mod;
36
- var result = {};
37
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
- __setModuleDefault(result, mod);
39
- return result;
1
+ function e(r) {
2
+ return "function" != typeof WeakMap ? null : (e = function(e) {
3
+ return new WeakMap();
4
+ })(r);
5
+ }
6
+ function r(r, t) {
7
+ var n, s, o;
8
+ if (!t && r && r.__esModule) return r;
9
+ if (null === r || "object" != typeof r && "function" != typeof r) return {
10
+ default: r
40
11
  };
41
- })();
42
- Object.defineProperty(exports, "__esModule", { value: true });
43
- exports.extract = extract;
44
- exports.main = main;
45
- const fs = __importStar(require("fs"));
46
- const path = __importStar(require("path"));
47
- const config_1 = require("../lib/config");
48
- function parseArgs(argv) {
49
- const args = {};
50
- for (let i = 2; i < argv.length; i += 1) {
51
- const token = argv[i] || '';
52
- if (!token.startsWith('--')) {
53
- continue;
54
- }
55
- const key = token.slice(2);
56
- const next = argv[i + 1] || '';
57
- if (!next || next.startsWith('--')) {
58
- args[key] = true;
59
- continue;
60
- }
61
- args[key] = next;
62
- i += 1;
12
+ if ((n = e(t)) && n.has(r)) return n.get(r);
13
+ for(var i in s = {
14
+ __proto__: null
15
+ }, o = Object.defineProperty && Object.getOwnPropertyDescriptor, r)if ("default" !== i && Object.prototype.hasOwnProperty.call(r, i)) {
16
+ var a = o ? Object.getOwnPropertyDescriptor(r, i) : null;
17
+ a && (a.get || a.set) ? Object.defineProperty(s, i, a) : s[i] = r[i];
63
18
  }
64
- return args;
19
+ return s.default = r, n && n.set(r, s), s;
65
20
  }
66
- function loadTemplate(name) {
67
- const templatePath = path.resolve(__dirname, '../../assets', name);
68
- if (fs.existsSync(templatePath)) {
69
- return fs.readFileSync(templatePath, 'utf8');
70
- }
21
+ function t(e, r, t, n, s, o) {
22
+ let i = o?.type || 'feat', a = o?.priority || 'medium', c = s?.architectureSummary ? `### 架构现状\n\n${s.architectureSummary}\n` : '', l = s?.risks && s.risks.length > 0 ? `### 潜在风险\n\n${s.risks.map((e)=>`- ${e}`).join('\n')}\n` : '', u = s?.suggestions && s.suggestions.length > 0 ? `### 改进建议\n\n${s.suggestions.map((e)=>`- ${e}`).join('\n')}\n` : '', g = o?.affectedFiles && o.affectedFiles.length > 0 ? `### 涉及文件\n\n${o.affectedFiles.map((e)=>`- \`${e}\``).join('\n')}\n` : '', p = o?.constraints && o.constraints.length > 0 ? o.constraints.map((e)=>`- ${e}`).join('\n') : '<!-- 技术、业务或时间约束 -->';
71
23
  return `# 产品需求文档
72
24
 
73
25
  ## 文档基础信息(Meta Data)
74
26
 
75
27
  | 字段 | 内容 |
76
28
  |------|------|
77
- | 项目名称 | <!-- 项目名称 --> |
29
+ | 项目名称 | ${r || '<!-- 项目名称 -->'} |
30
+ | 任务类型 | ${i} |
31
+ | 优先级 | ${a} |
78
32
  | 版本 | v1.0.0 |
79
- | 创建日期 | <!-- YYYY-MM-DD --> |
80
- | 作者 | <!-- 作者 --> |
33
+ | 创建日期 | ${new Date().toISOString().split('T')[0]} |
34
+ | 作者 | AI Agent |
81
35
  | 文档状态 | 草稿 |
82
36
  | 评审人 | <!-- 评审人列表 --> |
83
37
 
84
38
  ## 项目背景与目标(Why)
85
39
 
86
40
  ### 背景
87
- <!-- 描述项目背景和动机,当前存在的问题或痛点 -->
88
41
 
42
+ ${t || e || '<!-- 描述项目背景和动机,当前存在的问题或痛点 -->'}
43
+
44
+ ${c}${l}${u}
89
45
  ### 目标
90
46
  <!-- 描述项目要达成的核心目标,可量化指标优先 -->
91
47
 
@@ -112,7 +68,8 @@ function loadTemplate(name) {
112
68
  <!-- 描述核心业务流程 -->
113
69
 
114
70
  ### 约束条件
115
- <!-- 技术、业务或时间约束 -->
71
+
72
+ ${p}
116
73
 
117
74
  ## 详细功能需求(What)
118
75
 
@@ -126,6 +83,7 @@ function loadTemplate(name) {
126
83
  ### 功能详细说明
127
84
  <!-- 对每个功能进行详细说明 -->
128
85
 
86
+ ${g}
129
87
  ## 非功能性需求
130
88
 
131
89
  ### 性能需求
@@ -152,133 +110,87 @@ function loadTemplate(name) {
152
110
  <!-- 数据埋点、A/B 测试、迭代计划 -->
153
111
  `;
154
112
  }
155
- function toChangeName(input) {
156
- const sanitized = String(input || '')
157
- .trim()
158
- .replace(/[^a-zA-Z0-9-_]/g, '-')
159
- .replace(/-+/g, '-')
160
- .replace(/^-|-$/g, '');
161
- if (sanitized.includes('..') || sanitized.startsWith('/')) {
162
- return '';
163
- }
164
- return sanitized;
165
- }
166
- function readStdin() {
167
- return new Promise((resolve, reject) => {
168
- const chunks = [];
169
- process.stdin.setEncoding('utf8');
170
- process.stdin.on('readable', () => {
171
- let chunk;
172
- while ((chunk = process.stdin.read()) !== null) {
173
- chunks.push(chunk);
174
- }
175
- });
176
- process.stdin.on('end', () => {
177
- resolve(chunks.join(''));
178
- });
179
- process.stdin.on('error', (error) => {
180
- reject(error);
113
+ async function n(e = {}) {
114
+ let r, s = (0, u.loadConfig)({
115
+ cwd: e.cwd
116
+ }), o = (r = String(e.change || '').trim().replace(/[^a-zA-Z0-9-_]/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '')).includes('..') || r.startsWith('/') ? '' : r;
117
+ if (!o) return {
118
+ success: !1,
119
+ reason: 'missing-change',
120
+ message: 'Missing required argument: --change <change-name>'
121
+ };
122
+ let i = s.projectRoot ? {
123
+ valid: !0
124
+ } : {
125
+ valid: !1,
126
+ reason: 'missing-project-root',
127
+ message: 'Config missing projectRoot'
128
+ };
129
+ if (!i.valid) return {
130
+ success: !1,
131
+ reason: i.reason,
132
+ message: i.message || 'Unknown config validation error'
133
+ };
134
+ let a = s.projectRoot || process.cwd(), g = s.specRootAbs || l.resolve(a, 'spec'), p = l.resolve(g, 'changes', o), d = l.resolve(p, 'product-requirement.md');
135
+ if (c.existsSync(p) && !e.force) return {
136
+ success: !1,
137
+ reason: 'already-exists',
138
+ message: `Change directory already exists: ${p}. Use --force to overwrite.`
139
+ };
140
+ try {
141
+ let r;
142
+ c.mkdirSync(p, {
143
+ recursive: !0
181
144
  });
182
- // Timeout after 5 seconds if no data
183
- setTimeout(() => {
184
- if (chunks.length === 0) {
185
- reject(new Error('Stdin timeout: no data received'));
186
- }
187
- }, 5000);
188
- });
189
- }
190
- function generatePrdContent(aiInput, context) {
191
- const templateContent = loadTemplate('product-requirement.md');
192
- // Pre-fill from context file if provided
193
- const projectName = context?.project.name || '';
194
- const projectDesc = context?.project.description || '';
195
- const techStack = context?.project.techStack;
196
- const analysis = context?.analysis;
197
- const taskInfo = context?.task;
198
- // If AI provides analysis input, integrate it into the template
199
- if (aiInput) {
200
- // Try to parse as structured JSON first
201
- try {
202
- const parsed = JSON.parse(aiInput);
203
- let content = templateContent;
204
- if (parsed.projectName || projectName) {
205
- content = content.replace('<!-- 项目名称 -->', parsed.projectName || projectName);
206
- }
207
- if (parsed.background) {
208
- content = content.replace('<!-- 描述项目背景和动机,当前存在的问题或痛点 -->', parsed.background);
209
- }
210
- if (parsed.goals) {
211
- const goalsText = Array.isArray(parsed.goals) ? parsed.goals.join('\n') : parsed.goals;
212
- content = content.replace('<!-- 描述项目要达成的核心目标,可量化指标优先 -->', goalsText);
213
- }
214
- if (parsed.users) {
215
- const usersText = Array.isArray(parsed.users) ? parsed.users.join('\n') : parsed.users;
216
- content = content.replace('<!-- 描述目标用户群体及其特征 -->', usersText);
217
- }
218
- if (parsed.scenarios) {
219
- const scenariosText = Array.isArray(parsed.scenarios) ? parsed.scenarios.join('\n') : parsed.scenarios;
220
- content = content.replace('<!-- 描述典型使用场景和用户旅程 -->', scenariosText);
221
- }
222
- if (parsed.architecture) {
223
- content = content.replace('<!-- 描述系统整体架构设计 -->', parsed.architecture);
224
- }
225
- if (parsed.features) {
226
- const featuresText = Array.isArray(parsed.features) ? parsed.features.join('\n') : parsed.features;
227
- content = content.replace('<!-- 以表格或列表形式列出所有功能需求 -->', featuresText);
228
- }
229
- return content;
145
+ let n = e.input;
146
+ if (e.contextFile) try {
147
+ let t = c.readFileSync(e.contextFile, 'utf8');
148
+ r = JSON.parse(t);
149
+ } catch (r) {
150
+ let e = r instanceof Error ? r.message : 'Unknown error';
151
+ return {
152
+ success: !1,
153
+ reason: 'invalid-context-file',
154
+ message: `Failed to parse context file: ${e}`
155
+ };
230
156
  }
231
- catch {
232
- // If not valid JSON, treat as plain text analysis
233
- return generatePrdFromText(aiInput, projectName, projectDesc, techStack, analysis, taskInfo);
157
+ if (!n && !process.stdin.isTTY && require.main === module) try {
158
+ (n = await new Promise((e, r)=>{
159
+ let t = [];
160
+ process.stdin.setEncoding('utf8'), process.stdin.on('readable', ()=>{
161
+ let e;
162
+ for(; null !== (e = process.stdin.read());)t.push(e);
163
+ }), process.stdin.on('end', ()=>{
164
+ e(t.join(''));
165
+ }), process.stdin.on('error', (e)=>{
166
+ r(e);
167
+ }), setTimeout(()=>{
168
+ 0 === t.length && r(Error('Stdin timeout: no data received'));
169
+ }, 5000);
170
+ })).trim() ? console.log(`[EXTRACT] Received ${n.length} bytes from stdin`) : n = void 0;
171
+ } catch (r) {
172
+ let e = r instanceof Error ? r.message : 'Unknown error';
173
+ console.warn(`[EXTRACT] Warning: Failed to read stdin: ${e}`), n = void 0;
234
174
  }
235
- }
236
- // No AI input, use context file to pre-fill template if available
237
- return generatePrdFromText(undefined, projectName, projectDesc, techStack, analysis, taskInfo);
238
- }
239
- function generatePrdFromText(aiInput, projectName, projectDesc, _techStack, analysis, taskInfo) {
240
- const taskType = taskInfo?.type || 'feat';
241
- const taskPriority = taskInfo?.priority || 'medium';
242
- const backgroundSection = projectDesc
243
- || aiInput
244
- || '<!-- 描述项目背景和动机,当前存在的问题或痛点 -->';
245
- const architectureSection = analysis?.architectureSummary
246
- ? `### 架构现状\n\n${analysis.architectureSummary}\n`
247
- : '';
248
- const risksSection = analysis?.risks && analysis.risks.length > 0
249
- ? `### 潜在风险\n\n${analysis.risks.map((r) => `- ${r}`).join('\n')}\n`
250
- : '';
251
- const suggestionsSection = analysis?.suggestions && analysis.suggestions.length > 0
252
- ? `### 改进建议\n\n${analysis.suggestions.map((s) => `- ${s}`).join('\n')}\n`
253
- : '';
254
- const affectedFiles = taskInfo?.affectedFiles && taskInfo.affectedFiles.length > 0
255
- ? `### 涉及文件\n\n${taskInfo.affectedFiles.map((f) => `- \`${f}\``).join('\n')}\n`
256
- : '';
257
- const constraints = taskInfo?.constraints && taskInfo.constraints.length > 0
258
- ? taskInfo.constraints.map((c) => `- ${c}`).join('\n')
259
- : '<!-- 技术、业务或时间约束 -->';
260
- return `# 产品需求文档
175
+ let s = function(e, r) {
176
+ let n, s = (n = l.resolve(__dirname, '../../assets', 'product-requirement.md'), c.existsSync(n) ? c.readFileSync(n, 'utf8') : `# 产品需求文档
261
177
 
262
178
  ## 文档基础信息(Meta Data)
263
179
 
264
180
  | 字段 | 内容 |
265
181
  |------|------|
266
- | 项目名称 | ${projectName || '<!-- 项目名称 -->'} |
267
- | 任务类型 | ${taskType} |
268
- | 优先级 | ${taskPriority} |
182
+ | 项目名称 | <!-- 项目名称 --> |
269
183
  | 版本 | v1.0.0 |
270
- | 创建日期 | ${new Date().toISOString().split('T')[0]} |
271
- | 作者 | AI Agent |
184
+ | 创建日期 | <!-- YYYY-MM-DD --> |
185
+ | 作者 | <!-- 作者 --> |
272
186
  | 文档状态 | 草稿 |
273
187
  | 评审人 | <!-- 评审人列表 --> |
274
188
 
275
189
  ## 项目背景与目标(Why)
276
190
 
277
191
  ### 背景
192
+ <!-- 描述项目背景和动机,当前存在的问题或痛点 -->
278
193
 
279
- ${backgroundSection}
280
-
281
- ${architectureSection}${risksSection}${suggestionsSection}
282
194
  ### 目标
283
195
  <!-- 描述项目要达成的核心目标,可量化指标优先 -->
284
196
 
@@ -305,8 +217,7 @@ ${architectureSection}${risksSection}${suggestionsSection}
305
217
  <!-- 描述核心业务流程 -->
306
218
 
307
219
  ### 约束条件
308
-
309
- ${constraints}
220
+ <!-- 技术、业务或时间约束 -->
310
221
 
311
222
  ## 详细功能需求(What)
312
223
 
@@ -320,7 +231,6 @@ ${constraints}
320
231
  ### 功能详细说明
321
232
  <!-- 对每个功能进行详细说明 -->
322
233
 
323
- ${affectedFiles}
324
234
  ## 非功能性需求
325
235
 
326
236
  ### 性能需求
@@ -345,133 +255,94 @@ ${affectedFiles}
345
255
 
346
256
  ### 运营计划
347
257
  <!-- 数据埋点、A/B 测试、迭代计划 -->
348
- `;
349
- }
350
- function validateConfigForExtract(config) {
351
- if (!config.projectRoot) {
352
- return {
353
- valid: false,
354
- reason: 'missing-project-root',
355
- message: 'Config missing projectRoot',
356
- };
357
- }
358
- return { valid: true };
359
- }
360
- async function extract(options = {}) {
361
- const config = (0, config_1.loadConfig)({ cwd: options.cwd });
362
- const changeName = toChangeName(options.change);
363
- if (!changeName) {
364
- return {
365
- success: false,
366
- reason: 'missing-change',
367
- message: 'Missing required argument: --change <change-name>',
368
- };
369
- }
370
- const configValidation = validateConfigForExtract(config);
371
- if (!configValidation.valid) {
372
- return {
373
- success: false,
374
- reason: configValidation.reason,
375
- message: configValidation.message || 'Unknown config validation error',
376
- };
377
- }
378
- const projectRoot = config.projectRoot || process.cwd();
379
- const specRoot = config.specRootAbs || path.resolve(projectRoot, 'spec');
380
- const changeDir = path.resolve(specRoot, 'changes', changeName);
381
- const prdPath = path.resolve(changeDir, 'product-requirement.md');
382
- if (fs.existsSync(changeDir) && !options.force) {
383
- return {
384
- success: false,
385
- reason: 'already-exists',
386
- message: `Change directory already exists: ${changeDir}. Use --force to overwrite.`,
387
- };
388
- }
389
- try {
390
- fs.mkdirSync(changeDir, { recursive: true });
391
- // Determine AI input source: --input parameter, stdin, or --context-file
392
- // Only read stdin when running as CLI (not when called programmatically from tests)
393
- let aiInput = options.input;
394
- let contextData;
395
- // Load context file if provided
396
- if (options.contextFile) {
397
- try {
398
- const contextContent = fs.readFileSync(options.contextFile, 'utf8');
399
- contextData = JSON.parse(contextContent);
400
- }
401
- catch (error) {
402
- const errorMessage = error instanceof Error ? error.message : 'Unknown error';
403
- return {
404
- success: false,
405
- reason: 'invalid-context-file',
406
- message: `Failed to parse context file: ${errorMessage}`,
407
- };
408
- }
409
- }
410
- if (!aiInput && !process.stdin.isTTY && require.main === module) {
411
- try {
412
- aiInput = await readStdin();
413
- if (aiInput.trim()) {
414
- console.log(`[EXTRACT] Received ${aiInput.length} bytes from stdin`);
258
+ `), o = r?.project.name || '', i = r?.project.description || '', a = r?.project.techStack, u = r?.analysis, g = r?.task;
259
+ if (e) try {
260
+ let r = JSON.parse(e), t = s;
261
+ if ((r.projectName || o) && (t = t.replace('<!-- 项目名称 -->', r.projectName || o)), r.background && (t = t.replace('<!-- 描述项目背景和动机,当前存在的问题或痛点 -->', r.background)), r.goals) {
262
+ let e = Array.isArray(r.goals) ? r.goals.join('\n') : r.goals;
263
+ t = t.replace('<!-- 描述项目要达成的核心目标,可量化指标优先 -->', e);
415
264
  }
416
- else {
417
- aiInput = undefined;
265
+ if (r.users) {
266
+ let e = Array.isArray(r.users) ? r.users.join('\n') : r.users;
267
+ t = t.replace('<!-- 描述目标用户群体及其特征 -->', e);
418
268
  }
269
+ if (r.scenarios) {
270
+ let e = Array.isArray(r.scenarios) ? r.scenarios.join('\n') : r.scenarios;
271
+ t = t.replace('<!-- 描述典型使用场景和用户旅程 -->', e);
272
+ }
273
+ if (r.architecture && (t = t.replace('<!-- 描述系统整体架构设计 -->', r.architecture)), r.features) {
274
+ let e = Array.isArray(r.features) ? r.features.join('\n') : r.features;
275
+ t = t.replace('<!-- 以表格或列表形式列出所有功能需求 -->', e);
276
+ }
277
+ return t;
278
+ } catch {
279
+ return t(e, o, i, a, u, g);
419
280
  }
420
- catch (error) {
421
- const errorMessage = error instanceof Error ? error.message : 'Unknown error';
422
- console.warn(`[EXTRACT] Warning: Failed to read stdin: ${errorMessage}`);
423
- aiInput = undefined;
424
- }
425
- }
426
- const prdContent = generatePrdContent(aiInput, contextData);
427
- fs.writeFileSync(prdPath, prdContent, 'utf8');
428
- }
429
- catch (error) {
430
- const errorMessage = error instanceof Error ? error.message : 'Unknown error';
281
+ return t(void 0, o, i, a, u, g);
282
+ }(n, r);
283
+ c.writeFileSync(d, s, 'utf8');
284
+ } catch (r) {
285
+ let e = r instanceof Error ? r.message : 'Unknown error';
431
286
  return {
432
- success: false,
287
+ success: !1,
433
288
  reason: 'file-write-error',
434
- message: `Failed to create PRD: ${errorMessage}`,
289
+ message: `Failed to create PRD: ${e}`
435
290
  };
436
291
  }
437
292
  return {
438
- success: true,
439
- changeName,
440
- changeDir,
441
- prdPath,
293
+ success: !0,
294
+ changeName: o,
295
+ changeDir: p,
296
+ prdPath: d
442
297
  };
443
298
  }
444
- async function main() {
445
- const args = parseArgs(process.argv);
446
- const result = await extract({
447
- cwd: args.cwd,
448
- change: args.change,
449
- type: args.type,
450
- priority: args.priority,
451
- force: args.force === true,
452
- input: args.input,
453
- contextFile: args['context-file'],
299
+ async function s() {
300
+ let e = function(e) {
301
+ let r = {};
302
+ for(let t = 2; t < e.length; t += 1){
303
+ let n = e[t] || '';
304
+ if (!n.startsWith('--')) continue;
305
+ let s = n.slice(2), o = e[t + 1] || '';
306
+ if (!o || o.startsWith('--')) {
307
+ r[s] = !0;
308
+ continue;
309
+ }
310
+ r[s] = o, t += 1;
311
+ }
312
+ return r;
313
+ }(process.argv), r = await n({
314
+ cwd: e.cwd,
315
+ change: e.change,
316
+ type: e.type,
317
+ priority: e.priority,
318
+ force: !0 === e.force,
319
+ input: e.input,
320
+ contextFile: e['context-file']
454
321
  });
455
- if (!result.success) {
456
- console.error(`[EXTRACT] ${result.message}`);
457
- process.exit(1);
458
- }
459
- console.log('');
460
- console.log('[EXTRACT] PRD document created successfully!');
461
- console.log(` Change Name: ${result.changeName}`);
462
- console.log(` Directory: ${result.changeDir}`);
463
- console.log(` PRD: ${result.prdPath}`);
464
- console.log('');
465
- console.log('Next steps:');
466
- console.log(' 1. Edit product-requirement.md to describe your requirements');
467
- console.log(' 2. Run: task-flow design --change <change-name>');
468
- console.log('');
469
- process.exit(0);
470
- }
471
- if (require.main === module) {
472
- main();
322
+ r.success || (console.error(`[EXTRACT] ${r.message}`), process.exit(1)), console.log(''), console.log('[EXTRACT] PRD document created successfully!'), console.log(` Change Name: ${r.changeName}`), console.log(` Directory: ${r.changeDir}`), console.log(` PRD: ${r.prdPath}`), console.log(''), console.log('Next steps:'), console.log(' 1. Edit product-requirement.md to describe your requirements'), console.log(' 2. Run: task-flow design --change <change-name>'), console.log(''), process.exit(0);
473
323
  }
474
- exports.default = {
475
- extract,
476
- main,
324
+ "use strict";
325
+ Object.defineProperty(exports, "__esModule", {
326
+ value: !0
327
+ });
328
+ var o = exports, i = {
329
+ get default () {
330
+ return g;
331
+ },
332
+ get extract () {
333
+ return n;
334
+ },
335
+ get main () {
336
+ return s;
337
+ }
338
+ };
339
+ for(var a in i)Object.defineProperty(o, a, {
340
+ enumerable: !0,
341
+ get: Object.getOwnPropertyDescriptor(i, a).get
342
+ });
343
+ let c = /*#__PURE__*/ r(require("fs")), l = /*#__PURE__*/ r(require("path")), u = require("../lib/config");
344
+ require.main === module && s();
345
+ let g = {
346
+ extract: n,
347
+ main: s
477
348
  };