feihong-code 7.2.0 → 7.6.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.
Files changed (204) hide show
  1. package/.github/workflows/ci.yml +54 -1
  2. package/.github/workflows/release.yml +30 -0
  3. package/.github/workflows/swebench-real.yml +84 -0
  4. package/CHANGELOG.md +41 -39
  5. package/CONTRIBUTING.md +9 -2
  6. package/README.md +56 -6
  7. package/README.self-evolve.md +279 -274
  8. package/dist/agent/change-manager.js +1 -1
  9. package/dist/agent/code-rag.js +1 -1
  10. package/dist/agent/code-review.js +1 -1
  11. package/dist/agent/code-writer.js +1 -1
  12. package/dist/agent/completion-engine.js +76 -45
  13. package/dist/agent/completion-engine.js.map +1 -1
  14. package/dist/agent/completion-postprocess.js +109 -0
  15. package/dist/agent/completion-postprocess.js.map +1 -0
  16. package/dist/agent/context-budget.js +121 -0
  17. package/dist/agent/context-budget.js.map +1 -0
  18. package/dist/agent/context-compactor.js +58 -0
  19. package/dist/agent/context-compactor.js.map +1 -1
  20. package/dist/agent/experience.js +1 -1
  21. package/dist/agent/layered-memory.js +1 -1
  22. package/dist/agent/lint.js +121 -0
  23. package/dist/agent/lint.js.map +1 -0
  24. package/dist/agent/orchestrator.js +106 -31
  25. package/dist/agent/orchestrator.js.map +1 -1
  26. package/dist/agent/parallel-orchestrator.js +1 -1
  27. package/dist/agent/planner.js +8 -3
  28. package/dist/agent/planner.js.map +1 -1
  29. package/dist/agent/prompts.js +55 -55
  30. package/dist/agent/quality-gate.js +1 -1
  31. package/dist/agent/repo-context.js +1 -1
  32. package/dist/agent/repo-reader.js +1 -1
  33. package/dist/agent/repo-underwriter.js +1 -1
  34. package/dist/agent/self-correction.js +25 -25
  35. package/dist/agent/self-heal.js +32 -27
  36. package/dist/agent/self-heal.js.map +1 -1
  37. package/dist/agent/self-improver.js +1 -1
  38. package/dist/agent/subagent-summary.js +1 -1
  39. package/dist/agent/subagent.js +1 -1
  40. package/dist/agent/swe-agent.js +1 -1
  41. package/dist/agent/swe-verifier.js +1 -1
  42. package/dist/agent/symbol-index.js +1 -1
  43. package/dist/agent/team.js +1 -1
  44. package/dist/agent/type-checker.js +1 -1
  45. package/dist/cli/commands.js +16 -0
  46. package/dist/cli/commands.js.map +1 -1
  47. package/dist/cli/index.js +66 -2
  48. package/dist/cli/index.js.map +1 -1
  49. package/dist/cli/multi-pane-tui.js +217 -0
  50. package/dist/cli/multi-pane-tui.js.map +1 -0
  51. package/dist/cli/repl.js +1 -1
  52. package/dist/cli/run.js +168 -42
  53. package/dist/cli/run.js.map +1 -1
  54. package/dist/cli/self-evolve-cli.js +168 -0
  55. package/dist/cli/tui-run.js +79 -0
  56. package/dist/cli/tui-run.js.map +1 -0
  57. package/dist/cli/tui.js +1 -1
  58. package/dist/cli/tui.js.map +1 -1
  59. package/dist/cli/version.js +3 -3
  60. package/dist/cli/version.js.map +1 -1
  61. package/dist/enterprise/audit.js +1 -1
  62. package/dist/enterprise/index.js +1 -1
  63. package/dist/enterprise/policy.js +1 -1
  64. package/dist/enterprise/quota.js +1 -1
  65. package/dist/enterprise/tenant.js +1 -1
  66. package/dist/harness/executor.js +1 -1
  67. package/dist/harness/index.js +1 -1
  68. package/dist/harness/loader.js +1 -1
  69. package/dist/harness/types.js +1 -1
  70. package/dist/harness/verifier.js +52 -12
  71. package/dist/harness/verifier.js.map +1 -1
  72. package/dist/integrations/feishu-bridge.js +348 -0
  73. package/dist/integrations/feishu-bridge.js.map +1 -0
  74. package/dist/integrations/github-mcp.js +137 -0
  75. package/dist/integrations/github-mcp.js.map +1 -0
  76. package/dist/integrations/wechat-bridge.js +499 -0
  77. package/dist/integrations/wechat-bridge.js.map +1 -0
  78. package/dist/integrations/yuanbao-bridge.js +326 -0
  79. package/dist/integrations/yuanbao-bridge.js.map +1 -0
  80. package/dist/lsp/lsp-client.js +183 -0
  81. package/dist/lsp/lsp-client.js.map +1 -0
  82. package/dist/lsp/lsp-service.js +159 -0
  83. package/dist/lsp/lsp-service.js.map +1 -0
  84. package/dist/models/model-router.js +1 -1
  85. package/dist/models/model.dto.js +1 -1
  86. package/dist/models/providers/ollama.provider.js +1 -1
  87. package/dist/models/providers/openai-compatible.provider.js +1 -1
  88. package/dist/plugins/manager.js +50 -2
  89. package/dist/plugins/manager.js.map +1 -1
  90. package/dist/plugins/plugin-loader.js +1 -1
  91. package/dist/runtime/event-log.js +1 -1
  92. package/dist/runtime/git.js +1 -1
  93. package/dist/runtime/hooks.js +71 -4
  94. package/dist/runtime/hooks.js.map +1 -1
  95. package/dist/runtime/session-persist.js +1 -1
  96. package/dist/runtime/worktree.js +1 -1
  97. package/dist/self-evolve/manager.js +517 -401
  98. package/dist/self-evolve/self-heal-scheduler.js +160 -0
  99. package/dist/self-evolve/self-heal-scheduler.js.map +1 -0
  100. package/dist/shared/concurrency.js +1 -1
  101. package/dist/shared/config.js +4 -2
  102. package/dist/shared/config.js.map +1 -1
  103. package/dist/shared/errors.js +1 -1
  104. package/dist/shared/i18n.js +109 -101
  105. package/dist/shared/i18n.js.map +1 -1
  106. package/dist/shared/secure-store.js +12 -5
  107. package/dist/shared/secure-store.js.map +1 -1
  108. package/dist/shared/types.js +1 -1
  109. package/dist/skills/goal.js +1 -1
  110. package/dist/skills/grill.js +1 -1
  111. package/dist/skills/plan.js +1 -1
  112. package/dist/skills/pua-hooks.js +273 -0
  113. package/dist/skills/pua-hooks.js.map +1 -0
  114. package/dist/skills/self-heal.js +9 -3
  115. package/dist/skills/self-heal.js.map +1 -1
  116. package/dist/skills/skill-loader.js +1 -1
  117. package/dist/skills/skill-market.js +84 -8
  118. package/dist/skills/skill-market.js.map +1 -1
  119. package/dist/tools/analysis/code-analyzer.js +1 -1
  120. package/dist/tools/file/edit.tool.js +18 -3
  121. package/dist/tools/file/edit.tool.js.map +1 -1
  122. package/dist/tools/file/list.tool.js +1 -1
  123. package/dist/tools/file/read.tool.js +1 -1
  124. package/dist/tools/file/write.tool.js +1 -1
  125. package/dist/tools/generator/code-generator.js +41 -41
  126. package/dist/tools/generator/test-generator.js +10 -10
  127. package/dist/tools/index.js +1 -1
  128. package/dist/tools/mcp/index.js +1 -1
  129. package/dist/tools/mcp/mcp-client.js +1 -1
  130. package/dist/tools/safe-path.js +1 -1
  131. package/dist/tools/search/grep.tool.js +1 -1
  132. package/dist/tools/shell/exec.js +24 -2
  133. package/dist/tools/shell/exec.js.map +1 -1
  134. package/dist/tools/shell/run-shell.tool.js +1 -1
  135. package/dist/tools/skills/load-skill.tool.js +1 -1
  136. package/dist/tools/tool.registry.js +10 -1
  137. package/dist/tools/tool.registry.js.map +1 -1
  138. package/dist/tools/verify/build-check.tool.js +1 -1
  139. package/dist/tools/verify/test-run.tool.js +1 -1
  140. package/dist/tools/web/web.tool.js +1 -1
  141. package/dist/voice/voice-programming.js +32 -6
  142. package/dist/voice/voice-programming.js.map +1 -1
  143. package/dist/web/auth.js +34 -2
  144. package/dist/web/auth.js.map +1 -1
  145. package/dist/web/channels.js +1 -1
  146. package/dist/web/extra-apis.js +440 -0
  147. package/dist/web/extra-apis.js.map +1 -0
  148. package/dist/web/public/css/style.css +99 -72
  149. package/dist/web/public/index.html +44 -1
  150. package/dist/web/public/js/api.js +64 -2
  151. package/dist/web/public/js/app.js +151 -128
  152. package/dist/web/public/js/mock-api.js +25 -0
  153. package/dist/web/public/js/monaco-editor.js +161 -1
  154. package/dist/web/public/js/ui.js +292 -56
  155. package/dist/web/public/service-worker.js +5 -29
  156. package/dist/web/server.js +178 -61
  157. package/dist/web/server.js.map +1 -1
  158. package/dist/web/task-queue.js +6 -21
  159. package/dist/web/task-queue.js.map +1 -1
  160. package/docs/App/344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +1 -1
  161. package/docs/App/346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +1 -1
  162. package/docs/BENCHMARK_REPORT_en.md +62 -5
  163. package/docs/BENCHMARK_REPORT_zh.md +66 -9
  164. package/docs/DPA.md +65 -0
  165. package/docs/DPA/346/225/260/346/215/256/345/244/204/347/220/206/345/215/217/350/256/256/346/250/241/346/235/277_v1.0.md +69 -0
  166. package/docs/Deployment_Guide_EN.md +1 -1
  167. package/docs/SECURITY_WHITEPAPER.md +74 -0
  168. package/docs/SELF-EVOLVE-GUIDE.md +1 -1
  169. package/docs/SWE_BENCH_REPORT.md +73 -0
  170. package/docs/TECHNICAL_SPEC_en.md +1 -1
  171. package/docs/TECHNICAL_SPEC_zh.md +1 -1
  172. package/docs/Technical_Manual_EN.md +1 -1
  173. package/docs/UPDATE_NOTES_en.md +1 -1
  174. package/docs/UPDATE_NOTES_zh.md +1 -1
  175. package/docs/UPGRADE_7.2.0.md +309 -0
  176. package/docs/UPGRADE_GUIDE_7_5.md +86 -0
  177. package/docs/UPGRADE_GUIDE_7_6.md +153 -0
  178. package/docs/User_Manual_EN.md +1 -1
  179. package/docs/VOLTAGENT_SKILLS_CATALOG.md +95 -0
  180. package/docs/error-codes.md +1 -1
  181. package/docs/geo-feihong-code.html +391 -0
  182. package/docs//344/272/247/345/223/201/345/274/200/345/217/221/346/226/207/346/241/243.md +5 -3
  183. package/docs//344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +140 -231
  184. package/docs//345/205/250/351/235/242/345/244/215/347/233/230_50/350/275/256/346/267/261/345/272/246/345/256/241/350/256/241_v7.2.0.md +208 -0
  185. package/docs//345/205/250/351/235/242/345/244/215/347/233/230_6/351/241/271/351/207/215/347/202/271/346/240/270/346/237/245_v7.2.0.md +152 -0
  186. package/docs//345/205/250/351/235/242/345/244/215/347/233/230_/350/277/220/350/241/214/346/227/266/345/256/236/346/265/213/347/211/210_v7.2.0.md +271 -0
  187. package/docs//345/220/210/350/247/204/350/256/244/350/257/201/345/207/206/345/244/207/346/270/205/345/215/225_v7.2.0.md +59 -0
  188. package/docs//345/256/211/345/205/250/347/231/275/347/232/256/344/271/246_v7.2.0.md +84 -0
  189. package/docs//346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +240 -149
  190. package/docs//351/203/250/347/275/262/350/257/264/346/230/216/344/271/246.md +2 -2
  191. package/electron/main.js +4 -202
  192. package/package.json +182 -172
  193. package/templates/skills/api-design/SKILL.md +27 -0
  194. package/templates/skills/code-review/SKILL.md +35 -0
  195. package/templates/skills/dependency-upgrade/SKILL.md +29 -0
  196. package/templates/skills/doc-gen/SKILL.md +29 -0
  197. package/templates/skills/git-flow/SKILL.md +26 -0
  198. package/templates/skills/onboarding/SKILL.md +27 -0
  199. package/templates/skills/performance/SKILL.md +29 -0
  200. package/templates/skills/refactor/SKILL.md +28 -0
  201. package/templates/skills/security-audit/SKILL.md +28 -0
  202. package/templates/skills/test-gen/SKILL.md +30 -0
  203. package/docs/DEPLOYMENT.md +0 -382
  204. package/docs/MODEL_FINETUNING.md +0 -405
