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,196 @@
1
+ # 飞虹 Code 用户手册
2
+
3
+ > 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
4
+
5
+ 本手册面向**使用者**,讲解每个命令、工具与安全机制,并给出最佳实践。开发向内容见《架构与 API》《配置参考》。
6
+
7
+ ---
8
+
9
+ ## 1. 安装与初始化
10
+
11
+ ```bash
12
+ git clone https://github.com/wch887292/feihong-code.git
13
+ cd feihong-code && npm install && npm run build
14
+ cp .env.example .env # 然后编辑填入 FH_PROVIDERS
15
+ ```
16
+
17
+ - 未配置 `FH_PROVIDERS` → 自动**离线模式**(内置 Mock 闭环,零成本)。
18
+ - 已配置 `FH_PROVIDERS` → **真实模型模式**。
19
+ - 环境变量可从 `.env` 自动加载(仅注入未设置的键),也可直接 `export`。
20
+
21
+ ---
22
+
23
+ ## 2. 命令详解
24
+
25
+ ### 2.1 单命令模式
26
+
27
+ ```bash
28
+ fhcode "把 src/utils 的日期格式化抽成独立模块并补测试"
29
+ ```
30
+
31
+ 一次需求一次执行。编排器按 ReAct 循环:勘察 → 改码 → 测试/构建验证 → 总结。结束后打印最终结果、迭代次数、成本与日志路径。
32
+
33
+ ### 2.2 交互 REPL
34
+
35
+ ```bash
36
+ fhcode # 进入 REPL
37
+ 飞虹> 给登录页加一个表单校验
38
+ 飞虹> exit # 退出
39
+ ```
40
+
41
+ 逐条输入需求,每条独立执行一次编排。适合探索式开发。
42
+
43
+ ### 2.3 多子代理并行 `--parallel`
44
+
45
+ ```bash
46
+ fhcode --parallel "实现登录模块并且添加用户管理并且写集成测试"
47
+ ```
48
+
49
+ - **分解**:按中文并列连词(`并且/同时/分别/以及` 等)拆分为多个子任务。
50
+ - **隔离**:为每个子任务创建独立的 `git worktree`(独立目录 + 独立分支),子代理只在自己的 worktree 内读写,互不干扰。
51
+ - **并发**:`Promise.allSettled` 并发执行;单子任务失败不影响其他。
52
+ - **清理**:结束后强制移除所有 worktree,子代理产物不进入主仓库。
53
+ - ⚠️ 真实模式下会并发调用 API,免费套餐易触发 429 限流(见 FAQ)。
54
+
55
+ ### 2.4 只读技能(不修改任何文件)
56
+
57
+ | 命令 | 作用 | 示例 |
58
+ | --- | --- | --- |
59
+ | `/plan` | 生成结构化实现计划 | `fhcode /plan "实现登录并且添加支付"` |
60
+ | `/grill` | 红队式代码审查(密钥/注入/穿越/校验/待办) | `fhcode /grill src` |
61
+ | `/goal` | 分解并保存高层目标到 `~/.feihong-code/goals` | `fhcode /goal "搭建体系并且完善文档"` |
62
+
63
+ 三者均为只读,可放心在任何仓库运行。
64
+
65
+ ### 2.5 版本与帮助
66
+
67
+ ```bash
68
+ fhcode --version # 或 -v:版本 + 署名
69
+ fhcode --help # 或 -h:完整用法
70
+ ```
71
+
72
+ ### 2.6 恢复与审计(M3)
73
+
74
+ 每次任务都会把完整对话、迭代计数、成本、被改动文件落盘为会话检查点(`<runId>.session.json`),可随时恢复与审计。
75
+
76
+ | 命令 | 作用 | 示例 |
77
+ | --- | --- | --- |
78
+ | `sessions` | 列出历史会话(状态 / 迭代 / 成本 / 文件数 / 更新时间) | `fhcode sessions` |
79
+ | `resume <id>` | 从检查点重建对话并续跑中断任务(支持 8 位前缀) | `fhcode resume 6f7f734f` |
80
+ | `diff [<id>]` | 展示会话作用域变更;省略 id 则显示当前工作区全量 diff | `fhcode diff 6f7f734f` |
81
+ | `rollback <id> [--yes]` | 回滚会话产生的改动(**危险,必须 `--yes` 确认**) | `fhcode rollback 6f7f734f --yes` |
82
+
83
+ **resume 适用场景**:进程崩溃、手动中断、达到最大迭代仍无结果。续跑会接着已有对话继续 ReAct 循环,直到产出最终答案,新过程仍写入同一 `runId` 的事件日志,审计连续。
84
+
85
+ **diff / rollback 安全边界**:
86
+ - 仅作用于本会话 `touchedFiles`(被 `write_file`/`edit_file` 创建或修改的文件),绝不整仓回滚。
87
+ - `diff` 对已跟踪文件走 `git diff`,未跟踪文件走 `git diff --no-index` 展示新增内容。
88
+ - `rollback` 对已跟踪文件 `git checkout --`,未跟踪文件直接删除;**未确认(`--yes`)或非 git 仓库时一律拒绝执行**,避免误删。
89
+
90
+ ### 2.7 企业能力(M4)
91
+
92
+ 企业模式默认开启(受 `FH_ENTERPRISE` 控制,设 `false` 即退回社区版无感行为)。开启后提供四类能力:
93
+
94
+ | 命令 | 作用 | 示例 |
95
+ | --- | --- | --- |
96
+ | `whoami` | 查看当前租户 / 用户 / 角色 / 隔离目录 / 当日成本 | `fhcode whoami` |
97
+ | `policy` | 渲染当前生效的策略矩阵(角色-工具、配额、黑名单) | `fhcode policy` |
98
+ | `audit [--limit N]` | 查看审计链(脱敏后),`--limit` 控制条数 | `fhcode audit --limit 20` |
99
+ | `audit verify` | 校验审计哈希链完整性,定位被篡改断点 | `fhcode audit verify` |
100
+ | `tenants` | 列出所有租户及各自用量(成本/会话数,互不串台) | `fhcode tenants` |
101
+
102
+ **权限(RBAC)**:四角色 `viewer / developer / operator / admin`,判定顺序 **deny 优先**:
103
+
104
+ 1. `run_shell` 命中危险命令(如 `rm -rf /`、`mkfs`、`curl|sh` 等 23 条)→ 直接拒绝;
105
+ 2. 访问敏感路径(`.env`、`.ssh`、`id_rsa`、`.git/config` 等 11 类)或越界沙箱 → 直接拒绝(**admin 也拦**);
106
+ 3. 角色矩阵判定:deny / 需审批(approval)/ 允许;
107
+ 4. shell 白名单命中的命令免审批。
108
+
109
+ **多租户隔离**:数据按 `<FH_HOME>/tenants/<tenantId>/{sessions,audit,goals}` 物理目录隔离,租户 ID 强制正则 `^[A-Za-z0-9._-]{1,64}$` 校验防穿越;未指定租户时兼容旧版 `<FH_HOME>/sessions`。
110
+
111
+ **成本治理**:单任务 `maxCostUsd` 熔断(达上限即终止并给结论)+ 租户日预算 `FH_TENANT_BUDGET_USD` fail-fast(任务启动前拦截,超限返回 `QUOTA_EXCEEDED`)。
112
+
113
+ **审计**:每次工具执行前由「守卫(guard)」一次性完成 *策略判定→人工审批→审计留痕*,写入按月切分的 `audit-YYYY-MM.jsonl`,采用 **sha256 哈希链(防篡改)**,敏感字段自动脱敏。可用 `audit verify` 检验链完整性。
114
+
115
+ ---
116
+
117
+ ## 3. 工具系统
118
+
119
+ 智能体在真实模式下可调用以下 8 个工具(离线模式用 Mock 模拟):
120
+
121
+ | 工具 | 用途 | 关键参数 | 安全约束 |
122
+ | --- | --- | --- | --- |
123
+ | `read_file` | 读文件 | `path` | 沙箱内 |
124
+ | `write_file` | 写/覆盖文件 | `path`, `content` | 沙箱内,自动建父目录 |
125
+ | `edit_file` | 精确替换 | `path`, `oldText`, `newText` | 沙箱内 |
126
+ | `list_dir` | 列目录 | `path`(可选) | 沙箱内 |
127
+ | `grep` | 递归搜索 | `pattern`, `path`(可选) | 忽略 node_modules/.git |
128
+ | `run_shell` | 执行命令 | `command` | **白名单 + 审批** |
129
+ | `run_tests` | 跑测试 | `command`(默认 `npm test`) | 同 run_shell 调度 |
130
+ | `build_check` | 构建校验 | `command`(默认 `npm run build`) | 同 run_shell 调度 |
131
+
132
+ 所有工具入参经 zod 校验,异常归一为 `ToolError`,不会让进程崩溃。
133
+
134
+ ---
135
+
136
+ ## 4. 审批与安全模型
137
+
138
+ - **路径沙箱**:任何文件操作只允许在 `cwd`(当前目录或子代理 worktree)内,越界(`../` 等)直接拒绝。
139
+ - **Shell 白名单**:`run_shell` 仅当命令首词(如 `git`、`npm`)命中 `FH_SHELL_ALLOW` 才放行;否则直接拒绝。
140
+ - **默认审批器**(非交互 CLI):命中白名单者自动通过;未命中者拒绝并写日志。若设置 `FH_REQUIRE_APPROVAL=false` 则完全放开(不推荐)。
141
+ - **交互式审批(M3)**:当运行在 TTY 终端时,危险操作(如 `run_shell`、写文件)会**逐条弹出 `y/n` 确认**,须用户显式批准才执行;非 TTY(CI / 管道)自动回退到上述白名单审批器。
142
+ - **密钥脱敏**:日志中 `apikey/secret/token/...` 字段值一律 `[REDACTED]`;企业审计日志亦对 `apiKey=/secret=/sk-*` 等做 `***` 替换。
143
+ - **`.env` 不入库**:`gitignore` + `package.json` 的 `files` 白名单双重保障。
144
+ - **企业权限(M4)**:四角色 RBAC + deny 优先矩阵,危险命令/敏感路径在角色判定前即拦截(含 admin)。未注入企业 guard 时行为同社区版,可用 `FH_ENTERPRISE=false` 关闭。
145
+ - **防篡改审计(M4)**:工具执行前由守卫统一留痕,审计日志按月切分并以 sha256 哈希链串联,任意篡改均会被 `audit verify` 定位断点。
146
+ - **多租户隔离(M4)**:租户数据按物理目录隔离,ID 正则防穿越,成本与审计互不串台。
147
+ - **成本熔断(M4)**:单任务成本上限 + 租户日预算双重熔断,超限直接拒绝不静默放行。
148
+
149
+ ---
150
+
151
+ ## 5. 真实模型接入(示例)
152
+
153
+ 已验证可用的 Agnes 网关配置(写入 `.env`):
154
+
155
+ ```bash
156
+ FH_PROVIDERS='[{"id":"agnes","type":"openai-compatible","baseURL":"https://api.agnes-ai.cn/v1","apiKey":"<你的key>","model":"agnes-2.5-flash","tags":["code-gen"],"costPer1k":0.001}]'
157
+ FH_MODEL_STRATEGY=cost
158
+ FH_SHELL_ALLOW=git,npm,node,ls,cat
159
+ FH_REQUIRE_APPROVAL=true
160
+ ```
161
+
162
+ 更多供应商(DeepSeek / 通义 / Ollama)见《配置参考》。
163
+
164
+ ---
165
+
166
+ ## 6. 最佳实践
167
+
168
+ 1. **先只读探查**:大改前先 `/grill src` 看风险、`/plan "..."` 看方案。
169
+ 2. **注意 cwd**:真实模式下 `cwd = 当前目录`,文件写入/命令执行都作用于此。建议从**干净目录**或**专用仓库**运行,避免误改。
170
+ 3. **并行用隔离**:多模块任务优先 `--parallel`,物理隔离最安全。
171
+ 4. **白名单最小化**:`FH_SHELL_ALLOW` 只放确实需要的命令。
172
+ 5. **离线先验证**:CI 或演示用 `FH_OFFLINE=true`,零成本且确定性强。
173
+ 6. **看日志**:每次运行生成 `~/.feihong-code/sessions/<runId>.jsonl`,排错首选。
174
+
175
+ ---
176
+
177
+ ## 7. 典型工作流
178
+
179
+ ```
180
+ # 1) 评估现状(只读)
181
+ fhcode /grill src
182
+ fhcode /plan "重构配置模块并且补集成测试"
183
+
184
+ # 2) 并行推进(隔离)
185
+ fhcode --parallel "重构配置模块并且补集成测试"
186
+
187
+ # 3) 单点精修(真实改码)
188
+ fhcode "把配置校验抽到 config.ts 并补单测"
189
+
190
+ # 4) 目标跟踪
191
+ fhcode /goal "Q3 完成模块化与测试覆盖率 80%"
192
+ ```
193
+
194
+ ---
195
+
196
+ © 2026 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
@@ -0,0 +1,165 @@
1
+ # 飞虹 Code 部署指南
2
+
3
+ > 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
4
+
5
+ 覆盖:环境要求、源码/全局安装、Docker、CI、npm 发布、内网部署。
6
+
7
+ ---
8
+
9
+ ## 1. 环境要求
10
+
11
+ - **Node.js >= 18**(CI 与 Docker 均使用 18)。
12
+ - **Git**:`--parallel` 依赖 `git worktree` 隔离,必须可用(Docker 镜像已内置)。
13
+ - 仅需运行时依赖 `zod`(dev 依赖 typescript/tsx 仅构建期需要)。
14
+
15
+ ---
16
+
17
+ ## 2. 从源码部署
18
+
19
+ ```bash
20
+ git clone https://github.com/wch887292/feihong-code.git
21
+ cd feihong-code
22
+ npm install
23
+ npm run build
24
+ node dist/cli/index.js --version
25
+ ```
26
+
27
+ 或直接用脚本:`bash install.sh`(自动 install + build + 全局安装)。
28
+
29
+ ---
30
+
31
+ ## 3. 全局安装
32
+
33
+ ```bash
34
+ npm install -g . # 从本地源码装为全局命令 fhcode
35
+ fhcode --version
36
+ ```
37
+
38
+ 发布到 npm 后:`npm install -g feihong-code`。
39
+
40
+ ---
41
+
42
+ ## 4. Docker 部署
43
+
44
+ ```bash
45
+ docker build -t feihong-code .
46
+ ```
47
+
48
+ 运行(离线):
49
+
50
+ ```bash
51
+ docker run --rm feihong-code --version
52
+ ```
53
+
54
+ 运行(真实模型,挂载密钥与日志):
55
+
56
+ ```bash
57
+ docker run --rm \
58
+ -v "$PWD/.env:/app/.env" \
59
+ -v feihong-data:/data/feihong-code \
60
+ feihong-code "把 src/utils 的日期格式化抽成独立模块并补测试"
61
+ ```
62
+
63
+ - 镜像为多阶段构建:构建期装全依赖编译 `dist`,运行期仅 `npm install --omit=dev` + 复制 `dist`。
64
+ - 运行期已 `apk add git`,支持 `--parallel` 的 worktree 隔离。
65
+ - `FH_HOME` 默认 `/data/feihong-code`,建议挂载为卷以持久化目标与日志。
66
+
67
+ ---
68
+
69
+ ## 5. CI / CD(M4 三流水线)
70
+
71
+ `.github/workflows/ci.yml` 在 `push`/`pull_request` 触发,**全离线、零 Secrets**,fork PR 安全。分为三个 job:
72
+
73
+ ### 5.1 `build` — 构建与离线闭环
74
+
75
+ - Node 18 / 20 / 22 矩阵;
76
+ - `npm run typecheck` → `npm run build`;
77
+ - 离线冒烟:`FH_OFFLINE=true fhcode "..."`;只读技能 `/plan` `/grill` 校验;
78
+ - 目的:保证多版本 Node 下可构建、社区闭环可跑。
79
+
80
+ ### 5.2 `enterprise` — 企业能力断言
81
+
82
+ - 运行 `npm run verify:m4`(`scripts/verify-m4.mjs`,**41 项全离线断言**):
83
+ - RBAC 矩阵(5) / deny 优先(4) / 策略覆盖(4) / 审计哈希链(7) / 守卫链路(11) / 多租户(7) / 配额(3);
84
+ - CLI 冒烟:`whoami` / `policy` / `audit` / `audit verify` / `tenants`;
85
+ - **租户隔离断言**:用 `beta` 租户执行任务后,断言其 `sessions` 读不到 `acme` 租户会话(物理目录互不串台)。
86
+
87
+ ### 5.3 `security` — 发布安全
88
+
89
+ - `npm pack --dry-run` 白名单校验:禁止 `.env` / `src` / `policy.json` / `.workbuddy` 进入产物;
90
+ - 仓库明文密钥扫描(`git grep` 规则集):杜绝 accidental secret 入库;
91
+ - `npm audit`:依赖漏洞检查。
92
+
93
+ > 本地完整校验:`npm run verify`(= typecheck + build + verify:m4)。
94
+
95
+ - **企业模式不触碰密钥**:CI 仅做离线冒烟、企业断言与发布安全,**绝不**读取或回显任何 API key。
96
+ - 真实联调建议在本地或带加密 secret 的受控环境执行,切勿把密钥明文写入 CI 日志。
97
+
98
+ ---
99
+
100
+ ## 5.1 企业合规部署建议(M4)
101
+
102
+ - **多租户物理隔离**:为每个客户/团队分配独立 `FH_TENANT`,数据落 `<FH_HOME>/tenants/<tenantId>/`,互不串台。
103
+ - **最小角色**:日常运行用 `developer`;仅可信运维用 `operator`/`admin`;只读巡检用 `viewer`。
104
+ - **日预算硬上限**:为每个租户设 `FH_TENANT_BUDGET_USD`,超限即 `QUOTA_EXCEEDED` 拒绝,防成本失控。
105
+ - **审计留存**:`audit-YYYY-MM.jsonl` 建议只读挂载或异地备份,并周期性 `fhcode audit verify` 巡检哈希链完整性。
106
+ - **关闭企业模式**:纯社区/单机使用可设 `FH_ENTERPRISE=false`,行为与 M3 一致、零额外开销。
107
+
108
+ ---
109
+
110
+ ## 6. 发布到 npm
111
+
112
+ `package.json` 已做好发布安全:
113
+
114
+ - `files` 白名单:`dist` + `README.md` + `LICENSE` + `CONTRIBUTING.md` + `docs`(**绝不**包含 `.env` / `src` / `.workbuddy`)。
115
+ - `prepublishOnly`: `npm run build`(发布前自动构建,保证 `dist` 最新)。
116
+ - `.npmignore` 作为冗余保险。
117
+
118
+ 发布步骤:
119
+
120
+ ```bash
121
+ npm run build
122
+ npm version patch # 或 minor/major
123
+ npm publish # 仅携带 files 白名单内容
124
+ ```
125
+
126
+ > ⚠️ **密钥安全铁律**:`.env` 含 API key,已被 `.gitignore` 与 `files` 白名单双重排除,永远不会进入 npm 包或 Git 仓库。
127
+
128
+ ---
129
+
130
+ ## 7. 内网 / 离线部署建议
131
+
132
+ - **完全离线**:不配 `FH_PROVIDERS`,用内置 Mock 闭环(演示/回归)。
133
+ - **本地模型**:配 Ollama 供应商(`type: ollama`,`baseURL: http://<内网IP>:11434`),数据不出本机。
134
+ - **代理网关**:OpenAI 兼容供应商的 `baseURL` 可指向企业内网网关。
135
+ - **日志合规**:`FH_LOG_DIR` 指向受控存储,按敏感数据留存策略管理。
136
+
137
+ ---
138
+
139
+ ## 8. 作为后台服务(可选 systemd)
140
+
141
+ ```ini
142
+ [Unit]
143
+ Description=飞虹 Code Agent
144
+ After=network.target
145
+
146
+ [Service]
147
+ WorkingDirectory=/opt/feihong-code
148
+ ExecStart=/usr/bin/fhcode "守护型需求"
149
+ Environment=FH_HOME=/var/lib/feihong-code
150
+ Restart=on-failure
151
+
152
+ [Install]
153
+ WantedBy=multi-user.target
154
+ ```
155
+
156
+ ---
157
+
158
+ ## 9. 升级与回滚
159
+
160
+ - 升级:`git pull && npm install && npm run build`(或 `npm update -g feihong-code`)。
161
+ - 回滚:npm 包使用 `npm install -g feihong-code@<旧版本>`;源码用 `git checkout <tag>` 后重建。
162
+
163
+ ---
164
+
165
+ © 2026 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
@@ -0,0 +1,127 @@
1
+ # 飞虹 Code 配置参考
2
+
3
+ > 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
4
+
5
+ 所有配置通过**环境变量**提供,启动时集中校验(fail-fast)。`.env` 文件会被自动加载(仅注入未设置的键),但**切勿提交 `.env`**。
6
+
7
+ ---
8
+
9
+ ## 1. 环境变量总览
10
+
11
+ | 变量 | 必填 | 说明 | 默认 |
12
+ | --- | --- | --- | --- |
13
+ | `FH_HOME` | 否 | 应用主目录(目标/日志根) | `~/.feihong-code` |
14
+ | `FH_LOG_DIR` | 否 | 会话事件日志目录 | `~/.feihong-code/sessions` |
15
+ | `FH_PROVIDERS` | 否* | 模型供应商 JSON 数组;为空则离线 | `[]` |
16
+ | `FH_MODEL_STRATEGY` | 否 | 路由策略 | `cost` |
17
+ | `FH_BUDGET_USD` | 否 | 单任务预算(美元,超限仅告警) | `0.5` |
18
+ | `FH_SHELL_ALLOW` | 否 | shell 白名单(逗号分隔) | 空 |
19
+ | `FH_REQUIRE_APPROVAL` | 否 | 危险操作是否需审批 | `true` |
20
+ | `FH_OFFLINE` | 否 | 设为 `true` 强制离线 | 未设 |
21
+ | `FH_ENTERPRISE` | 否 | 企业模式开关;`false` 退回社区版无感行为 | `true` |
22
+ | `FH_TENANT` | 否 | 租户 ID(正则 `^[A-Za-z0-9._-]{1,64}$`),触发多租户物理目录隔离 | 未设(默认租户) |
23
+ | `FH_USER` | 否 | 当前用户标识(写入审计与租户上下文) | 未设 |
24
+ | `FH_ROLE` | 否 | 角色:`viewer` / `developer` / `operator` / `admin` | `developer` |
25
+ | `FH_TENANT_BUDGET_USD` | 否 | 租户当日成本预算(USD),超限拒绝新任务(fail-fast) | 未设(取策略角色上限) |
26
+ | `FH_POLICY` | 否 | 策略覆盖 JSON(仅能加严:黑名单取并集),优先级高于内置与文件策略 | 未设 |
27
+
28
+ > *`FH_PROVIDERS` 缺省或 `[]` → 自动离线(Mock 闭环);非空 → 真实模式。
29
+
30
+ ---
31
+
32
+ ## 2. FH_PROVIDERS 结构
33
+
34
+ JSON 数组,每项一个供应商:
35
+
36
+ | 字段 | 类型 | 必填 | 说明 |
37
+ | --- | --- | --- | --- |
38
+ | `id` | string | ✅ | 唯一标识(用于日志/路由) |
39
+ | `type` | `"openai-compatible"` \| `"ollama"` | ✅ | 供应商类型 |
40
+ | `baseURL` | string | ✅ | API 基地址(不含末尾斜杠会被规范化) |
41
+ | `apiKey` | string | 否 | OpenAI 兼容网关的 Bearer Token;Ollama 留空 |
42
+ | `model` | string | 否 | 模型名(openai-compatible 必填;Ollama 指定本地模型) |
43
+ | `tags` | `CapabilityTag[]` | ✅ | 能力标签,用于路由筛选 |
44
+ | `costPer1k` | number | 否 | 每千 token 成本(USD),用于成本计量与 `cost` 策略 |
45
+
46
+ ### CapabilityTag 枚举
47
+
48
+ `code-gen` · `reasoning` · `long-context` · `vision` · `cheap` · `local`
49
+
50
+ 编排器调用时默认带 `['code-gen']` 标签筛选;路由按策略对命中供应商打分选优。
51
+
52
+ ---
53
+
54
+ ## 3. 路由策略(FH_MODEL_STRATEGY)
55
+
56
+ | 策略 | 选优逻辑 |
57
+ | --- | --- |
58
+ | `cost` | 优先 `costPer1k` 最低(默认,省钱) |
59
+ | `capability` | 优先 `reasoning` + `code-gen` 标签命中 |
60
+ | `latency` | 优先 `local`(Ollama 等本地模型) |
61
+
62
+ 多供应商时按策略排序,调用失败时**自动 fallback** 到下一个。
63
+
64
+ ---
65
+
66
+ ## 4. 供应商示例
67
+
68
+ ### 4.1 OpenAI 兼容(Agnes,已验证)
69
+
70
+ ```json
71
+ [{"id":"agnes","type":"openai-compatible","baseURL":"https://api.agnes-ai.cn/v1","apiKey":"<key>","model":"agnes-2.5-flash","tags":["code-gen"],"costPer1k":0.001}]
72
+ ```
73
+
74
+ ### 4.2 DeepSeek
75
+
76
+ ```json
77
+ [{"id":"deepseek","type":"openai-compatible","baseURL":"https://api.deepseek.com/v1","apiKey":"sk-xxx","model":"deepseek-chat","tags":["code-gen","cheap"],"costPer1k":0.0001}]
78
+ ```
79
+
80
+ ### 4.3 通义千问(DashScope 兼容模式)
81
+
82
+ ```json
83
+ [{"id":"qwen","type":"openai-compatible","baseURL":"https://dashscope.aliyuncs.com/compatible-mode/v1","apiKey":"sk-xxx","model":"qwen-plus","tags":["code-gen","long-context"],"costPer1k":0.0002}]
84
+ ```
85
+
86
+ ### 4.4 Ollama(本地,零成本)
87
+
88
+ ```json
89
+ [{"id":"ollama","type":"ollama","baseURL":"http://localhost:11434","apiKey":"","model":"qwen2.5-coder:7b","tags":["code-gen","local"],"costPer1k":0}]
90
+ ```
91
+
92
+ ### 4.5 多供应商(路由 + fallback)
93
+
94
+ ```json
95
+ [
96
+ {"id":"deepseek","type":"openai-compatible","baseURL":"https://api.deepseek.com/v1","apiKey":"sk-xxx","model":"deepseek-chat","tags":["code-gen","cheap"],"costPer1k":0.0001},
97
+ {"id":"ollama","type":"ollama","baseURL":"http://localhost:11434","apiKey":"","model":"qwen2.5-coder:7b","tags":["code-gen","local"],"costPer1k":0}
98
+ ]
99
+ ```
100
+
101
+ ---
102
+
103
+ ## 5. 成本计量
104
+
105
+ - 每次 `chat` 返回 `usage`(prompt/completion/total tokens),按 `costPer1k` 估算 `costUsd`。
106
+ - 累加进任务总成本,打印在结果中。
107
+ - 超过 `FH_BUDGET_USD` 仅**告警日志**,不阻断(避免半途中断)。
108
+ - 离线模式成本为 `0`。
109
+
110
+ ---
111
+
112
+ ## 6. 安全配置建议
113
+
114
+ 1. `FH_SHELL_ALLOW` 遵循**最小权限**:只放确实需要的命令(如 `git,npm,node`)。
115
+ 2. 保持 `FH_REQUIRE_APPROVAL=true`;仅在完全可信的隔离环境才设 `false`。
116
+ 3. `.env` 权限设为仅本人可读:`chmod 600 .env`。
117
+ 4. 不要把 `.env` 提交到 Git(已被 `.gitignore` 排除)。
118
+ 5. 日志目录(`FH_LOG_DIR`)可能含任务上下文,按敏感数据处理。
119
+ 6. **企业模式(M4)**:`FH_ENTERPRISE` 默认开启;若仅作社区使用,设 `false` 即完全关闭 RBAC / 审计 / 租户隔离,行为与 M3 一致。
120
+ 7. **租户隔离(M4)**:生产部署务必为每个客户/团队设置独立 `FH_TENANT`;租户 ID 仅允许 `A-Za-z0-9._-`(1–64 位),任何非常规字符都会被拒绝以防目录穿越。
121
+ 8. **日预算(M4)**:`FH_TENANT_BUDGET_USD` 是硬上限,超限时新任务直接返回 `QUOTA_EXCEEDED`(HTTP 429 语义),不会静默放行;单任务 `maxCostUsd` 由策略角色上限控制,达上限即熔断并给出结论。
122
+ 9. **策略覆盖(M4)**:通过 `FH_POLICY` 或 `<FH_HOME>/policy.json`、`<租户>/policy.json` 注入的覆盖只能**加严**不能放宽——危险命令/敏感路径黑名单取并集,角色权限取交集,确保安全基线不被削弱。
123
+ 10. **审计留存(M4)**:`audit-YYYY-MM.jsonl` 为防篡改哈希链,建议只读挂载或异地备份;`audit verify` 可周期性巡检完整性。
124
+
125
+ ---
126
+
127
+ © 2026 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
package/package.json ADDED
@@ -0,0 +1,83 @@
1
+ {
2
+ "name": "feihong-code",
3
+ "version": "0.2.1",
4
+ "description": "飞虹 Code — 终端 AI 编程智能体(对标 Muse Code),支持多模型路由、企业级 RBAC/审计、全自动 SWE Agent",
5
+ "bin": {
6
+ "fhcode": "dist/cli/index.js"
7
+ },
8
+ "main": "dist/cli/index.js",
9
+ "files": [
10
+ "dist",
11
+ "README.md",
12
+ "CHANGELOG.md",
13
+ "LICENSE",
14
+ "CONTRIBUTING.md",
15
+ "CODE_OF_CONDUCT.md",
16
+ "AGENT-GUIDE.md",
17
+ "tool-schema.json",
18
+ "docs",
19
+ ".github"
20
+ ],
21
+ "scripts": {
22
+ "build": "tsc && node scripts/copy-web.cjs",
23
+ "start": "node dist/cli/index.js",
24
+ "dev": "tsx src/cli/index.ts",
25
+ "typecheck": "tsc --noEmit",
26
+ "verify:m4": "node scripts/verify-m4.mjs",
27
+ "test": "tsx --test tests/unit/*.test.ts",
28
+ "verify": "npm run typecheck && npm run build && npm run verify:m4",
29
+ "prepublishOnly": "npm run build"
30
+ },
31
+ "keywords": [
32
+ "ai",
33
+ "agent",
34
+ "ai-agent",
35
+ "coding",
36
+ "cli",
37
+ "llm",
38
+ "large-language-model",
39
+ "muse-code",
40
+ "autonomous-agent",
41
+ "swe-agent",
42
+ "software-engineering",
43
+ "deepseek",
44
+ "ollama",
45
+ "openai",
46
+ "typescript",
47
+ "rbac",
48
+ "enterprise",
49
+ "multi-tenant",
50
+ "code-generation",
51
+ "test-generation"
52
+ ],
53
+ "author": "吴赐虹 <wch887292@gmail.com>",
54
+ "license": "MIT",
55
+ "repository": {
56
+ "type": "git",
57
+ "url": "https://gitcode.com/gcw_YuRlTP0G/feihong-code.git"
58
+ },
59
+ "homepage": "https://gitcode.com/gcw_YuRlTP0G/feihong-code#readme",
60
+ "bugs": {
61
+ "url": "https://gitcode.com/gcw_YuRlTP0G/feihong-code/issues"
62
+ },
63
+ "engines": {
64
+ "node": ">=18.0.0"
65
+ },
66
+ "funding": {
67
+ "type": "github",
68
+ "url": "https://github.com/sponsors/wch887292"
69
+ },
70
+ "devDependencies": {
71
+ "@types/express": "^4.17.21",
72
+ "@types/node": "^26.2.0",
73
+ "tsx": "^4.19.2",
74
+ "typescript": "^5.6.3"
75
+ },
76
+ "dependencies": {
77
+ "express": "^4.21.2",
78
+ "zod": "^4.4.3"
79
+ },
80
+ "publishConfig": {
81
+ "registry": "https://registry.npmjs.org/"
82
+ }
83
+ }