feihong-code 7.5.0 → 8.0.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 (367) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +36 -22
  2. package/.github/ISSUE_TEMPLATE/config.yml +10 -13
  3. package/.github/ISSUE_TEMPLATE/feature_request.md +38 -13
  4. package/.github/PULL_REQUEST_TEMPLATE.md +65 -30
  5. package/.github/workflows/ci.yml +193 -180
  6. package/.github/workflows/release.yml +203 -200
  7. package/.github/workflows/swebench-real.yml +84 -0
  8. package/CHANGELOG.md +117 -94
  9. package/CONTRIBUTING.md +61 -5
  10. package/README.md +636 -609
  11. package/README.self-evolve.md +279 -274
  12. package/dist/agent/change-manager.js +1 -1
  13. package/dist/agent/code-rag.js +1 -1
  14. package/dist/agent/code-review.js +1 -1
  15. package/dist/agent/code-writer.js +1 -1
  16. package/dist/agent/completion-postprocess.js +1 -1
  17. package/dist/agent/context-compactor.js +11 -0
  18. package/dist/agent/context-compactor.js.map +1 -1
  19. package/dist/agent/custom-agent.js +52 -52
  20. package/dist/agent/design-to-code.js +40 -40
  21. package/dist/agent/experience.js +1 -1
  22. package/dist/agent/layered-memory.js +1 -1
  23. package/dist/agent/lint.js +1 -1
  24. package/dist/agent/multi-agent.js +44 -44
  25. package/dist/agent/orchestrator.js +93 -18
  26. package/dist/agent/orchestrator.js.map +1 -1
  27. package/dist/agent/parallel-orchestrator.js +1 -1
  28. package/dist/agent/planner.js +8 -3
  29. package/dist/agent/planner.js.map +1 -1
  30. package/dist/agent/prompts.js +2 -2
  31. package/dist/agent/quality-gate.js +1 -1
  32. package/dist/agent/repo-context.js +1 -1
  33. package/dist/agent/repo-reader.js +1 -1
  34. package/dist/agent/repo-underwriter.js +1 -1
  35. package/dist/agent/self-correction.js +1 -1
  36. package/dist/agent/self-heal.js +5 -0
  37. package/dist/agent/self-heal.js.map +1 -1
  38. package/dist/agent/self-improver.js +1 -1
  39. package/dist/agent/subagent-summary.js +1 -1
  40. package/dist/agent/subagent.js +1 -1
  41. package/dist/agent/swe-agent.js +1 -1
  42. package/dist/agent/swe-verifier.js +1 -1
  43. package/dist/agent/symbol-index.js +1 -1
  44. package/dist/agent/team.js +1 -1
  45. package/dist/agent/type-checker.js +1 -1
  46. package/dist/cli/commands.js +7 -0
  47. package/dist/cli/commands.js.map +1 -1
  48. package/dist/cli/index.js +57 -2
  49. package/dist/cli/index.js.map +1 -1
  50. package/dist/cli/repl.js +1 -1
  51. package/dist/cli/run.js +40 -3
  52. package/dist/cli/run.js.map +1 -1
  53. package/dist/cli/self-evolve-cli.js +168 -0
  54. package/dist/cli/tui-run.js +1 -1
  55. package/dist/cli/tui.js +1 -1
  56. package/dist/cli/version.js +3 -3
  57. package/dist/cli/version.js.map +1 -1
  58. package/dist/enterprise/audit.js +1 -1
  59. package/dist/enterprise/index.js +1 -1
  60. package/dist/enterprise/policy.js +1 -1
  61. package/dist/enterprise/quota.js +1 -1
  62. package/dist/enterprise/tenant.js +1 -1
  63. package/dist/harness/executor.js +1 -1
  64. package/dist/harness/index.js +1 -1
  65. package/dist/harness/loader.js +1 -1
  66. package/dist/harness/types.js +1 -1
  67. package/dist/harness/verifier.js +52 -12
  68. package/dist/harness/verifier.js.map +1 -1
  69. package/dist/hello.js +14 -0
  70. package/dist/hello.js.map +1 -0
  71. package/dist/integrations/feishu-bridge.js +348 -0
  72. package/dist/integrations/feishu-bridge.js.map +1 -0
  73. package/dist/integrations/github-mcp.js +137 -0
  74. package/dist/integrations/github-mcp.js.map +1 -0
  75. package/dist/integrations/wechat-bridge.js +499 -0
  76. package/dist/integrations/wechat-bridge.js.map +1 -0
  77. package/dist/integrations/yuanbao-bridge.js +326 -0
  78. package/dist/integrations/yuanbao-bridge.js.map +1 -0
  79. package/dist/lsp/lsp-client.js +1 -1
  80. package/dist/memory/honcho-store.js +231 -0
  81. package/dist/memory/honcho-store.js.map +1 -0
  82. package/dist/models/model-router.js +1 -1
  83. package/dist/models/model.dto.js +1 -1
  84. package/dist/models/providers/ollama.provider.js +1 -1
  85. package/dist/models/providers/openai-compatible.provider.js +1 -1
  86. package/dist/plugins/plugin-loader.js +1 -1
  87. package/dist/runtime/event-log.js +1 -1
  88. package/dist/runtime/git.js +1 -1
  89. package/dist/runtime/hooks.js +71 -4
  90. package/dist/runtime/hooks.js.map +1 -1
  91. package/dist/runtime/session-persist.js +1 -1
  92. package/dist/runtime/worktree.js +1 -1
  93. package/dist/self-evolve/hook.ts +80 -0
  94. package/dist/self-evolve/manager.d.ts +8 -0
  95. package/dist/self-evolve/manager.js +517 -401
  96. package/dist/self-evolve/self-heal-scheduler.js +160 -0
  97. package/dist/self-evolve/self-heal-scheduler.js.map +1 -0
  98. package/dist/shared/concurrency.js +1 -1
  99. package/dist/shared/config.js +4 -2
  100. package/dist/shared/config.js.map +1 -1
  101. package/dist/shared/errors.js +1 -1
  102. package/dist/shared/i18n.js +1 -1
  103. package/dist/shared/i18n.js.map +1 -1
  104. package/dist/shared/log-rotator.js +238 -0
  105. package/dist/shared/log-rotator.js.map +1 -0
  106. package/dist/shared/secure-store.js +12 -5
  107. package/dist/shared/secure-store.js.map +1 -1
  108. package/dist/shared/sqlite-store.js +512 -0
  109. package/dist/shared/sqlite-store.js.map +1 -0
  110. package/dist/shared/types.js +1 -1
  111. package/dist/skills/goal.js +1 -1
  112. package/dist/skills/grill.js +1 -1
  113. package/dist/skills/plan.js +1 -1
  114. package/dist/skills/pua-hooks.js +273 -0
  115. package/dist/skills/pua-hooks.js.map +1 -0
  116. package/dist/skills/self-heal.js +9 -3
  117. package/dist/skills/self-heal.js.map +1 -1
  118. package/dist/skills/skill-loader.js +1 -1
  119. package/dist/skills/skill-market.js +84 -8
  120. package/dist/skills/skill-market.js.map +1 -1
  121. package/dist/tools/analysis/code-analyzer.js +1 -1
  122. package/dist/tools/docker-sandbox.js +212 -0
  123. package/dist/tools/docker-sandbox.js.map +1 -0
  124. package/dist/tools/file/edit.tool.js +18 -3
  125. package/dist/tools/file/edit.tool.js.map +1 -1
  126. package/dist/tools/file/list.tool.js +1 -1
  127. package/dist/tools/file/read.tool.js +1 -1
  128. package/dist/tools/file/write.tool.js +1 -1
  129. package/dist/tools/generator/code-generator.js +1 -1
  130. package/dist/tools/generator/test-generator.js +1 -1
  131. package/dist/tools/index.js +1 -1
  132. package/dist/tools/mcp/index.js +1 -1
  133. package/dist/tools/mcp/mcp-client.js +1 -1
  134. package/dist/tools/safe-path.js +1 -1
  135. package/dist/tools/search/grep.tool.js +1 -1
  136. package/dist/tools/shell/exec.js +1 -1
  137. package/dist/tools/shell/run-shell.tool.js +1 -1
  138. package/dist/tools/skills/load-skill.tool.js +1 -1
  139. package/dist/tools/tool.registry.js +10 -1
  140. package/dist/tools/tool.registry.js.map +1 -1
  141. package/dist/tools/verify/build-check.tool.js +1 -1
  142. package/dist/tools/verify/test-run.tool.js +1 -1
  143. package/dist/tools/web/web.tool.js +1 -1
  144. package/dist/voice/voice-programming.js +32 -6
  145. package/dist/voice/voice-programming.js.map +1 -1
  146. package/dist/web/auth.js +34 -2
  147. package/dist/web/auth.js.map +1 -1
  148. package/dist/web/channels.js +1 -1
  149. package/dist/web/public/css/style.css +1751 -1724
  150. package/dist/web/public/favicon.svg +11 -0
  151. package/dist/web/public/index.html +1246 -1242
  152. package/dist/web/public/js/api.js +558 -555
  153. package/dist/web/public/js/app.js +2233 -2210
  154. package/dist/web/public/js/mock-api.js +259 -234
  155. package/dist/web/public/js/monaco-editor.js +363 -363
  156. package/dist/web/public/js/ui.js +2217 -2251
  157. package/dist/web/public/js/utils.js +214 -214
  158. package/dist/web/public/manifest.json +59 -59
  159. package/dist/web/public/robots.txt +14 -0
  160. package/dist/web/public/service-worker.js +149 -173
  161. package/dist/web/public/vendor/monaco/vs/abap-D-t0cyap.js +1 -0
  162. package/dist/web/public/vendor/monaco/vs/apex-CcIm7xu6.js +1 -0
  163. package/dist/web/public/vendor/monaco/vs/assets/css.worker-URu8fCFR.js +97 -0
  164. package/dist/web/public/vendor/monaco/vs/assets/editor.worker-lj3bdIIn.js +30 -0
  165. package/dist/web/public/vendor/monaco/vs/assets/editorWebWorkerMain-CA_vMoUU.js +30 -0
  166. package/dist/web/public/vendor/monaco/vs/assets/html.worker-D1SL3iM8.js +474 -0
  167. package/dist/web/public/vendor/monaco/vs/assets/json.worker-CoJx_OPf.js +62 -0
  168. package/dist/web/public/vendor/monaco/vs/assets/ts.worker-BWKtMYOk.js +67722 -0
  169. package/dist/web/public/vendor/monaco/vs/azcli-BA0tQDCg.js +1 -0
  170. package/dist/web/public/vendor/monaco/vs/basic-languages/monaco.contribution.js +1 -0
  171. package/dist/web/public/vendor/monaco/vs/bat-C397hTD6.js +1 -0
  172. package/dist/web/public/vendor/monaco/vs/bicep-DF5aW17k.js +2 -0
  173. package/dist/web/public/vendor/monaco/vs/cameligo-plsz8qhj.js +1 -0
  174. package/dist/web/public/vendor/monaco/vs/clojure-Y2auQMzK.js +1 -0
  175. package/dist/web/public/vendor/monaco/vs/coffee-Bu45yuWE.js +1 -0
  176. package/dist/web/public/vendor/monaco/vs/cpp-CkKPQIni.js +1 -0
  177. package/dist/web/public/vendor/monaco/vs/csharp-CX28MZyh.js +1 -0
  178. package/dist/web/public/vendor/monaco/vs/csp-D8uWnyxW.js +1 -0
  179. package/dist/web/public/vendor/monaco/vs/css-CaeNmE3S.js +3 -0
  180. package/dist/web/public/vendor/monaco/vs/css.worker-CyhWkhHo.js +1 -0
  181. package/dist/web/public/vendor/monaco/vs/cssMode-CV6Ay48H.js +1 -0
  182. package/dist/web/public/vendor/monaco/vs/cypher-DVThT8BS.js +1 -0
  183. package/dist/web/public/vendor/monaco/vs/dart-CmGfCvrO.js +1 -0
  184. package/dist/web/public/vendor/monaco/vs/dockerfile-CZqqYdch.js +1 -0
  185. package/dist/web/public/vendor/monaco/vs/ecl-30fUercY.js +1 -0
  186. package/dist/web/public/vendor/monaco/vs/editor/editor.main.css +1 -0
  187. package/dist/web/public/vendor/monaco/vs/editor/editor.main.js +1 -0
  188. package/dist/web/public/vendor/monaco/vs/editor/editor.worker.js +1 -0
  189. package/dist/web/public/vendor/monaco/vs/editor-KLE6jdfb.js +831 -0
  190. package/dist/web/public/vendor/monaco/vs/editor.js +1 -0
  191. package/dist/web/public/vendor/monaco/vs/editorWorkerHost-fVE1cjcC.js +35 -0
  192. package/dist/web/public/vendor/monaco/vs/elixir-xjPaIfzF.js +1 -0
  193. package/dist/web/public/vendor/monaco/vs/flow9-DqtmStfK.js +1 -0
  194. package/dist/web/public/vendor/monaco/vs/freemarker2-FWreY7v7.js +3 -0
  195. package/dist/web/public/vendor/monaco/vs/fsharp-BOMdg4U1.js +1 -0
  196. package/dist/web/public/vendor/monaco/vs/go-D_hbi-Jt.js +1 -0
  197. package/dist/web/public/vendor/monaco/vs/graphql-CKUU4kLG.js +1 -0
  198. package/dist/web/public/vendor/monaco/vs/handlebars-CZi4pHCH.js +1 -0
  199. package/dist/web/public/vendor/monaco/vs/hcl-DTaboeZW.js +1 -0
  200. package/dist/web/public/vendor/monaco/vs/html-j_7ZTNRU.js +1 -0
  201. package/dist/web/public/vendor/monaco/vs/html.worker-CA3iAimZ.js +1 -0
  202. package/dist/web/public/vendor/monaco/vs/htmlMode-27by_KM4.js +1 -0
  203. package/dist/web/public/vendor/monaco/vs/index-049xrXrp.js +1 -0
  204. package/dist/web/public/vendor/monaco/vs/index-CBVt3dzv.js +5 -0
  205. package/dist/web/public/vendor/monaco/vs/index.js +1 -0
  206. package/dist/web/public/vendor/monaco/vs/ini-CsNwO04R.js +1 -0
  207. package/dist/web/public/vendor/monaco/vs/initialize-DL0l1TGY.js +1 -0
  208. package/dist/web/public/vendor/monaco/vs/java-CI4ZMsH9.js +1 -0
  209. package/dist/web/public/vendor/monaco/vs/javascript-DTJl4Jn1.js +1 -0
  210. package/dist/web/public/vendor/monaco/vs/json.worker-BizpAl9O.js +1 -0
  211. package/dist/web/public/vendor/monaco/vs/jsonMode-DLUiMUrI.js +1 -0
  212. package/dist/web/public/vendor/monaco/vs/julia-BwzEvaQw.js +1 -0
  213. package/dist/web/public/vendor/monaco/vs/kotlin-IUYPiTV8.js +1 -0
  214. package/dist/web/public/vendor/monaco/vs/language/css/css.worker.js +66 -0
  215. package/dist/web/public/vendor/monaco/vs/language/css/monaco.contribution.js +1 -0
  216. package/dist/web/public/vendor/monaco/vs/language/html/html.worker.js +443 -0
  217. package/dist/web/public/vendor/monaco/vs/language/html/monaco.contribution.js +1 -0
  218. package/dist/web/public/vendor/monaco/vs/language/json/json.worker.js +17 -0
  219. package/dist/web/public/vendor/monaco/vs/language/json/monaco.contribution.js +1 -0
  220. package/dist/web/public/vendor/monaco/vs/language/typescript/monaco.contribution.js +1 -0
  221. package/dist/web/public/vendor/monaco/vs/language/typescript/ts.worker.js +67693 -0
  222. package/dist/web/public/vendor/monaco/vs/less-C0eDYdqa.js +2 -0
  223. package/dist/web/public/vendor/monaco/vs/lexon-iON-Kj97.js +1 -0
  224. package/dist/web/public/vendor/monaco/vs/liquid-CLJYelW6.js +1 -0
  225. package/dist/web/public/vendor/monaco/vs/loader.js +1368 -0
  226. package/dist/web/public/vendor/monaco/vs/lspLanguageFeatures-BIkJOWLw.js +2 -0
  227. package/dist/web/public/vendor/monaco/vs/lua-DtygF91M.js +1 -0
  228. package/dist/web/public/vendor/monaco/vs/m3-CsR4AuFi.js +1 -0
  229. package/dist/web/public/vendor/monaco/vs/main-BEx-Fmlo.js +15 -0
  230. package/dist/web/public/vendor/monaco/vs/main-DsK8pnKg.js +3 -0
  231. package/dist/web/public/vendor/monaco/vs/markdown-C_rD0bIw.js +1 -0
  232. package/dist/web/public/vendor/monaco/vs/mdx-CpzZIPHF.js +1 -0
  233. package/dist/web/public/vendor/monaco/vs/mips-CiYP61RB.js +1 -0
  234. package/dist/web/public/vendor/monaco/vs/monaco.contribution-9cKT3C7t.js +1 -0
  235. package/dist/web/public/vendor/monaco/vs/monaco.contribution-BE88ZNGY.js +1 -0
  236. package/dist/web/public/vendor/monaco/vs/monaco.contribution-BPhsneLd.js +1 -0
  237. package/dist/web/public/vendor/monaco/vs/monaco.contribution-BgRy6xDf.js +1 -0
  238. package/dist/web/public/vendor/monaco/vs/msdax-C38-sJlp.js +1 -0
  239. package/dist/web/public/vendor/monaco/vs/mysql-CdtbpvbG.js +1 -0
  240. package/dist/web/public/vendor/monaco/vs/nls/lang/cs.d.ts +1 -0
  241. package/dist/web/public/vendor/monaco/vs/nls/lang/cs.js +9 -0
  242. package/dist/web/public/vendor/monaco/vs/nls/lang/de.d.ts +1 -0
  243. package/dist/web/public/vendor/monaco/vs/nls/lang/de.js +9 -0
  244. package/dist/web/public/vendor/monaco/vs/nls/lang/es.d.ts +1 -0
  245. package/dist/web/public/vendor/monaco/vs/nls/lang/es.js +9 -0
  246. package/dist/web/public/vendor/monaco/vs/nls/lang/fr.d.ts +1 -0
  247. package/dist/web/public/vendor/monaco/vs/nls/lang/fr.js +9 -0
  248. package/dist/web/public/vendor/monaco/vs/nls/lang/it.d.ts +1 -0
  249. package/dist/web/public/vendor/monaco/vs/nls/lang/it.js +9 -0
  250. package/dist/web/public/vendor/monaco/vs/nls/lang/ja.d.ts +1 -0
  251. package/dist/web/public/vendor/monaco/vs/nls/lang/ja.js +9 -0
  252. package/dist/web/public/vendor/monaco/vs/nls/lang/ko.d.ts +1 -0
  253. package/dist/web/public/vendor/monaco/vs/nls/lang/ko.js +9 -0
  254. package/dist/web/public/vendor/monaco/vs/nls/lang/pl.d.ts +1 -0
  255. package/dist/web/public/vendor/monaco/vs/nls/lang/pl.js +9 -0
  256. package/dist/web/public/vendor/monaco/vs/nls/lang/pt-br.d.ts +1 -0
  257. package/dist/web/public/vendor/monaco/vs/nls/lang/pt-br.js +9 -0
  258. package/dist/web/public/vendor/monaco/vs/nls/lang/ru.d.ts +1 -0
  259. package/dist/web/public/vendor/monaco/vs/nls/lang/ru.js +9 -0
  260. package/dist/web/public/vendor/monaco/vs/nls/lang/tr.d.ts +1 -0
  261. package/dist/web/public/vendor/monaco/vs/nls/lang/tr.js +9 -0
  262. package/dist/web/public/vendor/monaco/vs/nls/lang/zh-cn.d.ts +1 -0
  263. package/dist/web/public/vendor/monaco/vs/nls/lang/zh-cn.js +9 -0
  264. package/dist/web/public/vendor/monaco/vs/nls/lang/zh-tw.d.ts +1 -0
  265. package/dist/web/public/vendor/monaco/vs/nls/lang/zh-tw.js +9 -0
  266. package/dist/web/public/vendor/monaco/vs/nls.messages-loader.js +1 -0
  267. package/dist/web/public/vendor/monaco/vs/objective-c-CntZFaHX.js +1 -0
  268. package/dist/web/public/vendor/monaco/vs/pascal-r6kuqfl_.js +1 -0
  269. package/dist/web/public/vendor/monaco/vs/pascaligo-BiXoTmXh.js +1 -0
  270. package/dist/web/public/vendor/monaco/vs/perl-DABw_TcH.js +1 -0
  271. package/dist/web/public/vendor/monaco/vs/pgsql-me_jFXeX.js +1 -0
  272. package/dist/web/public/vendor/monaco/vs/php-D_kh-9LK.js +1 -0
  273. package/dist/web/public/vendor/monaco/vs/pla-VfZjczW0.js +1 -0
  274. package/dist/web/public/vendor/monaco/vs/postiats-BBSzz8Pk.js +1 -0
  275. package/dist/web/public/vendor/monaco/vs/powerquery-Dt-g_2cc.js +1 -0
  276. package/dist/web/public/vendor/monaco/vs/powershell-B-7ap1zc.js +1 -0
  277. package/dist/web/public/vendor/monaco/vs/protobuf-BmtuEB1A.js +2 -0
  278. package/dist/web/public/vendor/monaco/vs/pug-BRpRNeEb.js +1 -0
  279. package/dist/web/public/vendor/monaco/vs/python-CqWUUgfu.js +1 -0
  280. package/dist/web/public/vendor/monaco/vs/qsharp-BzsFaUU9.js +1 -0
  281. package/dist/web/public/vendor/monaco/vs/r-f8dDdrp4.js +1 -0
  282. package/dist/web/public/vendor/monaco/vs/razor-hok5y9Km.js +1 -0
  283. package/dist/web/public/vendor/monaco/vs/redis-fvZQY4PI.js +1 -0
  284. package/dist/web/public/vendor/monaco/vs/redshift-45Et0LQi.js +1 -0
  285. package/dist/web/public/vendor/monaco/vs/restructuredtext-C7UUFKFD.js +1 -0
  286. package/dist/web/public/vendor/monaco/vs/ruby-CZO8zYTz.js +1 -0
  287. package/dist/web/public/vendor/monaco/vs/rust-Bfetafyc.js +1 -0
  288. package/dist/web/public/vendor/monaco/vs/sb-3GYllVck.js +1 -0
  289. package/dist/web/public/vendor/monaco/vs/scala-foMgrKo1.js +1 -0
  290. package/dist/web/public/vendor/monaco/vs/scheme-CHdMtr7p.js +1 -0
  291. package/dist/web/public/vendor/monaco/vs/scss-C1cmLt9V.js +3 -0
  292. package/dist/web/public/vendor/monaco/vs/shell-ClXCKCEW.js +1 -0
  293. package/dist/web/public/vendor/monaco/vs/solidity-MZ6ExpPy.js +1 -0
  294. package/dist/web/public/vendor/monaco/vs/sophia-DWkuSsPQ.js +1 -0
  295. package/dist/web/public/vendor/monaco/vs/sparql-AUGFYSyk.js +1 -0
  296. package/dist/web/public/vendor/monaco/vs/sql-32GpJSV2.js +1 -0
  297. package/dist/web/public/vendor/monaco/vs/st-CuDFIVZ_.js +1 -0
  298. package/dist/web/public/vendor/monaco/vs/swift-t-PfMj7W.js +1 -0
  299. package/dist/web/public/vendor/monaco/vs/systemverilog-Ch4vA8Yt.js +1 -0
  300. package/dist/web/public/vendor/monaco/vs/tcl-D74tq1nH.js +1 -0
  301. package/dist/web/public/vendor/monaco/vs/toggleHighContrast-qGX7E9o7.js +61 -0
  302. package/dist/web/public/vendor/monaco/vs/ts.worker-2QLmBukE.js +1 -0
  303. package/dist/web/public/vendor/monaco/vs/tsMode-B0S_kp2q.js +11 -0
  304. package/dist/web/public/vendor/monaco/vs/twig-C6taOxMV.js +1 -0
  305. package/dist/web/public/vendor/monaco/vs/typescript-_2t_511t.js +1 -0
  306. package/dist/web/public/vendor/monaco/vs/typespec-8OfoLt6R.js +1 -0
  307. package/dist/web/public/vendor/monaco/vs/vb-Dyb2648j.js +1 -0
  308. package/dist/web/public/vendor/monaco/vs/wgsl-BhLXMOR0.js +298 -0
  309. package/dist/web/public/vendor/monaco/vs/workers-BBttULjf.js +1 -0
  310. package/dist/web/public/vendor/monaco/vs/xml-cZjNDqDT.js +1 -0
  311. package/dist/web/public/vendor/monaco/vs/yaml-A1fOIdH6.js +1 -0
  312. package/dist/web/server.js +151 -16
  313. package/dist/web/server.js.map +1 -1
  314. package/dist/web/task-queue.js +6 -21
  315. package/dist/web/task-queue.js.map +1 -1
  316. package/dist/web/web-config.js +143 -0
  317. package/dist/web/web-config.js.map +1 -0
  318. package/docs/API.md +827 -0
  319. package/docs/App/344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +1 -1
  320. package/docs/App/346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +1 -1
  321. package/docs/BENCHMARK_REPORT_en.md +386 -386
  322. package/docs/BENCHMARK_REPORT_zh.md +386 -386
  323. package/docs/DPA.md +65 -63
  324. 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 -67
  325. package/docs/Deployment_Guide_EN.md +1 -1
  326. package/docs/PROJECT-ANALYSIS-AND-TEST.md +721 -0
  327. package/docs/SECURITY_WHITEPAPER.md +2 -2
  328. package/docs/SELF-EVOLVE-GUIDE.md +1 -1
  329. package/docs/SWE_BENCH_REPORT.md +73 -55
  330. package/docs/TECHNICAL-SPECIFICATION.md +746 -0
  331. package/docs/TECHNICAL_SPEC_en.md +292 -292
  332. package/docs/TECHNICAL_SPEC_zh.md +292 -292
  333. package/docs/Technical_Manual_EN.md +1 -1
  334. package/docs/UPDATE_NOTES_en.md +159 -159
  335. package/docs/UPDATE_NOTES_zh.md +159 -159
  336. package/docs/UPGRADE-v7.9.0.md +291 -0
  337. package/docs/UPGRADE-v8.0.0.md +237 -0
  338. package/docs/UPGRADE_7.2.0.md +309 -309
  339. package/docs/UPGRADE_GUIDE_7_5.md +86 -86
  340. package/docs/UPGRADE_GUIDE_7_6.md +153 -0
  341. package/docs/User_Manual_EN.md +1 -1
  342. package/docs/VOLTAGENT_SKILLS_CATALOG.md +95 -0
  343. package/docs/error-codes.md +1 -1
  344. package/docs/geo-feihong-code.html +391 -391
  345. package/docs//344/272/247/345/223/201/345/274/200/345/217/221/346/226/207/346/241/243.md +5 -3
  346. package/docs//344/275/277/347/224/250/350/257/264/346/230/216/344/271/246-v8.0.0.md +922 -0
  347. package/docs//344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +140 -231
  348. 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 -208
  349. 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 -152
  350. 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 -271
  351. 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 -59
  352. package/docs//345/256/211/345/205/250/347/231/275/347/232/256/344/271/246_v7.2.0.md +84 -82
  353. package/docs//346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +240 -149
  354. package/docs//351/203/250/347/275/262/350/257/264/346/230/216/344/271/246.md +2 -2
  355. package/electron/main.js +404 -404
  356. package/package.json +12 -5
  357. package/templates/skills/api-design/SKILL.md +1 -1
  358. package/templates/skills/code-review/SKILL.md +1 -1
  359. package/templates/skills/dependency-upgrade/SKILL.md +1 -1
  360. package/templates/skills/doc-gen/SKILL.md +1 -1
  361. package/templates/skills/git-flow/SKILL.md +1 -1
  362. package/templates/skills/onboarding/SKILL.md +1 -1
  363. package/templates/skills/performance/SKILL.md +1 -1
  364. package/templates/skills/refactor/SKILL.md +1 -1
  365. package/templates/skills/security-audit/SKILL.md +1 -1
  366. package/templates/skills/test-gen/SKILL.md +1 -1
  367. package/tool-schema.json +197 -197
