feihong-code 0.2.1

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 (154) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +37 -0
  2. package/.github/ISSUE_TEMPLATE/config.yml +14 -0
  3. package/.github/ISSUE_TEMPLATE/feature_request.md +28 -0
  4. package/.github/PULL_REQUEST_TEMPLATE.md +46 -0
  5. package/.github/SECURITY.md +67 -0
  6. package/.github/workflows/ci.yml +140 -0
  7. package/AGENT-GUIDE.md +237 -0
  8. package/CHANGELOG.md +73 -0
  9. package/CODE_OF_CONDUCT.md +56 -0
  10. package/CONTRIBUTING.md +68 -0
  11. package/LICENSE +22 -0
  12. package/README.md +500 -0
  13. package/dist/agent/code-review.js +115 -0
  14. package/dist/agent/code-review.js.map +1 -0
  15. package/dist/agent/code-writer.js +227 -0
  16. package/dist/agent/code-writer.js.map +1 -0
  17. package/dist/agent/context-compactor.js +108 -0
  18. package/dist/agent/context-compactor.js.map +1 -0
  19. package/dist/agent/experience.js +190 -0
  20. package/dist/agent/experience.js.map +1 -0
  21. package/dist/agent/orchestrator.js +212 -0
  22. package/dist/agent/orchestrator.js.map +1 -0
  23. package/dist/agent/parallel-orchestrator.js +94 -0
  24. package/dist/agent/parallel-orchestrator.js.map +1 -0
  25. package/dist/agent/planner.js +53 -0
  26. package/dist/agent/planner.js.map +1 -0
  27. package/dist/agent/prompts.js +26 -0
  28. package/dist/agent/prompts.js.map +1 -0
  29. package/dist/agent/quality-gate.js +143 -0
  30. package/dist/agent/quality-gate.js.map +1 -0
  31. package/dist/agent/repo-reader.js +384 -0
  32. package/dist/agent/repo-reader.js.map +1 -0
  33. package/dist/agent/repo-underwriter.js +132 -0
  34. package/dist/agent/repo-underwriter.js.map +1 -0
  35. package/dist/agent/self-heal.js +134 -0
  36. package/dist/agent/self-heal.js.map +1 -0
  37. package/dist/agent/self-improver.js +148 -0
  38. package/dist/agent/self-improver.js.map +1 -0
  39. package/dist/agent/subagent.js +75 -0
  40. package/dist/agent/subagent.js.map +1 -0
  41. package/dist/agent/swe-agent.js +162 -0
  42. package/dist/agent/swe-agent.js.map +1 -0
  43. package/dist/agent/swe-planner.js +155 -0
  44. package/dist/agent/swe-planner.js.map +1 -0
  45. package/dist/agent/swe-verifier.js +113 -0
  46. package/dist/agent/swe-verifier.js.map +1 -0
  47. package/dist/cli/commands.js +167 -0
  48. package/dist/cli/commands.js.map +1 -0
  49. package/dist/cli/index.js +179 -0
  50. package/dist/cli/index.js.map +1 -0
  51. package/dist/cli/repl.js +67 -0
  52. package/dist/cli/repl.js.map +1 -0
  53. package/dist/cli/run.js +762 -0
  54. package/dist/cli/run.js.map +1 -0
  55. package/dist/cli/version.js +14 -0
  56. package/dist/cli/version.js.map +1 -0
  57. package/dist/enterprise/audit.js +294 -0
  58. package/dist/enterprise/audit.js.map +1 -0
  59. package/dist/enterprise/guard.js +58 -0
  60. package/dist/enterprise/guard.js.map +1 -0
  61. package/dist/enterprise/index.js +99 -0
  62. package/dist/enterprise/index.js.map +1 -0
  63. package/dist/enterprise/policy.js +242 -0
  64. package/dist/enterprise/policy.js.map +1 -0
  65. package/dist/enterprise/quota.js +58 -0
  66. package/dist/enterprise/quota.js.map +1 -0
  67. package/dist/enterprise/tenant.js +143 -0
  68. package/dist/enterprise/tenant.js.map +1 -0
  69. package/dist/models/cost.js +13 -0
  70. package/dist/models/cost.js.map +1 -0
  71. package/dist/models/model-router.js +170 -0
  72. package/dist/models/model-router.js.map +1 -0
  73. package/dist/models/model.dto.js +61 -0
  74. package/dist/models/model.dto.js.map +1 -0
  75. package/dist/models/model.interface.js +3 -0
  76. package/dist/models/model.interface.js.map +1 -0
  77. package/dist/models/providers/mock.provider.js +35 -0
  78. package/dist/models/providers/mock.provider.js.map +1 -0
  79. package/dist/models/providers/ollama.provider.js +88 -0
  80. package/dist/models/providers/ollama.provider.js.map +1 -0
  81. package/dist/models/providers/openai-compatible.provider.js +106 -0
  82. package/dist/models/providers/openai-compatible.provider.js.map +1 -0
  83. package/dist/runtime/event-log.js +42 -0
  84. package/dist/runtime/event-log.js.map +1 -0
  85. package/dist/runtime/git.js +106 -0
  86. package/dist/runtime/git.js.map +1 -0
  87. package/dist/runtime/session-persist.js +60 -0
  88. package/dist/runtime/session-persist.js.map +1 -0
  89. package/dist/runtime/session-store.js +34 -0
  90. package/dist/runtime/session-store.js.map +1 -0
  91. package/dist/runtime/worktree.js +117 -0
  92. package/dist/runtime/worktree.js.map +1 -0
  93. package/dist/shared/config.js +184 -0
  94. package/dist/shared/config.js.map +1 -0
  95. package/dist/shared/errors.js +66 -0
  96. package/dist/shared/errors.js.map +1 -0
  97. package/dist/shared/logger.js +51 -0
  98. package/dist/shared/logger.js.map +1 -0
  99. package/dist/shared/types.js +9 -0
  100. package/dist/shared/types.js.map +1 -0
  101. package/dist/skills/goal.js +60 -0
  102. package/dist/skills/goal.js.map +1 -0
  103. package/dist/skills/grill.js +129 -0
  104. package/dist/skills/grill.js.map +1 -0
  105. package/dist/skills/plan.js +40 -0
  106. package/dist/skills/plan.js.map +1 -0
  107. package/dist/tools/analysis/code-analyzer.js +136 -0
  108. package/dist/tools/analysis/code-analyzer.js.map +1 -0
  109. package/dist/tools/file/edit.tool.js +43 -0
  110. package/dist/tools/file/edit.tool.js.map +1 -0
  111. package/dist/tools/file/list.tool.js +36 -0
  112. package/dist/tools/file/list.tool.js.map +1 -0
  113. package/dist/tools/file/read.tool.js +34 -0
  114. package/dist/tools/file/read.tool.js.map +1 -0
  115. package/dist/tools/file/write.tool.js +39 -0
  116. package/dist/tools/file/write.tool.js.map +1 -0
  117. package/dist/tools/generator/code-generator.js +119 -0
  118. package/dist/tools/generator/code-generator.js.map +1 -0
  119. package/dist/tools/generator/test-generator.js +65 -0
  120. package/dist/tools/generator/test-generator.js.map +1 -0
  121. package/dist/tools/index.js +53 -0
  122. package/dist/tools/index.js.map +1 -0
  123. package/dist/tools/safe-path.js +36 -0
  124. package/dist/tools/safe-path.js.map +1 -0
  125. package/dist/tools/search/grep.tool.js +81 -0
  126. package/dist/tools/search/grep.tool.js.map +1 -0
  127. package/dist/tools/shell/exec.js +50 -0
  128. package/dist/tools/shell/exec.js.map +1 -0
  129. package/dist/tools/shell/run-shell.tool.js +49 -0
  130. package/dist/tools/shell/run-shell.tool.js.map +1 -0
  131. package/dist/tools/tool.interface.js +8 -0
  132. package/dist/tools/tool.interface.js.map +1 -0
  133. package/dist/tools/tool.registry.js +75 -0
  134. package/dist/tools/tool.registry.js.map +1 -0
  135. package/dist/tools/verify/build-check.tool.js +37 -0
  136. package/dist/tools/verify/build-check.tool.js.map +1 -0
  137. package/dist/tools/verify/test-run.tool.js +37 -0
  138. package/dist/tools/verify/test-run.tool.js.map +1 -0
  139. package/dist/web/auth.js +25 -0
  140. package/dist/web/auth.js.map +1 -0
  141. package/dist/web/public/index.html +39 -0
  142. package/dist/web/server.js +60 -0
  143. package/dist/web/server.js.map +1 -0
  144. package/docs//344/272/247/345/223/201/345/274/200/345/217/221/346/226/207/346/241/243.md +614 -0
  145. 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 -0
  146. package/docs//344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +358 -0
  147. 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 -0
  148. package/docs//346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +303 -0
  149. package/docs//346/236/266/346/236/204/344/270/216API.md +238 -0
  150. package/docs//347/224/250/346/210/267/346/211/213/345/206/214.md +196 -0
  151. package/docs//351/203/250/347/275/262/346/214/207/345/215/227.md +165 -0
  152. package/docs//351/205/215/347/275/256/345/217/202/350/200/203.md +127 -0
  153. package/package.json +83 -0
  154. package/tool-schema.json +127 -0
