feihong-code 7.2.0 → 7.5.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 (249) hide show
  1. package/.github/workflows/ci.yml +180 -140
  2. package/.github/workflows/release.yml +200 -173
  3. package/CHANGELOG.md +94 -115
  4. package/README.md +609 -586
  5. package/dist/agent/completion-engine.js +76 -45
  6. package/dist/agent/completion-engine.js.map +1 -1
  7. package/dist/agent/completion-postprocess.js +109 -0
  8. package/dist/agent/completion-postprocess.js.map +1 -0
  9. package/dist/agent/context-budget.js +121 -0
  10. package/dist/agent/context-budget.js.map +1 -0
  11. package/dist/agent/context-compactor.js +47 -0
  12. package/dist/agent/context-compactor.js.map +1 -1
  13. package/dist/agent/custom-agent.js +52 -52
  14. package/dist/agent/design-to-code.js +40 -40
  15. package/dist/agent/lint.js +121 -0
  16. package/dist/agent/lint.js.map +1 -0
  17. package/dist/agent/multi-agent.js +44 -44
  18. package/dist/agent/orchestrator.js +20 -20
  19. package/dist/agent/prompts.js +54 -54
  20. package/dist/agent/self-correction.js +24 -24
  21. package/dist/agent/self-heal.js +27 -27
  22. package/dist/cli/commands.js +9 -0
  23. package/dist/cli/commands.js.map +1 -1
  24. package/dist/cli/index.js +9 -0
  25. package/dist/cli/index.js.map +1 -1
  26. package/dist/cli/multi-pane-tui.js +217 -0
  27. package/dist/cli/multi-pane-tui.js.map +1 -0
  28. package/dist/cli/run.js +129 -40
  29. package/dist/cli/run.js.map +1 -1
  30. package/dist/cli/tui-run.js +79 -0
  31. package/dist/cli/tui-run.js.map +1 -0
  32. package/dist/cli/tui.js.map +1 -1
  33. package/dist/cli/version.js +1 -1
  34. package/dist/lsp/lsp-client.js +183 -0
  35. package/dist/lsp/lsp-client.js.map +1 -0
  36. package/dist/lsp/lsp-service.js +159 -0
  37. package/dist/lsp/lsp-service.js.map +1 -0
  38. package/dist/plugins/manager.js +50 -2
  39. package/dist/plugins/manager.js.map +1 -1
  40. package/dist/shared/i18n.js +108 -100
  41. package/dist/shared/i18n.js.map +1 -1
  42. package/dist/tools/generator/code-generator.js +40 -40
  43. package/dist/tools/generator/test-generator.js +9 -9
  44. package/dist/tools/shell/exec.js +23 -1
  45. package/dist/tools/shell/exec.js.map +1 -1
  46. package/dist/web/extra-apis.js +440 -0
  47. package/dist/web/extra-apis.js.map +1 -0
  48. package/dist/web/public/css/style.css +1715 -1715
  49. package/dist/web/public/index.html +1242 -1200
  50. package/dist/web/public/js/api.js +555 -496
  51. package/dist/web/public/js/app.js +2210 -2210
  52. package/dist/web/public/js/mock-api.js +234 -234
  53. package/dist/web/public/js/monaco-editor.js +363 -203
  54. package/dist/web/public/js/ui.js +2251 -1981
  55. package/dist/web/public/js/utils.js +214 -214
  56. package/dist/web/public/manifest.json +59 -59
  57. package/dist/web/public/service-worker.js +173 -173
  58. package/dist/web/server.js +97 -45
  59. package/dist/web/server.js.map +1 -1
  60. package/docs/BENCHMARK_REPORT_en.md +386 -329
  61. package/docs/BENCHMARK_REPORT_zh.md +386 -329
  62. package/docs/DPA.md +63 -0
  63. 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 +67 -0
  64. package/docs/SECURITY_WHITEPAPER.md +74 -0
  65. package/docs/SWE_BENCH_REPORT.md +55 -0
  66. package/docs/TECHNICAL_SPEC_en.md +292 -292
  67. package/docs/TECHNICAL_SPEC_zh.md +292 -292
  68. package/docs/UPDATE_NOTES_en.md +159 -159
  69. package/docs/UPDATE_NOTES_zh.md +159 -159
  70. package/docs/UPGRADE_7.2.0.md +309 -0
  71. package/docs/UPGRADE_GUIDE_7_5.md +86 -0
  72. package/docs/geo-feihong-code.html +391 -0
  73. package/docs//345/205/250/351/235/242/345/244/215/347/233/230_50/350/275/256/346/267/261/345/272/246/345/256/241/350/256/241_v7.2.0.md +208 -0
  74. package/docs//345/205/250/351/235/242/345/244/215/347/233/230_6/351/241/271/351/207/215/347/202/271/346/240/270/346/237/245_v7.2.0.md +152 -0
  75. package/docs//345/205/250/351/235/242/345/244/215/347/233/230_/350/277/220/350/241/214/346/227/266/345/256/236/346/265/213/347/211/210_v7.2.0.md +271 -0
  76. package/docs//345/220/210/350/247/204/350/256/244/350/257/201/345/207/206/345/244/207/346/270/205/345/215/225_v7.2.0.md +59 -0
  77. package/docs//345/256/211/345/205/250/347/231/275/347/232/256/344/271/246_v7.2.0.md +82 -0
  78. package/electron/main.js +404 -602
  79. package/package.json +175 -172
  80. package/templates/skills/api-design/SKILL.md +27 -0
  81. package/templates/skills/code-review/SKILL.md +35 -0
  82. package/templates/skills/dependency-upgrade/SKILL.md +29 -0
  83. package/templates/skills/doc-gen/SKILL.md +29 -0
  84. package/templates/skills/git-flow/SKILL.md +26 -0
  85. package/templates/skills/onboarding/SKILL.md +27 -0
  86. package/templates/skills/performance/SKILL.md +29 -0
  87. package/templates/skills/refactor/SKILL.md +28 -0
  88. package/templates/skills/security-audit/SKILL.md +28 -0
  89. package/templates/skills/test-gen/SKILL.md +30 -0
  90. package/tool-schema.json +197 -197
  91. package/dist/hello.js +0 -14
  92. package/dist/hello.js.map +0 -1
  93. package/dist/self-evolve/hook.ts +0 -80
  94. package/dist/self-evolve/manager.d.ts +0 -8
  95. package/dist/web/public/vendor/monaco/vs/abap-D-t0cyap.js +0 -1
  96. package/dist/web/public/vendor/monaco/vs/apex-CcIm7xu6.js +0 -1
  97. package/dist/web/public/vendor/monaco/vs/assets/css.worker-URu8fCFR.js +0 -97
  98. package/dist/web/public/vendor/monaco/vs/assets/editor.worker-lj3bdIIn.js +0 -30
  99. package/dist/web/public/vendor/monaco/vs/assets/editorWebWorkerMain-CA_vMoUU.js +0 -30
  100. package/dist/web/public/vendor/monaco/vs/assets/html.worker-D1SL3iM8.js +0 -474
  101. package/dist/web/public/vendor/monaco/vs/assets/json.worker-CoJx_OPf.js +0 -62
  102. package/dist/web/public/vendor/monaco/vs/assets/ts.worker-BWKtMYOk.js +0 -67722
  103. package/dist/web/public/vendor/monaco/vs/azcli-BA0tQDCg.js +0 -1
  104. package/dist/web/public/vendor/monaco/vs/basic-languages/monaco.contribution.js +0 -1
  105. package/dist/web/public/vendor/monaco/vs/bat-C397hTD6.js +0 -1
  106. package/dist/web/public/vendor/monaco/vs/bicep-DF5aW17k.js +0 -2
  107. package/dist/web/public/vendor/monaco/vs/cameligo-plsz8qhj.js +0 -1
  108. package/dist/web/public/vendor/monaco/vs/clojure-Y2auQMzK.js +0 -1
  109. package/dist/web/public/vendor/monaco/vs/coffee-Bu45yuWE.js +0 -1
  110. package/dist/web/public/vendor/monaco/vs/cpp-CkKPQIni.js +0 -1
  111. package/dist/web/public/vendor/monaco/vs/csharp-CX28MZyh.js +0 -1
  112. package/dist/web/public/vendor/monaco/vs/csp-D8uWnyxW.js +0 -1
  113. package/dist/web/public/vendor/monaco/vs/css-CaeNmE3S.js +0 -3
  114. package/dist/web/public/vendor/monaco/vs/css.worker-CyhWkhHo.js +0 -1
  115. package/dist/web/public/vendor/monaco/vs/cssMode-CV6Ay48H.js +0 -1
  116. package/dist/web/public/vendor/monaco/vs/cypher-DVThT8BS.js +0 -1
  117. package/dist/web/public/vendor/monaco/vs/dart-CmGfCvrO.js +0 -1
  118. package/dist/web/public/vendor/monaco/vs/dockerfile-CZqqYdch.js +0 -1
  119. package/dist/web/public/vendor/monaco/vs/ecl-30fUercY.js +0 -1
  120. package/dist/web/public/vendor/monaco/vs/editor/editor.main.css +0 -1
  121. package/dist/web/public/vendor/monaco/vs/editor/editor.main.js +0 -1
  122. package/dist/web/public/vendor/monaco/vs/editor/editor.worker.js +0 -1
  123. package/dist/web/public/vendor/monaco/vs/editor-KLE6jdfb.js +0 -831
  124. package/dist/web/public/vendor/monaco/vs/editor.js +0 -1
  125. package/dist/web/public/vendor/monaco/vs/editorWorkerHost-fVE1cjcC.js +0 -35
  126. package/dist/web/public/vendor/monaco/vs/elixir-xjPaIfzF.js +0 -1
  127. package/dist/web/public/vendor/monaco/vs/flow9-DqtmStfK.js +0 -1
  128. package/dist/web/public/vendor/monaco/vs/freemarker2-FWreY7v7.js +0 -3
  129. package/dist/web/public/vendor/monaco/vs/fsharp-BOMdg4U1.js +0 -1
  130. package/dist/web/public/vendor/monaco/vs/go-D_hbi-Jt.js +0 -1
  131. package/dist/web/public/vendor/monaco/vs/graphql-CKUU4kLG.js +0 -1
  132. package/dist/web/public/vendor/monaco/vs/handlebars-CZi4pHCH.js +0 -1
  133. package/dist/web/public/vendor/monaco/vs/hcl-DTaboeZW.js +0 -1
  134. package/dist/web/public/vendor/monaco/vs/html-j_7ZTNRU.js +0 -1
  135. package/dist/web/public/vendor/monaco/vs/html.worker-CA3iAimZ.js +0 -1
  136. package/dist/web/public/vendor/monaco/vs/htmlMode-27by_KM4.js +0 -1
  137. package/dist/web/public/vendor/monaco/vs/index-049xrXrp.js +0 -1
  138. package/dist/web/public/vendor/monaco/vs/index-CBVt3dzv.js +0 -5
  139. package/dist/web/public/vendor/monaco/vs/index.js +0 -1
  140. package/dist/web/public/vendor/monaco/vs/ini-CsNwO04R.js +0 -1
  141. package/dist/web/public/vendor/monaco/vs/initialize-DL0l1TGY.js +0 -1
  142. package/dist/web/public/vendor/monaco/vs/java-CI4ZMsH9.js +0 -1
  143. package/dist/web/public/vendor/monaco/vs/javascript-DTJl4Jn1.js +0 -1
  144. package/dist/web/public/vendor/monaco/vs/json.worker-BizpAl9O.js +0 -1
  145. package/dist/web/public/vendor/monaco/vs/jsonMode-DLUiMUrI.js +0 -1
  146. package/dist/web/public/vendor/monaco/vs/julia-BwzEvaQw.js +0 -1
  147. package/dist/web/public/vendor/monaco/vs/kotlin-IUYPiTV8.js +0 -1
  148. package/dist/web/public/vendor/monaco/vs/language/css/css.worker.js +0 -66
  149. package/dist/web/public/vendor/monaco/vs/language/css/monaco.contribution.js +0 -1
  150. package/dist/web/public/vendor/monaco/vs/language/html/html.worker.js +0 -443
  151. package/dist/web/public/vendor/monaco/vs/language/html/monaco.contribution.js +0 -1
  152. package/dist/web/public/vendor/monaco/vs/language/json/json.worker.js +0 -17
  153. package/dist/web/public/vendor/monaco/vs/language/json/monaco.contribution.js +0 -1
  154. package/dist/web/public/vendor/monaco/vs/language/typescript/monaco.contribution.js +0 -1
  155. package/dist/web/public/vendor/monaco/vs/language/typescript/ts.worker.js +0 -67693
  156. package/dist/web/public/vendor/monaco/vs/less-C0eDYdqa.js +0 -2
  157. package/dist/web/public/vendor/monaco/vs/lexon-iON-Kj97.js +0 -1
  158. package/dist/web/public/vendor/monaco/vs/liquid-CLJYelW6.js +0 -1
  159. package/dist/web/public/vendor/monaco/vs/loader.js +0 -1368
  160. package/dist/web/public/vendor/monaco/vs/lspLanguageFeatures-BIkJOWLw.js +0 -2
  161. package/dist/web/public/vendor/monaco/vs/lua-DtygF91M.js +0 -1
  162. package/dist/web/public/vendor/monaco/vs/m3-CsR4AuFi.js +0 -1
  163. package/dist/web/public/vendor/monaco/vs/main-BEx-Fmlo.js +0 -15
  164. package/dist/web/public/vendor/monaco/vs/main-DsK8pnKg.js +0 -3
  165. package/dist/web/public/vendor/monaco/vs/markdown-C_rD0bIw.js +0 -1
  166. package/dist/web/public/vendor/monaco/vs/mdx-CpzZIPHF.js +0 -1
  167. package/dist/web/public/vendor/monaco/vs/mips-CiYP61RB.js +0 -1
  168. package/dist/web/public/vendor/monaco/vs/monaco.contribution-9cKT3C7t.js +0 -1
  169. package/dist/web/public/vendor/monaco/vs/monaco.contribution-BE88ZNGY.js +0 -1
  170. package/dist/web/public/vendor/monaco/vs/monaco.contribution-BPhsneLd.js +0 -1
  171. package/dist/web/public/vendor/monaco/vs/monaco.contribution-BgRy6xDf.js +0 -1
  172. package/dist/web/public/vendor/monaco/vs/msdax-C38-sJlp.js +0 -1
  173. package/dist/web/public/vendor/monaco/vs/mysql-CdtbpvbG.js +0 -1
  174. package/dist/web/public/vendor/monaco/vs/nls/lang/cs.d.ts +0 -1
  175. package/dist/web/public/vendor/monaco/vs/nls/lang/cs.js +0 -9
  176. package/dist/web/public/vendor/monaco/vs/nls/lang/de.d.ts +0 -1
  177. package/dist/web/public/vendor/monaco/vs/nls/lang/de.js +0 -9
  178. package/dist/web/public/vendor/monaco/vs/nls/lang/es.d.ts +0 -1
  179. package/dist/web/public/vendor/monaco/vs/nls/lang/es.js +0 -9
  180. package/dist/web/public/vendor/monaco/vs/nls/lang/fr.d.ts +0 -1
  181. package/dist/web/public/vendor/monaco/vs/nls/lang/fr.js +0 -9
  182. package/dist/web/public/vendor/monaco/vs/nls/lang/it.d.ts +0 -1
  183. package/dist/web/public/vendor/monaco/vs/nls/lang/it.js +0 -9
  184. package/dist/web/public/vendor/monaco/vs/nls/lang/ja.d.ts +0 -1
  185. package/dist/web/public/vendor/monaco/vs/nls/lang/ja.js +0 -9
  186. package/dist/web/public/vendor/monaco/vs/nls/lang/ko.d.ts +0 -1
  187. package/dist/web/public/vendor/monaco/vs/nls/lang/ko.js +0 -9
  188. package/dist/web/public/vendor/monaco/vs/nls/lang/pl.d.ts +0 -1
  189. package/dist/web/public/vendor/monaco/vs/nls/lang/pl.js +0 -9
  190. package/dist/web/public/vendor/monaco/vs/nls/lang/pt-br.d.ts +0 -1
  191. package/dist/web/public/vendor/monaco/vs/nls/lang/pt-br.js +0 -9
  192. package/dist/web/public/vendor/monaco/vs/nls/lang/ru.d.ts +0 -1
  193. package/dist/web/public/vendor/monaco/vs/nls/lang/ru.js +0 -9
  194. package/dist/web/public/vendor/monaco/vs/nls/lang/tr.d.ts +0 -1
  195. package/dist/web/public/vendor/monaco/vs/nls/lang/tr.js +0 -9
  196. package/dist/web/public/vendor/monaco/vs/nls/lang/zh-cn.d.ts +0 -1
  197. package/dist/web/public/vendor/monaco/vs/nls/lang/zh-cn.js +0 -9
  198. package/dist/web/public/vendor/monaco/vs/nls/lang/zh-tw.d.ts +0 -1
  199. package/dist/web/public/vendor/monaco/vs/nls/lang/zh-tw.js +0 -9
  200. package/dist/web/public/vendor/monaco/vs/nls.messages-loader.js +0 -1
  201. package/dist/web/public/vendor/monaco/vs/objective-c-CntZFaHX.js +0 -1
  202. package/dist/web/public/vendor/monaco/vs/pascal-r6kuqfl_.js +0 -1
  203. package/dist/web/public/vendor/monaco/vs/pascaligo-BiXoTmXh.js +0 -1
  204. package/dist/web/public/vendor/monaco/vs/perl-DABw_TcH.js +0 -1
  205. package/dist/web/public/vendor/monaco/vs/pgsql-me_jFXeX.js +0 -1
  206. package/dist/web/public/vendor/monaco/vs/php-D_kh-9LK.js +0 -1
  207. package/dist/web/public/vendor/monaco/vs/pla-VfZjczW0.js +0 -1
  208. package/dist/web/public/vendor/monaco/vs/postiats-BBSzz8Pk.js +0 -1
  209. package/dist/web/public/vendor/monaco/vs/powerquery-Dt-g_2cc.js +0 -1
  210. package/dist/web/public/vendor/monaco/vs/powershell-B-7ap1zc.js +0 -1
  211. package/dist/web/public/vendor/monaco/vs/protobuf-BmtuEB1A.js +0 -2
  212. package/dist/web/public/vendor/monaco/vs/pug-BRpRNeEb.js +0 -1
  213. package/dist/web/public/vendor/monaco/vs/python-CqWUUgfu.js +0 -1
  214. package/dist/web/public/vendor/monaco/vs/qsharp-BzsFaUU9.js +0 -1
  215. package/dist/web/public/vendor/monaco/vs/r-f8dDdrp4.js +0 -1
  216. package/dist/web/public/vendor/monaco/vs/razor-hok5y9Km.js +0 -1
  217. package/dist/web/public/vendor/monaco/vs/redis-fvZQY4PI.js +0 -1
  218. package/dist/web/public/vendor/monaco/vs/redshift-45Et0LQi.js +0 -1
  219. package/dist/web/public/vendor/monaco/vs/restructuredtext-C7UUFKFD.js +0 -1
  220. package/dist/web/public/vendor/monaco/vs/ruby-CZO8zYTz.js +0 -1
  221. package/dist/web/public/vendor/monaco/vs/rust-Bfetafyc.js +0 -1
  222. package/dist/web/public/vendor/monaco/vs/sb-3GYllVck.js +0 -1
  223. package/dist/web/public/vendor/monaco/vs/scala-foMgrKo1.js +0 -1
  224. package/dist/web/public/vendor/monaco/vs/scheme-CHdMtr7p.js +0 -1
  225. package/dist/web/public/vendor/monaco/vs/scss-C1cmLt9V.js +0 -3
  226. package/dist/web/public/vendor/monaco/vs/shell-ClXCKCEW.js +0 -1
  227. package/dist/web/public/vendor/monaco/vs/solidity-MZ6ExpPy.js +0 -1
  228. package/dist/web/public/vendor/monaco/vs/sophia-DWkuSsPQ.js +0 -1
  229. package/dist/web/public/vendor/monaco/vs/sparql-AUGFYSyk.js +0 -1
  230. package/dist/web/public/vendor/monaco/vs/sql-32GpJSV2.js +0 -1
  231. package/dist/web/public/vendor/monaco/vs/st-CuDFIVZ_.js +0 -1
  232. package/dist/web/public/vendor/monaco/vs/swift-t-PfMj7W.js +0 -1
  233. package/dist/web/public/vendor/monaco/vs/systemverilog-Ch4vA8Yt.js +0 -1
  234. package/dist/web/public/vendor/monaco/vs/tcl-D74tq1nH.js +0 -1
  235. package/dist/web/public/vendor/monaco/vs/toggleHighContrast-qGX7E9o7.js +0 -61
  236. package/dist/web/public/vendor/monaco/vs/ts.worker-2QLmBukE.js +0 -1
  237. package/dist/web/public/vendor/monaco/vs/tsMode-B0S_kp2q.js +0 -11
  238. package/dist/web/public/vendor/monaco/vs/twig-C6taOxMV.js +0 -1
  239. package/dist/web/public/vendor/monaco/vs/typescript-_2t_511t.js +0 -1
  240. package/dist/web/public/vendor/monaco/vs/typespec-8OfoLt6R.js +0 -1
  241. package/dist/web/public/vendor/monaco/vs/vb-Dyb2648j.js +0 -1
  242. package/dist/web/public/vendor/monaco/vs/wgsl-BhLXMOR0.js +0 -298
  243. package/dist/web/public/vendor/monaco/vs/workers-BBttULjf.js +0 -1
  244. package/dist/web/public/vendor/monaco/vs/xml-cZjNDqDT.js +0 -1
  245. package/dist/web/public/vendor/monaco/vs/yaml-A1fOIdH6.js +0 -1
  246. package/dist/web/web-config.js +0 -143
  247. package/dist/web/web-config.js.map +0 -1
  248. package/docs/DEPLOYMENT.md +0 -382
  249. package/docs/MODEL_FINETUNING.md +0 -405
