feihong-code 0.2.3 → 0.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 (180) hide show
  1. package/.github/FUNDING.yml +4 -0
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +37 -37
  3. package/.github/ISSUE_TEMPLATE/config.yml +14 -14
  4. package/.github/ISSUE_TEMPLATE/feature_request.md +28 -28
  5. package/.github/PULL_REQUEST_TEMPLATE.md +46 -46
  6. package/.github/SECURITY.md +67 -67
  7. package/.github/dependabot.yml +16 -0
  8. package/.github/workflows/ci.yml +1 -1
  9. package/AGENT-GUIDE.md +382 -237
  10. package/CHANGELOG.md +392 -0
  11. package/CODE_OF_CONDUCT.md +56 -56
  12. package/CONTRIBUTING.md +68 -68
  13. package/LICENSE +22 -22
  14. package/README.md +586 -522
  15. package/README.self-evolve.md +274 -0
  16. package/dist/agent/code-review.js +2 -0
  17. package/dist/agent/code-review.js.map +1 -1
  18. package/dist/agent/code-writer.js +74 -18
  19. package/dist/agent/code-writer.js.map +1 -1
  20. package/dist/agent/context-compactor.js +13 -4
  21. package/dist/agent/context-compactor.js.map +1 -1
  22. package/dist/agent/experience.js +319 -84
  23. package/dist/agent/experience.js.map +1 -1
  24. package/dist/agent/orchestrator.js +233 -71
  25. package/dist/agent/orchestrator.js.map +1 -1
  26. package/dist/agent/planner.js +30 -7
  27. package/dist/agent/planner.js.map +1 -1
  28. package/dist/agent/prompts.js +9 -0
  29. package/dist/agent/prompts.js.map +1 -1
  30. package/dist/agent/quality-gate.js +10 -4
  31. package/dist/agent/quality-gate.js.map +1 -1
  32. package/dist/agent/repo-context.js +181 -0
  33. package/dist/agent/repo-context.js.map +1 -0
  34. package/dist/agent/repo-reader.js +92 -99
  35. package/dist/agent/repo-reader.js.map +1 -1
  36. package/dist/agent/self-heal.js +80 -60
  37. package/dist/agent/self-heal.js.map +1 -1
  38. package/dist/agent/self-improver.js +65 -61
  39. package/dist/agent/self-improver.js.map +1 -1
  40. package/dist/agent/subagent-summary.js +31 -0
  41. package/dist/agent/subagent-summary.js.map +1 -0
  42. package/dist/agent/subagent.js +52 -2
  43. package/dist/agent/subagent.js.map +1 -1
  44. package/dist/agent/symbol-index.js +160 -0
  45. package/dist/agent/symbol-index.js.map +1 -0
  46. package/dist/agent/team.js +193 -0
  47. package/dist/agent/team.js.map +1 -0
  48. package/dist/cli/commands.js +124 -143
  49. package/dist/cli/commands.js.map +1 -1
  50. package/dist/cli/index.js +113 -106
  51. package/dist/cli/index.js.map +1 -1
  52. package/dist/cli/repl.js +82 -7
  53. package/dist/cli/repl.js.map +1 -1
  54. package/dist/cli/run.js +600 -95
  55. package/dist/cli/run.js.map +1 -1
  56. package/dist/cli/tui.js +145 -0
  57. package/dist/cli/tui.js.map +1 -0
  58. package/dist/cli/version.js +1 -1
  59. package/dist/enterprise/audit.js +145 -23
  60. package/dist/enterprise/audit.js.map +1 -1
  61. package/dist/enterprise/index.js +14 -11
  62. package/dist/enterprise/index.js.map +1 -1
  63. package/dist/enterprise/policy.js +22 -10
  64. package/dist/enterprise/policy.js.map +1 -1
  65. package/dist/harness/executor.js +127 -0
  66. package/dist/harness/executor.js.map +1 -0
  67. package/dist/harness/harness.js +87 -0
  68. package/dist/harness/harness.js.map +1 -0
  69. package/dist/harness/index.js +31 -0
  70. package/dist/harness/index.js.map +1 -0
  71. package/dist/harness/loader.js +138 -0
  72. package/dist/harness/loader.js.map +1 -0
  73. package/dist/harness/reporter.js +34 -0
  74. package/dist/harness/reporter.js.map +1 -0
  75. package/dist/harness/types.js +10 -0
  76. package/dist/harness/types.js.map +1 -0
  77. package/dist/harness/verifier.js +48 -0
  78. package/dist/harness/verifier.js.map +1 -0
  79. package/dist/hello.js +14 -0
  80. package/dist/hello.js.map +1 -0
  81. package/dist/memory/auto-summarize.js +208 -0
  82. package/dist/memory/auto-summarize.js.map +1 -0
  83. package/dist/memory/index.js +228 -0
  84. package/dist/memory/index.js.map +1 -0
  85. package/dist/models/model-router.js +100 -27
  86. package/dist/models/model-router.js.map +1 -1
  87. package/dist/models/model.dto.js +25 -3
  88. package/dist/models/model.dto.js.map +1 -1
  89. package/dist/models/providers/ollama.provider.js +12 -0
  90. package/dist/models/providers/ollama.provider.js.map +1 -1
  91. package/dist/models/providers/openai-compatible.provider.js +14 -1
  92. package/dist/models/providers/openai-compatible.provider.js.map +1 -1
  93. package/dist/plugins/plugin-loader.js +179 -0
  94. package/dist/plugins/plugin-loader.js.map +1 -0
  95. package/dist/runtime/event-log.js.map +1 -1
  96. package/dist/runtime/hooks.js +80 -0
  97. package/dist/runtime/hooks.js.map +1 -0
  98. package/dist/self-evolve/hook.js +60 -0
  99. package/dist/self-evolve/hook.js.map +1 -0
  100. package/dist/self-evolve/hook.ts +80 -0
  101. package/dist/self-evolve/manager.d.ts +8 -0
  102. package/dist/self-evolve/manager.js +401 -0
  103. package/dist/shared/config.js +35 -3
  104. package/dist/shared/config.js.map +1 -1
  105. package/dist/shared/errors.js +6 -2
  106. package/dist/shared/errors.js.map +1 -1
  107. package/dist/shared/i18n.js +535 -0
  108. package/dist/shared/i18n.js.map +1 -0
  109. package/dist/shared/secure-store.js +117 -0
  110. package/dist/shared/secure-store.js.map +1 -0
  111. package/dist/skills/grill.js +2 -1
  112. package/dist/skills/grill.js.map +1 -1
  113. package/dist/skills/self-heal.js +73 -0
  114. package/dist/skills/self-heal.js.map +1 -0
  115. package/dist/skills/skill-loader.js +131 -0
  116. package/dist/skills/skill-loader.js.map +1 -0
  117. package/dist/skills/skill-market.js +195 -0
  118. package/dist/skills/skill-market.js.map +1 -0
  119. package/dist/tools/analysis/code-analyzer.js +45 -18
  120. package/dist/tools/analysis/code-analyzer.js.map +1 -1
  121. package/dist/tools/index.js +5 -0
  122. package/dist/tools/index.js.map +1 -1
  123. package/dist/tools/mcp/index.js +84 -0
  124. package/dist/tools/mcp/index.js.map +1 -0
  125. package/dist/tools/mcp/mcp-client.js +194 -0
  126. package/dist/tools/mcp/mcp-client.js.map +1 -0
  127. package/dist/tools/sandbox.js +126 -0
  128. package/dist/tools/sandbox.js.map +1 -0
  129. package/dist/tools/shell/exec.js +72 -3
  130. package/dist/tools/shell/exec.js.map +1 -1
  131. package/dist/tools/shell/run-shell.tool.js +37 -7
  132. package/dist/tools/shell/run-shell.tool.js.map +1 -1
  133. package/dist/tools/skills/load-skill.tool.js +36 -0
  134. package/dist/tools/skills/load-skill.tool.js.map +1 -0
  135. package/dist/tools/tool.interface.js.map +1 -1
  136. package/dist/tools/tool.registry.js +69 -1
  137. package/dist/tools/tool.registry.js.map +1 -1
  138. package/dist/tools/web/web.tool.js +139 -0
  139. package/dist/tools/web/web.tool.js.map +1 -0
  140. package/dist/web/auth.js +178 -3
  141. package/dist/web/auth.js.map +1 -1
  142. package/dist/web/channels.js +171 -0
  143. package/dist/web/channels.js.map +1 -0
  144. package/dist/web/public/css/style.css +1546 -0
  145. package/dist/web/public/index.html +804 -37
  146. package/dist/web/public/js/api.js +309 -0
  147. package/dist/web/public/js/app.js +1472 -0
  148. package/dist/web/public/js/ui.js +832 -0
  149. package/dist/web/public/js/utils.js +170 -0
  150. package/dist/web/server.js +937 -11
  151. package/dist/web/server.js.map +1 -1
  152. package/dist/web/task-queue.js +470 -0
  153. package/dist/web/task-queue.js.map +1 -0
  154. package/dist/web/web-config.js +143 -0
  155. package/dist/web/web-config.js.map +1 -0
  156. package/docs/App/344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +299 -0
  157. package/docs/App/346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +554 -0
  158. package/docs/Deployment_Guide_EN.md +288 -0
  159. package/docs/SELF-EVOLVE-GUIDE.md +313 -0
  160. package/docs/Technical_Manual_EN.md +216 -0
  161. package/docs/User_Manual_EN.md +314 -0
  162. package/docs/error-codes.md +198 -0
  163. package/docs/screenshots/cli-demo.png +0 -0
  164. package/docs/screenshots/feature-comparison.png +0 -0
  165. package/docs/screenshots/web-console.png +0 -0
  166. package/docs/self-evolve-implementation.md +165 -0
  167. package/docs/self-evolve.md +166 -0
  168. package/docs//344/272/247/345/223/201/345/274/200/345/217/221/346/226/207/346/241/243.md +614 -614
  169. 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 -267
  170. package/docs//344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +318 -358
  171. 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 -130
  172. package/docs//346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +216 -303
  173. package/docs//346/236/266/346/236/204/344/270/216API.md +238 -238
  174. package/docs//347/224/250/346/210/267/346/211/213/345/206/214.md +196 -196
  175. package/docs//351/203/250/347/275/262/346/214/207/345/215/227.md +165 -165
  176. package/docs//351/203/250/347/275/262/350/257/264/346/230/216/344/271/246.md +288 -0
  177. package/docs//351/205/215/347/275/256/345/217/202/350/200/203.md +127 -127
  178. package/docs//351/241/265/351/235/242/345/212/237/350/203/275/345/244/215/347/233/230/344/270/216/345/206/222/347/203/237/346/265/213/350/257/225/346/212/245/345/221/212.html +117 -0
  179. package/package.json +108 -109
  180. package/tool-schema.json +117 -46