@@ -1,37 +1,51 @@
1
1
  ---
2
2
  name: Bug 报告
3
- about: 创建报告帮助我们改进
4
- title: '[Bug] '
5
- labels: 'bug'
3
+ about: 报告飞虹 Code 的缺陷或异常行为
4
+ title: "[Bug] "
5
+ labels: bug, needs-triage
6
6
  assignees: ''
7
7
  ---
8
8
 
9
- ## 环境信息
9
+ ## 缺陷描述
10
10
 
11
- - **操作系统**: (如 Windows 11 / macOS 14 / Ubuntu 22.04)
12
- - **Node.js 版本**: `node --version`
13
- - **fhcode 版本**: `fhcode --version`
14
- - **模型配置**: Ollama / DeepSeek / OpenAI / 其他
15
- - **CLI 模式**: 单命令 / --parallel / swe
11
+ <!-- 清晰简洁地描述这个 bug 是什么 -->
16
12
 
17
13
  ## 复现步骤
18
14
 
19
- 1. 执行命令: `fhcode "..."`
20
- 2. 输出或错误:
21
- ```
22
- (粘贴完整错误信息)
23
- ```
15
+ 1. 启动方式:<!-- `node dist/cli/index.js serve` / CLI / APP -->
16
+ 2. 操作步骤:
17
+ 1.
18
+ 2.
19
+ 3.
20
+ 3. 预期行为:<!-- 你期望发生什么 -->
21
+ 4. 实际行为:<!-- 实际发生了什么 -->
22
+
23
+ ## 环境信息
24
+
25
+ | 项目 | 值 |
26
+ |------|-----|
27
+ | 飞虹 Code 版本 | <!-- 如 v8.0.0,`fhcode --version` 或 /api/health --> |
28
+ | 操作系统 | <!-- 如 Windows 11 / macOS 14 / Ubuntu 22.04 --> |
29
+ | Node.js 版本 | <!-- `node --version` --> |
30
+ | 部署方式 | <!-- 本地 / Docker / 服务器 / 移动端 --> |
31
+ | 模型提供商 | <!-- 如 Agnes / DeepSeek / Ollama / 免密网络层 --> |
32
+ | Docker 版本(如使用沙盒) | <!-- `docker --version` --> |
33
+
34
+ ## 错误日志
24
35
 