@@ -0,0 +1,168 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Self-Evolve CLI - 自我迭代升级命令行接口
4
+ *
5
+ * 说明:本文件不依赖 commander(此前为未声明的第三方依赖,导致全新安装时
6
+ * `Cannot find module 'commander'` 崩溃)。改为手写参数解析,自包含、零依赖,
7
+ * 与 src/self-evolve/manager.js 的 CLI 入口语义保持一致。
8
+ * 主入口:`fhcode self-evolve <subcommand>`(见 run.ts runSelfEvolve)。
9
+ */
10
+
11
+ const { SelfEvolveManager } = require('../self-evolve/manager.js');
12
+
13
+ const manager = new SelfEvolveManager();
14
+
15
+ /** 简单标志解析:支持 `--flag value` 与 `--flag=value` */
16
+ function parseFlags(args) {
17
+ const flags = {};
18
+ const positional = [];
19
+ for (let i = 0; i < args.length; i++) {
20
+ const a = args[i];
21
+ if (a.startsWith('--')) {
22
+ const eq = a.indexOf('=');
23
+ const name = eq >= 0 ? a.slice(2, eq) : a.slice(2);
24
+ const inline = eq >= 0 ? a.slice(eq + 1) : undefined;
25
+ flags[name] = inline !== undefined ? inline : args[i + 1];
26
+ if (inline === undefined && flags[name] !== undefined && !flags[name].startsWith('-')) i++;
27
+ else if (inline === undefined) flags[name] = true;
28
+ } else if (a.startsWith('-') && a.length === 2) {
29
+ flags[a.slice(1)] = args[i + 1];
30
+ if (flags[a.slice(1)] !== undefined && !String(flags[a.slice(1)]).startsWith('-')) i++;
31
+ else flags[a.slice(1)] = true;
32
+ } else {
33
+ positional.push(a);
34
+ }
35
+ }
36
+ return { flags, positional };
37
+ }
38
+
39
+ function printUsage() {
40
+ console.log('自我迭代管理系统(fhcode self-evolve)');
41
+ console.log('用法:');
42
+ console.log(' fhcode self-evolve init - 初始化系统');
43
+ console.log(' fhcode self-evolve status - 查看统计');
44
+ console.log(' fhcode self-evolve failures list [-t 类型] [-s 状态] [-d 天数] - 列出失败');
45
+ console.log(' fhcode self-evolve skills list - 列出技能');
46
+ console.log(' fhcode self-evolve create-skill -n 名称 -d 描述 -p 模式 -s 方案 [-t 触发词] - 创建技能');
47
+ console.log(' fhcode self-evolve review --daily - 每日复盘');
48
+ console.log(' fhcode self-evolve analyze [-d 天数] - 错误模式分析');
49
+ }
50
+
51
+ /** 统一的子命令入口:既可被 `fhcode self-evolve` 主 CLI 复用,也可独立运行 */
52
+ function runCli(argv) {
53
+ const args = Array.isArray(argv) ? argv.slice() : process.argv.slice(2);
54
+ if (args.length === 0) {
55
+ printUsage();
56
+ return;
57
+ }
58
+ const { flags, positional } = parseFlags(args);
59
+ const [cmd, sub] = positional;
60
+
61
+ if (cmd === 'init') {
62
+ manager.init();
63
+ } else if (cmd === 'status') {
64
+ const stats = manager.getStatistics();
65
+ console.log('\n📊 自我迭代系统状态');
66
+ console.log('='.repeat(40));
67
+ console.log(`总失败记录: ${stats.total_failures}`);
68
+ console.log(`已解决: ${stats.resolved}`);
69
+ console.log(`待处理: ${stats.pending}`);
70
+ console.log(`解决率: ${stats.resolution_rate}`);
71
+ console.log(`技能库: ${stats.total_skills} 个技能`);
72
+ console.log(`共享经验库: ${stats.total_experiences} 条经验(experiences.jsonl,与 self-improve 共用)`);
73
+ if (Object.keys(stats.by_type).length > 0) {
74
+ console.log('错误类型分布:');
75
+ Object.entries(stats.by_type).forEach(([type, count]) => console.log(` ${type}: ${count}`));
76
+ }
77
+ } else if (cmd === 'failures' && sub === 'list') {
78
+ const filters = {};
79
+ if (flags.t || flags.type) filters.type = flags.t || flags.type;
80
+ if (flags.s || flags.status) filters.status = flags.s || flags.status;
81
+ if (flags.d || flags.days) filters.days = parseInt(flags.d || flags.days, 10);
82
+ const failures = manager.listFailures(filters);
83
+ if (failures.length === 0) {
84
+ console.log('暂无失败记录');
85
+ return;
86
+ }
87
+ console.log(`\n找到 ${failures.length} 条失败记录:\n`);
88
+ failures.forEach((f) => {
89
+ const icon = f.status === 'resolved' ? '✅' : '⏳';
90
+ console.log(`${icon} [${f.id.slice(0, 8)}] ${f.error_type}`);
91
+ console.log(` 任务: ${String(f.task).slice(0, 60)}`);
92
+ console.log(` 错误: ${String(f.error_message).slice(0, 80)}`);
93
+ if (f.solution) console.log(` 解决: ${String(f.solution).slice(0, 60)}`);
94
+ console.log('');
95
+ });
96
+ } else if (cmd === 'skills' && sub === 'list') {
97
+ const skills = manager.listSkills();
98
+ if (skills.length === 0) {
99
+ console.log('技能库为空');
100
+ return;
101
+ }
102
+ console.log(`\n技能库 (${skills.length} 个技能):\n`);
103
+ skills.forEach((s) => {
104
+ console.log(`📦 ${s.name} v${s.version}`);
105
+ console.log(` ${s.description}`);
106
+ console.log(` 触发词: ${(s.triggers || []).join(', ') || '无'}`);
107
+ console.log(` 使用次数: ${s.usage_count}`);
108
+ console.log('');
109
+ });
110
+ } else if (cmd === 'create-skill') {
111
+ const name = flags.n || flags.name;
112
+ const description = flags.d || flags.description;
113
+ const pattern = flags.p || flags.pattern;
114
+ const solution = flags.s || flags.solution;
115
+ if (!name || !description || !pattern || !solution) {
116
+ console.error('create-skill 需要 -n/--name -d/--description -p/--pattern -s/--solution');
117
+ process.exitCode = 1;
118
+ return;
119
+ }
120
+ const triggers = (flags.t || flags.triggers || '').split(',').map((t) => t.trim()).filter(Boolean) || [name];
121
+ const skill = manager.createSkill(name, description, triggers, pattern, solution);
122
+ console.log(`\n✅ 技能已创建: ${skill.name}`);
123
+ console.log(` 位置: ~/.feihong-code/skills/${skill.name}/SKILL.md`);
124
+ } else if (cmd === 'review' && (flags.daily || flags.d === 'daily')) {
125
+ const report = manager.generateDailyReport();
126
+ console.log('\n📅 每日复盘报告');
127
+ console.log('='.repeat(40));
128
+ console.log(`日期: ${report.date}`);
129
+ console.log(`失败任务: ${report.total_failures}`);
130
+ console.log(`已解决: ${report.resolved}`);
131
+ console.log(`待处理: ${report.pending}`);
132
+ console.log(`新技能: ${report.new_skills}`);
133
+ report.failures.forEach((f) => {
134
+ const icon = f.status === 'resolved' ? '✅' : '⏳';
135
+ console.log(` ${icon} [${f.id}] ${f.type}: ${f.message}`);
136
+ });
137
+ } else if (cmd === 'analyze') {
138
+ const days = parseInt(flags.d || flags.days || '7', 10);
139
+ const recentFailures = manager.listFailures({ days });
140
+ const byType = {};
141
+ recentFailures.forEach((f) => {
142
+ (byType[f.error_type] = byType[f.error_type] || []).push(f);
143
+ });
144
+ console.log(`\n🔍 最近 ${days} 天的错误模式分析`);
145
+ console.log('='.repeat(40));
146
+ Object.entries(byType).forEach(([type, failures]) => {
147
+ console.log(`\n${type} (${failures.length} 次)`);
148
+ const existing = manager.skillsIndex.find((s) => s.error_pattern === type);
149
+ if (existing) console.log(` ✅ 已有技能: ${existing.name}`);
150
+ else {
151
+ console.log(` ⚠️ 建议创建新技能`);
152
+ console.log(` 示例: fhcode self-evolve create-skill \\`);
153
+ console.log(` --name ${type}-handler --description "处理${type}" --pattern ${type} --solution "根据具体情况处理"`);
154
+ }
155
+ });
156
+ } else if (cmd === 'help' || cmd === '--help' || cmd === '-h') {
157
+ printUsage();
158
+ } else {
159
+ printUsage();
160
+ process.exitCode = 1;
161
+ }
162
+ }
163
+
164
+ module.exports = { runCli };
165
+
166
+ if (require.main === module) {
167
+ runCli(process.argv.slice(2));
168
+ }
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildDemoPanes = buildDemoPanes;
4
+ exports.runTuiInteractive = runTuiInteractive;
5
+ exports.runTui = runTui;
6
+ /**
7
+ * 飞虹 Code (对标 Muse Code · 自研内核)
8
+ * 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
9
+ *
10
+ * P2-1 多窗格 TUI 入口:`fhcode tui`
11
+ * - 非 TTY:打印演示多窗格布局(供冒烟断言 / 管道输出)。
12
+ * - TTY:进入交互模式,展示文件树 + 消息/Diff 多窗格。
13
+ */
14
+ const multi_pane_tui_1 = require("./multi-pane-tui");
15
+ /** 演示数据:文件树 + 消息 + diff(供冒烟断言与 TTY 演示共用) */
16
+ function buildDemoPanes() {
17
+ const tui = new multi_pane_tui_1.MultiPaneTui({ width: 100, height: 28, fileTreeWidth: 24, color: false });
18
+ tui.setStatus({ mode: 'live', state: '运行中', fileCount: 3 });
19
+ tui.setFileTree(['src/', ' main.ts', ' agent/', ' planner.ts', 'package.json']);
20
+ tui.appendMessage('> 用户: 修复登录校验漏洞');
21
+ tui.appendMessage('计划: 1) 检查 auth middleware 2) 补 token 过期校验');
22
+ tui.setDiff({
23
+ file: 'src/server/middleware/auth.ts',
24
+ hunks: [
25
+ {
26
+ header: '-5,4 +5,5 @@',
27
+ lines: [
28
+ { type: 'ctx', content: 'export function auth(req, res, next) {' },
29
+ { type: 'del', content: ' if (!req.token) return res.status(401);' },
30
+ { type: 'add', content: ' if (!req.token) return res.status(401).end();' },
31
+ { type: 'add', content: ' if (isExpired(req.token)) return res.status(401).end();' },
32
+ { type: 'ctx', content: ' next();' },
33
+ ],
34
+ },
35
+ ],
36
+ });
37
+ return tui;
38
+ }
39
+ /** 交互循环(TTY):Tab 切窗格 / 1=消息 / 2=Diff / ↑↓ 文件树 / q 退出 */
40
+ function runTuiInteractive(stream = process.stdin) {
41
+ const tui = buildDemoPanes();
42
+ tui.start();
43
+ if (!tui.isEnabled) {
44
+ // 非 TTY:直接打印布局
45
+ console.log(tui.getLayout().join('\n'));
46
+ return;
47
+ }
48
+ stream.setRawMode?.(true);
49
+ stream.resume?.();
50
+ stream.setEncoding('utf8');
51
+ stream.on('data', (chunk) => {
52
+ const k = chunk.toString();
53
+ if (k === 'q' || k === '\u0003') {
54
+ tui.stop();
55
+ stream.setRawMode?.(false);
56
+ process.exit(0);
57
+ }
58
+ else if (k === '\t') {
59
+ tui.nextPane();
60
+ }
61
+ else if (k === '1') {
62
+ tui.setRightMode('messages');
63
+ }
64
+ else if (k === '2') {
65
+ tui.setRightMode('diff');
66
+ }
67
+ else if (k === '\u001b[B' || k === 'j') {
68
+ tui.moveTreeCursor(1);
69
+ }
70
+ else if (k === '\u001b[A' || k === 'k') {
71
+ tui.moveTreeCursor(-1);
72
+ }
73
+ });
74
+ tui.appendMessage('多窗格 TUI 已就绪(Tab 切窗格 / 1=消息 / 2=Diff / ↑↓ 文件树 / q 退出)');
75
+ }
76
+ function runTui() {
77
+ runTuiInteractive();
78
+ }
79
+ //# sourceMappingURL=tui-run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui-run.js","sourceRoot":"","sources":["../../src/cli/tui-run.ts"],"names":[],"mappings":"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"}
package/dist/cli/tui.js CHANGED
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Tui = void 0;
4
4
  /**
5
- * 飞虹 Code (Muse Code 参照复刻)
5
+ * 飞虹 Code (对标 Muse Code · 自研内核)
6
6
  * 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
7
7
  *
8
8
  * P3-1 轻量 TUI:sticky header + 无闪烁渲染(对齐 Gemini CLI 的终端体验)。
@@ -1 +1 @@
1
- {"version":3,"file":"tui.js","sourceRoot":"","sources":["../../src/cli/tui.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tui.js","sourceRoot":"","sources":["../../src/cli/tui.ts"],"names":[],"mappings":"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"}
@@ -2,13 +2,13 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SIGNATURE = exports.TAGLINE = exports.PRODUCT = exports.VERSION = void 0;
4
4
  /**
5
- * 飞虹 Code (Muse Code 参照复刻)
5
+ * 飞虹 Code (对标 Muse Code · 自研内核)
6
6
  * 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
7
7
  *
8
8
  * 版本号集中定义
9
9
  */
