返回 CodeWhale
INSTALL.md
根目录 / docs / zh_hans / INSTALL.md
1 # 安装 Codewhale
2
3 > 英文原文:[INSTALL.md](../INSTALL.md)。
4 > 最后与英文同步日期(last synced with English revision):2026-09-29。本文按英文版当前结构(v0.10.0 安装实测版)整体重译;附录部分与英文一样,沿用上一版内容,未在 v0.10.0 上重测。
5
6 Codewhale 是一个在终端里运行的开源编码智能体(coding agent)。你交给它一个任务("修复失败的测试"、"加一个 CLI 参数"),它会读取你的仓库、编辑文件并运行命令。在默认的 **Ask**(询问)权限级别下,它会立即应用工作区内的文件编辑(并给你看 diff),但运行 shell 命令之前会先询问,所以请先提交或暂存你在意的改动。它支持多家模型提供商,默认是 **DeepSeek**。
7
8 命令是 `codewhale`。`codew` 是同一个程序的较短别名。
9
10 本指南是在一台全新的 **Ubuntu 24.04 x86_64** 机器上安装 **v0.10.0**(2026-09-22 发布)时写成的,这里描述的每条路径都实际走过。文中每条命令都运行过,输出也核对过(见[安装回执](https://github.com/codewhale-hq/Codewhale/blob/37ecdfcc49bc68a9b0d058b97c3946e62c34bd31/docs/install-report/v0.10.0-2026-09-23/RECEIPTS.md))。在那台机器上无法运行的步骤标注为 **(该虚拟机上未测试:原因)**。macOS、Windows 和 Android 不在测试范围内,只有少量说明。第二轮在 **macOS 26.1(Apple silicon)** 上重新运行了安装器、手动下载、压缩包和 npm 路径、无密钥检查以及 zsh 补全,见 [macOS 说明](#macos-说明)。需要调用模型的步骤没有在 macOS 上重跑。
11
12 使用 `latest` 的安装命令会解析到最新**已发布**的 GitHub Release 或包。两次发布之间,`main` 可能已经在描述下一个版本(例如 2026-09-28 之前的 v0.10.1 源码候选版)。候选版在其标签、校验和与发布资源齐备之前,都不能安装。
13
14 ---
15
16 ## 60 秒快速上手(Linux 或 macOS)
17
18 ```bash
19 # 1. Install. Downloads two checksum-verified binaries into ~/.local/bin (no sudo).
20 curl -fsSL https://codewhale.net/install.sh | sh
21
22 # 2. Make sure ~/.local/bin is on your PATH, now and in future terminals.
23 echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc # zsh: use ~/.zshrc
24 export PATH="$HOME/.local/bin:$PATH"
25 codewhale --version # -> codewhale 0.10.0 (1be1a703b975)
26
27 # 3. Give it a DeepSeek API key (from https://platform.deepseek.com/api_keys).
28 codewhale auth set --provider deepseek # prompts for the key; nothing is echoed
29 codewhale auth status --provider deepseek # "active source: secret store"
30
31 # 4. Run your first task inside a git repository.
32 cd ~/your-project
33 codewhale
34 ```
35
36 在 TUI 里输入一句具体的话:
37
38 ```text
39 create a Python file primes.py that prints the first 10 primes, run it, and show me the output
40 ```
41
42 Codewhale 会写出文件、给你看 diff,然后询问 **APPROVAL: bash python3 primes.py – Do you want to proceed?**。按 `y` 允许本次执行。它会运行该命令并报告输出。(输入框为空时)按 `Ctrl-D` 退出,它会打印出之后恢复该会话的命令。
43
44 > **如果发送第一条消息后没有任何反应,** 说明你还没有配置密钥。v0.10.0 在这种情况下不会给出警告。按 **F3**。如果 DeepSeek 显示 `missing key`,按 Enter,粘贴密钥,然后选择模型并确认。
45
46 ---
47
48 ## 目录
49
50 1. [开始之前](#1-开始之前)
51 2. [安装:推荐的安装器](#2-推荐的安装器curl--sh)
52 3. [安装:从 GitHub Releases 手动下载](#3-从-github-releases-手动下载)
53 4. [安装:npm](#4-npm)
54 5. [安装:Cargo / 从源码构建](#5-cargo-与从源码构建)
55 6. [安装:Homebrew(Linux)与 Nix](#6-linux-上的-homebrew-与-nix)
56 7. [更新与回滚](#7-更新与回滚)
57 8. [API 密钥与提供商](#8-api-密钥与提供商)
58 9. [Shell 补全](#9-shell-补全)
59 10. [运行:TUI、无头模式、恢复会话](#10-运行)
60 11. [终端说明(Ghostty 及其他)](#11-终端说明)
61 12. [卸载,以及 Codewhale 留下了什么](#12-卸载)
62 13. [故障排查](#13-故障排查)
63 14. [附录:其他平台(本版未重测)](#附录其他平台本版未重测)
64
65 ---
66
67 ## 1. 开始之前
68
69 | 你需要 | 原因 |
70 |---|---|
71 | Linux x86_64 或 arm64,或 macOS | 这些平台有预编译二进制。Linux 二进制是**静态**链接的(musl),没有 glibc 或 libdbus 依赖,可在任何发行版上运行。 |
72 | `curl`(或 `wget`)和 `sha256sum`(或 `shasum`) | 安装器用它们下载并校验。 |
73 | 一个模型提供商的密钥,例如 [DeepSeek](https://platform.deepseek.com/api_keys) | 没有模型,Codewhale 什么用都没有。 |
74 | `git`(推荐) | Codewhale 在 git 仓库里效果最好。 |
75 | 可选:Python 3、Node.js 20+ | 如果存在,Codewhale 会启用它的 Python 和 JS 执行工具(`codewhale doctor` 会列出它们)。 |
76
77 **该选哪条安装路径?**
78
79 * **大多数人:** [推荐的安装器](#2-推荐的安装器curl--sh)。它最快(在测试机上约 6 秒),会校验校验和,并支持 `codewhale update`。
80 * **隔离网络(air-gapped)或需要安全审查的机器:** [手动下载](#3-从-github-releases-手动下载)。
81 * **你已经用 npm 管理命令行工具:** [npm](#4-npm)。
82 * **你的平台没有预编译二进制,或者想自己构建:** [Cargo](#5-cargo-与从源码构建)。
83
84 **只选一种。** 同一台机器上装了多份,最后会在 PATH 上互相打架(见[故障排查](#13-故障排查))。
85
86 **隐私说明:** Codewhale **默认**会发送聚合的使用次数统计(PostHog)。要永久关闭:运行 `codewhale config set telemetry false`,或者导出 `CODEWHALE_TELEMETRY=0`(它始终优先)。TUI 启动时还会检查 GitHub 上是否有更新(`~/.codewhale/config.toml` 中的 `[update] check_for_updates`)。
87
88 ---
89
90 <a id="recommended-official-github-releases"></a>
91
92 ## 2. 推荐的安装器(`curl | sh`)
93
94 **前置条件:** curl、`sha256sum`(Linux)或 macOS 自带的 `shasum`,以及一个可写的主目录。不需要 sudo、Node 或 Rust。
95
96 ```bash
97 curl -fsSL https://codewhale.net/install.sh | sh
98 ```
99
100 它做了什么(已验证):
101
102 * 检测你的平台(`linux-x64`、`linux-arm64`、`macos-x64`、`macos-arm64`)。对 Android/Termux 和 riscv64,它会给出明确提示并拒绝安装。
103 * 从最新的 GitHub Release 下载 `codewhale-<platform>`、`codew-<platform>` 和 `codewhale-artifacts-sha256.txt`,并对照清单校验两个二进制。只要有一个不匹配,就会在安装任何东西之前停止(`codewhale install: checksum mismatch for …`)。
104 * 安装 `~/.local/bin/codewhale` 和 `~/.local/bin/codew`:两个内容相同的 78 MB 文件。
105 * **从不使用 sudo,也从不修改你的 shell 配置文件。** 它拒绝安装到系统或包管理器目录(`/usr/bin`、`~/.cargo/bin`、Homebrew、`node_modules`、`/nix/store` 等),也拒绝覆盖一个*不同的*已有 `codewhale`。
106
107 预期输出:
108
109 ```
110 Installing Codewhale for linux-x64
111 Release assets: https://github.com/codewhale-hq/CodeWhale/releases/latest/download
112 Install dir: /home/you/.local/bin
113 Checksums verified
114 Installed checksummed release commands:
115 /home/you/.local/bin/codewhale
116 /home/you/.local/bin/codew
117 …
118 PATH selects no codewhale command; this install is /home/you/.local/bin/codewhale
119 …
120 Put /home/you/.local/bin first on PATH in future shells (run once; this installer does not edit shell profiles):
121 echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
122 Then run: . ~/.bashrc (or open a new terminal)
123 …
124 ```
125
126 ### macOS 说明
127
128 在 macOS 26.1、Apple silicon(`macos-arm64`)上,用全新的 `HOME` 重新检查过:
129
130 * 安装器打印了 `Installing Codewhale for macos-arm64`,用系统自带工具校验了校验和,并在 4.3 秒内装好了 `codewhale` 和 `codew`(各 64 MiB,Mach-O arm64)。两者都报告 `codewhale 0.10.0 (1be1a703b975)`。运行时没有弹出 Gatekeeper 提示。
131 * 当 `PATH` 上没有 Node 时,它还会打印 `Computer Use is included and needs Node.js 20 or newer on PATH.`。核心 TUI 没有 Node 也能用,但在 `PATH` 上有 Node 之前,Computer Use 和 JavaScript 执行工具(`js_execution`)不可用。
132 * `codewhale doctor` 的行为与 Linux 相同(退出码 0;没有密钥时输出 `All checks complete!`;文件型密钥存储位于 `~/.codewhale/secrets/`),只是它会报告 `✓ sandbox available: macos-seatbelt`。
133
134 ### 把它加入 PATH
135
136 如果安装器提示 `PATH selects no codewhale command`,说明 `~/.local/bin` **在当前 shell 里**不在 PATH 上。此时 `codewhale.net/install.sh` 安装器会根据你的 `$SHELL`(zsh、bash、fish 或 POSIX `sh`),打印下面这个代码块里对应的那一行;对于其他 shell,或者目录名含有引号、`$`、反引号或反斜杠的情况,它会让你自己添加该目录。它自己从不修改 shell 配置文件。发布压缩包内的 `install.sh` 只会打印针对当前 shell 的 `export` 行。在 Ubuntu 和 Debian 上,`~/.profile` 会加入 `~/.local/bin`,但前提是该目录在你*登录*时已经存在。所以:
137
138 * 新开的 SSH 会话或登录 shell 会自动生效;
139 * 桌面上新开的终端**窗口**(GNOME Terminal、Ghostty 等)通常不会,要等到你注销再登录。我刚装完就在 Ghostty 里遇到了 `bash: codewhale: command not found`。
140
141 一次性修复:
142
143 ```bash
144 echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc # bash (macOS login bash: ~/.bash_profile, or ~/.profile if only that exists)
145 # echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc # zsh
146 # fish_add_path ~/.local/bin # fish (untested on this VM)
147 export PATH="$HOME/.local/bin:$PATH"; hash -r
148 command -v codewhale codew
149 ```
150
151 ### 选项
152
153 ```bash
154 # Choose the directory (must be absolute; created if missing)
155 curl -fsSL https://codewhale.net/install.sh | CODEWHALE_INSTALL_DIR="$HOME/.local/codewhale/bin" sh
156 # Install a specific release
157 curl -fsSL https://codewhale.net/install.sh | CODEWHALE_VERSION=v0.9.13 sh
158 # Show help
159 curl -fsSL https://codewhale.net/install.sh | sh -s -- --help
160 ```
161
162 (注释含义:选择目录,必须是绝对路径,不存在则创建;安装指定版本;显示帮助。)
163
164 ### 验证
165
166 ```bash
167 codewhale --version # codewhale 0.10.0 (1be1a703b975)
168 codew --version # same
169 codewhale doctor # diagnostics; see the note in §8 about what it does NOT check
170 ```
171
172 ### 重新运行安装器
173
174 * 已安装的就是同一版本:无害。它会打印 `Already installed: …` 并以 0 退出。
175 * 已安装的是不同版本:它会**拒绝**(`codewhale install: refusing to replace existing …/codewhale`),以 1 退出,并且不改动任何东西。拒绝之前它已经下载了约 160 MB。请改用 [`codewhale update`](#7-更新与回滚)。
176
177 ### 升级 / 卸载
178
179 * 升级:`codewhale update`(见 §7)。
180 * 卸载:`rm ~/.local/bin/codewhale ~/.local/bin/codew`,数据的清理见 §12。
181
182 ---
183
184 ## 3. 从 GitHub Releases 手动下载
185
186 当你想亲自查看并校验每一个字节时使用。发布页:<https://github.com/codewhale-hq/CodeWhale/releases>。每个平台都有**裸二进制**(`codewhale-linux-x64`、`codew-linux-x64` 等)和一个**压缩包**(`codewhale-linux-x64.tar.gz`),压缩包里是同样的两个二进制外加一个 `install.sh`。
187
188 ### 3a. 裸二进制
189
190 ```bash
191 mkdir -p ~/codewhale-dl && cd ~/codewhale-dl
192 base=https://github.com/codewhale-hq/CodeWhale/releases/latest/download
193 curl -fsSLO "$base/codewhale-linux-x64" # use linux-arm64 on ARM
194 curl -fsSLO "$base/codew-linux-x64"
195 curl -fsSLO "$base/codewhale-artifacts-sha256.txt"
196 sha256sum -c codewhale-artifacts-sha256.txt --ignore-missing
197 # codew-linux-x64: OK
198 # codewhale-linux-x64: OK
199 mkdir -p ~/.local/bin
200 install -m 755 codewhale-linux-x64 ~/.local/bin/codewhale
201 install -m 755 codew-linux-x64 ~/.local/bin/codew
202 ```
203
204 然后[把 `~/.local/bin` 加入 PATH](#把它加入-path)并运行 `codewhale --version`。在 macOS 上,资源名是 `codewhale-macos-arm64` 和 `codew-macos-arm64`(Intel 上是 `-macos-x64`),可以用系统自带的 `shasum` 校验(已在 macOS 26.1、Apple silicon 上测试):
205
206 ```bash
207 /usr/bin/shasum -a 256 -c codewhale-artifacts-sha256.txt --ignore-missing
208 # codew-macos-arm64: OK
209 # codewhale-macos-arm64: OK
210 ```
211
212 `codewhale-macos-arm64.tar.gz` 压缩包同样可以对照 `codewhale-bundles-sha256.txt` 校验,其中的 `./install.sh` 会安装到 `~/.local/bin`(已测试)。
213
214 要固定某个版本,把 `latest/download` 换成 `download/vX.Y.Z`,并从同一个标签下取校验清单。
215
216 ### 3b. 压缩包
217
218 ```bash
219 cd "$(mktemp -d)"
220 base=https://github.com/codewhale-hq/CodeWhale/releases/latest/download
221 curl -fsSLO "$base/codewhale-linux-x64.tar.gz"
222 curl -fsSLO "$base/codewhale-bundles-sha256.txt" # note: *bundles*, not *artifacts*
223 sha256sum -c codewhale-bundles-sha256.txt --ignore-missing
224 # codewhale-linux-x64.tar.gz: OK
225 tar -xzf codewhale-linux-x64.tar.gz
226 cd codewhale-linux-x64 && ./install.sh # -> ~/.local/bin; PREFIX=/some/dir ./install.sh -> /some/dir/bin
227 ```
228
229 (注意:校验清单是 *bundles*,不是 *artifacts*。)
230
231 压缩包里的 `install.sh` 与网站上的安装器行为一致:不用 sudo,不动内容不同的已有文件,并打印同样的 PATH 提示。
232
233 **升级:** `codewhale update` 对 3a 和 3b 都适用,因为它们都属于"直接二进制"安装。**卸载:** 删除那两个文件(见 §12)。
234
235 ---
236
237 ## 4. npm
238
239 **前置条件:** Node.js 18+ 和 npm,并且有一个**你能写入的全局 prefix**。npm 安装的是注册表上最新已发布的版本,绝不会是未发布的源码候选版。
240
241 ```bash
242 npm install -g codewhale
243 codewhale --version
244 ```
245
246 这个包是一个很小的包装器。它的 `postinstall` 步骤会下载同样的 `codewhale`/`codew` 发布二进制,对照该发布的 SHA-256 清单校验,并把 `codewhale` 和 `codew` 链接到 npm 的全局 `bin`。整个过程在测试机上用了 6 秒。
247
248 ### 如果遇到 `EACCES: permission denied`
249
250 这说明 Node 是系统级安装的(apt、`/usr/local`、`/opt`),而你的用户无权写入它的全局 prefix:
251
252 ```
253 npm error code EACCES
254 npm error Error: EACCES: permission denied, mkdir '/opt/node22/lib/node_modules/codewhale'
255 ```
256
257 **不要用 `sudo npm`。** 要么使用每用户的 Node(nvm、fnm、volta),要么把 npm 指向一个你自己拥有的目录。我测试了第二种方式:
258
259 ```bash
260 npm config set prefix "$HOME/.npm-global"
261 echo 'export PATH="$HOME/.npm-global/bin:$PATH"' >> ~/.bashrc
262 export PATH="$HOME/.npm-global/bin:$PATH"
263 npm install -g codewhale
264 command -v codewhale codew # ~/.npm-global/bin/codewhale, ~/.npm-global/bin/codew
265 ```
266
267 ### 说明
268
269 * npm 会隐藏下载进度。加上 `--foreground-scripts` 可以看到(`codewhale: selected GitHub Releases for v0.10.0 … done.`)。所选来源也会写入 `$(npm prefix -g)/lib/node_modules/codewhale/bin/downloads/codewhale.source`。
270 * 该包在磁盘上占用 157 MB。
271 * 在 macOS 26.1(Apple silicon,Homebrew 的 Node 25)上,安装到用户自有的 prefix(`npm install -g --prefix <dir> codewhale`)用了 3 秒,并链接了 `codewhale` 和 `codew`,两者都是 `codewhale 0.10.0 (1be1a703b975)`。
272 * **升级:** `npm install -g codewhale@latest`。`codewhale update` 会拒绝处理 npm 安装:它打印迁移说明,并以 1 退出,输出 `error: The package-managed executable was not changed.`。
273 * **指定版本:** `npm install -g codewhale@0.9.13`。
274 * **卸载:** `npm uninstall -g codewhale`。它只删除程序本身,不删除你的数据(见 §12)。
275
276 ---
277
278 <a id="4-install-via-cargo-any-tier-1-rust-target"></a><a id="7-build-from-source"></a><a id="4-通过-cargo-安装任何-tier-1-rust-目标"></a><a id="7-从源码构建"></a>
279
280 ## 5. Cargo 与从源码构建
281
282 如果你的平台没有预编译二进制,或者你想自己编译,就用这条路径。只需要一个 Cargo 包:`codewhale-cli` 会安装 `codewhale` 命令。npm 和预编译发布版还会把 `codew` 作为同一个已编译运行时的便捷名称提供;Cargo 不会创建这个别名,所以如果想用短名字,请在 shell 的 rc 文件里加上 `alias codew=codewhale`。
283
284 ### 前置条件(Debian/Ubuntu)
285
286 ```bash
287 sudo apt-get install -y build-essential pkg-config libdbus-1-dev git
288 # Rust via rustup (the distro's cargo is too old for this edition-2024 workspace)
289 curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
290 source "$HOME/.cargo/env"
291 rustc --version # the workspace declares rust-version = 1.89
292 ```
293
294 (注释含义:发行版自带的 cargo 太旧,无法构建这个 edition-2024 的 workspace;workspace 声明的 rust-version 为 1.89。)
295
296 `libdbus-1-dev` **是必需的**。没有它,构建会在大约一分钟后失败:
297
298 ```
299 error: failed to run custom build command for `libdbus-sys v0.2.7`
300 The system library `dbus-1` required by crate `libdbus-sys` was not found.
301 ```
302
303 Fedora/RHEL:`sudo dnf install -y gcc make pkgconf-pkg-config dbus-devel` **(该虚拟机上未测试:只有 Ubuntu)**。
304
305 ### 5a. 从 crates.io 安装
306
307 ```bash
308 cargo install codewhale-cli --locked
309 codewhale --version
310 ```
311
312 测试结果:用当前 stable Rust(1.98.1)**可行**。
313 * 在 4 vCPU、15 GB 内存的机器上用了 **25 分 31 秒**,向 `~/.cargo/registry` 拉取了约 470 MB。
314 * 它安装一个 122 MB 的文件 `~/.cargo/bin/codewhale`。这是普通的 glibc 链接二进制,运行时需要 `libdbus-1`。
315 * `codewhale --version` 打印 `codewhale 0.10.0`,不带 commit 哈希。
316 * 无头模式和 TUI 冒烟测试通过。
317
318 > **v0.10.0 声明的"Rust 1.88+"是错的,工作区现在声明 1.89(CI 的 MSRV 任务所构建的版本)。** 用 1.88.0 时,安装会在几秒内失败:
319 > `rustc 1.88.0 is not supported by the following package: serde-saphyr@1.3.0 requires rustc 1.89`。
320 > 请使用当前 stable(`rustup update stable`)。
321
322 ### 5b. 从 git 检出构建
323
324 ```bash
325 git clone --depth 1 --branch v0.10.0 https://github.com/codewhale-hq/CodeWhale.git
326 cd CodeWhale
327 cargo install --path crates/cli --locked # installs ~/.cargo/bin/codewhale
328 ```
329
330 需要知道的事(实际观察到的):
331
332 * 仓库里有 `rust-toolchain.toml`(`channel = "stable"`)。在检出目录里运行的第一条 `cargo` 命令,无论你的默认工具链是什么,都会**悄悄下载最新的 stable 工具链**(约 250 MB)。
333 * workspace 把所有编译器警告都当作错误。用 Rust 1.89 时,构建会在大约 11 分钟后**失败**,在 `codewhale-tui` 中出现 8 个 `error: this lint expectation is unfulfilled`。请使用仓库选定的 stable 工具链,不要传入更旧的 `+toolchain`。
334 * workspace 的 release profile 使用 thin LTO。在 4 vCPU / 15 GB 的虚拟机上,仅 `codewhale-tui` 这一个 crate 就编译了一个多小时,内存峰值 6–8 GB。请准备 16 GB 或更多内存,并预期这是迄今最慢的安装路径。`target/` 增长超过了 1.2 GB。
335
336 测试结果:用仓库选定的 stable Rust(1.98.1)**可行**。
337 * `Finished release profile … in 83m 12s`。其间大部分时间有一个 Nix 构建在争抢 CPU 和内存,所以请把它当作上限。
338 * `target/` 最终达到 **3.1 GB**。之后用 `cargo clean` 删除。
339 * 该二进制报告 `codewhale 0.10.0 (dev)`,`exec` 可用。
340 * Cargo 会打印 `warning: default toolchain implicitly overridden with stable-x86_64-unknown-linux-gnu by rustup toolchain file`,这是无害的。
341 * **Cargo 构建不提供 `codew`。**
342
343 **升级:** 重新运行同样的 `cargo install … --force`(对 crates.io 可以加 `--version X.Y.Z`)。`codewhale update` 会拒绝处理 Cargo 安装。**卸载:** `cargo uninstall codewhale-cli`,然后见 §12。
344
345 ---
346
347 ## 6. Linux 上的 Homebrew 与 Nix
348
349 ### Linux 上的 Homebrew:可行,但不是旧文档给的那条命令
350
351 前置条件:Homebrew 本身。它的安装器需要**一次** sudo,用来创建 `/home/linuxbrew/.linuxbrew`。没有 sudo 权限时,它会停在 `Insufficient permissions to install Homebrew to "/home/linuxbrew/.linuxbrew"`。请管理员运行 `sudo mkdir -p /home/linuxbrew/.linuxbrew && sudo chown $USER /home/linuxbrew/.linuxbrew`,然后重新运行安装器。之后,按它的 "Next steps" 提示,把 `eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv bash)"` 加入 `~/.bashrc`。
352
353 ```bash
354 brew install Hmbown/deepseek-tui/codewhale # full name: taps and trusts in one step
355 ```
356
357 (注释含义:使用完整名称,一步完成 tap 和信任。)
358
359 两步写法(先 `brew tap Hmbown/deepseek-tui`,再 `brew install codewhale`)在 **Homebrew 7.x 上会失败**:
360
361 ```
362 Error: Refusing to load formula hmbown/deepseek-tui/codewhale from untrusted tap hmbown/deepseek-tui.
363 Run `brew trust --formula hmbown/deepseek-tui/codewhale` or `brew trust hmbown/deepseek-tui` to trust it.
364 ```
365
366 先运行 `brew trust hmbown/deepseek-tui`,或者使用上面的完整名称。
367
368 用 Homebrew 7.0.6 对照 v0.10.0 的 tap formula 测试过:安装用了 73 秒。tap formula 跟踪最新发布并下载官方发布二进制,所以不需要编译。它**同时**提供 `codewhale` 和 `codew`。`Hmbown/deepseek-tui` 这个 tap 的 formula 还依赖 `node`,在 Linux 上拉了 31 个 bottle(约 560 MB)。这个 `node` 依赖只属于该 tap formula。核心 TUI 没有 Node 也能运行;Computer Use 和 JS 执行工具在 PATH 上有 Node 时会使用它。
369
370 * **升级:** `brew upgrade codewhale`。(`codewhale update` 会拒绝,并建议迁移。)
371 * **卸载:** `brew uninstall codewhale && brew untap Hmbown/deepseek-tui`。这也会自动移除该 tap 的 node 依赖以及它拉进来的其他东西。Homebrew 的下载缓存(`~/.cache/Homebrew`,约 330 MB)会保留,直到运行 `brew cleanup --prune=all`。
372
373 ### Nix:部分测试
374
375 ```bash
376 # flakes are still experimental; the tested setup enabled them once:
377 mkdir -p ~/.config/nix
378 echo 'experimental-features = nix-command flakes' >> ~/.config/nix/nix.conf
379 nix run github:codewhale-hq/CodeWhale -- --version
380 # one-off alternative (untested on this VM): nix --extra-experimental-features 'nix-command flakes' run github:codewhale-hq/CodeWhale -- --version
381 ```
382
383 (注释含义:flakes 仍是实验特性,测试环境一次性启用了它;一次性替代写法在该虚拟机上未测试。)
384
385 Nix 2.35 安装正常;单用户模式需要先由 root 创建一次 `/nix`。flakes 解析成功。我在停止之前了解到:
386
387 * **没有二进制缓存**,所以这是对 **main 分支**的完整源码构建,而不是 v0.10.0 发布版。该二进制报告 `codewhale 0.10.0 (dev)`。
388 * 构建步骤在 4 核上用了 30 分钟。之后这个包会运行它的**测试套件**(`doCheck`),以测试模式重新编译 workspace。这花了超过 70 分钟,单个 rustc 进程占用超过 8 GB 内存,我在 105 分钟时停止了。因此 `nix run` 跑完、`nix build` 以及 `nix profile install/remove` 都**(该虚拟机上未测试:构建没能在时间预算内完成;该虚拟机的代理还需要 `--override-input fenix …` 这个变通办法)**。
389 * Nix 只提供 `codewhale`,没有 `codew`(它只构建 `codewhale-cli` 包)。
390
391 除非你本来就用 Nix,否则请改用 §2。
392
393 ---
394
395 ## 7. 更新与回滚
396
397 这些适用于通过 §2 和 §3 安装的(直接二进制)。由包管理器安装的(npm、Cargo、Homebrew)必须用各自的工具更新。
398
399 ```bash
400 codewhale update --check
401 # Current binary: /home/you/.local/bin/codewhale
402 # Current version: v0.9.13
403 # Latest stable release: v0.10.0
404 # Update available. Run `/home/you/.local/bin/codewhale update` to install v0.10.0.
405 codewhale update
406 # Downloading codewhale-linux-x64...
407 # SHA256 checksum verified against codewhale-artifacts-sha256.txt from GitHub Releases.
408 # ✅ Successfully updated to v0.10.0!
409 # Updated binaries:
410 # - /home/you/.local/bin/codewhale (codewhale-linux-x64)
411 # - /home/you/.local/bin/codew (codewhale-linux-x64)
412 ```
413
414 它会把 `codewhale` **和** `codew` 一起更新,在测试机上用了 10 秒。再运行一次会得到 `Already up to date; no download needed.`。其他选项:`--beta` 和 `--proxy <URL>`。
415
416 <a id="roll-back-to-a-previous-release"></a>
417
418 ### 回滚(例如回到 v0.9.13)
419
420 `codewhale update` 从不降级,`CODEWHALE_VERSION=0.9.13 codewhale update` 也只会说 "Already up to date"。要回滚,请替换文件:
421
422 ```bash
423 dir="$(dirname "$(command -v codewhale)")" # the install PATH actually selects
424 rm "$dir/codewhale" "$dir/codew"
425 curl -fsSL https://codewhale.net/install.sh | CODEWHALE_VERSION=v0.9.13 CODEWHALE_INSTALL_DIR="$dir" sh
426 hash -r; codewhale --version # codewhale 0.9.13 (a0b81f619b66)
427 ```
428
429 (注释含义:`dir` 是 PATH 实际选中的安装目录。)
430
431 默认的 `~/.local/bin` 和自定义的 `CODEWHALE_INSTALL_DIR` 都测试过。只对通过安装器、手动下载或压缩包安装的使用它。绝不要把它指向 npm、Cargo 或 Homebrew 的目录。
432
433 或者让两个版本并存,把旧版本放在 PATH 最前面:
434
435 ```bash
436 curl -fsSL https://codewhale.net/install.sh | CODEWHALE_VERSION=v0.9.13 CODEWHALE_INSTALL_DIR="$HOME/.local/codewhale-0.9.13" sh
437 export PATH="$HOME/.local/codewhale-0.9.13:$PATH"; hash -r
438 ```
439
440 原地回滚之后要回到最新版,运行 `codewhale update`。(已测试:0.9.13 → 0.10.0。)
441
442 npm:`npm install -g codewhale@0.9.13`。Cargo:`cargo install codewhale-cli --version 0.9.13 --locked --force` **(该虚拟机上未测试:只构建过 0.10.0)**。
443
444 ---
445
446 ## 8. API 密钥与提供商
447
448 ### Codewhale 到哪里找密钥(先匹配到的优先)
449
450 1. 命令行上的 `--api-key <KEY>`
451 2. `~/.codewhale/config.toml` 中的 `api_key`
452 3. `codewhale auth set` 写入的密钥存储
453 4. 环境变量(DeepSeek 用 `DEEPSEEK_API_KEY`)
454
455 这个顺序很重要。**配置文件或密钥存储里的密钥,优先于 `DEEPSEEK_API_KEY`。** 如果你靠导出新的环境变量来轮换密钥,之前存下的旧密钥仍然会被继续使用。我测试过:`config.toml` 里是错误的密钥,环境变量里是正确的密钥,结果是 `Authentication Fails … ****beef is invalid`。
456
457 ### 设置 DeepSeek 密钥的方式(都已测试)
458
459 **环境变量。** 适合试用和 CI:
460 ```bash
461 export DEEPSEEK_API_KEY=sk-... # add to ~/.bashrc / ~/.zshenv to persist
462 ```
463
464 **`auth set`。** 为所有目录保存密钥:
465 ```bash
466 codewhale auth set --provider deepseek # prompts: "Enter API key for deepseek:"
467 printf '%s\n' "$KEY" | codewhale auth set --provider deepseek --api-key-stdin # scripted
468 # -> saved API key for deepseek to file-based ("/home/you/.codewhale/secrets/secrets.json") (config contains metadata only)
469 ```
470 文件型存储的这条消息会打印解析出的密钥存储路径;显式设置 `CODEWHALE_HOME` 会改变这个位置。
471
472 在 Linux 上,密钥以**明文**存放在 `~/.codewhale/secrets/secrets.json` 中,权限为 0600,不在操作系统的钥匙串(keyring)里。请注意,在 v0.10.0 中,`auth set` 还会往你的配置里写入 `default_text_model = "deepseek-v4-pro"`,把你从默认的 `deepseek-flash` 切换到更贵的 Pro 模型。可以在 TUI 里用 `/model` 改回去,或者编辑 `~/.codewhale/config.toml`。
473
474 **在 TUI 里。** 按 **F3**(或输入 `/provider`),选择 DeepSeek,按 Enter,粘贴密钥(会被遮蔽),选择模型并确认。这同样会写入密钥存储,并保持使用 `deepseek-flash`。
475
476 **配置文件。** `~/.codewhale/config.toml`:
477 ```toml
478 [providers.deepseek]
479 api_key = "sk-..."
480 ```
481
482 ### 查看当前生效的是哪个密钥
483
484 ```bash
485 codewhale auth status --provider deepseek
486 # active source: env (last4: ...xxxx) # or: secret store / config / missing
487 # lookup order: config -> secret store -> env
488 codewhale doctor --probe-api
489 # · Testing connection... ✓ API connection successful
490 ```
491
492 请用 `auth status`。单独运行 `codewhale doctor` **不会**告诉你:即使密钥已设置,它也会打印 `deepseek: env_source=not inspected`;即使找不到密钥,它也以 0 退出。
493
494 ### 删除已保存的密钥
495
496 ```bash
497 codewhale auth clear --provider deepseek
498 # cleared API key for deepseek from config and secret store
499 ```
500
501 它不会取消你 shell 里的 `DEEPSEEK_API_KEY`,也会保留 `auth set` 添加的那行 `default_text_model`。
502
503 ### 其他提供商
504
505 `codewhale auth list` 会列出约 50 个提供商(OpenRouter、Anthropic、OpenAI、Moonshot、Ollama 等)。用法相同:`codewhale auth set --provider <name>`,或者使用该提供商对应的环境变量。本地模型(Ollama、vLLM、SGLang)不需要密钥。这里只测试了 DeepSeek。
506
507 ---
508
509 <a id="8-shell-completions"></a>
510
511 ## 9. Shell 补全
512
513 ```bash
514 # bash (needs the bash-completion package)
515 mkdir -p ~/.local/share/bash-completion/completions
516 codewhale completion bash > ~/.local/share/bash-completion/completions/codewhale
517
518 # zsh
519 mkdir -p ~/.zfunc
520 codewhale completion zsh > ~/.zfunc/_codewhale
521 # in ~/.zshrc, if not already there:
522 # fpath=(~/.zfunc $fpath)
523 # autoload -Uz compinit && compinit
524
525 # fish
526 mkdir -p ~/.config/fish/completions
527 codewhale completion fish > ~/.config/fish/completions/codewhale.fish
528 ```
529
530 每个脚本都同时注册 `codewhale` 和 `codew`。`codewhale completions` 是别名。之后请打开一个新的 shell。升级后请重新生成。
531
532 v0.10.0 中它们的表现(交互式测试):
533
534 * **bash:** 完全可用(`codewhale comp<Tab>`、`codew auth <Tab><Tab>`)。
535 * **fish:** 子命令能补全并带说明,但 `codewhale completion <Tab>` 提供的是文件,而不是 shell 名称。
536 * **zsh:** 只有第一个词能补全。在子命令之后(`codewhale auth <Tab>`),zsh 会错误地再次列出顶层命令(macOS 的 zsh 5.9 上同样如此,会给出全部 126 个顶层条目)。
537
538 PowerShell 和 Elvish 的脚本也会生成,**(该虚拟机上未测试:未安装这些 shell)**。
539
540 ---
541
542 ## 10. 运行
543
544 ### TUI
545
546 ```bash
547 cd your-git-repo
548 codewhale
549 ```
550
551 * 输入框(composer)在底部。页脚显示权限级别(`ask`)、模式(`work`)和模型(`DeepSeek · deepseek-flash`)。
552 * **Shift+Tab** 循环切换权限级别:Ask → Auto-Review(自动审核)→ Full Access(完全访问)。(输入框为空时)**Tab** 循环切换模式:Plan → Work → Operate。
553 * 在 **Ask** 下,工作区内的文件编辑会被直接应用并以 diff 显示。shell 命令会停在 **APPROVAL** 提示:`y` 允许本次,`a` 在本次会话中允许,`n` 拒绝,`Esc` 中止当前回合。
554 * 常用按键:**F1** 帮助(或 `/help`),**Ctrl-K** 命令面板,**F3** 提供商/模型选择器,**Ctrl-R** 恢复过去的会话,**Ctrl-U** 清空输入(**Ctrl-Z** 可恢复),**Ctrl-C** 取消或退出,**Ctrl-D** 在输入为空时退出。完整列表见 [KEYBINDINGS.md](./KEYBINDINGS.md)。
555 * 退出时它会打印 `To resume this session, run codewhale resume <id>`。
556
557 Codewhale 会在你的仓库里创建一个 `.codewhale/` 目录。请忽略它的内容,但保留可提交的 `constitution.json`(这些规则与 `/init` 写入的相同):
558
559 ```gitignore
560 **/.codewhale/*
561 !**/.codewhale/constitution.json
562 ```
563
564 ### 无头模式(脚本、CI)
565
566 ```bash
567 codewhale exec "Reply with exactly: pong" # one-shot answer, no tools
568 codewhale exec --auto "create primes.py that prints the first 10 primes and run it" # tools, auto-approved
569 codewhale exec --json "…" # summary JSON (provider, model, usage, output)
570 codewhale exec --auto --output-format stream-json "…" # one JSON event per line
571 ```
572
573 (注释含义:单次回答,无工具;启用工具并自动批准;汇总 JSON(提供商、模型、用量、输出);每行一个 JSON 事件。)
574
575 `--auto` 会自动批准 shell 命令,所以只在你信任的仓库或沙箱里使用。
576
577 普通的 `exec` 不给模型提供任何工具。只有 `--auto`、`--yolo`、`--allowed-tools` 或恢复某个会话才会打开工具面;`--max-turns`、`--disallowed-tools`、`--sandbox` 和输出格式这类限制项从不会增加工具(仅对工具有效的参数会打印警告)。如果提供商在输出上限处截断了回复,会要求模型继续,最终打印出的答案是完整的回复。普通运行最多进行 8 个模型步骤,除非用 `--max-turns` 另设上限;在该上限处仍被截断的回复会使这次运行失败。
578
579 ### 恢复会话
580
581 ```bash
582 codewhale resume <session-id> # or a unique prefix, e.g. e2525dfb
583 codewhale -c # continue the most recent session in this folder
584 codewhale sessions # list saved sessions
585 codewhale exec --continue "…" # headless follow-up to the latest session
586 codewhale exec --resume <id> "…"
587 ```
588
589 (注释含义:会话 ID 或其唯一前缀;继续此目录中最近的会话;列出已保存的会话;对最近会话进行无头跟进。)
590
591 在 v0.10.0 中,只有 **TUI 会话**和 **`--output-format stream-json`** 的 exec 运行会被保存。普通的 `codewhale exec`/`exec --auto` 运行*不会*被保存,所以紧接着的 `exec --continue` 会失败,报 `No saved sessions found for workspace`。
592
593 ---
594
595 ## 11. 终端说明
596
597 ### Ghostty(已测试:Linux/X11 上的 Ghostty 1.3.1)
598
599 我检查的所有项目在 Ghostty 默认配置下(`TERM=xterm-ghostty`、`COLORTERM=truecolor`)都能正常工作。截图与[安装回执](https://github.com/codewhale-hq/Codewhale/tree/37ecdfcc49bc68a9b0d058b97c3946e62c34bd31/docs/install-report/v0.10.0-2026-09-23/screenshots)保存在一起。
600
601 | 检查项 | 结果 |
602 |---|---|
603 | 颜色 / truecolor 渐变、制表符绘图、Unicode(✓ é 日本語) | ✅ |
604 | 调整窗口大小(1504×886 → 800×500 → 还原)时重排干净 | ✅ |
605 | 鼠标滚轮滚动对话记录,并带有"跳到底部"按钮 | ✅ |
606 | 粘贴(`Ctrl+Shift+V`),多行:会被插入,不会被发送 | ✅ |
607 | F1、F3、Ctrl-K、Ctrl-R、Tab、Shift+Tab、Ctrl-U/Ctrl-Z、Ctrl-C、Ctrl-D | ✅ |
608 | 窗口标题显示状态(`waiting on you…`、`✓ done`) | ✅ |
609 | 退出后终端恢复正常(回到普通屏幕、光标正常、没有鼠标上报的乱码) | ✅ |
610
611 Linux 上的 Ghostty 启动的是**非登录** shell,所以它读取 `~/.bashrc` 而不是 `~/.profile`。这就是为什么 PATH 那一行需要写进 `~/.bashrc`(§2)。
612
613 你可能会注意到,一个回合结束后,一些小圆点和淡淡的标签(例如 `other · drift`)在空白区域飘动。那是 Codewhale 装饰性的"环境生命(ambient life)"小鲸鱼,不是渲染故障。
614
615 ### 其他终端
616
617 tmux 会吃掉 **F1**,所以在 tmux 里请用 `/help`。有些组合键(Ctrl-Shift-…、Ctrl-Tab)需要支持增强键盘协议的终端;[KEYBINDINGS.md](./KEYBINDINGS.md) 列出了可移植的替代按键。Windows 用户请使用 Windows Terminal **(该虚拟机上未测试)**。
618
619 ---
620
621 ## 12. 卸载
622
623 ### 第 1 步:忘掉已保存的密钥(如果你用过 `auth set` 或 F3)
624
625 ```bash
626 codewhale auth clear --provider deepseek
627 ```
628
629 ### 第 2 步:删除程序
630
631 | 安装方式 | 删除方法 |
632 |---|---|
633 | 安装器(§2)或手动下载(§3) | `rm ~/.local/bin/codewhale ~/.local/bin/codew`(或你的 `CODEWHALE_INSTALL_DIR`) |
634 | npm | `npm uninstall -g codewhale` |
635 | Cargo | `cargo uninstall codewhale-cli` |
636 | Homebrew | `brew uninstall codewhale && brew untap Hmbown/deepseek-tui`(同时会移除它的 node 依赖) |
637
638 ### 第 3 步:删除数据。没有任何卸载器会替你做这件事。
639
640 | 路径 | 内容 | 所见大小 |
641 |---|---|---|
642 | `~/.codewhale/` | config.toml、**secrets/secrets.json(明文密钥)**、sessions/、logs/、catalog/(模型列表,约 5 MB)、skills/、builtin-plugins/、tasks/、automations/、crashes/、audit.log、输入框历史 | 6–7 MB |
643 | `~/.deepseek/snapshots/` | v0.10.0 把每个回合的**工作区副本**存在这里(一个旧路径)。里面包含你运行过它的每个仓库的内容。 | 这里为 0.2–0.6 MB;随仓库大小增长 |
644 | `<你用过的每个仓库>/.codewhale/` | 每个工作区的状态/锁目录 | 很小 |
645 | 补全文件 | `~/.local/share/bash-completion/completions/codewhale`、`~/.zfunc/_codewhale`、`~/.config/fish/completions/codewhale.fish` | – |
646 | 你添加的 PATH 行 | `~/.bashrc`、`~/.zshrc`、`~/.profile` | – |
647
648 ```bash
649 rm -rf ~/.codewhale ~/.deepseek/snapshots
650 rmdir ~/.deepseek 2>/dev/null # removes the parent only if it is now empty
651 # per-repo dirs, e.g.:
652 find ~ -type d -name .codewhale -prune -print # review, then delete the ones you want
653 ```
654
655 (注释含义:仅当父目录已为空时才会删除它;逐个仓库的目录,先查看再删除想删的。)
656
657 Codewhale 没有在 `$HOME` 和它被使用过的仓库之外写入任何东西:没有系统文件、服务或 cron 任务。(我检查了测试用户在其主目录之外拥有的每一个文件。)上面的命令只删除 `~/.deepseek/snapshots`。如果你仍在使用较早的 DeepSeek-TUI,`~/.deepseek` 里的其余部分(它的配置和会话)不会被动。
658
659 ---
660
661 ## 13. 故障排查
662
663 下面每一个错误,都是编写本指南时实际遇到的。
664
665 **装完后立刻出现 `bash: codewhale: command not found`。**
666 `~/.local/bin` 在这个终端里不在 PATH 上。见[把它加入 PATH](#把它加入-path)。
667
668 **`npm error code EACCES … permission denied, mkdir '…/lib/node_modules/codewhale'`。**
669 你的 Node 是系统级安装的。见 [§4](#如果遇到-eacces-permission-denied)。不要用 sudo。
670
671 **`error: DeepSeek API key not found.`(来自 `codewhale exec`)**
672 哪里都没有密钥。按打印出的步骤操作,或见 §8。
673
674 **TUI 显示了你的消息,却始终不回答。**
675 没有密钥(v0.10.0 不会提示)。按 F3 → DeepSeek → Enter → 粘贴密钥。
676
677 **`error: Responses API request failed … Authentication Fails, Your api key: ****dead is invalid`。**
678 密钥错误或已被吊销。运行 `codewhale auth status --provider deepseek` 查看*究竟*用的是哪个来源。请记住,配置文件和密钥存储优先于环境变量。用 `codewhale auth set --provider deepseek` 修复,或者用 `codewhale auth clear --provider deepseek` 回退到环境变量。在 TUI 里,无效的密钥会把你带到"Choose your model provider"界面,并把 DeepSeek 标为 `last check failed (authentication)`。
679
680 **`error: Network error: SSE stream request failed after HTTP/1.1 fallback: Responses API request failed. … on Windows or proxy networks, try CODEWHALE_FORCE_HTTP1=1 …`。**
681 尽管措辞如此,在 Linux 上这通常只意味着**无法连接到 `api.deepseek.com`**。用 `curl -sI https://api.deepseek.com` 检查(返回 `401` 是正常的,说明主机可达)。如果你在代理后面,请确认已导出 `HTTPS_PROXY`。`codewhale doctor --probe-api` 对错误的密钥和网络问题都只会说 `✗ API connection failed`。
682
683 **`codewhale install: refusing to replace existing ~/.local/bin/codewhale`。**
684 那里已经装了不同版本。运行 `codewhale update`,或者先删除那两个文件(见 §7 回滚),或者安装到一个全新的 `CODEWHALE_INSTALL_DIR`。
685
686 **`codewhale install: checksum mismatch for codew-linux-x64`。**
687 下载被损坏或被篡改。什么都没有安装。重试;如果反复出现,就不要使用镜像。
688
689 **`error: The package-managed executable was not changed.`(来自 `codewhale update`)**
690 你是用 npm、Cargo 或 Homebrew 安装的。请改用对应的工具更新。
691
692 **`error: failed to run custom build command for libdbus-sys`(Cargo)。**
693 运行 `sudo apt-get install -y libdbus-1-dev pkg-config`。
694
695 **`error: No saved sessions found for workspace …`(来自 `exec --continue`)。**
696 上一次运行是纯文本的 `exec`,它不会被保存。请使用 TUI,或者 `--output-format stream-json`。
697
698 **zsh 补全在第一个词之后给出错误的建议。**
699 v0.10.0 的已知 bug。bash 和 fish 没问题。
700
701 **获取帮助:** `codewhale doctor --json` 会生成一个不含密钥的诊断包。
702
703 ---
704
705 ## 附录:其他平台(本版未重测)
706
707 下面各节原样沿用自本页的上一版。它们**没有**在上文的 v0.10.0 安装测试中重新运行(不在范围内:Windows、macOS、Android/Termux、FreeBSD、中国大陆镜像),仅 [macOS 说明](#macos-说明)中提到的 macOS 路径除外。通过检查已发布的 v0.10.0 资源,发现下列内容与之矛盾([详情](https://github.com/codewhale-hq/Codewhale/blob/37ecdfcc49bc68a9b0d058b97c3946e62c34bd31/docs/install-report/v0.10.0-2026-09-23/DOC_DEFECTS.md),D15 和 D16):
708
709 * `packaging/winget/` 里的 winget 清单仍停留在 0.9.6。
710 * v0.10.0 同时发布了 `codewhale-windows-x64.zip`(附带一个把文件复制到 `%USERPROFILE%\bin` 的 `install.bat`)和 `codewhale-windows-x64-portable.zip`;下面各节只提到了前者。
711 * 独立的 `codewhale.bat` 启动器只能在 x64 exe 旁边工作。
712
713 ### 支持平台与发布资源
714
715 [最新稳定版](https://github.com/codewhale-hq/CodeWhale/releases/latest)发布了 Linux x64/arm64、macOS x64/arm64、Windows x64/arm64 和 Android arm64 的资源。资源存在不等于平台已通过验收。下表描述的是当前源码树的平台与次要打包支持;`latest` 安装仍然选择已发布的版本。Android/Termux 为预览状态,等待真机 QA。Linux ARM64 自 v0.8.8 起可用。Linux RISC-V 预编译暂时暂停,因为锁定的 `rquickjs-sys` 依赖没有提供 `riscv64gc-unknown-linux-gnu` 绑定。
716
717 | 平台 | 架构 | GitHub 发布资源 | npm install | `cargo install` |
718 | ------------ | ------------ | ----------------------------------------------------- | :---------: | :-------------: |
719 | Linux | x64 (x86_64) | `codewhale-linux-x64`, `codew-linux-x64` | ✅ | ✅ |
720 | Linux | arm64 | `codewhale-linux-arm64`, `codew-linux-arm64` | ✅ | ✅ |
721 | Android / Termux | arm64 (aarch64) | `codewhale-android-arm64.tar.gz`(v0.9.12 已发布;真机支持仍为预览) | ⚠️⁴ 预览版 | ⚠️⁴ 预览版 |
722 | Linux | riscv64 | 暂时不支持,待上游绑定落地 | ❌¹ | ❌³ |
723 | macOS | x64 | `codewhale-macos-x64`, `codew-macos-x64` | ✅ | ✅ |
724 | macOS | arm64 (M 系列) | `codewhale-macos-arm64`, `codew-macos-arm64` | ✅ | ✅ |
725 | Windows | x64 | `codewhale-windows-x64.exe`, `codew-windows-x64.exe` | ✅ | ✅ |
726 | Windows | arm64 | `codewhale-windows-arm64.exe`, `codew-windows-arm64.exe` | ✅ | ✅ |
727 | Linux x64 或 arm64 上的 musl(Alpine) | 原生架构 | 匹配的静态 Linux 资源 | ✅(静态) | ✅ |
728 | 其他 Linux(其他架构上的 musl) | — | 从源码构建 | ❌¹ | ✅² |
729 | FreeBSD 14+ / OpenBSD | x64, arm64 | `cargo install codewhale-cli --locked`(无预编译;见 § FreeBSD) | ❌ | ✅² |
730
731 ¹ npm 包会以明确的错误退出,并引导你到这里。
732 ² 前提是你的工具链能编译较新的 Rust workspace;见下文[从源码构建](#5-cargo-与从源码构建)。
733 ³ RISC-V 源码构建目前需要上游 `rquickjs-sys` 的 RISC-V 绑定,或启用 bindgen 的依赖构建。
734 ⁴ 当前的 npm 包装器能识别 Android arm64,并解析匹配的 `codewhale` 和 `codew` Android 资源。npm 安装仅对 GitHub Release 已发布了这些匹配资源的包版本有效。在 #4236 和 #4242 跟踪的真机编译、启动、审批、文件工具与更新检查完成之前,Android/Termux 路径仍为预览。
735
736 Android / Termux 与 Linux arm64 不是同一个目标。不要在 Termux 里安装 Linux 的 `codewhale-linux-arm64` 压缩包;当某个发布版或候选版发布了 Termux 专用的 Android 压缩包时请使用它,或在 Termux 内从源码构建。
737
738 当前 Linux 的 **x64 和 arm64** 资源都是**静态 musl 构建**。x64 发布路径自 v0.8.65 起使用 musl;v0.9.6 把同样的构建与静态启动检查扩展到了 arm64。这些二进制没有 glibc 依赖,可在匹配的架构上跨 Ubuntu、Debian、RHEL/CentOS 和 Alpine/musl 运行。SQLite 通过 `rusqlite` 内置,因此无需单独的 `libsqlite3` 运行时包。
739
740 #### Linux ARM64 可移植性
741
742 v0.9.6 之前的 Linux arm64 资源是 GNU libc 构建,可能继承了 Ubuntu 24.04 构建主机的 `GLIBC_2.39` 最低要求。Ubuntu 22.04 自带 glibc 2.35,因此那些较老的 arm64 二进制可能报错,例如:
743
744 ```text
745 version `GLIBC_2.39' not found
746 ```
747
748 npm 包装器、`codewhale update` 和 Unix 压缩包安装器对较旧版本仍保留 GNU 二进制预检查。当前的 arm64 构建改用 `aarch64-unknown-linux-musl`,因此没有 `GLIBC_*` 最低要求。如果你要在较旧的 arm64 发行版上安装早期版本,请使用:
749
750 ```bash
751 cargo install codewhale-cli --locked # installs `codewhale`
752 ```
753
754 > **Linux ARM64 说明(v0.8.7 及更早)。** v0.8.7 及更早版本**没有**发布 Linux ARM64 预编译;使用 HarmonyOS 轻薄本、Asahi Linux、树莓派(Raspberry Pi)、AWS Graviton 等的用户,运行 `npm i -g codewhale` 时会看到 `Unsupported architecture: arm64`。v0.8.8 发布了 `codewhale-linux-arm64`,因此普通的 `npm i -g codewhale` 可在任何基于 glibc 的 ARM64 Linux 上工作。如果你还卡在 v0.8.7,请跳到[从源码构建](#5-cargo-与从源码构建)——`cargo install` 完全可用。HarmonyOS PC 与 OpenHarmony 交叉构建设置,见 [HarmonyOS 与 OpenHarmony](./HarmonyOS.md)。
755
756 <a id="migrating-from-npm-cargo-or-another-installation"></a>
757
758 ### 从 npm、Cargo 或其他安装迁移
759
760 包管理器继续拥有自己的文件。对于 npm、Cargo、Homebrew 和 Omarchy,`codewhale update` 会给出迁移说明,而不是覆盖它们。已知的系统/包目录也受到保护。`CODEWHALE_INSTALL_METHOD=binary` 覆盖项无法绕过已识别的受管路径。
761
762 当 `~/.local/bin` 已被占用,或者同级命令的内容不同,就创建一个全新的目标目录。这样每个已有的安装都原样保留:
763
764 ```bash
765 mkdir -p "$HOME/.local"
766 codewhale_install_dir="$(mktemp -d "$HOME/.local/codewhale-release.XXXXXX")"
767 curl -fsSL https://codewhale.net/install.sh | CODEWHALE_INSTALL_DIR="$codewhale_install_dir" sh
768 "$codewhale_install_dir/codewhale" --version
769 export PATH="$codewhale_install_dir:$PATH"
770 hash -r
771 command -v codewhale codew
772 "$codewhale_install_dir/codewhale" update --check
773 ```
774
775 确认版本和命令路径之后,把该目录放在 shell 配置里 PATH 的最前面。在 PowerShell 里,用 `Get-Command codewhale, codew -All` 检查解析结果;运行所选可执行文件时使用它的完整路径。一次成功的更新只会改动它自己所在的安装目录,所以 PATH 上更靠前的其他条目仍可能启动旧副本。
776
777 现代的、成对匹配的 `codewhale`、`codew` 以及兼容性副本,都从同一份已校验的字节更新。指向正在运行的二进制的符号链接会被保留。内容不同或不相关的同级文件会在错误里被点名并原样保留;不会仅仅为了猜测其归属而执行任何同级文件。对于带有独立 dispatcher/TUI 二进制的旧安装,请使用上面的新目录迁移方式。
778
779 如果要保留一份由包管理器管理的次要安装,请用它自己的管理器:
780
781 ```bash
782 npm install -g codewhale@latest
783 # or
784 cargo install codewhale-cli --locked --force
785 ```
786
787 Homebrew 用 `brew upgrade codewhale`;Omarchy 用 `omarchy update`。这些命令只更新它们各自的副本,所以之后请再次核对 PATH。
788
789 <a id="android--termux-arm64"></a>
790
791 ### Android / Termux arm64(预览)
792
793 Termux 运行在 Android 的 Bionic libc 上,并使用 `$PREFIX` 作为它的 Unix 前缀,因此需要 Termux 专用的 Android arm64 压缩包。Linux arm64 发布资源面向使用 musl 的标准 Linux;Android 使用不同的 Rust 目标,所以不应在那里使用 Linux 资源。
794
795 先安装最基本的压缩包/运行时工具:
796
797 ```bash
798 pkg update
799 pkg install -y ca-certificates curl tar gzip coreutils
800 ```
801
802 当发布版包含 `codewhale-android-arm64.tar.gz` 时,用压缩包自带的安装器安装。传入 `PREFIX="$PREFIX"` 很重要:安装器默认安装到 `~/.local`,而 Termux 用户通常期望命令在 `$PREFIX/bin` 下。
803
804 ```bash
805 cd "$HOME"
806 curl -L -O https://github.com/codewhale-hq/CodeWhale/releases/latest/download/codewhale-android-arm64.tar.gz
807 curl -L -O https://github.com/codewhale-hq/CodeWhale/releases/latest/download/codewhale-bundles-sha256.txt
808 sha256sum -c codewhale-bundles-sha256.txt --ignore-missing
809
810 tar xzf codewhale-android-arm64.tar.gz
811 cd codewhale-android-arm64
812 PREFIX="$PREFIX" ./install.sh
813 hash -r
814 ```
815
816 如果你要从源码验证,或在本地构建候选版,请在运行 Cargo 之前先安装构建包:
817
818 ```bash
819 pkg install -y rust clang pkg-config make git
820 cargo install codewhale-cli --locked # installs `codewhale`
821 ```
822
823 常规的首次运行设置流程已经实现,但它在 Android 上的交互仍属于上文提到的预览 QA 范围。临时凭据优先使用提供商的环境变量。`codewhale auth set` 可用,但 Termux 构建没有受支持的操作系统钥匙串(keyring)集成,会退化为文件型密钥:写入 `~/.codewhale/config.toml`,并把密钥镜像到 `~/.codewhale/secrets/secrets.json`。两者都是受 `0600` 权限保护的明文文件,静态存储时未加密。
824
825 ```bash
826 codewhale auth set --provider deepseek
827 codewhale auth status
828 codewhale doctor
829 ```
830
831 维护者应对 Termux / Android arm64 候选版使用这份可重复的冒烟检查清单:
832
833 ```bash
834 command -v codewhale codew
835 test -x "$PREFIX/bin/codewhale"
836 test -x "$PREFIX/bin/codew"
837
838 codewhale --version
839 codewhale doctor
840 codewhale exec --auto "run pwd"
841 ```
842
843 已知限制:
844
845 - 命令会继承 Android 的每应用 UID、SELinux 和 seccomp 保护,以及授予 Termux 的任何权限。Codewhale 可选的 bubblewrap 子进程沙箱仅限 Linux,没有在 Android 上构建,因此已批准的命令不会获得 Codewhale 特有的文件系统限制。
846 - Termux 构建没有受支持的 Android Keystore 或桌面 Secret Service 集成。用 `codewhale auth status` 确认当前生效的来源;当文件型明文存储不可接受时,优先使用提供商的环境变量。
847 - 终端渲染因 Android 终端应用而异。TUI 始终独占备用屏幕(alternate screen)。如果某个终端应用无法渲染全屏 TUI,请改用 `codewhale exec` 进行无头运行。
848
849 ### 中国大陆/镜像友好安装
850
851 从中国大陆安装时,请同时为 **rustup**(Rust 工具链安装器)和 **Cargo**(包注册表)配置镜像,以避免 TLS 超时和下载失败。
852
853 **第 1 步:通过 rustup 镜像安装 Rust**
854
855 ```bash
856 # PowerShell
857 [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
858 (New-Object Net.WebClient).DownloadFile('https://win.rustup.rs/x86_64', 'rustup-init.exe')
859
860 # git-bash / msys2
861 export RUSTUP_DIST_SERVER=https://mirrors.tuna.tsinghua.edu.cn/rustup
862 export RUSTUP_UPDATE_ROOT=https://mirrors.tuna.tsinghua.edu.cn/rustup/rustup
863 ./rustup-init.exe -y --default-toolchain stable
864
865 # Linux / macOS
866 export RUSTUP_DIST_SERVER=https://mirrors.tuna.tsinghua.edu.cn/rustup
867 export RUSTUP_UPDATE_ROOT=https://mirrors.tuna.tsinghua.edu.cn/rustup/rustup
868 curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable
869 ```
870
871 如果 TUNA 镜像在你的网络下很慢,`rsproxy.cn` 是 Linux/macOS 的另一个 rustup 镜像选择:
872
873 ```bash
874 export RUSTUP_DIST_SERVER=https://rsproxy.cn
875 export RUSTUP_UPDATE_ROOT=https://rsproxy.cn/rustup
876 curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable
877 ```
878
879 `RUSTUP_DIST_SERVER` 和 `RUSTUP_UPDATE_ROOT` 环境变量**必须**在运行 rustup-init **之前**设置;否则工具链下载会遇到与安装器相同的 TLS 握手问题。
880
881 **第 2 步:配置 Cargo 注册表镜像**
882
883 ```toml
884 # ~/.cargo/config.toml
885 [source.crates-io]
886 replace-with = "tuna"
887
888 [source.tuna]
889 registry = "sparse+https://mirrors.tuna.tsinghua.edu.cn/crates.io-index/"
890 ```
891
892 `rsproxy`、腾讯云 COS 和阿里云 OSS 镜像的用法相同;选你的网络下最快的即可。
893
894 ### Omarchy / AUR
895
896 在 Omarchy 上,安装预构建的 AUR 包:
897
898 ```bash
899 omarchy pkg aur add codewhale-bin
900 codewhale --version
901 ```
902
903 `codewhale-bin` 打包的是与其他二进制安装路径相同的、校验和已固定的 Linux 发布压缩包,并同时提供 `codewhale` 和 `codew`。它不携带单独的 Codewhale 版本;现有的 `codewhale-tui` 兼容命令仍是同一运行时的别名。包更新通过 `omarchy update` 到达;应用内更新器会把 pacman 拥有的二进制留给 Omarchy 处理。
904
905 AUR 更新跟随对应的 Codewhale 标签和发布资源,所以它可能在 GitHub 发布之后才出现,因为其生成的 `PKGBUILD` 和 `.SRCINFO` 需要先经过验证。发布维护者说明见 [`packaging/aur/README.md`](../../packaging/aur/README.md)。
906
907 ---
908
909 ### Windows
910
911 #### Windows Scoop
912
913 `codewhale` 包列在 Scoop 的 main bucket 中:
914
915 ```powershell
916 scoop update
917 scoop install codewhale
918 codewhale --version
919 ```
920
921 Scoop 清单维护在本仓库的发布工作流之外,可能落后于 GitHub/npm/Cargo 的发布。当你需要立即拿到最新版本时,请使用 npm 或从 GitHub 手动下载发布资源。
922
923 #### Windows winget
924
925 已发布的 winget 包是 **`HunterBown.CodeWhale`**(2026-10-04 在
926 [microsoft/winget-pkgs](https://github.com/microsoft/winget-pkgs/tree/master/manifests/h/HunterBown/CodeWhale)
927 核实;最新发布版本为 0.10.0)。它是便携式 x64 包:winget 下载
928 `codewhale-tui-windows-x64.exe`,将其安装为 `codewhale` 命令,并安装 Microsoft Visual C++ 2015+ x64 运行库。
929
930 ```powershell
931 winget install HunterBown.CodeWhale
932 codewhale --version
933 ```
934
935 使用 `winget upgrade HunterBown.CodeWhale` 或 `codewhale update` 更新。每个版本在 GitHub Release 之后都要经过 winget-pkgs 审核,因此 winget 可能落后于 GitHub/npm/Cargo;需要立即获得最新版本时,请使用 npm 或 GitHub Release 资源。
936
937 winget 方式的已知限制:
938
939 * **仅 x64。** 已发布的清单没有 ARM64 安装包。在 Windows ARM64 上,请在原生 ARM64 Node.js 下运行 `npm install -g codewhale`,或从 GitHub Releases 下载 `codewhale-windows-arm64.zip`。
940 * **仅安装 `codewhale`。** winget 不安装简短别名 `codew`;请使用 `codewhale`。
941 * 本仓库中的清单(`packaging/winget/`)不是 winget 实际提供的清单;见 [`packaging/winget/README.md`](../../packaging/winget/README.md)。
942
943 #### Windows NSIS 安装器
944
945 从 v0.8.50 起,为喜欢传统双击安装的 Windows 用户提供了独立的、基于 NSIS 的安装器(无需 npm、Scoop 或 Cargo)。
946
947 NSIS 安装器目前包含 Windows x64 二进制。Windows ARM64 用户应通过在原生 ARM64 Node.js 下运行的 npm 安装,或从同一个发布下载 `codewhale-windows-arm64.zip`;这两条路径使用的都是原生 ARM64 二进制。
948
949 从[发布页](https://github.com/codewhale-hq/CodeWhale/releases/latest)**下载** `CodeWhaleSetup.exe`。
950
951 双击安装程序即可**安装**。安装器会:
952
953 - 把 `codewhale.exe` 和 `codew.exe` 并排安装(单二进制,没有 `codewhale-tui.exe`)到 `%LOCALAPPDATA%\Programs\CodeWhale\bin`
954 - 安装 `codewhale.bat`:`PATH` 上有 Windows Terminal(`wt.exe`)时优先使用它,否则直接启动 exe
955 - 创建当前用户的开始菜单快捷方式,指向该启动器,而不是原始的 `.exe`
956 - 把安装目录加入**当前用户**的 `PATH`
957 - 注册到 Windows 的**应用和功能(Apps & Features)**,便于卸载
958
959 卸载会移除二进制、`codewhale.bat`、开始菜单快捷方式和用户 `PATH` 条目。
960
961 **静默安装**(供 IT 管理员、SCCM、Intune 使用):
962
963 ```powershell
964 CodeWhaleSetup.exe /S
965 ```
966
967 该安装器是每用户安装,不会请求提权。请在目标用户的环境中运行静默安装,或使用能为每个需要 Codewhale 的用户配置文件运行安装器的部署工具。
968
969 发布版构建的安装器目前未签名,可能触发 Windows SmartScreen。部署前请用 `codewhale-artifacts-sha256.txt` 校验 SHA-256 校验和;如果你的环境要求已签名的应用包,请在内部部署流水线中对安装程序签名。
970
971 **自行构建安装器**(需要 [NSIS](https://nsis.sourceforge.io)):
972
973 ```powershell
974 cd scripts\installer
975 # Place codewhale.exe and codew.exe here (single binary, no codewhale-tui.exe), then:
976 makensis /DVERSION=<version> codewhale.nsi
977 ```
978
979 (注释含义:把 codewhale.exe 和 codew.exe 放到这里,单二进制,没有 codewhale-tui.exe,然后运行 makensis。)
980
981 **手动回退**——如果安装器被组策略阻止,请参见 [CLASSROOM_INSTALL.md](../CLASSROOM_INSTALL.md) 指南中的分步 PowerShell 命令。
982
983 > **要部署到教室或实验室?** 请参见完整的[教室安装清单](../CLASSROOM_INSTALL.md),其中涵盖静默安装、API 密钥配发、系统镜像(imaging)说明和故障排查。
984
985 <a id="freebsd"></a>
986
987 ### FreeBSD、交叉编译、Windows 源码构建
988
989 #### FreeBSD 14+ 源码构建替代方案(#1097)
990
991 FreeBSD 没有预编译的 GitHub Release 资源——`npm install -g codewhale` 会有意失败,提示 `Unsupported platform: freebsd` 并指向 Cargo。请从源码安装:
992
993 ```bash
994 pkg install -y rust pkgconf git
995 cargo install codewhale-cli --locked # installs `codewhale`
996 codewhale --version
997 codewhale doctor
998 ```
999
1000 `rquickjs` 的 FreeBSD 绑定在构建时通过 `bindgen` 生成(见 `1582ba965`/`5eb0385e8`)。目前还没有单独的 `pkg install codewhale` 端口——原生端口作为 #1097 的后续工作,记录在 `packaging/freebsd/` 之下(欢迎贡献)。请在 release 分支上用 `cargo check --target x86_64-unknown-freebsd -p codewhale-cli --locked` 验证;7×1 发布矩阵(Linux musl x64/arm64、Android arm64、macOS x64/arm64、Windows x64/arm64)仍是 7 个目标——FreeBSD 是源码构建目标,不是预编译资源。
1001
1002 #### 从 x64 交叉编译到 ARM64 Linux
1003
1004 发布资源使用 `aarch64-unknown-linux-musl`,并在原生 ARM runner 上构建。如果你想在 x64 Linux 主机上构建一个 GNU 链接的 ARM64 Linux 二进制(例如给 HarmonyOS / openEuler ARM64 轻薄本用),请使用 [`cross`](https://github.com/cross-rs/cross),它把官方的 Rust 交叉目标封装在 Docker 容器里:
1005
1006 ```bash
1007 # Once
1008 rustup target add aarch64-unknown-linux-gnu
1009 cargo install cross --locked
1010
1011 # Per build
1012 cross build --release --target aarch64-unknown-linux-gnu -p codewhale-cli # single binary
1013 ```
1014
1015 生成的二进制位于 `target/aarch64-unknown-linux-gnu/release/codewhale`。把它复制到 ARM64 主机(例如通过 `scp`)并赋予可执行权限。这个本地 GNU 构建不同于可移植的 musl 发布资源;两种可执行文件都可以以 `codew` 这个便捷名称复制使用。
1016
1017 如果你没有 Docker,可以直接安装交叉链接器,让 Cargo 来完成工作:
1018
1019 ```bash
1020 sudo apt-get install -y gcc-aarch64-linux-gnu
1021 rustup target add aarch64-unknown-linux-gnu
1022
1023 cat >> ~/.cargo/config.toml <<'EOF'
1024 [target.aarch64-unknown-linux-gnu]
1025 linker = "aarch64-linux-gnu-gcc"
1026 EOF
1027
1028 cargo build --release --target aarch64-unknown-linux-gnu -p codewhale-cli # single binary
1029 ```
1030
1031 交叉编译时生成 `aarch64-unknown-linux-musl` 需要合适的 musl 交叉链接器。发布工作流通过在 GitHub 的原生 ARM runner 上构建并启动 musl 二进制,避免了这个额外的麻烦环节。
1032
1033 #### Windows 源码构建
1034
1035 在 Windows 上构建需要 [Visual Studio Build Tools](https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2022) 中的 **MSVC C 工具链**(免费的、可按工作负载选择的安装器,不是完整的 IDE)。
1036
1037 **前置条件(Windows)**
1038
1039 1. 安装 Visual Studio 2022 Build Tools——选择 **"使用 C++ 的桌面开发(Desktop development with C++)"** 工作负载。
1040 2. 安装 [Rust](https://rustup.rs) 1.89+(如果从中国大陆下载,参见上文[中国大陆/镜像友好安装](#中国大陆镜像友好安装))。
1041 3. 安装 [Git for Windows](https://git-scm.com/download/win)(提供 `git` 和 `git-bash` 终端)。
1042
1043 **推荐的终端**:Windows Terminal、`git-bash` 或 PowerShell。`cmd.exe` 可用,但缓冲区较小,PATH 行为也有限。
1044
1045 **设置 MSVC 环境**
1046
1047 Visual Studio Build Tools 会把 `cl.exe` 安装到带版本号的目录,但**不会**把它全局加入 `PATH`。你必须手动设置环境,或使用开发者命令提示符。所需的变量是:
1048
1049 ```powershell
1050 # Adjust version numbers to match your installation
1051 $msvc = "C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.44.35207"
1052 $sdk = "C:\Program Files (x86)\Windows Kits\10"
1053 $sdkv = "10.0.26100.0"
1054
1055 $env:INCLUDE = "$msvc\include;$msvc\atlmfc\include;$sdk\Include\$sdkv\ucrt;$sdk\Include\$sdkv\um;$sdk\Include\$sdkv\shared"
1056 $env:LIB = "$msvc\lib\x64;$msvc\atlmfc\lib\x64;$sdk\Lib\$sdkv\ucrt\x64;$sdk\Lib\$sdkv\um\x64"
1057 $env:LIBPATH = "$msvc\lib\x64;$msvc\atlmfc\lib\x64"
1058 $env:CC = "$msvc\bin\Hostx64\x64\cl.exe"
1059 $env:CXX = "$msvc\bin\Hostx64\x64\cl.exe"
1060 $env:PATH = "$msvc\bin\Hostx64\x64;$env:PATH"
1061 ```
1062
1063 (第一行注释含义:请调整版本号以匹配你的安装。)
1064
1065 或者,打开 **"VS 2022 开发者命令提示符(Developer Command Prompt for VS 2022)"**(安装 Build Tools 后可在开始菜单找到),它会运行 `vcvars64.bat` 自动配置上述所有内容。然后在该会话里把 `cargo` 加入 `PATH`,并从项目根目录运行 `cargo build`。
1066
1067 **Cargo 注册表镜像**——在 Windows 上,镜像配置放在 `%USERPROFILE%\.cargo\config.toml`。参见[上文第 2 步](#中国大陆镜像友好安装)。
1068
1069 **构建**
1070
1071 ```bash
1072 git clone https://github.com/codewhale-hq/CodeWhale.git
1073 cd CodeWhale
1074 set CARGO_HTTP_CHECK_REVOKE=false # may be needed behind some Chinese ISPs
1075 cargo build --release
1076 ```
1077
1078 (注释含义:在某些中国 ISP 之后可能需要。)
1079
1080 Cargo 构建出的二进制位于 `target\release\codewhale.exe`。发布打包会另外把同一个可执行文件作为 `codew.exe` 提供。
1081
1082 > 不想构建?通过 npm、Cargo、GitHub Releases 或 CNB 镜像安装——见上面各节。
1083
1084 ### 旧版本与地区性故障排查
1085
1086 #### `Unsupported architecture: arm64 on platform linux`
1087
1088 你使用的是早于 v0.8.8 的版本,它不发布 Linux ARM64 二进制。请按上文所述,使用 GitHub 安装器安装到一个全新的目录,或者按[第 5 节](#5-cargo-与从源码构建)使用 `cargo install`。
1089
1090 #### 升级旧安装后出现 `MISSING_COMPANION_BINARY`
1091
1092 当前的单二进制在进程内运行 TUI,不需要配套的可执行文件。这个错误说明存在一个过时的、早于 v0.9.5 的 dispatcher。请使用上文的新目录 GitHub 迁移方式,然后核对所选的 `codewhale` 和 `codew` 路径。不要再下载另一个单独的运行时。
1093
1094 #### `codewhale update` 报告 `no asset found for platform codewhale-linux-aarch64`
1095
1096 旧版更新器使用的 Rust 架构名与发布资源名不一致。请按上文所述,用官方安装器安装到一个全新的目录,然后通过完整路径运行新安装的命令。
1097
1098 #### 中国大陆 npm 下载慢或超时
1099
1100 在 Linux x64 上,npm 包装器已经并行探测 GitHub Releases 和 CNB 第一方校验和清单,并且只从第一个通过校验的来源下载二进制。这条自动路径不需要 `CODEWHALE_USE_CNB_MIRROR=1`。
1101
1102 如果两个第一方来源都失败,请把 `CODEWHALE_RELEASE_BASE_URL` 设置为镜像的发布资源目录(rsproxy、TUNA、腾讯云 COS、阿里云 OSS),或者完全跳过 npm,使用[第 5 节](#5-cargo-与从源码构建)里的 Cargo 镜像设置。旧的 `DEEPSEEK_TUI_RELEASE_BASE_URL` 名称仍被接受。`CODEWHALE_USE_CNB_MIRROR=1` 仍然只在 Linux x64 / OpenHarmony x64 上强制使用 CNB。
1103
1104 #### 中国大陆无法从 GitHub 使用 `codewhale update`
1105
1106 `codewhale update` 优先使用 GitHub Releases。在受支持的 Linux x64 目标上,GitHub 清单请求失败时,允许回退到对应的 CNB 清单和二进制。如果 GitHub 元数据也无法访问,请显式选择一个已知已发布的 CNB 版本(`CODEWHALE_USE_CNB_MIRROR=1 CODEWHALE_VERSION=X.Y.Z codewhale update`),或使用下面的二进制镜像。已有的较新构建会被保留。
1107
1108 用 Cargo 从 CNB 源码镜像构建是次要选项。Cargo 会安装它自己管理的 `codewhale` 命令:
1109
1110 要在不下载、不替换二进制的情况下检查最新发布,运行 `codewhale update --check`。
1111
1112 ```bash
1113 cargo install --git https://cnb.cool/codewhale.net/codewhale --tag vX.Y.Z codewhale-cli --locked --force # single binary
1114 ```
1115
1116 如果你运营一个二进制资源镜像,`codewhale update` 可以直接使用它:
1117
1118 ```bash
1119 CODEWHALE_RELEASE_BASE_URL=https://your-mirror.example.com/CodeWhale/vX.Y.Z/ \
1120 CODEWHALE_VERSION=X.Y.Z \
1121 codewhale update
1122 ```
1123
1124 镜像目录必须包含 `codewhale-artifacts-sha256.txt` 以及来自 GitHub 发布的各平台二进制。旧的 `DEEPSEEK_TUI_RELEASE_BASE_URL` 镜像变量仍作为别名受支持。
1125
1126 ### Windows 与 npm 下载故障排查
1127
1128 #### Windows:`rustup-init` 报 `TLS handshake eof` 或 `CRYPT_E_REVOCATION_OFFLINE`
1129
1130 在防火长城(GFW)或某些中国 ISP 之后,到 `static.rust-lang.org` 的 TLS 握手会失败。请在运行安装器**之前**设置 rustup 镜像环境变量:
1131
1132 ```bash
1133 # git-bash / msys2
1134 export RUSTUP_DIST_SERVER=https://mirrors.tuna.tsinghua.edu.cn/rustup
1135 export RUSTUP_UPDATE_ROOT=https://mirrors.tuna.tsinghua.edu.cn/rustup/rustup
1136 ./rustup-init.exe -y --default-toolchain stable
1137 ```
1138
1139 如果 Rust 装好之后 Cargo 报 `CRYPT_E_REVOCATION_OFFLINE`,请在 `cargo build` 期间同时设置 `CARGO_HTTP_CHECK_REVOKE=false`。
1140
1141 #### Windows:`cargo build` 期间找不到 MSVC 编译器(`cl.exe`)
1142
1143 Visual Studio Build Tools 不会把 `cl.exe` 加入全局 `PATH`。二选一:
1144
1145 1. 从开始菜单打开 **"VS 2022 开发者命令提示符"**,在该窗口里把 `%USERPROFILE%\.cargo\bin` 加入 `PATH`,并从那里运行 `cargo build`;或
1146 2. 手动设置 MSVC 环境变量——PowerShell 片段见 [Windows 源码构建](#windows-源码构建)一节。
1147
1148 验证编译器可用:`cl.exe /?` 应该会打印帮助文本。
1149
1150 #### Windows:Cargo 执行构建脚本时报 `拒绝访问 (os error 5)`
1151
1152 第三方杀毒软件(火绒、360、卡巴斯基等)可能会阻止 Cargo 执行刚编译出来的构建脚本二进制(例如 `libsqlite3-sys`、`aws-lc-sys`、`instability`)。这个错误与路径无关——移动 `target-dir` 也没有帮助。
1153
1154 **症状**:`could not execute process ... build-script-build (never executed)`
1155
1156 **变通办法**(任选其一):
1157
1158 1. **把项目的 `target/` 目录加入杀毒软件的排除列表。**
1159 2. **在 `cargo build` 期间暂时关闭杀毒软件。**
1160 3. **改用 GitHub Release 安装器/压缩包**——发布资源提供预编译二进制,完全跳过 Cargo 构建([第 3 节](#3-从-github-releases-手动下载))。
1161 4. **使用 crates.io 的 `cargo install codewhale-cli --locked`**——这会改变二进制路径,某些杀毒软件对不同路径的处理方式不同。
1162
1163 要验证构建脚本二进制本身是否有效(没有损坏),在 `target/debug/build/<crate>/build-script-build` 下找到它并手动运行:
1164
1165 ```bash
1166 target/debug/build/libsqlite3-sys-*/build-script-build
1167 # If this runs but panics with "NotPresent" (no C compiler), the binary is
1168 # fine — the AV is blocking Cargo's process-spawning path specifically.
1169 ```
1170
1171 (注释含义:如果它能运行,但以 "NotPresent"(没有 C 编译器)panic,说明这个二进制没问题——是杀毒软件专门在阻止 Cargo 的进程派生路径。)
1172
1173 #### npm 二进制下载超时
1174
1175 如果 `codewhale` 等待几秒后,在从 `github.com` 拉取时打印 `connect ETIMEDOUT` 或 `EAI_AGAIN`,说明 npm 包装器安装成功了,但预编译二进制的下载在你的网络上被屏蔽或不稳定。这次下载与 npm 注册表的包下载是分开的。在 Linux x64 上,包装器会先并行探测体积很小的 GitHub 和 CNB 校验清单,不会等到完整的 GitHub 二进制超时,才去使用有效的 CNB 清单。
1176
1177 请使用以下路径之一:
1178
1179 1. 设置代理并重试:
1180
1181 ```bash
1182 export HTTPS_PROXY=http://your-proxy:port
1183 codewhale
1184 ```
1185
1186 2. 在内部镜像发布资源,并设置 `CODEWHALE_RELEASE_BASE_URL`:
1187
1188 ```bash
1189 export CODEWHALE_RELEASE_BASE_URL=https://your-mirror.example.com/CodeWhale/
1190 codewhale
1191 ```
1192
1193 该目录必须包含 `codewhale-artifacts-sha256.txt` 以及来自 GitHub 发布的各平台二进制。
1194
1195 3. 通过 Cargo 安装,它在本地构建,不下载 GitHub 发布资源。见[第 5 节](#5-cargo-与从源码构建)。
1196
1197 4. 从[发布页](https://github.com/codewhale-hq/CodeWhale/releases)下载匹配的 `codewhale` 和 `codew` 两个二进制,放到 `PATH` 上的某个目录并赋予可执行权限。见[第 3 节](#3-从-github-releases-手动下载)。
1198
1198 lines MARKDOWN