Prepare v0.9.0 release build

This commit is contained in:
Hunter B
2026-06-06 19:39:02 -07:00
parent 59d12f3b6a
commit 9b500a7b91
28 changed files with 122 additions and 290 deletions
+1 -44
View File
@@ -3,7 +3,7 @@
#
# Expected environment:
# TAG git tag, e.g. "v0.8.31"
# MANIFEST path to deepseek-artifacts-sha256.txt
# MANIFEST path to codewhale-artifacts-sha256.txt
# TAP_REPO owner/repo of the Homebrew tap
# TOKEN PAT with contents:write on TAP_REPO (optional; skips if unset)
@@ -43,15 +43,6 @@ readonly SHA_COD_LINUX_ARM="$(sha codewhale-linux-arm64)"
readonly SHA_TUI_LINUX_ARM="$(sha codewhale-tui-linux-arm64)"
readonly SHA_COD_LINUX_X64="$(sha codewhale-linux-x64)"
readonly SHA_TUI_LINUX_X64="$(sha codewhale-tui-linux-x64)"
# Legacy shims (removed in v0.9.0)
readonly SHA_LEG_MACOS_ARM="$(sha deepseek-macos-arm64)"
readonly SHA_LEG_TUI_MACOS_ARM="$(sha deepseek-tui-macos-arm64)"
readonly SHA_LEG_MACOS_X64="$(sha deepseek-macos-x64)"
readonly SHA_LEG_TUI_MACOS_X64="$(sha deepseek-tui-macos-x64)"
readonly SHA_LEG_LINUX_ARM="$(sha deepseek-linux-arm64)"
readonly SHA_LEG_TUI_LINUX_ARM="$(sha deepseek-tui-linux-arm64)"
readonly SHA_LEG_LINUX_X64="$(sha deepseek-linux-x64)"
readonly SHA_LEG_TUI_LINUX_X64="$(sha deepseek-tui-linux-x64)"
# --- temp dirs --------------------------------------------------------
@@ -78,14 +69,6 @@ class DeepseekTui < Formula
url "${BASE_URL}/codewhale-tui-macos-arm64", using: :nounzip
sha256 "${SHA_TUI_MACOS_ARM}"
end
resource "legacy-shim" do
url "${BASE_URL}/deepseek-macos-arm64", using: :nounzip
sha256 "${SHA_LEG_MACOS_ARM}"
end
resource "legacy-tui-shim" do
url "${BASE_URL}/deepseek-tui-macos-arm64", using: :nounzip
sha256 "${SHA_LEG_TUI_MACOS_ARM}"
end
else
url "${BASE_URL}/codewhale-macos-x64", using: :nounzip
sha256 "${SHA_COD_MACOS_X64}"
@@ -93,14 +76,6 @@ class DeepseekTui < Formula
url "${BASE_URL}/codewhale-tui-macos-x64", using: :nounzip
sha256 "${SHA_TUI_MACOS_X64}"
end
resource "legacy-shim" do
url "${BASE_URL}/deepseek-macos-x64", using: :nounzip
sha256 "${SHA_LEG_MACOS_X64}"
end
resource "legacy-tui-shim" do
url "${BASE_URL}/deepseek-tui-macos-x64", using: :nounzip
sha256 "${SHA_LEG_TUI_MACOS_X64}"
end
end
end
@@ -112,14 +87,6 @@ class DeepseekTui < Formula
url "${BASE_URL}/codewhale-tui-linux-arm64", using: :nounzip
sha256 "${SHA_TUI_LINUX_ARM}"
end
resource "legacy-shim" do
url "${BASE_URL}/deepseek-linux-arm64", using: :nounzip
sha256 "${SHA_LEG_LINUX_ARM}"
end
resource "legacy-tui-shim" do
url "${BASE_URL}/deepseek-tui-linux-arm64", using: :nounzip
sha256 "${SHA_LEG_TUI_LINUX_ARM}"
end
else
url "${BASE_URL}/codewhale-linux-x64", using: :nounzip
sha256 "${SHA_COD_LINUX_X64}"
@@ -127,22 +94,12 @@ class DeepseekTui < Formula
url "${BASE_URL}/codewhale-tui-linux-x64", using: :nounzip
sha256 "${SHA_TUI_LINUX_X64}"
end
resource "legacy-shim" do
url "${BASE_URL}/deepseek-linux-x64", using: :nounzip
sha256 "${SHA_LEG_LINUX_X64}"
end
resource "legacy-tui-shim" do
url "${BASE_URL}/deepseek-tui-linux-x64", using: :nounzip
sha256 "${SHA_LEG_TUI_LINUX_X64}"
end
end
end
def install
bin.install Dir["*"].first => "codewhale"
resource("tui").stage { bin.install Dir["*"].first => "codewhale-tui" }
resource("legacy-shim").stage { bin.install Dir["*"].first => "deepseek" }
resource("legacy-tui-shim").stage { bin.install Dir["*"].first => "deepseek-tui" }
end
test do
+2 -53
View File
@@ -159,48 +159,6 @@ jobs:
target: x86_64-pc-windows-msvc
binary: codewhale-tui.exe
artifact_name: codewhale-tui-windows-x64.exe
# --- deepseek (legacy dispatcher shim; compatibility-only) ---
- os: ubuntu-latest
target: x86_64-unknown-linux-gnu
binary: deepseek
artifact_name: deepseek-linux-x64
- os: ubuntu-latest
target: aarch64-unknown-linux-gnu
binary: deepseek
artifact_name: deepseek-linux-arm64
- os: macos-latest
target: x86_64-apple-darwin
binary: deepseek
artifact_name: deepseek-macos-x64
- os: macos-latest
target: aarch64-apple-darwin
binary: deepseek
artifact_name: deepseek-macos-arm64
- os: windows-latest
target: x86_64-pc-windows-msvc
binary: deepseek.exe
artifact_name: deepseek-windows-x64.exe
# --- deepseek-tui (legacy TUI shim; compatibility-only) ---
- os: ubuntu-latest
target: x86_64-unknown-linux-gnu
binary: deepseek-tui
artifact_name: deepseek-tui-linux-x64
- os: ubuntu-latest
target: aarch64-unknown-linux-gnu
binary: deepseek-tui
artifact_name: deepseek-tui-linux-arm64
- os: macos-latest
target: x86_64-apple-darwin
binary: deepseek-tui
artifact_name: deepseek-tui-macos-x64
- os: macos-latest
target: aarch64-apple-darwin
binary: deepseek-tui
artifact_name: deepseek-tui-macos-arm64
- os: windows-latest
target: x86_64-pc-windows-msvc
binary: deepseek-tui.exe
artifact_name: deepseek-tui-windows-x64.exe
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
@@ -504,8 +462,6 @@ jobs:
- uses: actions/download-artifact@v4
with:
path: artifacts
# Match both the canonical `codewhale*` artifacts and the legacy
# `deepseek*` shim artifacts that ship for the transition release.
pattern: '*'
- name: Generate Windows npm launcher asset
shell: bash
@@ -537,11 +493,6 @@ jobs:
base="$(basename "${file}")"
printf '%s %s\n' "${hash}" "${base}" >> "${manifest}"
done < <(find artifacts -type f ! -path 'artifacts/checksums/*' -print0 | sort -z)
# Legacy alias manifest so v0.8.40 `deepseek update` clients can
# still find a manifest by their hardcoded name. Same content as the
# canonical manifest; retire it only with an explicit release-infra
# cutover that also removes the legacy shim artifacts.
cp "${manifest}" "artifacts/checksums/deepseek-artifacts-sha256.txt"
cat "${manifest}"
- uses: softprops/action-gh-release@v1
with:
@@ -632,8 +583,6 @@ jobs:
shasum -a 256 -c codewhale-artifacts-sha256.txt
```
The legacy `deepseek-artifacts-sha256.txt` is also attached for backward compatibility and contains the same hashes as the canonical manifest.
## Contributors
Thanks to @sximelon, @cyq1017, @Artenx, @LHqweasd, @wywsoor,
@@ -679,13 +628,13 @@ jobs:
run: |
gh release download ${{ needs.resolve.outputs.tag }} \
--repo ${{ github.repository }} \
--pattern 'deepseek-artifacts-sha256.txt' \
--pattern 'codewhale-artifacts-sha256.txt' \
--dir /tmp
- name: Update Homebrew tap
if: steps.homebrew-token.outputs.available == 'true'
env:
TAG: ${{ needs.resolve.outputs.tag }}
MANIFEST: /tmp/deepseek-artifacts-sha256.txt
MANIFEST: /tmp/codewhale-artifacts-sha256.txt
TAP_REPO: Hmbown/homebrew-deepseek-tui
TOKEN: ${{ secrets.HOMEBREW_TAP_PAT || secrets.RELEASE_TAG_PAT }}
run: bash .github/scripts/update-homebrew-tap.sh
+16 -1
View File
@@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
## [0.9.0] - 2026-06-07
### Added
- Added `/restore list [N]` so users can inspect more side-git rollback
@@ -233,6 +235,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
- Removed the deprecated `deepseek` and `deepseek-tui` binary shims from the
v0.9.0 Cargo crates and GitHub release artifact matrix. The canonical
`codewhale`, `codew`, and `codewhale-tui` entry points remain, the private
deprecated `npm/deepseek-tui` notice package stays unpublished, and DeepSeek
provider/model/env/config compatibility remains first-class.
- Command-adjacent config persistence and auto model routing now live in
neutral TUI modules instead of command-owned files, reducing command-boundary
coupling while preserving current `/config`, `/model`, UI, runtime, and
sub-agent behavior (#2871). Thanks @aboimpinto for landing this first staged
command-boundary layer from the broader #2851/#2791 design direction.
- `/config` now reports the canonical `~/.codewhale/settings.toml` path for TUI
settings while still reading legacy DeepSeek-branded settings fallbacks and
migrating them into the CodeWhale home on load.
@@ -407,6 +419,8 @@ HarmonyOS/OpenHarmony port and MatePad Edge validation trail (#2634),
#2867), **@reidliu41** for the hotbar action-registry foundation (#2866), and
**@ljm3790865** for the multi-tab core/persistence foundation and broader
collaboration direction (#2864, #2753),
**@aboimpinto** for the direct command-support boundary cleanup in #2871 and
the broader #2851/#2791 command-layer design direction,
**@idling11** for the PlanArtifact direction in Plan mode (#2733), the dense
tool-call transcript collapse/sidebar detail direction (#2738, #2734, #2692,
#2694), and the HarnessPosture config model for provider/model posture (#2741,
@@ -5836,7 +5850,8 @@ Welcome — and thank you.
- Hooks system and config profiles
- Example skills and launch assets
[Unreleased]: https://github.com/Hmbown/CodeWhale/compare/v0.8.53...HEAD
[Unreleased]: https://github.com/Hmbown/CodeWhale/compare/v0.9.0...HEAD
[0.9.0]: https://github.com/Hmbown/CodeWhale/compare/v0.8.53...v0.9.0
[0.8.53]: https://github.com/Hmbown/CodeWhale/compare/v0.8.52...v0.8.53
[0.8.52]: https://github.com/Hmbown/CodeWhale/compare/v0.8.51...v0.8.52
[0.8.51]: https://github.com/Hmbown/CodeWhale/compare/v0.8.50...v0.8.51
Generated
+16 -16
View File
@@ -770,7 +770,7 @@ checksum = "e9b18233253483ce2f65329a24072ec414db782531bdbb7d0bbc4bd2ce6b7e21"
[[package]]
name = "codewhale-agent"
version = "0.8.53"
version = "0.9.0"
dependencies = [
"codewhale-config",
"serde",
@@ -778,7 +778,7 @@ dependencies = [
[[package]]
name = "codewhale-app-server"
version = "0.8.53"
version = "0.9.0"
dependencies = [
"anyhow",
"axum",
@@ -804,7 +804,7 @@ dependencies = [
[[package]]
name = "codewhale-cli"
version = "0.8.53"
version = "0.9.0"
dependencies = [
"anyhow",
"chrono",
@@ -832,7 +832,7 @@ dependencies = [
[[package]]
name = "codewhale-config"
version = "0.8.53"
version = "0.9.0"
dependencies = [
"anyhow",
"codewhale-execpolicy",
@@ -846,7 +846,7 @@ dependencies = [
[[package]]
name = "codewhale-core"
version = "0.8.53"
version = "0.9.0"
dependencies = [
"anyhow",
"chrono",
@@ -864,7 +864,7 @@ dependencies = [
[[package]]
name = "codewhale-execpolicy"
version = "0.8.53"
version = "0.9.0"
dependencies = [
"anyhow",
"codewhale-protocol",
@@ -873,7 +873,7 @@ dependencies = [
[[package]]
name = "codewhale-hooks"
version = "0.8.53"
version = "0.9.0"
dependencies = [
"anyhow",
"async-trait",
@@ -887,7 +887,7 @@ dependencies = [
[[package]]
name = "codewhale-mcp"
version = "0.8.53"
version = "0.9.0"
dependencies = [
"anyhow",
"serde",
@@ -896,7 +896,7 @@ dependencies = [
[[package]]
name = "codewhale-protocol"
version = "0.8.53"
version = "0.9.0"
dependencies = [
"serde",
"serde_json",
@@ -904,7 +904,7 @@ dependencies = [
[[package]]
name = "codewhale-release"
version = "0.8.53"
version = "0.9.0"
dependencies = [
"anyhow",
"reqwest",
@@ -916,7 +916,7 @@ dependencies = [
[[package]]
name = "codewhale-secrets"
version = "0.8.53"
version = "0.9.0"
dependencies = [
"dirs",
"keyring",
@@ -929,7 +929,7 @@ dependencies = [
[[package]]
name = "codewhale-state"
version = "0.8.53"
version = "0.9.0"
dependencies = [
"anyhow",
"chrono",
@@ -941,7 +941,7 @@ dependencies = [
[[package]]
name = "codewhale-tools"
version = "0.8.53"
version = "0.9.0"
dependencies = [
"anyhow",
"async-trait",
@@ -955,7 +955,7 @@ dependencies = [
[[package]]
name = "codewhale-tui"
version = "0.8.53"
version = "0.9.0"
dependencies = [
"anyhow",
"arboard",
@@ -1026,11 +1026,11 @@ dependencies = [
[[package]]
name = "codewhale-tui-core"
version = "0.8.53"
version = "0.9.0"
[[package]]
name = "codewhale-whaleflow"
version = "0.8.53"
version = "0.9.0"
dependencies = [
"anyhow",
"serde",
+1 -1
View File
@@ -21,7 +21,7 @@ default-members = ["crates/cli", "crates/app-server", "crates/tui"]
resolver = "2"
[workspace.package]
version = "0.8.53"
version = "0.9.0"
edition = "2024"
# Rust 1.88 stabilized `let_chains` in `if`/`while` conditions, which the
# codebase relies on extensively. Cargo enforces this so users on older
+1 -1
View File
@@ -7,5 +7,5 @@ repository.workspace = true
description = "Model/provider registry and fallback strategy for DeepSeek workspace architecture"
[dependencies]
codewhale-config = { path = "../config", version = "0.8.53" }
codewhale-config = { path = "../config", version = "0.9.0" }
serde.workspace = true
+9 -9
View File
@@ -10,15 +10,15 @@ description = "Codex-style app-server transport for DeepSeek workspace architect
anyhow.workspace = true
axum.workspace = true
clap.workspace = true
codewhale-agent = { path = "../agent", version = "0.8.53" }
codewhale-config = { path = "../config", version = "0.8.53" }
codewhale-core = { path = "../core", version = "0.8.53" }
codewhale-execpolicy = { path = "../execpolicy", version = "0.8.53" }
codewhale-hooks = { path = "../hooks", version = "0.8.53" }
codewhale-mcp = { path = "../mcp", version = "0.8.53" }
codewhale-protocol = { path = "../protocol", version = "0.8.53" }
codewhale-state = { path = "../state", version = "0.8.53" }
codewhale-tools = { path = "../tools", version = "0.8.53" }
codewhale-agent = { path = "../agent", version = "0.9.0" }
codewhale-config = { path = "../config", version = "0.9.0" }
codewhale-core = { path = "../core", version = "0.9.0" }
codewhale-execpolicy = { path = "../execpolicy", version = "0.9.0" }
codewhale-hooks = { path = "../hooks", version = "0.9.0" }
codewhale-mcp = { path = "../mcp", version = "0.9.0" }
codewhale-protocol = { path = "../protocol", version = "0.9.0" }
codewhale-state = { path = "../state", version = "0.9.0" }
codewhale-tools = { path = "../tools", version = "0.9.0" }
serde.workspace = true
serde_json.workspace = true
rustls.workspace = true
+8 -14
View File
@@ -15,24 +15,18 @@ path = "src/main.rs"
name = "codew"
path = "src/bin/codew_legacy_shim.rs"
# Legacy alias — forwards to `codewhale` and prints a deprecation notice.
# Will be removed in v0.9.0.
[[bin]]
name = "deepseek"
path = "src/bin/deepseek_legacy_shim.rs"
[dependencies]
anyhow.workspace = true
clap.workspace = true
clap_complete.workspace = true
codewhale-agent = { path = "../agent", version = "0.8.53" }
codewhale-app-server = { path = "../app-server", version = "0.8.53" }
codewhale-config = { path = "../config", version = "0.8.53" }
codewhale-execpolicy = { path = "../execpolicy", version = "0.8.53" }
codewhale-mcp = { path = "../mcp", version = "0.8.53" }
codewhale-release = { path = "../release", version = "0.8.53" }
codewhale-secrets = { path = "../secrets", version = "0.8.53" }
codewhale-state = { path = "../state", version = "0.8.53" }
codewhale-agent = { path = "../agent", version = "0.9.0" }
codewhale-app-server = { path = "../app-server", version = "0.9.0" }
codewhale-config = { path = "../config", version = "0.9.0" }
codewhale-execpolicy = { path = "../execpolicy", version = "0.9.0" }
codewhale-mcp = { path = "../mcp", version = "0.9.0" }
codewhale-release = { path = "../release", version = "0.9.0" }
codewhale-secrets = { path = "../secrets", version = "0.9.0" }
codewhale-state = { path = "../state", version = "0.9.0" }
chrono.workspace = true
dirs.workspace = true
serde.workspace = true
@@ -1,61 +0,0 @@
//! Legacy `deepseek` alias.
//!
//! Forwards argv to the `codewhale` dispatcher and prints a one-line
//! deprecation notice to stderr on each invocation. This binary exists
//! for one release cycle to give existing installs a smooth path to the
//! new name; it will be removed in v0.9.0. See `docs/REBRAND.md` for the
//! full migration story.
use std::env;
use std::process::Command;
fn main() {
eprintln!(
"warning: `deepseek` is deprecated; run `codewhale` instead. \
This alias will be removed in v0.9.0."
);
let args: Vec<String> = env::args_os()
.skip(1)
.map(|a| a.to_string_lossy().into_owned())
.collect();
let status = match spawn_codewhale(&args) {
Ok(s) => s,
Err(e) => {
eprintln!(
"error: failed to spawn `codewhale`: {e}. Is it on PATH? \
Install with `cargo install codewhale-cli` or via npm/Homebrew."
);
std::process::exit(127);
}
};
std::process::exit(status.code().unwrap_or(1));
}
fn spawn_codewhale(args: &[String]) -> std::io::Result<std::process::ExitStatus> {
// Try PATH first.
match Command::new("codewhale").args(args).status() {
Ok(s) => return Ok(s),
Err(e) if e.kind() == std::io::ErrorKind::NotFound => {}
Err(e) => return Err(e),
}
// On Windows, after an update the sibling `codewhale.exe` may be in the
// same directory as this shim but not on PATH (#2006).
#[cfg(windows)]
{
if let Ok(exe_path) = env::current_exe()
&& let Some(dir) = exe_path.parent()
{
let sibling = dir.join("codewhale.exe");
if sibling.is_file() {
return Command::new(sibling).args(args).status();
}
}
}
Err(std::io::Error::new(
std::io::ErrorKind::NotFound,
"codewhale not found on PATH or in sibling directory",
))
}
+2 -2
View File
@@ -8,8 +8,8 @@ description = "Config schema and precedence model for DeepSeek workspace archite
[dependencies]
anyhow.workspace = true
codewhale-execpolicy = { path = "../execpolicy", version = "0.8.53" }
codewhale-secrets = { path = "../secrets", version = "0.8.53" }
codewhale-execpolicy = { path = "../execpolicy", version = "0.9.0" }
codewhale-secrets = { path = "../secrets", version = "0.9.0" }
dirs.workspace = true
serde.workspace = true
serde_json.workspace = true
+8 -8
View File
@@ -9,13 +9,13 @@ description = "Core runtime boundaries for DeepSeek workspace architecture"
[dependencies]
anyhow.workspace = true
chrono.workspace = true
codewhale-agent = { path = "../agent", version = "0.8.53" }
codewhale-config = { path = "../config", version = "0.8.53" }
codewhale-execpolicy = { path = "../execpolicy", version = "0.8.53" }
codewhale-hooks = { path = "../hooks", version = "0.8.53" }
codewhale-mcp = { path = "../mcp", version = "0.8.53" }
codewhale-protocol = { path = "../protocol", version = "0.8.53" }
codewhale-state = { path = "../state", version = "0.8.53" }
codewhale-tools = { path = "../tools", version = "0.8.53" }
codewhale-agent = { path = "../agent", version = "0.9.0" }
codewhale-config = { path = "../config", version = "0.9.0" }
codewhale-execpolicy = { path = "../execpolicy", version = "0.9.0" }
codewhale-hooks = { path = "../hooks", version = "0.9.0" }
codewhale-mcp = { path = "../mcp", version = "0.9.0" }
codewhale-protocol = { path = "../protocol", version = "0.9.0" }
codewhale-state = { path = "../state", version = "0.9.0" }
codewhale-tools = { path = "../tools", version = "0.9.0" }
serde_json.workspace = true
uuid.workspace = true
+1 -1
View File
@@ -8,5 +8,5 @@ description = "Execution policy and approval model parity for DeepSeek workspace
[dependencies]
anyhow.workspace = true
codewhale-protocol = { path = "../protocol", version = "0.8.53" }
codewhale-protocol = { path = "../protocol", version = "0.9.0" }
serde.workspace = true
+1 -1
View File
@@ -10,7 +10,7 @@ description = "Hook dispatch and notifications parity for DeepSeek workspace arc
anyhow.workspace = true
async-trait.workspace = true
chrono.workspace = true
codewhale-protocol = { path = "../protocol", version = "0.8.53" }
codewhale-protocol = { path = "../protocol", version = "0.9.0" }
reqwest.workspace = true
serde.workspace = true
serde_json.workspace = true
+1 -1
View File
@@ -9,7 +9,7 @@ description = "Tool invocation lifecycle, schema validation, and scheduler paral
[dependencies]
anyhow.workspace = true
async-trait.workspace = true
codewhale-protocol = { path = "../protocol", version = "0.8.53" }
codewhale-protocol = { path = "../protocol", version = "0.9.0" }
serde.workspace = true
serde_json.workspace = true
thiserror.workspace = true
+16 -1
View File
@@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
## [0.9.0] - 2026-06-07
### Added
- Added `/restore list [N]` so users can inspect more side-git rollback
@@ -233,6 +235,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
- Removed the deprecated `deepseek` and `deepseek-tui` binary shims from the
v0.9.0 Cargo crates and GitHub release artifact matrix. The canonical
`codewhale`, `codew`, and `codewhale-tui` entry points remain, the private
deprecated `npm/deepseek-tui` notice package stays unpublished, and DeepSeek
provider/model/env/config compatibility remains first-class.
- Command-adjacent config persistence and auto model routing now live in
neutral TUI modules instead of command-owned files, reducing command-boundary
coupling while preserving current `/config`, `/model`, UI, runtime, and
sub-agent behavior (#2871). Thanks @aboimpinto for landing this first staged
command-boundary layer from the broader #2851/#2791 design direction.
- `/config` now reports the canonical `~/.codewhale/settings.toml` path for TUI
settings while still reading legacy DeepSeek-branded settings fallbacks and
migrating them into the CodeWhale home on load.
@@ -407,6 +419,8 @@ HarmonyOS/OpenHarmony port and MatePad Edge validation trail (#2634),
#2867), **@reidliu41** for the hotbar action-registry foundation (#2866), and
**@ljm3790865** for the multi-tab core/persistence foundation and broader
collaboration direction (#2864, #2753),
**@aboimpinto** for the direct command-support boundary cleanup in #2871 and
the broader #2851/#2791 command-layer design direction,
**@idling11** for the PlanArtifact direction in Plan mode (#2733), the dense
tool-call transcript collapse/sidebar detail direction (#2738, #2734, #2692,
#2694), and the HarnessPosture config model for provider/model posture (#2741,
@@ -5836,7 +5850,8 @@ Welcome — and thank you.
- Hooks system and config profiles
- Example skills and launch assets
[Unreleased]: https://github.com/Hmbown/CodeWhale/compare/v0.8.53...HEAD
[Unreleased]: https://github.com/Hmbown/CodeWhale/compare/v0.9.0...HEAD
[0.9.0]: https://github.com/Hmbown/CodeWhale/compare/v0.8.53...v0.9.0
[0.8.53]: https://github.com/Hmbown/CodeWhale/compare/v0.8.52...v0.8.53
[0.8.52]: https://github.com/Hmbown/CodeWhale/compare/v0.8.51...v0.8.52
[0.8.51]: https://github.com/Hmbown/CodeWhale/compare/v0.8.50...v0.8.51
+5 -11
View File
@@ -18,19 +18,13 @@ toml = ["schemaui/toml"]
name = "codewhale-tui"
path = "src/main.rs"
# Legacy alias — forwards to `codewhale-tui` and prints a deprecation
# notice. Will be removed in v0.9.0.
[[bin]]
name = "deepseek-tui"
path = "src/bin/deepseek_tui_legacy_shim.rs"
[dependencies]
anyhow = "1.0.100"
codewhale-config = { path = "../config", version = "0.8.53" }
codewhale-protocol = { path = "../protocol", version = "0.8.53" }
codewhale-release = { path = "../release", version = "0.8.53" }
codewhale-secrets = { path = "../secrets", version = "0.8.53" }
codewhale-tools = { path = "../tools", version = "0.8.53" }
codewhale-config = { path = "../config", version = "0.9.0" }
codewhale-protocol = { path = "../protocol", version = "0.9.0" }
codewhale-release = { path = "../release", version = "0.9.0" }
codewhale-secrets = { path = "../secrets", version = "0.9.0" }
codewhale-tools = { path = "../tools", version = "0.9.0" }
schemaui = { version = "0.12.0", default-features = false, optional = true }
async-stream = "0.3.6"
async-trait = "0.1"
-2
View File
@@ -121,11 +121,9 @@ fn configure_windows_stack() {
match std::env::var("CARGO_CFG_TARGET_ENV").as_deref() {
Ok("msvc") => {
println!("cargo:rustc-link-arg-bin=codewhale-tui=/STACK:8388608");
println!("cargo:rustc-link-arg-bin=deepseek-tui=/STACK:8388608");
}
Ok("gnu") => {
println!("cargo:rustc-link-arg-bin=codewhale-tui=-Wl,--stack,8388608");
println!("cargo:rustc-link-arg-bin=deepseek-tui=-Wl,--stack,8388608");
}
_ => {}
}
@@ -1,32 +0,0 @@
//! Legacy `deepseek-tui` alias.
//!
//! Forwards argv to the `codewhale-tui` runtime and prints a one-line
//! deprecation notice to stderr on each invocation. This binary exists
//! for one release cycle to give existing installs a smooth path to the
//! new name; it will be removed in v0.9.0. See `docs/REBRAND.md` for the
//! full migration story.
use std::env;
use std::process::Command;
fn main() {
eprintln!(
"warning: `deepseek-tui` is deprecated; run `codewhale-tui` (or `codewhale`) instead. \
This alias will be removed in v0.9.0."
);
let args: Vec<String> = env::args_os()
.skip(1)
.map(|a| a.to_string_lossy().into_owned())
.collect();
let status = match Command::new("codewhale-tui").args(&args).status() {
Ok(s) => s,
Err(e) => {
eprintln!(
"error: failed to spawn `codewhale-tui`: {e}. Is it on PATH? \
Install with `cargo install codewhale-tui` or via npm/Homebrew."
);
std::process::exit(127);
}
};
std::process::exit(status.code().unwrap_or(1));
}
+10
View File
@@ -2739,7 +2739,12 @@ mod tests {
// Working-set metadata is now injected into the latest user message
// per turn. The legacy argument remains for call-site compatibility
// but must not reintroduce volatile bytes into the system prompt.
let _env_guard = crate::test_support::lock_test_env();
let tmp = tempdir().expect("tempdir");
let home_tmp = tempdir().expect("home tempdir");
let _home = EnvVarGuard::set("HOME", home_tmp.path().as_os_str());
let _userprofile = EnvVarGuard::set("USERPROFILE", home_tmp.path().as_os_str());
let _skills_dir = EnvVarGuard::remove("DEEPSEEK_SKILLS_DIR");
let workspace = tmp.path();
let summary = "## Repo Working Set\nWorkspace: /tmp/x\n";
@@ -2770,7 +2775,12 @@ mod tests {
// rendered prompt must produce identical bytes. The relay block
// lands below the static boundary in
// `system_prompt_for_mode_with_context_and_skills`.
let _env_guard = crate::test_support::lock_test_env();
let tmp = tempdir().expect("tempdir");
let home_tmp = tempdir().expect("home tempdir");
let _home = EnvVarGuard::set("HOME", home_tmp.path().as_os_str());
let _userprofile = EnvVarGuard::set("USERPROFILE", home_tmp.path().as_os_str());
let _skills_dir = EnvVarGuard::remove("DEEPSEEK_SKILLS_DIR");
let workspace = tmp.path();
let handoff_dir = workspace.join(".deepseek");
std::fs::create_dir_all(&handoff_dir).unwrap();
+1 -1
View File
@@ -14,7 +14,7 @@
//! - Persistence save/load (startup + shutdown overhead)
//! - Group color rendering (per-frame work in tab bar)
#![allow(unused_imports)]
#![allow(unused_imports, clippy::module_inception, clippy::print_stderr)]
#[cfg(test)]
mod benches {
+1 -1
View File
@@ -406,7 +406,7 @@ mod tests {
let results_to = delegator.results_for_tab(to);
assert_eq!(results_to.len(), 1);
assert_eq!(results_to[0].was_successful, true);
assert!(results_to[0].was_successful);
}
#[test]
+1 -1
View File
@@ -356,7 +356,7 @@ mod tests {
mgr.delete_group(&g1);
assert!(mgr.group_of(tab1).is_none());
assert!(mgr.tab_to_group.get(&tab1).is_none());
assert!(!mgr.tab_to_group.contains_key(&tab1));
}
#[test]
+4 -4
View File
@@ -212,11 +212,11 @@ mod tests {
manager.switch_to_by_id(to);
// Press Ctrl+Shift+D 4 times
assert_eq!(simulate_process_delegation(&mut manager).is_some(), true);
assert_eq!(simulate_process_delegation(&mut manager).is_some(), true);
assert_eq!(simulate_process_delegation(&mut manager).is_some(), true);
assert!(simulate_process_delegation(&mut manager).is_some());
assert!(simulate_process_delegation(&mut manager).is_some());
assert!(simulate_process_delegation(&mut manager).is_some());
// 4th should be the last task
assert_eq!(simulate_process_delegation(&mut manager).is_some(), true);
assert!(simulate_process_delegation(&mut manager).is_some());
// 5th should be none
assert_eq!(simulate_process_delegation(&mut manager), None);
}
+1 -1
View File
@@ -210,7 +210,7 @@ mod tests {
#[test]
fn test_resolve_tab_mention() {
// Tab IDs in the visual order they appear in the tab bar.
let tab_ids = vec![100, 50, 200];
let tab_ids = [100, 50, 200];
// Tab 1 = first in visual order (100)
assert_eq!(resolve_tab_mention(1, tab_ids.iter()), Some(100));
// Tab 2 = second in visual order (50)
@@ -226,12 +226,6 @@ impl Harness {
{
return PathBuf::from(path);
}
// Legacy fallback for callers still referencing the old bin name.
if name == "codewhale-tui"
&& let Some(path) = option_env!("CARGO_BIN_EXE_deepseek-tui")
{
return PathBuf::from(path);
}
panic!("env {key} not set; is the binary declared in this crate?")
}
+11 -12
View File
@@ -69,10 +69,10 @@ Anything that targets the DeepSeek provider API stays exactly as it was:
Docker, or direct downloads.
- **Docker image**: `ghcr.io/hmbown/codewhale`.
## Deprecation shims (through v0.8.x)
## Deprecation shims (removed in v0.9.0)
To keep existing shell aliases, scripts, and CI working through the rename,
v0.8.41 and later v0.8.x releases ship **deprecation shims**:
v0.8.41 and later v0.8.x releases shipped **deprecation shims**:
- A `deepseek` binary that prints a one-line warning to stderr and forwards
argv to `codewhale`.
@@ -80,7 +80,9 @@ v0.8.41 and later v0.8.x releases ship **deprecation shims**:
- The legacy `deepseek-tui` npm package is deprecated and no longer receives
new releases. Install the `codewhale` npm package instead.
These shims will be removed in **v0.9.0**. Please migrate before then.
These binary shims are removed in **v0.9.0**. DeepSeek provider support, model
IDs, `DEEPSEEK_*` environment variables, and legacy `~/.deepseek/` state
fallbacks remain supported.
## Migrating in practice
@@ -114,15 +116,12 @@ downloads until the formula and tap repo are renamed.
### Manual / GitHub Releases
`v0.8.41` Releases attach **both** the canonical `codewhale-*` /
`codewhale-tui-*` assets and the legacy `deepseek-*` / `deepseek-tui-*`
shim assets. Existing `deepseek update` invocations on v0.8.40 keep working;
they land you on the deprecation shim, which then prompts the install of
`codewhale`.
A second checksum manifest, `deepseek-artifacts-sha256.txt`, is attached as
an alias of `codewhale-artifacts-sha256.txt` so v0.8.40's hardcoded lookup
still verifies.
`v0.8.41` through `v0.8.x` Releases attached both the canonical
`codewhale-*` / `codewhale-tui-*` assets and compatibility-only
`deepseek-*` / `deepseek-tui-*` shim assets. Starting in v0.9.0, Releases attach
only the canonical `codewhale-*` / `codewhale-tui-*` assets and the canonical
`codewhale-artifacts-sha256.txt` checksum manifest. Install or update through
`codewhale` before moving to v0.9.0.
### Sessions, skills, and manual workspaces
+2 -2
View File
@@ -1,7 +1,7 @@
{
"name": "codewhale",
"version": "0.8.53",
"codewhaleBinaryVersion": "0.8.53",
"version": "0.9.0",
"codewhaleBinaryVersion": "0.9.0",
"description": "Install and run CodeWhale, the agentic terminal for DeepSeek and other OpenAI-compatible coding models.",
"author": "Hmbown",
"license": "MIT",
+3 -3
View File
@@ -8,9 +8,9 @@ npm install -g codewhale
```
This legacy npm package is deprecated and receives no further releases.
`codewhale` ships the canonical `codewhale` and `codewhale-tui` binaries, plus
compatibility-only deprecation shims under the old `deepseek` /
`deepseek-tui` binary names for v0.8.x.
`codewhale` ships the canonical `codewhale`, `codew`, and `codewhale-tui`
binaries. Compatibility-only deprecation shims under the old `deepseek` /
`deepseek-tui` binary names were available in v0.8.x and are removed in v0.9.0.
See [docs/REBRAND.md](https://github.com/Hmbown/CodeWhale/blob/main/docs/REBRAND.md)
for the full migration story.