flavor-code 1.3.23 → 1.4.0-beta.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 (134) hide show
  1. package/README.md +437 -434
  2. package/README.zh-CN.md +434 -431
  3. package/dist/{app-NTEUPJKJ.js → app-C5ZQUOKJ.js} +43 -155
  4. package/dist/astgraph/grammars.mjs +68 -68
  5. package/dist/astgraph/vendor/tree-sitter.js +3980 -3980
  6. package/dist/astgraph/vendor/zod/LICENSE +21 -21
  7. package/dist/astgraph/vendor/zod/index.js +4 -4
  8. package/dist/astgraph/vendor/zod/locales/index.js +1 -1
  9. package/dist/astgraph/vendor/zod/locales/package.json +7 -7
  10. package/dist/astgraph/vendor/zod/package.json +135 -135
  11. package/dist/astgraph/vendor/zod/v4/classic/checks.js +1 -1
  12. package/dist/astgraph/vendor/zod/v4/classic/coerce.js +17 -17
  13. package/dist/astgraph/vendor/zod/v4/classic/compat.js +31 -31
  14. package/dist/astgraph/vendor/zod/v4/classic/errors.js +48 -48
  15. package/dist/astgraph/vendor/zod/v4/classic/external.js +20 -20
  16. package/dist/astgraph/vendor/zod/v4/classic/from-json-schema.js +599 -599
  17. package/dist/astgraph/vendor/zod/v4/classic/index.js +4 -4
  18. package/dist/astgraph/vendor/zod/v4/classic/iso.js +30 -30
  19. package/dist/astgraph/vendor/zod/v4/classic/package.json +7 -7
  20. package/dist/astgraph/vendor/zod/v4/classic/parse.js +15 -15
  21. package/dist/astgraph/vendor/zod/v4/classic/schemas.js +1395 -1395
  22. package/dist/astgraph/vendor/zod/v4/core/api.js +1087 -1087
  23. package/dist/astgraph/vendor/zod/v4/core/checks.js +575 -575
  24. package/dist/astgraph/vendor/zod/v4/core/core.js +78 -78
  25. package/dist/astgraph/vendor/zod/v4/core/doc.js +35 -35
  26. package/dist/astgraph/vendor/zod/v4/core/errors.js +185 -185
  27. package/dist/astgraph/vendor/zod/v4/core/index.js +16 -16
  28. package/dist/astgraph/vendor/zod/v4/core/json-schema-generator.js +95 -95
  29. package/dist/astgraph/vendor/zod/v4/core/json-schema-processors.js +601 -601
  30. package/dist/astgraph/vendor/zod/v4/core/json-schema.js +1 -1
  31. package/dist/astgraph/vendor/zod/v4/core/package.json +7 -7
  32. package/dist/astgraph/vendor/zod/v4/core/parse.js +93 -93
  33. package/dist/astgraph/vendor/zod/v4/core/regexes.js +139 -139
  34. package/dist/astgraph/vendor/zod/v4/core/registries.js +51 -51
  35. package/dist/astgraph/vendor/zod/v4/core/schemas.js +2239 -2239
  36. package/dist/astgraph/vendor/zod/v4/core/standard-schema.js +1 -1
  37. package/dist/astgraph/vendor/zod/v4/core/to-json-schema.js +448 -448
  38. package/dist/astgraph/vendor/zod/v4/core/util.js +674 -674
  39. package/dist/astgraph/vendor/zod/v4/core/versions.js +5 -5
  40. package/dist/astgraph/vendor/zod/v4/index.js +3 -3
  41. package/dist/astgraph/vendor/zod/v4/locales/ar.js +106 -106
  42. package/dist/astgraph/vendor/zod/v4/locales/az.js +105 -105
  43. package/dist/astgraph/vendor/zod/v4/locales/be.js +156 -156
  44. package/dist/astgraph/vendor/zod/v4/locales/bg.js +120 -120
  45. package/dist/astgraph/vendor/zod/v4/locales/ca.js +107 -107
  46. package/dist/astgraph/vendor/zod/v4/locales/cs.js +111 -111
  47. package/dist/astgraph/vendor/zod/v4/locales/da.js +115 -115
  48. package/dist/astgraph/vendor/zod/v4/locales/de.js +108 -108
  49. package/dist/astgraph/vendor/zod/v4/locales/el.js +109 -109
  50. package/dist/astgraph/vendor/zod/v4/locales/en.js +113 -113
  51. package/dist/astgraph/vendor/zod/v4/locales/eo.js +109 -109
  52. package/dist/astgraph/vendor/zod/v4/locales/es.js +132 -132
  53. package/dist/astgraph/vendor/zod/v4/locales/fa.js +114 -114
  54. package/dist/astgraph/vendor/zod/v4/locales/fi.js +112 -112
  55. package/dist/astgraph/vendor/zod/v4/locales/fr-CA.js +107 -107
  56. package/dist/astgraph/vendor/zod/v4/locales/fr.js +125 -125
  57. package/dist/astgraph/vendor/zod/v4/locales/he.js +214 -214
  58. package/dist/astgraph/vendor/zod/v4/locales/hr.js +122 -122
  59. package/dist/astgraph/vendor/zod/v4/locales/hu.js +108 -108
  60. package/dist/astgraph/vendor/zod/v4/locales/hy.js +147 -147
  61. package/dist/astgraph/vendor/zod/v4/locales/id.js +106 -106
  62. package/dist/astgraph/vendor/zod/v4/locales/index.js +52 -52
  63. package/dist/astgraph/vendor/zod/v4/locales/is.js +109 -109
  64. package/dist/astgraph/vendor/zod/v4/locales/it.js +108 -108
  65. package/dist/astgraph/vendor/zod/v4/locales/ja.js +107 -107
  66. package/dist/astgraph/vendor/zod/v4/locales/ka.js +112 -112
  67. package/dist/astgraph/vendor/zod/v4/locales/kh.js +5 -5
  68. package/dist/astgraph/vendor/zod/v4/locales/km.js +110 -110
  69. package/dist/astgraph/vendor/zod/v4/locales/ko.js +111 -111
  70. package/dist/astgraph/vendor/zod/v4/locales/lt.js +203 -203
  71. package/dist/astgraph/vendor/zod/v4/locales/mk.js +109 -109
  72. package/dist/astgraph/vendor/zod/v4/locales/ms.js +107 -107
  73. package/dist/astgraph/vendor/zod/v4/locales/nl.js +110 -110
  74. package/dist/astgraph/vendor/zod/v4/locales/no.js +108 -108
  75. package/dist/astgraph/vendor/zod/v4/locales/ota.js +109 -109
  76. package/dist/astgraph/vendor/zod/v4/locales/package.json +7 -7
  77. package/dist/astgraph/vendor/zod/v4/locales/pl.js +109 -109
  78. package/dist/astgraph/vendor/zod/v4/locales/ps.js +114 -114
  79. package/dist/astgraph/vendor/zod/v4/locales/pt.js +108 -108
  80. package/dist/astgraph/vendor/zod/v4/locales/ro.js +119 -119
  81. package/dist/astgraph/vendor/zod/v4/locales/ru.js +156 -156
  82. package/dist/astgraph/vendor/zod/v4/locales/sl.js +109 -109
  83. package/dist/astgraph/vendor/zod/v4/locales/sv.js +110 -110
  84. package/dist/astgraph/vendor/zod/v4/locales/ta.js +110 -110
  85. package/dist/astgraph/vendor/zod/v4/locales/th.js +110 -110
  86. package/dist/astgraph/vendor/zod/v4/locales/tr.js +105 -105
  87. package/dist/astgraph/vendor/zod/v4/locales/ua.js +5 -5
  88. package/dist/astgraph/vendor/zod/v4/locales/uk.js +108 -108
  89. package/dist/astgraph/vendor/zod/v4/locales/ur.js +110 -110
  90. package/dist/astgraph/vendor/zod/v4/locales/uz.js +110 -110
  91. package/dist/astgraph/vendor/zod/v4/locales/vi.js +108 -108
  92. package/dist/astgraph/vendor/zod/v4/locales/yo.js +107 -107
  93. package/dist/astgraph/vendor/zod/v4/locales/zh-CN.js +109 -109
  94. package/dist/astgraph/vendor/zod/v4/locales/zh-TW.js +107 -107
  95. package/dist/astgraph/vendor/zod/v4/mini/checks.js +1 -1
  96. package/dist/astgraph/vendor/zod/v4/mini/coerce.js +22 -22
  97. package/dist/astgraph/vendor/zod/v4/mini/external.js +14 -14
  98. package/dist/astgraph/vendor/zod/v4/mini/index.js +3 -3
  99. package/dist/astgraph/vendor/zod/v4/mini/iso.js +34 -34
  100. package/dist/astgraph/vendor/zod/v4/mini/package.json +7 -7
  101. package/dist/astgraph/vendor/zod/v4/mini/parse.js +1 -1
  102. package/dist/astgraph/vendor/zod/v4/mini/schemas.js +961 -961
  103. package/dist/astgraph/vendor/zod/v4/package.json +7 -7
  104. package/dist/{chunk-7OICVL2M.js → chunk-2BF7CVWZ.js} +0 -42
  105. package/dist/{chunk-RQTYHUMK.js → chunk-3WCDZ6ZL.js} +15 -0
  106. package/dist/{chunk-Z62P4LL7.js → chunk-6MNOZ2TX.js} +8962 -8422
  107. package/dist/{chunk-VEUSROUQ.js → chunk-FOTMP4ZS.js} +1 -1
  108. package/dist/{chunk-SUSLIHXO.js → chunk-ODRWR4KK.js} +1 -1
  109. package/dist/{chunk-RPFWB45Y.js → chunk-URUVFECH.js} +1 -1
  110. package/dist/{claude-ink-6CEG2XZZ.js → claude-ink-LP32NSX5.js} +2 -3
  111. package/dist/cli-main.js +27 -11
  112. package/dist/config/load.d.ts +2 -0
  113. package/dist/desktop/main.js +1092 -541
  114. package/dist/desktop-renderer/assets/index-Bk6FYhyh.css +1 -0
  115. package/dist/desktop-renderer/assets/{index-D75ozXnZ.js → index-CqRIr-hz.js} +3 -3
  116. package/dist/desktop-renderer/assets/{interactive-terminal-CTFo4fK9.js → interactive-terminal-C4o7MNPO.js} +1 -1
  117. package/dist/desktop-renderer/index.html +2 -2
  118. package/dist/doctor.d.ts +38 -0
  119. package/dist/execution/docker.d.ts +5 -1
  120. package/dist/execution/types.d.ts +11 -0
  121. package/dist/jobs/registry.d.ts +1 -0
  122. package/dist/{load-4FWNXE6F.js → load-V2UIYYQI.js} +1 -1
  123. package/dist/sdk/index.js +4 -4
  124. package/dist/tools/shell.d.ts +17 -12
  125. package/dist/tools/types.d.ts +1 -0
  126. package/dist/ui/commands.d.ts +1 -1
  127. package/dist/ui/session.d.ts +1 -0
  128. package/dist/update/check.d.ts +20 -0
  129. package/dist/utils/semver.d.ts +3 -0
  130. package/dist/utils/spawn-executable.d.ts +2 -0
  131. package/package.json +1 -1
  132. package//346/212/200/346/234/257/346/226/271/346/241/210/346/212/245/345/221/212.md +5848 -5848
  133. package/dist/chunk-OTYFL4AG.js +0 -16
  134. package/dist/desktop-renderer/assets/index-ZZsUx916.css +0 -1
