spec-agent 1.0.3

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 (86) hide show
  1. package/README.md +256 -0
  2. package/bin/spec-agent.js +14 -0
  3. package/dist/commands/analyze.d.ts +16 -0
  4. package/dist/commands/analyze.d.ts.map +1 -0
  5. package/dist/commands/analyze.js +283 -0
  6. package/dist/commands/analyze.js.map +1 -0
  7. package/dist/commands/clean.d.ts +9 -0
  8. package/dist/commands/clean.d.ts.map +1 -0
  9. package/dist/commands/clean.js +109 -0
  10. package/dist/commands/clean.js.map +1 -0
  11. package/dist/commands/dispatch.d.ts +12 -0
  12. package/dist/commands/dispatch.d.ts.map +1 -0
  13. package/dist/commands/dispatch.js +232 -0
  14. package/dist/commands/dispatch.js.map +1 -0
  15. package/dist/commands/doctor.d.ts +9 -0
  16. package/dist/commands/doctor.d.ts.map +1 -0
  17. package/dist/commands/doctor.js +153 -0
  18. package/dist/commands/doctor.js.map +1 -0
  19. package/dist/commands/learn.d.ts +13 -0
  20. package/dist/commands/learn.d.ts.map +1 -0
  21. package/dist/commands/learn.js +234 -0
  22. package/dist/commands/learn.js.map +1 -0
  23. package/dist/commands/merge.d.ts +11 -0
  24. package/dist/commands/merge.d.ts.map +1 -0
  25. package/dist/commands/merge.js +335 -0
  26. package/dist/commands/merge.js.map +1 -0
  27. package/dist/commands/pipeline.d.ts +19 -0
  28. package/dist/commands/pipeline.d.ts.map +1 -0
  29. package/dist/commands/pipeline.js +266 -0
  30. package/dist/commands/pipeline.js.map +1 -0
  31. package/dist/commands/plan.d.ts +13 -0
  32. package/dist/commands/plan.d.ts.map +1 -0
  33. package/dist/commands/plan.js +314 -0
  34. package/dist/commands/plan.js.map +1 -0
  35. package/dist/commands/scan.d.ts +28 -0
  36. package/dist/commands/scan.d.ts.map +1 -0
  37. package/dist/commands/scan.js +488 -0
  38. package/dist/commands/scan.js.map +1 -0
  39. package/dist/commands/status.d.ts +8 -0
  40. package/dist/commands/status.d.ts.map +1 -0
  41. package/dist/commands/status.js +146 -0
  42. package/dist/commands/status.js.map +1 -0
  43. package/dist/index.d.ts +2 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +126 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/services/document-parser.d.ts +49 -0
  48. package/dist/services/document-parser.d.ts.map +1 -0
  49. package/dist/services/document-parser.js +499 -0
  50. package/dist/services/document-parser.js.map +1 -0
  51. package/dist/services/llm.d.ts +61 -0
  52. package/dist/services/llm.d.ts.map +1 -0
  53. package/dist/services/llm.js +716 -0
  54. package/dist/services/llm.js.map +1 -0
  55. package/dist/types.d.ts +159 -0
  56. package/dist/types.d.ts.map +1 -0
  57. package/dist/types.js +4 -0
  58. package/dist/types.js.map +1 -0
  59. package/dist/utils/file.d.ts +10 -0
  60. package/dist/utils/file.d.ts.map +1 -0
  61. package/dist/utils/file.js +96 -0
  62. package/dist/utils/file.js.map +1 -0
  63. package/dist/utils/logger.d.ts +13 -0
  64. package/dist/utils/logger.d.ts.map +1 -0
  65. package/dist/utils/logger.js +55 -0
  66. package/dist/utils/logger.js.map +1 -0
  67. package/package.json +48 -0
  68. package/scripts/publish-npm.js +174 -0
  69. package/spec-agent-implementation.md +750 -0
  70. package/src/commands/analyze.ts +322 -0
  71. package/src/commands/clean.ts +88 -0
  72. package/src/commands/dispatch.ts +250 -0
  73. package/src/commands/doctor.ts +136 -0
  74. package/src/commands/learn.ts +261 -0
  75. package/src/commands/merge.ts +377 -0
  76. package/src/commands/pipeline.ts +306 -0
  77. package/src/commands/plan.ts +331 -0
  78. package/src/commands/scan.ts +568 -0
  79. package/src/commands/status.ts +129 -0
  80. package/src/index.ts +137 -0
  81. package/src/services/document-parser.ts +548 -0
  82. package/src/services/llm.ts +857 -0
  83. package/src/types.ts +161 -0
  84. package/src/utils/file.ts +60 -0
  85. package/src/utils/logger.ts +58 -0
  86. package/tsconfig.json +19 -0