10
- exports.VERSION = '7.0.0';
10
+ exports.VERSION = '7.6.0';
11
11
  exports.PRODUCT = '飞虹 Code';
12
- exports.TAGLINE = '终端 AI 编程智能体(Muse Code 参照复刻)';
12
+ exports.TAGLINE = '终端 AI 编程智能体(对标 Muse Code / Claude Code / Cursor CLI · 自研内核差异化)';
13
13
  exports.SIGNATURE = '晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹';
14
14
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/cli/version.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACU,QAAA,OAAO,GAAG,OAAO,CAAC;AAClB,QAAA,OAAO,GAAG,SAAS,CAAC;AACpB,QAAA,OAAO,GAAG,6BAA6B,CAAC;AACxC,QAAA,SAAS,GACpB,uCAAuC,CAAC"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/cli/version.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACU,QAAA,OAAO,GAAG,OAAO,CAAC;AAClB,QAAA,OAAO,GAAG,SAAS,CAAC;AACpB,QAAA,OAAO,GAAG,gEAAgE,CAAC;AAC3E,QAAA,SAAS,GACpB,uCAAuC,CAAC"}
@@ -6,7 +6,7 @@ exports.auditFiles = auditFiles;
6
6
  exports.readAudit = readAudit;
7
7
  exports.verifyAudit = verifyAudit;