25
- ## 预期行为
36
+ <!-- 粘贴相关的错误日志、终端输出或截图 -->
26
37
 
27
- (描述你期望看到什么)
38
+ ```
39
+ 在此粘贴日志
40
+ ```
28
41
 
29
- ## 实际行为
42
+ ## 附加信息
30
43
 
31
- (描述实际发生了什么)
44
+ <!-- 任何有助于定位问题的附加信息:配置文件(脱敏后)、复现频率、是否偶现等 -->
32
45
 
33
- ## 额外上下文
46
+ ## 自查清单
34
47
 
35
- - [ ] 我已在本地验证此 bug
36
- - [ ] 此问题可稳定复现
37
- - [ ] 相关截图或日志已附加
48
+ - [ ] 我已搜索现有 Issues,未发现重复报告
49
+ - [ ] 我已尝试升级到最新版本,问题仍然存在
50
+ - [ ] 我已提供完整的复现步骤和环境信息
51
+ - [ ] 日志中不包含 API Key、Token 等敏感信息(已脱敏)
@@ -1,14 +1,11 @@
1
- blank_issues_enabled: true
1
+ blank_issues_enabled: false
2
2
  contact_links:
3
- - name: 📚 文档与 FAQ
4
- url: https://github.com/wch887292/feihong-code/blob/master/docs/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E4%B8%8E%E6%95%85%E9%9A%9C%E6%8E%92%E6%9F%A5.md
5
- about: 查看常见问题与故障排查
6
- - name: 💬 讨论与交流
7
- url: https://github.com/wch887292/feihong-code/discussions
8
- about: 发起讨论、分享经验、寻求帮助
9
- - name: 🤝 贡献指南
10
- url: https://github.com/wch887292/feihong-code/blob/master/CONTRIBUTING.md
11
- about: 了解如何参与项目开发
12
- - name: 🔐 安全漏洞报告
13
- url: https://github.com/wch887292/feihong-code/blob/master/.github/SECURITY.md
14
- about: 发现安全问题,请通过安全渠道报告
3
+ - name: 文档与使用说明
4
+ url: https://github.com/feihong-code/feihong-code/blob/main/docs/使用说明书-v8.0.0.md
5
+ about: 先阅读详细使用说明书,常见问题可在故障排查章节找到答案
6
+ - name: 社区讨论
7
+ url: https://github.com/feihong-code/feihong-code/discussions
8
+ about: 一般性问题、使用交流、想法分享请到 Discussions
9
+ - name: 贡献指南
10
+ url: https://github.com/feihong-code/feihong-code/blob/main/CONTRIBUTING.md
11
+ about: 想贡献代码?先阅读贡献指南
@@ -1,28 +1,53 @@
1
1
  ---
