speccore 6.83.0 → 6.89.0
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/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +32 -7
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/change.d.ts.map +1 -1
- package/dist/commands/change.js +39 -1
- package/dist/commands/change.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +118 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/pr.d.ts.map +1 -1
- package/dist/commands/pr.js +75 -38
- package/dist/commands/pr.js.map +1 -1
- package/dist/core/agents/defaults/_INDEX.md +68 -0
- package/dist/core/agents/defaults/_TEMPLATE.md +34 -0
- package/dist/core/agents/defaults/code-reviewer.md +49 -0
- package/dist/core/agents/defaults/compiler.md +25 -0
- package/dist/core/agents/defaults/compliance-checker.md +38 -0
- package/dist/core/agents/defaults/dependency-analyst.md +42 -0
- package/dist/core/agents/defaults/doc-sync-agent.md +25 -0
- package/dist/core/agents/defaults/impact-analyst.md +37 -0
- package/dist/core/agents/defaults/interaction-designer.md +73 -0
- package/dist/core/agents/defaults/performance-expert.md +35 -0
- package/dist/core/agents/defaults/product-analyst-backend.md +68 -0
- package/dist/core/agents/defaults/product-analyst-frontend.md +72 -0
- package/dist/core/agents/defaults/product-analyst.md +48 -0
- package/dist/core/agents/defaults/regression-tester.md +36 -0
- package/dist/core/agents/defaults/risk-assessor.md +38 -0
- package/dist/core/agents/defaults/schedule-planner.md +37 -0
- package/dist/core/agents/defaults/security-reviewer-finance.md +67 -0
- package/dist/core/agents/defaults/security-reviewer.md +43 -0
- package/dist/core/agents/defaults/task-decomposer.md +33 -0
- package/dist/core/agents/defaults/test-engineer.md +25 -0
- package/dist/core/agents/defaults/test-reviewer.md +48 -0
- package/dist/core/agents/engine/agent-executor.d.ts +50 -0
- package/dist/core/agents/engine/agent-executor.d.ts.map +1 -0
- package/dist/core/agents/engine/agent-executor.js +225 -0
- package/dist/core/agents/engine/agent-executor.js.map +1 -0
- package/dist/core/agents/engine/agent-loader.d.ts +58 -0
- package/dist/core/agents/engine/agent-loader.d.ts.map +1 -0
- package/dist/core/agents/engine/agent-loader.js +377 -0
- package/dist/core/agents/engine/agent-loader.js.map +1 -0
- package/dist/core/agents/engine/types.d.ts +71 -0
- package/dist/core/agents/engine/types.d.ts.map +1 -0
- package/dist/core/agents/engine/types.js +8 -0
- package/dist/core/agents/engine/types.js.map +1 -0
- package/dist/core/agents/index.d.ts +4 -0
- package/dist/core/agents/index.d.ts.map +1 -1
- package/dist/core/agents/index.js +17 -1
- package/dist/core/agents/index.js.map +1 -1
- package/dist/core/command-loader.d.ts +31 -0
- package/dist/core/command-loader.d.ts.map +1 -0
- package/dist/core/command-loader.js +76 -0
- package/dist/core/command-loader.js.map +1 -0
- package/dist/core/commands/defaults/change-impact.md +40 -0
- package/dist/core/commands/defaults/pr-review.md +42 -0
- package/dist/core/commands/defaults/refactor.md +37 -0
- package/dist/core/context-injector.d.ts +56 -0
- package/dist/core/context-injector.d.ts.map +1 -0
- package/dist/core/context-injector.js +122 -0
- package/dist/core/context-injector.js.map +1 -0
- package/dist/core/hook-runner.d.ts +36 -0
- package/dist/core/hook-runner.d.ts.map +1 -0
- package/dist/core/hook-runner.js +93 -0
- package/dist/core/hook-runner.js.map +1 -0
- package/dist/core/hooks/defaults/post-execute.md +22 -0
- package/dist/core/hooks/defaults/pre-execute.md +18 -0
- package/dist/core/prompt-builder.d.ts +1 -0
- package/dist/core/prompt-builder.d.ts.map +1 -1
- package/dist/core/prompt-builder.js +60 -1
- package/dist/core/prompt-builder.js.map +1 -1
- package/dist/core/rule-loader.d.ts +38 -0
- package/dist/core/rule-loader.d.ts.map +1 -0
- package/dist/core/rule-loader.js +156 -0
- package/dist/core/rule-loader.js.map +1 -0
- package/dist/core/rules/defaults/_INDEX.md +16 -0
- package/dist/core/rules/defaults/api-design.md +44 -0
- package/dist/core/rules/defaults/database.md +37 -0
- package/dist/core/rules/defaults/frontend-common.md +38 -0
- package/dist/core/rules/defaults/nodejs.md +38 -0
- package/dist/core/rules/defaults/react.md +34 -0
- package/dist/core/rules/defaults/security.md +31 -0
- package/dist/core/rules/defaults/testing.md +35 -0
- package/dist/core/rules/defaults/typescript.md +36 -0
- package/dist/core/skill-loader.d.ts +28 -0
- package/dist/core/skill-loader.d.ts.map +1 -0
- package/dist/core/skill-loader.js +102 -0
- package/dist/core/skill-loader.js.map +1 -0
- package/dist/core/skills/defaults/caching.md +33 -0
- package/dist/core/skills/defaults/db-migration.md +46 -0
- package/dist/core/skills/defaults/deployment.md +50 -0
- package/dist/core/skills/defaults/logging.md +38 -0
- package/dist/core/verify-engine.d.ts +7 -0
- package/dist/core/verify-engine.d.ts.map +1 -1
- package/dist/core/verify-engine.js +27 -1
- package/dist/core/verify-engine.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* AGENTS 引擎 — 加载器
|
|
4
|
+
*
|
|
5
|
+
* 负责:
|
|
6
|
+
* 1. 扫描 .speccore/AGENTS/ 目录下的角色定义
|
|
7
|
+
* 2. 解析 Markdown 文件为 AgentDefinition
|
|
8
|
+
* 3. 解析 _INDEX.md 注册表
|
|
9
|
+
* 4. 根据 platform/industry 解析特化版本
|
|
10
|
+
* 5. 条件过滤和优先级排序
|
|
11
|
+
*
|
|
12
|
+
* v6.84.0+
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.resolveAgentName = resolveAgentName;
|
|
16
|
+
exports.loadAllAgents = loadAllAgents;
|
|
17
|
+
exports.loadRegistry = loadRegistry;
|
|
18
|
+
exports.resolveAgentsForPhase = resolveAgentsForPhase;
|
|
19
|
+
exports.loadAgentDefinition = loadAgentDefinition;
|
|
20
|
+
exports.getBuiltinAgentContents = getBuiltinAgentContents;
|
|
21
|
+
exports.getBuiltinRegistryContent = getBuiltinRegistryContent;
|
|
22
|
+
exports.getBuiltinTemplateContent = getBuiltinTemplateContent;
|
|
23
|
+
const path_1 = require("path");
|
|
24
|
+
const fs_extra_1 = require("fs-extra");
|
|
25
|
+
const BUILTIN_AGENTS_DIR = (0, path_1.join)(__dirname, '..', 'defaults');
|
|
26
|
+
// ============================================================
|
|
27
|
+
// 1. Markdown 解析
|
|
28
|
+
// ============================================================
|
|
29
|
+
function parseAgentMarkdown(content, source) {
|
|
30
|
+
const name = extractHeading(content) || 'unknown';
|
|
31
|
+
const description = extractSection(content, '职责') || extractSection(content, 'Description') || '';
|
|
32
|
+
const responsibilities = extractListItems(content, '职责') || extractListItems(content, 'Responsibilities') || [];
|
|
33
|
+
const inputSpec = extractSection(content, '输入') || extractSection(content, 'Input') || '';
|
|
34
|
+
const checkList = extractCheckboxItems(content) || [];
|
|
35
|
+
const outputFormat = extractSection(content, '输出格式') || extractSection(content, 'Output Format') || '';
|
|
36
|
+
const activations = parseSelfDescribedActivations(content);
|
|
37
|
+
// rolePrompt = 整个文档内容(作为 AI 的 system prompt 注入)
|
|
38
|
+
const rolePrompt = content;
|
|
39
|
+
return {
|
|
40
|
+
name,
|
|
41
|
+
description,
|
|
42
|
+
responsibilities,
|
|
43
|
+
inputSpec,
|
|
44
|
+
checkList,
|
|
45
|
+
outputFormat,
|
|
46
|
+
rolePrompt,
|
|
47
|
+
source,
|
|
48
|
+
activations,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* 解析 Agent 自描述激活规则
|
|
53
|
+
* 从 Markdown 中的 "## 激活规则" 或 "## Activations" 部分提取
|
|
54
|
+
*
|
|
55
|
+
* 支持格式:
|
|
56
|
+
* | 命令 | 阶段 | 优先级 | 条件 |
|
|
57
|
+
* | :--- | :--- | :--- | :--- |
|
|
58
|
+
* | analyze | clarify | 60 | project.industry == 'finance' |
|
|
59
|
+
*/
|
|
60
|
+
function parseSelfDescribedActivations(content) {
|
|
61
|
+
const section = extractSection(content, '激活规则') || extractSection(content, 'Activations');
|
|
62
|
+
if (!section)
|
|
63
|
+
return [];
|
|
64
|
+
const activations = [];
|
|
65
|
+
const lines = section.split('\n').filter(l => l.trim().startsWith('|') && !l.trim().match(/^\|[\s-:]+\|/));
|
|
66
|
+
for (const line of lines) {
|
|
67
|
+
const cells = line.split('|').map(c => c.trim()).filter(Boolean);
|
|
68
|
+
if (cells.length >= 3) {
|
|
69
|
+
activations.push({
|
|
70
|
+
command: cells[0],
|
|
71
|
+
phase: cells[1],
|
|
72
|
+
priority: parseInt(cells[2], 10) || 50,
|
|
73
|
+
condition: cells[3] && cells[3] !== '—' && cells[3] !== '-' ? cells[3] : undefined,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return activations;
|
|
78
|
+
}
|
|
79
|
+
function extractHeading(content) {
|
|
80
|
+
const m = content.match(/^#\s+Agent:\s*(.+)$/m);
|
|
81
|
+
return m?.[1].trim();
|
|
82
|
+
}
|
|
83
|
+
function extractSection(content, sectionName) {
|
|
84
|
+
const regex = new RegExp(`^##\\s+${sectionName}\\s*\\n(.*?)(?=\\n##\\s|$)`, 'ms');
|
|
85
|
+
const m = content.match(regex);
|
|
86
|
+
return m?.[1].trim();
|
|
87
|
+
}
|
|
88
|
+
function extractListItems(content, sectionName) {
|
|
89
|
+
const section = extractSection(content, sectionName);
|
|
90
|
+
if (!section)
|
|
91
|
+
return undefined;
|
|
92
|
+
const items = [];
|
|
93
|
+
for (const line of section.split('\n')) {
|
|
94
|
+
const m = line.match(/^\s*[-*]\s+(.+)$/);
|
|
95
|
+
if (m)
|
|
96
|
+
items.push(m[1].trim());
|
|
97
|
+
}
|
|
98
|
+
return items.length > 0 ? items : undefined;
|
|
99
|
+
}
|
|
100
|
+
function extractCheckboxItems(content) {
|
|
101
|
+
const items = [];
|
|
102
|
+
const matches = content.match(/^\s*-\s*\[[ x]\]\s*(.+)$/gm);
|
|
103
|
+
if (matches) {
|
|
104
|
+
for (const m of matches) {
|
|
105
|
+
const item = m.replace(/^\s*-\s*\[[ x]\]\s*/, '').trim();
|
|
106
|
+
if (item)
|
|
107
|
+
items.push(item);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return items.length > 0 ? items : undefined;
|
|
111
|
+
}
|
|
112
|
+
// ============================================================
|
|
113
|
+
// 2. 注册表解析
|
|
114
|
+
// ============================================================
|
|
115
|
+
function parseRegistryMarkdown(content) {
|
|
116
|
+
const phases = {};
|
|
117
|
+
const phaseMatches = content.matchAll(/^##\s+(.+?)\s*\/\s*(.+?)\s*\n([\s\S]*?)(?=\n##\s|$)/gm);
|
|
118
|
+
for (const match of phaseMatches) {
|
|
119
|
+
const command = match[1].trim();
|
|
120
|
+
const phase = match[2].trim();
|
|
121
|
+
const phaseKey = `${command}/${phase}`;
|
|
122
|
+
const tableContent = match[3];
|
|
123
|
+
phases[phaseKey] = parseRegistryTable(tableContent);
|
|
124
|
+
}
|
|
125
|
+
return { phases };
|
|
126
|
+
}
|
|
127
|
+
function parseRegistryTable(content) {
|
|
128
|
+
const entries = [];
|
|
129
|
+
const lines = content.split('\n').filter(l => l.trim().startsWith('|') && !l.trim().match(/^\|[\s-:]+\|/));
|
|
130
|
+
for (const line of lines) {
|
|
131
|
+
const cells = line.split('|').map(c => c.trim()).filter(Boolean);
|
|
132
|
+
if (cells.length >= 2) {
|
|
133
|
+
entries.push({
|
|
134
|
+
agent: cells[0],
|
|
135
|
+
priority: parseInt(cells[1], 10) || 50,
|
|
136
|
+
condition: cells[2] && cells[2] !== '—' && cells[2] !== '-' ? cells[2] : undefined,
|
|
137
|
+
description: cells[3],
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return entries;
|
|
142
|
+
}
|
|
143
|
+
// ============================================================
|
|
144
|
+
// 3. 条件表达式求值(简单实现)
|
|
145
|
+
// ============================================================
|
|
146
|
+
function evaluateCondition(condition, context) {
|
|
147
|
+
if (!condition)
|
|
148
|
+
return true;
|
|
149
|
+
try {
|
|
150
|
+
// 支持的格式:
|
|
151
|
+
// project.industry == 'finance'
|
|
152
|
+
// project.securityLevel > 2
|
|
153
|
+
// platform == 'backend'
|
|
154
|
+
const eqMatch = condition.match(/^(.+?)\s*==\s*['"](.+?)['"]$/);
|
|
155
|
+
if (eqMatch) {
|
|
156
|
+
const path = eqMatch[1].trim();
|
|
157
|
+
const expected = eqMatch[2];
|
|
158
|
+
const actual = getContextValue(context, path);
|
|
159
|
+
return String(actual) === expected;
|
|
160
|
+
}
|
|
161
|
+
const gtMatch = condition.match(/^(.+?)\s*>\s*(\d+)$/);
|
|
162
|
+
if (gtMatch) {
|
|
163
|
+
const path = gtMatch[1].trim();
|
|
164
|
+
const expected = parseInt(gtMatch[2], 10);
|
|
165
|
+
const actual = getContextValue(context, path);
|
|
166
|
+
return Number(actual) > expected;
|
|
167
|
+
}
|
|
168
|
+
const gteMatch = condition.match(/^(.+?)\s*>=\s*(\d+)$/);
|
|
169
|
+
if (gteMatch) {
|
|
170
|
+
const path = gteMatch[1].trim();
|
|
171
|
+
const expected = parseInt(gteMatch[2], 10);
|
|
172
|
+
const actual = getContextValue(context, path);
|
|
173
|
+
return Number(actual) >= expected;
|
|
174
|
+
}
|
|
175
|
+
// 简单布尔:存在即真
|
|
176
|
+
const path = condition.trim();
|
|
177
|
+
const actual = getContextValue(context, path);
|
|
178
|
+
return actual !== undefined && actual !== null && actual !== false;
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
return true; // 条件解析失败,默认通过
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
function getContextValue(context, path) {
|
|
185
|
+
const parts = path.split('.');
|
|
186
|
+
let current = context;
|
|
187
|
+
for (const part of parts) {
|
|
188
|
+
if (current === null || current === undefined)
|
|
189
|
+
return undefined;
|
|
190
|
+
current = current[part];
|
|
191
|
+
}
|
|
192
|
+
return current;
|
|
193
|
+
}
|
|
194
|
+
// ============================================================
|
|
195
|
+
// 4. Agent 扫描与加载
|
|
196
|
+
// ============================================================
|
|
197
|
+
/**
|
|
198
|
+
* 扫描指定目录下的所有 Agent 定义文件
|
|
199
|
+
*/
|
|
200
|
+
async function scanAgentFiles(dir) {
|
|
201
|
+
if (!(await (0, fs_extra_1.pathExists)(dir)))
|
|
202
|
+
return [];
|
|
203
|
+
const entries = await (0, fs_extra_1.readdir)(dir, { withFileTypes: true });
|
|
204
|
+
const agents = [];
|
|
205
|
+
for (const e of entries) {
|
|
206
|
+
if (!e.isFile() || !e.name.endsWith('.md'))
|
|
207
|
+
continue;
|
|
208
|
+
if (e.name.startsWith('_'))
|
|
209
|
+
continue; // _INDEX.md, _TEMPLATE.md 跳过
|
|
210
|
+
const content = await (0, fs_extra_1.readFile)((0, path_1.join)(dir, e.name), 'utf-8');
|
|
211
|
+
agents.push({
|
|
212
|
+
name: e.name.replace(/\.md$/, ''),
|
|
213
|
+
content,
|
|
214
|
+
source: dir === BUILTIN_AGENTS_DIR ? 'builtin' : 'user-defined',
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
return agents;
|
|
218
|
+
}
|
|
219
|
+
// ============================================================
|
|
220
|
+
// 5. 特化版本解析
|
|
221
|
+
// ============================================================
|
|
222
|
+
/**
|
|
223
|
+
* 根据 platform/industry 解析特化版本的 Agent 名称
|
|
224
|
+
*
|
|
225
|
+
* 优先级:platform-specific > industry-specific > generic
|
|
226
|
+
*/
|
|
227
|
+
function resolveAgentName(baseAgent, context, availableAgents) {
|
|
228
|
+
const platform = context.platform;
|
|
229
|
+
const industry = context.project?.industry;
|
|
230
|
+
// 1. 尝试 platform-specific: product-analyst-backend
|
|
231
|
+
if (platform) {
|
|
232
|
+
const platformSpecific = `${baseAgent}-${platform}`;
|
|
233
|
+
if (availableAgents.has(platformSpecific))
|
|
234
|
+
return platformSpecific;
|
|
235
|
+
}
|
|
236
|
+
// 2. 尝试 industry-specific: security-reviewer-finance
|
|
237
|
+
if (industry) {
|
|
238
|
+
const industrySpecific = `${baseAgent}-${industry}`;
|
|
239
|
+
if (availableAgents.has(industrySpecific))
|
|
240
|
+
return industrySpecific;
|
|
241
|
+
}
|
|
242
|
+
// 3. 回退到通用版
|
|
243
|
+
return baseAgent;
|
|
244
|
+
}
|
|
245
|
+
// ============================================================
|
|
246
|
+
// 6. 主 API
|
|
247
|
+
// ============================================================
|
|
248
|
+
/**
|
|
249
|
+
* 加载所有可用的 Agent 定义
|
|
250
|
+
* 优先读取用户自定义,回退到内置默认
|
|
251
|
+
*/
|
|
252
|
+
async function loadAllAgents(projectRoot) {
|
|
253
|
+
const agents = new Map();
|
|
254
|
+
const userAgentsDir = (0, path_1.join)(projectRoot, '.speccore', 'AGENTS');
|
|
255
|
+
// 1. 先加载内置默认
|
|
256
|
+
const builtinFiles = await scanAgentFiles(BUILTIN_AGENTS_DIR);
|
|
257
|
+
for (const f of builtinFiles) {
|
|
258
|
+
const def = parseAgentMarkdown(f.content, 'builtin');
|
|
259
|
+
agents.set(f.name, def);
|
|
260
|
+
}
|
|
261
|
+
// 2. 用户自定义覆盖(同名覆盖)
|
|
262
|
+
const userFiles = await scanAgentFiles(userAgentsDir);
|
|
263
|
+
for (const f of userFiles) {
|
|
264
|
+
const def = parseAgentMarkdown(f.content, 'user-defined');
|
|
265
|
+
agents.set(f.name, def);
|
|
266
|
+
}
|
|
267
|
+
return agents;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* 加载注册表
|
|
271
|
+
* 优先读取用户自定义,回退到内置默认
|
|
272
|
+
*/
|
|
273
|
+
async function loadRegistry(projectRoot) {
|
|
274
|
+
const userIndex = (0, path_1.join)(projectRoot, '.speccore', 'AGENTS', '_INDEX.md');
|
|
275
|
+
const builtinIndex = (0, path_1.join)(BUILTIN_AGENTS_DIR, '_INDEX.md');
|
|
276
|
+
let content = '';
|
|
277
|
+
if (await (0, fs_extra_1.pathExists)(userIndex)) {
|
|
278
|
+
content = await (0, fs_extra_1.readFile)(userIndex, 'utf-8');
|
|
279
|
+
}
|
|
280
|
+
else if (await (0, fs_extra_1.pathExists)(builtinIndex)) {
|
|
281
|
+
content = await (0, fs_extra_1.readFile)(builtinIndex, 'utf-8');
|
|
282
|
+
}
|
|
283
|
+
if (!content)
|
|
284
|
+
return { phases: {} };
|
|
285
|
+
return parseRegistryMarkdown(content);
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* 获取指定命令/阶段下需要激活的 Agent 列表
|
|
289
|
+
* 返回按优先级排序的 ResolvedAgent 数组
|
|
290
|
+
*
|
|
291
|
+
* 混合模式:
|
|
292
|
+
* 1. 注册表中的核心角色(显式配置,优先)
|
|
293
|
+
* 2. 用户自定义角色的自描述激活规则(扩展)
|
|
294
|
+
*/
|
|
295
|
+
async function resolveAgentsForPhase(command, phase, context, projectRoot) {
|
|
296
|
+
const phaseKey = `${command}/${phase}`;
|
|
297
|
+
// 1. 加载注册表和 Agent 定义
|
|
298
|
+
const registry = await loadRegistry(projectRoot);
|
|
299
|
+
const allAgents = await loadAllAgents(projectRoot);
|
|
300
|
+
const availableNames = new Set(allAgents.keys());
|
|
301
|
+
// 2. 收集注册表中的角色
|
|
302
|
+
const registryEntries = registry.phases[phaseKey] || [];
|
|
303
|
+
const resolvedMap = new Map();
|
|
304
|
+
for (const entry of registryEntries) {
|
|
305
|
+
if (!evaluateCondition(entry.condition, context))
|
|
306
|
+
continue;
|
|
307
|
+
const resolvedName = resolveAgentName(entry.agent, context, availableNames);
|
|
308
|
+
const def = allAgents.get(resolvedName);
|
|
309
|
+
if (!def)
|
|
310
|
+
continue;
|
|
311
|
+
resolvedMap.set(resolvedName, {
|
|
312
|
+
name: resolvedName,
|
|
313
|
+
definition: def,
|
|
314
|
+
priority: entry.priority,
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
// 3. 扫描用户自定义角色的自描述激活规则(扩展角色)
|
|
318
|
+
for (const [agentName, def] of allAgents) {
|
|
319
|
+
// 只扫描用户自定义的角色(内置角色不扫描自描述规则)
|
|
320
|
+
if (def.source !== 'user-defined')
|
|
321
|
+
continue;
|
|
322
|
+
// 已在注册表中的跳过(注册表优先)
|
|
323
|
+
if (resolvedMap.has(agentName))
|
|
324
|
+
continue;
|
|
325
|
+
for (const act of def.activations) {
|
|
326
|
+
if (act.command === command && act.phase === phase) {
|
|
327
|
+
if (evaluateCondition(act.condition, context)) {
|
|
328
|
+
resolvedMap.set(agentName, {
|
|
329
|
+
name: agentName,
|
|
330
|
+
definition: def,
|
|
331
|
+
priority: act.priority,
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
break; // 匹配到一个就够了
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
// 4. 按优先级排序(高优先级在前)
|
|
339
|
+
const resolved = Array.from(resolvedMap.values());
|
|
340
|
+
resolved.sort((a, b) => b.priority - a.priority);
|
|
341
|
+
return resolved;
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* 获取单个 Agent 的定义
|
|
345
|
+
*/
|
|
346
|
+
async function loadAgentDefinition(agentName, projectRoot) {
|
|
347
|
+
const allAgents = await loadAllAgents(projectRoot);
|
|
348
|
+
return allAgents.get(agentName);
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* 获取内置 Agent 的原始 Markdown 内容(用于 init 时复制到项目)
|
|
352
|
+
*/
|
|
353
|
+
async function getBuiltinAgentContents() {
|
|
354
|
+
const files = await scanAgentFiles(BUILTIN_AGENTS_DIR);
|
|
355
|
+
return files.map(f => ({ name: f.name, content: f.content }));
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* 获取内置注册表内容(用于 init 时复制到项目)
|
|
359
|
+
*/
|
|
360
|
+
async function getBuiltinRegistryContent() {
|
|
361
|
+
const path = (0, path_1.join)(BUILTIN_AGENTS_DIR, '_INDEX.md');
|
|
362
|
+
if (await (0, fs_extra_1.pathExists)(path)) {
|
|
363
|
+
return (0, fs_extra_1.readFile)(path, 'utf-8');
|
|
364
|
+
}
|
|
365
|
+
return undefined;
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* 获取内置模板内容(用于 init 时复制到项目)
|
|
369
|
+
*/
|
|
370
|
+
async function getBuiltinTemplateContent() {
|
|
371
|
+
const path = (0, path_1.join)(BUILTIN_AGENTS_DIR, '_TEMPLATE.md');
|
|
372
|
+
if (await (0, fs_extra_1.pathExists)(path)) {
|
|
373
|
+
return (0, fs_extra_1.readFile)(path, 'utf-8');
|
|
374
|
+
}
|
|
375
|
+
return undefined;
|
|
376
|
+
}
|
|
377
|
+
//# sourceMappingURL=agent-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-loader.js","sourceRoot":"","sources":["../../../../src/core/agents/engine/agent-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AGENTS 引擎 — 类型定义
|
|
3
|
+
*
|
|
4
|
+
* v6.84.0+: 规范数据库驱动的 Multi-Agent 调度架构
|
|
5
|
+
*/
|
|
6
|
+
export interface AgentDefinition {
|
|
7
|
+
name: string;
|
|
8
|
+
description: string;
|
|
9
|
+
responsibilities: string[];
|
|
10
|
+
inputSpec: string;
|
|
11
|
+
checkList: string[];
|
|
12
|
+
outputFormat: string;
|
|
13
|
+
rolePrompt: string;
|
|
14
|
+
source: 'builtin' | 'user-defined';
|
|
15
|
+
activations: AgentActivation[];
|
|
16
|
+
}
|
|
17
|
+
export interface AgentActivation {
|
|
18
|
+
command: string;
|
|
19
|
+
phase: string;
|
|
20
|
+
priority: number;
|
|
21
|
+
condition?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface AgentRegistryEntry {
|
|
24
|
+
agent: string;
|
|
25
|
+
priority: number;
|
|
26
|
+
condition?: string;
|
|
27
|
+
description?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface AgentRegistry {
|
|
30
|
+
phases: Record<string, AgentRegistryEntry[]>;
|
|
31
|
+
}
|
|
32
|
+
export interface AgentContext {
|
|
33
|
+
iteration?: string;
|
|
34
|
+
iterationDir?: string;
|
|
35
|
+
taskDir?: string;
|
|
36
|
+
codePath?: string;
|
|
37
|
+
platform?: string;
|
|
38
|
+
project?: {
|
|
39
|
+
industry?: string;
|
|
40
|
+
securityLevel?: number;
|
|
41
|
+
[key: string]: any;
|
|
42
|
+
};
|
|
43
|
+
[key: string]: any;
|
|
44
|
+
}
|
|
45
|
+
export interface AgentTask {
|
|
46
|
+
agent: string;
|
|
47
|
+
input: AgentContext;
|
|
48
|
+
priority?: number;
|
|
49
|
+
}
|
|
50
|
+
export interface AgentResult {
|
|
51
|
+
agent: string;
|
|
52
|
+
passed: boolean;
|
|
53
|
+
findings: AgentFinding[];
|
|
54
|
+
rewrite?: string;
|
|
55
|
+
nextAgents?: string[];
|
|
56
|
+
duration: number;
|
|
57
|
+
output?: string;
|
|
58
|
+
}
|
|
59
|
+
export interface AgentFinding {
|
|
60
|
+
severity: 'critical' | 'major' | 'minor' | 'info';
|
|
61
|
+
category: string;
|
|
62
|
+
message: string;
|
|
63
|
+
suggestion?: string;
|
|
64
|
+
location?: string;
|
|
65
|
+
}
|
|
66
|
+
export interface ResolvedAgent {
|
|
67
|
+
name: string;
|
|
68
|
+
definition: AgentDefinition;
|
|
69
|
+
priority: number;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/engine/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,GAAG,cAAc,CAAC;IACnC,WAAW,EAAE,eAAe,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC;CAC9C;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,YAAY,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,eAAe,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/core/agents/engine/types.ts"],"names":[],"mappings":";AAAA;;;;GAIG"}
|
|
@@ -2,7 +2,11 @@
|
|
|
2
2
|
* Agents Module — 专业 AI 角色定义
|
|
3
3
|
*
|
|
4
4
|
* v6.83.0+: 从单一 AGENTS.md 总纲 → 多角色专业化分离
|
|
5
|
+
* v6.84.0+: 规范数据库驱动(.speccore/AGENTS/)+ 混合调度器
|
|
5
6
|
* 每个角色包含:角色定义、专业 prompt 构建、领域特定检查清单
|
|
6
7
|
*/
|
|
7
8
|
export { PRODUCT_ANALYST_ROLE, INTERACTION_DESIGNER_ROLE, buildProductAnalystPrompt, buildInteractionDesignerPrompt, } from './product-analyst';
|
|
9
|
+
export { AgentDefinition, AgentActivation, AgentRegistryEntry, AgentRegistry, AgentContext, AgentTask, AgentResult, AgentFinding, ResolvedAgent, } from './engine/types';
|
|
10
|
+
export { loadAllAgents, loadRegistry, resolveAgentsForPhase, loadAgentDefinition, resolveAgentName, getBuiltinAgentContents, getBuiltinRegistryContent, getBuiltinTemplateContent, } from './engine/agent-loader';
|
|
11
|
+
export { buildAgentPrompt, prepareAgentTask, parseAgentResponse, mergeAgentResults, } from './engine/agent-executor';
|
|
8
12
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/agents/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/agents/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EACzB,yBAAyB,EACzB,8BAA8B,GAC/B,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,SAAS,EACT,WAAW,EACX,YAAY,EACZ,aAAa,GACd,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,aAAa,EACb,YAAY,EACZ,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,EAChB,uBAAuB,EACvB,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,yBAAyB,CAAC"}
|
|
@@ -3,13 +3,29 @@
|
|
|
3
3
|
* Agents Module — 专业 AI 角色定义
|
|
4
4
|
*
|
|
5
5
|
* v6.83.0+: 从单一 AGENTS.md 总纲 → 多角色专业化分离
|
|
6
|
+
* v6.84.0+: 规范数据库驱动(.speccore/AGENTS/)+ 混合调度器
|
|
6
7
|
* 每个角色包含:角色定义、专业 prompt 构建、领域特定检查清单
|
|
7
8
|
*/
|
|
8
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.buildInteractionDesignerPrompt = exports.buildProductAnalystPrompt = exports.INTERACTION_DESIGNER_ROLE = exports.PRODUCT_ANALYST_ROLE = void 0;
|
|
10
|
+
exports.mergeAgentResults = exports.parseAgentResponse = exports.prepareAgentTask = exports.buildAgentPrompt = exports.getBuiltinTemplateContent = exports.getBuiltinRegistryContent = exports.getBuiltinAgentContents = exports.resolveAgentName = exports.loadAgentDefinition = exports.resolveAgentsForPhase = exports.loadRegistry = exports.loadAllAgents = exports.buildInteractionDesignerPrompt = exports.buildProductAnalystPrompt = exports.INTERACTION_DESIGNER_ROLE = exports.PRODUCT_ANALYST_ROLE = void 0;
|
|
11
|
+
// ── 向后兼容:保留 v6.83.0 硬编码角色(内部使用,不鼓励新代码直接引用)──
|
|
10
12
|
var product_analyst_1 = require("./product-analyst");
|
|
11
13
|
Object.defineProperty(exports, "PRODUCT_ANALYST_ROLE", { enumerable: true, get: function () { return product_analyst_1.PRODUCT_ANALYST_ROLE; } });
|
|
12
14
|
Object.defineProperty(exports, "INTERACTION_DESIGNER_ROLE", { enumerable: true, get: function () { return product_analyst_1.INTERACTION_DESIGNER_ROLE; } });
|
|
13
15
|
Object.defineProperty(exports, "buildProductAnalystPrompt", { enumerable: true, get: function () { return product_analyst_1.buildProductAnalystPrompt; } });
|
|
14
16
|
Object.defineProperty(exports, "buildInteractionDesignerPrompt", { enumerable: true, get: function () { return product_analyst_1.buildInteractionDesignerPrompt; } });
|
|
17
|
+
var agent_loader_1 = require("./engine/agent-loader");
|
|
18
|
+
Object.defineProperty(exports, "loadAllAgents", { enumerable: true, get: function () { return agent_loader_1.loadAllAgents; } });
|
|
19
|
+
Object.defineProperty(exports, "loadRegistry", { enumerable: true, get: function () { return agent_loader_1.loadRegistry; } });
|
|
20
|
+
Object.defineProperty(exports, "resolveAgentsForPhase", { enumerable: true, get: function () { return agent_loader_1.resolveAgentsForPhase; } });
|
|
21
|
+
Object.defineProperty(exports, "loadAgentDefinition", { enumerable: true, get: function () { return agent_loader_1.loadAgentDefinition; } });
|
|
22
|
+
Object.defineProperty(exports, "resolveAgentName", { enumerable: true, get: function () { return agent_loader_1.resolveAgentName; } });
|
|
23
|
+
Object.defineProperty(exports, "getBuiltinAgentContents", { enumerable: true, get: function () { return agent_loader_1.getBuiltinAgentContents; } });
|
|
24
|
+
Object.defineProperty(exports, "getBuiltinRegistryContent", { enumerable: true, get: function () { return agent_loader_1.getBuiltinRegistryContent; } });
|
|
25
|
+
Object.defineProperty(exports, "getBuiltinTemplateContent", { enumerable: true, get: function () { return agent_loader_1.getBuiltinTemplateContent; } });
|
|
26
|
+
var agent_executor_1 = require("./engine/agent-executor");
|
|
27
|
+
Object.defineProperty(exports, "buildAgentPrompt", { enumerable: true, get: function () { return agent_executor_1.buildAgentPrompt; } });
|
|
28
|
+
Object.defineProperty(exports, "prepareAgentTask", { enumerable: true, get: function () { return agent_executor_1.prepareAgentTask; } });
|
|
29
|
+
Object.defineProperty(exports, "parseAgentResponse", { enumerable: true, get: function () { return agent_executor_1.parseAgentResponse; } });
|
|
30
|
+
Object.defineProperty(exports, "mergeAgentResults", { enumerable: true, get: function () { return agent_executor_1.mergeAgentResults; } });
|
|
15
31
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/agents/index.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/agents/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAEH,8CAA8C;AAC9C,qDAK2B;AAJzB,uHAAA,oBAAoB,OAAA;AACpB,4HAAA,yBAAyB,OAAA;AACzB,4HAAA,yBAAyB,OAAA;AACzB,iIAAA,8BAA8B,OAAA;AAgBhC,sDAS+B;AAR7B,6GAAA,aAAa,OAAA;AACb,4GAAA,YAAY,OAAA;AACZ,qHAAA,qBAAqB,OAAA;AACrB,mHAAA,mBAAmB,OAAA;AACnB,gHAAA,gBAAgB,OAAA;AAChB,uHAAA,uBAAuB,OAAA;AACvB,yHAAA,yBAAyB,OAAA;AACzB,yHAAA,yBAAyB,OAAA;AAG3B,0DAKiC;AAJ/B,kHAAA,gBAAgB,OAAA;AAChB,kHAAA,gBAAgB,OAAA;AAChB,oHAAA,kBAAkB,OAAA;AAClB,mHAAA,iBAAiB,OAAA"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* COMMANDS 命令模板加载器
|
|
3
|
+
*
|
|
4
|
+
* 负责:
|
|
5
|
+
* 1. 扫描 .speccore/COMMANDS/ 目录下的命令模板文件
|
|
6
|
+
* 2. 为 CLI 命令提供可配置的 prompt 模板
|
|
7
|
+
* 3. 支持变量替换(如 {{iteration}}、{{task}})
|
|
8
|
+
*
|
|
9
|
+
* v6.87.0+
|
|
10
|
+
*/
|
|
11
|
+
export interface CommandTemplate {
|
|
12
|
+
name: string;
|
|
13
|
+
content: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 加载指定命令模板
|
|
17
|
+
*/
|
|
18
|
+
export declare function loadCommandTemplate(name: string, projectRoot: string): Promise<CommandTemplate | undefined>;
|
|
19
|
+
/**
|
|
20
|
+
* 简单变量替换
|
|
21
|
+
* 支持 {{key}} 格式,从 vars 对象中取值
|
|
22
|
+
*/
|
|
23
|
+
export declare function renderTemplate(template: string, vars: Record<string, string>): string;
|
|
24
|
+
/**
|
|
25
|
+
* 获取内置命令模板的原始内容(用于 init 时复制到项目)
|
|
26
|
+
*/
|
|
27
|
+
export declare function getBuiltinCommandContents(): Promise<{
|
|
28
|
+
name: string;
|
|
29
|
+
content: string;
|
|
30
|
+
}[]>;
|
|
31
|
+
//# sourceMappingURL=command-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-loader.d.ts","sourceRoot":"","sources":["../../src/core/command-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAyCD;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAGtC;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAMrF;AAED;;GAEG;AACH,wBAAsB,yBAAyB,IAAI,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAE9F"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* COMMANDS 命令模板加载器
|
|
4
|
+
*
|
|
5
|
+
* 负责:
|
|
6
|
+
* 1. 扫描 .speccore/COMMANDS/ 目录下的命令模板文件
|
|
7
|
+
* 2. 为 CLI 命令提供可配置的 prompt 模板
|
|
8
|
+
* 3. 支持变量替换(如 {{iteration}}、{{task}})
|
|
9
|
+
*
|
|
10
|
+
* v6.87.0+
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.loadCommandTemplate = loadCommandTemplate;
|
|
14
|
+
exports.renderTemplate = renderTemplate;
|
|
15
|
+
exports.getBuiltinCommandContents = getBuiltinCommandContents;
|
|
16
|
+
const path_1 = require("path");
|
|
17
|
+
const fs_extra_1 = require("fs-extra");
|
|
18
|
+
const BUILTIN_COMMANDS_DIR = (0, path_1.join)(__dirname, 'commands', 'defaults');
|
|
19
|
+
async function scanCommandFiles(dir) {
|
|
20
|
+
if (!(await (0, fs_extra_1.pathExists)(dir)))
|
|
21
|
+
return [];
|
|
22
|
+
const entries = await (0, fs_extra_1.readdir)(dir, { withFileTypes: true });
|
|
23
|
+
const commands = [];
|
|
24
|
+
for (const e of entries) {
|
|
25
|
+
if (!e.isFile() || !e.name.endsWith('.md'))
|
|
26
|
+
continue;
|
|
27
|
+
if (e.name.startsWith('_'))
|
|
28
|
+
continue;
|
|
29
|
+
const content = await (0, fs_extra_1.readFile)((0, path_1.join)(dir, e.name), 'utf-8');
|
|
30
|
+
commands.push({
|
|
31
|
+
name: e.name.replace(/\.md$/, ''),
|
|
32
|
+
content,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
return commands;
|
|
36
|
+
}
|
|
37
|
+
async function loadAllCommands(projectRoot) {
|
|
38
|
+
const userCommandsDir = (0, path_1.join)(projectRoot, '.speccore', 'COMMANDS');
|
|
39
|
+
const commandMap = new Map();
|
|
40
|
+
// 1. 加载内置默认
|
|
41
|
+
const builtinFiles = await scanCommandFiles(BUILTIN_COMMANDS_DIR);
|
|
42
|
+
for (const f of builtinFiles) {
|
|
43
|
+
commandMap.set(f.name, { name: f.name, content: f.content });
|
|
44
|
+
}
|
|
45
|
+
// 2. 用户自定义覆盖
|
|
46
|
+
const userFiles = await scanCommandFiles(userCommandsDir);
|
|
47
|
+
for (const f of userFiles) {
|
|
48
|
+
commandMap.set(f.name, { name: f.name, content: f.content });
|
|
49
|
+
}
|
|
50
|
+
return commandMap;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 加载指定命令模板
|
|
54
|
+
*/
|
|
55
|
+
async function loadCommandTemplate(name, projectRoot) {
|
|
56
|
+
const all = await loadAllCommands(projectRoot);
|
|
57
|
+
return all.get(name);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* 简单变量替换
|
|
61
|
+
* 支持 {{key}} 格式,从 vars 对象中取值
|
|
62
|
+
*/
|
|
63
|
+
function renderTemplate(template, vars) {
|
|
64
|
+
let result = template;
|
|
65
|
+
for (const [key, value] of Object.entries(vars)) {
|
|
66
|
+
result = result.replace(new RegExp(`\\{\\{\\s*${key}\\s*\\}\\}`, 'g'), value);
|
|
67
|
+
}
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 获取内置命令模板的原始内容(用于 init 时复制到项目)
|
|
72
|
+
*/
|
|
73
|
+
async function getBuiltinCommandContents() {
|
|
74
|
+
return scanCommandFiles(BUILTIN_COMMANDS_DIR);
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=command-loader.js.map
|