package/CHANGELOG.md CHANGED
@@ -2,6 +2,398 @@
2
2
 
3
3
  本文件遵循 [Keep a Changelog](https://keepachangelog.com/) 约定,版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)。
4
4
 
5
+ ## [0.6.0] — 2026-08-23(全面修复与前端架构升级:验证死循环修复 + 前端分模块 + 竞态条件修复 + 双语优化)
6
+
7
+ > **飞虹 Code v0.6.0**,全面复盘后落地 20+ 项修复与架构升级:修复验证死循环(self-heal null 绕过熔断)、Shell 正则过度拦截、Web 安全硬编码全权限、并发硬编码为 1、upsertExperience 竞态条件等严重问题;前端从 5043 行单文件拆分为 HTML+CSS+JS 四模块架构;补全双语支持与单元测试;代码精简优化。
8
+
9
+ ### 亮点(Highlights)
10
+ - **验证死循环修复**:`classifyError` 未匹配错误时返回 `null` 导致 orchestrator 跳过 maxRetry 熔断,连续失败 50+ 次不停止 → 改为 `unknown` 兜底永不返回 null,反思提示注入工具名+参数,新增 4 类错误规则(file-not-found/build-error/command-not-found/invalid-args)。
11
+ - **前端架构升级**:5043 行单文件 `index.html` → `index.html`(46KB) + `css/style.css`(52KB) + `js/`(utils.js 8KB + api.js 14KB + ui.js 40KB + app.js 70KB),职责分离、可并行加载、可维护性大幅提升;app-mobile 同步分模块。
12
+ - **竞态条件修复**:`upsertExperience` 读-改-写无锁,两个 run 同时完成互相覆盖 → 文件级 Promise 锁串行化,同路径写入互斥、不同路径不阻塞、锁队列空自动清理。
13
+ - **Shell 安全正则精准化**:广谱正则 `/[;&|`$(){}<>!]/` 拦截正常管道/命令链/变量 → 精准危险模式检测(仅拦 `$()`、反引号、curl|bash、sudo/eval/exec、rm -rf、nc/telnet 等),允许正常操作。
14
+
15
+ ### 修复(Fixed)
16
+ - **🔴 严重**:Web 任务安全设置硬编码全权限(`requireApproval:false`、无白名单)→ `buildSecurityFromPermissions()` 按任务 permissions 映射(禁写→read-only 沙箱,禁shell→需审批+只读命令白名单)。
17
+ - **🔴 严重**:并发硬编码为 1(`process.chdir()` 全局切换导致互踩)→ 移除全局 chdir(所有工具已通过 `ctx.cwd` 传参),默认并发从 1 提高到 2。
18
+ - **🟠 高优**:`decomposeGoal` 按`。`/`并且`拆分,连贯句子被撕碎成无意义子任务 → `MIN_FRAGMENT_LEN=12` 过短片段合并回前一个。
19
+ - **🟠 高优**:`extractExperience` 用顺序匹配+`startsWith('错误:')`判断工具成败,多工具并行时匹配错误 → `toolCallId` 建立 Map 精确关联,无 id 时回退顺序匹配(兼容旧数据),增加 `exit code [1-9]` 失败检测。
20
+ - **🟠 高优**:`spawn timeout` 只杀 shell 不杀子进程,npm/node 构建超时后继续运行占资源 → 手动 setTimeout:先 SIGTERM,5 秒后 SIGKILL;Unix 下尝试杀整个进程组(`-pid`),Windows 退化为杀单进程。
21
+ - **🟠 高优**:工具参数被 zod `safeParse` 静默 strip(模型把 A 工具参数传给 B 工具,zod 丢掉未知 key,模型完全不知道传错)→ 解析后对比原始参数与解析结果,被丢弃的 key 注入 `[参数警告]` 到输出开头;处理 `__parse_error__` 特殊标记。
22
+ - **🟠 高优**:`parseToolArgs` 在 JSON.parse 失败时直接返回 `{}`,无日志无反馈 → 3 级降级解析(直接解析→从 markdown 代码块提取→提取第一个 `{...}` 块),全部失败返回 `{__parse_error__:原始文本}` 而非 `{}`。
23
+ - **🟡 中优**:shell 输出截断到 4000 字符,末尾关键错误信息被截 → `smartTruncate()`(maxLen=6000,保留前 2000+后 3000,中间标`[已省略 N 字符]`)。
24
+ - **🟡 中优**:模型空 content + 重复工具调用(GLM-Z1-9B 弱模型只发 tool_calls 不输出思考,`list_dir` 被调用 10+ 次返回相同结果)→ prompts.ts 新增"思考与输出规范"(每次工具调用前输出 1-3 句思考,禁止 content 为空);orchestrator 新增 `toolResultCache`(命中已成功缓存直接返回并注入`[重复调用警告]`)。
25
+ - **🟡 中优**:根目录 23 个垃圾文件(各类 .log、_probe_* 临时文件、hello.ts/txt/sh 测试文件、134MB 的 gradle-8.7-bin.zip)→ 已清理。
26
+ - **🌐 双语**:ui.js 6 处硬编码中文空状态 → `renderEmpty()` + `t()` i18n;新增 4 个 i18n key 中英文翻译(empty.no_skills/empty.no_builtin_templates/empty.no_models/empty.preparing_welcome)。
27
+
28
+ ### 新增(Added)
29
+ - **前端模块拆分工具**:`scripts/split-frontend.cjs`(单文件→HTML+CSS+JS)、`scripts/split-app-js.cjs`(app.js→utils/api/ui/app 四模块,函数名分类+括号计数精确提取)。
30
+ - **`renderEmpty(el, text)` 辅助函数**:统一 6 处重复的空状态 innerHTML 赋值模式,每处从 3 行压缩为 1 行。
31
+ - **文件级 Promise 锁 `withFileLock(filePath, fn)`**:防止并发读写同一 JSONL 文件互相覆盖。
32
+ - **`smartTruncate(text, maxLen)`**:智能截断保留首尾,避免末尾关键错误丢失。
33
+ - **`DANGEROUS_SHELL_PATTERNS` 精准危险模式检测**:替代广谱正则,允许正常管道/命令链/变量引用。
34
+ - **`buildSecurityFromPermissions(permissions)`**:从任务权限映射安全沙箱设置。
35
+
36
+ ### 前端(Frontend)
37
+ - **回复格式优化**:移除"🗨 对话"分隔线、移除底部"🔧 执行过程(内部步骤·共 N 步)"大段展开区;助手正文从 `linkifyArtifacts`(纯转义+链接)改为 `renderMarkdown`(支持粗体/标题/列表/代码块/换行);工具参数从 `JSON.stringify` 原始输出改为 key:value 列表格式化;对话与步骤合并为单一时序流确保最新在底部。
38
+ - **分模块架构**:主站 6 文件(index.html + css/style.css + js/utils.js + js/api.js + js/ui.js + js/app.js);移动端 3 文件(index.html + css/style.css + js/app.js)。
39
+ - **i18n 双语**:前端词典 176 个 key,中英文全覆盖;语言切换时所有 UI 文本自动切换。
40
+
41
+ ### 测试(Tests)
42
+ - 新增 `tests/unit/agent-self-heal.test.ts`(9 用例):classifyError 新增 4 类规则验证 + unknown 兜底永不返回 null + 空输入不崩溃 + 返回值结构校验。
43
+ - 新增 `tests/unit/planner.test.ts`(8 用例):decomposeGoal 空目标/单句/多句拆分 + MIN_FRAGMENT_LEN=12 过短片段合并修复验证 + 足够长片段正常拆分。
44
+ - `tests/unit/experience.test.ts` 新增 4 用例:upsertExperience 并发同 id 写入不丢失(文件锁竞态修复验证)+ toolCallId 精确匹配(乱序返回)+ 无 toolCallId 回退最后一个调用(兼容旧数据)。
45
+ - 全部新增测试通过(40 tests, 0 failures)。
46
+
47
+ ### 代码优化(Refactored)
48
+ - `utils.js getDirectoryName`:移除 7 个调试 `console.log`,简化冗余变量和注释(-28 行)。
49
+ - 6 处空状态模式从 3 行压缩为 1 行 `renderEmpty()` 调用。
50
+ - 3 files changed, +25 / -23(代码量基本持平,可维护性和双语支持大幅提升)。
51
+
52
+ ### 校验(Verified)
53
+ - typecheck ✅ · build ✅(tsc + copy-web)
54
+ - 新增单元测试 **40/40** ✅
55
+ - 前端分模块后页面加载正常,CSS/JS 加载顺序正确(utils→api→ui→app)
56
+ - 敏感信息扫描:`.env`(含真实 API key)未被 git 跟踪,已跟踪文件中无硬编码密钥/token/密码
57
+
58
+ ### 安全(Security)
59
+ - `.env` 已在 `.gitignore` 中排除,含真实 API key 不会被提交。
60
+ - Shell 注入检测从广谱正则改为精准危险模式,减少误拦截的同时保持安全。
61
+ - Web 任务安全从硬编码全权限改为按任务 permissions 动态映射。
62
+
63
+ ---
64
+
65
+ ## [0.5.0] — 2026-08-17(正式发布:IDE 深度集成首轮 + SWE-bench 基准接入 + eval 回归门禁)
66
+
67
+ > **飞虹 Code v0.5.0 正式发布版本**,整合 v0.5.0-a(IDE 深度集成首轮)与 v0.5.0-b(SWE-bench 基准接入)的全部能力,并统一收口版本号(此前 package.json / version.ts 停留在 0.4.0)。
68
+
69
+ ### 亮点(Highlights)
70
+ - **IDE 深度集成首轮(M1.1/M1.3 + O6)**:`fhcode review [路径] [--json]` 结构化代码评审,VSCode 扩展内联诊断 + CodeAction 建议 + 保存自动评审;`--context-file` 编辑器上下文直达;O6 入站 HMAC/企微签名校验与出站渠道白名单。
71
+ - **SWE-bench 基准接入(M2.1/M2.4 + O2)**:`scripts/eval-swebench.mjs` 数据集加载器(HF datasets-server / 镜像 / 缓存)+ mock 执行闭环 + markdown/JSON 报告;eval 回归门禁(基线存档 + 对比失败即非零退出,可接入 CI)。
72
+ - **版本号收口**:package.json / version.ts / vscode-extension / MCP clientInfo 统一为 0.5.0,消除运行时版本漂移。
73
+
74
+ ### 校验(Verified)
75
+ - typecheck ✅ · build ✅
76
+ - `npm test` **164/164** ✅ · `npm run eval` **10/10** ✅
77
+ - verify:m4 **41/41** · m6 **29/29** · m7 **12/12** · m8 **27/27** · m9 **25/25** ✅ 零回归
78
+
79
+ > 详细子项见下方 `0.5.0-a` / `0.5.0-b` 章节。
80
+
81
+ ## [0.5.0-b] — 2026-08-16(SWE-bench 基准接入:数据集加载 + mock 执行 + 报告 + eval 回归门禁)
82
+
83
+ > v0.5.0 里程碑 b:SWE-bench 数据集加载器(HF datasets-server / 镜像 / 缓存)、mock 模式实例执行闭环与 markdown/JSON 报告、eval 回归门禁(基线存档 + 对比失败即退出非零)。
84
+
85
+ ### 新增(Added)
86
+ - **M2.1 `scripts/eval-swebench.mjs` 数据集加载器**:默认 HuggingFace datasets-server 免认证 API 分页拉取(`--split lite|verified`,`--limit/--offset`),`FH_SWEBENCH_DATA_URL` 指向镜像/离线 JSON(国内网络友好);缓存到 `~/.feihong-code/bench/swebench-<split>.json`,二次运行免下载;字段归一化(instance_id/repo/base_commit/problem_statement/patch/test_patch/FAIL_TO_PASS/PASS_TO_PASS)。
87
+ - **M2.4 mock 执行 + 报告**:`--run` 模式在临时工作区以 ScriptedMockProvider 驱动编排器跑「写方案→总结」闭环(验证 pipeline),输出 markdown 报告(表格:instance_id/repo/问题/F2P/P2P/结果/迭代/工具 + 汇总)与 JSON(meta/results/summary);`--report <path>` 落盘;有失败实例退出非零。
88
+ - **O2 eval 回归门禁**:`node scripts/eval.mjs --save-baseline <path>` 存档基线 JSON,`--baseline <path>` 对比——本次 pass 低于基线即打印失败并退出非零(可接入 CI);基线解析失败跳过对比(不阻断)。
89
+
90
+ ### 修复(Fixed)
91
+ - **eval-swebench Windows 直跑缺陷**:`import.meta.url.endsWith(argv[1])` 前缀不匹配(URL 带 `file:///` 前缀)导致直接运行时 main 不执行——改用 `pathToFileURL` 归一化比较。
92
+
93
+ ### 校验(Verified)
94
+ - typecheck ✅ · build ✅ · `npm test` **164/164** ✅
95
+ - eval-swebench mock 验证 ✅(镜像加载/缓存/二次走缓存/--json/--run 执行/报告写入)
96
+ - eval 门禁三路径 ✅(存档/对比通过/对比失败拦截)
97
+ - verify:m4 41/41 · m6 29/29 · m7 12/12 · m8 27/27 · m9 25/25 · eval 10/10 ✅ 零回归
98
+
99
+ ## [0.5.0-a] — 2026-08-16(IDE 深度集成首轮:review --json + 内联评审 + 上下文入参 + O6 安全前置)
100
+
101
+ > v0.5.0 里程碑 a:CLI 新增结构化代码评审输出(`fhcode review --json`,修复单文件目标)、编辑器上下文直达(`--context-file`)、VSCode 扩展内联评审(DiagnosticCollection + CodeAction 建议 + 保存自动评审)、O6 入站签名校验工具与出站渠道白名单。
102
+
103
+ ### 新增(Added)
104
+ - **M1.1a `fhcode review [路径] [--json]`**:复用 /grill 规则引擎的结构化评审——文本模式人类可读、`--json` 输出完整结构(scanned/findings/summary),供 IDE 内联评审消费;修复 `runGrill` 仅支持目录目标(单文件路径被 collectFiles 当目录读返回空),现文件/目录均可。
105
+ - **M1.3 `--context-file <path>`**:主命令可附加活动文件/选区文件内容作为结构化上下文(限 32KB 防爆上下文,包裹 `<context-file>` 标记),IDE 扩展与 CI 均可注入。
106
+ - **M1.1b VSCode 内联评审**:`fhcode.review` 调起 CLI `review --json`,findings 映射为编辑器内联诊断(critical/high=Error、medium=Warning、low=Information),悬停看详情;CodeAction 快速修复查看建议;`fhcode.reviewOnSave` 配置(默认 true)保存后自动评审。
107
+ - **O6 安全前置**:`verifyHmacSignature`(HMAC-SHA256 计时安全比较,`sha256=` 前缀兼容)与 `verifyWecomSignature`(企微回调 SHA1 排序校验)供 M3 入站 webhook 复用;出站渠道白名单 `FH_CHANNEL_ALLOW`(逗号分隔,缺省全放行,显式配置后仅白名单渠道可发,大小写不敏感)。
108
+
109
+ ### 测试(Tests)
110
+ - 新增 `channels-auth.test.ts` 3 个用例(HMAC 正确/篡改/缺参、企微 SHA1 排序校验、白名单空=全放行/显式限制/大小写)。
111
+ - `npm test` **164/164** ✅
112
+
113
+ ### 校验(Verified)
114
+ - typecheck ✅ · build ✅ · `npm run eval` ✅(10/10:场景 5 + 验收 5,整体通过率 100%)
115
+ - review --json 冒烟 ✅(单文件扫描输出 findings)· --context-file 冒烟 ✅(内容注入目标)
116
+ - verify:m4 41/41 · m6 29/29 · m7 12/12 · m8 27/27 · m9 25/25 ✅ 零回归
117
+
118
+ ## [0.4.0] — 2026-08-16(P6 治理与增强:提交基线 + eval 扩充 + IDE 增强 + 跨进程队列 + 复杂度治理)
119
+
120
+ > 全面复盘后按投入产出落地五项:提交 v0.4.0 基线打 tag、eval 接入验收型任务集(SWE-bench 风格)、VSCode 扩展升级(选区上下文 + 原生 diff 面板)、任务队列跨进程持久化、两处核心函数表驱动化降复杂度。
121
+
122
+ ### 新增(Added)
123
+ - **P6-2 eval 验收型任务集**:`scripts/eval.mjs` 新增 SWE-bench 风格验收任务(setup→steps→check 验证**真实产物**,而非 mock 结果):写模块(含 add 函数)/ edit_file 精确替换 / grep 定位后写结果 / run_shell 产出文件(cp)/ 沙箱 read-only 拦截;整体通过率从场景统计扩展为「场景 5 + 验收 5 = 10 项」。
124
+ - **P6-3 VSCode 扩展增强**:`fhcode.run` 自动检测选区并把选中代码作为 `<selection>` 上下文注入目标;`fhcode.diff` 用 VSCode **原生 diff 编辑器**展示 HEAD ↔ 工作区(`fhcode-head` scheme + TextDocumentContentProvider + `git show HEAD:<path>`);新增 `fhcode.output` 命令。
125
+ - **P6-4 跨进程任务队列**:`TaskQueue` 可选 `persistDir`——每任务落盘 `<dir>/<id>.json`(tmp+rename 原子写);构造时恢复:queued 重新入队执行、**running 僵尸标记 failed**(防进程崩溃遗留)、终态保留可查询;`clearPersisted` 清理。
126
+
127
+ ### 修复(Fixed)
128
+ - **eval 沙箱模式误用**:验收任务曾统一以 read-only 沙箱运行导致写类任务全被拦截——默认 workspace-write,仅 sandbox-guard 任务用 read-only。
129
+ - **eval 命令注入误伤**:bench-shell-script 原用 `node -e "...()"` 命中 run_shell 注入防护(`()` 为元字符)——改用无元字符 `cp` 命令验证真实执行(防护本身正确工作)。
130
+
131
+ ### 优化(Changed)
132
+ - **P6-5 复杂度治理**:`experience.extractExperience`(cc 20→表驱动 EXTRACTORS,增删规则只加一行)、`code-analyzer.analyzeFile`(规则 if 链表 → `ISSUE_RULES` 表,含技术债务提示)。行为零变更,161 单测全绿验证。
133
+ - **P6-1 提交基线**:67 文件拆 3 commit(feat/test/docs)+ **tag v0.4.0**,历史可回滚。
134
+
135
+ ### 测试(Tests)
136
+ - 新增 `task-persist.test.ts` 5 个用例(落盘原子性/queued 恢复执行/僵尸标记 failed/清理/纯内存不落盘)。
137
+ - `npm test` **161/161** ✅
138
+
139
+ ### 校验(Verified)
140
+ - typecheck ✅ · build ✅ · `npm run eval` ✅(**10/10:场景 5 + 验收 5**,整体通过率 100%)
141
+ - verify:m4 41/41 · m6 29/29 · m7 12/12 · m8 27/27 · m9 25/25 ✅ 零回归
142
+
143
+ ## [0.4.0] — 2026-08-16(Skills 市场对接:search / install / list)
144
+
145
+ > 对接 agentskills.io 开放技能市场(discovery index 规范 0.2.0):`fhcode skill-market search <关键词>` 检索、`install <技能名>` 安装(支持 SKILL.md 直下与 tar.gz 归档解包)、`list` 查看本地技能;安装后自动被任务技能发现(渐进式披露)复用。
146
+
147
+ ### 新增(Added)
148
+ - **`src/skills/skill-market.ts` 市场模块**:well-known 发现(`/.well-known/agent-skills/index.json`)、`$schema` 兼容判定(0.2.0/0.1.0,未知告警)、RFC 3986 URL 解析(绝对/根相对/相对)、评分搜索(名称精确>前缀>包含>描述)、sha256 digest 校验(防投毒)、skill-md 直下与 tar.gz 归档解包(**零依赖手写 tar 解析**,路径穿越防护)。
149
+ - **`fhcode skill-market` CLI**:`search <关键词>`(`--repo <市场源>` 指定源,缺省 agentskills.io 或 `FH_SKILL_MARKET`)、`install <技能名>`(安装到 `~/.feihong-code/skills/`)、`list`(本地已装技能);安装校验 SKILL.md 含 name frontmatter,失败回滚。
150
+ - **i18n**:11 组中英双语词条(本地空/拉取失败/schema 告警/搜索空/标题/安装提示/未找到/安装成功/失败等)。
151
+
152
+ ### 测试(Tests)
153
+ - 新增 `skill-market.test.ts` 10 个用例(索引解析/schema 判定/搜索排序/URL 解析/digest 校验/skill-md 安装/归档解包/篡改拒绝/路径穿越防护),含本地 mock 市场服务器与手写 tar.gz 夹具。
154
+ - `npm test` **156/156** ✅
155
+
156
+ ### 校验(Verified)
157
+ - typecheck ✅ · build ✅ · `npm run eval` ✅(5/5 场景,完成率 100%)
158
+ - verify:m4 41/41 · m6 29/29 · m7 12/12 · m8 27/27 · m9 25/25 ✅ 零回归
159
+
160
+ ## [0.4.0] — 2026-08-16(P5 生态收尾:任务面板 + webhook 调度 + VSCode 扩展 + Docker 沙箱 + 语义索引 + 消息渠道)
161
+
162
+ > 对标生态全景后补齐六项工程缺口:Web 控制台从只读升级为可交互任务面板、任务状态 webhook 调度入口(可被 CI/外部系统编排)、VSCode 扩展壳(编辑器侧调起 CLI)、Docker 容器沙箱第四档、轻量语义符号索引、Telegram/企业微信消息渠道推送。
163
+
164
+ ### 新增(Added)
165
+ - **P5-1 Web 任务面板**:`index.html` 从只读仪表盘升级为可交互任务面板——token 输入(URL 参数或 localStorage 持久化)、目标提交(`POST /api/tasks`)、任务列表(5s 轮询 + 徽章状态)、点击展开结果详情(迭代/成本/日志/最终答案/错误)。
166
+ - **P5-2 调度入口 webhook**:`TaskQueue` 状态机每个节点(queued→running→done|failed)触发回调;`fireWebhook` 携带**状态快照**(修复 submit 后 pump 同步改状态导致 queued 回调读不到的问题);`POST /api/webhook` 动态注册、`GET /api/webhook` 查询;`FH_TASK_WEBHOOK_URL` 初始化。
167
+ - **P5-3 VSCode 扩展壳**:`vscode-extension/`(package.json 清单 + extension.js + README)——`fhcode.run` 调起 CLI 执行任务(输出流式写入 Output Channel)、`fhcode.diff` 查看工作区 diff;`fhcode.binaryPath`/`fhcode.offline` 配置。
168
+ - **P5-4 Docker 沙箱模式**:沙箱新增第四档 `FH_SANDBOX_MODE=container`——shell 命令在 Docker 容器内执行(`docker run --rm -v <cwd>:/workspace`,镜像 `FH_SANDBOX_IMAGE` 默认 `node:22-alpine`);网络域名规则照常生效;`docker` 别名可写。
169
+ - **P5-5 轻量语义索引**:`src/agent/symbol-index.ts` 正则级符号提取(函数/类/接口/const/type,跨 TS/JS),目录扫描跳过 node_modules/.git,磁盘缓存(FH_HOME/symbol-index.json,根路径匹配防串库),`findSymbol`/`symbolsForFile`/`indexStats` 查询。
170
+ - **P5-6 消息渠道**:`src/web/channels.ts` 聚合 Telegram(`FH_CHANNEL_TELEGRAM_BOT_TOKEN`+`FH_CHANNEL_TELEGRAM_CHAT_ID`)与企业微信(`FH_CHANNEL_WECOM_KEY` 逗号分隔多 key)推送;任务状态变化自动推送紧凑消息;未配置渠道零开销、投递失败仅告警。
171
+
172
+ ### 修复(Fixed)
173
+ - **task-queue webhook 时序缺陷**:submit() 后 pump 同步把状态改为 running,若回调读取当前状态则 queued 节点永远发不出去——改为回调携带 status 快照。
174
+ - **symbol-index 两处缺陷**:扩展名匹配用整个文件名(应为 `extname`);缓存路径用 `homedir()` 在 Windows 不读 `HOME`(改为尊重 `FH_HOME`)。
175
+
176
+ ### 测试(Tests)
177
+ - 新增 6 个测试文件、27 个用例:`task-webhook.test.ts`(3 例:生命周期回调/动态注册/不可达容错)、`symbol-index.test.ts`(5 例:提取/扫描跳过/缓存往返/查询/统计)、`channels.test.ts`(5 例:开关识别/消息生成/未配置无操作/启用检测/TaskQueue 集成);`sandbox.test.ts` 扩充 container 用例、`web-tools`/`task-queue` 回归。
178
+ - `npm test` **147/147** ✅
179
+
180
+ ### 校验(Verified)
181
+ - typecheck ✅ · build ✅ · `npm run eval` ✅(5/5 场景,完成率 100%)
182
+ - Web 任务面板冒烟 ✅(401 鉴权 / 201 创建 / 任务 done 含结果)
183
+ - verify:m4 41/41 · m6 29/29 · m7 12/12 · m8 27/27 · m9 25/25 ✅ 零回归
184
+
185
+ ## [0.4.0] — 2026-08-16(P4 云端与协作:/api/tasks 任务队列 + Agent teams 多 agent 协作)
186
+
187
+ > 路线图最终阶段:把 CLI 执行能力暴露为 HTTP 任务队列(云执行雏形),并引入 Agent teams 多 agent 协作(共享任务清单 + 消息总线,对齐 Claude Code agent teams)。
188
+
189
+ ### 新增(Added)
190
+ - **P4-1 云执行(`/api/tasks`)**:从 `runGoal` 抽取服务端可复用执行函数 `executeTask`(静默执行、返回结构化结果);Web 控制台新增任务队列 `TaskQueue`(提交/列表/查询,并发上限默认 2,`FH_TASK_CONCURRENCY` 可调,状态机 queued → running → done/failed);`POST /api/tasks`(201 创建)、`GET /api/tasks`、`GET /api/tasks/:id`(404 兜底),全部经 Bearer 鉴权。
191
+ - **P4-2 Agent teams(`fhcode team "<目标>"`)**:`src/agent/team.ts` 实现 `TeamBus`(消息总线,send/receive/broadcast 定向与广播)、`TaskBoard`(共享任务清单,claim 原子认领防重复)、`runTeam`(多 agent 并发认领执行,逐任务摘要回传,产出团队报告);目标经 planner 拆解为任务清单,成员可自定义角色。
192
+
193
+ ### 修复(Fixed)
194
+ - **runTeam 完成判定**:`runSubTask` 返回 `ok=false` 时任务须记为 failed(此前仅抛错才记 failed,导致 overall 误判为 success)。
195
+
196
+ ### 测试(Tests)
197
+ - 新增 2 个测试文件、10 个用例:`task-queue.test.ts`(4 例:异步执行到 done/列表倒序/按 id 查询/并发上限)、`team.test.ts`(6 例:总线定向+广播/认领原子性/多 agent 全完成/部分失败/抛错失败/个人上限)。
198
+ - `npm test` **133/133** ✅
199
+
200
+ ### 校验(Verified)
201
+ - typecheck ✅ · build ✅ · `npm run eval` ✅(5/5 场景,完成率 100%)
202
+ - verify:m4 41/41 · m6 29/29 · m7 12/12 · m8 27/27 · m9 25/25 ✅ 零回归
203
+
204
+ ## [0.4.0] — 2026-08-16(P3 体验与生态:TUI + web 工具 + 插件分发 + 子代理嵌套)
205
+
206
+ > P0-P2 补齐能力底座后,P3 聚焦终端体验与生态延展:REPL 升级为 sticky-header TUI(无闪烁渲染)、新增实时信息检索工具(受沙箱网络规则约束)、插件打包分发(skills+hooks+MCP 一键安装)、子代理递归嵌套(深度上限 + 逐层摘要)。
207
+
208
+ ### 新增(Added)
209
+ - **P3-1 TUI 升级(`src/cli/tui.ts`)**:REPL 在 TTY 下自动进入交替屏幕缓冲(`\x1b[?1049h`),sticky header 常驻显示模式/runId/迭代/成本/状态,内容区滚动;整屏单次 write 无闪烁渲染;滚轮/滚动偏移查看历史(SGR 鼠标模式);非 TTY 自动退化普通输出。
210
+ - **P3-2 web 工具(`web_search` / `web_fetch`)**:零依赖实时信息检索(默认 DuckDuckGo HTML 接口,`FH_SEARCH_ENDPOINT` 可覆盖);HTML 转纯文本、输出 6KB 截断、15s 超时;`checkNetworkUrl` 与沙箱网络规则联动(FH_NETWORK_ALLOW/DENY 对 URL 入参同样生效)。
211
+ - **P3-3 插件打包分发(`fhcode plugin install/list`)**:`plugin.json` 清单打包 skills + hooks + MCP 服务器;用户级 `~/.feihong-code/plugins` + 项目级 `.fhcode/plugins` 双级发现;`installPlugin` 支持本地目录复制与 git clone,覆盖安装、非法插件拒绝;`loadConfig` 自动聚合插件技能目录/hooks/MCP。
212
+ - **P3-4 子代理嵌套**:`runSubAgent` 新增深度控制(默认 3 层),目标可拆解且未达上限时递归派生子代理(子目录隔离,不建 git worktree),逐层用摘要结果回传(复用 P2-2 `summarizeSubTaskAnswer`),深度达上限或目标不可拆解时直接执行。
213
+
214
+ ### 修复(Fixed)
215
+ - **run.ts 装配**:runGoal 传入 `pluginSkillDirs`,让插件技能进入编排器技能索引(此前插件技能仅可被 load_skill 发现)。
216
+
217
+ ### 测试(Tests)
218
+ - 新增 4 个测试文件、13 个用例:`web-tools.test.ts`(5 例:本地 mock HTTP 抓取/黑名单/白名单/搜索解析/URL 检查)、`plugin-loader.test.ts`(5 例:清单解析/发现聚合/安装覆盖/非法拒绝/缺源)、`subagent-nesting.test.ts`(3 例:深度上限直执行/递归嵌套摘要/不可拆解直执行)。
219
+ - `npm test` **123/123** ✅
220
+
221
+ ### 校验(Verified)
222
+ - typecheck ✅ · build ✅ · `npm run eval` ✅(5/5 场景,完成率 100%)
223
+ - verify:m4 41/41 · m6 29/29 · m7 12/12 · m8 27/27 · m9 25/25 ✅ 零回归
224
+
225
+ ## [0.4.0] — 2026-08-16(P2 确定性控制:hooks 事件系统 + 子代理摘要 + AGENTS.md 路径级规则)
226
+
227
+ > 对标 Claude Code 补上"确定性控制"短板:hooks 事件系统(工具调用前可拦截、编辑后自动跑命令)、子代理结果摘要化回主上下文(隔离中间大输出)、AGENTS.md 支持 paths frontmatter 路径级规则(JIT 按需注入省 token)。
228
+
229
+ ### 新增(Added)
230
+ - **P2-1 hooks 事件系统(`FH_HOOKS`)**:PreToolUse(工具执行前,命令退出码非 0 → 硬拦截)/ PostToolUse(执行后记录,可跑 lint/格式化)/ PostEdit(编辑工具成功落盘后,针对被改文件)/ SessionStart(预留);支持 `{cwd} {tool} {path} {runId} {ok}` 占位符与 `tools`/`paths` 匹配过滤;零上下文成本(hook 是命令而非指令文本)。
231
+ - **P2-2 子代理结果摘要**:`subagent-summary.ts` 把子任务最终答案摘要化(默认 600 字符,超长截断并标注原文长度),`swe`/并行子任务回主上下文只带摘要+元数据,隔离中间大输出。
232
+ - **P2-3 AGENTS.md 路径级规则**:`paths` frontmatter(`["src/**","tests/**"]`)声明规则作用域;无 paths 的正文作为全局指令常驻 system prompt,带 paths 的规则在工具操作相关文件时 JIT 注入(按文件去重);`pathMatches` 支持目录前缀 / `**` 任意深度 / `*` 单层通配 / 精确匹配。
233
+
234
+ ### 修复(Fixed)
235
+ - **repo-context 返回结构重构**:`readRepoInstructions` 从返回字符串改为返回 `{global, scoped}` 结构化结果,兼容原全局注入语义。
236
+ - **pathMatches 通配符顺序缺陷**:`**`/`*` 需在正则转义前处理,改为手写 globToRegex 转换器(顺序敏感),修复 `**/*.test.ts` 等模式误判。
237
+
238
+ ### 测试(Tests)
239
+ - 新增 `hooks.test.ts` 8 个用例(解析过滤/占位符/PreToolUse 拦截/PostToolUse 不阻断/PostEdit 路径匹配/注册表集成)、`subagent-summary.test.ts` 4 个用例(短结果/截断/边界/空串);`repo-context.test.ts` 重构适配新结构并新增 paths 规则与 pathMatches 用例。
240
+ - `npm test` **110/110** ✅
241
+
242
+ ### 校验(Verified)
243
+ - typecheck ✅ · build ✅ · `npm run eval` ✅(5/5 场景,完成率 100%)
244
+ - verify:m4 41/41 · m6 29/29 · m7 12/12 · m8 27/27 · m9 25/25 ✅ 零回归
245
+
246
+ ## [0.4.0] — 2026-08-16(P1 核心增强:子代理模型分工 + SKILL.md 技能标准 + eval 跑分)
247
+
248
+ > 在 P0 基础上继续对标 Codex:子任务自动路由低成本模型(编排器/worker 分工)、引入 Agent Skills 开放标准(SKILL.md 渐进式披露,现有 /plan /grill /goal 迁入)、新增本地 mock 跑分基准(完成率/工具效率/自愈率可量化)。
249
+
250
+ ### 新增(Added)
251
+ - **P1-1 子代理模型分工**:Orchestrator 新增 `tags` 路由选项(缺省 `['code-gen']`);`swe` 子任务与并行子代理(subagent)自动带 `['code-gen','cheap']`,让低成本模型分担高频子任务(对齐 Codex 编排器 gpt-5.4 + worker gpt-5.4-mini 模式)。无 cheap 标签 provider 时自动回退全部 provider,零配置零风险。
252
+ - **P1-2 SKILL.md 技能标准**:`src/skills/skill-loader.ts` 实现 open agent skills 兼容解析(frontmatter name/description + 正文)、多级发现(仓库 `.agents/skills` / `.claude/skills` 逐级回溯 + 打包 `skills/` + 用户级 `~/.feihong-code/skills`)、渐进式披露(name+description 索引常驻 ≤8KB,完整正文由 `load_skill` 工具按需加载);`load_skill` 注册为内置工具;现有 /plan /grill /goal 迁入 `skills/plan|grill|goal/SKILL.md` 打包技能。
253
+ - **P1-3 eval 跑分基准(`npm run eval`)**:`scripts/eval.mjs` 用 ScriptedMockProvider 跑 5 组标准场景(简单回答/单工具/多工具/自愈/多轮),复用 P0-1 事件流统计完成率、平均迭代、工具效率(工具调用/任务)、自愈触发率;支持 `--json` 结构化输出供横向对比;退出码可接入 CI。
254
+
255
+ ### 测试(Tests)
256
+ - 新增 `skill-loader.test.ts` 7 个用例(frontmatter 解析/无 frontmatter 回退/仓库发现回溯/打包目录/索引预算截断/按名加载/未知技能)。
257
+ - `npm test` **95/95** ✅
258
+
259
+ ### 校验(Verified)
260
+ - typecheck ✅ · build ✅ · `npm run eval` ✅(5/5 场景通过,完成率 100%)
261
+ - verify:m4 41/41 · m6 29/29 · m7 12/12 · m8 27/27 · m9 25/25 ✅ 零回归
262
+
263
+ ## [0.4.0] — 2026-08-16(P0 快速见效:流式输出 + 沙箱三模式 + MCP + AGENTS.md)
264
+
265
+ > 对标 Codex 差距分析后优先落地 P0 四项工程级升级:任务过程流式可见、沙箱从"白名单"升级为可证明边界(三模式 + 网络域名规则)、打通 MCP 工具生态(零依赖 stdio 客户端)、支持仓库级 AGENTS.md 指令自动注入。
266
+
267
+ ### 新增(Added)
268
+ - **P0-1 流式输出(`--stream`)**:编排器新增事件流回调 `onEvent`(model.response / tool.call / tool.result / self-heal / context.compact / session.end),CLI 增量渲染到 stdout(🧠🔧✅❌🩹📦🏁),长任务过程实时可见;事件与展示解耦,后续 TUI 可复用同一事件流。
269
+ - **P0-2 沙箱三模式(`FH_SANDBOX_MODE`)**:`read-only`(只读勘察,禁写禁执行)/ `workspace-write`(默认,文件工具正常,shell 受白名单+审批)/ `danger-full-access`(绕过写限制与审批,危险命令黑名单仍生效);网络域名规则 `FH_NETWORK_ALLOW` / `FH_NETWORK_DENY`(deny 全模式生效,allow 未命中即拦截);沙箱作为"能否做"的硬边界先于 RBAC 守卫执行,审批/策略无权放行被拦截动作。
270
+ - **P0-3 MCP 客户端(`FH_MCP_SERVERS`)**:零依赖 MCP stdio 客户端(NDJSON JSON-RPC 2.0,initialize 握手 → tools/list → tools/call),远程工具以 `<serverName>_<tool>` 前缀注册进 ToolRegistry(沙箱/守卫同样生效);服务器启动失败自动跳过不阻塞主流程;支持配置文件 `mcp.servers` 字段。
271
+ - **P0-4 仓库指令(AGENTS.md)**:自动发现 cwd → 仓库根(`.git` 判定)逐级向上的 `AGENTS.md`(含 CLAUDE.md / .atomcode.md 别名兜底),内容注入 system prompt(限 8KB),与经验注入叠加生效。
272
+
273
+ ### 修复(Fixed)
274
+ - **MCP 客户端 pending 映射缺陷**:超时/进程退出时错误地把 `Error` 传给 resolve 通道(类型与行为双重错误),改为 `{resolve, reject, timer}` 结构,resolve 时清理定时器。
275
+ - **沙箱接入顺序**:沙箱校验先于 RBAC 守卫执行,避免策略/审批放行沙箱硬边界外的动作。
276
+
277
+ ### 测试(Tests)
278
+ - 新增 4 个测试文件、20 个用例:`sandbox.test.ts`(8 例:三模式/网络规则/域名解析)、`mcp.test.ts`(6 例:握手/列工具/调用/注册/容错/解析)、`repo-context.test.ts`(6 例:命中/回溯/兜底/截断/片段生成)。
279
+ - 新增 mock MCP 服务器夹具 `tests/fixtures/mock-mcp-server.mjs`(NDJSON 协议)。
280
+ - `npm test` **88/88** ✅
281
+
282
+ ### 校验(Verified)
283
+ - typecheck ✅ · build ✅ · `--stream` 冒烟 ✅(增量事件可见)
284
+ - verify:m4 41/41 · m6 29/29 · m7 12/12 · m8 27/27 · m9 25/25 ✅ 零回归
285
+
286
+ ## [0.4.0] — 2026-08-16(自我优化迭代:doctor 环境自检 + 统计闭环 + 测试加固)
287
+
288
+ > 在 v0.3.3 复盘修复基础上继续自我优化:新增 `fhcode doctor` 环境自检命令;修复模型统计只在内存不落盘的半成品闭环;审计写锁忙等改指数退避;清除全部 `as any` 弱类型;为核心模块补齐单元测试(68/68 全绿)。
289
+
290
+ ### 新增(Added)
291
+ - **`fhcode doctor` 环境自检命令**:一键检查 Node 版本 / git 可用性 / 模型 provider 配置 / 网络连通 / 主目录可写,全部通过输出 ✅、异常项以 ⚠️ 列明,帮助快速定位接入问题;中英文双语词条与帮助文本同步。
292
+ - **模型性能统计自动落盘**:`ModelRouter` 新增 `statsHomeDir`(`fromConfig` 自动注入 `cfg.app.homeDir`),`updateStat` 更新后自动 `saveStats`,`model-stats` 命令从"永远读空"变为真正可用。
293
+
294
+ ### 修复(Fixed)
295
+ - **ModelRouter 失败统计空条目**:失败时 `model=''` 会污染统计报表与成功率加权,改用 provider 配置的模型名;`score()` 统计查找与键控统一为 providerId+model。
296
+ - **`~` 路径展开**(Windows):`expandHome` 改用 `os.homedir()`(原 `process.env.HOME` 在 Windows 常缺失);`FH_LOG_DIR` 新增 `expandTilde()` 展开(`.env.example` 推荐写法此前失效)。
297
+ - **版本号漂移**:`config.ts` 硬编码 `APP_VERSION='0.3.1'` 与 CLI v0.3.3 不一致,统一从 `cli/version.ts` 单一来源导入。
298
+ - **延迟统计污染**:`startTime` 在 fallback 循环外取值会把前序 provider 失败耗时计入成功方,移入每次尝试内。
299
+ - **REPL 交互**:Ctrl+D 中断与斜杠命令支持(`/plan` `/grill` `/goal`),退出更自然。
300
+ - **`as any` 清零**:`logRecoveryAttempt` 以 `Pick<EventLog,'append'>` 结构化类型替代 `as any`;`self-heal.attempt` 补入 `EventType` 联合。
301
+
302
+ ### 优化(Changed)
303
+ - **审计写锁指数退避**:`withAuditLock` 固定 10ms 轮询改为 10ms→200ms 指数退避(锁清理后重置),降低锁竞争下 CPU 空转;`SharedArrayBuffer` 提升为模块级复用。
304
+ - **路径统一**:`runModelStats`/`runExperiences` 硬编码 `~/.feihong-code` 改用 `resolveHomeDir()`(尊重 `FH_HOME`),删除 `require('os')` 运行时 require。
305
+ - **验证套件接线**:`npm run verify` 补全 m6/m7/m8/m9(此前只跑 m4),一键全量回归。
306
+
307
+ ### 测试(Tests)
308
+ - 新增 3 个测试文件、17 个用例:`model-router.test.ts`(统计聚合/落盘往返/fallback)、`audit.test.ts`(哈希链/篡改检测/跨实例续链/脱敏)、`web-auth.test.ts`(fail-closed 鉴权)。
309
+ - `npm test` **68/68** ✅
310
+
311
+ ### 校验(Verified)
312
+ - typecheck ✅ · build ✅ · doctor 冒烟 ✅(环境全绿)
313
+ - verify:m4 41/41 · m6 29/29 · m7 12/12 · m8 27/27 · m9 25/25 ✅
314
+
315
+ ## [0.3.3] — 2026-08-16(代码复杂度治理 + 双语收尾)
316
+
317
+ > 用 TS AST 圈复杂度扫描(`scripts/complexity.cjs`)量化热点,针对性重构最高复杂度的函数,不改动任何对外行为。同时把上一轮已完成的 v0.3.2 中英文双语界面一并随本次提交收尾上线。
318
+
319
+ ### 优化(Changed · 复杂度治理)
320
+ - **`cli/commands.parseArgs`**:~50 个 if 分支的参数解析改为 `FLAG_SPECS` 规格表 + `applyFlag()` 统一分发;~18 个管理命令 if 链改为 `MANAGE_BUILDERS` 分发表;抽出 `buildSweCommand()`。圈复杂度 **73 → 13**,函数长度 142 → 44 行。
321
+ - **`agent/self-heal.classifyError`**:6 类错误长 if 链改为声明式 `ERROR_RULES` 规则表。圈复杂度 **41 → <10**。
322
+ - **`agent/repo-reader.readRepository`**:内部嵌套 BFS `walk` 提到模块级 `walkRepository()`;抽出 `detectTestBuild()`(package.json 优先 + Python/Go/Rust 兜底)。圈复杂度 **39 → 10**,行数 174 → 77。
323
+ - **`agent/orchestrator.run`**:抽出 `recordTouchedFiles()` / `executeToolRound()` / `handleRecovery()`(自愈密集分支用判别返回值 `{signal}` 承载原 `break/continue` 控制流,零行为变更)。圈复杂度 **39 → 28**。
324
+ - **`cli/index.main`**:抽出 `dispatchSkill()` / `dispatchManage()`(`switch(m.kind)` 派发,判别联合自动收窄字段,类型安全)。圈复杂度 **30 → <10**。
325
+
326
+ ### 新增(Added)
327
+ - **复杂度量化工具**:`scripts/complexity.cjs`(基于 TS 编译器 API 的圈复杂度 + 函数长度扫描,输出 `cc≥10 || 行数≥80` 热点榜),可随时复测。
328
+
329
+ ### 校验(Verified)
330
+ - typecheck ✅ · build ✅
331
+ - `npm test` **51/51** ✅ 无回归
332
+ - parseArgs 9 组用例输出与原实现逐字节一致;readRepository 扫真实仓库验证遍历/测试命令探测正确
333
+ - 原 Top 5 热点(parseArgs 73 / classifyError 41 / orchestrator.run 39 / readRepository 39 / main 30)**全部降级**
334
+
335
+ ## [0.3.2] — 2026-08-15(中英文双语界面升级)
336
+
337
+ > 全量国际化(i18n):CLI 与 Web 控制台界面支持中文/英文一键切换,默认按系统 locale 自动检测,可用 `--lang zh|en` 或环境变量 `FHCODE_LANG` 强制指定。新增 `src/shared/i18n.ts` 双语词库与 `t()` 插值函数,覆盖 banner/help/REPL/全部子命令输出/企业身份与策略渲染/质量门禁报告。Web 控制台由占位页升级为真正的双语仪表盘(含语言切换按钮,前端直接拉取免鉴权的 `/api/health`)。
338
+
339
+ ### 新增(Added)
340
+ - **i18n 基础设施**:`src/shared/i18n.ts` 提供 `zh`/`en` 双语词库、`t(key, params?)` 插值、`detectLang()`(FHCODE_LANG > 系统 locale)、`setLang/getLang` 运行时切换。
341
+ - **CLI 双语**:`--lang zh|en` 参数;banner/help/异常/REPL/全部 run 命令(sessions/resume/diff/rollback/whoami/policy/audit/tenants/model-stats/experiences/serve/code-write/quality-gate/self-improve/swe/审批器)输出可切换。
342
+ - **企业命令与质量门禁双语**:`renderWhoami`/`renderPolicy` 与质量门禁报告接入 `t()`。
343
+ - **Web 双语仪表盘**:`src/web/public/index.html` 真正的观测页,含中英文切换(?lang / localStorage / 浏览器语言 / 服务端 lang 四级回退);`/api/health` 新增 `lang` 字段并改为免鉴权公开端点。
344
+
345
+ ### 校验(Verified)
346
+ - typecheck ✅ · build ✅
347
+
348
+ ## [0.3.1] — 2026-08-15(自我迭代系统 / 写代码能力 宇宙级升级)
349
+
350
+ > 把"自我迭代"从断环变成闭环:经验库升级为强化学习式(稳定 id + upsert 去重加权),反思器真正分析对话并写入与 orchestrator **共用**的同一经验库(此前孤岛目录互不回流),让既往任务的成功/失败/自愈经验真正注入后续任务。同时修复 code-writer 两处真实 bug(通配正则整体覆盖文件、空规则导致审查失效)。
351
+
352
+ ### 修复(Fixed · 真实 bug)
353
+ - **code-writer `fix()` 灾难性修复**:原 `issueToFix` 默认分支用 `pattern: /.*/` 会把**整个文件替换成建议文本**,造成数据破坏。改为仅对「硬编码密钥 / SQL 拼接」等已知安全模式做针对性替换,其余一律跳过并提示人工处理。
354
+ - **code-writer 审查/修复失效**:构造时 `rules` 默认 `[]` 被透传给 `reviewCode`,使默认审查规则不生效(默认参数仅 `undefined` 时触发)。改为规则为空时回落默认规则。
355
+ - **reviewCode 跨行误判**:规则正则带 `g` 标志导致 `RegExp.test()` 的 `lastIndex` 跨行残留,后续行误判为无问题。每次匹配前重置 `lastIndex`。
356
+
357
+ ### 优化(Changed · 自我迭代闭环)
358
+ - **经验系统强化学习化**(experience.ts):新增 `upsertExperience`(同 id 合并、sessionCount 累积、成功率加权平均、标签合并)、`retrieveRelevantExperiences`(标签重叠 + 新鲜度 + 成功率加权召回)、`extractFixPattern`(从自愈成功会话提取可复用修复经验);`extractExperience` 改用 `classifyError` 精确错误分类并生成稳定 id。
359
+ - **反思器打通回流**(self-improver.ts):`reflect` 基于真实对话统计工具调用/错误簇/自愈恢复,产出具体模式与改进,并以 `upsertExperience` 写入与 orchestrator 共用目录(默认 `~/.feihong-code/experiences`),新增 `getLearnedPrompt(goal)` 召回既往学习。
360
+ - **orchestrator 闭环**:加载改用加权检索并注入 system prompt;提取改用 `upsert` 强化;`selfHealed` 成功时额外固化修复经验;修正 usage 统计更新的是"被加载并使用的经验"。
361
+ - **错误分类中英双语**(self-heal.ts):`classifyError` 新增中文关键词识别(路径/权限/超时/编译/未定义等),对中文工具输出分类更准确。
362
+
363
+ ### 新增(Added)
364
+ - **self-improve 命令增强**:展示经验库规模/Top 经验/反思记录,并预览"将注入模型的学习提示",可直观看到自我迭代积累。
365
+ - **测试扩充**:`tests/unit/self-learn.test.ts`(6 例:upsert 合并/加权召回/稳定 id/修复经验提取/反思回流)、`tests/unit/code-writer.test.ts`(3 例:安全修复不破坏文件/空规则跳过/自愈收敛)。
366
+
367
+ ### 校验(Verified)
368
+ - typecheck ✅ · build ✅ · `npm test` 51/51 ✅
369
+ - verify:m4 41/41 · m6 29/29 · m7 12/12 · m8 27/27 · m9 25/25 · m9-real 11/11 ✅ 全部 100% 通过
370
+
371
+ ## [0.3.0] — 2026-08-15(宇宙能量级复盘优化 · GitHub + npm 上线准备)
372
+
373
+ > 全面复盘查漏补缺后的收口版本:修复版本链路不一致、修复命令无输出、扩充核心模块单元测试到 42 例、补齐 GitHub 社区健康文件与 npm 发布白名单,为 GitHub 升级与 npm 首发做完整准备。
374
+
375
+ ### 修复(Fixed)
376
+ - **版本号全链路一致性**:`package.json` 0.2.3 与 `src/cli/version.ts`、`src/shared/config.ts` 的 `0.2.1` 不一致,统一升级到 `0.3.0`(运行时 / 包 / 配置三方一致)。
377
+ - **`model-stats` / `experiences` 命令无输出**:`runModelStats` / `runExperiences` 未导入 `index.ts` 调用,现已补全,命令正常输出(空状态给出友好提示,执行任务后自动累积数据)。
378
+
379
+ ### 优化(Changed)
380
+ - **GitHub 仓库指向**:`package.json` 的 `repository` / `bugs` 由 GitCode 镜像切回 GitHub 主仓(`wch887292/feihong-code`),README 同步修正迁移说明与社区板块(二维码改为官网链接,避免失效资源)。
381
+ - **GitHub 仓库元数据升级**:通过 API 更新仓库描述为 `v0.3.0` 并突出 npm 可装 / MIT 开源;Topics 补充至 19 个合规标签。
382
+
383
+ ### 新增(Added)
384
+ - **单元测试扩充**:新增 `tests/unit/experience.test.ts`(9 例,覆盖经验提取/持久化/加载/排序/注入)、`tests/unit/orchestrator.test.ts`(6 例,覆盖 ReAct 循环/工具执行/成本熔断/迭代上限/检查点恢复/经验提取),单元测试总量 42 例。
385
+ - **GitHub 社区健康文件**:新增 `.github/FUNDING.yml`(Sponsor 按钮)、`.github/dependabot.yml`(每周依赖与安全自动化更新)。
386
+ - **本地部署调试指南**:`DEPLOYMENT-GUIDE.md`(安装 / 配置模板 / 调试命令 / 故障排查)。
387
+ - **npm 上线预检清单**:`NPM-RELEASE.md`(发布前自动校验、包字段核对、发布流程、回滚预案)。
388
+
389
+ ### 校验(Verified)
390
+ - TypeScript 零错误(tsc --noEmit);`npm test` 42/42;`verify:m4` 41/41;`verify:m6` 29/29;`verify:m7` 12/12;`verify:m8` 27/27;`verify:m9` 25/25;`verify:m9-real` 11/11;全部 100% 通过。
391
+ - `npm run build` 成功,`npm pack --dry-run` 白名单校验通过(无 `.env`/`src`/`policy.json`/`node_modules` 泄露),运行时显示 `fhcode v0.3.0`,署名信息完整。
392
+
393
+ ## [0.2.3] — 2026-08-12(npm 可见度优化)
394
+
395
+ > 扩充 `package.json` 关键词 / 描述、README 增加 npm 徽章、对比表与一键安装 CTA,`feihong-cli` 别名包同源发布(bin 同为 `fhcode`)。
396
+
5
397
  ## [0.2.1] — 2026-08-11(M9.1 真实模型接入与实测调优)
