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,234 @@
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.learnCommand = learnCommand;
37
+ const path = __importStar(require("path"));
38
+ const logger_1 = require("../utils/logger");
39
+ const file_1 = require("../utils/file");
40
+ const PATTERNS_FILE = '.patterns.json';
41
+ async function learnCommand(options, command) {
42
+ const logger = new logger_1.Logger();
43
+ const workspacePath = path.resolve(options.workspace);
44
+ const patternsPath = path.join(workspacePath, PATTERNS_FILE);
45
+ try {
46
+ // Load existing patterns
47
+ let patterns = {
48
+ version: '1.0.0',
49
+ workspace: workspacePath,
50
+ patterns: [],
51
+ };
52
+ if (await (0, file_1.fileExists)(patternsPath)) {
53
+ patterns = await (0, file_1.readJson)(patternsPath);
54
+ }
55
+ // Handle list command
56
+ if (options.list) {
57
+ if (patterns.patterns.length === 0) {
58
+ logger.info('No learned patterns yet.');
59
+ }
60
+ else {
61
+ logger.info(`Learned patterns (${patterns.patterns.length}):`);
62
+ for (const p of patterns.patterns) {
63
+ logger.info(` - ${p.name}: ${p.rule} (confidence: ${(p.confidence * 100).toFixed(0)}%)`);
64
+ }
65
+ }
66
+ return;
67
+ }
68
+ // Handle export command
69
+ if (options.export) {
70
+ const exportPath = path.resolve(options.export);
71
+ await (0, file_1.writeJson)(exportPath, patterns);
72
+ logger.success(`Patterns exported to ${exportPath}`);
73
+ return;
74
+ }
75
+ // Handle manual pattern learning
76
+ if (options.pattern && options.rule) {
77
+ const newPattern = {
78
+ name: options.pattern,
79
+ rule: options.rule,
80
+ context: 'manual',
81
+ confidence: 1.0,
82
+ learnedAt: new Date().toISOString(),
83
+ };
84
+ // Check if pattern already exists
85
+ const existingIndex = patterns.patterns.findIndex(p => p.name === options.pattern);
86
+ if (existingIndex >= 0) {
87
+ patterns.patterns[existingIndex] = newPattern;
88
+ logger.info(`Updated pattern: ${options.pattern}`);
89
+ }
90
+ else {
91
+ patterns.patterns.push(newPattern);
92
+ logger.info(`Learned new pattern: ${options.pattern}`);
93
+ }
94
+ await (0, file_1.writeJson)(patternsPath, patterns);
95
+ return;
96
+ }
97
+ // Handle automatic learning from phase results
98
+ if (options.from) {
99
+ const learnedCount = await learnFromPhase(workspacePath, options.from, patterns, logger);
100
+ if (learnedCount > 0) {
101
+ await (0, file_1.writeJson)(patternsPath, patterns);
102
+ logger.success(`Learned ${learnedCount} new patterns from ${options.from}`);
103
+ }
104
+ else {
105
+ logger.info('No new patterns learned.');
106
+ }
107
+ return;
108
+ }
109
+ // Handle apply command
110
+ if (options.apply) {
111
+ if (patterns.patterns.length === 0) {
112
+ logger.warn('No patterns to apply.');
113
+ return;
114
+ }
115
+ logger.info(`Applied ${patterns.patterns.length} learned patterns to workspace`);
116
+ logger.json({
117
+ status: 'success',
118
+ patternsApplied: patterns.patterns.length,
119
+ patterns: patterns.patterns.map(p => p.name),
120
+ });
121
+ return;
122
+ }
123
+ // Default: show help
124
+ logger.info('Usage:');
125
+ logger.info(' spec-agent learn --workspace ./workspace --from summaries');
126
+ logger.info(' spec-agent learn --workspace ./workspace --pattern "API规范" --rule "/api/v{version}/{resource}"');
127
+ logger.info(' spec-agent learn --workspace ./workspace --list');
128
+ logger.info(' spec-agent learn --workspace ./workspace --export ./patterns.json');
129
+ }
130
+ catch (error) {
131
+ logger.error(`Learn failed: ${error instanceof Error ? error.message : String(error)}`);
132
+ process.exit(1);
133
+ }
134
+ }
135
+ async function learnFromPhase(workspacePath, phase, patterns, logger) {
136
+ let learnedCount = 0;
137
+ switch (phase) {
138
+ case 'summaries':
139
+ learnedCount = await learnFromSummaries(workspacePath, patterns, logger);
140
+ break;
141
+ case 'plan':
142
+ learnedCount = await learnFromPlan(workspacePath, patterns, logger);
143
+ break;
144
+ case 'dispatch':
145
+ learnedCount = await learnFromDispatch(workspacePath, patterns, logger);
146
+ break;
147
+ default:
148
+ logger.error(`Unknown phase: ${phase}`);
149
+ return 0;
150
+ }
151
+ return learnedCount;
152
+ }
153
+ async function learnFromSummaries(workspacePath, patterns, logger) {
154
+ const summariesDir = path.join(workspacePath, 'summaries');
155
+ if (!(await (0, file_1.fileExists)(summariesDir))) {
156
+ logger.error('No summaries directory found. Run analyze first.');
157
+ return 0;
158
+ }
159
+ const summaryFiles = await (0, file_1.findFiles)('chunk_*_summary.json', summariesDir);
160
+ if (summaryFiles.length === 0) {
161
+ logger.error('No summary files found.');
162
+ return 0;
163
+ }
164
+ let learnedCount = 0;
165
+ for (const file of summaryFiles) {
166
+ const summary = await (0, file_1.readJson)(file);
167
+ // Learn naming patterns from features
168
+ for (const feature of summary.features) {
169
+ const namingPattern = extractNamingPattern(feature.name);
170
+ if (namingPattern && !patternExists(patterns, namingPattern.name)) {
171
+ patterns.patterns.push({
172
+ ...namingPattern,
173
+ context: `feature:${feature.id}`,
174
+ confidence: 0.8,
175
+ learnedAt: new Date().toISOString(),
176
+ });
177
+ learnedCount++;
178
+ }
179
+ }
180
+ // Learn API patterns
181
+ for (const api of summary.apis) {
182
+ const apiPattern = extractApiPattern(api.path);
183
+ if (apiPattern && !patternExists(patterns, apiPattern.name)) {
184
+ patterns.patterns.push({
185
+ ...apiPattern,
186
+ context: `api:${api.method}`,
187
+ confidence: 0.9,
188
+ learnedAt: new Date().toISOString(),
189
+ });
190
+ learnedCount++;
191
+ }
192
+ }
193
+ }
194
+ return learnedCount;
195
+ }
196
+ async function learnFromPlan(workspacePath, patterns, logger) {
197
+ // Learn from task planning patterns
198
+ // This would analyze task_plan.json to learn estimation patterns, etc.
199
+ return 0;
200
+ }
201
+ async function learnFromDispatch(workspacePath, patterns, logger) {
202
+ // Learn from dispatch patterns
203
+ // This would analyze dispatch_plan.json to learn agent assignment patterns
204
+ return 0;
205
+ }
206
+ function extractNamingPattern(name) {
207
+ // Detect naming conventions
208
+ if (/^[A-Z][a-zA-Z0-9]*$/.test(name)) {
209
+ return { name: '组件命名规范', rule: 'PascalCase' };
210
+ }
211
+ if (/^[a-z][a-z0-9-]*$/.test(name)) {
212
+ return { name: '路由命名规范', rule: 'kebab-case' };
213
+ }
214
+ if (/^[a-z][a-zA-Z0-9]*$/.test(name)) {
215
+ return { name: '变量命名规范', rule: 'camelCase' };
216
+ }
217
+ return null;
218
+ }
219
+ function extractApiPattern(path) {
220
+ // Detect API patterns
221
+ const versionMatch = path.match(/\/api\/v(\d+)\//);
222
+ if (versionMatch) {
223
+ return { name: 'API版本规范', rule: `/api/v{version}/...` };
224
+ }
225
+ const restMatch = path.match(/\/api\/\w+\/(\d+|\w+)/);
226
+ if (restMatch) {
227
+ return { name: 'RESTful路径规范', rule: `/api/{resource}/{id}` };
228
+ }
229
+ return null;
230
+ }
231
+ function patternExists(patterns, name) {
232
+ return patterns.patterns.some(p => p.name === name);
233
+ }
234
+ //# sourceMappingURL=learn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learn.js","sourceRoot":"","sources":["../../src/commands/learn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { Command } from 'commander';
2
+ interface MergeOptions {
3
+ summaries: string;
4
+ output: string;
5
+ strategy: string;
6
+ dryRun?: boolean;
7
+ yes?: boolean;
8
+ }
9
+ export declare function mergeCommand(options: MergeOptions, command: Command): Promise<void>;
10
+ export {};
11
+ //# sourceMappingURL=merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/commands/merge.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,UAAU,YAAY;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA4HzF"}
@@ -0,0 +1,335 @@
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.mergeCommand = mergeCommand;
37
+ const path = __importStar(require("path"));
38
+ const logger_1 = require("../utils/logger");
39
+ const file_1 = require("../utils/file");
40
+ async function mergeCommand(options, command) {
41
+ const logger = new logger_1.Logger();
42
+ try {
43
+ const summariesDir = path.resolve(options.summaries);
44
+ if (!(await (0, file_1.fileExists)(summariesDir))) {
45
+ logger.error(`Error: Summaries directory not found: ${options.summaries}`);
46
+ logger.info('Run spec-agent analyze first to create summaries.');
47
+ process.exit(1);
48
+ }
49
+ // Find all chunk summaries
50
+ const summaryFiles = await (0, file_1.findFiles)('chunk_*_summary.json', summariesDir);
51
+ if (summaryFiles.length === 0) {
52
+ logger.error(`Error: No chunk summaries found in ${options.summaries}`);
53
+ process.exit(1);
54
+ }
55
+ logger.info(`Found ${summaryFiles.length} chunk summaries`);
56
+ // Load all summaries
57
+ const summaries = await Promise.all(summaryFiles.map(async (file) => {
58
+ const summary = await (0, file_1.readJson)(file);
59
+ return summary;
60
+ }));
61
+ // Sort by chunk id
62
+ summaries.sort((a, b) => a.chunkId - b.chunkId);
63
+ logger.info(`Loading summaries from ${summaries.length} chunks...`);
64
+ // Preview mode
65
+ if (options.dryRun) {
66
+ logger.info('Dry run mode - merge plan:');
67
+ const totalFeatures = summaries.reduce((sum, s) => sum + s.features.length, 0);
68
+ logger.info(` Total features to merge: ${totalFeatures}`);
69
+ logger.info(` Strategy: ${options.strategy}`);
70
+ return;
71
+ }
72
+ // Merge logic
73
+ const startTime = Date.now();
74
+ // Collect all items
75
+ const allFeatures = [];
76
+ const allDataModels = [];
77
+ const allPages = [];
78
+ const allApis = [];
79
+ const allBusinessRules = [];
80
+ for (const summary of summaries) {
81
+ allFeatures.push(...summary.features);
82
+ allDataModels.push(...summary.dataModels);
83
+ allPages.push(...summary.pages);
84
+ allApis.push(...summary.apis);
85
+ allBusinessRules.push(...summary.businessRules);
86
+ }
87
+ logger.info(`Collected ${allFeatures.length} features, ${allDataModels.length} models, ${allPages.length} pages, ${allApis.length} APIs`);
88
+ // Deduplication
89
+ const { features: dedupedFeatures, duplicates } = deduplicateFeatures(allFeatures, options.strategy);
90
+ logger.info(`Deduplication: ${allFeatures.length} → ${dedupedFeatures.length} features (${duplicates.length} removed)`);
91
+ // Build dependency graph
92
+ const dependencyGraph = buildDependencyGraph(dedupedFeatures);
93
+ // Detect conflicts
94
+ const conflicts = detectConflicts(dedupedFeatures, allDataModels);
95
+ if (conflicts.length > 0) {
96
+ logger.warn(`Detected ${conflicts.length} potential conflicts`);
97
+ for (const conflict of conflicts.slice(0, 5)) {
98
+ logger.warn(` - ${conflict}`);
99
+ }
100
+ }
101
+ // Create spec summary
102
+ const specSummary = {
103
+ version: '1.0.0',
104
+ createdAt: new Date().toISOString(),
105
+ sourceChunks: summaries.length,
106
+ deduplicatedFeatures: dedupedFeatures.length,
107
+ features: dedupedFeatures,
108
+ dataModels: deduplicateDataModels(allDataModels),
109
+ pages: deduplicatePages(allPages),
110
+ apis: deduplicateApis(allApis),
111
+ businessRules: [...new Set(allBusinessRules)],
112
+ dependencyGraph,
113
+ conflicts: conflicts.length > 0 ? conflicts : undefined,
114
+ };
115
+ // Write output
116
+ const outputPath = path.resolve(options.output);
117
+ await (0, file_1.ensureDir)(path.dirname(outputPath));
118
+ await (0, file_1.writeJson)(outputPath, specSummary);
119
+ const duration = ((Date.now() - startTime) / 1000).toFixed(1);
120
+ logger.success(`Merge complete in ${duration}s`);
121
+ logger.json({
122
+ status: 'success',
123
+ sourceChunks: summaries.length,
124
+ totalFeatures: dedupedFeatures.length,
125
+ duplicatesRemoved: duplicates.length,
126
+ dataModels: specSummary.dataModels.length,
127
+ pages: specSummary.pages.length,
128
+ apis: specSummary.apis.length,
129
+ conflicts: conflicts.length,
130
+ outputPath,
131
+ });
132
+ }
133
+ catch (error) {
134
+ logger.error(`Merge failed: ${error instanceof Error ? error.message : String(error)}`);
135
+ process.exit(1);
136
+ }
137
+ }
138
+ function deduplicateFeatures(features, strategy) {
139
+ const groups = [];
140
+ const duplicates = [];
141
+ for (const feature of features) {
142
+ const key = strategy === 'aggressive'
143
+ ? generateAggressiveKey(feature)
144
+ : generateConservativeKey(feature);
145
+ const normalizedName = normalizeText(feature.name);
146
+ let targetGroup = groups.find(group => {
147
+ if (group.key === key)
148
+ return true;
149
+ if (strategy !== 'aggressive')
150
+ return false;
151
+ const rep = group.items[0];
152
+ const repName = normalizeText(rep.name);
153
+ const nameSimilarity = jaccardSimilarity(tokenize(repName), tokenize(normalizedName));
154
+ return nameSimilarity >= 0.72;
155
+ });
156
+ if (!targetGroup) {
157
+ targetGroup = { key, items: [] };
158
+ groups.push(targetGroup);
159
+ }
160
+ else {
161
+ duplicates.push(feature.id);
162
+ }
163
+ targetGroup.items.push(feature);
164
+ }
165
+ const oldIdAlias = new Map();
166
+ const dedupedFeatures = groups.map((group, idx) => {
167
+ const representative = chooseRepresentativeFeature(group.items);
168
+ const newId = `F${String(idx + 1).padStart(3, '0')}`;
169
+ // Build alias from old IDs to new canonical ID for dependency remapping.
170
+ const uniqueOldIds = Array.from(new Set(group.items.map(item => item.id)));
171
+ for (const oldId of uniqueOldIds) {
172
+ oldIdAlias.set(oldId, newId);
173
+ }
174
+ return {
175
+ ...representative,
176
+ id: newId,
177
+ dependencies: [],
178
+ };
179
+ });
180
+ // Rebuild dependencies from grouped items and remap to canonical IDs.
181
+ groups.forEach((group, idx) => {
182
+ const currentId = dedupedFeatures[idx].id;
183
+ const mappedDeps = new Set();
184
+ for (const item of group.items) {
185
+ for (const dep of item.dependencies || []) {
186
+ const mapped = oldIdAlias.get(dep);
187
+ if (mapped && mapped !== currentId) {
188
+ mappedDeps.add(mapped);
189
+ }
190
+ }
191
+ }
192
+ dedupedFeatures[idx].dependencies = Array.from(mappedDeps);
193
+ });
194
+ return { features: dedupedFeatures, duplicates };
195
+ }
196
+ function generateConservativeKey(feature) {
197
+ // Only exact name match is considered duplicate
198
+ return normalizeText(feature.name);
199
+ }
200
+ function generateAggressiveKey(feature) {
201
+ // Similar names might be duplicates
202
+ return normalizeText(feature.name)
203
+ .replace(/\b(功能|流程|管理|申请|支持|模块|客户)\b/g, '')
204
+ .replace(/\s+/g, ' ')
205
+ .trim();
206
+ }
207
+ function normalizeText(input) {
208
+ return (input || '')
209
+ .toLowerCase()
210
+ .replace(/[^\u4e00-\u9fa5a-z0-9\s]/gi, ' ')
211
+ .replace(/\s+/g, ' ')
212
+ .trim();
213
+ }
214
+ function tokenize(input) {
215
+ return normalizeText(input)
216
+ .split(' ')
217
+ .filter(token => token.length > 0);
218
+ }
219
+ function jaccardSimilarity(aTokens, bTokens) {
220
+ const a = new Set(aTokens);
221
+ const b = new Set(bTokens);
222
+ if (a.size === 0 || b.size === 0)
223
+ return 0;
224
+ let intersection = 0;
225
+ for (const token of a) {
226
+ if (b.has(token))
227
+ intersection++;
228
+ }
229
+ const union = new Set([...a, ...b]).size;
230
+ return union === 0 ? 0 : intersection / union;
231
+ }
232
+ function chooseRepresentativeFeature(features) {
233
+ const sorted = features.slice().sort((a, b) => {
234
+ // Prefer higher priority first.
235
+ const priorityRank = {
236
+ P0: 0,
237
+ P1: 1,
238
+ P2: 2,
239
+ P3: 3,
240
+ };
241
+ const pa = priorityRank[a.priority] ?? 3;
242
+ const pb = priorityRank[b.priority] ?? 3;
243
+ if (pa !== pb)
244
+ return pa - pb;
245
+ // Prefer richer description.
246
+ if (a.description.length !== b.description.length) {
247
+ return b.description.length - a.description.length;
248
+ }
249
+ return a.sourceChunk - b.sourceChunk;
250
+ });
251
+ const representative = sorted[0];
252
+ const mergedDescription = mergeFeatureDescriptions(features);
253
+ return {
254
+ ...representative,
255
+ description: mergedDescription,
256
+ };
257
+ }
258
+ function mergeFeatureDescriptions(features) {
259
+ const descriptions = Array.from(new Set(features
260
+ .map(item => item.description?.trim())
261
+ .filter((item) => Boolean(item))));
262
+ if (descriptions.length === 0) {
263
+ return '';
264
+ }
265
+ descriptions.sort((a, b) => b.length - a.length);
266
+ return descriptions[0];
267
+ }
268
+ function buildDependencyGraph(features) {
269
+ const graph = {};
270
+ for (const feature of features) {
271
+ graph[feature.id] = feature.dependencies || [];
272
+ }
273
+ return graph;
274
+ }
275
+ function detectConflicts(features, dataModels) {
276
+ const conflicts = [];
277
+ // Check for circular dependencies
278
+ const visited = new Set();
279
+ const recursionStack = new Set();
280
+ function hasCircularDependency(featureId, graph) {
281
+ visited.add(featureId);
282
+ recursionStack.add(featureId);
283
+ const dependencies = graph[featureId] || [];
284
+ for (const depId of dependencies) {
285
+ if (!visited.has(depId)) {
286
+ if (hasCircularDependency(depId, graph)) {
287
+ return true;
288
+ }
289
+ }
290
+ else if (recursionStack.has(depId)) {
291
+ return true;
292
+ }
293
+ }
294
+ recursionStack.delete(featureId);
295
+ return false;
296
+ }
297
+ const graph = buildDependencyGraph(features);
298
+ for (const feature of features) {
299
+ if (hasCircularDependency(feature.id, graph)) {
300
+ conflicts.push(`Circular dependency detected for feature ${feature.id}`);
301
+ }
302
+ }
303
+ return conflicts;
304
+ }
305
+ function deduplicateDataModels(models) {
306
+ const seen = new Set();
307
+ return models.filter((model) => {
308
+ const key = `${model.name}`;
309
+ if (seen.has(key))
310
+ return false;
311
+ seen.add(key);
312
+ return true;
313
+ });
314
+ }
315
+ function deduplicatePages(pages) {
316
+ const seen = new Set();
317
+ return pages.filter((page) => {
318
+ const key = `${page.route}`;
319
+ if (seen.has(key))
320
+ return false;
321
+ seen.add(key);
322
+ return true;
323
+ });
324
+ }
325
+ function deduplicateApis(apis) {
326
+ const seen = new Set();
327
+ return apis.filter((api) => {
328
+ const key = `${api.method}:${api.path}`;
329
+ if (seen.has(key))
330
+ return false;
331
+ seen.add(key);
332
+ return true;
333
+ });
334
+ }
335
+ //# sourceMappingURL=merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/commands/merge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { Command } from 'commander';
2
+ interface PipelineOptions {
3
+ input?: string;
4
+ output: string;
5
+ agents: string;
6
+ chunkSize: string;
7
+ minChunkSize: string;
8
+ analyzeRetries: string;
9
+ analyzeBudgetTokens: string;
10
+ framework: string;
11
+ strictLlm?: boolean;
12
+ stopAt?: string;
13
+ from?: string;
14
+ dryRun?: boolean;
15
+ yes?: boolean;
16
+ }
17
+ export declare function pipelineCommand(options: PipelineOptions, command: Command): Promise<void>;
18
+ export {};
19
+ //# sourceMappingURL=pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/commands/pipeline.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,UAAU,eAAe;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAKD,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAoI/F"}