@@ -0,0 +1,266 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.pipelineCommand = pipelineCommand;
37
+ const path = __importStar(require("path"));
38
+ const logger_1 = require("../utils/logger");
39
+ const file_1 = require("../utils/file");
40
+ const scan_1 = require("./scan");
41
+ const analyze_1 = require("./analyze");
42
+ const merge_1 = require("./merge");
43
+ const plan_1 = require("./plan");
44
+ const dispatch_1 = require("./dispatch");
45
+ const PHASES = ['scan', 'analyze', 'merge', 'plan', 'dispatch'];
46
+ async function pipelineCommand(options, command) {
47
+ const logger = new logger_1.Logger();
48
+ const startedAt = new Date().toISOString();
49
+ try {
50
+ if (!options.input && !options.from) {
51
+ logger.error('Error: --input is required (unless using --from to resume)');
52
+ process.exit(1);
53
+ }
54
+ const workspacePath = path.resolve(options.output);
55
+ await (0, file_1.ensureDir)(workspacePath);
56
+ // Determine start and end phases
57
+ const startPhase = options.from || 'scan';
58
+ const endPhase = options.stopAt || 'dispatch';
59
+ const startIndex = PHASES.indexOf(startPhase);
60
+ const endIndex = PHASES.indexOf(endPhase);
61
+ if (startIndex === -1 || endIndex === -1) {
62
+ logger.error(`Error: Invalid phase. Valid phases: ${PHASES.join(', ')}`);
63
+ process.exit(1);
64
+ }
65
+ if (startIndex > endIndex) {
66
+ logger.error('Error: Start phase cannot be after end phase');
67
+ process.exit(1);
68
+ }
69
+ logger.info(`Pipeline: ${startPhase} → ${endPhase}`);
70
+ logger.info(`Workspace: ${workspacePath}`);
71
+ // Preview mode
72
+ if (options.dryRun) {
73
+ logger.info('Dry run mode - pipeline preview:');
74
+ for (let i = startIndex; i <= endIndex; i++) {
75
+ const phase = PHASES[i];
76
+ const phaseDone = await checkPhaseDone(workspacePath, phase);
77
+ logger.info(` ${phaseDone ? '✔' : '○'} ${phase}`);
78
+ }
79
+ return;
80
+ }
81
+ const startTime = Date.now();
82
+ const results = [];
83
+ let failedPhase = null;
84
+ let failedReason = '';
85
+ // Execute phases
86
+ for (let i = startIndex; i <= endIndex; i++) {
87
+ const phase = PHASES[i];
88
+ const phaseStart = Date.now();
89
+ logger.info(`\n[${i - startIndex + 1}/${endIndex - startIndex + 1}] Running ${phase}...`);
90
+ // Check if phase already done
91
+ if (await checkPhaseDone(workspacePath, phase)) {
92
+ logger.info(` Phase ${phase} already completed, skipping`);
93
+ results.push({ phase, status: 'skipped', duration: '0s' });
94
+ continue;
95
+ }
96
+ try {
97
+ await executePhase(phase, options, workspacePath, logger);
98
+ // Mark phase as done
99
+ await markPhaseDone(workspacePath, phase);
100
+ const phaseDuration = ((Date.now() - phaseStart) / 1000).toFixed(1);
101
+ results.push({ phase, status: 'success', duration: `${phaseDuration}s` });
102
+ logger.success(` ${phase} complete (${phaseDuration}s)`);
103
+ }
104
+ catch (error) {
105
+ const phaseDuration = ((Date.now() - phaseStart) / 1000).toFixed(1);
106
+ results.push({ phase, status: 'failed', duration: `${phaseDuration}s` });
107
+ failedPhase = phase;
108
+ failedReason = error instanceof Error ? error.message : String(error);
109
+ logger.error(` ${phase} failed: ${failedReason}`);
110
+ logger.info('\nPipeline stopped. To resume:');
111
+ logger.info(` spec-agent pipeline --from ${phase} --output ${options.output}`);
112
+ break;
113
+ }
114
+ }
115
+ const totalDuration = ((Date.now() - startTime) / 1000).toFixed(1);
116
+ logger.info('\n' + '='.repeat(50));
117
+ logger.success('Pipeline complete');
118
+ logger.info('='.repeat(50));
119
+ for (const result of results) {
120
+ const icon = result.status === 'success' ? '✔' : result.status === 'failed' ? '✖' : '○';
121
+ logger.info(` ${icon} ${result.phase.padEnd(10)} ${result.status.padEnd(10)} ${result.duration}`);
122
+ }
123
+ logger.info(` Total: ${totalDuration}s`);
124
+ logger.info(` Output: ${workspacePath}`);
125
+ const summaryPath = path.join(workspacePath, 'pipeline_summary.json');
126
+ await (0, file_1.writeJson)(summaryPath, {
127
+ startedAt,
128
+ endedAt: new Date().toISOString(),
129
+ status: failedPhase ? 'failed' : 'success',
130
+ startPhase,
131
+ endPhase,
132
+ totalDurationSeconds: Number(totalDuration),
133
+ failedPhase,
134
+ failedReason: failedPhase ? failedReason : undefined,
135
+ phases: results,
136
+ });
137
+ logger.info(` Summary: ${summaryPath}`);
138
+ const runReportPath = path.join(workspacePath, 'run_report.json');
139
+ const runReport = await buildRunReport(workspacePath, {
140
+ startedAt,
141
+ totalDurationSeconds: Number(totalDuration),
142
+ status: failedPhase ? 'failed' : 'success',
143
+ });
144
+ await (0, file_1.writeJson)(runReportPath, runReport);
145
+ logger.info(` Run report: ${runReportPath}`);
146
+ if (failedPhase) {
147
+ process.exit(2);
148
+ }
149
+ }
150
+ catch (error) {
151
+ logger.error(`Pipeline failed: ${error instanceof Error ? error.message : String(error)}`);
152
+ process.exit(1);
153
+ }
154
+ }
155
+ async function executePhase(phase, options, workspacePath, logger) {
156
+ const manifestPath = path.join(workspacePath, 'manifest.json');
157
+ const summariesDir = path.join(workspacePath, 'summaries');
158
+ const specPath = path.join(workspacePath, 'spec_summary.json');
159
+ const planPath = path.join(workspacePath, 'task_plan.json');
160
+ const dispatchPath = path.join(workspacePath, 'dispatch_plan.json');
161
+ switch (phase) {
162
+ case 'scan':
163
+ if (!options.input) {
164
+ throw new Error('Input required for scan phase');
165
+ }
166
+ await (0, scan_1.scanCommand)({
167
+ input: options.input,
168
+ output: manifestPath,
169
+ chunkSize: options.chunkSize,
170
+ minChunkSize: options.minChunkSize,
171
+ format: 'auto',
172
+ strictLlm: options.strictLlm,
173
+ dryRun: false,
174
+ yes: options.yes,
175
+ }, {});
176
+ break;
177
+ case 'analyze':
178
+ await (0, analyze_1.analyzeCommand)({
179
+ manifest: manifestPath,
180
+ output: summariesDir,
181
+ agents: options.agents,
182
+ focus: 'full',
183
+ retries: options.analyzeRetries || '1',
184
+ budgetTokens: options.analyzeBudgetTokens || '0',
185
+ dryRun: false,
186
+ yes: options.yes,
187
+ }, {});
188
+ break;
189
+ case 'merge':
190
+ await (0, merge_1.mergeCommand)({
191
+ summaries: summariesDir,
192
+ output: specPath,
193
+ strategy: 'conservative',
194
+ dryRun: false,
195
+ yes: options.yes,
196
+ }, {});
197
+ break;
198
+ case 'plan':
199
+ await (0, plan_1.planCommand)({
200
+ spec: specPath,
201
+ output: planPath,
202
+ type: 'prototype',
203
+ framework: options.framework,
204
+ parallel: '3',
205
+ dryRun: false,
206
+ yes: options.yes,
207
+ }, {});
208
+ break;
209
+ case 'dispatch':
210
+ await (0, dispatch_1.dispatchCommand)({
211
+ plan: planPath,
212
+ output: dispatchPath,
213
+ strategy: 'balanced',
214
+ dryRun: false,
215
+ yes: options.yes,
216
+ }, {});
217
+ break;
218
+ }
219
+ }
220
+ async function checkPhaseDone(workspacePath, phase) {
221
+ const doneFile = path.join(workspacePath, `.${phase}_done`);
222
+ return await (0, file_1.fileExists)(doneFile);
223
+ }
224
+ async function markPhaseDone(workspacePath, phase) {
225
+ const doneFile = path.join(workspacePath, `.${phase}_done`);
226
+ await (0, file_1.writeJson)(doneFile, { completedAt: new Date().toISOString() });
227
+ }
228
+ async function buildRunReport(workspacePath, context) {
229
+ const metrics = {};
230
+ const manifestPath = path.join(workspacePath, 'manifest.json');
231
+ const specPath = path.join(workspacePath, 'spec_summary.json');
232
+ const taskPlanPath = path.join(workspacePath, 'task_plan.json');
233
+ const summariesDir = path.join(workspacePath, 'summaries');
234
+ if (await (0, file_1.fileExists)(manifestPath)) {
235
+ const manifest = await (0, file_1.readJson)(manifestPath);
236
+ metrics.chunks = manifest.chunks?.length || 0;
237
+ }
238
+ if (await (0, file_1.fileExists)(specPath)) {
239
+ const spec = await (0, file_1.readJson)(specPath);
240
+ metrics.features = spec.features?.length || 0;
241
+ metrics.apis = spec.apis?.length || 0;
242
+ metrics.pages = spec.pages?.length || 0;
243
+ }
244
+ if (await (0, file_1.fileExists)(taskPlanPath)) {
245
+ const plan = await (0, file_1.readJson)(taskPlanPath);
246
+ metrics.totalTasks = plan.totalTasks || 0;
247
+ }
248
+ if (await (0, file_1.fileExists)(summariesDir)) {
249
+ const files = await Promise.resolve().then(() => __importStar(require('../utils/file'))).then(m => m.findFiles('chunk_*_summary.json', summariesDir));
250
+ metrics.chunkSummaries = files.length;
251
+ let totalTokens = 0;
252
+ for (const file of files) {
253
+ const summary = await (0, file_1.readJson)(file);
254
+ totalTokens += summary.llmUsage?.totalTokens || 0;
255
+ }
256
+ metrics.totalTokens = totalTokens;
257
+ }
258
+ return {
259
+ startedAt: context.startedAt,
260
+ endedAt: new Date().toISOString(),
261
+ status: context.status,
262
+ totalDurationSeconds: context.totalDurationSeconds,
263
+ metrics,
264
+ };
265
+ }
266
+ //# sourceMappingURL=pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/commands/pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { Command } from 'commander';
2
+ interface PlanOptions {
3
+ spec: string;
4
+ output: string;
5
+ type: string;
6
+ framework: string;
7
+ parallel: string;
8
+ dryRun?: boolean;
9
+ yes?: boolean;
10
+ }
11
+ export declare function planCommand(options: PlanOptions, command: Command): Promise<void>;
12
+ export {};
13
+ //# sourceMappingURL=plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAmKvF"}
@@ -0,0 +1,314 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.planCommand = planCommand;
37
+ const path = __importStar(require("path"));
38
+ const logger_1 = require("../utils/logger");
39
+ const file_1 = require("../utils/file");
40
+ async function planCommand(options, command) {
41
+ const logger = new logger_1.Logger();
42
+ try {
43
+ const specPath = path.resolve(options.spec);
44
+ if (!(await (0, file_1.fileExists)(specPath))) {
45
+ logger.error(`Error: Spec summary not found: ${options.spec}`);
46
+ logger.info('Run spec-agent merge first to create spec_summary.json.');
47
+ process.exit(1);
48
+ }
49
+ const spec = await (0, file_1.readJson)(specPath);
50
+ logger.info(`Loaded spec with ${spec.features.length} features, ${spec.pages.length} pages, ${spec.apis.length} APIs`);
51
+ // Preview mode
52
+ if (options.dryRun) {
53
+ logger.info('Dry run mode - task plan preview:');
54
+ logger.info(` Features to plan: ${spec.features.length}`);
55
+ logger.info(` Framework: ${options.framework}`);
56
+ logger.info(` Output type: ${options.type}`);
57
+ return;
58
+ }
59
+ const startTime = Date.now();
60
+ // Generate tasks from spec
61
+ const tasks = [];
62
+ const featureTaskIdMap = new Map();
63
+ // 1. Setup task (always first)
64
+ tasks.push({
65
+ id: 'T001',
66
+ name: '项目基础架构初始化',
67
+ type: 'setup',
68
+ description: `Initialize ${options.framework} project structure`,
69
+ dependencies: [],
70
+ priority: 'P0',
71
+ estimatedHours: 2,
72
+ status: 'pending',
73
+ });
74
+ // 2. Tasks from features
75
+ let taskId = 2;
76
+ const dedupedFeatures = deduplicateFeaturesForPlanning(spec.features);
77
+ for (const feature of dedupedFeatures) {
78
+ const featureTask = {
79
+ id: `T${String(taskId).padStart(3, '0')}`,
80
+ name: feature.name,
81
+ type: mapFeatureToTaskType(feature),
82
+ description: feature.description,
83
+ dependencies: ['T001'],
84
+ priority: feature.priority,
85
+ estimatedHours: estimateHours(feature),
86
+ status: 'pending',
87
+ };
88
+ tasks.push(featureTask);
89
+ featureTaskIdMap.set(feature.id, featureTask.id);
90
+ taskId++;
91
+ }
92
+ // Patch feature dependencies after all feature tasks are created.
93
+ for (const task of tasks.filter(item => item.type === 'feature' || item.type === 'api' || item.type === 'page' || item.type === 'component')) {
94
+ const feature = dedupedFeatures.find(item => item.name === task.name && item.description === task.description);
95
+ if (!feature)
96
+ continue;
97
+ const mappedDependencies = (feature.dependencies || [])
98
+ .map(depId => featureTaskIdMap.get(depId))
99
+ .filter((depId) => Boolean(depId));
100
+ task.dependencies = mappedDependencies.length > 0
101
+ ? Array.from(new Set(['T001', ...mappedDependencies]))
102
+ : ['T001'];
103
+ }
104
+ // 3. Tasks from pages
105
+ for (const page of deduplicatePagesForPlanning(spec.pages)) {
106
+ const pageTask = {
107
+ id: `T${String(taskId).padStart(3, '0')}`,
108
+ name: page.name,
109
+ type: 'page',
110
+ description: `Page at ${page.route}`,
111
+ dependencies: ['T001'],
112
+ priority: 'P1',
113
+ estimatedHours: 4,
114
+ status: 'pending',
115
+ };
116
+ tasks.push(pageTask);
117
+ taskId++;
118
+ }
119
+ // 4. Tasks from APIs
120
+ for (const api of deduplicateApisForPlanning(spec.apis)) {
121
+ const apiTask = {
122
+ id: `T${String(taskId).padStart(3, '0')}`,
123
+ name: `${api.method} ${api.path}`,
124
+ type: 'api',
125
+ description: api.description,
126
+ dependencies: ['T001'],
127
+ priority: 'P1',
128
+ estimatedHours: 2,
129
+ status: 'pending',
130
+ };
131
+ tasks.push(apiTask);
132
+ taskId++;
133
+ }
134
+ // 5. Test tasks
135
+ tasks.push({
136
+ id: `T${String(taskId).padStart(3, '0')}`,
137
+ name: '单元测试',
138
+ type: 'test',
139
+ description: 'Unit tests for all components',
140
+ dependencies: tasks.filter(t => t.type !== 'test' && t.type !== 'setup').map(t => t.id),
141
+ priority: 'P2',
142
+ estimatedHours: 8,
143
+ status: 'pending',
144
+ });
145
+ taskId++;
146
+ const compactedTasks = deduplicateTasks(tasks);
147
+ logger.info(`Generated ${tasks.length} tasks, compacted to ${compactedTasks.length} tasks`);
148
+ // Group tasks by dependencies (parallel groups)
149
+ const parallelGroups = groupTasksByDependencies(compactedTasks, parseInt(options.parallel, 10));
150
+ logger.info(`Organized into ${parallelGroups.length} parallel groups`);
151
+ // Create task plan
152
+ const taskPlan = {
153
+ version: '1.0.0',
154
+ createdAt: new Date().toISOString(),
155
+ totalTasks: compactedTasks.length,
156
+ parallelGroups,
157
+ outputDir: './build/',
158
+ framework: options.framework,
159
+ type: options.type,
160
+ };
161
+ // Write output
162
+ const outputPath = path.resolve(options.output);
163
+ await (0, file_1.ensureDir)(path.dirname(outputPath));
164
+ await (0, file_1.writeJson)(outputPath, taskPlan);
165
+ const duration = ((Date.now() - startTime) / 1000).toFixed(1);
166
+ logger.success(`Task plan created in ${duration}s`);
167
+ logger.json({
168
+ status: 'success',
169
+ totalTasks: compactedTasks.length,
170
+ parallelGroups: parallelGroups.length,
171
+ framework: options.framework,
172
+ type: options.type,
173
+ outputPath,
174
+ });
175
+ // Print group summary
176
+ for (const group of parallelGroups) {
177
+ logger.info(` Group ${group.group}: ${group.tasks.length} tasks (${group.tasks.map(t => t.id).join(', ')})`);
178
+ }
179
+ }
180
+ catch (error) {
181
+ logger.error(`Plan failed: ${error instanceof Error ? error.message : String(error)}`);
182
+ process.exit(1);
183
+ }
184
+ }
185
+ function mapFeatureToTaskType(feature) {
186
+ const name = feature.name.toLowerCase();
187
+ if (name.includes('page') || name.includes('页面'))
188
+ return 'page';
189
+ if (name.includes('component') || name.includes('组件'))
190
+ return 'component';
191
+ if (name.includes('api') || name.includes('接口'))
192
+ return 'api';
193
+ return 'feature';
194
+ }
195
+ function estimateHours(feature) {
196
+ // Simple estimation based on priority and description length
197
+ const baseHours = feature.priority === 'P0' ? 4 : feature.priority === 'P1' ? 6 : 8;
198
+ const complexityFactor = Math.min(feature.description.length / 100, 3);
199
+ return Math.round(baseHours + complexityFactor);
200
+ }
201
+ function normalizeTaskText(input) {
202
+ return (input || '')
203
+ .toLowerCase()
204
+ .replace(/[^\u4e00-\u9fa5a-z0-9\s/]/gi, ' ')
205
+ .replace(/\s+/g, ' ')
206
+ .trim();
207
+ }
208
+ function deduplicateFeaturesForPlanning(features) {
209
+ const seen = new Map();
210
+ for (const feature of features) {
211
+ const key = normalizeTaskText(feature.name);
212
+ const existing = seen.get(key);
213
+ if (!existing) {
214
+ seen.set(key, feature);
215
+ continue;
216
+ }
217
+ // Keep higher-priority / richer representative.
218
+ const rank = { P0: 0, P1: 1, P2: 2, P3: 3 };
219
+ const existingRank = rank[existing.priority] ?? 3;
220
+ const currentRank = rank[feature.priority] ?? 3;
221
+ if (currentRank < existingRank || feature.description.length > existing.description.length) {
222
+ seen.set(key, feature);
223
+ }
224
+ }
225
+ return Array.from(seen.values());
226
+ }
227
+ function deduplicatePagesForPlanning(pages) {
228
+ const seen = new Set();
229
+ return pages.filter(page => {
230
+ const key = normalizeTaskText(page.route || page.name);
231
+ if (seen.has(key))
232
+ return false;
233
+ seen.add(key);
234
+ return true;
235
+ });
236
+ }
237
+ function deduplicateApisForPlanning(apis) {
238
+ const seen = new Set();
239
+ return apis.filter(api => {
240
+ const key = normalizeTaskText(`${api.method}:${api.path}`);
241
+ if (seen.has(key))
242
+ return false;
243
+ seen.add(key);
244
+ return true;
245
+ });
246
+ }
247
+ function deduplicateTasks(tasks) {
248
+ const seen = new Map();
249
+ for (const task of tasks) {
250
+ const key = `${task.type}:${normalizeTaskText(task.name)}`;
251
+ const existing = seen.get(key);
252
+ if (!existing) {
253
+ seen.set(key, { ...task, dependencies: Array.from(new Set(task.dependencies)) });
254
+ continue;
255
+ }
256
+ existing.dependencies = Array.from(new Set([...existing.dependencies, ...task.dependencies]));
257
+ existing.estimatedHours = Math.max(existing.estimatedHours || 0, task.estimatedHours || 0);
258
+ const priorityRank = { P0: 0, P1: 1, P2: 2, P3: 3 };
259
+ if ((priorityRank[task.priority] ?? 3) < (priorityRank[existing.priority] ?? 3)) {
260
+ existing.priority = task.priority;
261
+ }
262
+ if ((task.description || '').length > (existing.description || '').length) {
263
+ existing.description = task.description;
264
+ }
265
+ }
266
+ // Re-number IDs to keep compact sequence and remap dependencies.
267
+ const uniqueTasks = Array.from(seen.values());
268
+ const idMap = new Map();
269
+ uniqueTasks.forEach((task, idx) => {
270
+ idMap.set(task.id, `T${String(idx + 1).padStart(3, '0')}`);
271
+ });
272
+ return uniqueTasks.map((task, idx) => {
273
+ const newId = `T${String(idx + 1).padStart(3, '0')}`;
274
+ const remappedDependencies = Array.from(new Set(task.dependencies
275
+ .map(dep => idMap.get(dep) || dep)
276
+ .filter(dep => dep !== newId)));
277
+ return {
278
+ ...task,
279
+ id: newId,
280
+ dependencies: remappedDependencies,
281
+ };
282
+ });
283
+ }
284
+ function groupTasksByDependencies(tasks, maxParallel) {
285
+ const groups = [];
286
+ const remaining = new Set(tasks.map(t => t.id));
287
+ const completed = new Set();
288
+ let groupNum = 1;
289
+ while (remaining.size > 0) {
290
+ // Find tasks whose dependencies are all completed
291
+ const ready = Array.from(remaining).filter(taskId => {
292
+ const task = tasks.find(t => t.id === taskId);
293
+ return task.dependencies.every(dep => completed.has(dep));
294
+ });
295
+ if (ready.length === 0) {
296
+ // Circular dependency or error
297
+ break;
298
+ }
299
+ // Take up to maxParallel tasks
300
+ const batch = ready.slice(0, maxParallel);
301
+ groups.push({
302
+ group: groupNum,
303
+ tasks: batch.map(id => tasks.find(t => t.id === id)),
304
+ });
305
+ // Mark as completed
306
+ for (const taskId of batch) {
307
+ remaining.delete(taskId);
308
+ completed.add(taskId);
309
+ }
310
+ groupNum++;
311
+ }
312
+ return groups;
313
+ }
314
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { Command } from 'commander';
2
+ interface ScanOptions {
3
+ input?: string;
4
+ stdin?: boolean;
5
+ output: string;
6
+ chunkSize: string;
7
+ format: string;
8
+ dryRun?: boolean;
9
+ yes?: boolean;
10
+ /**
11
+ * Minimum chunk size - chunks smaller than this will be merged with neighbors
12
+ * Default: 10KB
13
+ */
14
+ minChunkSize?: string;
15
+ /**
16
+ * Use LLM to analyze document structure for intelligent chunking
17
+ * Default: true
18
+ */
19
+ llmChunking?: boolean;
20
+ /**
21
+ * Fail immediately if LLM chunking fails (no fallback)
22
+ * Default: false
23
+ */
24
+ strictLlm?: boolean;
25
+ }
26
+ export declare function scanCommand(options: ScanOptions, command: Command): Promise<void>;
27
+ export {};
28
+ //# sourceMappingURL=scan.d.ts.map