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.
- package/README.md +256 -0
- package/bin/spec-agent.js +14 -0
- package/dist/commands/analyze.d.ts +16 -0
- package/dist/commands/analyze.d.ts.map +1 -0
- package/dist/commands/analyze.js +283 -0
- package/dist/commands/analyze.js.map +1 -0
- package/dist/commands/clean.d.ts +9 -0
- package/dist/commands/clean.d.ts.map +1 -0
- package/dist/commands/clean.js +109 -0
- package/dist/commands/clean.js.map +1 -0
- package/dist/commands/dispatch.d.ts +12 -0
- package/dist/commands/dispatch.d.ts.map +1 -0
- package/dist/commands/dispatch.js +232 -0
- package/dist/commands/dispatch.js.map +1 -0
- package/dist/commands/doctor.d.ts +9 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +153 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/learn.d.ts +13 -0
- package/dist/commands/learn.d.ts.map +1 -0
- package/dist/commands/learn.js +234 -0
- package/dist/commands/learn.js.map +1 -0
- package/dist/commands/merge.d.ts +11 -0
- package/dist/commands/merge.d.ts.map +1 -0
- package/dist/commands/merge.js +335 -0
- package/dist/commands/merge.js.map +1 -0
- package/dist/commands/pipeline.d.ts +19 -0
- package/dist/commands/pipeline.d.ts.map +1 -0
- package/dist/commands/pipeline.js +266 -0
- package/dist/commands/pipeline.js.map +1 -0
- package/dist/commands/plan.d.ts +13 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +314 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/scan.d.ts +28 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +488 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/status.d.ts +8 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +146 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +126 -0
- package/dist/index.js.map +1 -0
- package/dist/services/document-parser.d.ts +49 -0
- package/dist/services/document-parser.d.ts.map +1 -0
- package/dist/services/document-parser.js +499 -0
- package/dist/services/document-parser.js.map +1 -0
- package/dist/services/llm.d.ts +61 -0
- package/dist/services/llm.d.ts.map +1 -0
- package/dist/services/llm.js +716 -0
- package/dist/services/llm.js.map +1 -0
- package/dist/types.d.ts +159 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/file.d.ts +10 -0
- package/dist/utils/file.d.ts.map +1 -0
- package/dist/utils/file.js +96 -0
- package/dist/utils/file.js.map +1 -0
- package/dist/utils/logger.d.ts +13 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +55 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +48 -0
- package/scripts/publish-npm.js +174 -0
- package/spec-agent-implementation.md +750 -0
- package/src/commands/analyze.ts +322 -0
- package/src/commands/clean.ts +88 -0
- package/src/commands/dispatch.ts +250 -0
- package/src/commands/doctor.ts +136 -0
- package/src/commands/learn.ts +261 -0
- package/src/commands/merge.ts +377 -0
- package/src/commands/pipeline.ts +306 -0
- package/src/commands/plan.ts +331 -0
- package/src/commands/scan.ts +568 -0
- package/src/commands/status.ts +129 -0
- package/src/index.ts +137 -0
- package/src/services/document-parser.ts +548 -0
- package/src/services/llm.ts +857 -0
- package/src/types.ts +161 -0
- package/src/utils/file.ts +60 -0
- package/src/utils/logger.ts +58 -0
- 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"}
|