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,109 @@
|
|
|
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.cleanCommand = cleanCommand;
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
const logger_1 = require("../utils/logger");
|
|
39
|
+
const file_1 = require("../utils/file");
|
|
40
|
+
const fs = __importStar(require("fs-extra"));
|
|
41
|
+
const INTERMEDIATE_FILES = [
|
|
42
|
+
'manifest.json',
|
|
43
|
+
'summaries/',
|
|
44
|
+
'spec_summary.json',
|
|
45
|
+
'task_plan.json',
|
|
46
|
+
'dispatch_plan.json',
|
|
47
|
+
'.patterns.json',
|
|
48
|
+
'.scan_done',
|
|
49
|
+
'.analyze_done',
|
|
50
|
+
'.merge_done',
|
|
51
|
+
'.plan_done',
|
|
52
|
+
'.dispatch_done',
|
|
53
|
+
];
|
|
54
|
+
async function cleanCommand(options, command) {
|
|
55
|
+
const logger = new logger_1.Logger();
|
|
56
|
+
const workspacePath = path.resolve(options.workspace);
|
|
57
|
+
try {
|
|
58
|
+
if (!(await (0, file_1.fileExists)(workspacePath))) {
|
|
59
|
+
logger.error(`Error: Workspace not found: ${options.workspace}`);
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
// Find all intermediate files
|
|
63
|
+
const filesToClean = [];
|
|
64
|
+
for (const pattern of INTERMEDIATE_FILES) {
|
|
65
|
+
const fullPath = path.join(workspacePath, pattern);
|
|
66
|
+
if (await (0, file_1.fileExists)(fullPath)) {
|
|
67
|
+
const stats = await fs.stat(fullPath);
|
|
68
|
+
filesToClean.push({
|
|
69
|
+
path: fullPath,
|
|
70
|
+
type: stats.isDirectory() ? 'directory' : 'file',
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (filesToClean.length === 0) {
|
|
75
|
+
logger.info('No intermediate files to clean.');
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
logger.info(`Found ${filesToClean.length} items to clean:`);
|
|
79
|
+
for (const item of filesToClean) {
|
|
80
|
+
logger.info(` ${item.type === 'directory' ? '📁' : '📄'} ${path.relative(workspacePath, item.path)}`);
|
|
81
|
+
}
|
|
82
|
+
// Preview mode
|
|
83
|
+
if (options.dryRun) {
|
|
84
|
+
logger.info('\nDry run mode - no files were deleted.');
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
// Clean files
|
|
88
|
+
for (const item of filesToClean) {
|
|
89
|
+
try {
|
|
90
|
+
if (item.type === 'directory') {
|
|
91
|
+
await fs.remove(item.path);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
await fs.unlink(item.path);
|
|
95
|
+
}
|
|
96
|
+
logger.success(` Cleaned: ${path.relative(workspacePath, item.path)}`);
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
logger.error(` Failed to clean: ${path.relative(workspacePath, item.path)}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
logger.success(`\nCleaned ${filesToClean.length} items from workspace`);
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
logger.error(`Clean failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
106
|
+
process.exit(1);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=clean.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clean.js","sourceRoot":"","sources":["../../src/commands/clean.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
interface DispatchOptions {
|
|
3
|
+
plan: string;
|
|
4
|
+
output: string;
|
|
5
|
+
agents?: string;
|
|
6
|
+
strategy: string;
|
|
7
|
+
dryRun?: boolean;
|
|
8
|
+
yes?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function dispatchCommand(options: DispatchOptions, command: Command): Promise<void>;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=dispatch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../src/commands/dispatch.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAgH/F"}
|
|
@@ -0,0 +1,232 @@
|
|
|
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.dispatchCommand = dispatchCommand;
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
const logger_1 = require("../utils/logger");
|
|
39
|
+
const file_1 = require("../utils/file");
|
|
40
|
+
async function dispatchCommand(options, command) {
|
|
41
|
+
const logger = new logger_1.Logger();
|
|
42
|
+
try {
|
|
43
|
+
const planPath = path.resolve(options.plan);
|
|
44
|
+
if (!(await (0, file_1.fileExists)(planPath))) {
|
|
45
|
+
logger.error(`Error: Task plan not found: ${options.plan}`);
|
|
46
|
+
logger.info('Run spec-agent plan first to create task_plan.json.');
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
const taskPlan = await (0, file_1.readJson)(planPath);
|
|
50
|
+
logger.info(`Loaded task plan with ${taskPlan.totalTasks} tasks`);
|
|
51
|
+
// Parse agent mapping
|
|
52
|
+
const agentPools = parseAgentMapping(options.agents, taskPlan.totalTasks);
|
|
53
|
+
logger.info(`Agent pools: ${Object.entries(agentPools).map(([k, v]) => `${k}:${v}`).join(', ')}`);
|
|
54
|
+
// Preview mode
|
|
55
|
+
if (options.dryRun) {
|
|
56
|
+
logger.info('Dry run mode - dispatch plan preview:');
|
|
57
|
+
logger.info(` Total tasks: ${taskPlan.totalTasks}`);
|
|
58
|
+
logger.info(` Strategy: ${options.strategy}`);
|
|
59
|
+
for (const [type, count] of Object.entries(agentPools)) {
|
|
60
|
+
logger.info(` ${type} agents: ${count}`);
|
|
61
|
+
}
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const startTime = Date.now();
|
|
65
|
+
// Collect all tasks
|
|
66
|
+
const allTasks = [];
|
|
67
|
+
for (const group of taskPlan.parallelGroups) {
|
|
68
|
+
allTasks.push(...group.tasks);
|
|
69
|
+
}
|
|
70
|
+
// Assign tasks to agents based on strategy
|
|
71
|
+
const assignments = assignTasksToAgents(allTasks, agentPools, options.strategy);
|
|
72
|
+
// Build agent pools structure
|
|
73
|
+
const agentPoolAssignments = {};
|
|
74
|
+
for (const [type, count] of Object.entries(agentPools)) {
|
|
75
|
+
agentPoolAssignments[type] = [];
|
|
76
|
+
for (let i = 1; i <= count; i++) {
|
|
77
|
+
const agentId = `${type.toUpperCase()}-${i}`;
|
|
78
|
+
const assignedTasks = assignments
|
|
79
|
+
.filter(a => a.agentId === agentId)
|
|
80
|
+
.flatMap(a => a.assignedTasks);
|
|
81
|
+
const totalHours = allTasks
|
|
82
|
+
.filter(t => assignedTasks.includes(t.id))
|
|
83
|
+
.reduce((sum, t) => sum + (t.estimatedHours || 0), 0);
|
|
84
|
+
agentPoolAssignments[type].push({
|
|
85
|
+
agentId,
|
|
86
|
+
type,
|
|
87
|
+
assignedTasks,
|
|
88
|
+
workload: `${totalHours}h`,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Find unassigned tasks
|
|
93
|
+
const assignedTaskIds = new Set(assignments.flatMap(a => a.assignedTasks));
|
|
94
|
+
const unassigned = allTasks
|
|
95
|
+
.filter(t => !assignedTaskIds.has(t.id))
|
|
96
|
+
.map(t => t.id);
|
|
97
|
+
if (unassigned.length > 0) {
|
|
98
|
+
logger.warn(`${unassigned.length} tasks could not be assigned`);
|
|
99
|
+
}
|
|
100
|
+
// Create dispatch plan
|
|
101
|
+
const dispatchPlan = {
|
|
102
|
+
version: '1.0.0',
|
|
103
|
+
createdAt: new Date().toISOString(),
|
|
104
|
+
totalTasks: taskPlan.totalTasks,
|
|
105
|
+
agentPools: agentPoolAssignments,
|
|
106
|
+
unassigned,
|
|
107
|
+
dispatchPlanPath: path.resolve(options.output),
|
|
108
|
+
};
|
|
109
|
+
// Write output
|
|
110
|
+
const outputPath = path.resolve(options.output);
|
|
111
|
+
await (0, file_1.ensureDir)(path.dirname(outputPath));
|
|
112
|
+
await (0, file_1.writeJson)(outputPath, dispatchPlan);
|
|
113
|
+
const duration = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
114
|
+
logger.success(`Dispatch plan created in ${duration}s`);
|
|
115
|
+
logger.json({
|
|
116
|
+
status: 'success',
|
|
117
|
+
totalTasks: taskPlan.totalTasks,
|
|
118
|
+
agentTypes: Object.keys(agentPools).length,
|
|
119
|
+
totalAgents: Object.values(agentPools).reduce((a, b) => a + b, 0),
|
|
120
|
+
unassigned: unassigned.length,
|
|
121
|
+
outputPath,
|
|
122
|
+
});
|
|
123
|
+
// Print assignment summary
|
|
124
|
+
for (const [type, agents] of Object.entries(agentPoolAssignments)) {
|
|
125
|
+
for (const agent of agents) {
|
|
126
|
+
logger.info(` ${agent.agentId}: ${agent.assignedTasks.length} tasks, ${agent.workload}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
logger.error(`Dispatch failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
function parseAgentMapping(agentsStr, totalTasks) {
|
|
136
|
+
if (!agentsStr) {
|
|
137
|
+
// Auto-determine based on task count
|
|
138
|
+
if (totalTasks <= 5) {
|
|
139
|
+
return { frontend: 1, backend: 1 };
|
|
140
|
+
}
|
|
141
|
+
else if (totalTasks <= 15) {
|
|
142
|
+
return { frontend: 2, backend: 2, qa: 1 };
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
return { frontend: 3, backend: 3, qa: 2 };
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
const pools = {};
|
|
149
|
+
const pairs = agentsStr.split(',');
|
|
150
|
+
for (const pair of pairs) {
|
|
151
|
+
const [type, count] = pair.split(':');
|
|
152
|
+
if (type && count) {
|
|
153
|
+
pools[type.trim()] = parseInt(count.trim(), 10);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return pools;
|
|
157
|
+
}
|
|
158
|
+
function assignTasksToAgents(tasks, agentPools, strategy) {
|
|
159
|
+
const assignments = [];
|
|
160
|
+
// Create agent instances
|
|
161
|
+
const agents = [];
|
|
162
|
+
for (const [type, count] of Object.entries(agentPools)) {
|
|
163
|
+
for (let i = 1; i <= count; i++) {
|
|
164
|
+
agents.push({ id: `${type.toUpperCase()}-${i}`, type, workload: 0 });
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Sort tasks by priority and estimated hours
|
|
168
|
+
const sortedTasks = [...tasks].sort((a, b) => {
|
|
169
|
+
const priorityOrder = { P0: 0, P1: 1, P2: 2, P3: 3 };
|
|
170
|
+
if (priorityOrder[a.priority] !== priorityOrder[b.priority]) {
|
|
171
|
+
return priorityOrder[a.priority] - priorityOrder[b.priority];
|
|
172
|
+
}
|
|
173
|
+
return (b.estimatedHours || 0) - (a.estimatedHours || 0);
|
|
174
|
+
});
|
|
175
|
+
// Assign tasks
|
|
176
|
+
for (const task of sortedTasks) {
|
|
177
|
+
const taskType = mapTaskToAgentType(task);
|
|
178
|
+
// Find suitable agents
|
|
179
|
+
const suitableAgents = agents.filter(a => a.type === taskType);
|
|
180
|
+
if (suitableAgents.length === 0) {
|
|
181
|
+
// Fall back to any agent
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
// Select agent based on strategy
|
|
185
|
+
let selectedAgent;
|
|
186
|
+
switch (strategy) {
|
|
187
|
+
case 'load-first':
|
|
188
|
+
// Assign to agent with least workload
|
|
189
|
+
selectedAgent = suitableAgents.reduce((min, a) => a.workload < min.workload ? a : min);
|
|
190
|
+
break;
|
|
191
|
+
case 'skill-first':
|
|
192
|
+
// Assign to first suitable agent (specialization)
|
|
193
|
+
selectedAgent = suitableAgents[0];
|
|
194
|
+
break;
|
|
195
|
+
case 'balanced':
|
|
196
|
+
default:
|
|
197
|
+
// Round-robin with workload consideration
|
|
198
|
+
selectedAgent = suitableAgents.reduce((min, a) => a.workload < min.workload ? a : min);
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
// Record assignment
|
|
202
|
+
let assignment = assignments.find(a => a.agentId === selectedAgent.id);
|
|
203
|
+
if (!assignment) {
|
|
204
|
+
assignment = {
|
|
205
|
+
agentId: selectedAgent.id,
|
|
206
|
+
type: selectedAgent.type,
|
|
207
|
+
assignedTasks: [],
|
|
208
|
+
workload: '0h',
|
|
209
|
+
};
|
|
210
|
+
assignments.push(assignment);
|
|
211
|
+
}
|
|
212
|
+
assignment.assignedTasks.push(task.id);
|
|
213
|
+
selectedAgent.workload += task.estimatedHours || 0;
|
|
214
|
+
}
|
|
215
|
+
return assignments;
|
|
216
|
+
}
|
|
217
|
+
function mapTaskToAgentType(task) {
|
|
218
|
+
switch (task.type) {
|
|
219
|
+
case 'page':
|
|
220
|
+
case 'component':
|
|
221
|
+
return 'frontend';
|
|
222
|
+
case 'api':
|
|
223
|
+
return 'backend';
|
|
224
|
+
case 'test':
|
|
225
|
+
return 'qa';
|
|
226
|
+
case 'setup':
|
|
227
|
+
return 'frontend'; // or devops
|
|
228
|
+
default:
|
|
229
|
+
return 'frontend';
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=dispatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../src/commands/dispatch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
interface DoctorOptions {
|
|
3
|
+
workspace: string;
|
|
4
|
+
checkLlm?: boolean;
|
|
5
|
+
format: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function doctorCommand(options: DoctorOptions, command: Command): Promise<void>;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,UAAU,aAAa;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAcD,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA+G3F"}
|
|
@@ -0,0 +1,153 @@
|
|
|
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.doctorCommand = doctorCommand;
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
const logger_1 = require("../utils/logger");
|
|
39
|
+
const file_1 = require("../utils/file");
|
|
40
|
+
const llm_1 = require("../services/llm");
|
|
41
|
+
function parseNodeMajorVersion(version) {
|
|
42
|
+
const raw = version.startsWith('v') ? version.slice(1) : version;
|
|
43
|
+
const major = parseInt(raw.split('.')[0], 10);
|
|
44
|
+
return Number.isFinite(major) ? major : 0;
|
|
45
|
+
}
|
|
46
|
+
async function doctorCommand(options, command) {
|
|
47
|
+
const logger = new logger_1.Logger();
|
|
48
|
+
const checks = [];
|
|
49
|
+
const workspacePath = path.resolve(options.workspace);
|
|
50
|
+
try {
|
|
51
|
+
const nodeMajor = parseNodeMajorVersion(process.version);
|
|
52
|
+
checks.push({
|
|
53
|
+
name: 'node_version',
|
|
54
|
+
status: nodeMajor >= 18 ? 'pass' : 'fail',
|
|
55
|
+
message: `当前 Node 版本: ${process.version}(要求 >= 18)`,
|
|
56
|
+
});
|
|
57
|
+
try {
|
|
58
|
+
await (0, file_1.ensureDir)(workspacePath);
|
|
59
|
+
checks.push({
|
|
60
|
+
name: 'workspace_access',
|
|
61
|
+
status: 'pass',
|
|
62
|
+
message: `工作目录可访问: ${workspacePath}`,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
checks.push({
|
|
67
|
+
name: 'workspace_access',
|
|
68
|
+
status: 'fail',
|
|
69
|
+
message: `工作目录不可写: ${error instanceof Error ? error.message : String(error)}`,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
const llmConfig = (0, llm_1.getLLMConfig)();
|
|
73
|
+
try {
|
|
74
|
+
(0, llm_1.validateLLMConfig)(llmConfig);
|
|
75
|
+
checks.push({
|
|
76
|
+
name: 'llm_config',
|
|
77
|
+
status: 'pass',
|
|
78
|
+
message: `LLM 配置有效: ${llmConfig.model} @ ${llmConfig.baseUrl}`,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
checks.push({
|
|
83
|
+
name: 'llm_config',
|
|
84
|
+
status: 'fail',
|
|
85
|
+
message: error instanceof Error ? error.message : String(error),
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
const patternsPath = path.join(workspacePath, '.patterns.json');
|
|
89
|
+
const hasPatterns = await (0, file_1.fileExists)(patternsPath);
|
|
90
|
+
checks.push({
|
|
91
|
+
name: 'learned_patterns',
|
|
92
|
+
status: hasPatterns ? 'pass' : 'warn',
|
|
93
|
+
message: hasPatterns
|
|
94
|
+
? `检测到模式文件: ${patternsPath}`
|
|
95
|
+
: '未检测到 .patterns.json(首次运行可忽略)',
|
|
96
|
+
});
|
|
97
|
+
if (options.checkLlm) {
|
|
98
|
+
try {
|
|
99
|
+
(0, llm_1.validateLLMConfig)(llmConfig);
|
|
100
|
+
const probeConfig = {
|
|
101
|
+
...llmConfig,
|
|
102
|
+
maxTokens: 32,
|
|
103
|
+
temperature: 0,
|
|
104
|
+
};
|
|
105
|
+
await (0, llm_1.callLLM)('请返回 JSON:{"ok": true, "purpose": "healthcheck"}', probeConfig, logger);
|
|
106
|
+
checks.push({
|
|
107
|
+
name: 'llm_connectivity',
|
|
108
|
+
status: 'pass',
|
|
109
|
+
message: 'LLM 连通性检查通过',
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
checks.push({
|
|
114
|
+
name: 'llm_connectivity',
|
|
115
|
+
status: 'fail',
|
|
116
|
+
message: `LLM 连通性检查失败: ${error instanceof Error ? error.message : String(error)}`,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const failCount = checks.filter(c => c.status === 'fail').length;
|
|
121
|
+
const warnCount = checks.filter(c => c.status === 'warn').length;
|
|
122
|
+
if (options.format === 'json') {
|
|
123
|
+
logger.json({
|
|
124
|
+
status: failCount > 0 ? 'fail' : warnCount > 0 ? 'warn' : 'pass',
|
|
125
|
+
checks,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
logger.info(`Doctor workspace: ${workspacePath}`);
|
|
130
|
+
for (const check of checks) {
|
|
131
|
+
const prefix = check.status === 'pass' ? 'PASS' : check.status === 'warn' ? 'WARN' : 'FAIL';
|
|
132
|
+
logger.info(` [${prefix}] ${check.name}: ${check.message}`);
|
|
133
|
+
}
|
|
134
|
+
if (failCount === 0 && warnCount === 0) {
|
|
135
|
+
logger.success('所有检查通过');
|
|
136
|
+
}
|
|
137
|
+
else if (failCount === 0) {
|
|
138
|
+
logger.warn(`检查完成:${warnCount} 警告`);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
logger.error(`检查失败:${failCount} 错误, ${warnCount} 警告`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (failCount > 0) {
|
|
145
|
+
process.exit(2);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
logger.error(`Doctor failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
150
|
+
process.exit(1);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,sCA+GC;AAvID,2CAA6B;AAE7B,4CAAyC;AACzC,wCAAsD;AACtD,yCAA2E;AAc3E,SAAS,qBAAqB,CAAC,OAAe;IAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACjE,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9C,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC;AAEM,KAAK,UAAU,aAAa,CAAC,OAAsB,EAAE,OAAgB;IAC1E,MAAM,MAAM,GAAG,IAAI,eAAM,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEtD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,qBAAqB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,cAAc;YACpB,MAAM,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;YACzC,OAAO,EAAE,eAAe,OAAO,CAAC,OAAO,YAAY;SACpD,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,IAAA,gBAAS,EAAC,aAAa,CAAC,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,kBAAkB;gBACxB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,YAAY,aAAa,EAAE;aACrC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,kBAAkB;gBACxB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,YAAY,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;aAC9E,CAAC,CAAC;QACL,CAAC;QAED,MAAM,SAAS,GAAG,IAAA,kBAAY,GAAE,CAAC;QACjC,IAAI,CAAC;YACH,IAAA,uBAAiB,EAAC,SAAS,CAAC,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,YAAY;gBAClB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,aAAa,SAAS,CAAC,KAAK,MAAM,SAAS,CAAC,OAAO,EAAE;aAC/D,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,YAAY;gBAClB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAChE,CAAC,CAAC;QACL,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;QAChE,MAAM,WAAW,GAAG,MAAM,IAAA,iBAAU,EAAC,YAAY,CAAC,CAAC;QACnD,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,kBAAkB;YACxB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;YACrC,OAAO,EAAE,WAAW;gBAClB,CAAC,CAAC,YAAY,YAAY,EAAE;gBAC5B,CAAC,CAAC,8BAA8B;SACnC,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,IAAA,uBAAiB,EAAC,SAAS,CAAC,CAAC;gBAC7B,MAAM,WAAW,GAAG;oBAClB,GAAG,SAAS;oBACZ,SAAS,EAAE,EAAE;oBACb,WAAW,EAAE,CAAC;iBACf,CAAC;gBACF,MAAM,IAAA,aAAO,EACX,iDAAiD,EACjD,WAAW,EACX,MAAM,CACP,CAAC;gBACF,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,kBAAkB;oBACxB,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,aAAa;iBACvB,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,kBAAkB;oBACxB,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,gBAAgB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;iBAClF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;QACjE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;QAEjE,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC;gBACV,MAAM,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;gBAChE,MAAM;aACP,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,qBAAqB,aAAa,EAAE,CAAC,CAAC;YAClD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;gBAC5F,MAAM,CAAC,IAAI,CAAC,MAAM,MAAM,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/D,CAAC;YACD,IAAI,SAAS,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;gBACvC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC3B,CAAC;iBAAM,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;gBAC3B,MAAM,CAAC,IAAI,CAAC,QAAQ,SAAS,KAAK,CAAC,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,QAAQ,SAAS,QAAQ,SAAS,KAAK,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;QAED,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,kBAAkB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACzF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
interface LearnOptions {
|
|
3
|
+
workspace: string;
|
|
4
|
+
from?: string;
|
|
5
|
+
pattern?: string;
|
|
6
|
+
rule?: string;
|
|
7
|
+
list?: boolean;
|
|
8
|
+
export?: string;
|
|
9
|
+
apply?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function learnCommand(options: LearnOptions, command: Command): Promise<void>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=learn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learn.d.ts","sourceRoot":"","sources":["../../src/commands/learn.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,UAAU,YAAY;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAID,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAsGzF"}
|