8
8
  /**
9
- * 飞虹 Code (Muse Code 参照复刻)
9
+ * 飞虹 Code (对标 Muse Code · 自研内核)
10
10
  * 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
11
11
  *
12
12
  * M4 审计:防篡改哈希链审计日志。
@@ -19,7 +19,7 @@ exports.createEnterpriseRuntime = createEnterpriseRuntime;
19
19
  exports.assertQuota = assertQuota;
20
20
  exports.renderWhoami = renderWhoami;
21
21
  /**
22
- * 飞虹 Code (Muse Code 参照复刻)
22
+ * 飞虹 Code (对标 Muse Code · 自研内核)
23
23
  * 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
24
24
  *
25
25
  * M4 企业能力聚合装配:租户 → 策略 → 审计 → 配额 → 守卫。
@@ -5,7 +5,7 @@ exports.loadPolicy = loadPolicy;
5
5
  exports.evaluate = evaluate;
6
6
  exports.renderPolicy = renderPolicy;
7
7
  /**
8
- * 飞虹 Code (Muse Code 参照复刻)
8
+ * 飞虹 Code (对标 Muse Code · 自研内核)
9
9
  * 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
10
10
  *
11
11
  * M4 权限:RBAC + 策略引擎。
@@ -4,7 +4,7 @@ exports.tenantSpendToday = tenantSpendToday;
4
4
  exports.resolveDailyLimit = resolveDailyLimit;
5
5
  exports.checkQuota = checkQuota;
6
6
  /**
7
- * 飞虹 Code (Muse Code 参照复刻)
7
+ * 飞虹 Code (对标 Muse Code · 自研内核)
8
8
  * 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
9
9
  *
10
10
  * M4 配额:租户级日成本预算。
@@ -5,7 +5,7 @@ exports.assertValidId = assertValidId;
5
5
  exports.resolveTenantContext = resolveTenantContext;
6
6
  exports.listTenants = listTenants;
7
7
  /**
8
- * 飞虹 Code (Muse Code 参照复刻)
8
+ * 飞虹 Code (对标 Muse Code · 自研内核)
9
9
  * 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
10
10
  *
11
11
  * M4 多租户:身份解析与数据隔离。
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RealModelExecutor = exports.MockOrchestratorExecutor = exports.SOLUTION_FILE = void 0;
4
4
  /**
5
- * 飞虹 Code (Muse Code 参照复刻)
5
+ * 飞虹 Code (对标 Muse Code · 自研内核)
6
6
  * 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
7
7
  *
8
8
  * harness 执行器(可插拔):对单个评测实例运行 Agent 闭环。
@@ -15,7 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  /**
18
- * 飞虹 Code (Muse Code 参照复刻)
18
+ * 飞虹 Code (对标 Muse Code · 自研内核)
19
19
  * 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
20
20
  *
21
21
  * 可插拔 harness 模块组统一出口:
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.LocalJsonLoader = exports.SwebenchLoader = void 0;
4
4
  exports.normalizeInstance = normalizeInstance;
5
5
  /**
6
- * 飞虹 Code (Muse Code 参照复刻)
6
+ * 飞虹 Code (对标 Muse Code · 自研内核)
7
7
  * 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
8
8
  *
9
9
  * harness 数据集加载器(可插拔):
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  /**
3
- * 飞虹 Code (Muse Code 参照复刻)
3
+ * 飞虹 Code (对标 Muse Code · 自研内核)
4
4
  * 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
5
5
  *
6
6
  * harness 模块组核心类型:评测实例 / 执行产出 / 验证结果 / 报告。
@@ -2,14 +2,16 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TestVerifier = exports.FileExistsVerifier = void 0;
4
4
  /**
5
- * 飞虹 Code (Muse Code 参照复刻)
5
+ * 飞虹 Code (对标 Muse Code · 自研内核)
6
6
  * 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
7
7
  *
8
8
  * harness 验证器(可插拔):判定执行产出是否满足通过条件。
9
9
  * - HarnessVerifier 接口:文件存在 / 测试通过 / 自定义规则均可实现接入(异步,跑测试需要)
10
- * - FileExistsVerifier:检查工作区是否生成了指定文件(当前 mock 闭环的通过标准)
11
- * - TestVerifier:在工作区运行测试命令判定通过——实例带 FAIL_TO_PASS
12
- * 优先以这些失败用例为测试目标(`npm test -- <用例>`),否则跑默认测试套件。
10
+ * - FileExistsVerifier:检查工作区是否生成了指定文件(mock 闭环冒烟用)
11
+ * - TestVerifier:按 SWE-bench 语义验证——
12
+ * FAIL_TO_PASS 用例必须先失败后通过(修复前验证失败可选用 beforeCommand);
13
+ * ② 修复后 FAIL_TO_PASS 必须全部通过;
14
+ * ③ PASS_TO_PASS 回归测试必须仍然通过(防止修坏既有功能)。
13
15
  * 命令经 sanitizeManagedCommand 约束(仅包管理器脚本,防命令注入)。
14
16
  */
