feihong-code 0.2.1
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/.github/ISSUE_TEMPLATE/bug_report.md +37 -0
- package/.github/ISSUE_TEMPLATE/config.yml +14 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +28 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +46 -0
- package/.github/SECURITY.md +67 -0
- package/.github/workflows/ci.yml +140 -0
- package/AGENT-GUIDE.md +237 -0
- package/CHANGELOG.md +73 -0
- package/CODE_OF_CONDUCT.md +56 -0
- package/CONTRIBUTING.md +68 -0
- package/LICENSE +22 -0
- package/README.md +500 -0
- package/dist/agent/code-review.js +115 -0
- package/dist/agent/code-review.js.map +1 -0
- package/dist/agent/code-writer.js +227 -0
- package/dist/agent/code-writer.js.map +1 -0
- package/dist/agent/context-compactor.js +108 -0
- package/dist/agent/context-compactor.js.map +1 -0
- package/dist/agent/experience.js +190 -0
- package/dist/agent/experience.js.map +1 -0
- package/dist/agent/orchestrator.js +212 -0
- package/dist/agent/orchestrator.js.map +1 -0
- package/dist/agent/parallel-orchestrator.js +94 -0
- package/dist/agent/parallel-orchestrator.js.map +1 -0
- package/dist/agent/planner.js +53 -0
- package/dist/agent/planner.js.map +1 -0
- package/dist/agent/prompts.js +26 -0
- package/dist/agent/prompts.js.map +1 -0
- package/dist/agent/quality-gate.js +143 -0
- package/dist/agent/quality-gate.js.map +1 -0
- package/dist/agent/repo-reader.js +384 -0
- package/dist/agent/repo-reader.js.map +1 -0
- package/dist/agent/repo-underwriter.js +132 -0
- package/dist/agent/repo-underwriter.js.map +1 -0
- package/dist/agent/self-heal.js +134 -0
- package/dist/agent/self-heal.js.map +1 -0
- package/dist/agent/self-improver.js +148 -0
- package/dist/agent/self-improver.js.map +1 -0
- package/dist/agent/subagent.js +75 -0
- package/dist/agent/subagent.js.map +1 -0
- package/dist/agent/swe-agent.js +162 -0
- package/dist/agent/swe-agent.js.map +1 -0
- package/dist/agent/swe-planner.js +155 -0
- package/dist/agent/swe-planner.js.map +1 -0
- package/dist/agent/swe-verifier.js +113 -0
- package/dist/agent/swe-verifier.js.map +1 -0
- package/dist/cli/commands.js +167 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/index.js +179 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/repl.js +67 -0
- package/dist/cli/repl.js.map +1 -0
- package/dist/cli/run.js +762 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/version.js +14 -0
- package/dist/cli/version.js.map +1 -0
- package/dist/enterprise/audit.js +294 -0
- package/dist/enterprise/audit.js.map +1 -0
- package/dist/enterprise/guard.js +58 -0
- package/dist/enterprise/guard.js.map +1 -0
- package/dist/enterprise/index.js +99 -0
- package/dist/enterprise/index.js.map +1 -0
- package/dist/enterprise/policy.js +242 -0
- package/dist/enterprise/policy.js.map +1 -0
- package/dist/enterprise/quota.js +58 -0
- package/dist/enterprise/quota.js.map +1 -0
- package/dist/enterprise/tenant.js +143 -0
- package/dist/enterprise/tenant.js.map +1 -0
- package/dist/models/cost.js +13 -0
- package/dist/models/cost.js.map +1 -0
- package/dist/models/model-router.js +170 -0
- package/dist/models/model-router.js.map +1 -0
- package/dist/models/model.dto.js +61 -0
- package/dist/models/model.dto.js.map +1 -0
- package/dist/models/model.interface.js +3 -0
- package/dist/models/model.interface.js.map +1 -0
- package/dist/models/providers/mock.provider.js +35 -0
- package/dist/models/providers/mock.provider.js.map +1 -0
- package/dist/models/providers/ollama.provider.js +88 -0
- package/dist/models/providers/ollama.provider.js.map +1 -0
- package/dist/models/providers/openai-compatible.provider.js +106 -0
- package/dist/models/providers/openai-compatible.provider.js.map +1 -0
- package/dist/runtime/event-log.js +42 -0
- package/dist/runtime/event-log.js.map +1 -0
- package/dist/runtime/git.js +106 -0
- package/dist/runtime/git.js.map +1 -0
- package/dist/runtime/session-persist.js +60 -0
- package/dist/runtime/session-persist.js.map +1 -0
- package/dist/runtime/session-store.js +34 -0
- package/dist/runtime/session-store.js.map +1 -0
- package/dist/runtime/worktree.js +117 -0
- package/dist/runtime/worktree.js.map +1 -0
- package/dist/shared/config.js +184 -0
- package/dist/shared/config.js.map +1 -0
- package/dist/shared/errors.js +66 -0
- package/dist/shared/errors.js.map +1 -0
- package/dist/shared/logger.js +51 -0
- package/dist/shared/logger.js.map +1 -0
- package/dist/shared/types.js +9 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/skills/goal.js +60 -0
- package/dist/skills/goal.js.map +1 -0
- package/dist/skills/grill.js +129 -0
- package/dist/skills/grill.js.map +1 -0
- package/dist/skills/plan.js +40 -0
- package/dist/skills/plan.js.map +1 -0
- package/dist/tools/analysis/code-analyzer.js +136 -0
- package/dist/tools/analysis/code-analyzer.js.map +1 -0
- package/dist/tools/file/edit.tool.js +43 -0
- package/dist/tools/file/edit.tool.js.map +1 -0
- package/dist/tools/file/list.tool.js +36 -0
- package/dist/tools/file/list.tool.js.map +1 -0
- package/dist/tools/file/read.tool.js +34 -0
- package/dist/tools/file/read.tool.js.map +1 -0
- package/dist/tools/file/write.tool.js +39 -0
- package/dist/tools/file/write.tool.js.map +1 -0
- package/dist/tools/generator/code-generator.js +119 -0
- package/dist/tools/generator/code-generator.js.map +1 -0
- package/dist/tools/generator/test-generator.js +65 -0
- package/dist/tools/generator/test-generator.js.map +1 -0
- package/dist/tools/index.js +53 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/safe-path.js +36 -0
- package/dist/tools/safe-path.js.map +1 -0
- package/dist/tools/search/grep.tool.js +81 -0
- package/dist/tools/search/grep.tool.js.map +1 -0
- package/dist/tools/shell/exec.js +50 -0
- package/dist/tools/shell/exec.js.map +1 -0
- package/dist/tools/shell/run-shell.tool.js +49 -0
- package/dist/tools/shell/run-shell.tool.js.map +1 -0
- package/dist/tools/tool.interface.js +8 -0
- package/dist/tools/tool.interface.js.map +1 -0
- package/dist/tools/tool.registry.js +75 -0
- package/dist/tools/tool.registry.js.map +1 -0
- package/dist/tools/verify/build-check.tool.js +37 -0
- package/dist/tools/verify/build-check.tool.js.map +1 -0
- package/dist/tools/verify/test-run.tool.js +37 -0
- package/dist/tools/verify/test-run.tool.js.map +1 -0
- package/dist/web/auth.js +25 -0
- package/dist/web/auth.js.map +1 -0
- package/dist/web/public/index.html +39 -0
- package/dist/web/server.js +60 -0
- package/dist/web/server.js.map +1 -0
- package/docs//344/272/247/345/223/201/345/274/200/345/217/221/346/226/207/346/241/243.md +614 -0
- package/docs//344/274/201/344/270/232/351/203/250/347/275/262/344/270/216/345/220/210/350/247/204.md +267 -0
- package/docs//344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +358 -0
- package/docs//345/270/270/350/247/201/351/227/256/351/242/230/344/270/216/346/225/205/351/232/234/346/216/222/346/237/245.md +130 -0
- package/docs//346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +303 -0
- package/docs//346/236/266/346/236/204/344/270/216API.md +238 -0
- package/docs//347/224/250/346/210/267/346/211/213/345/206/214.md +196 -0
- package/docs//351/203/250/347/275/262/346/214/207/345/215/227.md +165 -0
- package/docs//351/205/215/347/275/256/345/217/202/350/200/203.md +127 -0
- package/package.json +83 -0
- package/tool-schema.json +127 -0
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runSweAgent = runSweAgent;
|
|
4
|
+
/**
|
|
5
|
+
* 飞虹 Code (Muse Code 参照复刻)
|
|
6
|
+
* 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
|
|
7
|
+
*
|
|
8
|
+
* M9 全自动软件工程 Agent(SWE Agent):
|
|
9
|
+
* - 读取整个(大型)代码仓库 → 任务拆解规划 → 逐任务(实现 + 验证 + 自愈重试)→ 产出报告
|
|
10
|
+
* - 实现阶段委托 runSubTask(内部用 Orchestrator 的 ReAct 循环 + 工具系统 + 自愈)
|
|
11
|
+
* - 验证阶段用 swe-verifier(构建/测试),失败时把错误摘要注入下一轮实现(自我修复闭环)
|
|
12
|
+
* - 支持 plan-only / verify-only / max-tasks / max-retries 模式
|
|
13
|
+
*/
|
|
14
|
+
const repo_reader_1 = require("./repo-reader");
|
|
15
|
+
const swe_planner_1 = require("./swe-planner");
|
|
16
|
+
const swe_verifier_1 = require("./swe-verifier");
|
|
17
|
+
async function runSweAgent(goal, deps) {
|
|
18
|
+
const { cwd, runSubTask, maxTasks = 8, maxRetries = 2, verifyOnly = false, planOnly = false, includePreviews = false, maxFiles, onPhase, eventLog, } = deps;
|
|
19
|
+
const log = eventLog;
|
|
20
|
+
const started = Date.now();
|
|
21
|
+
const phase = (p, info = {}) => {
|
|
22
|
+
onPhase?.(p, info);
|
|
23
|
+
log?.append('swe.' + p.replace(/[^a-z]/g, '.'), info).catch(() => undefined);
|
|
24
|
+
};
|
|
25
|
+
// 阶段 1:读取整个仓库
|
|
26
|
+
phase('repo.read', { cwd });
|
|
27
|
+
const snapshot = (0, repo_reader_1.readRepository)(cwd, { includePreviews, maxFiles });
|
|
28
|
+
phase('repo.read.done', { fileCount: snapshot.fileCount, truncated: snapshot.truncated });
|
|
29
|
+
// 阶段 2:任务拆解规划
|
|
30
|
+
phase('plan', { goal });
|
|
31
|
+
const plan = (0, swe_planner_1.planSweTask)(goal, snapshot);
|
|
32
|
+
let tasks = plan.tasks;
|
|
33
|
+
if (tasks.length > maxTasks) {
|
|
34
|
+
tasks = tasks.slice(0, maxTasks);
|
|
35
|
+
phase('plan.capped', { original: plan.tasks.length, capped: maxTasks });
|
|
36
|
+
}
|
|
37
|
+
phase('plan.done', { taskCount: tasks.length });
|
|
38
|
+
const taskResults = [];
|
|
39
|
+
if (planOnly) {
|
|
40
|
+
return finalize(goal, snapshot, tasks, taskResults, started, 'partial');
|
|
41
|
+
}
|
|
42
|
+
// 阶段 3:逐任务实现 + 验证(含自愈重试)
|
|
43
|
+
for (let i = 0; i < tasks.length; i++) {
|
|
44
|
+
const task = tasks[i];
|
|
45
|
+
phase('task.start', { index: i + 1, total: tasks.length, id: task.id, title: task.title });
|
|
46
|
+
if (verifyOnly) {
|
|
47
|
+
const v = await (0, swe_verifier_1.verifyTask)(snapshot, task, cwd);
|
|
48
|
+
taskResults.push({ task, implemented: false, verify: v, retriesUsed: 0, touchedFiles: [] });
|
|
49
|
+
phase('task.verify.only', { id: task.id, overall: v.overall });
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
let implemented = false;
|
|
53
|
+
let finalAnswer;
|
|
54
|
+
let touchedFiles = [];
|
|
55
|
+
let verify = emptyVerify();
|
|
56
|
+
let retriesUsed = 0;
|
|
57
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
58
|
+
// 构建聚焦目标:仓库上下文 + 计划 + 当前子任务 + (失败时的错误反馈)
|
|
59
|
+
let focusedGoal = buildFocusedGoal(plan, task, snapshot);
|
|
60
|
+
if (attempt > 0 && verify.overall === 'fail') {
|
|
61
|
+
const tail = (verify.log || verify.errorSummary).slice(-1500);
|
|
62
|
+
focusedGoal +=
|
|
63
|
+
`\n\n# 上一轮验证失败,请自我修复\n` +
|
|
64
|
+
`以下是验证命令的真实输出(请据此定位根因):\n\`\`\`\n${tail}\n\`\`\`\n` +
|
|
65
|
+
`请分析根因、就地修改代码,然后重新运行验证命令确认通过。不要编造成功。`;
|
|
66
|
+
phase('task.selfheal', { id: task.id, attempt });
|
|
67
|
+
}
|
|
68
|
+
const outcome = await runSubTask(focusedGoal);
|
|
69
|
+
implemented = true;
|
|
70
|
+
finalAnswer = outcome.finalAnswer;
|
|
71
|
+
touchedFiles = outcome.touchedFiles;
|
|
72
|
+
verify = await (0, swe_verifier_1.verifyTask)(snapshot, task, cwd);
|
|
73
|
+
if (verify.overall === 'pass' || verify.overall === 'skipped') {
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
retriesUsed = attempt + 1;
|
|
77
|
+
}
|
|
78
|
+
taskResults.push({ task, implemented, verify, retriesUsed, finalAnswer, touchedFiles });
|
|
79
|
+
phase('task.done', {
|
|
80
|
+
id: task.id,
|
|
81
|
+
implemented,
|
|
82
|
+
verify: verify.overall,
|
|
83
|
+
retries: retriesUsed,
|
|
84
|
+
files: touchedFiles.length,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
// 阶段 4:汇总
|
|
88
|
+
phase('finalize', { taskCount: tasks.length });
|
|
89
|
+
return finalize(goal, snapshot, tasks, taskResults, started, computeOverall(taskResults));
|
|
90
|
+
}
|
|
91
|
+
function buildFocusedGoal(plan, task, snapshot) {
|
|
92
|
+
const lines = [
|
|
93
|
+
plan.modelPrompt,
|
|
94
|
+
'',
|
|
95
|
+
`# 当前执行子任务 [${task.id}] ${task.title}`,
|
|
96
|
+
`描述: ${task.description}`,
|
|
97
|
+
`验收标准: ${task.acceptance}`,
|
|
98
|
+
`目标文件: ${task.targetFiles.join(', ') || '(自动定位)'}`,
|
|
99
|
+
snapshot.buildCommand ? `仓库构建命令: ${snapshot.buildCommand}` : '',
|
|
100
|
+
snapshot.testCommand ? `仓库测试命令: ${snapshot.testCommand}` : '',
|
|
101
|
+
task.verifyCommand ? `本任务专属验证命令: ${task.verifyCommand}` : '',
|
|
102
|
+
'',
|
|
103
|
+
'## 本轮聚焦纪律',
|
|
104
|
+
`- 本轮回合只专注完成上方子任务 [${task.id}],不要提前做其他子任务。`,
|
|
105
|
+
'- 必须通过工具实际修改/创建文件;描述代码不算完成。',
|
|
106
|
+
'- 完成后务必运行对应验证命令,并依据真实输出判断,禁止谎报通过。',
|
|
107
|
+
'- 完成后用一句话说明:做了什么、验证了什么、结果如何。',
|
|
108
|
+
];
|
|
109
|
+
return lines.filter(Boolean).join('\n');
|
|
110
|
+
}
|
|
111
|
+
function computeOverall(results) {
|
|
112
|
+
if (results.length === 0)
|
|
113
|
+
return 'failed';
|
|
114
|
+
const passed = results.filter((r) => r.verify.overall === 'pass' || r.verify.overall === 'skipped');
|
|
115
|
+
if (passed.length === results.length)
|
|
116
|
+
return 'success';
|
|
117
|
+
if (passed.length === 0)
|
|
118
|
+
return 'failed';
|
|
119
|
+
return 'partial';
|
|
120
|
+
}
|
|
121
|
+
function finalize(goal, snapshot, tasks, results, started, overall) {
|
|
122
|
+
const durationMs = Date.now() - started;
|
|
123
|
+
const executed = results.length;
|
|
124
|
+
const completed = results.filter((r) => r.verify.overall === 'pass' || r.verify.overall === 'skipped').length;
|
|
125
|
+
const lines = [];
|
|
126
|
+
lines.push(`== 全自动软件工程 Agent 报告 ==`);
|
|
127
|
+
lines.push(`目标: ${goal}`);
|
|
128
|
+
lines.push(`仓库: ${snapshot.root} (索引 ${snapshot.fileCount} 文件, ${snapshot.truncated ? '已截断' : '完整'})`);
|
|
129
|
+
lines.push(`任务: 规划 ${tasks.length} 个, 执行 ${executed} 个, 通过 ${completed} 个`);
|
|
130
|
+
lines.push(`总耗时: ${(durationMs / 1000).toFixed(1)}s · 总体: ${overall.toUpperCase()}`);
|
|
131
|
+
lines.push('');
|
|
132
|
+
for (const r of results) {
|
|
133
|
+
const status = !r.implemented
|
|
134
|
+
? '未实现'
|
|
135
|
+
: r.verify.overall === 'pass'
|
|
136
|
+
? '✅ 通过'
|
|
137
|
+
: r.verify.overall === 'skipped'
|
|
138
|
+
? '⚠️ 跳过验证'
|
|
139
|
+
: `❌ 失败(重试${r.retriesUsed}次)`;
|
|
140
|
+
lines.push(`[${r.task.id}] ${r.task.title} → ${status}`);
|
|
141
|
+
if (r.touchedFiles.length)
|
|
142
|
+
lines.push(` 改动: ${r.touchedFiles.join(', ')}`);
|
|
143
|
+
if (r.verify.overall === 'fail')
|
|
144
|
+
lines.push(` 错误: ${r.verify.errorSummary.slice(0, 300)}`);
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
goal,
|
|
148
|
+
repository: snapshot.root,
|
|
149
|
+
plannedTasks: tasks.length,
|
|
150
|
+
executedTasks: executed,
|
|
151
|
+
completedTasks: completed,
|
|
152
|
+
overall,
|
|
153
|
+
durationMs,
|
|
154
|
+
tasks: results,
|
|
155
|
+
summary: lines.join('\n'),
|
|
156
|
+
repoContext: snapshot.contextString,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
function emptyVerify() {
|
|
160
|
+
return { overall: 'skipped', steps: [], errorSummary: '', durationMs: 0, log: '' };
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=swe-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swe-agent.js","sourceRoot":"","sources":["../../src/agent/swe-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.planSweTask = planSweTask;
|
|
4
|
+
/** 离线规则拆解:按目标关键词映射到典型子任务模板 */
|
|
5
|
+
function planSweTask(goal, snapshot) {
|
|
6
|
+
const tasks = [];
|
|
7
|
+
const lower = goal.toLowerCase();
|
|
8
|
+
let idx = 0;
|
|
9
|
+
const push = (t) => {
|
|
10
|
+
tasks.push({ ...t, id: `s${++idx}` });
|
|
11
|
+
};
|
|
12
|
+
// 1) 勘察与理解(始终第一个)
|
|
13
|
+
push({
|
|
14
|
+
title: '勘察仓库结构',
|
|
15
|
+
description: `阅读仓库上下文,确认入口、模块边界与既有约定。\n${snapshot.contextString.slice(0, 1500)}`,
|
|
16
|
+
targetFiles: snapshot.keyFiles.length ? snapshot.keyFiles : ['.'],
|
|
17
|
+
acceptance: '已理解仓库结构、关键文件路径与验证方式(build/test 命令)。',
|
|
18
|
+
dependsOn: [],
|
|
19
|
+
complexity: 1,
|
|
20
|
+
});
|
|
21
|
+
// 2) 若目标含「测试」或仓库有测试框架 → 补测试任务
|
|
22
|
+
const needsTest = /测试|test|覆盖|unittest|验证/.test(lower);
|
|
23
|
+
const addTestTask = needsTest || !!snapshot.testFramework;
|
|
24
|
+
// 3) 核心实现任务(按目标特征拆分)
|
|
25
|
+
if (/新增|实现|添加|开发|create|add|implement|feature/.test(lower)) {
|
|
26
|
+
push({
|
|
27
|
+
title: '实现核心功能',
|
|
28
|
+
description: `根据目标实现新功能:${goal}。先定位相关模块,遵循既有代码风格。`,
|
|
29
|
+
targetFiles: inferTargetFiles(goal, snapshot),
|
|
30
|
+
acceptance: `目标功能已实现,相关文件可通过类型检查/构建。`,
|
|
31
|
+
dependsOn: ['s1'],
|
|
32
|
+
complexity: 3,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
else if (/修复|修 bug|fix|bug|问题|错误|error|resolve|patch/.test(lower)) {
|
|
36
|
+
push({
|
|
37
|
+
title: '定位并修复缺陷',
|
|
38
|
+
description: `定位导致问题的根因并修复:${goal}。优先复现,再最小化改动。`,
|
|
39
|
+
targetFiles: inferTargetFiles(goal, snapshot),
|
|
40
|
+
acceptance: '缺陷已修复,原有行为恢复且未引入回归。',
|
|
41
|
+
dependsOn: ['s1'],
|
|
42
|
+
complexity: 3,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
else if (/重构|refactor|优化|optimize|improve|清理|clean/.test(lower)) {
|
|
46
|
+
push({
|
|
47
|
+
title: '重构/优化目标代码',
|
|
48
|
+
description: `在不改变外部行为前提下重构/优化:${goal}。保持测试通过。`,
|
|
49
|
+
targetFiles: inferTargetFiles(goal, snapshot),
|
|
50
|
+
acceptance: '代码已优化/重构,构建与测试仍全部通过(无行为回归)。',
|
|
51
|
+
dependsOn: ['s1'],
|
|
52
|
+
complexity: 2,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
// 通用:实现 + 适配
|
|
57
|
+
push({
|
|
58
|
+
title: '实现目标变更',
|
|
59
|
+
description: `完成目标变更:${goal}。结合仓库约定落地。`,
|
|
60
|
+
targetFiles: inferTargetFiles(goal, snapshot),
|
|
61
|
+
acceptance: '目标变更已落实,构建通过。',
|
|
62
|
+
dependsOn: ['s1'],
|
|
63
|
+
complexity: 3,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
// 4) 测试任务(如有需要)
|
|
67
|
+
if (addTestTask) {
|
|
68
|
+
push({
|
|
69
|
+
title: '补充/运行测试',
|
|
70
|
+
description: `为目标变更编写或补全测试,并运行验证:${snapshot.testCommand ?? 'npm test'}。`,
|
|
71
|
+
targetFiles: inferTestFiles(snapshot),
|
|
72
|
+
acceptance: '相关测试已存在并通过(或新测试覆盖目标行为)。',
|
|
73
|
+
dependsOn: ['s2'],
|
|
74
|
+
complexity: 2,
|
|
75
|
+
verifyCommand: snapshot.testCommand,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
// 5) 验证收尾(始终最后)
|
|
79
|
+
push({
|
|
80
|
+
title: '构建与全量验证',
|
|
81
|
+
description: `运行构建(${snapshot.buildCommand ?? 'npx tsc --noEmit'})与全量测试(${snapshot.testCommand ?? 'npm test'}),确认无回归。`,
|
|
82
|
+
targetFiles: ['.'],
|
|
83
|
+
acceptance: '构建成功、测试全绿;若有失败则回到对应子任务修复(自愈)。',
|
|
84
|
+
dependsOn: tasks.length >= 2 ? [`s${tasks.length}`] : ['s2'],
|
|
85
|
+
complexity: 2,
|
|
86
|
+
verifyCommand: combineVerify(snapshot),
|
|
87
|
+
});
|
|
88
|
+
const modelPrompt = buildModelPrompt(goal, snapshot, tasks);
|
|
89
|
+
return { goal, tasks, modelPrompt };
|
|
90
|
+
}
|
|
91
|
+
/** 从目标文本中推断可能相关的文件(按关键词匹配文件名) */
|
|
92
|
+
function inferTargetFiles(goal, snapshot) {
|
|
93
|
+
const words = goal
|
|
94
|
+
.toLowerCase()
|
|
95
|
+
.replace(/[^\p{L}\p{N}\s]/gu, ' ')
|
|
96
|
+
.split(/\s+/)
|
|
97
|
+
.filter((w) => w.length >= 3)
|
|
98
|
+
.map((w) => w.replace(/[es]$/, '')); // 简单去复数
|
|
99
|
+
const hits = new Set();
|
|
100
|
+
for (const f of snapshot.files) {
|
|
101
|
+
const base = basenameNoExt(f.path).toLowerCase();
|
|
102
|
+
for (const w of words) {
|
|
103
|
+
if (w && (base.includes(w) || f.path.toLowerCase().includes(w))) {
|
|
104
|
+
hits.add(f.path);
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// 若无命中,退回源码文件前若干
|
|
110
|
+
if (hits.size === 0) {
|
|
111
|
+
for (const f of snapshot.files.filter((x) => x.isSource).slice(0, 5))
|
|
112
|
+
hits.add(f.path);
|
|
113
|
+
}
|
|
114
|
+
return [...hits].slice(0, 8);
|
|
115
|
+
}
|
|
116
|
+
function inferTestFiles(snapshot) {
|
|
117
|
+
const tests = snapshot.files.filter((f) => f.isTest).map((f) => f.path);
|
|
118
|
+
return tests.length ? tests.slice(0, 8) : ['(请新建测试文件)'];
|
|
119
|
+
}
|
|
120
|
+
function basenameNoExt(p) {
|
|
121
|
+
const b = p.split('/').pop() ?? p;
|
|
122
|
+
return b.replace(/\.[^.]+$/, '');
|
|
123
|
+
}
|
|
124
|
+
function combineVerify(snapshot) {
|
|
125
|
+
const parts = [];
|
|
126
|
+
if (snapshot.buildCommand)
|
|
127
|
+
parts.push(snapshot.buildCommand);
|
|
128
|
+
if (snapshot.testCommand)
|
|
129
|
+
parts.push(snapshot.testCommand);
|
|
130
|
+
return parts.join(' && ') || 'echo no-verify-available';
|
|
131
|
+
}
|
|
132
|
+
function buildModelPrompt(goal, snapshot, tasks) {
|
|
133
|
+
const taskLines = tasks
|
|
134
|
+
.map((t) => `- [${t.id}] ${t.title} (复杂度${t.complexity})\n 目标文件: ${t.targetFiles.join(', ') || '(自动定位)'}\n 验收: ${t.acceptance}`)
|
|
135
|
+
.join('\n');
|
|
136
|
+
return [
|
|
137
|
+
'你是全自动软件工程 Agent。请严格按以下计划,使用可用工具(读/写/编辑/列目录/搜索/执行命令/跑测试)完成任务。',
|
|
138
|
+
`总目标: ${goal}`,
|
|
139
|
+
'',
|
|
140
|
+
'## 仓库上下文摘要',
|
|
141
|
+
snapshot.contextString.slice(0, 2500),
|
|
142
|
+
'',
|
|
143
|
+
'## 任务拆解(请逐条执行,前一条完成并通过验证后再进入下一条)',
|
|
144
|
+
taskLines,
|
|
145
|
+
'',
|
|
146
|
+
'## 执行纪律(真实模型务必遵守)',
|
|
147
|
+
'1. 你只能通过调用工具(read/edit/write/bash 等)来实际修改文件,禁止只在回复里「描述」代码而不落地。',
|
|
148
|
+
'2. 每步先用 read/list/grep 确认现状,再动手;优先 Edit 局部修改,避免整文件重写破坏既有逻辑。',
|
|
149
|
+
'3. 改动后必须实际运行仓库的验证命令(见「验证能力」),并依据命令的【真实退出码与输出】判断成败,严禁在没有运行验证的情况下声称「已完成/已通过」。',
|
|
150
|
+
'4. 只改动与当前子任务相关的文件,避免无谓地触碰无关模块、不破坏其它功能。',
|
|
151
|
+
'5. 若验证失败:完整阅读错误输出 → 定位根因 → 就地修复 → 重新运行验证;重复直至通过或确认不可行,不要跳过或编造结果。',
|
|
152
|
+
'6. 所有子任务完成后,用自然语言如实总结:改了哪些文件、跑了什么验证、最终结果。',
|
|
153
|
+
].join('\n');
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=swe-planner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swe-planner.js","sourceRoot":"","sources":["../../src/agent/swe-planner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.verifyTask = verifyTask;
|
|
4
|
+
exports.verifyBuild = verifyBuild;
|
|
5
|
+
exports.verifyTests = verifyTests;
|
|
6
|
+
/**
|
|
7
|
+
* 飞虹 Code (Muse Code 参照复刻)
|
|
8
|
+
* 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
|
|
9
|
+
*
|
|
10
|
+
* M9 验证器(SWE Verifier):
|
|
11
|
+
* - 根据仓库快照/子任务,自动执行构建与测试命令
|
|
12
|
+
* - 解析 exit code 与输出,判定每步与整体通过/失败
|
|
13
|
+
* - 离线可用(命令执行走通用 runCommand),不依赖模型
|
|
14
|
+
*/
|
|
15
|
+
const exec_1 = require("../tools/shell/exec");
|
|
16
|
+
const FAIL_PATTERNS = [
|
|
17
|
+
/error\b/i,
|
|
18
|
+
/failed/i,
|
|
19
|
+
/✗|❌|×/,
|
|
20
|
+
/tests?\s+failed/i,
|
|
21
|
+
/cannot find module/i,
|
|
22
|
+
/tsc:?\s*(error|found)/i,
|
|
23
|
+
/SyntaxError/i,
|
|
24
|
+
/TypeError/i,
|
|
25
|
+
/ReferenceError/i,
|
|
26
|
+
/exit code \d+/i,
|
|
27
|
+
/FAIL/i,
|
|
28
|
+
];
|
|
29
|
+
function classify(code, out) {
|
|
30
|
+
if (code !== 0)
|
|
31
|
+
return 'fail';
|
|
32
|
+
// 退出码为 0 但仍可能含错误日志(部分工具 exit 0 但打印 error)
|
|
33
|
+
if (FAIL_PATTERNS.some((re) => re.test(out))) {
|
|
34
|
+
// 测试命令打印 "0 tests failed" 不算失败,需更严格
|
|
35
|
+
if (/0\s+tests?\s+failed/i.test(out) && !/1\s|\d{2,}\s/.test(out)) {
|
|
36
|
+
return 'pass';
|
|
37
|
+
}
|
|
38
|
+
return 'fail';
|
|
39
|
+
}
|
|
40
|
+
return 'pass';
|
|
41
|
+
}
|
|
42
|
+
/** 验证单个子任务(构建/测试/自定义命令) */
|
|
43
|
+
async function verifyTask(snapshot, task, cwd, opts = {}) {
|
|
44
|
+
const maxOutput = opts.maxOutput ?? 3000;
|
|
45
|
+
const timeoutMs = opts.timeoutMs ?? 180000;
|
|
46
|
+
const stepDefs = [];
|
|
47
|
+
if (task.verifyCommand) {
|
|
48
|
+
stepDefs.push({ name: 'task-verify', command: task.verifyCommand });
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
if (snapshot.buildCommand)
|
|
52
|
+
stepDefs.push({ name: 'build', command: snapshot.buildCommand });
|
|
53
|
+
if (snapshot.testCommand)
|
|
54
|
+
stepDefs.push({ name: 'test', command: snapshot.testCommand });
|
|
55
|
+
}
|
|
56
|
+
if (opts.command)
|
|
57
|
+
stepDefs.push({ name: 'custom', command: opts.command });
|
|
58
|
+
if (stepDefs.length === 0) {
|
|
59
|
+
return {
|
|
60
|
+
overall: 'skipped',
|
|
61
|
+
steps: [],
|
|
62
|
+
errorSummary: '(仓库未检测到构建/测试命令,跳过验证)',
|
|
63
|
+
durationMs: 0,
|
|
64
|
+
log: 'no verification command available',
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
const steps = [];
|
|
68
|
+
const started = Date.now();
|
|
69
|
+
let overall = 'pass';
|
|
70
|
+
const errorLines = [];
|
|
71
|
+
for (const def of stepDefs) {
|
|
72
|
+
const t0 = Date.now();
|
|
73
|
+
const res = await (0, exec_1.runCommand)(def.command, cwd, timeoutMs);
|
|
74
|
+
const duration = Date.now() - t0;
|
|
75
|
+
const status = classify(res.code, `${res.stdout}${res.stderr}`);
|
|
76
|
+
const output = `${res.stdout}${res.stderr}`.slice(0, maxOutput);
|
|
77
|
+
steps.push({ name: def.name, command: def.command, status, exitCode: res.code, output, durationMs: duration });
|
|
78
|
+
if (status === 'fail') {
|
|
79
|
+
overall = 'fail';
|
|
80
|
+
errorLines.push(`[${def.name}] exit=${res.code}: ${output.split('\n').filter((l) => FAIL_PATTERNS.some((re) => re.test(l))).slice(0, 5).join('\n')}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const durationMs = Date.now() - started;
|
|
84
|
+
const errorSummary = errorLines.length
|
|
85
|
+
? errorLines.join('\n').slice(0, maxOutput)
|
|
86
|
+
: overall === 'pass'
|
|
87
|
+
? '(全部通过)'
|
|
88
|
+
: '(验证失败,详情见日志)';
|
|
89
|
+
const log = steps.map((s) => `${s.name}: ${s.status} (exit ${s.exitCode}, ${s.durationMs}ms)`).join('\n');
|
|
90
|
+
return { overall, steps, errorSummary, durationMs, log };
|
|
91
|
+
}
|
|
92
|
+
/** 仅做构建验证 */
|
|
93
|
+
async function verifyBuild(snapshot, cwd, opts = {}) {
|
|
94
|
+
const cmd = snapshot.buildCommand ?? (snapshot.hasPackageJson ? 'npm run build' : 'echo no-build');
|
|
95
|
+
return verifyTask(snapshot, { ...emptyTask(), verifyCommand: cmd }, cwd, opts);
|
|
96
|
+
}
|
|
97
|
+
/** 仅做测试验证 */
|
|
98
|
+
async function verifyTests(snapshot, cwd, opts = {}) {
|
|
99
|
+
const cmd = snapshot.testCommand ?? 'npm test';
|
|
100
|
+
return verifyTask(snapshot, { ...emptyTask(), verifyCommand: cmd }, cwd, opts);
|
|
101
|
+
}
|
|
102
|
+
function emptyTask() {
|
|
103
|
+
return {
|
|
104
|
+
id: 'verify',
|
|
105
|
+
title: 'verify',
|
|
106
|
+
description: '',
|
|
107
|
+
targetFiles: [],
|
|
108
|
+
acceptance: '',
|
|
109
|
+
dependsOn: [],
|
|
110
|
+
complexity: 1,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=swe-verifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swe-verifier.js","sourceRoot":"","sources":["../../src/agent/swe-verifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseArgs = parseArgs;
|
|
4
|
+
function parseArgs(argv) {
|
|
5
|
+
const flags = {};
|
|
6
|
+
const positional = [];
|
|
7
|
+
for (let i = 0; i < argv.length; i++) {
|
|
8
|
+
const arg = argv[i];
|
|
9
|
+
if (arg === '--version' || arg === '-v')
|
|
10
|
+
flags.version = true;
|
|
11
|
+
else if (arg === '--help' || arg === '-h')
|
|
12
|
+
flags.help = true;
|
|
13
|
+
else if (arg === '--parallel')
|
|
14
|
+
flags.parallel = true;
|
|
15
|
+
else if (arg === '--yes')
|
|
16
|
+
flags.yes = true;
|
|
17
|
+
else if (arg === '--port') {
|
|
18
|
+
const next = argv[++i];
|
|
19
|
+
const n = Number(next);
|
|
20
|
+
if (next !== undefined && Number.isFinite(n) && n > 0)
|
|
21
|
+
flags.port = Math.floor(n);
|
|
22
|
+
}
|
|
23
|
+
else if (arg.startsWith('--port=')) {
|
|
24
|
+
const n = Number(arg.slice('--port='.length));
|
|
25
|
+
if (Number.isFinite(n) && n > 0)
|
|
26
|
+
flags.port = Math.floor(n);
|
|
27
|
+
}
|
|
28
|
+
else if (arg === '--limit') {
|
|
29
|
+
const next = argv[++i];
|
|
30
|
+
const n = Number(next);
|
|
31
|
+
if (next !== undefined && Number.isFinite(n) && n > 0)
|
|
32
|
+
flags.limit = Math.floor(n);
|
|
33
|
+
}
|
|
34
|
+
else if (arg.startsWith('--limit=')) {
|
|
35
|
+
const n = Number(arg.slice('--limit='.length));
|
|
36
|
+
if (Number.isFinite(n) && n > 0)
|
|
37
|
+
flags.limit = Math.floor(n);
|
|
38
|
+
}
|
|
39
|
+
else if (arg === '--repo') {
|
|
40
|
+
flags.repo = argv[++i];
|
|
41
|
+
}
|
|
42
|
+
else if (arg.startsWith('--repo=')) {
|
|
43
|
+
flags.repo = arg.slice('--repo='.length);
|
|
44
|
+
}
|
|
45
|
+
else if (arg === '--max-tasks') {
|
|
46
|
+
const n = Number(argv[++i]);
|
|
47
|
+
if (Number.isFinite(n) && n > 0)
|
|
48
|
+
flags.maxTasks = Math.floor(n);
|
|
49
|
+
}
|
|
50
|
+
else if (arg.startsWith('--max-tasks=')) {
|
|
51
|
+
const n = Number(arg.slice('--max-tasks='.length));
|
|
52
|
+
if (Number.isFinite(n) && n > 0)
|
|
53
|
+
flags.maxTasks = Math.floor(n);
|
|
54
|
+
}
|
|
55
|
+
else if (arg === '--max-retries') {
|
|
56
|
+
const n = Number(argv[++i]);
|
|
57
|
+
if (Number.isFinite(n) && n >= 0)
|
|
58
|
+
flags.maxRetries = Math.floor(n);
|
|
59
|
+
}
|
|
60
|
+
else if (arg.startsWith('--max-retries=')) {
|
|
61
|
+
const n = Number(arg.slice('--max-retries='.length));
|
|
62
|
+
if (Number.isFinite(n) && n >= 0)
|
|
63
|
+
flags.maxRetries = Math.floor(n);
|
|
64
|
+
}
|
|
65
|
+
else if (arg === '--max-iterations') {
|
|
66
|
+
const n = Number(argv[++i]);
|
|
67
|
+
if (Number.isFinite(n) && n > 0)
|
|
68
|
+
flags.maxIterations = Math.floor(n);
|
|
69
|
+
}
|
|
70
|
+
else if (arg.startsWith('--max-iterations=')) {
|
|
71
|
+
const n = Number(arg.slice('--max-iterations='.length));
|
|
72
|
+
if (Number.isFinite(n) && n > 0)
|
|
73
|
+
flags.maxIterations = Math.floor(n);
|
|
74
|
+
}
|
|
75
|
+
else if (arg === '--verify-only') {
|
|
76
|
+
flags.verifyOnly = true;
|
|
77
|
+
}
|
|
78
|
+
else if (arg === '--plan-only') {
|
|
79
|
+
flags.planOnly = true;
|
|
80
|
+
}
|
|
81
|
+
else
|
|
82
|
+
positional.push(arg);
|
|
83
|
+
}
|
|
84
|
+
const head = positional[0];
|
|
85
|
+
const rest = positional.slice(1);
|
|
86
|
+
// 会话管理命令
|
|
87
|
+
if (head === 'sessions') {
|
|
88
|
+
return { flags, manage: { kind: 'sessions' } };
|
|
89
|
+
}
|
|
90
|
+
if (head === 'resume') {
|
|
91
|
+
return { flags, manage: { kind: 'resume', id: rest[0] ?? '' } };
|
|
92
|
+
}
|
|
93
|
+
if (head === 'diff') {
|
|
94
|
+
return { flags, manage: { kind: 'diff', id: rest[0] } };
|
|
95
|
+
}
|
|
96
|
+
if (head === 'rollback') {
|
|
97
|
+
return { flags, manage: { kind: 'rollback', id: rest[0] ?? '', yes: !!flags.yes } };
|
|
98
|
+
}
|
|
99
|
+
// M4 企业管理命令
|
|
100
|
+
if (head === 'whoami')
|
|
101
|
+
return { flags, manage: { kind: 'whoami' } };
|
|
102
|
+
if (head === 'policy')
|
|
103
|
+
return { flags, manage: { kind: 'policy' } };
|
|
104
|
+
if (head === 'tenants')
|
|
105
|
+
return { flags, manage: { kind: 'tenants' } };
|
|
106
|
+
if (head === 'serve')
|
|
107
|
+
return { flags, manage: { kind: 'serve', port: flags.port } };
|
|
108
|
+
if (head === 'audit') {
|
|
109
|
+
return {
|
|
110
|
+
flags,
|
|
111
|
+
manage: { kind: 'audit', verify: rest[0] === 'verify', limit: flags.limit ?? 20 },
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
// M6 自我进化命令
|
|
115
|
+
if (head === 'model-stats')
|
|
116
|
+
return { flags, manage: { kind: 'model-stats' } };
|
|
117
|
+
if (head === 'experiences')
|
|
118
|
+
return { flags, manage: { kind: 'experiences', path: rest[0] } };
|
|
119
|
+
// M8 自主编程命令
|
|
120
|
+
if (head === 'code-write') {
|
|
121
|
+
return {
|
|
122
|
+
flags,
|
|
123
|
+
manage: {
|
|
124
|
+
kind: 'code-write',
|
|
125
|
+
goal: rest.join(' ') || 'auto-generate',
|
|
126
|
+
filePath: 'output.ts',
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
if (head === 'quality-gate') {
|
|
131
|
+
return { flags, manage: { kind: 'quality-gate', path: rest[0] || '.' } };
|
|
132
|
+
}
|
|
133
|
+
if (head === 'self-improve') {
|
|
134
|
+
return { flags, manage: { kind: 'self-improve' } };
|
|
135
|
+
}
|
|
136
|
+
// M9 全自动软件工程 Agent
|
|
137
|
+
if (head === 'swe') {
|
|
138
|
+
return {
|
|
139
|
+
flags,
|
|
140
|
+
manage: {
|
|
141
|
+
kind: 'swe',
|
|
142
|
+
goal: rest.join(' ') || 'auto-improve',
|
|
143
|
+
repo: flags.repo,
|
|
144
|
+
maxTasks: flags.maxTasks ?? 8,
|
|
145
|
+
maxRetries: flags.maxRetries ?? 2,
|
|
146
|
+
maxIterations: flags.maxIterations ?? 6,
|
|
147
|
+
verifyOnly: !!flags.verifyOnly,
|
|
148
|
+
planOnly: !!flags.planOnly,
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
// 斜杠技能
|
|
153
|
+
if (head?.startsWith('/')) {
|
|
154
|
+
const [kind, ...parts] = head.slice(1).split(/\s+/);
|
|
155
|
+
const valid = ['plan', 'grill', 'goal'];
|
|
156
|
+
if (valid.includes(kind)) {
|
|
157
|
+
const arg = [...parts, ...rest].join(' ').trim();
|
|
158
|
+
return { flags, skill: { kind: kind, arg } };
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// 单命令需求
|
|
162
|
+
if (head) {
|
|
163
|
+
return { flags, command: positional.join(' ') };
|
|
164
|
+
}
|
|
165
|
+
return { flags };
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"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"}
|