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,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":"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"}
@@ -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"}