15
17
  const fs_1 = require("fs");
@@ -27,22 +29,60 @@ class FileExistsVerifier {
27
29
  }
28
30
  }
29
31
  exports.FileExistsVerifier = FileExistsVerifier;
30
- /** 测试通过型验证器:在工作区运行测试,退出码 0 即通过 */
32
+ /**
33
+ * 测试通过型验证器(SWE-bench 语义):
34
+ * 修复后 FAIL_TO_PASS 全部通过 且 PASS_TO_PASS 回归全部通过,才算验证通过。
35
+ * 可选 beforeCommand:在验证前先跑一次(确认 FAIL_TO_PASS 原本确实失败,防"测试本来就过"的假阳性)。
36
+ */
31
37
  class TestVerifier {
32
38
  opts;
33
39
  id = 'test-run';
34
40
  constructor(opts = {}) {
35
41
  this.opts = opts;
36
42
  }
43
+ /** 在 cwd 执行单条命令并返回退出码;命令不合法时返回 -1(判为不通过,防注入) */
44
+ async runOne(cmd, cwd) {
45
+ const safe = (0, exec_1.sanitizeManagedCommand)(cmd, cmd);
46
+ if (!safe)
47
+ return -1;
48
+ const res = await (0, exec_1.runCommand)(safe, cwd, this.opts.timeoutMs ?? 120000);
49
+ return res.code;
50
+ }
51
+ /** 从命令的退出码判断"存在失败用例"(退出码非 0 即视为有失败) */
52
+ anyFailed(cmd, cwd) {
53
+ return this.runOne(cmd, cwd).then((code) => code !== 0);
54
+ }
37
55
  async verify(cwd, instance) {
38
- // FAIL_TO_PASS 用例时优先跑这些用例(回归到「失败用例现在应通过」);否则跑默认套件
39
- const defaultCmd = instance.FAIL_TO_PASS.length > 0 ? `npm test -- ${instance.FAIL_TO_PASS.join(' ')}` : 'npm test';
40
- const cmd = (0, exec_1.sanitizeManagedCommand)(this.opts.testCommand, defaultCmd);
41
- if (!cmd)
42
- return false; // 命令未通过受管约束,判为不通过
43
- const res = await (0, exec_1.runCommand)(cmd, cwd, this.opts.timeoutMs ?? 120000);
44
- return res.code === 0;
56
+ // 0) 可选:修复前确认 FAIL_TO_PASS 原本失败(真 SWE-bench 的差分前提)
57
+ if (this.opts.beforeCommand) {
58
+ const preFail = await this.anyFailed(this.opts.beforeCommand, cwd);
59
+ // 若修复前没有失败用例,则本次验证无意义(用例本来就过),判为不通过
60
+ if (!preFail)
61
+ return false;
62
+ }
63
+ // 1) FAIL_TO_PASS:修复后这些用例必须全部通过
64
+ const ftpCmd = this.opts.failToPassCommand ??
65
+ (instance.FAIL_TO_PASS.length > 0
66
+ ? `npm test -- ${instance.FAIL_TO_PASS.map(quoteTestId).join(' ')}`
67
+ : this.opts.testCommand ?? 'npm test');
68
+ const ftpCode = await this.runOne(ftpCmd, cwd);
69
+ if (ftpCode !== 0)
70
+ return false;
71
+ // 2) PASS_TO_PASS:既有功能回归必须仍然通过(防止修坏)
72
+ if (instance.PASS_TO_PASS.length > 0) {
73
+ const p2pCmd = this.opts.passToPassCommand ?? this.opts.testCommand ?? 'npm test';
74
+ const p2pCode = await this.runOne(p2pCmd, cwd);
75
+ if (p2pCode !== 0)
76
+ return false;
77
+ }
78
+ return true;
45
79
  }
46
80
  }