package/README.zh-CN.md CHANGED
@@ -1,431 +1,434 @@
1
- <p align="center"><a href="./README.md">English</a> | <b><a href="./README.zh-CN.md">简体中文</a></b></p>
2
-
3
- <div align="center">
4
- <img src="./assets/icon-transparent-512.png" alt="Flavor Code Logo" width="168" />
5
- <h1>Flavor Code</h1>
6
- <p><strong>本地优先、可审计、可恢复的 AI 编程助手</strong></p>
7
- <p>在终端、Electron 桌面端和 VS Code 中读代码、改文件、运行命令并完成复杂任务。</p>
8
-
9
- <p>
10
- <a href="https://www.npmjs.com/package/flavor-code"><img alt="npm version" src="https://img.shields.io/npm/v/flavor-code?color=cb3837&logo=npm" /></a>
11
- <a href="https://github.com/YachuanWzh/flavor-code/actions/workflows/ci.yml"><img alt="CI" src="https://github.com/YachuanWzh/flavor-code/actions/workflows/ci.yml/badge.svg?branch=main" /></a>
12
- <img alt="Node.js 20+" src="https://img.shields.io/badge/Node.js-20%2B-339933?logo=nodedotjs&logoColor=white" />
13
- <a href="./LICENSE"><img alt="MIT License" src="https://img.shields.io/badge/license-MIT-blue.svg" /></a>
14
- </p>
15
-
16
- <p>
17
- <a href="#快速开始">快速开始</a> ·
18
- <a href="#核心能力">核心能力</a> ·
19
- <a href="#使用入口">使用入口</a> ·
20
- <a href="#权限与沙箱">安全</a> ·
21
- <a href="#开发">参与开发</a> ·
22
- <a href="./CHANGELOG.md">更新日志</a>
23
- </p>
24
- </div>
25
-
26
- ---
27
-
28
- Flavor Code 接入 OpenAI、Anthropic 或兼容服务,在受控工作区内使用文件、搜索、Shell、MCP 和自定义工具。复杂任务可以拆成计划和并行子任务;会话、Diff、工具调用、checkpoint 与审计记录全部保存在本地,便于恢复、复查和继续工作。
29
-
30
- ## 核心能力
31
-
32
- | | 能力 | 你得到什么 |
33
- | --- | --- | --- |
34
- | 🖥️ | **一个运行时,三个入口** | CLI、Electron 与 VS Code 共享模型配置、会话和工具能力 |
35
- | 🧭 | **复杂任务可控推进** | 任务计划、子 Agent、steering、follow-up、`/loop`、`/goal`,并行任务自动避免写冲突(拥有重叠文件的任务串行执行) |
36
- | 🏝️ | **Flavor Island 本地控制** | 宿主应用通过 token 认证的本机 IPC(Windows named pipe / Unix socket)控制运行中的会话:中止、steering、follow-up 与窗口聚焦;模型耗时、token 用量、任务摘要和交付物随 Hook 事件上报 |
37
- | ⏪ | **结果可追溯、可恢复** | 完整时间线、checkpoint、rewind、trace、Diff 和失败审计 |
38
- | 🧱 | **崩溃一致执行** | fsync 事件日志、持久 steering 队列、savepoint,非幂等工具不自动重放 |
39
- | 🧠 | **本地长期上下文** | 记忆、Skill、插件和项目指南均保存在本机 |
40
- | 🔎 | **代码图导航** | 本地 AST 代码图索引(`.flavor/astgraph/`),通过 `ast_search`/`ast_callers`/`ast_impact` 等查询精确定位符号、追踪可达性;`/explain` 结合代码图与 Git 历史,向新人讲解一个符号 |
41
- | 🌿 | **Git 原生工作流** | `/commit` 为暂存改动生成 Conventional Commits 提交信息并确认提交;`/review` 审查未提交改动;只读 `GitHistory` 工具回答“这段代码为什么是这样” |
42
- | 🎨 | **E2E 需求到交付** | 从粗需求或设计稿到可交付产品:PRD、交互原型、视觉还原、接口联调、自主验收与评分交付(仅 Electron) |
43
- | 🔁 | **有界自进化** | 重复的工具失败被捕获、去重并形成建议;修复以沙箱验证过的插件形式落地,或沉淀为注入后续提示词的 guardrail 规则,并支持运行趋势与规则管理(`/evolve`) |
44
- | 🛡️ | **明确的权限边界** | 分别控制读、写、Shell、网络和破坏性操作,也可使用 Docker |
45
-
46
- ## 快速开始
47
-
48
- > [!IMPORTANT]
49
- > CLI 需要 Node.js 20 或更高版本。Windows 桌面端也可以直接从 [Releases](https://github.com/YachuanWzh/flavor-code/releases) 下载。
50
-
51
- **1. 安装**
52
-
53
- ```bash
54
- npm install -g flavor-code
55
- ```
56
-
57
- **2. 在项目中启动**
58
-
59
- ```bash
60
- cd your-project
61
- flavor
62
- ```
63
-
64
- **3. 初始化项目上下文**
65
-
66
- 首次进入项目后运行 `/init`。Flavor 会分析语言、包管理器、源码目录和验证命令,并生成 `FLAVOR.md` 项目指南。
67
-
68
- 也可以直接执行一次性任务:
69
-
70
- ```bash
71
- flavor --print "分析这个项目并列出最值得修复的三个问题"
72
- flavor --resume
73
- flavor --resume -p "继续完成剩余工作"
74
- ```
75
-
76
- 非交互模式会拒绝需要人工审批的操作,不会悬挂等待输入。
77
-
78
- **4. 保持更新**
79
-
80
- ```bash
81
- flavor update
82
- ```
83
-
84
- Flavor 启动时会检查 npm registry,有新版本时在欢迎卡片中提示;运行 `flavor update` 即可一键升级到最新发行版,升级后重启 Flavor 生效。
85
-
86
- ## 配置模型
87
-
88
- 最快的方式是设置环境变量:
89
-
90
- ```bash
91
- # macOS / Linux
92
- export OPENAI_API_KEY="sk-..."
93
-
94
- # Windows PowerShell
95
- $env:OPENAI_API_KEY = "sk-..."
96
- ```
97
-
98
- 也可以把密钥放在项目根目录的 `.env`。
99
-
100
- <details>
101
- <summary><strong>使用 <code>.flavor/flavor.json</code> 配置多个 Provider</strong></summary>
102
-
103
- 项目配置示例:
104
-
105
- ```json
106
- {
107
- "providers": {
108
- "openai": {
109
- "type": "openai",
110
- "apiKey": "${OPENAI_API_KEY}",
111
- "defaultModel": "gpt-5",
112
- "cheapModel": "gpt-5-mini"
113
- }
114
- },
115
- "agents": {
116
- "main": { "model": "openai:gpt-5" },
117
- "subagent": { "model": "openai:gpt-5-mini" }
118
- },
119
- "permissionMode": "default",
120
- "maxSubagents": 3,
121
- "language": "zh-CN"
122
- }
123
- ```
124
-
125
- 配置按以下顺序合并,后者优先:
126
-
127
- 1. 全局 `~/.flavor-code/flavor.json`
128
- 2. 项目 `.flavor/flavor.json`
129
- 3. `.env`
130
- 4. 进程环境变量
131
-
132
- 支持的常用 Provider 类型:
133
-
134
- - `openai`:OpenAI 官方接口
135
- - `anthropic`:Anthropic 官方接口
136
- - `openai-compatible`:兼容 OpenAI 协议的服务
137
-
138
- </details>
139
-
140
- OAuth PKCE 的运行时行为与配置约定见 [PKCE 规范](./docs/specs/pkce-runtime-config.md)。完整配置字段以 [配置 Schema](./src/config/schema.ts) 为准。
141
-
142
- ## 使用入口
143
-
144
- | 入口 | 适合场景 | 启动方式 |
145
- | --- | --- | --- |
146
- | **CLI** | 日常开发、远程环境、脚本与 CI | `flavor` |
147
- | **Electron** | 可视化会话、Diff、权限和资源管理 | `npm run desktop:start` |
148
- | **VS Code / Qoder** | 编辑器上下文、诊断修复和任务控制面 | `npm run ide:install` |
149
-
150
- ### CLI
151
-
152
- 直接运行 `flavor` 后输入自然语言即可。输入 `/` 会显示内置命令、插件命令和 Skill。
153
-
154
- 常用命令:
155
-
156
- | 命令 | 作用 |
157
- | --- | --- |
158
- | `/init` | 生成或更新 `FLAVOR.md` |
159
- | `/model` | 查看或切换主/子 Agent 模型 |
160
- | `/permissions` | 切换权限模式 |
161
- | `/tasks` | 查看任务计划和子 Agent 状态 |
162
- | `/compact` | 手动压缩长会话上下文 |
163
- | `/checkpoint`、`/tree` | 保存现场、查看会话树 |
164
- | `/rewind`、`/unrevert`、`/fork` | 恢复或分叉会话 |
165
- | `/memory`、`/remember`、`/forget`、`/forget-cold` | 管理长期记忆;`/forget-cold` 清空 cold 记忆及其文件 |
166
- | `/mcp` | 查看和管理 MCP 服务 |
167
- | `/loop <goal>` | 运行带验证的自治循环 |
168
- | `/goal <objective>` | 运行规划、执行、对抗审查流程 |
169
- | `/commit [hint]` | 为暂存改动生成 Conventional Commits 提交信息,确认后提交 |
170
- | `/review [focus]` | 提交前审查未提交改动的缺陷与风险 |
171
- | `/explain <符号 \| file.ts#符号> [关注点]` | 面向新人讲解一个符号:结合代码图、真实源码与 Git 历史,歧义时弹卡片选择符号 |
172
- | `/evolve <signals\|suggest\|improve ...>` | 自进化循环:查看重复工具失败、脚手架修复插件、管理运行趋势与 guardrail 规则、验证并热重载 |
173
- | `/pals`、`/chat`、`/co-work` | 发现并协作其他本机 CLI 实例 |
174
- | `/audit` | 查看工具失败审计 |
175
-
176
- 运行中可以提交 steering 或排队 follow-up;当前模型响应结束后,任务会在安全边界处接收新指令。
177
-
178
- `/commit` 与 `/review` 使用廉价子 Agent 模型,模型不可用时优雅降级。会话 checkpoint 会标记当前 git 状态(`branch@sha`),`/tree` 可以看到每个节点对应的工作区现场。`/explain <符号>` 同样走廉价模型:它把代码图中的调用关系、符号的真实源码切片和该文件的近期提交历史组装成证据,生成面向新人的五段式讲解(做什么 / 关键实现点 / 调用关系 / 为什么这样写 / 注意事项);多个符号命中时弹出选择卡片,可方向键选择或直接输入更精确的名字;代码图未建立时提示 `/ast init`,不会抛错。
179
-
180
- #### CLI Pals 与跨项目协作
181
-
182
- 同一 Windows 或 macOS 用户下的交互式 CLI 可以通过纯本地 IPC 协作(Windows named pipe 或 Unix socket,不回退到 TCP)。先给每个窗口一个容易识别的别名:
183
-
184
- ```bash
185
- # 终端 A,位于项目 A
186
- flavor --pal-name A
187
-
188
- # 终端 B,位于项目 B
189
- flavor --pal-name B
190
- ```
191
-
192
- 常用命令:
193
-
194
- ```text
195
- /pals # 查看别名和每进程 UUID
196
- /pals --verbose # 额外显示项目路径和时间
197
- /pals rename api # 重命名当前活动实例
198
- /chat B 更新 API 和测试 # 投递给 B,并安全启动其 Agent
199
- /co-work B 先升级 B,再兼容 A # 先协商同一计划,再并行开工
200
- /co-work status [co-work-uuid]
201
- /co-work cancel <co-work-uuid> [reason]
202
- ```
203
-
204
- `/chat` 支持双向任务通信。B 空闲时,带来源标识的消息会启动正常模型回合;B 正在运行时,消息会成为 steering;已有本地提交待运行时则成为 follow-up。远端文本会转换成安全的非斜杠 prompt,因此 `/exit` 一类文本不会被当成本地命令分派。B 可以用 `/chat A ...` 回复。
205
-
206
- `/co-work` 会先让双方进入规划,等待双方接受同一个哈希计划并声明 READY;较早的 READY 意图会被保留,只有 broker 恰好一次的 START 事件才会放行并行执行。每个 Agent 只在自己的项目内工作,只接收分配给自己的任务,并提交有界的完成证据。broker 指定的集成负责人会检查所有断言,再通过 `CoWorkIntegrate` 广播 END 或 FAIL。通信使用经过认证、有大小上限的本机 IPC,不开放 TCP 监听;peer 输入不能代替本机工具审批,也不能访问另一工作区。UUID/别名路由和协议已能支持第三个活动实例;持久化成果物交换、broker 重启日志与恢复、大规模多方协调属于后续强化。详见 [CLI Pals 规范](./docs/specs/2026-08-14-cli-pals-cowork.md)。
207
-
208
- ### Electron 桌面端
209
-
210
- ```bash
211
- npm run desktop:dev # 开发模式
212
- npm run desktop:start # 构建并启动
213
- npm run desktop:pack # Windows 免安装目录
214
- npm run desktop:dist # Windows NSIS 安装包
215
- ```
216
-
217
- 桌面端可以同时保持多个项目打开,同一项目也可并行运行最多 4 个独立任务;切换项目或任务不会中止后台执行。运行中的任务显示动态活动标记;完成、失败、等待确认和异常中断会进入持久活动中心并触发系统通知,未读完成项保留蓝点。项目支持置顶、别名、关闭、定位和复制路径,任务支持搜索、重命名、置顶和归档。
218
-
219
- 使用 `Ctrl+P` 快速切换项目、`Ctrl+K` 打开命令面板、`Ctrl+N` 新建任务,标题栏支持前进/后退。异常退出后会出现恢复条。**Git 变更**视图提供逐文件 Diff、暂存、取消暂存、还原、提交及 `/review` 联动。桌面端还提供流式 Markdown、权限确认、Skill、MCP、记忆和模型管理。
220
-
221
- 侧栏的 **E2E** 模块覆盖从粗需求到可验收成果物的完整交付链路:从粗需求生成 PRD 与可交互原型(支持审阅与退回),确认后进入 D2C 视觉还原(Vue 3 / React),自动启动 Vite dev server 进行像素级对比,输出视觉还原度评分与结构化差异报告,并提供叠加、帘幕、闪烁与热力图等对比模式、SVG 标注层和按严重度排序的问题列表;视觉审阅通过后,自动生成或导入 Swagger/OpenAPI 契约以创建 Axios 封装与 Express mock 服务,随后进行自主交互验收,最终完成评分与成果物交付。
222
-
223
- ### VS Code / Qoder
224
-
225
- ```bash
226
- npm run vscode:install # 安装到 VS Code
227
- npm run qoder:install # 安装到 Qoder
228
- npm run ide:install # 自动选择已安装的 IDE
229
- ```
230
-
231
- 扩展包含 `@flavor` Chat Participant、Mission Control、Changes & Health、Time Machine、诊断修复、CodeLens、checkpoint 和 rewind。若 `flavor` 不在 `PATH`,请设置 `flavorCode.executable`。
232
-
233
- ## MCP、Skill 与插件
234
-
235
- Flavor 可以连接 stdio 或 Streamable HTTP MCP 服务。项目配置示例:
236
-
237
- <details>
238
- <summary><strong>MCP 配置与 CLI 示例</strong></summary>
239
-
240
- ```json
241
- {
242
- "mcpServers": {
243
- "docs": {
244
- "url": "https://example.com/mcp",
245
- "headers": {
246
- "Authorization": "Bearer ${MCP_TOKEN}"
247
- }
248
- }
249
- }
250
- }
251
- ```
252
-
253
- MCP 配置也可以通过 CLI 管理:
254
-
255
- ```bash
256
- flavor mcp list
257
- flavor mcp add docs --url https://example.com/mcp
258
- flavor mcp disable docs
259
- ```
260
-
261
- </details>
262
-
263
- Skill 是带有 YAML 头信息的 `SKILL.md`,放在 `.flavor/skills/<name>/` 或 `~/.flavor-code/skills/<name>/`。Flavor 会按任务渐进加载,也支持通过 `/<skill-name>` 显式调用。Skill 正文支持 `$ARGUMENTS`、`$ARGUMENTS[N]` 和 `$N` 参数占位符;运行中的组合 Skill 可以使用只读 `Skill` 工具继续加载依赖 Skill,插件限定名称(如 `superharness:test-driven-development`)会安全解析到已发现的 Skill。
264
-
265
- 插件放在 `.flavor/plugins/`,可以注册命令、工具、Hook、Skill 根目录和模型适配器。官方插件可通过插件管理器安装:`npx --yes @flavor-code/plugin-manager`。`SessionStart` 与 `UserPromptSubmit` Hook 返回的 `additionalContext` 会进入当前任务上下文,可用于注入项目级工程规则。插件加载会记录内容指纹与声明的能力。可通过嵌入 API 的 `pluginSandbox: true` 启用 Worker/vm 隔离;由于内置插件和已有插件依赖沙箱尚未代理的 Node.js API,当前兼容默认值仍为进程内运行。
266
-
267
- 加载 `flavor-island` 插件时,Flavor 会额外启动一个 Flavor Island 本地控制通道:这是一个只监听本机回环的 IPC 服务(Windows 使用 named pipe,macOS/Linux 使用 Unix socket),通过随机 token 认证。宿主应用(如 Flavor Island 桌面端)可以借此对运行中的会话执行中止、steering、follow-up 等操作,桌面端还支持把窗口带到前台(focus)。通道的地址、token 与能力列表会通过 Hook 事件上下文(`islandControlEndpoint`/`islandControlToken`/`islandControlCapabilities`)提供给宿主插件,模型调用的耗时与 token 用量、任务结束时的摘要和交付文件也会随 Hook 事件上报,方便宿主展示运行状态与结果概览。
268
-
269
- > [!WARNING]
270
- > 默认的进程内插件运行时拥有完整 Node.js 权限,只安装和启用你信任的插件。沙箱会降低环境权限,但不能让不可信指令自动变安全;目前导入 Node.js 内置模块的插件在 `pluginSandbox: true` 下仍无法加载。
271
-
272
- ## 会话、记忆与执行记录
273
-
274
- 项目运行数据集中在 `.flavor/`:
275
-
276
- ```text
277
- .flavor/
278
- ├── flavor.json # 项目配置
279
- ├── sessions/ # 会话时间线
280
- │ └── *.events.jsonl # 崩溃一致执行事件日志
281
- ├── session-assets/ # 图片附件
282
- ├── session-trees/ # 手动 /checkpoint 创建的会话分支
283
- ├── checkpoints/ # 工作区快照
284
- ├── memory/ # 长期记忆
285
- ├── traces/ # 可选执行 trace
286
- ├── audit.jsonl # 工具失败审计
287
- ├── evolve/ # 自进化信号与运行评估记录
288
- ├── skills/ # 项目 Skill
289
- └── plugins/ # 项目插件
290
- ```
291
-
292
- 长期记忆会区分用户偏好、行为反馈、项目约定和外部引用。自动提取只保存高置信候选,并提供确认、忽略和删除入口;密钥、Token、原始工具输出和模型猜测会被拒绝。
293
-
294
- 图片提示支持 PNG、JPEG 和 WebP,单图最大 5 MiB、每次最多 5 张。桌面端支持选择或拖放;CLI 剪贴板图片目前支持 Windows 和 macOS。
295
-
296
- ## 权限与沙箱
297
-
298
- | 模式 | 行为 |
299
- | --- | --- |
300
- | `default` | 读操作自动放行,写、Shell、网络和破坏性操作按需确认 |
301
- | `acceptEdits` | 工作区写入和例行验证自动放行 |
302
- | `plan` | 只读规划,不允许修改和执行 |
303
- | `bypassPermissions` | 主 Agent 在硬安全检查后尽量自动执行 |
304
- | `auto` | 使用分类器判断,无法确定时回到人工确认 |
305
- | `bubble` | 将不确定操作冒泡给主会话审批 |
306
-
307
- 权限策略支持托管、用户、项目、本机项目和 session 五层配置。规则以 token 数组匹配,所有命中项始终采用最严格结果(`deny > ask > allow`),内置硬拒绝不可被放宽。
308
-
309
- > [!CAUTION]
310
- > 本地 Shell 仍然以当前用户身份运行。处理不可信项目时建议启用 Docker。
311
-
312
- <details>
313
- <summary><strong>Docker 执行环境示例</strong></summary>
314
-
315
- ```json
316
- {
317
- "execution": {
318
- "mode": "docker",
319
- "image": "node:24-bookworm-slim",
320
- "network": false,
321
- "memory": "2g",
322
- "cpus": 2
323
- }
324
- }
325
- ```
326
-
327
- Docker 不可用时任务会失败,不会静默回退到本机。配置文件中的敏感字段与 OAuth Token 使用本机配置密钥进行 AES-256-GCM 认证加密。
328
-
329
- </details>
330
-
331
- ## SDK、RPC 与评测
332
-
333
- <details>
334
- <summary><strong>Node.js SDK 示例</strong></summary>
335
-
336
- ```ts
337
- import { createFlavorRuntime } from "flavor-code/sdk";
338
-
339
- const runtime = await createFlavorRuntime({
340
- workspace: process.cwd(),
341
- approvalPolicy: "deny",
342
- output: console.log,
343
- });
344
-
345
- await runtime.session.start();
346
- await runtime.session.submit("修复失败的测试");
347
- await runtime.dispose();
348
- ```
349
-
350
- </details>
351
-
352
- 其他 IDE 或语言可以通过 JSONL RPC 接入:
353
-
354
- ```bash
355
- flavor --mode rpc --workspace . --trace .flavor/traces/run.jsonl
356
- ```
357
-
358
- 评测运行:
359
-
360
- ```bash
361
- flavor eval eval.json --output report.json
362
- ```
363
-
364
- RPC、trace、replay、eval、会话树与 Docker 的设计约束见 [控制面规范](./docs/specs/2026-07-29-control-plane-sandbox-vscode.md)。
365
-
366
- ## 开发
367
-
368
- ```bash
369
- npm ci
370
- npm test
371
- npm run typecheck
372
- npm run vscode:typecheck
373
- npm run build
374
- npm run smoke:install
375
- ```
376
-
377
- - TypeScript strict,目标 ES2022,Node.js 20+
378
- - Vitest 单元与集成测试
379
- - tsup 构建 CLI、SDK、Electron 主进程和 VS Code 扩展
380
- - Vite 构建 Electron renderer
381
- - CI 覆盖 Windows/macOS 与 Node 20/24
382
-
383
- 发布构建默认不生成或打包 source map。需要本地调试构建时显式开启:
384
-
385
- ```bash
386
- # macOS / Linux
387
- FLAVOR_SOURCEMAP=1 npm run build
388
-
389
- # Windows PowerShell
390
- $env:FLAVOR_SOURCEMAP = "1"
391
- npm run build
392
- ```
393
-
394
- ## 文档
395
-
396
- - [技术方案报告](./技术方案报告.md):整体架构、Agent 循环、上下文、权限、插件和安全模型
397
- - [运行时可靠性规范](./docs/specs/2026-07-26-runtime-reliability.md)
398
- - [1.3 可靠性、Prompt Cache 与验收契约](./docs/specs/2026-08-24-v1.3-reliability-contract.md)
399
- - [控制面、沙箱与 VS Code 规范](./docs/specs/2026-07-29-control-plane-sandbox-vscode.md)
400
- - [多模态图片规范](./docs/specs/2026-07-30-multimodal-image-attachments.md)
401
- - [VS Code 后续规划](./docs/specs/2026-08-01-flavor-code-vscode-next.md)
402
- - [E2E 需求到交付规范](./docs/specs/2026-08-12-e2e-requirement-to-delivery.md)
403
-
404
- ## 安全提示
405
-
406
- - 审查模型生成的代码和命令,尤其是依赖安装、脚本和删除操作。
407
- - 不要把 `.flavor/sessions/`、trace 或长期记忆当作秘密仓库。
408
- - 使用最小权限 API Key,不要提交 `.env`。
409
- - Skill 内容可能影响模型行为;沙箱插件仍需审查,显式启用的旧版进程内插件拥有完整 Node.js 权限。
410
- - 建议在版本控制下工作,并在高风险任务前创建 checkpoint。
411
-
412
- ## 参与贡献
413
-
414
- 欢迎提交 Issue 和 Pull Request。提交前请至少运行:
415
-
416
- ```bash
417
- npm test
418
- npm run typecheck
419
- npm run vscode:typecheck
420
- npm run build
421
- ```
422
-
423
- 架构改动建议先阅读 [技术方案报告](./技术方案报告.md) 和相关 [设计规范](./docs/specs/)。
424
-
425
- ## License
426
-
427
- [MIT](./LICENSE)
428
-
429
- <p align="center">
430
- Made with 🌶️ by Flavor Code contributors.
431
- </p>
1
+ <p align="center"><a href="./README.md">English</a> | <b><a href="./README.zh-CN.md">简体中文</a></b></p>
2
+
3
+ <div align="center">
4
+ <img src="./assets/icon-transparent-512.png" alt="Flavor Code Logo" width="168" />
5
+ <h1>Flavor Code</h1>
6
+ <p><strong>本地优先、可审计、可恢复的 AI 编程助手</strong></p>
7
+ <p>在终端、Electron 桌面端和 VS Code 中读代码、改文件、运行命令并完成复杂任务。</p>
8
+
9
+ <p>
10
+ <a href="https://www.npmjs.com/package/flavor-code"><img alt="npm version" src="https://img.shields.io/npm/v/flavor-code?color=cb3837&logo=npm" /></a>
11
+ <a href="https://github.com/YachuanWzh/flavor-code/actions/workflows/ci.yml"><img alt="CI" src="https://github.com/YachuanWzh/flavor-code/actions/workflows/ci.yml/badge.svg?branch=main" /></a>
12
+ <img alt="Node.js 20+" src="https://img.shields.io/badge/Node.js-20%2B-339933?logo=nodedotjs&logoColor=white" />
13
+ <a href="./LICENSE"><img alt="MIT License" src="https://img.shields.io/badge/license-MIT-blue.svg" /></a>
14
+ </p>
15
+
16
+ <p>
17
+ <a href="#快速开始">快速开始</a> ·
18
+ <a href="#核心能力">核心能力</a> ·
19
+ <a href="#使用入口">使用入口</a> ·
20
+ <a href="#权限与沙箱">安全</a> ·
21
+ <a href="#开发">参与开发</a> ·
22
+ <a href="./CHANGELOG.md">更新日志</a>
23
+ </p>
24
+ </div>
25
+
26
+ ---
27
+
28
+ Flavor Code 接入 OpenAI、Anthropic 或兼容服务,在受控工作区内使用文件、搜索、Shell、MCP 和自定义工具。复杂任务可以拆成计划和并行子任务;会话、Diff、工具调用、checkpoint 与审计记录全部保存在本地,便于恢复、复查和继续工作。
29
+
30
+ ## 核心能力
31
+
32
+ | | 能力 | 你得到什么 |
33
+ | --- | --- | --- |
34
+ | 🖥️ | **一个运行时,三个入口** | CLI、Electron 与 VS Code 共享模型配置、会话和工具能力 |
35
+ | 🧭 | **复杂任务可控推进** | 任务计划、子 Agent、steering、follow-up、`/loop`、`/goal`,并行任务自动避免写冲突(拥有重叠文件的任务串行执行) |
36
+ | 🏝️ | **Flavor Island 本地控制** | 宿主应用通过 token 认证的本机 IPC(Windows named pipe / Unix socket)控制运行中的会话:中止、steering、follow-up 与窗口聚焦;模型耗时、token 用量、任务摘要和交付物随 Hook 事件上报 |
37
+ | ⏪ | **结果可追溯、可恢复** | 完整时间线、checkpoint、rewind、trace、Diff 和失败审计 |
38
+ | 🧱 | **崩溃一致执行** | fsync 事件日志、持久 steering 队列、savepoint,非幂等工具不自动重放 |
39
+ | 🧠 | **本地长期上下文** | 记忆、Skill、插件和项目指南均保存在本机 |
40
+ | 🔎 | **代码图导航** | 本地 AST 代码图索引(`.flavor/astgraph/`),通过 `ast_search`/`ast_callers`/`ast_impact` 等查询精确定位符号、追踪可达性;`/explain` 结合代码图与 Git 历史,向新人讲解一个符号 |
41
+ | 🌿 | **Git 原生工作流** | `/commit` 为暂存改动生成 Conventional Commits 提交信息并确认提交;`/review` 审查未提交改动;只读 `GitHistory` 工具回答“这段代码为什么是这样” |
42
+ | 🎨 | **E2E 需求到交付** | 从粗需求或设计稿到可交付产品:PRD、交互原型、视觉还原、接口联调、自主验收与评分交付(仅 Electron) |
43
+ | 🔁 | **有界自进化** | 重复的工具失败被捕获、去重并形成建议;修复以沙箱验证过的插件形式落地,或沉淀为注入后续提示词的 guardrail 规则,并支持运行趋势与规则管理(`/evolve`) |
44
+ | 🛡️ | **明确的权限边界** | 分别控制读、写、Shell、网络和破坏性操作,也可使用 Docker |
45
+
46
+ ## 快速开始
47
+
48
+ > [!IMPORTANT]
49
+ > CLI 需要 Node.js 20 或更高版本。Windows 桌面端也可以直接从 [Releases](https://github.com/YachuanWzh/flavor-code/releases) 下载。
50
+
51
+ **1. 安装**
52
+
53
+ ```bash
54
+ npm install -g flavor-code
55
+ ```
56
+
57
+ **2. 在项目中启动**
58
+
59
+ ```bash
60
+ cd your-project
61
+ flavor
62
+ ```
63
+
64
+ **3. 初始化项目上下文**
65
+
66
+ 首次进入项目后运行 `/init`。Flavor 会分析语言、包管理器、源码目录和验证命令,并生成 `FLAVOR.md` 项目指南。
67
+
68
+ 也可以直接执行一次性任务:
69
+
70
+ ```bash
71
+ flavor --print "分析这个项目并列出最值得修复的三个问题"
72
+ flavor --resume
73
+ flavor --resume -p "继续完成剩余工作"
74
+ ```
75
+
76
+ 非交互模式会拒绝需要人工审批的操作,不会悬挂等待输入。
77
+
78
+ **4. 保持更新**
79
+
80
+ ```bash
81
+ flavor update
82
+ ```
83
+
84
+ Flavor 启动时会检查 npm registry,有新版本时在欢迎卡片中提示;运行 `flavor update` 即可一键升级到最新发行版,升级后重启 Flavor 生效。
85
+
86
+ 如果 Flavor 无法启动或本地工具行为异常,可在终端运行 `flavor doctor`;CLI 交互界面和桌面端可运行 `/doctor`。两个入口都会检查 Node.js、配置、Provider、Shell、ripgrep、插件目录和 npm registry;使用 `flavor doctor --json` 可生成便于提交问题的机器可读报告,报告不会输出 API Key。
87
+
88
+ ## 配置模型
89
+
90
+ 最快的方式是设置环境变量:
91
+
92
+ ```bash
93
+ # macOS / Linux
94
+ export OPENAI_API_KEY="sk-..."
95
+
96
+ # Windows PowerShell
97
+ $env:OPENAI_API_KEY = "sk-..."
98
+ ```
99
+
100
+ 也可以把密钥放在项目根目录的 `.env`。
101
+
102
+ <details>
103
+ <summary><strong>使用 <code>.flavor/flavor.json</code> 配置多个 Provider</strong></summary>
104
+
105
+ 项目配置示例:
106
+
107
+ ```json
108
+ {
109
+ "providers": {
110
+ "openai": {
111
+ "type": "openai",
112
+ "apiKey": "${OPENAI_API_KEY}",
113
+ "defaultModel": "gpt-5",
114
+ "cheapModel": "gpt-5-mini"
115
+ }
116
+ },
117
+ "agents": {
118
+ "main": { "model": "openai:gpt-5" },
119
+ "subagent": { "model": "openai:gpt-5-mini" }
120
+ },
121
+ "permissionMode": "default",
122
+ "maxSubagents": 3,
123
+ "language": "zh-CN"
124
+ }
125
+ ```
126
+
127
+ 配置按以下顺序合并,后者优先:
128
+
129
+ 1. 全局 `~/.flavor-code/flavor.json`
130
+ 2. 项目 `.flavor/flavor.json`
131
+ 3. `.env`
132
+ 4. 进程环境变量
133
+
134
+ 支持的常用 Provider 类型:
135
+
136
+ - `openai`:OpenAI 官方接口
137
+ - `anthropic`:Anthropic 官方接口
138
+ - `openai-compatible`:兼容 OpenAI 协议的服务
139
+
140
+ </details>
141
+
142
+ OAuth PKCE 的运行时行为与配置约定见 [PKCE 规范](./docs/specs/pkce-runtime-config.md)。完整配置字段以 [配置 Schema](./src/config/schema.ts) 为准。
143
+
144
+ ## 使用入口
145
+
146
+ | 入口 | 适合场景 | 启动方式 |
147
+ | --- | --- | --- |
148
+ | **CLI** | 日常开发、远程环境、脚本与 CI | `flavor` |
149
+ | **Electron** | 可视化会话、Diff、权限和资源管理 | `npm run desktop:start` |
150
+ | **VS Code / Qoder** | 编辑器上下文、诊断修复和任务控制面 | `npm run ide:install` |
151
+
152
+ ### CLI
153
+
154
+ 直接运行 `flavor` 后输入自然语言即可。输入 `/` 会显示内置命令、插件命令和 Skill。
155
+
156
+ 常用命令:
157
+
158
+ | 命令 | 作用 |
159
+ | --- | --- |
160
+ | `/init` | 生成或更新 `FLAVOR.md` |
161
+ | `/doctor` | 诊断本地运行时、配置、工具、插件和 npm 连通性 |
162
+ | `/model` | 查看或切换主/子 Agent 模型 |
163
+ | `/permissions` | 切换权限模式 |
164
+ | `/tasks` | 查看任务计划和子 Agent 状态 |
165
+ | `/compact` | 手动压缩长会话上下文 |
166
+ | `/checkpoint`、`/tree` | 保存现场、查看会话树 |
167
+ | `/rewind`、`/unrevert`、`/fork` | 恢复或分叉会话 |
168
+ | `/memory`、`/remember`、`/forget`、`/forget-cold` | 管理长期记忆;`/forget-cold` 清空 cold 记忆及其文件 |
169
+ | `/mcp` | 查看和管理 MCP 服务 |
170
+ | `/loop <goal>` | 运行带验证的自治循环 |
171
+ | `/goal <objective>` | 运行规划、执行、对抗审查流程 |
172
+ | `/commit [hint]` | 为暂存改动生成 Conventional Commits 提交信息,确认后提交 |
173
+ | `/review [focus]` | 提交前审查未提交改动的缺陷与风险 |
174
+ | `/explain <符号 \| file.ts#符号> [关注点]` | 面向新人讲解一个符号:结合代码图、真实源码与 Git 历史,歧义时弹卡片选择符号 |
175
+ | `/evolve <signals\|suggest\|improve ...>` | 自进化循环:查看重复工具失败、脚手架修复插件、管理运行趋势与 guardrail 规则、验证并热重载 |
176
+ | `/pals`、`/chat`、`/co-work` | 发现并协作其他本机 CLI 实例 |
177
+ | `/audit` | 查看工具失败审计 |
178
+
179
+ 运行中可以提交 steering 或排队 follow-up;当前模型响应结束后,任务会在安全边界处接收新指令。
180
+
181
+ `/commit` 与 `/review` 使用廉价子 Agent 模型,模型不可用时优雅降级。会话 checkpoint 会标记当前 git 状态(`branch@sha`),`/tree` 可以看到每个节点对应的工作区现场。`/explain <符号>` 同样走廉价模型:它把代码图中的调用关系、符号的真实源码切片和该文件的近期提交历史组装成证据,生成面向新人的五段式讲解(做什么 / 关键实现点 / 调用关系 / 为什么这样写 / 注意事项);多个符号命中时弹出选择卡片,可方向键选择或直接输入更精确的名字;代码图未建立时提示 `/ast init`,不会抛错。
182
+
183
+ #### CLI Pals 与跨项目协作
184
+
185
+ 同一 Windows 或 macOS 用户下的交互式 CLI 可以通过纯本地 IPC 协作(Windows named pipe 或 Unix socket,不回退到 TCP)。先给每个窗口一个容易识别的别名:
186
+
187
+ ```bash
188
+ # 终端 A,位于项目 A
189
+ flavor --pal-name A
190
+
191
+ # 终端 B,位于项目 B
192
+ flavor --pal-name B
193
+ ```
194
+
195
+ 常用命令:
196
+
197
+ ```text
198
+ /pals # 查看别名和每进程 UUID
199
+ /pals --verbose # 额外显示项目路径和时间
200
+ /pals rename api # 重命名当前活动实例
201
+ /chat B 更新 API 和测试 # 投递给 B,并安全启动其 Agent
202
+ /co-work B 先升级 B,再兼容 A # 先协商同一计划,再并行开工
203
+ /co-work status [co-work-uuid]
204
+ /co-work cancel <co-work-uuid> [reason]
205
+ ```
206
+
207
+ `/chat` 支持双向任务通信。B 空闲时,带来源标识的消息会启动正常模型回合;B 正在运行时,消息会成为 steering;已有本地提交待运行时则成为 follow-up。远端文本会转换成安全的非斜杠 prompt,因此 `/exit` 一类文本不会被当成本地命令分派。B 可以用 `/chat A ...` 回复。
208
+
209
+ `/co-work` 会先让双方进入规划,等待双方接受同一个哈希计划并声明 READY;较早的 READY 意图会被保留,只有 broker 恰好一次的 START 事件才会放行并行执行。每个 Agent 只在自己的项目内工作,只接收分配给自己的任务,并提交有界的完成证据。broker 指定的集成负责人会检查所有断言,再通过 `CoWorkIntegrate` 广播 END 或 FAIL。通信使用经过认证、有大小上限的本机 IPC,不开放 TCP 监听;peer 输入不能代替本机工具审批,也不能访问另一工作区。UUID/别名路由和协议已能支持第三个活动实例;持久化成果物交换、broker 重启日志与恢复、大规模多方协调属于后续强化。详见 [CLI Pals 规范](./docs/specs/2026-08-14-cli-pals-cowork.md)。
210
+
211
+ ### Electron 桌面端
212
+
213
+ ```bash
214
+ npm run desktop:dev # 开发模式
215
+ npm run desktop:start # 构建并启动
216
+ npm run desktop:pack # Windows 免安装目录
217
+ npm run desktop:dist # Windows NSIS 安装包
218
+ ```
219
+
220
+ 桌面端可以同时保持多个项目打开,同一项目也可并行运行最多 4 个独立任务;切换项目或任务不会中止后台执行。运行中的任务显示动态活动标记;完成、失败、等待确认和异常中断会进入持久活动中心并触发系统通知,未读完成项保留蓝点。项目支持置顶、别名、关闭、定位和复制路径,任务支持搜索、重命名、置顶和归档。
221
+
222
+ 使用 `Ctrl+P` 快速切换项目、`Ctrl+K` 打开命令面板、`Ctrl+N` 新建任务,标题栏支持前进/后退。异常退出后会出现恢复条。**Git 变更**视图提供逐文件 Diff、暂存、取消暂存、还原、提交及 `/review` 联动。桌面端还提供流式 Markdown、权限确认、Skill、MCP、记忆和模型管理。
223
+
224
+ 侧栏的 **E2E** 模块覆盖从粗需求到可验收成果物的完整交付链路:从粗需求生成 PRD 与可交互原型(支持审阅与退回),确认后进入 D2C 视觉还原(Vue 3 / React),自动启动 Vite dev server 进行像素级对比,输出视觉还原度评分与结构化差异报告,并提供叠加、帘幕、闪烁与热力图等对比模式、SVG 标注层和按严重度排序的问题列表;视觉审阅通过后,自动生成或导入 Swagger/OpenAPI 契约以创建 Axios 封装与 Express mock 服务,随后进行自主交互验收,最终完成评分与成果物交付。
225
+
226
+ ### VS Code / Qoder
227
+
228
+ ```bash
229
+ npm run vscode:install # 安装到 VS Code
230
+ npm run qoder:install # 安装到 Qoder
231
+ npm run ide:install # 自动选择已安装的 IDE
232
+ ```
233
+
234
+ 扩展包含 `@flavor` Chat Participant、Mission Control、Changes & Health、Time Machine、诊断修复、CodeLens、checkpoint 和 rewind。若 `flavor` 不在 `PATH`,请设置 `flavorCode.executable`。
235
+
236
+ ## MCP、Skill 与插件
237
+
238
+ Flavor 可以连接 stdio 或 Streamable HTTP MCP 服务。项目配置示例:
239
+
240
+ <details>
241
+ <summary><strong>MCP 配置与 CLI 示例</strong></summary>
242
+
243
+ ```json
244
+ {
245
+ "mcpServers": {
246
+ "docs": {
247
+ "url": "https://example.com/mcp",
248
+ "headers": {
249
+ "Authorization": "Bearer ${MCP_TOKEN}"
250
+ }
251
+ }
252
+ }
253
+ }
254
+ ```
255
+
256
+ MCP 配置也可以通过 CLI 管理:
257
+
258
+ ```bash
259
+ flavor mcp list
260
+ flavor mcp add docs --url https://example.com/mcp
261
+ flavor mcp disable docs
262
+ ```
263
+
264
+ </details>
265
+
266
+ Skill 是带有 YAML 头信息的 `SKILL.md`,放在 `.flavor/skills/<name>/` 或 `~/.flavor-code/skills/<name>/`。Flavor 会按任务渐进加载,也支持通过 `/<skill-name>` 显式调用。Skill 正文支持 `$ARGUMENTS`、`$ARGUMENTS[N]` 和 `$N` 参数占位符;运行中的组合 Skill 可以使用只读 `Skill` 工具继续加载依赖 Skill,插件限定名称(如 `superharness:test-driven-development`)会安全解析到已发现的 Skill。
267
+
268
+ 插件放在 `.flavor/plugins/`,可以注册命令、工具、Hook、Skill 根目录和模型适配器。官方插件可通过插件管理器安装:`npx --yes @flavor-code/plugin-manager`。`SessionStart` 与 `UserPromptSubmit` Hook 返回的 `additionalContext` 会进入当前任务上下文,可用于注入项目级工程规则。插件加载会记录内容指纹与声明的能力。可通过嵌入 API 的 `pluginSandbox: true` 启用 Worker/vm 隔离;由于内置插件和已有插件依赖沙箱尚未代理的 Node.js API,当前兼容默认值仍为进程内运行。
269
+
270
+ 加载 `flavor-island` 插件时,Flavor 会额外启动一个 Flavor Island 本地控制通道:这是一个只监听本机回环的 IPC 服务(Windows 使用 named pipe,macOS/Linux 使用 Unix socket),通过随机 token 认证。宿主应用(如 Flavor Island 桌面端)可以借此对运行中的会话执行中止、steering、follow-up 等操作,桌面端还支持把窗口带到前台(focus)。通道的地址、token 与能力列表会通过 Hook 事件上下文(`islandControlEndpoint`/`islandControlToken`/`islandControlCapabilities`)提供给宿主插件,模型调用的耗时与 token 用量、任务结束时的摘要和交付文件也会随 Hook 事件上报,方便宿主展示运行状态与结果概览。
271
+
272
+ > [!WARNING]
273
+ > 默认的进程内插件运行时拥有完整 Node.js 权限,只安装和启用你信任的插件。沙箱会降低环境权限,但不能让不可信指令自动变安全;目前导入 Node.js 内置模块的插件在 `pluginSandbox: true` 下仍无法加载。
274
+
275
+ ## 会话、记忆与执行记录
276
+
277
+ 项目运行数据集中在 `.flavor/`:
278
+
279
+ ```text
280
+ .flavor/
281
+ ├── flavor.json # 项目配置
282
+ ├── sessions/ # 会话时间线
283
+ │ └── *.events.jsonl # 崩溃一致执行事件日志
284
+ ├── session-assets/ # 图片附件
285
+ ├── session-trees/ # 手动 /checkpoint 创建的会话分支
286
+ ├── checkpoints/ # 工作区快照
287
+ ├── memory/ # 长期记忆
288
+ ├── traces/ # 可选执行 trace
289
+ ├── audit.jsonl # 工具失败审计
290
+ ├── evolve/ # 自进化信号与运行评估记录
291
+ ├── skills/ # 项目 Skill
292
+ └── plugins/ # 项目插件
293
+ ```
294
+
295
+ 长期记忆会区分用户偏好、行为反馈、项目约定和外部引用。自动提取只保存高置信候选,并提供确认、忽略和删除入口;密钥、Token、原始工具输出和模型猜测会被拒绝。
296
+
297
+ 图片提示支持 PNG、JPEG 和 WebP,单图最大 5 MiB、每次最多 5 张。桌面端支持选择或拖放;CLI 剪贴板图片目前支持 Windows 和 macOS。
298
+
299
+ ## 权限与沙箱
300
+
301
+ | 模式 | 行为 |
302
+ | --- | --- |
303
+ | `default` | 读操作自动放行,写、Shell、网络和破坏性操作按需确认 |
304
+ | `acceptEdits` | 工作区写入和例行验证自动放行 |
305
+ | `plan` | 只读规划,不允许修改和执行 |
306
+ | `bypassPermissions` | 主 Agent 在硬安全检查后尽量自动执行 |
307
+ | `auto` | 使用分类器判断,无法确定时回到人工确认 |
308
+ | `bubble` | 将不确定操作冒泡给主会话审批 |
309
+
310
+ 权限策略支持托管、用户、项目、本机项目和 session 五层配置。规则以 token 数组匹配,所有命中项始终采用最严格结果(`deny > ask > allow`),内置硬拒绝不可被放宽。
311
+
312
+ > [!CAUTION]
313
+ > 本地 Shell 仍然以当前用户身份运行。处理不可信项目时建议启用 Docker。
314
+
315
+ <details>
316
+ <summary><strong>Docker 执行环境示例</strong></summary>
317
+
318
+ ```json
319
+ {
320
+ "execution": {
321
+ "mode": "docker",
322
+ "image": "node:24-bookworm-slim",
323
+ "network": false,
324
+ "memory": "2g",
325
+ "cpus": 2
326
+ }
327
+ }
328
+ ```
329
+
330
+ Docker 不可用时任务会失败,不会静默回退到本机。配置文件中的敏感字段与 OAuth Token 使用本机配置密钥进行 AES-256-GCM 认证加密。
331
+
332
+ </details>
333
+
334
+ ## SDK、RPC 与评测
335
+
336
+ <details>
337
+ <summary><strong>Node.js SDK 示例</strong></summary>
338
+
339
+ ```ts
340
+ import { createFlavorRuntime } from "flavor-code/sdk";
341
+
342
+ const runtime = await createFlavorRuntime({
343
+ workspace: process.cwd(),
344
+ approvalPolicy: "deny",
345
+ output: console.log,
346
+ });
347
+
348
+ await runtime.session.start();
349
+ await runtime.session.submit("修复失败的测试");
350
+ await runtime.dispose();
351
+ ```
352
+
353
+ </details>
354
+
355
+ 其他 IDE 或语言可以通过 JSONL RPC 接入:
356
+
357
+ ```bash
358
+ flavor --mode rpc --workspace . --trace .flavor/traces/run.jsonl
359
+ ```
360
+
361
+ 评测运行:
362
+
363
+ ```bash
364
+ flavor eval eval.json --output report.json
365
+ ```
366
+
367
+ RPC、trace、replay、eval、会话树与 Docker 的设计约束见 [控制面规范](./docs/specs/2026-07-29-control-plane-sandbox-vscode.md)。
368
+
369
+ ## 开发
370
+
371
+ ```bash
372
+ npm ci
373
+ npm test
374
+ npm run typecheck
375
+ npm run vscode:typecheck
376
+ npm run build
377
+ npm run smoke:install
378
+ ```
379
+
380
+ - TypeScript strict,目标 ES2022,Node.js 20+
381
+ - Vitest 单元与集成测试
382
+ - tsup 构建 CLI、SDK、Electron 主进程和 VS Code 扩展
383
+ - Vite 构建 Electron renderer
384
+ - CI 覆盖 Windows/macOS 与 Node 20/24
385
+
386
+ 发布构建默认不生成或打包 source map。需要本地调试构建时显式开启:
387
+
388
+ ```bash
389
+ # macOS / Linux
390
+ FLAVOR_SOURCEMAP=1 npm run build
391
+
392
+ # Windows PowerShell
393
+ $env:FLAVOR_SOURCEMAP = "1"
394
+ npm run build
395
+ ```
396
+
397
+ ## 文档
398
+
399
+ - [技术方案报告](./技术方案报告.md):整体架构、Agent 循环、上下文、权限、插件和安全模型
400
+ - [运行时可靠性规范](./docs/specs/2026-07-26-runtime-reliability.md)
401
+ - [1.3 可靠性、Prompt Cache 与验收契约](./docs/specs/2026-08-24-v1.3-reliability-contract.md)
402
+ - [控制面、沙箱与 VS Code 规范](./docs/specs/2026-07-29-control-plane-sandbox-vscode.md)
403
+ - [多模态图片规范](./docs/specs/2026-07-30-multimodal-image-attachments.md)
404
+ - [VS Code 后续规划](./docs/specs/2026-08-01-flavor-code-vscode-next.md)
405
+ - [E2E 需求到交付规范](./docs/specs/2026-08-12-e2e-requirement-to-delivery.md)
406
+
407
+ ## 安全提示
408
+
409
+ - 审查模型生成的代码和命令,尤其是依赖安装、脚本和删除操作。
410
+ - 不要把 `.flavor/sessions/`、trace 或长期记忆当作秘密仓库。
411
+ - 使用最小权限 API Key,不要提交 `.env`。
412
+ - Skill 内容可能影响模型行为;沙箱插件仍需审查,显式启用的旧版进程内插件拥有完整 Node.js 权限。
413
+ - 建议在版本控制下工作,并在高风险任务前创建 checkpoint。
414
+
415
+ ## 参与贡献
416
+
417
+ 欢迎提交 Issue 和 Pull Request。提交前请至少运行:
418
+
419
+ ```bash
420
+ npm test
421
+ npm run typecheck
422
+ npm run vscode:typecheck
423
+ npm run build
424
+ ```
425
+
426
+ 架构改动建议先阅读 [技术方案报告](./技术方案报告.md) 和相关 [设计规范](./docs/specs/)。
427
+
428
+ ## License
429
+
430
+ [MIT](./LICENSE)
431
+
432
+ <p align="center">
433
+ Made with 🌶️ by Flavor Code contributors.
434
+ </p>