| 1 | # Rebrand: DeepSeek TUI → Codewhale |
| 2 | |
| 3 | Starting with **v0.8.41**, this project ships under a new name: `codewhale`. |
| 4 | |
| 5 | This document explains what changed, what didn't, and how to migrate. None of the |
| 6 | DeepSeek provider integration changed — only the local CLI / TUI brand. |
| 7 | |
| 8 | ## TL;DR |
| 9 | |
| 10 | ```bash |
| 11 | # 1. Uninstall the old wrapper or binaries. |
| 12 | npm uninstall -g deepseek-tui # or: |
| 13 | cargo uninstall deepseek-tui-cli 2>/dev/null || true |
| 14 | cargo uninstall deepseek-tui 2>/dev/null || true |
| 15 | # Homebrew: |
| 16 | # brew upgrade codewhale |
| 17 | |
| 18 | # 2. Install under the new name. |
| 19 | npm install -g codewhale # or: |
| 20 | cargo install codewhale-cli --locked |
| 21 | # Homebrew: |
| 22 | # brew tap Hmbown/deepseek-tui |
| 23 | # brew install codewhale |
| 24 | |
| 25 | # 3. Run with the new command. |
| 26 | codewhale doctor |
| 27 | codewhale |
| 28 | ``` |
| 29 | |
| 30 | Your existing `~/.deepseek/config.toml`, `~/.deepseek/sessions/`, |
| 31 | `~/.deepseek/skills/`, `~/.deepseek/tasks/`, and `~/.deepseek/mcp.json` are |
| 32 | not deleted. New Codewhale installs prefer `~/.codewhale/`, and legacy |
| 33 | `~/.deepseek/` state remains a read fallback while you migrate. Existing |
| 34 | `DEEPSEEK_*` environment variables continue to work. |
| 35 | |
| 36 | ## What got renamed |
| 37 | |
| 38 | | Surface | Before | After | |
| 39 | |---|---|---| |
| 40 | | Installed commands | `deepseek` / `deepseek-tui` | `codewhale` / `codew` | |
| 41 | | npm wrapper package | `deepseek-tui` | `codewhale` | |
| 42 | | Crates.io crates | `deepseek-tui-cli` / `deepseek-tui` / `deepseek-*` | `codewhale-cli` / `codewhale-tui` / `codewhale-*` | |
| 43 | | Release assets | `deepseek-<platform>` / `deepseek-tui-<platform>` | `codewhale-<platform>` / `codew-<platform>`; `codewhale-tui-<platform>` remains a compatibility-only filename | |
| 44 | | Checksum manifest | `deepseek-artifacts-sha256.txt` | `codewhale-artifacts-sha256.txt` | |
| 45 | |
| 46 | ## What changed for local state |
| 47 | |
| 48 | New installs write product-owned state under `~/.codewhale/`. Existing |
| 49 | `~/.deepseek/` config, sessions, skills, tasks, MCP config, memory, and notes |
| 50 | remain readable as legacy fallbacks while you migrate. Codewhale never deletes |
| 51 | the legacy directory automatically. |
| 52 | |
| 53 | ## What did NOT change |
| 54 | |
| 55 | Anything that targets the DeepSeek provider API stays exactly as it was: |
| 56 | |
| 57 | - **Environment variables**: `DEEPSEEK_API_KEY`, `DEEPSEEK_BASE_URL`, |
| 58 | `DEEPSEEK_MODEL`, `DEEPSEEK_PROVIDER`, `DEEPSEEK_PROFILE`, |
| 59 | `DEEPSEEK_LOG_LEVEL`, plus the existing `DEEPSEEK_TUI_*` runtime knobs |
| 60 | (`DEEPSEEK_TUI_BIN`, `DEEPSEEK_TUI_RELEASE_BASE_URL`, etc.). They're kept |
| 61 | for backward compatibility; renaming them would break every shell rc on |
| 62 | the planet. |
| 63 | - **`DEEPSEEK_YOLO`**: now deprecated, but still read as an alias of |
| 64 | `CODEWHALE_YOLO` through 0.9.x so existing scripts keep working (when both |
| 65 | are set, `CODEWHALE_YOLO` wins). It is removed in 0.10 (#5443); use |
| 66 | `CODEWHALE_YOLO` in new scripts. |
| 67 | - **Model IDs**: `deepseek-v4-pro`, `deepseek-v4-flash`, and the legacy |
| 68 | aliases `deepseek-chat` and `deepseek-reasoner`. |
| 69 | - **Hosts**: `api.deepseek.com` (global). The legacy typo host |
| 70 | `api.deepseeki.com` is not an official DeepSeek endpoint; it is only |
| 71 | still accepted in URL heuristics for existing configs and is not |
| 72 | offered as a fallback (#1079). |
| 73 | - **GitHub repository URL**: `https://github.com/Hmbown/CodeWhale`. |
| 74 | The old `Hmbown/DeepSeek-TUI` URL redirects there during the transition. |
| 75 | - **Homebrew tap and formula**: the formula is `codewhale`. The tap GitHub |
| 76 | repo is still `Hmbown/homebrew-deepseek-tui` until it is renamed; |
| 77 | `brew tap Hmbown/deepseek-tui && brew install codewhale` is the current |
| 78 | path. The legacy `deepseek-tui` formula remains a deprecated alias for |
| 79 | one overlap release. |
| 80 | - **Docker image**: `ghcr.io/hmbown/codewhale`. |
| 81 | |
| 82 | ## Deprecation shims (removed in v0.9.0) |
| 83 | |
| 84 | To keep existing shell aliases, scripts, and CI working through the rename, |
| 85 | v0.8.41 and later v0.8.x releases shipped **deprecation shims**: |
| 86 | |
| 87 | - A `deepseek` binary that prints a one-line warning to stderr and forwards |
| 88 | argv to `codewhale`. |
| 89 | - A `deepseek-tui` binary that does the same for `codewhale-tui`. |
| 90 | - The legacy `deepseek-tui` npm package is deprecated and no longer receives |
| 91 | new releases. Install the `codewhale` npm package instead. |
| 92 | |
| 93 | These binary shims are removed in **v0.9.0**. DeepSeek provider support, model |
| 94 | IDs, `DEEPSEEK_*` environment variables, and legacy `~/.deepseek/` state |
| 95 | fallbacks remain supported. |
| 96 | |
| 97 | ## Migrating in practice |
| 98 | |
| 99 | ### npm |
| 100 | |
| 101 | ```bash |
| 102 | npm uninstall -g deepseek-tui |
| 103 | npm install -g codewhale |
| 104 | ``` |
| 105 | |
| 106 | ### Cargo |
| 107 | |
| 108 | ```bash |
| 109 | cargo uninstall deepseek-tui-cli 2>/dev/null || true |
| 110 | cargo uninstall deepseek-tui 2>/dev/null || true |
| 111 | cargo install codewhale-cli --locked |
| 112 | ``` |
| 113 | |
| 114 | Or in a checkout: |
| 115 | |
| 116 | ```bash |
| 117 | cargo install --path crates/cli --locked --force |
| 118 | ``` |
| 119 | |
| 120 | Cargo installs the canonical `codewhale` command. Release/npm/Homebrew |
| 121 | installers also provide the byte-identical `codew` short name; Cargo users can |
| 122 | add an optional `codew` symlink beside `codewhale`. |
| 123 | |
| 124 | ### Legacy `deepseek update` |
| 125 | |
| 126 | Current v0.8.x compatibility binaries recognize when they are running under a |
| 127 | legacy `deepseek` or `deepseek-tui` filename. In that case, `deepseek update` |
| 128 | or `deepseek-tui update` downloads the canonical Codewhale release assets and |
| 129 | installs them beside the legacy binary as `codewhale` and `codewhale-tui` when |
| 130 | the install directory is writable. That describes the historical v0.8 |
| 131 | compatibility updater, not the current install surface; after upgrading, use |
| 132 | `codewhale` or `codew`. |
| 133 | |
| 134 | If that update path cannot write to the install directory, use the npm, Cargo, |
| 135 | Homebrew, or manual reinstall commands above. The legacy npm package |
| 136 | `deepseek-tui` remains deprecated and is not republished; npm users should move |
| 137 | to `npm install -g codewhale`. |
| 138 | |
| 139 | ### Homebrew |
| 140 | |
| 141 | **Current published state (v0.9.13, published 2026-09-14; workspace source version 0.9.13):** The |
| 142 | formula is `codewhale`. New installs: |
| 143 | |
| 144 | ```bash |
| 145 | brew tap Hmbown/deepseek-tui |
| 146 | brew install codewhale |
| 147 | brew upgrade codewhale |
| 148 | ``` |
| 149 | |
| 150 | The tap GitHub repo is still `Hmbown/homebrew-deepseek-tui` until it is |
| 151 | renamed to `Hmbown/homebrew-codewhale` (then `brew tap Hmbown/codewhale` |
| 152 | works; the old tap name keeps working through GitHub's redirect). The |
| 153 | legacy `deepseek-tui` formula remains a deprecated alias for this overlap |
| 154 | release so existing `brew upgrade deepseek-tui` crontabs keep working. |
| 155 | |
| 156 | **Remaining rollout:** |
| 157 | |
| 158 | 1. Rename the tap repo to `Hmbown/homebrew-codewhale` when adding |
| 159 | `HOMEBREW_TAP_PAT`, then tell Codewhalebot. |
| 160 | 2. After one more minor release, remove the `deepseek-tui` alias. |
| 161 | |
| 162 | ### Manual / GitHub Releases |
| 163 | |
| 164 | `v0.8.41` through `v0.8.x` Releases attached the canonical `codewhale-*` / |
| 165 | `codewhale-tui-*` assets (plus `codew-*` from v0.8.66 onward) and |
| 166 | compatibility-only `deepseek-*` / `deepseek-tui-*` shim assets. Starting in |
| 167 | v0.9.0, Releases attach the current `codewhale-*` / `codew-*` assets, the |
| 168 | `codewhale-artifacts-sha256.txt` checksum manifest, and byte-identical |
| 169 | `codewhale-tui-*` compatibility filenames required by legacy update clients. |
| 170 | Those compatibility filenames are not a third installed command. Install or |
| 171 | update through `codewhale` before moving to v0.9.0. |
| 172 | |
| 173 | ### Sessions, skills, and manual workspaces |
| 174 | |
| 175 | Renaming the binary does not require starting over: |
| 176 | |
| 177 | - **Config**: on first launch, Codewhale copies `~/.deepseek/config.toml` to |
| 178 | `~/.codewhale/config.toml` if the Codewhale file does not already exist. |
| 179 | It never overwrites a newer Codewhale config. You can inspect the active path |
| 180 | with `codewhale doctor`. |
| 181 | - **Sessions and tasks**: managed state is read from `~/.codewhale/...` when |
| 182 | present, with `~/.deepseek/...` used as the legacy fallback when only the old |
| 183 | directory exists. Existing saved sessions still appear in `codewhale sessions` |
| 184 | and the TUI resume picker. |
| 185 | - **Skills**: Codewhale discovers workspace skills first, then global skills, |
| 186 | including both `~/.codewhale/skills` and legacy `~/.deepseek/skills`. Existing |
| 187 | skill directories with `SKILL.md` do not need to be rewritten. |
| 188 | - **MCP config**: the default path is `~/.codewhale/mcp.json`. If that file is |
| 189 | absent, Codewhale still reads legacy `~/.deepseek/mcp.json`. To use a custom |
| 190 | MCP config file, set `mcp_config_path` in `config.toml` or |
| 191 | `DEEPSEEK_MCP_CONFIG`. |
| 192 | - **Manual binary installs**: keep the two current command files together on |
| 193 | your `PATH`: `codewhale` and `codew`. On Windows, the |
| 194 | recommended user-local location is `%LOCALAPPDATA%\Programs\CodeWhale\bin`. |
| 195 | On Unix-like systems, any user-writable `PATH` directory is fine as long as |
| 196 | both commands are present. Do not install a compatibility-only |
| 197 | `codewhale-tui-*` release filename as a third command. |
| 198 | - **Specified work directories**: running `codewhale` from a project directory, |
| 199 | or launching it with a specific workspace path, does not move project files. |
| 200 | Codewhale reads `<workspace>/.codewhale/config.toml` first and falls back to |
| 201 | legacy `<workspace>/.deepseek/config.toml` when the new path is absent. |
| 202 | |
| 203 | If both `~/.codewhale/...` and `~/.deepseek/...` copies exist, the Codewhale |
| 204 | path wins. Keep the legacy directory until you have confirmed `codewhale |
| 205 | doctor`, `codewhale sessions`, and your expected skills all show the same state. |
| 206 | |
| 207 | ### If sessions appear missing after an upgrade |
| 208 | |
| 209 | Run `codewhale doctor` before copying or deleting anything. Doctor compares |
| 210 | top-level session JSON **filenames and filesystem metadata only** between |
| 211 | `~/.deepseek/sessions/` and `~/.codewhale/sessions/`. It does not read chat |
| 212 | contents, traverse `checkpoints/`, or modify either directory. The JSON form |
| 213 | exposes the same result at `legacy_state.session_recovery`. |
| 214 | |
| 215 | If doctor lists recoverable filenames: |
| 216 | |
| 217 | 1. Back up both session directories (if present) and close other Codewhale |
| 218 | processes. |
| 219 | 2. Run `codewhale sessions`. This invokes the existing additive migration, |
| 220 | which creates only missing destination files, never overwrites a file that |
| 221 | already exists under `~/.codewhale/sessions/`, skips checkpoint internals, |
| 222 | and leaves every legacy original in place. |
| 223 | 3. Rerun `codewhale doctor`, then confirm the sessions appear with `codewhale |
| 224 | sessions`. If any filenames remain listed, keep both backups and report the |
| 225 | listed source/destination filenames without sharing chat contents. |
| 226 | |
| 227 | An explicit `CODEWHALE_HOME` intentionally isolates that home and disables the |
| 228 | ambient `~/.deepseek` fallback. Doctor will not inspect the ambient legacy home |
| 229 | in that mode. To diagnose the default home without changing the isolated one, |
| 230 | use a separate shell with `CODEWHALE_HOME` unset and rerun `codewhale doctor`. |
| 231 | |
| 232 | ## Why the name change |
| 233 | |
| 234 | Codewhale is a shorter, terminal-friendlier handle for the same terminal |
| 235 | coding agent and the longer-term product direction: an agentic terminal for |
| 236 | open source and open-weight coding models, with DeepSeek — the provider the |
| 237 | project started with — remaining first-class alongside every other provider. The project name, |
| 238 | command names, package names, release assets, Docker image, and CNB mirror move |
| 239 | to Codewhale; the official DeepSeek provider, model IDs, env vars, and |
| 240 | `~/.deepseek/` config surface remain first-class. |
| 241 | |
| 242 | ## Reporting issues with the rename |
| 243 | |
| 244 | If your install broke during the migration, please open an issue at |
| 245 | <https://github.com/Hmbown/CodeWhale/issues> and include: |
| 246 | |
| 247 | - The output of `codewhale --version` (or `deepseek --version` if you're |
| 248 | still on the shim). |
| 249 | - Which install path you used (npm, cargo, brew, manual). |
| 250 | - The exact command you ran and the full error output. |
| 251 | |
| 252 | We'll prioritize migration regressions. |
| 253 |