47
81
  exports.TestVerifier = TestVerifier;
82
+ /** 将测试用例 id 安全转义为 shell 参数(仅允许 [A-Za-z0-9_\-.:/\[\]#]) */
83
+ function quoteTestId(id) {
84
+ if (!/^[A-Za-z0-9_\-.:/[\]#]+$/.test(id))
85
+ return '';
86
+ return id;
87
+ }
48
88
  //# sourceMappingURL=verifier.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"verifier.js","sourceRoot":"","sources":["../../src/harness/verifier.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;GAUG;AACH,2BAAgC;AAChC,+BAA4B;AAC5B,8CAAyE;AASzE,2BAA2B;AAC3B,MAAa,kBAAkB;IAGA;IAFpB,EAAE,GAAG,aAAa,CAAC;IAE5B,YAA6B,OAAe,aAAa;QAA5B,SAAI,GAAJ,IAAI,CAAwB;IAAG,CAAC;IAE7D,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,SAA0B;QAClD,OAAO,IAAA,eAAU,EAAC,IAAA,WAAI,EAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1C,CAAC;CACF;AARD,gDAQC;AAED,kCAAkC;AAClC,MAAa,YAAY;IAIJ;IAHV,EAAE,GAAG,UAAU,CAAC;IAEzB,YACmB,OAAqD,EAAE;QAAvD,SAAI,GAAJ,IAAI,CAAmD;IACvE,CAAC;IAEJ,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,QAAyB;QACjD,oDAAoD;QACpD,MAAM,UAAU,GACd,QAAQ,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;QACnG,MAAM,GAAG,GAAG,IAAA,6BAAsB,EAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QACtE,IAAI,CAAC,GAAG;YAAE,OAAO,KAAK,CAAC,CAAC,kBAAkB;QAC1C,MAAM,GAAG,GAAG,MAAM,IAAA,iBAAU,EAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,CAAC;QACtE,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC;IACxB,CAAC;CACF;AAhBD,oCAgBC"}
1
+ {"version":3,"file":"verifier.js","sourceRoot":"","sources":["../../src/harness/verifier.ts"],"names":[],"mappings":"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"}