6
398
 
7
399
  > 让 `swe` 与常规命令可一键接入真实模型,并以 mock HTTP 服务实测"真实 provider 全链路"。
@@ -1,56 +1,56 @@
1
- # 行为准则
2
-
3
- ## 我们的承诺
4
-
5
- 为了营造一个开放和友好的环境,我们作为贡献者和维护者承诺:
6
-
7
- - 不受性别、种族、民族、性取向、性别认同、残疾、外貌、体型、年龄、宗教或国籍的影响
8
- - 以尊重和包容的态度对待每一位参与者
9
- - 致力于创造一个无骚扰的环境
10
-
11
- ## 我们的标准
12
-
13
- **促进积极互动的行为:**
14
- - 使用友好和包容的语言
15
- - 尊重不同的观点和经历
16
- - 虚心接受建设性反馈
17
- - 关注社区的整体利益
18
- - 对同类表现出同理心
19
-
20
- **不可接受的行为:**
21
- - 使用性化的语言或图像,以及任何形式的性关注或挑逗
22
- - 恶意的评论、侮辱性的贬低攻击或个人/政治攻击
23
- - 公开或私下的骚扰
24
- - 未经明确许可发布他人的私人信息,如物理或电子邮件地址
25
- - 其他在专业场所被认为不恰当的行为
26
-
27
- ## 执行责任
28
-
29
- 社区领导者负责澄清和执行我们接受的行为标准,并将根据以下原则采取适当和公平的纠正措施:
30
-
31
- 1. 以建设性的方式提供纠正性反馈
32
- 2. 移除、编辑或不接受违反本行为准则的评论、提交、代码、问题和其他贡献
33
- 3. 暂时或永久禁止任何被视为不合适、威胁、冒犯或有害的行为
34
-
35
- ## 范围
36
-
37
- 本行为准则适用于:
38
- - 项目空间和公共空间,当个人正式代表项目或其社区时
39
- - 代表项目的官方电子邮件、社交媒体账户或在线活动中
40
-
41
- ## 报告
42
-
43
- 如目睹或遭受不法行为,请通过以下方式联系项目负责人:
44
-
45
- - **GitHub Issues**: https://github.com/wch887292/feihong-code/issues
46
- - **邮件**: wch887292@gmail.com
47
-
48
- 所有投诉将被认真、及时地审查和调查。
49
-
50
- ## attribution
51
-
52
- 本行为准则改编自 [Contributor Covenant](https://www.contributor-covenant.org),版本 2.1。
53
-
54
- ---
55
-
56
- **晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹**
1
+ # 行为准则
2
+
3
+ ## 我们的承诺
4
+
5
+ 为了营造一个开放和友好的环境,我们作为贡献者和维护者承诺:
6
+
7
+ - 不受性别、种族、民族、性取向、性别认同、残疾、外貌、体型、年龄、宗教或国籍的影响
8
+ - 以尊重和包容的态度对待每一位参与者
9
+ - 致力于创造一个无骚扰的环境
10
+
11
+ ## 我们的标准
12
+
13
+ **促进积极互动的行为:**
14
+ - 使用友好和包容的语言
15
+ - 尊重不同的观点和经历
16
+ - 虚心接受建设性反馈
17
+ - 关注社区的整体利益
18
+ - 对同类表现出同理心
19
+
20
+ **不可接受的行为:**
21
+ - 使用性化的语言或图像,以及任何形式的性关注或挑逗
22
+ - 恶意的评论、侮辱性的贬低攻击或个人/政治攻击
23
+ - 公开或私下的骚扰
24
+ - 未经明确许可发布他人的私人信息,如物理或电子邮件地址
25
+ - 其他在专业场所被认为不恰当的行为
26
+
27
+ ## 执行责任
28
+
29
+ 社区领导者负责澄清和执行我们接受的行为标准,并将根据以下原则采取适当和公平的纠正措施:
30
+
31
+ 1. 以建设性的方式提供纠正性反馈
32
+ 2. 移除、编辑或不接受违反本行为准则的评论、提交、代码、问题和其他贡献
33
+ 3. 暂时或永久禁止任何被视为不合适、威胁、冒犯或有害的行为
34
+
35
+ ## 范围
36
+
37
+ 本行为准则适用于:
38
+ - 项目空间和公共空间,当个人正式代表项目或其社区时
39
+ - 代表项目的官方电子邮件、社交媒体账户或在线活动中
40
+
41
+ ## 报告
42
+
43
+ 如目睹或遭受不法行为,请通过以下方式联系项目负责人:
44
+
45
+ - **GitHub Issues**: https://github.com/wch887292/feihong-code/issues
46
+ - **邮件**: wch887292@gmail.com
47
+
48
+ 所有投诉将被认真、及时地审查和调查。
49
+
50
+ ## attribution
51
+
52
+ 本行为准则改编自 [Contributor Covenant](https://www.contributor-covenant.org),版本 2.1。
53
+
54
+ ---
55
+
56
+ **晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹**