feihong-code 0.6.1 → 7.2.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 (247) hide show
  1. package/.github/workflows/release.yml +173 -0
  2. package/CHANGELOG.md +83 -454
  3. package/dist/agent/browser-agent.js +354 -0
  4. package/dist/agent/browser-agent.js.map +1 -0
  5. package/dist/agent/change-manager.js +433 -0
  6. package/dist/agent/change-manager.js.map +1 -0
  7. package/dist/agent/code-rag.js +293 -0
  8. package/dist/agent/code-rag.js.map +1 -0
  9. package/dist/agent/code-writer.js +13 -1
  10. package/dist/agent/code-writer.js.map +1 -1
  11. package/dist/agent/completion-engine.js +522 -0
  12. package/dist/agent/completion-engine.js.map +1 -0
  13. package/dist/agent/context-compactor.js +188 -10
  14. package/dist/agent/context-compactor.js.map +1 -1
  15. package/dist/agent/custom-agent.js +368 -0
  16. package/dist/agent/custom-agent.js.map +1 -0
  17. package/dist/agent/design-to-code.js +218 -0
  18. package/dist/agent/design-to-code.js.map +1 -0
  19. package/dist/agent/event-driven-agent.js +359 -0
  20. package/dist/agent/event-driven-agent.js.map +1 -0
  21. package/dist/agent/git-integration.js +324 -0
  22. package/dist/agent/git-integration.js.map +1 -0
  23. package/dist/agent/layered-memory.js +329 -0
  24. package/dist/agent/layered-memory.js.map +1 -0
  25. package/dist/agent/multi-agent.js +359 -0
  26. package/dist/agent/multi-agent.js.map +1 -0
  27. package/dist/agent/orchestrator.js +160 -22
  28. package/dist/agent/orchestrator.js.map +1 -1
  29. package/dist/agent/prompts.js +20 -0
  30. package/dist/agent/prompts.js.map +1 -1
  31. package/dist/agent/quality-gate.js +139 -0
  32. package/dist/agent/quality-gate.js.map +1 -1
  33. package/dist/agent/self-correction.js +274 -0
  34. package/dist/agent/self-correction.js.map +1 -0
  35. package/dist/agent/self-heal.js +42 -12
  36. package/dist/agent/self-heal.js.map +1 -1
  37. package/dist/agent/solo-agent.js +321 -0
  38. package/dist/agent/solo-agent.js.map +1 -0
  39. package/dist/agent/symbol-index.js +258 -28
  40. package/dist/agent/symbol-index.js.map +1 -1
  41. package/dist/agent/team-collaboration.js +252 -0
  42. package/dist/agent/team-collaboration.js.map +1 -0
  43. package/dist/agent/type-checker.js +229 -0
  44. package/dist/agent/type-checker.js.map +1 -0
  45. package/dist/cli/run.js +1 -0
  46. package/dist/cli/run.js.map +1 -1
  47. package/dist/cli/version.js +1 -1
  48. package/dist/integrations/collaboration.js +219 -0
  49. package/dist/integrations/collaboration.js.map +1 -0
  50. package/dist/integrations/figma.js +307 -0
  51. package/dist/integrations/figma.js.map +1 -0
  52. package/dist/integrations/sso.js +327 -0
  53. package/dist/integrations/sso.js.map +1 -0
  54. package/dist/knowledge/library.js +301 -0
  55. package/dist/knowledge/library.js.map +1 -0
  56. package/dist/plugins/manager.js +332 -0
  57. package/dist/plugins/manager.js.map +1 -0
  58. package/dist/runtime/event-log.js.map +1 -1
  59. package/dist/tools/browser/browser.tool.js +217 -0
  60. package/dist/tools/browser/browser.tool.js.map +1 -0
  61. package/dist/tools/index.js +2 -0
  62. package/dist/tools/index.js.map +1 -1
  63. package/dist/tools/shell/exec.js +50 -10
  64. package/dist/tools/shell/exec.js.map +1 -1
  65. package/dist/tools/shell/run-shell.tool.js +8 -2
  66. package/dist/tools/shell/run-shell.tool.js.map +1 -1
  67. package/dist/training/completion-evaluator.js +213 -0
  68. package/dist/training/completion-evaluator.js.map +1 -0
  69. package/dist/training/fim-data.js +248 -0
  70. package/dist/training/fim-data.js.map +1 -0
  71. package/dist/voice/voice-programming.js +223 -0
  72. package/dist/voice/voice-programming.js.map +1 -0
  73. package/dist/web/public/css/style.css +190 -7
  74. package/dist/web/public/index.html +403 -9
  75. package/dist/web/public/js/api.js +191 -4
  76. package/dist/web/public/js/app.js +850 -123
  77. package/dist/web/public/js/mock-api.js +234 -0
  78. package/dist/web/public/js/monaco-editor.js +203 -0
  79. package/dist/web/public/js/ui.js +1271 -54
  80. package/dist/web/public/manifest.json +59 -0
  81. package/dist/web/public/service-worker.js +173 -0
  82. package/dist/web/public/vendor/monaco/vs/abap-D-t0cyap.js +1 -0
  83. package/dist/web/public/vendor/monaco/vs/apex-CcIm7xu6.js +1 -0
  84. package/dist/web/public/vendor/monaco/vs/assets/css.worker-URu8fCFR.js +97 -0
  85. package/dist/web/public/vendor/monaco/vs/assets/editor.worker-lj3bdIIn.js +30 -0
  86. package/dist/web/public/vendor/monaco/vs/assets/editorWebWorkerMain-CA_vMoUU.js +30 -0
  87. package/dist/web/public/vendor/monaco/vs/assets/html.worker-D1SL3iM8.js +474 -0
  88. package/dist/web/public/vendor/monaco/vs/assets/json.worker-CoJx_OPf.js +62 -0
  89. package/dist/web/public/vendor/monaco/vs/assets/ts.worker-BWKtMYOk.js +67722 -0
  90. package/dist/web/public/vendor/monaco/vs/azcli-BA0tQDCg.js +1 -0
  91. package/dist/web/public/vendor/monaco/vs/basic-languages/monaco.contribution.js +1 -0
  92. package/dist/web/public/vendor/monaco/vs/bat-C397hTD6.js +1 -0
  93. package/dist/web/public/vendor/monaco/vs/bicep-DF5aW17k.js +2 -0
  94. package/dist/web/public/vendor/monaco/vs/cameligo-plsz8qhj.js +1 -0
  95. package/dist/web/public/vendor/monaco/vs/clojure-Y2auQMzK.js +1 -0
  96. package/dist/web/public/vendor/monaco/vs/coffee-Bu45yuWE.js +1 -0
  97. package/dist/web/public/vendor/monaco/vs/cpp-CkKPQIni.js +1 -0
  98. package/dist/web/public/vendor/monaco/vs/csharp-CX28MZyh.js +1 -0
  99. package/dist/web/public/vendor/monaco/vs/csp-D8uWnyxW.js +1 -0
  100. package/dist/web/public/vendor/monaco/vs/css-CaeNmE3S.js +3 -0
  101. package/dist/web/public/vendor/monaco/vs/css.worker-CyhWkhHo.js +1 -0
  102. package/dist/web/public/vendor/monaco/vs/cssMode-CV6Ay48H.js +1 -0
  103. package/dist/web/public/vendor/monaco/vs/cypher-DVThT8BS.js +1 -0
  104. package/dist/web/public/vendor/monaco/vs/dart-CmGfCvrO.js +1 -0
  105. package/dist/web/public/vendor/monaco/vs/dockerfile-CZqqYdch.js +1 -0
  106. package/dist/web/public/vendor/monaco/vs/ecl-30fUercY.js +1 -0
  107. package/dist/web/public/vendor/monaco/vs/editor/editor.main.css +1 -0
  108. package/dist/web/public/vendor/monaco/vs/editor/editor.main.js +1 -0
  109. package/dist/web/public/vendor/monaco/vs/editor/editor.worker.js +1 -0
  110. package/dist/web/public/vendor/monaco/vs/editor-KLE6jdfb.js +831 -0
  111. package/dist/web/public/vendor/monaco/vs/editor.js +1 -0
  112. package/dist/web/public/vendor/monaco/vs/editorWorkerHost-fVE1cjcC.js +35 -0
  113. package/dist/web/public/vendor/monaco/vs/elixir-xjPaIfzF.js +1 -0
  114. package/dist/web/public/vendor/monaco/vs/flow9-DqtmStfK.js +1 -0
  115. package/dist/web/public/vendor/monaco/vs/freemarker2-FWreY7v7.js +3 -0
  116. package/dist/web/public/vendor/monaco/vs/fsharp-BOMdg4U1.js +1 -0
  117. package/dist/web/public/vendor/monaco/vs/go-D_hbi-Jt.js +1 -0
  118. package/dist/web/public/vendor/monaco/vs/graphql-CKUU4kLG.js +1 -0
  119. package/dist/web/public/vendor/monaco/vs/handlebars-CZi4pHCH.js +1 -0
  120. package/dist/web/public/vendor/monaco/vs/hcl-DTaboeZW.js +1 -0
  121. package/dist/web/public/vendor/monaco/vs/html-j_7ZTNRU.js +1 -0
  122. package/dist/web/public/vendor/monaco/vs/html.worker-CA3iAimZ.js +1 -0
  123. package/dist/web/public/vendor/monaco/vs/htmlMode-27by_KM4.js +1 -0
  124. package/dist/web/public/vendor/monaco/vs/index-049xrXrp.js +1 -0
  125. package/dist/web/public/vendor/monaco/vs/index-CBVt3dzv.js +5 -0
  126. package/dist/web/public/vendor/monaco/vs/index.js +1 -0
  127. package/dist/web/public/vendor/monaco/vs/ini-CsNwO04R.js +1 -0
  128. package/dist/web/public/vendor/monaco/vs/initialize-DL0l1TGY.js +1 -0
  129. package/dist/web/public/vendor/monaco/vs/java-CI4ZMsH9.js +1 -0
  130. package/dist/web/public/vendor/monaco/vs/javascript-DTJl4Jn1.js +1 -0
  131. package/dist/web/public/vendor/monaco/vs/json.worker-BizpAl9O.js +1 -0
  132. package/dist/web/public/vendor/monaco/vs/jsonMode-DLUiMUrI.js +1 -0
  133. package/dist/web/public/vendor/monaco/vs/julia-BwzEvaQw.js +1 -0
  134. package/dist/web/public/vendor/monaco/vs/kotlin-IUYPiTV8.js +1 -0
  135. package/dist/web/public/vendor/monaco/vs/language/css/css.worker.js +66 -0
  136. package/dist/web/public/vendor/monaco/vs/language/css/monaco.contribution.js +1 -0
  137. package/dist/web/public/vendor/monaco/vs/language/html/html.worker.js +443 -0
  138. package/dist/web/public/vendor/monaco/vs/language/html/monaco.contribution.js +1 -0
  139. package/dist/web/public/vendor/monaco/vs/language/json/json.worker.js +17 -0
  140. package/dist/web/public/vendor/monaco/vs/language/json/monaco.contribution.js +1 -0
  141. package/dist/web/public/vendor/monaco/vs/language/typescript/monaco.contribution.js +1 -0
  142. package/dist/web/public/vendor/monaco/vs/language/typescript/ts.worker.js +67693 -0
  143. package/dist/web/public/vendor/monaco/vs/less-C0eDYdqa.js +2 -0
  144. package/dist/web/public/vendor/monaco/vs/lexon-iON-Kj97.js +1 -0
  145. package/dist/web/public/vendor/monaco/vs/liquid-CLJYelW6.js +1 -0
  146. package/dist/web/public/vendor/monaco/vs/loader.js +1368 -0
  147. package/dist/web/public/vendor/monaco/vs/lspLanguageFeatures-BIkJOWLw.js +2 -0
  148. package/dist/web/public/vendor/monaco/vs/lua-DtygF91M.js +1 -0
  149. package/dist/web/public/vendor/monaco/vs/m3-CsR4AuFi.js +1 -0
  150. package/dist/web/public/vendor/monaco/vs/main-BEx-Fmlo.js +15 -0
  151. package/dist/web/public/vendor/monaco/vs/main-DsK8pnKg.js +3 -0
  152. package/dist/web/public/vendor/monaco/vs/markdown-C_rD0bIw.js +1 -0
  153. package/dist/web/public/vendor/monaco/vs/mdx-CpzZIPHF.js +1 -0
  154. package/dist/web/public/vendor/monaco/vs/mips-CiYP61RB.js +1 -0
  155. package/dist/web/public/vendor/monaco/vs/monaco.contribution-9cKT3C7t.js +1 -0
  156. package/dist/web/public/vendor/monaco/vs/monaco.contribution-BE88ZNGY.js +1 -0
  157. package/dist/web/public/vendor/monaco/vs/monaco.contribution-BPhsneLd.js +1 -0
  158. package/dist/web/public/vendor/monaco/vs/monaco.contribution-BgRy6xDf.js +1 -0
  159. package/dist/web/public/vendor/monaco/vs/msdax-C38-sJlp.js +1 -0
  160. package/dist/web/public/vendor/monaco/vs/mysql-CdtbpvbG.js +1 -0
  161. package/dist/web/public/vendor/monaco/vs/nls/lang/cs.d.ts +1 -0
  162. package/dist/web/public/vendor/monaco/vs/nls/lang/cs.js +9 -0
  163. package/dist/web/public/vendor/monaco/vs/nls/lang/de.d.ts +1 -0
  164. package/dist/web/public/vendor/monaco/vs/nls/lang/de.js +9 -0
  165. package/dist/web/public/vendor/monaco/vs/nls/lang/es.d.ts +1 -0
  166. package/dist/web/public/vendor/monaco/vs/nls/lang/es.js +9 -0
  167. package/dist/web/public/vendor/monaco/vs/nls/lang/fr.d.ts +1 -0
  168. package/dist/web/public/vendor/monaco/vs/nls/lang/fr.js +9 -0
  169. package/dist/web/public/vendor/monaco/vs/nls/lang/it.d.ts +1 -0
  170. package/dist/web/public/vendor/monaco/vs/nls/lang/it.js +9 -0
  171. package/dist/web/public/vendor/monaco/vs/nls/lang/ja.d.ts +1 -0
  172. package/dist/web/public/vendor/monaco/vs/nls/lang/ja.js +9 -0
  173. package/dist/web/public/vendor/monaco/vs/nls/lang/ko.d.ts +1 -0
  174. package/dist/web/public/vendor/monaco/vs/nls/lang/ko.js +9 -0
  175. package/dist/web/public/vendor/monaco/vs/nls/lang/pl.d.ts +1 -0
  176. package/dist/web/public/vendor/monaco/vs/nls/lang/pl.js +9 -0
  177. package/dist/web/public/vendor/monaco/vs/nls/lang/pt-br.d.ts +1 -0
  178. package/dist/web/public/vendor/monaco/vs/nls/lang/pt-br.js +9 -0
  179. package/dist/web/public/vendor/monaco/vs/nls/lang/ru.d.ts +1 -0
  180. package/dist/web/public/vendor/monaco/vs/nls/lang/ru.js +9 -0
  181. package/dist/web/public/vendor/monaco/vs/nls/lang/tr.d.ts +1 -0
  182. package/dist/web/public/vendor/monaco/vs/nls/lang/tr.js +9 -0
  183. package/dist/web/public/vendor/monaco/vs/nls/lang/zh-cn.d.ts +1 -0
  184. package/dist/web/public/vendor/monaco/vs/nls/lang/zh-cn.js +9 -0
  185. package/dist/web/public/vendor/monaco/vs/nls/lang/zh-tw.d.ts +1 -0
  186. package/dist/web/public/vendor/monaco/vs/nls/lang/zh-tw.js +9 -0
  187. package/dist/web/public/vendor/monaco/vs/nls.messages-loader.js +1 -0
  188. package/dist/web/public/vendor/monaco/vs/objective-c-CntZFaHX.js +1 -0
  189. package/dist/web/public/vendor/monaco/vs/pascal-r6kuqfl_.js +1 -0
  190. package/dist/web/public/vendor/monaco/vs/pascaligo-BiXoTmXh.js +1 -0
  191. package/dist/web/public/vendor/monaco/vs/perl-DABw_TcH.js +1 -0
  192. package/dist/web/public/vendor/monaco/vs/pgsql-me_jFXeX.js +1 -0
  193. package/dist/web/public/vendor/monaco/vs/php-D_kh-9LK.js +1 -0
  194. package/dist/web/public/vendor/monaco/vs/pla-VfZjczW0.js +1 -0
  195. package/dist/web/public/vendor/monaco/vs/postiats-BBSzz8Pk.js +1 -0
  196. package/dist/web/public/vendor/monaco/vs/powerquery-Dt-g_2cc.js +1 -0
  197. package/dist/web/public/vendor/monaco/vs/powershell-B-7ap1zc.js +1 -0
  198. package/dist/web/public/vendor/monaco/vs/protobuf-BmtuEB1A.js +2 -0
  199. package/dist/web/public/vendor/monaco/vs/pug-BRpRNeEb.js +1 -0
  200. package/dist/web/public/vendor/monaco/vs/python-CqWUUgfu.js +1 -0
  201. package/dist/web/public/vendor/monaco/vs/qsharp-BzsFaUU9.js +1 -0
  202. package/dist/web/public/vendor/monaco/vs/r-f8dDdrp4.js +1 -0
  203. package/dist/web/public/vendor/monaco/vs/razor-hok5y9Km.js +1 -0
  204. package/dist/web/public/vendor/monaco/vs/redis-fvZQY4PI.js +1 -0
  205. package/dist/web/public/vendor/monaco/vs/redshift-45Et0LQi.js +1 -0
  206. package/dist/web/public/vendor/monaco/vs/restructuredtext-C7UUFKFD.js +1 -0
  207. package/dist/web/public/vendor/monaco/vs/ruby-CZO8zYTz.js +1 -0
  208. package/dist/web/public/vendor/monaco/vs/rust-Bfetafyc.js +1 -0
  209. package/dist/web/public/vendor/monaco/vs/sb-3GYllVck.js +1 -0
  210. package/dist/web/public/vendor/monaco/vs/scala-foMgrKo1.js +1 -0
  211. package/dist/web/public/vendor/monaco/vs/scheme-CHdMtr7p.js +1 -0
  212. package/dist/web/public/vendor/monaco/vs/scss-C1cmLt9V.js +3 -0
  213. package/dist/web/public/vendor/monaco/vs/shell-ClXCKCEW.js +1 -0
  214. package/dist/web/public/vendor/monaco/vs/solidity-MZ6ExpPy.js +1 -0
  215. package/dist/web/public/vendor/monaco/vs/sophia-DWkuSsPQ.js +1 -0
  216. package/dist/web/public/vendor/monaco/vs/sparql-AUGFYSyk.js +1 -0
  217. package/dist/web/public/vendor/monaco/vs/sql-32GpJSV2.js +1 -0
  218. package/dist/web/public/vendor/monaco/vs/st-CuDFIVZ_.js +1 -0
  219. package/dist/web/public/vendor/monaco/vs/swift-t-PfMj7W.js +1 -0
  220. package/dist/web/public/vendor/monaco/vs/systemverilog-Ch4vA8Yt.js +1 -0
  221. package/dist/web/public/vendor/monaco/vs/tcl-D74tq1nH.js +1 -0
  222. package/dist/web/public/vendor/monaco/vs/toggleHighContrast-qGX7E9o7.js +61 -0
  223. package/dist/web/public/vendor/monaco/vs/ts.worker-2QLmBukE.js +1 -0
  224. package/dist/web/public/vendor/monaco/vs/tsMode-B0S_kp2q.js +11 -0
  225. package/dist/web/public/vendor/monaco/vs/twig-C6taOxMV.js +1 -0
  226. package/dist/web/public/vendor/monaco/vs/typescript-_2t_511t.js +1 -0
  227. package/dist/web/public/vendor/monaco/vs/typespec-8OfoLt6R.js +1 -0
  228. package/dist/web/public/vendor/monaco/vs/vb-Dyb2648j.js +1 -0
  229. package/dist/web/public/vendor/monaco/vs/wgsl-BhLXMOR0.js +298 -0
  230. package/dist/web/public/vendor/monaco/vs/workers-BBttULjf.js +1 -0
  231. package/dist/web/public/vendor/monaco/vs/xml-cZjNDqDT.js +1 -0
  232. package/dist/web/public/vendor/monaco/vs/yaml-A1fOIdH6.js +1 -0
  233. package/dist/web/server.js +2073 -210
  234. package/dist/web/server.js.map +1 -1
  235. package/dist/web/task-queue.js +25 -5
  236. package/dist/web/task-queue.js.map +1 -1
  237. package/docs/BENCHMARK_REPORT_en.md +329 -0
  238. package/docs/BENCHMARK_REPORT_zh.md +329 -0
  239. package/docs/DEPLOYMENT.md +382 -0
  240. package/docs/MODEL_FINETUNING.md +405 -0
  241. package/docs/TECHNICAL_SPEC_en.md +292 -0
  242. package/docs/TECHNICAL_SPEC_zh.md +292 -0
  243. package/docs/UPDATE_NOTES_en.md +159 -0
  244. package/docs/UPDATE_NOTES_zh.md +159 -0
  245. package/electron/main.js +602 -0
  246. package/package.json +67 -3
  247. package/tool-schema.json +1 -1