2
2
  name: 功能请求
3
- about: 为这个项目提出想法
4
- title: '[Feature] '
5
- labels: 'enhancement'
3
+ about: 为飞虹 Code 提出新功能或改进建议
4
+ title: "[Feature] "
5
+ labels: enhancement, needs-triage
6
6
  assignees: ''
7
7
  ---
8
8
 
9
9
  ## 功能描述
10
10
 
11
- (清晰简洁地描述你希望增加的功能)
11
+ <!-- 清晰简洁地描述你希望添加的功能 -->
12
12
 
13
- ## 使用场景
13
+ ## 解决的问题
14
14
 
15
- (说明这个功能会解决什么问题,适用哪些场景)
15
+ <!-- 这个功能解决了什么问题?当前有什么痛点? -->
16
16
 
17
- ## 建议实现方案
17
+ ## 期望的解决方案
18
18
 
19
- (如有技术方案或参考实现,请提供)
19
+ <!-- 描述你期望的实现方式、交互流程或 API 设计 -->
20
20
 
21
- ## 备选方案
21
+ ### 建议的 API / 命令 / 界面
22
22
 
23
- (你考虑过哪些替代方案?)
23
+ <!-- 如果有具体的 API、CLI 命令或界面设计建议,请描述 -->
24
24
 
25
- ## 额外信息
25
+ ```
26
+ 示例代码或界面草图
27
+ ```
26
28
 
27
- - **关联问题**: #(如有)
28
- - **优先级**: 低 / 中 / 高
29
+ ## 替代方案
30
+
31
+ <!-- 你考虑过哪些替代方案?为什么选择当前方案? -->
32
+
33
+ ## 适用场景
34
+
35
+ <!-- 这个功能在什么场景下最有价值?目标用户是谁? -->
36
+
37
+ ## 优先级建议
38
+
39
+ - [ ] P0 - 阻塞性问题,必须尽快实现
40
+ - [ ] P1 - 重要功能,近期规划
41
+ - [ ] P2 - 增强功能,可排期
42
+ - [ ] P3 - 想法/探索,长期考虑
43
+
44
+ ## 附加信息
45
+
46
+ <!-- 任何附加信息:参考实现、相关项目、截图、用户调研等 -->
47
+
48
+ ## 自查清单
49
+
50
+ - [ ] 我已搜索现有 Issues 和 Discussions,未发现重复请求
51
+ - [ ] 我已描述清楚功能的价值和使用场景
52
+ - [ ] 我已考虑过替代方案
53
+ - [ ] 这个功能不违反安全或合规要求
@@ -1,46 +1,81 @@
1
- ## 变更类型
1
+ ## 变更描述
2
2
 