@@ -0,0 +1,267 @@
1
+ # 飞虹 Code — 企业部署与合规指南(M4)
2
+
3
+ > 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
4
+
5
+ 本文面向**企业管理员 / 平台工程 / 安全合规**角色,说明如何把飞虹 Code 以受控方式部署到团队、部门乃至多客户(多租户)环境中。
6
+
7
+ ---
8
+
9
+ ## 一、能力总览
10
+
11
+ | 维度 | 能力 | 关键命令 |
12
+ | --- | --- | --- |
13
+ | 身份 | 租户 / 用户 / 角色由环境注入,容器与网关友好 | `fhcode whoami` |
14
+ | 权限 | RBAC 角色矩阵 + deny 优先黑名单 + 沙箱越界拦截 | `fhcode policy` |
15
+ | 审计 | sha256 哈希链、脱敏、按月切分、可验证 | `fhcode audit` / `fhcode audit verify` |
16
+ | 隔离 | 会话 / 审计 / 目标物理分目录 | `fhcode tenants` |
17
+ | 成本 | 单任务熔断 + 租户日预算 fail-fast | `FH_TENANT_BUDGET_USD` |
18
+ | 交付 | 三条全离线 CI 流水线 + 发布包白名单 | `npm run verify` |
19
+
20
+ 企业模式默认开启。若需退回社区版行为(无租户、无审计链、无 RBAC):`FH_ENTERPRISE=false`。
21
+
22
+ ---
23
+
24
+ ## 二、身份模型
25
+
26
+ ```bash
27
+ export FH_TENANT=acme # 租户 ID:^[A-Za-z0-9._-]{1,64}$
28
+ export FH_USER=wuchihong # 用户标识,写入审计 actor
29
+ export FH_ROLE=developer # viewer | developer | operator | admin
30
+ ```
31
+
32
+ - 三者均可由**容器编排 / SSO 网关 / CI Runner** 注入,CLI 自身不做认证——认证是上游职责,飞虹 Code 只负责**授权与留痕**。
33
+ - `FH_TENANT` 非法(含 `../`、超长、特殊字符)时启动即报 `TENANT_ID_INVALID`,杜绝路径穿越。
34
+ - `FH_ROLE` 非法值直接报 `ROLE_INVALID`,不做"降级容错"——权限问题不允许猜。
35
+
36
+ ### 推荐角色分配
37
+
38
+ | 场景 | 角色 | 理由 |
39
+ | --- | --- | --- |
40
+ | 代码审查 / 只读排障 | `viewer` | 仅能读取与检索,任何写入都被拒 |
41
+ | 日常研发 | `developer` | 可写代码与跑测试,shell 需审批 |
42
+ | 值班 / 运维处置 | `operator` | 全工具可用,shell 仍需审批,成本上限 $5 |
43
+ | 平台管理员 | `admin` | 无成本上限,但**危险命令与敏感路径依旧拒绝** |
44
+
45
+ ---
46
+
47
+ ## 三、权限策略
48
+
49
+ ### 3.1 判定顺序(deny 优先)
50
+
51
+ ```
52
+ 1) 危险 shell 命令黑名单 → deny(admin 也拦)
53
+ 2) 敏感路径黑名单 → deny
54
+ 3) 沙箱越界(逃出 cwd) → deny
55
+ 4) 角色-工具矩阵 → deny / approval / allow
56
+ 5) shell 白名单 → allow(否则 approval)
57
+ ```
58
+
59
+ 前三条是**硬底线**,不受角色影响,也不能被人工审批放行——批准了也不执行。
60
+
61
+ ### 3.2 内置黑名单
62
+
63
+ - **危险命令(23 条)**:`rm -rf /`、`rm -rf ~`、`mkfs`、`dd if=`、fork 炸弹 `:(){`、`shutdown`、`reboot`、`format `、`del /s`、`rd /s`、`chown -R root`、`curl | sh`、`wget | sh`、`iptables -F`、`reg delete`、`history -c`、`shred ` 等。
64
+ - **敏感路径(11 类)**:`.env`、`.git/config`、`.git/hooks`、`.npmrc`、`.ssh`、`id_rsa`、`id_ed25519`、`credentials`、`.aws`、`.kube/config`、`shadow`。
65
+
66
+ ### 3.3 策略覆盖(只能加严)
67
+
68
+ 优先级从低到高:
69
+
70
+ ```
71
+ DEFAULT_POLICY
72
+ → <FH_HOME>/policy.json 全局策略
73
+ → <FH_HOME>/tenants/<租户>/policy.json 租户策略
74
+ → FH_POLICY 内联 JSON 临时覆盖(CI / 调试)
75
+ ```
76
+
77
+ **黑名单取并集**——下级配置只能新增禁止项,无法删除上级的禁止项。这条设计确保"租户自定义策略"永远不能成为提权通道。
78
+
79
+ `policy.json` 示例:
80
+
81
+ ```json
82
+ {
83
+ "roles": {
84
+ "developer": { "maxCostUsd": 0.25, "approvalTools": ["run_shell", "write_file"] }
85
+ },
86
+ "denyShell": ["npm publish", "docker push", "kubectl delete"],
87
+ "denyPaths": ["config/secrets", "deploy/prod"],
88
+ "tenantDailyBudgetUsd": 20
89
+ }
90
+ ```
91
+
92
+ ### 3.4 审批通道
93
+
94
+ | 环境 | 行为 |
95
+ | --- | --- |
96
+ | TTY 交互终端 | 逐条弹出 `y/n`,用户显式批准才执行 |
97
+ | 非交互(CI / 管道 / 守护进程) | 回退白名单审批器:命中 `FH_SHELL_ALLOW` 自动通过,其余拒绝并留痕 |
98
+
99
+ > **守卫是唯一权威闸门**:策略判定、审批、审计在工具执行前一次性完成,工具层不会二次弹审批,杜绝重复询问与决策打架。
100
+
101
+ ---
102
+
103
+ ## 四、审计与取证
104
+
105
+ ### 4.1 存储
106
+
107
+ ```
108
+ <FH_HOME>/tenants/<租户>/audit/audit-YYYY-MM.jsonl
109
+ ```
110
+
111
+ append-only、按月切分、同步写入(不缓冲,进程崩溃不丢记录)。
112
+
113
+ ### 4.2 记录结构
114
+
115
+ ```json
116
+ {
117
+ "seq": 2,
118
+ "ts": "2026-08-10T06:41:43.118Z",
119
+ "tenantId": "acme",
120
+ "userId": "wuchihong",
121
+ "role": "developer",
122
+ "runId": "2d1e3188-...",
123
+ "action": "tool:write_file",
124
+ "resource": "demo-output.txt",
125
+ "decision": "allow",
126
+ "reason": "rbac.allow — 角色 developer 允许调用 write_file",
127
+ "prevHash": "…",
128
+ "hash": "…"
129
+ }
130
+ ```
131
+
132
+ `decision` 取值:`allow` / `deny` / `approved`(人工批准)/ `rejected`(人工拒绝或无审批通道)/ `info`(会话起止等)。
133
+
134
+ 覆盖动作:`session:start`、`session:end`、`session:rollback`、`skill:goal`、`quota:block`、`tool:<工具名>`。
135
+
136
+ ### 4.3 防篡改验证
137
+
138
+ ```bash
139
+ fhcode audit verify
140
+ ```
141
+
142
+ 链式校验三件事:**seq 连续**(防删除/插入)、**prevHash 衔接**(防重排)、**hash 自洽**(防内容改写)。任一失败会定位到具体条目:
143
+
144
+ ```
145
+ ❌ 审计链校验失败:共 5 条,断点在第 3 条
146
+ 记录内容被篡改:hash 不自洽(期望 8b3a6990664e…)
147
+ ```
148
+
149
+ 退出码为 `2`,可直接接入监控告警:
150
+
151
+ ```bash
152
+ fhcode audit verify || alertmanager-cli fire --name fhcode-audit-tampered
153
+ ```
154
+
155
+ ### 4.4 脱敏
156
+
157
+ `resource` / `reason` 写入前统一脱敏:`apiKey=` / `secret=` / `token=` / `password=` / `Authorization: Bearer` 的值替换为 `***`,`sk-xxxxx` 形态密钥替换为 `sk-***`。**审计日志本身不会成为泄密源**。
158
+
159
+ > 合规提示:审计目录建议单独挂载只读快照卷或定期归档至 WORM 存储;哈希链只能证明"是否被改",不能阻止有权限者删除整个文件,物理保全仍需存储层配合。
160
+
161
+ ---
162
+
163
+ ## 五、多租户
164
+
165
+ ### 5.1 目录布局
166
+
167
+ ```
168
+ <FH_HOME>/
169
+ ├── policy.json 全局策略(可选)
170
+ └── tenants/
171
+ ├── acme/
172
+ │ ├── sessions/ 会话检查点 + 事件日志
173
+ │ ├── audit/ 审计链
174
+ │ ├── goals/ /goal 产物
175
+ │ └── policy.json 租户策略(可选)
176
+ └── beta/
177
+ └── …
178
+ ```
179
+
180
+ `sessions` / `resume` / `diff` / `rollback` / `audit` / `goal` 全部在当前租户目录内操作,**跨租户不可见**。
181
+
182
+ ### 5.2 用量汇总
183
+
184
+ ```bash
185
+ $ fhcode tenants
186
+ 租户用量汇总:
187
+ 租户ID 会话数 累计成本 审计条数 最近活跃
188
+ beta 1 $ 0.000000 3 2026-08-10T06:42:00.496Z
189
+ acme 2 $ 0.420000 6 2026-08-10T06:41:59.599Z
190
+ ```
191
+
192
+ 统计不反序列化整份对话(仅正则提取 `costUsd` / `updatedAt`),万级会话下依然秒回。
193
+
194
+ ### 5.3 升级兼容
195
+
196
+ 默认租户(`default`)在 `tenants/default` 尚未创建、而旧版 `<FH_HOME>/sessions` 存在时,会自动继续使用旧目录——**从 M3 升级到 M4 不丢历史会话**。
197
+
198
+ ### 5.4 部署形态建议
199
+
200
+ | 形态 | 做法 | 适用 |
201
+ | --- | --- | --- |
202
+ | 单机多租户 | 同一 `FH_HOME`,靠 `FH_TENANT` 分目录 | 内部多团队 |
203
+ | 容器一租户一实例 | 每租户独立容器 + 独立卷,`FH_TENANT` 与卷同名 | 对隔离要求高 / 对外服务 |
204
+ | CI 每次任务一租户 | `FH_TENANT=ci-${{ github.run_id }}` | 流水线可追溯,任务间零串扰 |
205
+
206
+ ---
207
+
208
+ ## 六、成本治理
209
+
210
+ | 层级 | 配置 | 行为 |
211
+ | --- | --- | --- |
212
+ | 单任务 | 角色 `maxCostUsd` | 达到上限立即中止本次任务,检查点保留,可调高后 `resume` 续跑 |
213
+ | 租户日预算 | `FH_TENANT_BUDGET_USD` 或策略 `tenantDailyBudgetUsd` | 任务**启动前** fail-fast(`QUOTA_EXCEEDED`),不产生任何模型调用费用 |
214
+
215
+ 统计口径:该租户 `sessions` 目录下 `updatedAt` 为当天(UTC)的检查点 `costUsd` 之和。拒绝时同步写入 `quota:block` 审计记录。
216
+
217
+ ```bash
218
+ $ FH_TENANT_BUDGET_USD=0.30 fhcode "超预算任务"
219
+ [飞虹 Code] 运行失败 (QUOTA_EXCEEDED): 租户 acme 今日成本 $0.420000 已达上限 $0.3,任务被拒绝。
220
+ ```
221
+
222
+ ---
223
+
224
+ ## 七、CI 集成
225
+
226
+ `.github/workflows/ci.yml` 三条流水线,**全程离线、零 Secrets**,fork PR 也能安全跑完:
227
+
228
+ | Job | 内容 |
229
+ | --- | --- |
230
+ | `build` | Node 18 / 20 / 22 矩阵 → typecheck → 编译 → 离线端到端 → `/plan` `/grill` |
231
+ | `enterprise` | `scripts/verify-m4.mjs` 41 项断言 + CLI 企业命令冒烟 + **租户隔离断言**(beta 租户读不到其它租户会话即通过) |
232
+ | `security` | `npm pack --dry-run` 白名单校验(`.env`/`src`/`policy.json` 出现即失败)+ 仓库明文密钥扫描 + `npm audit` |
233
+
234
+ 本地一条命令跑齐:
235
+
236
+ ```bash
237
+ npm run verify # typecheck + build + M4 断言套件
238
+ ```
239
+
240
+ ### 断言覆盖(41 项)
241
+
242
+ 1. RBAC 角色矩阵(5 项)
243
+ 2. deny 优先危险动作(4 项)
244
+ 3. 策略文件覆盖与"只能加严"(4 项)
245
+ 4. 审计哈希链:写入 / 校验 / 脱敏 / 篡改定位 / 删除检测(7 项)
246
+ 5. 守卫接入工具链:拦截、放行、审批一次、危险命令批准也拒(11 项)
247
+ 6. 多租户:非法 ID、目录隔离、用量统计、不串台(7 项)
248
+ 7. 配额:当日统计、超限、充足(3 项)
249
+
250
+ ---
251
+
252
+ ## 八、上线检查清单
253
+
254
+ - [ ] `FH_HOME` 指向持久卷,`tenants/` 已纳入备份策略
255
+ - [ ] `FH_TENANT` / `FH_USER` / `FH_ROLE` 由上游身份系统注入,不由用户自填
256
+ - [ ] 生产角色最小化:默认 `developer`,`admin` 仅限平台管理员
257
+ - [ ] `policy.json` 已按业务补充禁止项(如 `kubectl delete`、生产配置目录)
258
+ - [ ] `FH_TENANT_BUDGET_USD` 已设置,避免失控消耗
259
+ - [ ] `FH_SHELL_ALLOW` 仅包含确需免审批的命令(建议 `git,npm,node,ls,cat`)
260
+ - [ ] 定时任务执行 `fhcode audit verify`,失败即告警
261
+ - [ ] 审计目录已归档至只读 / WORM 存储
262
+ - [ ] `.env` 未入库(`git check-ignore .env` 应有输出)
263
+ - [ ] 发布前执行 `npm pack --dry-run` 确认无密钥与源码泄漏
264
+
265
+ ---
266
+
267
+ © 2026 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
@@ -0,0 +1,358 @@
1
+ # 飞虹 Code(fhcode)使用说明书
2
+
3
+ > 本文为飞虹 Code 的**权威用户文档**,面向使用者与运维人员。技术细节见《技术说明书》。
4
+ > 版本 0.1.0(稳定版,含 M4 企业能力 + M5 Web 控制台 BETA + M6 自我进化 + M7 编程能力 + M8 自主迭代)。
5
+
6
+ **署名**:晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
7
+
8
+ ---
9
+
10
+ ## 1. 产品简介
11
+
12
+ 飞虹 Code(`fhcode`)是终端 AI 编程智能体。给它一个"目标",它会自动规划、调用工具、反思并完成;支持多子代理并行、会话恢复与审计。企业版额外提供权限管控、防篡改审计、多租户隔离与成本治理,并可通过 Web 控制台可视化运维。
13
+
14
+ ---
15
+
16
+ ## 2. 安装
17
+
18
+ ### 环境要求
19
+ - Node.js **≥ 18**(推荐 20 LTS)
20
+ - 操作系统:Windows / macOS / Linux
21
+
22
+ ### 方式一:npm 全局安装(推荐)
23
+ ```bash
24
+ npm install -g feihong-code
25
+ fhcode --help
26
+ ```
27
+
28
+ ### 方式二:源码构建
29
+ ```bash
30
+ git clone <repo> && cd feihong-code
31
+ npm install
32
+ npm run build
33
+ node dist/cli/index.js --help
34
+ ```
35
+
36
+ ### 方式三:Docker(稳定部署推荐)
37
+ ```bash
38
+ docker build -t feihong-code .
39
+ docker run -p 8080:8080 -e FH_WEB_TOKEN=你的强随机令牌 feihong-code serve
40
+ # 或一键编排:
41
+ FH_WEB_TOKEN=你的强随机令牌 docker compose up -d
42
+ ```
43
+
44
+ ### 方式四:安装脚本
45
+ ```bash
46
+ ./install.sh
47
+ ```
48
+
49
+ ---
50
+
51
+ ## 3. 快速上手
52
+
53
+ ### 第一条目标(离线可用)
54
+ ```bash
55
+ fhcode "创建一个说明文件 README-demo.md,写一句话介绍本项目"
56
+ ```
57
+ 未配置模型时自动进入**离线模式**(用本地 mock 完成闭环,成本恒为 0),适合体验与 CI。
58
+
59
+ ### 接入真实模型
60
+ 在项目根目录创建 `.env`(已被 gitignore,不会入库):
61
+ ```
62
+ FH_API_KEY=sk-你的密钥
63
+ FH_MODEL=你的模型名
64
+ FH_BASE_URL=https://你的模型网关
65
+ ```
66
+ 真实模式会按用量计量成本;密钥仅存 `.env`,日志中一律脱敏。
67
+
68
+ ---
69
+
70
+ ## 4. 命令总览
71
+
72
+ | 命令 | 说明 |
73
+ |------|------|
74
+ | `fhcode "目标"` | 运行单条目标 |
75
+ | `fhcode /plan "需求"` | 生成实现规划 |
76
+ | `fhcode /grill <路径>` | 代码评审 |
77
+ | `fhcode /goal` | 目标模式 |
78
+ | `fhcode sessions` | 列出会话检查点 |
79
+ | `fhcode resume <id>` | 断点续跑 |
80
+ | `fhcode diff [id]` | 会话作用域 diff |
81
+ | `fhcode rollback <id> [--yes]` | 回滚被改文件(需确认) |
82
+ | `fhcode whoami` | 身份与用量 |
83
+ | `fhcode policy` | 权限矩阵 |
84
+ | `fhcode audit [--limit N]` | 审计链(脱敏) |
85
+ | `fhcode audit verify` | 校验审计完整性 |
86
+ | `fhcode tenants` | 租户用量汇总 |
87
+ | `fhcode serve [--port 8080]` | 启动 Web 控制台(BETA) |
88
+ | `fhcode model-stats` | 查看模型性能统计(M6) |
89
+ | `fhcode experiences [路径]` | 列出经验库(M6) |
90
+ | `fhcode code-write "<目标>"` | 自主编写代码(M8) |
91
+ | `fhcode quality-gate [路径]` | 质量门禁审查(M8) |
92
+ | `fhcode self-improve` | 自我改进统计(M8) |
93
+ | `fhcode swe "<目标>"` | 全自动软件工程 Agent(M9):读仓库→拆解→实现+验证+自愈→报告 |
94
+
95
+ ---
96
+
97
+ ## 5. 核心工作流
98
+
99
+ ### 5.1 目标运行
100
+ ```bash
101
+ fhcode "为登录页增加手机号校验,并补充单元测试"
102
+ ```
103
+ 智能体将规划、编码、自检,最终给出答案与改动文件清单。
104
+
105
+ ### 5.2 规划与评审
106
+ ```bash
107
+ fhcode /plan "实现支付回调验签"
108
+ fhcode /grill src/payment/
109
+ ```
110
+
111
+ ### 5.3 会话恢复与审计(M3)
112
+ 任务中断后可续跑,不丢进度:
113
+ ```bash
114
+ fhcode sessions # 看有哪些检查点
115
+ fhcode resume <id> # 从断点继续
116
+ fhcode diff <id> # 本次会话改了哪些文件
117
+ fhcode rollback <id> # 回滚(未确认/非 git 仓库一律拒绝,防误删)
118
+ ```
119
+
120
+ ---
121
+
122
+ ## 6. 企业版使用(M4)
123
+
124
+ ### 6.1 启用企业模式
125
+ 默认在注入 guard 时启用;可用 `FH_ENTERPRISE=false` 关闭回到社区版。
126
+
127
+ ### 6.2 身份与用量
128
+ ```bash
129
+ export FH_TENANT=acme
130
+ export FH_USER=alice
131
+ export FH_ROLE=developer
132
+ fhcode whoami
133
+ ```
134
+ 输出当前租户、用户、角色、隔离目录与今日成本/预算。
135
+
136
+ ### 6.3 权限矩阵查看
137
+ ```bash
138
+ fhcode policy
139
+ ```
140
+ 展示四角色(viewer/developer/operator/admin)的工具权限、危险命令与敏感路径黑名单。
141
+
142
+ ### 6.4 审计与取证
143
+ ```bash
144
+ fhcode audit --limit 20 # 最近 20 条(脱敏)
145
+ fhcode audit verify # 校验哈希链是否被篡改,定位断点
146
+ ```
147
+
148
+ ### 6.5 多租户
149
+ ```bash
150
+ fhcode tenants # 所有租户用量汇总(物理目录隔离,互不串台)
151
+ ```
152
+ 数据落在 `<FH_HOME>/tenants/<tenantId>/`,租户 ID 经正则校验防穿越。
153
+
154
+ ### 6.6 成本治理
155
+ - 单任务成本超限会**熔断**(终止并给答案)。
156
+ - 租户日预算 `FH_TENANT_BUDGET_USD` 超限会**拒绝新任务**(HTTP 429 语义)并记入审计 `quota:block`。
157
+
158
+ ---
159
+
160
+ ## 7. Web 控制台(M5 BETA)
161
+
162
+ > 仅观测、不执行,保持 guard 权威。
163
+
164
+ ### 启动
165
+ ```bash
166
+ export FH_WEB_TOKEN=你的强随机令牌
167
+ fhcode serve --port 8080
168
+ ```
169
+ 浏览器访问 `http://localhost:8080` 即可看到仪表盘(租户总览 / 策略矩阵 / 审计浏览+verify / 会话列表 / 配额进度条)。
170
+
171
+ ### 鉴权
172
+ 所有 `/api/*` 需 `Authorization: Bearer <FH_WEB_TOKEN>`;未设或错误令牌一律 401(fail-closed)。生产环境务必用强随机令牌并通过环境变量注入,勿用默认值。
173
+
174
+ ### 端点速查
175
+ `/api/health`、`/api/tenants`、`/api/whoami`、`/api/policy`、`/api/audit`、`/api/audit/verify`、`/api/sessions`、`/api/quota`。
176
+
177
+ ---
178
+
179
+ ## 8. 自我进化能力(M6)
180
+
181
+ ### 模型性能统计
182
+ ```bash
183
+ fhcode model-stats
184
+ ```
185
+ 查看各模型提供商的成功率、延迟、成本等性能指标,辅助模型路由决策。
186
+
187
+ ### 经验库管理
188
+ ```bash
189
+ fhcode experiences [路径]
190
+ ```
191
+ 列出系统积累的经验记录,包括高效工具调用模式、错误规避模式等。指定路径可查看自定义经验库。
192
+
193
+ ---
194
+
195
+ ## 9. 自主编程能力(M8)
196
+
197
+ ### 自主编写代码
198
+ ```bash
199
+ fhcode code-write "<目标描述>"
200
+ ```
201
+ 启动自主编写流程:规划→编写→测试生成→审查→修复→总结,全程自动化完成代码迭代。
202
+
203
+ ### 质量门禁审查
204
+ ```bash
205
+ fhcode quality-gate [路径]
206
+ ```
207
+ 对指定目录进行质量门禁审查,包括安全审查、代码质量分析、测试覆盖检查,输出标准化报告。
208
+
209
+ ### 自我改进统计
210
+ ```bash
211
+ fhcode self-improve
212
+ ```
213
+ 查看系统自我改进的统计信息,包括反思次数、成功率、平均耗时等指标。
214
+
215
+ ---
216
+
217
+ ## 9.1 全自动软件工程 Agent(M9)
218
+
219
+ 对标业界"全自动软件工程 Agent":读取整个(大型)代码仓库 → 任务拆解规划 → 修改代码 → 执行命令、跑测试 → 验证结果,自主完成长链路开发。
220
+
221
+ **核心四阶段(由 `src/agent/swe-agent.ts` 主编排):**
222
+
223
+ 1. **仓库读取(repo-reader)**:扫描整个仓库(支持大型仓库,含文件数/体积限流与 `.gitignore` 解析),产出语言分布、关键文件、测试/构建命令、目录树与上下文串。
224
+ 2. **任务拆解(swe-planner)**:把目标拆解为有序、可独立验证的子任务(勘察→实现/修复/重构→测试→构建验证),每个子任务携带目标文件、验收标准、验证命令。
225
+ 3. **实现 + 验证(逐任务闭环)**:每个子任务委托 Orchestrator(ReAct + 工具系统 + 自愈)实现;随后自动跑构建与测试验证;**验证失败则把错误摘要注入下一轮实现,自我修复重试(最多 `--max-retries` 次)**。
226
+ 4. **报告(SweReport)**:汇总每个子任务状态、改动文件、验证结果,给出 overall(success/partial/failed)。
227
+
228
+ **命令用法:**
229
+ ```bash
230
+ # 全自动执行:读当前仓库 → 拆解 → 实现+验证+自愈 → 报告
231
+ fhcode swe "新增用户登录接口并补充测试"
232
+
233
+ # 指定仓库路径
234
+ fhcode swe "重构工具模块" --repo /path/to/repo
235
+
236
+ # 仅规划,不执行(适合先 review 计划)
237
+ fhcode swe "重构工具模块" --plan-only
238
+
239
+ # 仅跑验证,不实现(适合 CI 质量门禁)
240
+ fhcode swe "检查构建与测试" --verify-only
241
+
242
+ # 限制子任务数与自愈重试次数
243
+ fhcode swe "实现新功能" --max-tasks 6 --max-retries 3
244
+
245
+ # 限制每个子任务的模型推理轮数(真实模型建议 4~8,控制成本与耗时)
246
+ fhcode swe "实现新功能" --max-iterations 6
247
+ ```
248
+
249
+ **说明:**
250
+ - 离线(`FH_OFFLINE=true` 或无任何模型配置)时,实现阶段由脚本化 Mock 驱动闭环,验证阶段跑真实构建/测试命令,可完整演示长链路。
251
+ - 接入真实模型后,实现阶段的读/写/编辑/执行命令均由大模型自主决策。
252
+ - `--plan-only` 与 `--verify-only` 非常适合在 CI 中分别做"计划评审"与"质量门禁"。
253
+ - 真实模型接入方式见第 10 章《配置指南》;可用 `node scripts/verify-m9-real.mjs` 做"真实 HTTP provider 全链路"离线实测(不依赖任何外部模型)。
254
+
255
+ ---
256
+
257
+ ## 10. 配置指南
258
+
259
+ ### 真实模型接入(三种优先级,从高到低)
260
+
261
+ **方式一:环境变量 `FH_PROVIDERS`(JSON 数组,最完整,可配多个供应商)**
262
+ ```bash
263
+ export FH_PROVIDERS='[{"id":"deepseek","type":"openai-compatible","baseURL":"https://api.deepseek.com/v1","model":"deepseek-chat","apiKey":"sk-xxxx","tags":["code-gen","reasoning"]}]'
264
+ ```
265
+
266
+ **方式二:配置文件 `fhcode.config.json`(项目根或 FH_HOME 下)**
267
+ ```json
268
+ {
269
+ "models": {
270
+ "providers": [
271
+ { "id": "local", "type": "ollama", "baseURL": "http://localhost:11434", "model": "qwen2.5-coder:1.5b", "tags": ["code-gen","reasoning","local"] }
272
+ ]
273
+ }
274
+ }
275
+ ```
276
+
277
+ **方式三:单环境变量快速接入(无需写 JSON)**
278
+ ```bash
279
+ export FH_MODEL_NAME=qwen2.5-coder:1.5b
280
+ export FH_MODEL_TYPE=ollama # 或 openai-compatible
281
+ export FH_MODEL_BASE_URL=http://localhost:11434
282
+ export FH_MODEL_API_KEY= # openai-compatible 必填
283
+ export FH_MODEL_TAGS=code-gen,reasoning
284
+ ```
285
+
286
+ > 供应商类型:`ollama`(本地,零成本,数据不出机)或 `openai-compatible`(DeepSeek / 通义 / OpenRouter 等 OpenAI 协议接口)。
287
+ > 标签必须含 `code-gen`,编排器才会把代码任务路由给它。网络可通 `api.deepseek.com`(需自备密钥)。
288
+
289
+ ### 常用环境变量
290
+ | 变量 | 作用 |
291
+ |------|------|
292
+ | `FH_HOME` | 数据根目录 |
293
+ | `FH_ENTERPRISE` | 企业模式(`false` 关) |
294
+ | `FH_TENANT` / `FH_USER` / `FH_ROLE` | 租户/用户/角色 |
295
+ | `FH_TENANT_BUDGET_USD` | 租户日预算 |
296
+ | `FH_POLICY` | 策略 JSON 覆盖片段 |
297
+ | `FH_WEB_PORT` / `FH_WEB_TOKEN` | Web 控制台端口/令牌 |
298
+ | `FH_OFFLINE` | 强制离线(`true` 时忽略所有模型配置,使用 Mock) |
299
+ | `FH_PROVIDERS` | 供应商 JSON 数组(方式一) |
300
+ | `FH_CONFIG` | 指定配置文件路径 |
301
+ | `FH_MODEL_NAME` / `FH_MODEL_TYPE` / `FH_MODEL_BASE_URL` / `FH_MODEL_API_KEY` / `FH_MODEL_TAGS` | 单环境变量快速接入(方式三) |
302
+ | `FH_MODEL_STRATEGY` | 路由策略(`cost`/`capability`/`latency`,默认 `cost`) |
303
+ | `FH_BUDGET_USD` | 单任务成本告警阈值 |
304
+
305
+ ---
306
+
307
+ ## 9. 常见问题与故障排查
308
+
309
+ **Q1. 离线模式能做什么?**
310
+ 不请求模型,用本地 mock 完成闭环,适合体验、CI 与无网环境;成本恒为 0。
311
+
312
+ **Q2. 危险命令被拒怎么办?**
313
+ `rm -rf /`、`.env` 写入等命中黑名单会被直接拒绝(admin 也拦)。确属必要的运维操作请走受控流程,不要绕过 guard。
314
+
315
+ **Q3. 配额超限(QUOTA_EXCEEDED)?**
316
+ 当日租户成本超过 `FH_TENANT_BUDGET_USD`。调高预算或次日再跑;`whoami` 可看已用/上限。
317
+
318
+ **Q4. 审计校验失败(brokenAt)?**
319
+ `audit verify` 返回断点行号,说明审计链在该处不连续或被篡改。检查该时间段的操作记录与文件权限。
320
+
321
+ **Q5. 租户互相看得到会话?**
322
+ 不应发生。物理目录隔离 + ID 正则校验保障隔离;`tenants` 与 `sessions` 按租户作用域,CI 已做隔离断言。
323
+
324
+ **Q6. 想关掉企业能力?**
325
+ `FH_ENTERPRISE=false`,行为退回社区版(M3),无感降级。
326
+
327
+ **Q7. Web 控制台起不来 / 401?**
328
+ 确认 `FH_WEB_TOKEN` 已设置且请求带 `Authorization: Bearer`;端口被占用换 `--port`。
329
+
330
+ **Q8. 构建/编译被安全软件拦截?**
331
+ 本地 Windows 下 `tsc` 编译可能被 Defender 实时扫描短暂锁文件。属环境限制非代码问题;CI(GitHub Actions)是权威构建来源。
332
+
333
+ **Q9. M8 自主编写功能如何使用?**
334
+ 通过 `fhcode code-write` 命令启动,系统会自动完成规划、编写、测试、审查、修复全流程。可使用 `quality-gate` 进行质量门禁检查。
335
+
336
+ **Q10. 如何查看自我进化数据?**
337
+ 使用 `model-stats` 查看模型性能统计,使用 `experiences` 查看经验库,使用 `self-improve` 查看改进统计。
338
+
339
+ ---
340
+
341
+ ## 11. 安全与合规须知
342
+
343
+ - 密钥仅存 `.env`(gitignore),不回显、不入库、日志脱敏。
344
+ - 危险操作与敏感路径受 deny 优先策略保护;审批通道缺失即拒绝。
345
+ - Web 控制台仅观测不执行,且 fail-closed 鉴权。
346
+ - 发布包经白名单校验,`.env`/`src`/`.workbuddy` 不随 `npm publish` 泄露。
347
+ - 审计链可验证、防篡改,满足合规取证基本要求。
348
+
349
+ ---
350
+
351
+ ## 12. 署名与版权
352
+
353
+ - **公司**:晋江市飞虹智科技企业管理有限公司
354
+ - **中心**:飞扬企源研发中心
355
+ - **负责人**:吴赐虹
356
+ - **许可证**:MIT
357
+
358
+ *本文档与《技术说明书》共同构成飞虹 Code 稳定版(0.1.0)权威文档集。*