@@ -0,0 +1,382 @@
1
+ # 飞虹 Code CI/CD 部署指南
2
+
3
+ > 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
4
+
5
+ ## 目录
6
+
7
+ 1. [CI 持续集成](#1-ci-持续集成)
8
+ 2. [CD 持续部署](#2-cd-持续部署)
9
+ 3. [Docker 部署](#3-docker-部署)
10
+ 4. [Node.js 直接部署](#4-nodejs-直接部署)
11
+ 5. [环境变量配置](#5-环境变量配置)
12
+ 6. [生产环境最佳实践](#6-生产环境最佳实践)
13
+
14
+ ---
15
+
16
+ ## 1. CI 持续集成
17
+
18
+ ### 1.1 工作流概览
19
+
20
+ 项目已配置完整的 CI 工作流(`.github/workflows/ci.yml`),包含 4 个并行 Job:
21
+
22
+ | Job | 说明 | 触发条件 |
23
+ |---|---|---|
24
+ | **build** | 多 Node 版本构建 + 离线冒烟测试 | 每次 push/PR |
25
+ | **enterprise** | M4 企业能力验证(RBAC/审计/多租户/配额) | 每次 push/PR |
26
+ | **security** | 供应链安全 + 密钥扫描 + npm audit | 每次 push/PR |
27
+ | **docker** | Docker 镜像构建校验 + 容器冒烟 | 每次 push/PR |
28
+
29
+ ### 1.2 触发条件
30
+
31
+ ```yaml
32
+ on:
33
+ push:
34
+ branches: [master, main]
35
+ pull_request:
36
+ workflow_dispatch: # 手动触发
37
+ ```
38
+
39
+ ### 1.3 离线安全设计
40
+
41
+ CI 全程离线运行,不使用任何 API Key / Secrets:
42
+
43
+ ```yaml
44
+ env:
45
+ FH_OFFLINE: 'true'
46
+ FH_PROVIDERS: '[]'
47
+ ```
48
+
49
+ - PR 来自 fork 也能安全跑完
50
+ - 不消耗任何模型 API 额度
51
+ - 所有测试基于本地规则引擎
52
+
53
+ ### 1.4 质量门禁
54
+
55
+ CI 通过以下检查才能合并:
56
+
57
+ - ✅ TypeScript 类型检查(`npm run typecheck`)
58
+ - ✅ 项目构建(`npm run build`)
59
+ - ✅ CLI 可用性验证
60
+ - ✅ 离线端到端闭环测试
61
+ - ✅ 企业能力断言(RBAC/审计链/租户隔离/配额)
62
+ - ✅ 发布包安全检查(无密钥/无源码)
63
+ - ✅ 仓库密钥扫描
64
+ - ✅ Docker 镜像构建 + 容器冒烟
65
+
66
+ ---
67
+
68
+ ## 2. CD 持续部署
69
+
70
+ ### 2.1 发布工作流
71
+
72
+ 项目配置了自动发布工作流(`.github/workflows/release.yml`),包含 5 个阶段:
73
+
74
+ | 阶段 | 说明 |
75
+ |---|---|
76
+ | **version** | 准备版本号(从 tag 或手动输入) |
77
+ | **build** | 构建 + 测试 + 上传产物 |
78
+ | **npm-publish** | 发布到 npm registry |
79
+ | **docker-publish** | 构建并推送 Docker 镜像 |
80
+ | **github-release** | 创建 GitHub Release + 变更日志 |
81
+
82
+ ### 2.2 触发方式
83
+
84
+ **方式一:推送标签(推荐)**
85
+
86
+ ```bash
87
+ # 创建并推送标签
88
+ git tag v1.0.0
89
+ git push origin v1.0.0
90
+ ```
91
+
92
+ **方式二:手动触发**
93
+
94
+ 在 GitHub Actions 页面选择 "Release" 工作流,点击 "Run workflow",输入版本号(如 `1.0.0`、`patch`、`minor`、`major`)。
95
+
96
+ ### 2.3 所需 Secrets
97
+
98
+ 在 GitHub 仓库 Settings → Secrets and variables → Actions 中配置:
99
+
100
+ | Secret | 说明 | 获取方式 |
101
+ |---|---|---|
102
+ | `NPM_TOKEN` | npm 发布令牌 | npmjs.com → Access Tokens → Generate New Token |
103
+ | `DOCKERHUB_USERNAME` | Docker Hub 用户名 | hub.docker.com 注册账号 |
104
+ | `DOCKERHUB_TOKEN` | Docker Hub 访问令牌 | Docker Hub → Account Settings → Security |
105
+
106
+ > `GH_TOKEN` 由 GitHub 自动注入,无需手动配置。
107
+
108
+ ### 2.4 发布产物
109
+
110
+ 每次发布会生成:
111
+
112
+ 1. **npm 包**:`feihong-code@<version>`
113
+ ```bash
114
+ npm install -g feihong-code
115
+ ```
116
+
117
+ 2. **Docker 镜像**:`<username>/feihong-code:<version>` 和 `:latest`
118
+ ```bash
119
+ docker pull <username>/feihong-code:latest
120
+ ```
121
+
122
+ 3. **GitHub Release**:包含变更日志和安装说明
123
+
124
+ ---
125
+
126
+ ## 3. Docker 部署
127
+
128
+ ### 3.1 快速启动
129
+
130
+ ```bash
131
+ # 克隆项目
132
+ git clone <repo-url> feihong-code
133
+ cd feihong-code
134
+
135
+ # 使用 docker-compose 启动
136
+ FH_WEB_TOKEN=$(openssl rand -hex 32) docker compose up -d
137
+
138
+ # 查看服务状态
139
+ docker compose ps
140
+
141
+ # 查看日志
142
+ docker compose logs -f
143
+ ```
144
+
145
+ ### 3.2 docker-compose.yml 说明
146
+
147
+ ```yaml
148
+ services:
149
+ fhcode:
150
+ build: .
151
+ image: feihong-code:0.1.0
152
+ container_name: fhcode
153
+ ports:
154
+ - "8080:8080"
155
+ environment:
156
+ - FH_HOME=/data/fhcode
157
+ - FH_WEB_PORT=8080
158
+ - FH_WEB_TOKEN=${FH_WEB_TOKEN:-change-me-in-production}
159
+ - FH_ENTERPRISE=true
160
+ volumes:
161
+ - fhcode-data:/data/fhcode
162
+ restart: unless-stopped
163
+ ```
164
+
165
+ ### 3.3 使用预构建镜像
166
+
167
+ ```bash
168
+ # 拉取官方镜像
169
+ docker pull <username>/feihong-code:latest
170
+
171
+ # 运行容器
172
+ docker run -d \
173
+ --name fhcode \
174
+ --restart unless-stopped \
175
+ -p 8080:8080 \
176
+ -e FH_WEB_TOKEN=your-secret-token \
177
+ -e FH_ENTERPRISE=true \
178
+ -v fhcode-data:/data/fhcode \
179
+ <username>/feihong-code:latest
180
+ ```
181
+
182
+ ### 3.4 数据持久化
183
+
184
+ - 容器内数据目录:`/data/fhcode`(对应 `FH_HOME`)
185
+ - Docker 命名卷:`fhcode-data`
186
+ - 包含:会话记录、审计链、租户数据、团队配置
187
+
188
+ 备份数据:
189
+
190
+ ```bash
191
+ docker run --rm -v fhcode-data:/data -v $(pwd):/backup alpine \
192
+ tar czf /backup/fhcode-backup-$(date +%Y%m%d).tar.gz -C /data fhcode
193
+ ```
194
+
195
+ ---
196
+
197
+ ## 4. Node.js 直接部署
198
+
199
+ ### 4.1 环境要求
200
+
201
+ - Node.js >= 18
202
+ - npm >= 9
203
+ - (推荐)pm2 进程管理器
204
+
205
+ ### 4.2 安装与启动
206
+
207
+ ```bash
208
+ # 克隆项目
209
+ git clone <repo-url> feihong-code
210
+ cd feihong-code
211
+
212
+ # 安装依赖
213
+ npm install --production
214
+
215
+ # 构建
216
+ npm run build
217
+
218
+ # 方式一:使用 pm2(推荐)
219
+ npm install -g pm2
220
+ FH_WEB_TOKEN=your-secret-token pm2 start dist/cli/index.js --name fhcode -- serve --port 8080
221
+ pm2 save
222
+ pm2 startup # 开机自启
223
+
224
+ # 方式二:直接运行
225
+ FH_WEB_TOKEN=your-secret-token node dist/cli/index.js serve --port 8080
226
+ ```
227
+
228
+ ### 4.3 pm2 常用命令
229
+
230
+ ```bash
231
+ pm2 status # 查看状态
232
+ pm2 logs fhcode # 查看日志
233
+ pm2 restart fhcode # 重启
234
+ pm2 stop fhcode # 停止
235
+ pm2 delete fhcode # 删除
236
+ ```
237
+
238
+ ---
239
+
240
+ ## 5. 环境变量配置
241
+
242
+ ### 5.1 核心配置
243
+
244
+ | 变量 | 默认值 | 说明 |
245
+ |---|---|---|
246
+ | `FH_HOME` | `~/.feihong-code` | 数据目录(会话/审计/租户) |
247
+ | `FH_WEB_PORT` | `8080` | Web 服务端口 |
248
+ | `FH_WEB_TOKEN` | (空) | Web 访问令牌(生产环境必填) |
249
+ | `FH_ENTERPRISE` | `true` | 启用企业级 RBAC/审计 |
250
+
251
+ ### 5.2 企业级配置
252
+
253
+ | 变量 | 说明 |
254
+ |---|---|
255
+ | `FH_TENANT` | 租户 ID(多租户隔离) |
256
+ | `FH_USER` | 当前用户 ID |
257
+ | `FH_ROLE` | 用户角色(owner/admin/developer/viewer) |
258
+ | `FH_TENANT_BUDGET_USD` | 租户日成本预算上限 |
259
+
260
+ ### 5.3 模型配置
261
+
262
+ | 变量 | 说明 |
263
+ |---|---|
264
+ | `FH_PROVIDERS` | 模型提供商配置(JSON 数组) |
265
+ | `FH_OFFLINE` | 离线模式(不调用外部 API) |
266
+
267
+ ---
268
+
269
+ ## 6. 生产环境最佳实践
270
+
271
+ ### 6.1 安全配置
272
+
273
+ ```bash
274
+ # 1. 使用强随机令牌
275
+ export FH_WEB_TOKEN=$(openssl rand -hex 32)
276
+
277
+ # 2. 启用企业模式
278
+ export FH_ENTERPRISE=true
279
+
280
+ # 3. 配置租户隔离
281
+ export FH_TENANT=production-tenant
282
+ export FH_USER=admin
283
+ export FH_ROLE=owner
284
+
285
+ # 4. 设置成本预算
286
+ export FH_TENANT_BUDGET_USD=50
287
+ ```
288
+
289
+ ### 6.2 反向代理(Nginx)
290
+
291
+ ```nginx
292
+ server {
293
+ listen 80;
294
+ server_name fhcode.your-domain.com;
295
+
296
+ location / {
297
+ proxy_pass http://127.0.0.1:8080;
298
+ proxy_http_version 1.1;
299
+ proxy_set_header Upgrade $http_upgrade;
300
+ proxy_set_header Connection 'upgrade';
301
+ proxy_set_header Host $host;
302
+ proxy_set_header X-Real-IP $remote_addr;
303
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
304
+ proxy_set_header X-Forwarded-Proto $scheme;
305
+ proxy_cache_bypass $http_upgrade;
306
+ }
307
+ }
308
+ ```
309
+
310
+ ### 6.3 HTTPS 配置(Let's Encrypt)
311
+
312
+ ```bash
313
+ # 安装 certbot
314
+ sudo apt install certbot python3-certbot-nginx
315
+
316
+ # 获取证书
317
+ sudo certbot --nginx -d fhcode.your-domain.com
318
+
319
+ # 自动续期(已内置)
320
+ sudo certbot renew --dry-run
321
+ ```
322
+
323
+ ### 6.4 监控与告警
324
+
325
+ ```bash
326
+ # 健康检查
327
+ curl -H "Authorization: Bearer $TOKEN" http://localhost:8080/api/health
328
+
329
+ # Docker 健康检查
330
+ docker inspect --format='{{.State.Health.Status}}' fhcode
331
+ ```
332
+
333
+ ### 6.5 备份策略
334
+
335
+ ```bash
336
+ # 每日备份(添加到 crontab)
337
+ 0 2 * * * /path/to/feihong-code/deploy.sh --backup
338
+
339
+ # 保留最近 30 天
340
+ find /path/to/backups -name "backup-*.tar.gz" -mtime +30 -delete
341
+ ```
342
+
343
+ ### 6.6 升级流程
344
+
345
+ ```bash
346
+ # 1. 备份数据
347
+ ./deploy.sh --backup
348
+
349
+ # 2. 拉取最新代码并重新部署
350
+ ./deploy.sh --update
351
+
352
+ # 3. 验证服务
353
+ curl -H "Authorization: Bearer $TOKEN" http://localhost:8080/api/health
354
+
355
+ # 4. 查看日志确认无异常
356
+ ./deploy.sh --logs
357
+ ```
358
+
359
+ ---
360
+
361
+ ## 附录:一键部署脚本
362
+
363
+ 项目提供 `deploy.sh` 一键部署脚本,支持 Docker 和 Node.js 两种方式:
364
+
365
+ ```bash
366
+ # 部署服务
367
+ ./deploy.sh
368
+
369
+ # 更新并重新部署
370
+ ./deploy.sh --update
371
+
372
+ # 停止服务
373
+ ./deploy.sh --stop
374
+
375
+ # 查看日志
376
+ ./deploy.sh --logs
377
+
378
+ # 备份数据
379
+ ./deploy.sh --backup
380
+ ```
381
+
382
+ 脚本会自动检测 Docker 是否可用,优先使用 Docker 部署;如不可用则回退到 Node.js 直接部署。