3
- - [ ] Bug 修复
4
- - [ ] 新功能
5
- - [ ] 性能优化
6
- - [ ] 文档更新
7
- - [ ] 重构
8
- - [ ] 测试补充
3
+ <!-- 清晰简洁地描述这个 PR 做了什么变更 -->
9
4
 
10
5
  ## 关联 Issue
11
6
 
12
- 修复 #(issue 编号)
7
+ <!-- 关联的 Issue 编号,如 Closes #123 / Fixes #456 -->
13
8
 
14
- ## 变更描述
9
+ ## 变更类型
15
10
 
16
- (清晰描述本次 PR 做了什么变更)
11
+ - [ ] 🐛 Bug 修复(修复缺陷)
12
+ - [ ] ✨ 新功能(新增能力)
13
+ - [ ] 💄 界面/样式优化
14
+ - [ ] ♻️ 代码重构(不改变功能)
15
+ - [ ] 📝 文档更新
16
+ - [ ] ⚡ 性能优化
17
+ - [ ] 🧪 测试补充
18
+ - [ ] 🔧 配置/构建/CI 变更
19
+ - [ ] 📦 依赖升级
20
+ - [ ] 其他(请说明):
17
21
 
18
- ## 测试验证
22
+ ## 变更范围
19
23
 
20
- - [ ] 本地类型检查通过:`npm run typecheck`
21
- - [ ] 单元测试通过:`npm test`
22
- - [ ] M4 企业能力验证:`npm run verify:m4`
23
- - [ ] 全量验证:`npm run verify`
24
- - [ ] 手动测试覆盖(如有新功能)
24
+ <!-- 列出主要修改的文件/模块 -->
25
25
 
26
- ## 变更影响范围
26
+ - `src/...`
27
+ - `docs/...`
28
+ - `app-mobile/...`
27
29
 
28
- - 影响的模块:
29
- - 向后兼容性:是 / 否(如有破坏性变更请说明)
30
- - 需要更新文档:是 / 否
30
+ ## 验证方式
31
31
 
32
- ## 截图(如有 UI 变更)
32
+ <!-- 描述你如何验证这个变更 -->
33
33
 
34
- (粘贴截图或录屏链接)
34
+ - [ ] 本地编译通过(`npm run build` / `npx tsc`)
35
+ - [ ] 冒烟测试通过(`node tests/smoke-v8.js`)
36
+ - [ ] 集成测试通过(`node tests/integration/api.test.js`)
37
+ - [ ] 手动验证(描述步骤和结果)
38
+ - [ ] 移动端验证(如涉及 APP)
35
39
 
36
- ## 提交信息格式
40
+ ### 验证结果
41
+
42
+ <!-- 粘贴测试输出或截图 -->
37
43
 
38
44
  ```
39
- feat(scope): 简要描述(符合 Conventional Commits)
40
- fix(scope): 简要描述
41
- docs(scope): 简要描述
42
- test(scope): 简要描述
43
- refactor(scope): 简要描述
44
- perf(scope): 简要描述
45
- chore(scope): 简要描述
45
+ 在此粘贴测试结果
46
46
  ```
