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.
Files changed (154) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +37 -0
  2. package/.github/ISSUE_TEMPLATE/config.yml +14 -0
  3. package/.github/ISSUE_TEMPLATE/feature_request.md +28 -0
  4. package/.github/PULL_REQUEST_TEMPLATE.md +46 -0
  5. package/.github/SECURITY.md +67 -0
  6. package/.github/workflows/ci.yml +140 -0
  7. package/AGENT-GUIDE.md +237 -0
  8. package/CHANGELOG.md +73 -0
  9. package/CODE_OF_CONDUCT.md +56 -0
  10. package/CONTRIBUTING.md +68 -0
  11. package/LICENSE +22 -0
  12. package/README.md +500 -0
  13. package/dist/agent/code-review.js +115 -0
  14. package/dist/agent/code-review.js.map +1 -0
  15. package/dist/agent/code-writer.js +227 -0
  16. package/dist/agent/code-writer.js.map +1 -0
  17. package/dist/agent/context-compactor.js +108 -0
  18. package/dist/agent/context-compactor.js.map +1 -0
  19. package/dist/agent/experience.js +190 -0
  20. package/dist/agent/experience.js.map +1 -0
  21. package/dist/agent/orchestrator.js +212 -0
  22. package/dist/agent/orchestrator.js.map +1 -0
  23. package/dist/agent/parallel-orchestrator.js +94 -0
  24. package/dist/agent/parallel-orchestrator.js.map +1 -0
  25. package/dist/agent/planner.js +53 -0
  26. package/dist/agent/planner.js.map +1 -0
  27. package/dist/agent/prompts.js +26 -0
  28. package/dist/agent/prompts.js.map +1 -0
  29. package/dist/agent/quality-gate.js +143 -0
  30. package/dist/agent/quality-gate.js.map +1 -0
  31. package/dist/agent/repo-reader.js +384 -0
  32. package/dist/agent/repo-reader.js.map +1 -0
  33. package/dist/agent/repo-underwriter.js +132 -0
  34. package/dist/agent/repo-underwriter.js.map +1 -0
  35. package/dist/agent/self-heal.js +134 -0
  36. package/dist/agent/self-heal.js.map +1 -0
  37. package/dist/agent/self-improver.js +148 -0
  38. package/dist/agent/self-improver.js.map +1 -0
  39. package/dist/agent/subagent.js +75 -0
  40. package/dist/agent/subagent.js.map +1 -0
  41. package/dist/agent/swe-agent.js +162 -0
  42. package/dist/agent/swe-agent.js.map +1 -0
  43. package/dist/agent/swe-planner.js +155 -0
  44. package/dist/agent/swe-planner.js.map +1 -0
  45. package/dist/agent/swe-verifier.js +113 -0
  46. package/dist/agent/swe-verifier.js.map +1 -0
  47. package/dist/cli/commands.js +167 -0
  48. package/dist/cli/commands.js.map +1 -0
  49. package/dist/cli/index.js +179 -0
  50. package/dist/cli/index.js.map +1 -0
  51. package/dist/cli/repl.js +67 -0
  52. package/dist/cli/repl.js.map +1 -0
  53. package/dist/cli/run.js +762 -0
  54. package/dist/cli/run.js.map +1 -0
  55. package/dist/cli/version.js +14 -0
  56. package/dist/cli/version.js.map +1 -0
  57. package/dist/enterprise/audit.js +294 -0
  58. package/dist/enterprise/audit.js.map +1 -0
  59. package/dist/enterprise/guard.js +58 -0
  60. package/dist/enterprise/guard.js.map +1 -0
  61. package/dist/enterprise/index.js +99 -0
  62. package/dist/enterprise/index.js.map +1 -0
  63. package/dist/enterprise/policy.js +242 -0
  64. package/dist/enterprise/policy.js.map +1 -0
  65. package/dist/enterprise/quota.js +58 -0
  66. package/dist/enterprise/quota.js.map +1 -0
  67. package/dist/enterprise/tenant.js +143 -0
  68. package/dist/enterprise/tenant.js.map +1 -0
  69. package/dist/models/cost.js +13 -0
  70. package/dist/models/cost.js.map +1 -0
  71. package/dist/models/model-router.js +170 -0
  72. package/dist/models/model-router.js.map +1 -0
  73. package/dist/models/model.dto.js +61 -0
  74. package/dist/models/model.dto.js.map +1 -0
  75. package/dist/models/model.interface.js +3 -0
  76. package/dist/models/model.interface.js.map +1 -0
  77. package/dist/models/providers/mock.provider.js +35 -0
  78. package/dist/models/providers/mock.provider.js.map +1 -0
  79. package/dist/models/providers/ollama.provider.js +88 -0
  80. package/dist/models/providers/ollama.provider.js.map +1 -0
  81. package/dist/models/providers/openai-compatible.provider.js +106 -0
  82. package/dist/models/providers/openai-compatible.provider.js.map +1 -0
  83. package/dist/runtime/event-log.js +42 -0
  84. package/dist/runtime/event-log.js.map +1 -0
  85. package/dist/runtime/git.js +106 -0
  86. package/dist/runtime/git.js.map +1 -0
  87. package/dist/runtime/session-persist.js +60 -0
  88. package/dist/runtime/session-persist.js.map +1 -0
  89. package/dist/runtime/session-store.js +34 -0
  90. package/dist/runtime/session-store.js.map +1 -0
  91. package/dist/runtime/worktree.js +117 -0
  92. package/dist/runtime/worktree.js.map +1 -0
  93. package/dist/shared/config.js +184 -0
  94. package/dist/shared/config.js.map +1 -0
  95. package/dist/shared/errors.js +66 -0
  96. package/dist/shared/errors.js.map +1 -0
  97. package/dist/shared/logger.js +51 -0
  98. package/dist/shared/logger.js.map +1 -0
  99. package/dist/shared/types.js +9 -0
  100. package/dist/shared/types.js.map +1 -0
  101. package/dist/skills/goal.js +60 -0
  102. package/dist/skills/goal.js.map +1 -0
  103. package/dist/skills/grill.js +129 -0
  104. package/dist/skills/grill.js.map +1 -0
  105. package/dist/skills/plan.js +40 -0
  106. package/dist/skills/plan.js.map +1 -0
  107. package/dist/tools/analysis/code-analyzer.js +136 -0
  108. package/dist/tools/analysis/code-analyzer.js.map +1 -0
  109. package/dist/tools/file/edit.tool.js +43 -0
  110. package/dist/tools/file/edit.tool.js.map +1 -0
  111. package/dist/tools/file/list.tool.js +36 -0
  112. package/dist/tools/file/list.tool.js.map +1 -0
  113. package/dist/tools/file/read.tool.js +34 -0
  114. package/dist/tools/file/read.tool.js.map +1 -0
  115. package/dist/tools/file/write.tool.js +39 -0
  116. package/dist/tools/file/write.tool.js.map +1 -0
  117. package/dist/tools/generator/code-generator.js +119 -0
  118. package/dist/tools/generator/code-generator.js.map +1 -0
  119. package/dist/tools/generator/test-generator.js +65 -0
  120. package/dist/tools/generator/test-generator.js.map +1 -0
  121. package/dist/tools/index.js +53 -0
  122. package/dist/tools/index.js.map +1 -0
  123. package/dist/tools/safe-path.js +36 -0
  124. package/dist/tools/safe-path.js.map +1 -0
  125. package/dist/tools/search/grep.tool.js +81 -0
  126. package/dist/tools/search/grep.tool.js.map +1 -0
  127. package/dist/tools/shell/exec.js +50 -0
  128. package/dist/tools/shell/exec.js.map +1 -0
  129. package/dist/tools/shell/run-shell.tool.js +49 -0
  130. package/dist/tools/shell/run-shell.tool.js.map +1 -0
  131. package/dist/tools/tool.interface.js +8 -0
  132. package/dist/tools/tool.interface.js.map +1 -0
  133. package/dist/tools/tool.registry.js +75 -0
  134. package/dist/tools/tool.registry.js.map +1 -0
  135. package/dist/tools/verify/build-check.tool.js +37 -0
  136. package/dist/tools/verify/build-check.tool.js.map +1 -0
  137. package/dist/tools/verify/test-run.tool.js +37 -0
  138. package/dist/tools/verify/test-run.tool.js.map +1 -0
  139. package/dist/web/auth.js +25 -0
  140. package/dist/web/auth.js.map +1 -0
  141. package/dist/web/public/index.html +39 -0
  142. package/dist/web/server.js +60 -0
  143. package/dist/web/server.js.map +1 -0
  144. package/docs//344/272/247/345/223/201/345/274/200/345/217/221/346/226/207/346/241/243.md +614 -0
  145. 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
  146. package/docs//344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +358 -0
  147. 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
  148. package/docs//346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +303 -0
  149. package/docs//346/236/266/346/236/204/344/270/216API.md +238 -0
  150. package/docs//347/224/250/346/210/267/346/211/213/345/206/214.md +196 -0
  151. package/docs//351/203/250/347/275/262/346/214/207/345/215/227.md +165 -0
  152. package/docs//351/205/215/347/275/256/345/217/202/350/200/203.md +127 -0
  153. package/package.json +83 -0
  154. 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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"}