@@ -1,140 +1,180 @@
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
- # ---------- 4. 容器镜像构建校验(稳定部署) ----------
116
- docker:
117
- name: Docker 镜像构建校验
118
- runs-on: ubuntu-latest
119
- steps:
120
- - uses: actions/checkout@v4
121
- - name: 构建镜像(不推送)
122
- run: docker build -t feihong-code:ci .
123
- - name: 冒烟:容器内企业命令可用
124
- run: |
125
- docker run --rm \
126
- -e FH_ENTERPRISE=true -e FH_TENANT=ci -e FH_USER=ci -e FH_ROLE=developer \
127
- feihong-code:ci whoami
128
- - name: 冒烟:Web 控制台可启动
129
- run: |
130
- docker run --rm -d --name fhcode-smoke -p 8099:8080 \
131
- -e FH_ENTERPRISE=true -e FH_WEB_TOKEN=ci-token -e FH_WEB_PORT=8080 \
132
- feihong-code:ci serve --port 8080
133
- sleep 3
134
- code=$(curl -s -o /dev/null -w "%{http_code}" -H "Authorization: Bearer ci-token" http://localhost:8099/api/health)
135
- docker rm -f fhcode-smoke
136
- if [ "$code" != "200" ]; then
137
- echo "::error::Web 控制台健康检查失败,HTTP=$code"
138
- exit 1
139
- fi
140
- 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
+ - 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)"