47
+
48
+ ## 版本号
49
+
50
+ <!-- 如涉及版本变更,确认版本号已同步更新 -->
51
+
52
+ - [ ] `package.json` version 已更新
53
+ - [ ] `src/cli/version.ts` VERSION 已同步
54
+ - [ ] `CHANGELOG.md` 已更新
55
+ - [ ] `android/app/build.gradle` versionCode/versionName 已同步(如涉及移动端)
56
+
57
+ ## 安全检查
58
+
59
+ - [ ] 代码中不包含硬编码的 API Key、Token、密码等敏感信息
60
+ - [ ] 日志输出中不包含敏感数据(密钥已脱敏)
61
+ - [ ] 新增的外部输入已做校验(zod / 类型检查)
62
+ - [ ] Shell 命令执行已走沙盒/白名单/审批机制
63
+ - [ ] 不引入已知漏洞的依赖
64
+
65
+ ## 兼容性
66
+
67
+ - [ ] 向后兼容(旧配置/旧 API 仍可使用)
68
+ - [ ] 包含破坏性变更(已在描述中说明迁移方式)
69
+ - [ ] 不涉及兼容性问题
70
+
71
+ ## 附加说明
72
+
73
+ <!-- 任何需要评审者特别注意的事项:设计决策、已知限制、后续 TODO 等 -->
74
+
75
+ ## 自查清单
76
+
77
+ - [ ] 代码遵循项目编码规范(TypeScript、架构分层、署名注释)
78
+ - [ ] 已阅读并遵循 `CONTRIBUTING.md`
79
+ - [ ] 变更最小化,不包含无关修改
80
+ - [ ] 注释清晰,复杂逻辑有说明
81
+ - [ ] 已自测,功能符合预期
@@ -1,180 +1,193 @@
1
- # 飞虹 Code CI
2
- # 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
3
- #
4
- # 全流程离线:不使用任何 API key / Secrets,PR 来自 fork 也能安全跑完。
5
- name: CI
6
-
7
- on:
8
- push:
9
- branches: [master, main]
10
- pull_request:
11
- workflow_dispatch:
12
-
13
- env:
14
- FH_OFFLINE: 'true'
15
- FH_PROVIDERS: '[]'
16
-
17
- jobs:
18
- # ---------- 1. 构建与离线闭环冒烟(多 Node 版本矩阵) ----------
19
- build:
20
- name: 构建 · Node ${{ matrix.node }}
21
- runs-on: ubuntu-latest
22
- strategy:
23
- fail-fast: false
24
- matrix:
25
- node: [18, 20, 22]
26
- steps:
27
- - uses: actions/checkout@v4
28
- - uses: actions/setup-node@v4
29
- with:
30
- node-version: ${{ matrix.node }}
31
- - run: npm install
32
- - name: 类型检查
33
- run: npm run typecheck
34
- - name: 编译
35
- run: npm run build
36
- - name: CLI 可用性
37
- run: node dist/cli/index.js --version
38
- - name: 离线端到端闭环
39
- run: node dist/cli/index.js "离线冒烟:创建一个说明文件"
40
- - name: 只读技能
41
- run: |
42
- node dist/cli/index.js /plan "实现登录并且添加支付"
43
- node dist/cli/index.js /grill src
44
-
45
- # ---------- 2. M4 企业能力(权限 / 审计 / 多租户 / 配额) ----------
46
- enterprise:
47
- name: 企业能力冒烟 (M4)
48
- runs-on: ubuntu-latest
49
- steps:
50
- - uses: actions/checkout@v4
51
- - uses: actions/setup-node@v4
52
- with:
53
- node-version: 20
54
- - run: npm install
55
- - run: npm run build
56
- - name: M4 断言套件(RBAC / 审计链 / 多租户 / 配额)
57
- run: node scripts/verify-m4.mjs
58
- - name: CLI 企业命令冒烟
59
- env:
60
- FH_HOME: ${{ runner.temp }}/fhhome
61
- FH_TENANT: ci-tenant
62
- FH_USER: ci-bot
63
- FH_ROLE: developer
64
- run: |
65
- node dist/cli/index.js whoami
66
- node dist/cli/index.js policy
67
- node dist/cli/index.js "CI 离线任务"
68
- node dist/cli/index.js audit --limit 10
69
- node dist/cli/index.js audit verify
70
- node dist/cli/index.js tenants
71
- - name: 租户隔离断言(beta 不得看到 ci-tenant 的会话)
72
- env:
73
- FH_HOME: ${{ runner.temp }}/fhhome
74
- FH_TENANT: beta-tenant
75
- FH_ROLE: viewer
76
- run: |
77
- out=$(node dist/cli/index.js sessions)
78
- echo "$out"
79
- if echo "$out" | grep -q "CI 离线任务"; then
80
- echo "::error::租户隔离失效:beta-tenant 读到了 ci-tenant 的会话"
81
- exit 1
82
- fi
83
-
84
- # ---------- 3. 供应链与密钥安全 ----------
85
- security:
86
- name: 发布包安全检查
87
- runs-on: ubuntu-latest
88
- steps:
89
- - uses: actions/checkout@v4
90
- - uses: actions/setup-node@v4
91
- with:
92
- node-version: 20
93
- - run: npm install
94
- - run: npm run build
95
- - name: 发布包不得包含密钥或源码
96
- run: |
97
- npm pack --dry-run 2>&1 | tee pack.txt
98
- for bad in ".env" "src/" ".workbuddy" "policy.json" "id_rsa"; do
99
- if grep -q "$bad" pack.txt; then
100
- echo "::error::发布包中检出敏感条目: $bad"
101
- exit 1
102
- fi
103
- done
104
- echo "发布包白名单校验通过"
105
- - name: 仓库内不得提交明文密钥
106
- run: |
107
- if git grep -nIE "sk-[A-Za-z0-9_-]{16,}" -- . ':!*.md' ':!scripts/verify-m4.mjs' ':!tests/unit/redact.test.ts'; then
108
- echo "::error::检出疑似明文 API Key"
109
- exit 1
110
- fi
111
- echo "密钥扫描通过"
112
- - run: npm audit --omit=dev --audit-level=high
113
- continue-on-error: true
114
-
115
- # ---------- 3b. 供应链安全:依赖漏洞 + SBOM(P0-2) ----------
116
- supplychain:
117
- name: 供应链安全 · 依赖扫描 + SBOM
118
- runs-on: ubuntu-latest
119
- steps:
120
- - uses: actions/checkout@v4
121
- - uses: actions/setup-node@v4
122
- with:
123
- node-version: 20
124
- - run: npm install
125
- # 1) npm audit:生产依赖 high 及以上漏洞视为失败(供应链准入证据)
126
- - name: npm audit(生产依赖 high+)
127
- run: npm audit --omit=dev --audit-level=high
128
- # 2) osv-scanner:OSV 数据库全量扫描 lockfile
129
- - name: osv-scanner(OSV 全量漏洞库)
130
- uses: google/osv-scanner/actions/scanner@v2
131
- with:
132
- scan-args: |-
133
- --format=sarif
134
- --output=osv-scanner.sarif
135
- .
136
- - name: 上传 osv-scanner 结果
137
- uses: actions/upload-artifact@v4
138
- with:
139
- name: osv-scanner.sarif
140
- path: osv-scanner.sarif
141
- # 3) SBOM 生成(CycloneDX,随版本发布的供应链物料清单)
142
- - name: 生成 SBOM(CycloneDX)
143
- run: |
144
- npx --yes @cyclonedx/cyclonedx-npm --output-file sbom.cdx.json --omit dev
145
- echo "SBOM 已生成"
146
- - name: 上传 SBOM
147
- uses: actions/upload-artifact@v4
148
- with:
149
- name: sbom.cdx.json
150
- path: sbom.cdx.json
151
- - name: SBOM 冒烟(非空 + 合法 JSON)
152
- run: |
153
- node -e "const s=require('./sbom.cdx.json'); if(!s.components||s.components.length===0){process.exit(1)} console.log('SBOM 组件数:', s.components.length)"
154
-
155
- # ---------- 4. 容器镜像构建校验(稳定部署) ----------
156
- docker:
157
- name: Docker 镜像构建校验
158
- runs-on: ubuntu-latest
159
- steps:
160
- - uses: actions/checkout@v4
161
- - name: 构建镜像(不推送)
162
- run: docker build -t feihong-code:ci .
163
- - name: 冒烟:容器内企业命令可用
164
- run: |
165
- docker run --rm \
166
- -e FH_ENTERPRISE=true -e FH_TENANT=ci -e FH_USER=ci -e FH_ROLE=developer \
167
- feihong-code:ci whoami
168
- - name: 冒烟:Web 控制台可启动
169
- run: |
170
- docker run --rm -d --name fhcode-smoke -p 8099:8080 \
171
- -e FH_ENTERPRISE=true -e FH_WEB_TOKEN=ci-token -e FH_WEB_PORT=8080 \
172
- feihong-code:ci serve --port 8080
173
- sleep 3
174
- code=$(curl -s -o /dev/null -w "%{http_code}" -H "Authorization: Bearer ci-token" http://localhost:8099/api/health)
175
- docker rm -f fhcode-smoke
176
- if [ "$code" != "200" ]; then
177
- echo "::error::Web 控制台健康检查失败,HTTP=$code"
178
- exit 1
179
- fi
180
- echo "Web 控制台健康检查通过 (HTTP 200)"
1
+ # 飞虹 Code CI
2
+ # 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
3
+ #
4
+ # 全流程离线:不使用任何 API key / Secrets,PR 来自 fork 也能安全跑完。
5
+ name: CI
6
+
7
+ on:
8
+ push:
9
+ branches: [master, main]
10
+ pull_request:
11
+ workflow_dispatch:
12
+
13
+ env:
14
+ FH_OFFLINE: 'true'
15
+ FH_PROVIDERS: '[]'
16
+
17
+ jobs:
18
+ # ---------- 1. 构建与离线闭环冒烟(多 Node 版本矩阵) ----------
19
+ build:
20
+ name: 构建 · Node ${{ matrix.node }}
21
+ runs-on: ubuntu-latest
22
+ strategy:
23
+ fail-fast: false
24
+ matrix:
25
+ node: [18, 20, 22]
26
+ steps:
27
+ - uses: actions/checkout@v4
28
+ - uses: actions/setup-node@v4
29
+ with:
30
+ node-version: ${{ matrix.node }}
31
+ # Node 18 上 electron 41 的 postinstall 因 @electron/get 转 ESM 而 require() 失败;
32
+ # 构建/测试不需要 electron 二进制,故 Node 18 跳过安装脚本(CLI 为纯 TS 编译)。
33
+ - run: npm install ${{ matrix.node == 18 && '--ignore-scripts' || '' }}
34
+ - name: 版本号一致性(package.json 为单一权威源)
35
+ run: npm run check:version
36
+ - name: 类型检查
37
+ run: npm run typecheck
38
+ - name: 编译
39
+ run: npm run build
40
+ - name: 跨端一致性冒烟(桌面/移动/扩展)
41
+ run: npm run check:cross -- --runtime
42
+ # Node 18 跳过运行时 CLI 步骤:CLI 启动时即加载 playwright-core(硬要求 Node>=20),
43
+ # Node 18 仅验证构建/类型检查/跨端契约(见 check:cross 的 F12 守卫),不实际运行 CLI。
44
+ - name: CLI 可用性
45
+ if: ${{ matrix.node != 18 }}
46
+ run: node dist/cli/index.js --version
47
+ - name: 离线端到端闭环
48
+ if: ${{ matrix.node != 18 }}
49
+ run: node dist/cli/index.js "离线冒烟:创建一个说明文件"
50
+ - name: 只读技能
51
+ if: ${{ matrix.node != 18 }}
52
+ run: |
53
+ node dist/cli/index.js /plan "实现登录并且添加支付"
54
+ node dist/cli/index.js /grill src
55
+
56
+ # ---------- 2. M4 企业能力(权限 / 审计 / 多租户 / 配额) ----------
57
+ enterprise:
58
+ name: 企业能力冒烟 (M4)
59
+ runs-on: ubuntu-latest
60
+ steps:
61
+ - uses: actions/checkout@v4
62
+ - uses: actions/setup-node@v4
63
+ with:
64
+ node-version: 20
65
+ - run: npm install
66
+ - run: npm run build
67
+ - name: M4 断言套件(RBAC / 审计链 / 多租户 / 配额)
68
+ run: node scripts/verify-m4.mjs
69
+ - name: CLI 企业命令冒烟
70
+ env:
71
+ FH_HOME: ${{ runner.temp }}/fhhome
72
+ FH_TENANT: ci-tenant
73
+ FH_USER: ci-bot
74
+ FH_ROLE: developer
75
+ run: |
76
+ node dist/cli/index.js whoami
77
+ node dist/cli/index.js policy
78
+ node dist/cli/index.js "CI 离线任务"
79
+ node dist/cli/index.js audit --limit 10
80
+ node dist/cli/index.js audit verify
81
+ node dist/cli/index.js tenants
82
+ - name: 租户隔离断言(beta 不得看到 ci-tenant 的会话)
83
+ env:
84
+ FH_HOME: ${{ runner.temp }}/fhhome
85
+ FH_TENANT: beta-tenant
86
+ FH_ROLE: viewer
87
+ run: |
88
+ out=$(node dist/cli/index.js sessions)
89
+ echo "$out"
90
+ if echo "$out" | grep -q "CI 离线任务"; then
91
+ echo "::error::租户隔离失效:beta-tenant 读到了 ci-tenant 的会话"
92
+ exit 1
93
+ fi
94
+
95
+ # ---------- 3. 供应链与密钥安全 ----------
96
+ security:
97
+ name: 发布包安全检查
98
+ runs-on: ubuntu-latest
99
+ steps:
100
+ - uses: actions/checkout@v4
101
+ - uses: actions/setup-node@v4
102
+ with:
103
+ node-version: 20
104
+ - run: npm install
105
+ - run: npm run build
106
+ - name: 发布包不得包含密钥或源码
107
+ run: |
108
+ npm pack --dry-run 2>&1 | tee pack.txt
109
+ for bad in ".env" "src/" ".workbuddy" "policy.json" "id_rsa"; do
110
+ if grep -q "$bad" pack.txt; then
111
+ echo "::error::发布包中检出敏感条目: $bad"
112
+ exit 1
113
+ fi
114
+ done
115
+ echo "发布包白名单校验通过"
116
+ - name: 仓库内不得提交明文密钥
117
+ run: |
118
+ if git grep -nIE "sk-[A-Za-z0-9_-]{16,}" -- . ':!*.md' ':!scripts/verify-m4.mjs' ':!tests/unit/redact.test.ts'; then
119
+ echo "::error::检出疑似明文 API Key"
120
+ exit 1
121
+ fi
122
+ - name: 合规宣称扫描(对外材料不得宣称已获第三方认证)
123
+ run: npm run check:compliance
124
+ echo "密钥扫描通过"
125
+ - run: npm audit --omit=dev --audit-level=high
126
+ continue-on-error: true
127
+
128
+ # ---------- 3b. 供应链安全:依赖漏洞 + SBOM(P0-2) ----------
129
+ supplychain:
130
+ name: 供应链安全 · 依赖扫描 + SBOM
131
+ runs-on: ubuntu-latest
132
+ steps:
133
+ - uses: actions/checkout@v4
134
+ - uses: actions/setup-node@v4
135
+ with:
136
+ node-version: 20
137
+ - run: npm install
138
+ # 1) npm audit:生产依赖 high 及以上漏洞视为失败(供应链准入证据)
139
+ - name: npm audit(生产依赖 high+)
140
+ run: npm audit --omit=dev --audit-level=high
141
+ # 2) osv-scanner:OSV 数据库全量扫描 lockfile
142
+ - name: osv-scanner(OSV 全量漏洞库)
143
+ uses: google/osv-scanner/actions/scanner@v2
144
+ with:
145
+ scan-args: |-
146
+ --format=sarif
147
+ --output=osv-scanner.sarif
148
+ .
149
+ - name: 上传 osv-scanner 结果
150
+ uses: actions/upload-artifact@v7
151
+ with:
152
+ name: osv-scanner.sarif
153
+ path: osv-scanner.sarif
154
+ # 3) SBOM 生成(CycloneDX,随版本发布的供应链物料清单)
155
+ - name: 生成 SBOM(CycloneDX)
156
+ run: |
157
+ npx --yes @cyclonedx/cyclonedx-npm --output-file sbom.cdx.json --omit dev
158
+ echo "SBOM 已生成"
159
+ - name: 上传 SBOM
160
+ uses: actions/upload-artifact@v7
161
+ with:
162
+ name: sbom.cdx.json
163
+ path: sbom.cdx.json
164
+ - name: SBOM 冒烟(非空 + 合法 JSON)
165
+ run: |
166
+ node -e "const s=require('./sbom.cdx.json'); if(!s.components||s.components.length===0){process.exit(1)} console.log('SBOM 组件数:', s.components.length)"
167
+
168
+ # ---------- 4. 容器镜像构建校验(稳定部署) ----------
169
+ docker:
170
+ name: Docker 镜像构建校验
171
+ runs-on: ubuntu-latest
172
+ steps:
173
+ - uses: actions/checkout@v4
174
+ - name: 构建镜像(不推送)
175
+ run: docker build -t feihong-code:ci .
176
+ - name: 冒烟:容器内企业命令可用
177
+ run: |
178
+ docker run --rm \
179
+ -e FH_ENTERPRISE=true -e FH_TENANT=ci -e FH_USER=ci -e FH_ROLE=developer \
180
+ feihong-code:ci whoami
181
+ - name: 冒烟:Web 控制台可启动
182
+ run: |
183
+ docker run --rm -d --name fhcode-smoke -p 8099:8080 \
184
+ -e FH_ENTERPRISE=true -e FH_WEB_TOKEN=ci-token -e FH_WEB_PORT=8080 \
185
+ feihong-code:ci serve --port 8080
186
+ sleep 3
187
+ code=$(curl -s -o /dev/null -w "%{http_code}" -H "Authorization: Bearer ci-token" http://localhost:8099/api/health)
188
+ docker rm -f fhcode-smoke
189
+ if [ "$code" != "200" ]; then
190
+ echo "::error::Web 控制台健康检查失败,HTTP=$code"
191
+ exit 1
192
+ fi
193
+ echo "Web 控制台健康检查通过 (HTTP 200)"