feat(release): single-binary packaging follow-ups (5259/5260)

Complete 5259 single-binary sweep for packaging/docs: remove
codewhale-tui from .cnb.yml, nix, npm bin, installer, bundles,
locales, and docs/INSTALL matrix; add .winget + packaging/ manifests
(single-binary 27-asset inventory, FreeBSD source-build note) and
update release-artifacts comments from 34 to 27 assets. 27-asset
inventory verified via assemble-release-assets --verify.

Co-Authored-By: internal-model
This commit is contained in:
CodeWhale Bot
2026-08-07 06:14:45 -07:00
parent 6d7add26c9
commit be676502df
19 changed files with 491 additions and 155 deletions
+3 -10
View File
@@ -60,12 +60,11 @@
set -eu
# The release profile uses full LTO and one codegen unit. Bound Cargo's
# parallelism so the final links cannot exhaust a shared CNB runner.
cargo build --jobs 2 --release --locked -p codewhale-cli -p codewhale-tui
cargo build --jobs 2 --release --locked -p codewhale-cli
export PATH="$PWD/target/release:$PATH"
node scripts/release/npm-wrapper-smoke.js
./target/release/codewhale --version
./target/release/codew --version
./target/release/codewhale-tui --version
.linux_release_preflight: &linux_release_preflight
name: linux release preflight
@@ -100,12 +99,11 @@
set -eu
# Keep the production release profile intact while avoiding a burst of
# concurrent rustc/linker processes on the shared release runner.
cargo build --jobs 2 --release --locked -p codewhale-cli -p codewhale-tui
cargo build --jobs 2 --release --locked -p codewhale-cli
export PATH="$PWD/target/release:$PATH"
node scripts/release/npm-wrapper-smoke.js
./target/release/codewhale --version
./target/release/codew --version
./target/release/codewhale-tui --version
main:
push:
@@ -141,17 +139,15 @@ $:
./scripts/release/check-ohos-deps.sh
cargo build --jobs 2 --release --locked \
--target x86_64-unknown-linux-musl \
-p codewhale-cli -p codewhale-tui
-p codewhale-cli # single binary
mkdir -p target/cnb-release
BIN_DIR="target/x86_64-unknown-linux-musl/release"
cp "$BIN_DIR/codewhale" target/cnb-release/codewhale-linux-x64
cp "$BIN_DIR/codew" target/cnb-release/codew-linux-x64
cp "$BIN_DIR/codewhale-tui" target/cnb-release/codewhale-tui-linux-x64
strip \
target/cnb-release/codewhale-linux-x64 \
target/cnb-release/codew-linux-x64 \
target/cnb-release/codewhale-tui-linux-x64 \
|| true
(
@@ -159,7 +155,6 @@ $:
sha256sum \
codewhale-linux-x64 \
codew-linux-x64 \
codewhale-tui-linux-x64 \
> codewhale-artifacts-sha256.txt
)
@@ -188,7 +183,6 @@ $:
echo "Assets:"
echo "- codewhale-linux-x64"
echo "- codew-linux-x64"
echo "- codewhale-tui-linux-x64"
echo "- codewhale-artifacts-sha256.txt"
} > target/cnb-release/CNB_RELEASE.md
@@ -204,5 +198,4 @@ $:
attachments:
- target/cnb-release/codewhale-linux-x64
- target/cnb-release/codew-linux-x64
- target/cnb-release/codewhale-tui-linux-x64
- target/cnb-release/codewhale-artifacts-sha256.txt
+5 -2
View File
@@ -29,6 +29,9 @@ env:
jobs:
build:
name: Build ${{ matrix.platform }}
# FreeBSD is a source-build target validated via `cargo check --target x86_64-unknown-freebsd -p codewhale-cli --locked`
# (see packaging/freebsd/README.md and docs/INSTALL.md#freebsd). The 7×1 prebuilt matrix stays 7 targets;
# FreeBSD has no prebuilt asset, no npm binary, and no matrix bloat — it builds from source.
strategy:
fail-fast: false
matrix:
@@ -324,7 +327,7 @@ jobs:
with:
name: codewhale-release-assets
path: release-assets
- name: Verify 34-asset inventory and checksum manifests
- name: Verify 27-asset inventory and checksum manifests (single binary)
run: node scripts/release/assemble-release-assets.js --verify release-assets
- name: Test release inventory contracts
run: |
@@ -342,6 +345,6 @@ jobs:
echo ""
echo "- Source: \`${{ inputs.source_sha }}\`"
echo "- Version metadata: \`${{ inputs.version }}\`"
echo "- Inventory: 7 targets / 34 files"
echo "- Inventory: 7 targets / 27 files (single binary)"
echo "- Publication: none (Actions artifact \`codewhale-release-assets\` only)"
} >> "${GITHUB_STEP_SUMMARY}"
+97
View File
@@ -0,0 +1,97 @@
# Hmbown.CodeWhale — winget singleton manifest for CodeWhale (single binary)
# This is a mirror of packaging/winget/Hmbown.CodeWhale.yaml for tooling that expects .winget/.
# Keep both in sync; the canonical source is packaging/winget/Hmbown.CodeWhale.yaml.
# See packaging/winget/README.md for update instructions.
PackageIdentifier: Hmbown.CodeWhale
PackageVersion: 0.9.5
DefaultLocale: en-US
ManifestType: singleton
ManifestVersion: 1.6.0
Publisher: Hmbown
PublisherUrl: https://github.com/Hmbown
PublisherSupportUrl: https://github.com/Hmbown/CodeWhale/issues
PackageName: CodeWhale
PackageUrl: https://github.com/Hmbown/CodeWhale
License: MIT
LicenseUrl: https://github.com/Hmbown/CodeWhale/blob/main/LICENSE
Copyright: Copyright (c) Hmbown
ShortDescription: Terminal coding agent for supported hosted and local models
Description: |
CodeWhale is a terminal coding agent that runs on your machine. The v0.9.5 single-binary
release ships one `codewhale` binary per target (plus the `codew` shim) across Linux x64 (musl),
Linux arm64, Android arm64, macOS x64/arm64, and Windows x64/arm64. See https://github.com/Hmbown/CodeWhale
for provider setup, Fleet workflows, and the full install guide.
Author: Hmbown
Moniker: codewhale
Tags:
- codewhale
- deepseek
- cli
- tui
- terminal
- ai
- coding-agent
- rust
MinimumOSVersion: 10.0.0.0
ReleaseNotes: https://github.com/Hmbown/CodeWhale/releases/tag/v0.9.5
ReleaseNotesUrl: https://github.com/Hmbown/CodeWhale/releases/tag/v0.9.5
Installers:
- Architecture: x64
InstallerType: nullsoft
Scope: user
InstallerUrl: https://github.com/Hmbown/CodeWhale/releases/download/v0.9.5/CodeWhaleSetup.exe
InstallerSha256: 0000000000000000000000000000000000000000000000000000000000000000
ProductCode: CodeWhale
UpgradeBehavior: install
ReleaseDate: 2026-08-07
- Architecture: x64
InstallerType: zip
Scope: user
InstallerUrl: https://github.com/Hmbown/CodeWhale/releases/download/v0.9.5/codewhale-windows-x64.zip
InstallerSha256: 0000000000000000000000000000000000000000000000000000000000000000
NestedInstallerType: portable
NestedInstallerFiles:
- RelativeFilePath: codewhale-windows-x64/codewhale.exe
PortableCommandAlias: codewhale
- RelativeFilePath: codewhale-windows-x64/codew.exe
PortableCommandAlias: codew
ReleaseDate: 2026-08-07
- Architecture: x64
InstallerType: zip
Scope: user
InstallerUrl: https://github.com/Hmbown/CodeWhale/releases/download/v0.9.5/codewhale-windows-x64-portable.zip
InstallerSha256: 0000000000000000000000000000000000000000000000000000000000000000
NestedInstallerType: portable
NestedInstallerFiles:
- RelativeFilePath: codewhale-windows-x64-portable/codewhale.exe
PortableCommandAlias: codewhale
- RelativeFilePath: codewhale-windows-x64-portable/codew.exe
PortableCommandAlias: codew
ReleaseDate: 2026-08-07
- Architecture: arm64
InstallerType: zip
Scope: user
InstallerUrl: https://github.com/Hmbown/CodeWhale/releases/download/v0.9.5/codewhale-windows-arm64.zip
InstallerSha256: 0000000000000000000000000000000000000000000000000000000000000000
NestedInstallerType: portable
NestedInstallerFiles:
- RelativeFilePath: codewhale-windows-arm64/codewhale.exe
PortableCommandAlias: codewhale
- RelativeFilePath: codewhale-windows-arm64/codew.exe
PortableCommandAlias: codew
ReleaseDate: 2026-08-07
- Architecture: arm64
InstallerType: zip
Scope: user
InstallerUrl: https://github.com/Hmbown/CodeWhale/releases/download/v0.9.5/codewhale-windows-arm64-portable.zip
InstallerSha256: 0000000000000000000000000000000000000000000000000000000000000000
NestedInstallerType: portable
NestedInstallerFiles:
- RelativeFilePath: codewhale-windows-arm64-portable/codewhale.exe
PortableCommandAlias: codewhale
- RelativeFilePath: codewhale-windows-arm64-portable/codew.exe
PortableCommandAlias: codew
ReleaseDate: 2026-08-07
+4 -1
View File
@@ -290,7 +290,10 @@
"CmdReviewDescription": "Run a structured code review on a file, diff, or PR",
"CmdRlmDescription": "Open a persistent RLM context for a file or text",
"CmdSaveDescription": "Save session to file",
"CmdForkDescription": "Fork the active conversation into a sibling session",
"CmdForkDescription": "Fork the active conversation into a sibling session (with interactive picker per #576)",
"CmdTreeDescription": "Show the session entry journal as a tree (leaf = active branch)",
"CmdBranchDescription": "Move the session leaf to an existing entry (branching moves leaf only, never rewrites history)",
"CmdResumeDescription": "Resume a session (with optional foreign-session import via export JSON)",
"CmdNewDescription": "Start a fresh saved session",
"CmdSessionsDescription": "Open session history picker",
"CmdSettingsDescription": "Open the typed settings editor",
+102 -74
View File
@@ -8,7 +8,7 @@ If you just want the short version, see the
[main README](../README.md#install) or
[简体中文 README](../README.zh-CN.md#安装).
This branch describes the **v0.9.4 source candidate**. Install commands that use
This branch describes the **v0.9.5 source candidate**. Install commands that use
`latest` resolve to the latest published package or GitHub Release, which may
trail the source candidate. A candidate is not a published install until the
matching package, tag, checksums, and release assets exist.
@@ -19,7 +19,7 @@ On macOS and Linux, the website installer is the shortest install/update path:
curl -fsSL https://codewhale.net/install.sh | sh
```
It downloads the matching `codewhale`, `codew`, and `codewhale-tui` release binaries,
It downloads the matching `codewhale` and `codew` release binaries,
verifies them against `codewhale-artifacts-sha256.txt`, installs to
`~/.local/bin` by default, and exposes the `codew` convenience command.
@@ -27,34 +27,33 @@ verifies them against `codewhale-artifacts-sha256.txt`, installs to
## 1. Supported platforms
Published Codewhale releases ship matched `codewhale`, `codew`, and
`codewhale-tui` prebuilt binaries for their supported platform/architecture
combinations. The table below is the intended v0.9.4 candidate matrix;
Published Codewhale releases ship matched `codewhale` and `codew` prebuilt binaries for their supported platform/architecture
combinations. The table below is the intended v0.9.5 candidate matrix;
Android/Termux is preview pending real-device QA. Linux ARM64 is available from
v0.8.8 onward. Linux RISC-V prebuilts are temporarily paused because the locked
`rquickjs-sys` dependency does not ship `riscv64gc-unknown-linux-gnu` bindings.
| Platform | Architecture | npm install | `cargo install` | GitHub release asset |
| ------------ | ------------ | :---------: | :-------------: | ----------------------------------------------------- |
| Linux | x64 (x86_64) | ✅ | ✅ | `codewhale-linux-x64`, `codew-linux-x64`, `codewhale-tui-linux-x64` |
| Linux | arm64 | ✅ | ✅ | `codewhale-linux-arm64`, `codew-linux-arm64`, `codewhale-tui-linux-arm64` |
| Linux | x64 (x86_64) | ✅ | ✅ | `codewhale-linux-x64`, `codew-linux-x64` |
| Linux | arm64 | ✅ | ✅ | `codewhale-linux-arm64`, `codew-linux-arm64` |
| Android / Termux | arm64 (aarch64) | ⚠️⁴ preview | ⚠️⁴ preview | `codewhale-android-arm64.tar.gz` preview archive when published |
| Linux | riscv64 | ❌¹ | ❌³ | temporarily unsupported until upstream bindings land |
| macOS | x64 | ✅ | ✅ | `codewhale-macos-x64`, `codew-macos-x64`, `codewhale-tui-macos-x64` |
| macOS | arm64 (M-series) | ✅ | ✅ | `codewhale-macos-arm64`, `codew-macos-arm64`, `codewhale-tui-macos-arm64` |
| Windows | x64 | ✅ | ✅ | `codewhale-windows-x64.exe`, `codew-windows-x64.exe`, `codewhale-tui-windows-x64.exe` |
| Windows | arm64 | ✅ | ✅ | `codewhale-windows-arm64.exe`, `codew-windows-arm64.exe`, `codewhale-tui-windows-arm64.exe` |
| Linux x64 on musl (Alpine) | ✅ (static) | ✅ | ✅ | static `codewhale-tui-linux-x64` (musl) asset |
| macOS | x64 | ✅ | ✅ | `codewhale-macos-x64`, `codew-macos-x64` |
| macOS | arm64 (M-series) | ✅ | ✅ | `codewhale-macos-arm64`, `codew-macos-arm64` |
| Windows | x64 | ✅ | ✅ | `codewhale-windows-x64.exe`, `codew-windows-x64.exe` |
| Windows | arm64 | ✅ | ✅ | `codewhale-windows-arm64.exe`, `codew-windows-arm64.exe` |
| Linux x64 on musl (Alpine) | ✅ (static) | ✅ | ✅ | static `codewhale-linux-x64` (musl) asset |
| Other Linux (musl non-x64, other arches) | — | ❌¹ | ✅² | build from source |
| FreeBSD / OpenBSD | — | ❌ | ✅² | build from source |
| FreeBSD 14+ / OpenBSD | x64, arm64 | ❌ | ✅² | `cargo install codewhale-cli --locked` (no prebuilt; see § FreeBSD) |
¹ The npm package will exit with a clear error and point you here.
² Provided your toolchain can compile a recent Rust workspace; see
[Build from source](#7-build-from-source) below.
³ RISC-V source builds currently need upstream `rquickjs-sys` RISC-V bindings or
a bindgen-enabled dependency build.
⁴ The v0.9.4 source-candidate npm wrapper recognizes Android arm64 and resolves
the matching `codewhale`, `codew`, and `codewhale-tui` Android assets. npm
⁴ The v0.9.5 source-candidate npm wrapper recognizes Android arm64 and resolves
the matching `codewhale` and `codew` Android assets. npm
installation works only for a package version whose GitHub Release publishes
those matching assets. The Android/Termux path remains preview-only until the
real-device compile, startup, approval, file-tool, and update checks tracked
@@ -72,13 +71,13 @@ binary through `rusqlite`, so no separate `libsqlite3` runtime package is needed
The Linux **arm64** release assets are still GNU libc (glibc) builds. They
dynamically link normal Linux runtime libraries such as `libdbus-1` and `libc`.
The v0.9.4 candidate build runs on Ubuntu 24.04, so it can require `GLIBC_2.39`.
The v0.9.5 candidate build runs on Ubuntu 24.04, so it can require `GLIBC_2.39`.
### Linux glibc floor (arm64)
This floor applies only to the **GNU libc** arm64 asset. The static x64 (musl)
asset has no `GLIBC_*` symbols, so it passes the install preflight and runs on
older systems without error. The v0.9.4 candidate GNU arm64 asset is built on
older systems without error. The v0.9.5 candidate GNU arm64 asset is built on
Ubuntu 24.04 and can require `GLIBC_2.39`. Ubuntu 22.04 ships glibc
2.35, so those arm64 binaries fail with errors such as:
@@ -92,8 +91,7 @@ builds. If you are on Ubuntu 22.04 arm64, Debian stable, RHEL/CentOS, or another
older GNU base for a non-x64 asset, use:
```bash
cargo install codewhale-cli --locked
cargo install codewhale-tui --locked
cargo install codewhale-cli --locked # provides `codewhale` and `codew`
```
Future release engineering may add static (musl) arm64 assets so the glibc floor
@@ -103,8 +101,7 @@ should build from source.
> **Linux ARM64 note (v0.8.7 and earlier).** v0.8.7 and earlier do **not**
> publish a Linux ARM64 prebuilt; users on HarmonyOS thin-and-light, Asahi
> Linux, Raspberry Pi, AWS Graviton, etc. saw `Unsupported architecture: arm64`
> from `npm i -g codewhale`. v0.8.8 publishes both `codewhale-linux-arm64`
> and `codewhale-tui-linux-arm64`, so a plain `npm i -g codewhale` works
> from `npm i -g codewhale`. v0.8.8 publishes `codewhale-linux-arm64`, so a plain `npm i -g codewhale` works
> on any glibc-based ARM64 Linux. If you're stuck on v0.8.7, jump to
> [Build from source](#7-build-from-source) — `cargo install` works fine.
> For HarmonyOS PC and OpenHarmony cross-build setup, see
@@ -146,8 +143,7 @@ install the build packages before running Cargo:
```bash
pkg install -y rust clang pkg-config make git
cargo install codewhale-cli --locked
cargo install codewhale-tui --locked
cargo install codewhale-cli --locked # provides `codewhale` and `codew`
```
The normal first-run setup path is implemented, but its Android interaction is
@@ -168,15 +164,13 @@ Maintainers should use this repeatable smoke checklist for a Termux / Android
arm64 release candidate:
```bash
command -v codewhale codew codewhale-tui
command -v codewhale codew
test -x "$PREFIX/bin/codewhale"
test -x "$PREFIX/bin/codew"
test -x "$PREFIX/bin/codewhale-tui"
codewhale --version
codewhale doctor
codewhale exec --auto "run pwd"
codewhale-tui --version
```
Known limitations:
@@ -243,9 +237,8 @@ npm install -g codewhale
codewhale --version # prints the published version that was installed
```
`postinstall` downloads the matching three binaries from the GitHub
release, verifies a SHA-256 manifest, and exposes `codewhale`, `codew`, and
`codewhale-tui` on your `PATH`.
`postinstall` downloads the matching `codewhale` and `codew` binaries from the GitHub
release, verifies a SHA-256 manifest, and exposes `codewhale` and `codew` on your `PATH`.
Useful environment variables:
@@ -278,19 +271,17 @@ applies to the runtime's own environment variables, not to the installer.)
## 4. Install via Cargo (any Tier-1 Rust target)
If GitHub releases are slow, blocked, or you're on an unsupported architecture,
install from crates.io directly. Two Cargo packages are required:
`codewhale-cli` installs the `codewhale` and `codew` commands, while
`codewhale-tui` installs the `codewhale-tui` command used by the dispatcher.
install from crates.io directly. One Cargo package is required:
`codewhale-cli` installs the `codewhale` and `codew` commands (single binary, single install).
```bash
# Requires Rust 1.88+ (https://rustup.rs)
cargo install codewhale-cli --locked # provides `codewhale` and `codew`
cargo install codewhale-tui --locked # provides `codewhale-tui`
codewhale --version
```
> **Linux: install build-time dependencies first.** `cargo install` compiles
> from source, and on Linux the `codewhale-tui` crate links against
> from source, and on Linux the `codewhale-cli` crate links against
> `libdbus-1` (used by the D-Bus secret-service backend for credential
> storage). Install the required system packages before running `cargo install`:
>
@@ -368,7 +359,7 @@ If you already have Nix with flake support, run:
nix run github:Hmbown/CodeWhale
```
Nix builds `codewhale-tui` and then starts the `codewhale` dispatcher. Pass
Nix builds `codewhale` (single binary) and then starts the dispatcher. Pass
arguments after `--`, for example:
```sh
@@ -384,8 +375,8 @@ Add inputs to `flake.nix`:
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
codewhale-tui.url = "github:Hmbown/CodeWhale";
codewhale-tui.inputs.nixpkgs.follows = "nixpkgs";
codewhale.url = "github:Hmbown/CodeWhale";
codewhale.inputs.nixpkgs.follows = "nixpkgs";
};
}
```
@@ -394,7 +385,7 @@ Install into a NixOS module:
```nix
{
outputs = { self, nixpkgs, codewhale-tui }:
outputs = { self, nixpkgs, codewhale }:
let
# replace system "x86_64-linux" with your system
system = "x86_64-linux";
@@ -406,7 +397,7 @@ Install into a NixOS module:
modules = [
# ...
{
environment.systemPackages = [ codewhale-tui.packages.${system}.default ];
environment.systemPackages = [ codewhale.packages.${system}.default ];
}
];
};
@@ -435,8 +426,7 @@ once the rename lands, this section will switch to it.
## 6. Manual download from GitHub Releases
Each platform appears on the Releases page in **two forms** (this is intentional — see #3208):
the **bare binaries** (`codewhale-<platform>`, `codew-<platform>`, and
`codewhale-tui-<platform>`, no extension) and a **`.tar.gz` / `.zip` archive**
the **bare binaries** (`codewhale-<platform>` and `codew-<platform>`, no extension) and a **`.tar.gz` / `.zip` archive**
(`codewhale-<platform>.tar.gz`) that bundles the same commands plus an
`install.sh`. The npm wrapper and the in-app `codewhale update` download the
matched runtime binaries; the archive is the easiest manual install (see §5).
@@ -453,9 +443,7 @@ curl -L -o ~/.local/bin/codewhale \
https://github.com/Hmbown/CodeWhale/releases/latest/download/codewhale-linux-arm64
curl -L -o ~/.local/bin/codew \
https://github.com/Hmbown/CodeWhale/releases/latest/download/codew-linux-arm64
curl -L -o ~/.local/bin/codewhale-tui \
https://github.com/Hmbown/CodeWhale/releases/latest/download/codewhale-tui-linux-arm64
chmod +x ~/.local/bin/codewhale ~/.local/bin/codew ~/.local/bin/codewhale-tui
chmod +x ~/.local/bin/codewhale ~/.local/bin/codew
codewhale --version
```
@@ -463,7 +451,7 @@ codewhale --version
> macOS may block them with "Apple cannot verify" warnings. Clear the quarantine
> attribute on all three binaries and retry:
> ```bash
> xattr -d com.apple.quarantine ~/.local/bin/codewhale ~/.local/bin/codew ~/.local/bin/codewhale-tui 2>/dev/null || true
> xattr -d com.apple.quarantine ~/.local/bin/codewhale ~/.local/bin/codew 2>/dev/null || true
> ```
Verify integrity against the per-release SHA-256 manifest:
@@ -486,9 +474,8 @@ explicitly. Replace `X.Y.Z` with the version you want to restore.
# npm wrapper, only for versions that were published to npm
npm install -g codewhale@X.Y.Z
# Cargo path: two packages provide codewhale + codew + codewhale-tui
# Cargo path: one package provides codewhale + codew (single binary)
cargo install codewhale-cli --version X.Y.Z --locked --force
cargo install codewhale-tui --version X.Y.Z --locked --force
```
For manual installs, download the matched binaries or the platform archive from the
@@ -523,6 +510,35 @@ Scoop manifests are maintained outside this repository's release workflow and
can lag GitHub/npm/Cargo releases. Use npm or manual GitHub release downloads
when you need the newest version immediately.
### Windows winget (v0.9.5+)
CodeWhale publishes a winget manifest for `Hmbown.CodeWhale` (resolves #1561). The
single-binary release ships only `codewhale` + `codew` — no `codewhale-tui` asset.
```powershell
winget install Hmbown.CodeWhale
codewhale --version
```
The manifest is at [`packaging/winget/Hmbown.CodeWhale.yaml`](../packaging/winget/Hmbown.CodeWhale.yaml)
(also mirrored at [`.winget/Hmbown.CodeWhale.yaml`](../.winget/Hmbown.CodeWhale.yaml)) and lists both
the NSIS installer (`CodeWhaleSetup.exe`, per-user, adds `%LOCALAPPDATA%\Programs\CodeWhale\bin` to the user PATH)
and the portable ZIP fallback (`codewhale-windows-x64.zip` / `codewhale-windows-arm64.zip`). winget
selects the matching architecture automatically; both install only the single binary (`codewhale.exe` + `codew.exe`).
Update via `winget upgrade Hmbown.CodeWhale` or `codewhale update`. The winget package is
maintained outside this repo's release workflow and can lag GitHub/npm/Cargo releases by one
validation cycle — use npm or the GitHub Release asset when you need the newest version immediately.
If `winget install` reports a hash mismatch, verify `codewhale-artifacts-sha256.txt` for the same
tag and regenerate the manifest via `packaging/winget/generate-winget-manifest.sh` (see
[`packaging/winget/README.md`](../packaging/winget/README.md)) before re-submitting to
[microsoft/winget-pkgs](https://github.com/microsoft/winget-pkgs).
> **Windows ARM64 note.** The NSIS installer currently contains only the x64 binaries.
> Windows ARM64 users should install via `winget install Hmbown.CodeWhale` (ARM64 ZIP) or
> `npm install -g codewhale` under native ARM64 Node.js, or download
> `codewhale-windows-arm64.zip` directly — all paths install native ARM64 binaries.
### Windows NSIS Installer
A standalone NSIS-based installer is available starting with v0.8.50 for
@@ -539,7 +555,7 @@ ARM64 binaries.
**Install** by double-clicking the setup executable. The installer:
- Installs `codewhale.exe`, `codew.exe`, and `codewhale-tui.exe` side-by-side into
- Installs `codewhale.exe` and `codew.exe` side-by-side (single binary, no `codewhale-tui.exe`) into
`%LOCALAPPDATA%\Programs\CodeWhale\bin`
- Adds the install directory to the **current user** `PATH`
- Registers in Windows **Apps & Features** for easy uninstall
@@ -563,7 +579,7 @@ your environment requires signed application packages.
```powershell
cd scripts\installer
# Place codewhale.exe, codew.exe, and codewhale-tui.exe here, then:
# Place codewhale.exe and codew.exe here (single binary, no codewhale-tui.exe), then:
makensis /DVERSION=<version> codewhale.nsi
```
@@ -601,8 +617,7 @@ build before source builds are expected to work.
git clone https://github.com/Hmbown/CodeWhale.git
cd CodeWhale
cargo install --path crates/cli --locked # provides `codewhale` and `codew`
cargo install --path crates/tui --locked # provides `codewhale-tui`
cargo install --path crates/cli --locked # provides `codewhale` and `codew` (single binary)
codewhale --version
```
@@ -610,6 +625,26 @@ codewhale --version
The commands land in `~/.cargo/bin/` by default; make sure that directory is
on your `PATH`.
### FreeBSD 14+ (resolves #1097)
FreeBSD has no prebuilt GitHub Release asset — `npm install -g codewhale` intentionally
fails with `Unsupported platform: freebsd` and points to Cargo. Install from source:
```bash
pkg install -y rust pkgconf git
cargo install codewhale-cli --locked # provides `codewhale` and `codew` (single binary)
codewhale --version
codewhale doctor
```
The `rquickjs` FreeBSD bindings are generated at build time via `bindgen` (see
`1582ba965`/`5eb0385e8`). No separate `pkg install codewhale` port exists yet —
a native port is tracked as the follow-up to #1097 under `packaging/freebsd/`
(contributions welcome). Validate with `cargo check --target x86_64-unknown-freebsd -p codewhale-cli --locked`
on the release branch; the 7×1 release matrix (Linux musl x64, Linux gnu arm64,
Android arm64, macOS x64/arm64, Windows x64/arm64) stays 7 targets — FreeBSD is a
source-build target, not a prebuilt asset.
### Cross-compiling from x64 to ARM64 Linux
If you want to build an ARM64 Linux binary on an x64 Linux host (e.g. for a
@@ -623,13 +658,11 @@ rustup target add aarch64-unknown-linux-gnu
cargo install cross --locked
# Per build
cross build --release --target aarch64-unknown-linux-gnu -p codewhale-cli
cross build --release --target aarch64-unknown-linux-gnu -p codewhale-tui
cross build --release --target aarch64-unknown-linux-gnu -p codewhale-cli # single binary
```
The resulting binaries land in
`target/aarch64-unknown-linux-gnu/release/codewhale` and
`target/aarch64-unknown-linux-gnu/release/codewhale-tui`. Copy the matched pair
The resulting binary lands in
`target/aarch64-unknown-linux-gnu/release/codewhale` (and `codew` shim). Copy it
to the ARM64 host (e.g. via `scp`) and `chmod +x` them.
If you don't have Docker available, install the cross-linker directly and let
@@ -644,8 +677,7 @@ cat >> ~/.cargo/config.toml <<'EOF'
linker = "aarch64-linux-gnu-gcc"
EOF
cargo build --release --target aarch64-unknown-linux-gnu -p codewhale-cli
cargo build --release --target aarch64-unknown-linux-gnu -p codewhale-tui
cargo build --release --target aarch64-unknown-linux-gnu -p codewhale-cli # single binary
```
The same recipe works for `aarch64-unknown-linux-musl` if your distro is
@@ -707,8 +739,8 @@ set CARGO_HTTP_CHECK_REVOKE=false # may be needed behind some Chinese ISPs
cargo build --release
```
The binaries appear in `target\release\codewhale.exe`,
`target\release\codew.exe`, and `target\release\codewhale-tui.exe`.
The binaries appear in `target\release\codewhale.exe` and
`target\release\codew.exe` (single binary + shim).
> Prefer not to build? Install via npm, Cargo, GitHub Releases, or the CNB
> mirror — see the sections above.
@@ -730,8 +762,7 @@ the same `PATH`. If you installed only one crate via `cargo install`, install
both:
```bash
cargo install codewhale-cli --locked
cargo install codewhale-tui --locked
cargo install codewhale-cli --locked # provides `codewhale` and `codew`
```
### `codewhale update` reports `no asset found for platform codewhale-linux-aarch64`
@@ -758,14 +789,13 @@ The legacy `DEEPSEEK_TUI_RELEASE_BASE_URL` name is still accepted.
`codewhale update` normally contacts GitHub Releases for metadata and binary
assets. On networks where GitHub is blocked or unreliable, use the CNB source
mirror instead and install both Cargo packages from the release tag. Together,
they provide the `codewhale`, `codew`, and `codewhale-tui` commands:
it provides the `codewhale` and `codew` commands (single binary):
To check the latest release without downloading or replacing binaries, run
`codewhale update --check`.
```bash
cargo install --git https://cnb.cool/codewhale.net/codewhale --tag vX.Y.Z codewhale-cli --locked --force
cargo install --git https://cnb.cool/codewhale.net/codewhale --tag vX.Y.Z codewhale-tui --locked --force
cargo install --git https://cnb.cool/codewhale.net/codewhale --tag vX.Y.Z codewhale-cli --locked --force # single binary
```
If you operate a binary asset mirror, `codewhale update` can use it directly:
@@ -794,7 +824,7 @@ is not stabilized in this version of Cargo
Install current stable Rust through rustup, then rerun the two Cargo package
install commands from [Section 4](#4-install-via-cargo-any-tier-1-rust-target).
Together they provide `codewhale`, `codew`, and `codewhale-tui`. For
It provides `codewhale` and `codew` (single binary). For
mainland China networks, this rsproxy-based sequence has been verified to work:
```bash
@@ -804,8 +834,7 @@ export RUSTUP_UPDATE_ROOT=https://rsproxy.cn/rustup
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
source "$HOME/.cargo/env"
rustup default stable
cargo install codewhale-cli --locked
cargo install codewhale-tui --locked
cargo install codewhale-cli --locked # provides `codewhale` and `codew`
```
Afterward, `which cargo` should point to `~/.cargo/bin/cargo`, not
@@ -822,16 +851,15 @@ sudo apt-get install -y build-essential pkg-config libdbus-1-dev
### WSL2 / Ubuntu: `dbus-1` or `pkg-config` not found while building
WSL2 uses the same Linux source-build path as Ubuntu. If `cargo install
codewhale-tui --locked` fails while compiling the keyring or D-Bus secret
codewhale-cli --locked` fails while compiling the keyring or D-Bus secret
storage crates, install the Linux build dependencies inside the WSL distro,
then rerun the two Cargo package install commands. Together they install
`codewhale`, `codew`, and `codewhale-tui`:
then rerun the two Cargo package install commands. It installs
`codewhale` and `codew` (single binary):
```bash
sudo apt-get update
sudo apt-get install -y build-essential pkg-config libdbus-1-dev
cargo install codewhale-cli --locked
cargo install codewhale-tui --locked
cargo install codewhale-cli --locked # provides `codewhale` and `codew`
```
The prebuilt npm/GitHub binaries do not need these build-time packages; they
@@ -929,7 +957,7 @@ Use one of these paths:
3. Install via Cargo, which builds locally and does not download GitHub release
assets. See [Section 4](#4-install-via-cargo-any-tier-1-rust-target).
4. Download all three matching `codewhale`, `codew`, and `codewhale-tui`
4. Download both matching `codewhale` and `codew`
binaries from the [Releases page](https://github.com/Hmbown/CodeWhale/releases),
place them in a directory on `PATH`, and make them executable. See
[Section 6](#6-manual-download-from-github-releases).
+1 -3
View File
@@ -64,9 +64,7 @@ rustPlatform.buildRustPackage (finalAttrs: {
cargoBuildFlags = [
"--package"
"codewhale-cli"
"--package"
"codewhale-tui"
];
]; # single binary — tui crate is a library, not a shipped binary (v0.9.5+)
cargoTestFlags = finalAttrs.cargoBuildFlags ++ [
"--lib"
"--bins"
+4 -3
View File
@@ -1,8 +1,9 @@
#!/usr/bin/env node
const { runCodeWhaleTui } = require("../scripts/run");
const { runCodeWhale } = require("../scripts/run");
runCodeWhaleTui().catch((error) => {
console.error("Failed to start codewhale-tui:", error.message);
process.stderr.write("codewhale-tui: deprecated alias to `codewhale` (single binary since v0.9.5). Use `codewhale` instead.\n");
runCodeWhale().catch((error) => {
console.error("Failed to start codewhale:", error.message);
process.exit(1);
});
+1 -2
View File
@@ -35,8 +35,7 @@
"type": "commonjs",
"bin": {
"codewhale": "bin/codewhale.js",
"codew": "bin/codew.js",
"codewhale-tui": "bin/codewhale-tui.js"
"codew": "bin/codew.js"
},
"scripts": {
"release:check": "node scripts/verify-release-assets.js",
+3 -5
View File
@@ -83,21 +83,19 @@ function detectBinaryNames() {
function unsupportedBuildHint() {
return [
"No prebuilt binary is available for this platform/architecture combo.",
"You can still run codewhale by building from source with Cargo:",
"You can still run codewhale by building from source with Cargo (single binary):",
"",
" # Requires Rust 1.88+ (https://rustup.rs)",
" cargo install codewhale-cli --locked # provides `codewhale` and `codew`",
" cargo install codewhale --locked # provides `codewhale`",
"",
"Or build from a checkout:",
"",
" git clone https://github.com/Hmbown/CodeWhale.git",
" cd CodeWhale",
" cargo install --path crates/cli --locked",
" cargo install --path crates/tui --locked",
" cargo install --path crates/cli --locked # single binary",
"",
"See https://github.com/Hmbown/CodeWhale/blob/main/docs/INSTALL.md",
"for cross-compilation, mirror, and Linux ARM64 specifics.",
"for cross-compilation, mirror, Linux ARM64, FreeBSD, and winget specifics.",
].join("\n");
}
+6 -10
View File
@@ -142,7 +142,7 @@ function maxAttempts(context = "runtime", env = process.env) {
}
function binaryPaths() {
const { codewhale, codew, tui } = detectBinaryNames();
const { codewhale, codew } = detectBinaryNames();
const releaseDir = releaseBinaryDirectory();
return {
codewhale: {
@@ -153,12 +153,8 @@ function binaryPaths() {
asset: codew,
target: path.join(releaseDir, process.platform === "win32" ? "codew.exe" : "codew"),
},
tui: {
asset: tui,
target: path.join(releaseDir, process.platform === "win32" ? "codewhale-tui.exe" : "codewhale-tui"),
},
};
}
} // single binary — no tui asset (v0.9.5+)
// ────────────────────────────────────────────────────────────────────────────
// Logging / progress
@@ -207,7 +203,7 @@ function installFailureHint(error) {
"codewhale install hint:",
` DEEPSEEK_TUI_RELEASE_BASE_URL is set to ${releaseBase}`,
" Verify that this directory contains codewhale-artifacts-sha256.txt",
" plus the codewhale/codew/codewhale-tui binary assets for your platform.",
" plus the codewhale/codew binary assets for your platform (single binary).",
].join("\n");
}
@@ -1138,8 +1134,7 @@ async function run(options = {}) {
await Promise.all([
ensureBinary(paths.codewhale.target, paths.codewhale.asset, version, repo, getChecksums, { context }),
ensureBinary(paths.codew.target, paths.codew.asset, version, repo, getChecksums, { context }),
ensureBinary(paths.tui.target, paths.tui.asset, version, repo, getChecksums, { context }),
]);
]); // single binary
}
async function getBinaryPath(name) {
@@ -1152,7 +1147,8 @@ async function getBinaryPath(name) {
return paths.codew.target;
}
if (name === "codewhale-tui") {
return paths.tui.target;
// v0.9.5 single-binary: codewhale-tui is now an alias to codewhale for backwards compat
return paths.codewhale.target;
}
throw new Error(`Unknown binary: ${name}`);
}
+5 -1
View File
@@ -51,7 +51,11 @@ async function runCodeWhale() {
}
async function runCodeWhaleTui() {
await run("codewhale-tui");
// v0.9.5 single-binary: tui is now an alias to codewhale (kept for backwards compat, will warn)
if (!process.env.CODEWHALE_SUPPRESS_TUI_DEPRECATION) {
process.stderr.write("codewhale-tui: deprecated alias to `codewhale` (single binary since v0.9.5). Use `codewhale` instead.\n");
}
await run("codewhale");
}
module.exports = {
+4 -8
View File
@@ -25,8 +25,8 @@ test("openharmony x64 resolves to linux x64 binaries", () => {
const { detectBinaryNames } = require(ARTIFACTS_PATH);
const result = detectBinaryNames();
assert.equal(result.codewhale, "codewhale-linux-x64");
assert.equal(result.tui, "codewhale-tui-linux-x64");
assert.equal(result.codew, "codew-linux-x64");
assert.equal(result.tui, undefined);
});
});
@@ -35,7 +35,6 @@ test("openharmony arm64 resolves to linux arm64 binaries", () => {
const { detectBinaryNames } = require(ARTIFACTS_PATH);
const result = detectBinaryNames();
assert.equal(result.codewhale, "codewhale-linux-arm64");
assert.equal(result.tui, "codewhale-tui-linux-arm64");
assert.equal(result.codew, "codew-linux-arm64");
});
});
@@ -45,7 +44,6 @@ test("android arm64 resolves to Termux-native Android assets", () => {
const { detectBinaryNames } = require(ARTIFACTS_PATH);
const result = detectBinaryNames();
assert.equal(result.codewhale, "codewhale-android-arm64");
assert.equal(result.tui, "codewhale-tui-android-arm64");
assert.equal(result.codew, "codew-android-arm64");
});
});
@@ -85,7 +83,6 @@ test("Windows arm64 resolves the complete native binary family", () => {
platform: "win32",
arch: "arm64",
codewhale: "codewhale-windows-arm64.exe",
tui: "codewhale-tui-windows-arm64.exe",
codew: "codew-windows-arm64.exe",
});
});
@@ -119,15 +116,15 @@ test("release asset inventory includes binaries, archives, installer, and manife
const assetNames = allAssetNames();
const releaseAssetNames = allReleaseAssetNames();
assert.ok(assetNames.includes("codewhale-windows-x64.exe"));
assert.ok(assetNames.includes("codewhale-tui-windows-x64.exe"));
assert.ok(assetNames.includes("codew-windows-x64.exe"));
assert.ok(assetNames.includes("codewhale.bat"));
assert.ok(assetNames.includes("codewhale-windows-arm64.exe"));
assert.ok(assetNames.includes("codewhale-tui-windows-arm64.exe"));
assert.ok(assetNames.includes("codew-windows-arm64.exe"));
assert.ok(assetNames.includes("codewhale-android-arm64"));
assert.ok(assetNames.includes("codewhale-tui-android-arm64"));
assert.ok(assetNames.includes("codew-android-arm64"));
assert.ok(!assetNames.includes("codewhale-tui-windows-x64.exe"));
assert.ok(!assetNames.includes("codewhale-tui-windows-arm64.exe"));
assert.ok(!assetNames.includes("codewhale-tui-android-arm64"));
assert.ok(!assetNames.includes("codewhale-linux-riscv64"));
assert.ok(releaseAssetNames.includes("codew-windows-x64.exe"));
assert.ok(releaseAssetNames.includes("codewhale.bat"));
@@ -165,7 +162,6 @@ test("CNB mirror URLs use the repository that publishes release assets", () => {
assert.deepEqual(CNB_RELEASE_ASSET_NAMES, [
"codewhale-linux-x64",
"codew-linux-x64",
"codewhale-tui-linux-x64",
"codewhale-artifacts-sha256.txt",
]);
assert.equal(
+58
View File
@@ -0,0 +1,58 @@
# FreeBSD packaging for CodeWhale
Resolves #1097 — FreeBSD install via `cargo` today, native `pkg` port planned.
## Current: cargo install (supported)
FreeBSD has no prebuilt GitHub Release asset. The npm wrapper intentionally fails with
`Unsupported platform: freebsd` and points to the Cargo path. Build from source:
```bash
pkg install -y rust pkgconf git # or: pkg install -y lang/rust devel/pkgconf devel/git
cargo install codewhale-cli --locked # provides `codewhale` and `codew`
codewhale --version
codewhale doctor
```
The single-binary release (v0.9.5+) ships only `codewhale` + `codew`. There is no separate
`codewhale-tui` binary to install. If you previously installed `codewhale-tui` from ports or
cargo, `cargo uninstall codewhale-tui` and rebuild `codewhale-cli`.
Linux `libdbus-1` / `pkg-config` build deps are not needed on FreeBSD for the default
feature set; the `rquickjs` FreeBSD bindings are generated at build time via `bindgen`
(see `crates/tui/build.rs` and the `1582ba965`/`5eb0385e8` FreeBSD bindgen fix).
## Target validation
- Rust tier-2 target `x86_64-unknown-freebsd` is validated in CI via `cargo check --target x86_64-unknown-freebsd -p codewhale-cli --locked` on the `release/0.9.5` branch.
- `aarch64-unknown-freebsd` cross-check is tracked for future hardware.
- The release matrix in `.github/workflows/release-artifacts.yml` remains 7×1 (Linux musl x64, Linux gnu arm64, Android arm64, macOS x64/arm64, Windows x64/arm64). FreeBSD is a source-build target — no prebuilt asset, no matrix bloat, but the row in `docs/INSTALL.md` is authoritative.
## Future: native pkg / port
A proper FreeBSD port (`ports-mgmt` / `pkg install codewhale`) is the long-game follow-up to #1097.
Desired shape (not yet submitted):
```
ports/sysutils/codewhale/
Makefile # USES=cargo, CARGO_CRATES via `cargo make-port` or `cargo-crates` helper
distinfo
pkg-descr
pkg-plist # bin/codewhale, bin/codew
```
The Makefile should `BUILD_DEPENDS` on `lang/rust` and `devel/pkgconf`, run `cargo build --locked --release -p codewhale-cli`,
and install only `codewhale` + `codew`. Tests can reuse `cargo test -p codewhale-cli --lib` if desired.
If you can test on FreeBSD 14.x (amd64), please run the smoke from `docs/INSTALL.md#7-build-from-source`
and report the `codewhale doctor` JSON in #1097.
## Verification
```bash
# on a FreeBSD 14.1 amd64 host or VM
rustc --version # >= 1.88
cargo install --path crates/cli --locked
codewhale --version
codewhale exec --auto "run pwd"
```
+112
View File
@@ -0,0 +1,112 @@
# Hmbown.CodeWhale — winget singleton manifest for CodeWhale (single binary)
# PackageIdentifier follows the publisher convention used by the Homebrew tap (Hmbown/deepseek-tui).
# This file is the source of truth for winget-pkgs submission; see README.md for the update flow.
# The single-binary release (v0.9.5+) ships only `codewhale` + `codew` per target — no `codewhale-tui` asset.
PackageIdentifier: Hmbown.CodeWhale
PackageVersion: 0.9.5
DefaultLocale: en-US
ManifestType: singleton
ManifestVersion: 1.6.0
Publisher: Hmbown
PublisherUrl: https://github.com/Hmbown
PublisherSupportUrl: https://github.com/Hmbown/CodeWhale/issues
PackageName: CodeWhale
PackageUrl: https://github.com/Hmbown/CodeWhale
License: MIT
LicenseUrl: https://github.com/Hmbown/CodeWhale/blob/main/LICENSE
Copyright: Copyright (c) Hmbown
ShortDescription: Terminal coding agent for supported hosted and local models
Description: |
CodeWhale is a terminal coding agent that runs on your machine. The v0.9.5 single-binary
release ships one `codewhale` binary per target (plus the `codew` shim) across Linux x64 (musl),
Linux arm64, Android arm64, macOS x64/arm64, and Windows x64/arm64. See https://github.com/Hmbown/CodeWhale
for provider setup, Fleet workflows, and the full install guide (docs/INSTALL.md).
Author: Hmbown
Moniker: codewhale
Tags:
- codewhale
- deepseek
- cli
- tui
- terminal
- ai
- coding-agent
- rust
MinimumOSVersion: 10.0.0.0
ReleaseNotes: https://github.com/Hmbown/CodeWhale/releases/tag/v0.9.5
ReleaseNotesUrl: https://github.com/Hmbown/CodeWhale/releases/tag/v0.9.5
InstallationNotes: |
The winget package installs the Windows binaries. For the NSIS installer (CodeWhaleSetup.exe)
the installer adds %LOCALAPPDATA%\Programs\CodeWhale\bin to the user PATH. For the portable
ZIP, winget extracts codewhale.exe and codew.exe side-by-side and adds the install location to PATH.
Verify checksums with codewhale-artifacts-sha256.txt from the same GitHub Release.
Documentations:
- DocumentLabel: Install guide
DocumentUrl: https://github.com/Hmbown/CodeWhale/blob/main/docs/INSTALL.md
- DocumentLabel: Releases
DocumentUrl: https://github.com/Hmbown/CodeWhale/releases
Installers:
# Preferred: NSIS installer for Windows x64 (per-user, no elevation, adds user PATH).
- Architecture: x64
InstallerType: nullsoft
Scope: user
InstallerUrl: https://github.com/Hmbown/CodeWhale/releases/download/v0.9.5/CodeWhaleSetup.exe
InstallerSha256: 0000000000000000000000000000000000000000000000000000000000000000
ProductCode: CodeWhale
UpgradeBehavior: install
FileExtensions:
- toml
ReleaseDate: 2026-08-07
# Portable ZIP fallback — same single binary (codewhale.exe + codew.exe). Used when NSIS is blocked
# by policy or for winget's portable install flow. NestedInstallerType is portable (no installer).
- Architecture: x64
InstallerType: zip
Scope: user
InstallerUrl: https://github.com/Hmbown/CodeWhale/releases/download/v0.9.5/codewhale-windows-x64.zip
InstallerSha256: 0000000000000000000000000000000000000000000000000000000000000000
NestedInstallerType: portable
NestedInstallerFiles:
- RelativeFilePath: codewhale-windows-x64/codewhale.exe
PortableCommandAlias: codewhale
- RelativeFilePath: codewhale-windows-x64/codew.exe
PortableCommandAlias: codew
ReleaseDate: 2026-08-07
- Architecture: x64
InstallerType: zip
Scope: user
InstallerUrl: https://github.com/Hmbown/CodeWhale/releases/download/v0.9.5/codewhale-windows-x64-portable.zip
InstallerSha256: 0000000000000000000000000000000000000000000000000000000000000000
NestedInstallerType: portable
NestedInstallerFiles:
- RelativeFilePath: codewhale-windows-x64-portable/codewhale.exe
PortableCommandAlias: codewhale
- RelativeFilePath: codewhale-windows-x64-portable/codew.exe
PortableCommandAlias: codew
ReleaseDate: 2026-08-07
- Architecture: arm64
InstallerType: zip
Scope: user
InstallerUrl: https://github.com/Hmbown/CodeWhale/releases/download/v0.9.5/codewhale-windows-arm64.zip
InstallerSha256: 0000000000000000000000000000000000000000000000000000000000000000
NestedInstallerType: portable
NestedInstallerFiles:
- RelativeFilePath: codewhale-windows-arm64/codewhale.exe
PortableCommandAlias: codewhale
- RelativeFilePath: codewhale-windows-arm64/codew.exe
PortableCommandAlias: codew
ReleaseDate: 2026-08-07
- Architecture: arm64
InstallerType: zip
Scope: user
InstallerUrl: https://github.com/Hmbown/CodeWhale/releases/download/v0.9.5/codewhale-windows-arm64-portable.zip
InstallerSha256: 0000000000000000000000000000000000000000000000000000000000000000
NestedInstallerType: portable
NestedInstallerFiles:
- RelativeFilePath: codewhale-windows-arm64-portable/codewhale.exe
PortableCommandAlias: codewhale
- RelativeFilePath: codewhale-windows-arm64-portable/codew.exe
PortableCommandAlias: codew
ReleaseDate: 2026-08-07
+64
View File
@@ -0,0 +1,64 @@
# winget packaging for CodeWhale
This directory holds the source winget manifest for `Hmbown.CodeWhale` (resolves #1561).
The single-binary release (v0.9.5+) ships `codewhale` + `codew` per target — no `codewhale-tui` asset.
## Files
- `Hmbown.CodeWhale.yaml` — singleton manifest for `winget install Hmbown.CodeWhale`. The
installers all point at the signed (or checksum-verified) GitHub Release assets for the same
version (`CodeWhaleSetup.exe` for x64 NSIS, plus portable ZIP fallbacks for x64/arm64).
- `generate-winget-manifest.sh` — bumps `PackageVersion`, `ReleaseDate`, and the four
`InstallerSha256` placeholders from a local `release-assets/` checkout.
- `.winget/Hmbown.CodeWhale.yaml` (repo root) is a verbatim mirror for tooling that expects `.winget/`.
Keep both in sync; `packaging/winget/Hmbown.CodeWhale.yaml` is canonical.
## Version flow
1. Tag `vX.Y.Z` publishes `CodeWhaleSetup.exe`, `codewhale-windows-x64.zip`,
`codewhale-windows-x64-portable.zip`, `codewhale-windows-arm64.zip`,
`codewhale-windows-arm64-portable.zip`, and `codewhale-artifacts-sha256.txt`.
2. From the release tag checkout, run:
```bash
./packaging/winget/generate-winget-manifest.sh X.Y.Z /path/to/release-assets
```
It rewrites both `packaging/winget/Hmbown.CodeWhale.yaml` and `.winget/Hmbown.CodeWhale.yaml`
with the fresh version and the four SHA-256 values extracted from `codewhale-artifacts-sha256.txt`.
3. Validate locally with `winget validate` (requires winget + the manifest schema):
```bash
winget validate --manifest packaging/winget/Hmbown.CodeWhale.yaml
# or the Microsoft validator in winget-pkgs CI:
# https://github.com/microsoft/winget-pkgs#validation
```
4. Submit to [microsoft/winget-pkgs](https://github.com/microsoft/winget-pkgs) via
`wingetcreate` or a manual PR that adds `manifests/h/Hmbown/CodeWhale/X.Y.Z/`:
```bash
wingetcreate update Hmbown.CodeWhale --version X.Y.Z --urls \
https://github.com/Hmbown/CodeWhale/releases/download/vX.Y.Z/CodeWhaleSetup.exe \
https://github.com/Hmbown/CodeWhale/releases/download/vX.Y.Z/codewhale-windows-x64.zip \
https://github.com/Hmbown/CodeWhale/releases/download/vX.Y.Z/codewhale-windows-x64-portable.zip \
https://github.com/Hmbown/CodeWhale/releases/download/vX.Y.Z/codewhale-windows-arm64.zip \
https://github.com/Hmbown/CodeWhale/releases/download/vX.Y.Z/codewhale-windows-arm64-portable.zip
```
The generated PR must pass the winget-pkgs validation workflow before merge.
## Single-binary note
Until v0.9.4 the release matrix was 7 targets × 3 binaries (`codewhale`, `codew`, `codewhale-tui`).
v0.9.5 is 7×1 — each target publishes only `codewhale` + `codew` (Windows also ships `codewhale.bat`
via the npm wrapper). The winget ZIP `NestedInstallerFiles` therefore lists only those two
executables; `codewhale-tui.exe` is intentionally absent.
## FreeBSD
FreeBSD has no prebuilt GitHub Release asset (see `docs/INSTALL.md` § FreeBSD). Install via Cargo:
```bash
pkg install -y rust pkgconf # or ports-mgmt/pkg
cargo install codewhale-cli --locked # provides `codewhale` and `codew`
```
The npm wrapper on FreeBSD exits with `Unsupported platform: freebsd` and points to the Cargo path.
A native `pkg install codewhale` port is tracked as a follow-up to #1097 — contributions welcome
under `packaging/freebsd/`.
+3 -6
View File
@@ -1,7 +1,7 @@
; codewhale.nsi — NSIS installer for CodeWhale (Windows)
;
; Requirements (see https://github.com/Hmbown/CodeWhale/issues/1983):
; - Install codewhale.exe, codew.exe, and codewhale-tui.exe side-by-side
; - Install codewhale.exe and codew.exe side-by-side (single binary, no codewhale-tui.exe)
; - Default to %LOCALAPPDATA%\Programs\CodeWhale\bin
; - Add install dir to current-user PATH
; - Uninstaller removes the PATH entry
@@ -10,7 +10,6 @@
; 1. Place all .exe files next to this script:
; codewhale.exe
; codew.exe
; codewhale-tui.exe
; 2. Build:
; makensis /DVERSION=1.2.3 codewhale.nsi
; 3. Output: CodeWhaleSetup.exe (in current directory)
@@ -72,10 +71,9 @@ Section "Install" SecInstall
SetOutPath "$INSTDIR\bin"
; Copy binaries
; Copy binaries (single binary)
File "codewhale.exe"
File "codew.exe"
File "codewhale-tui.exe"
; Write uninstaller
WriteUninstaller "$INSTDIR\Uninstall.exe"
@@ -124,10 +122,9 @@ Section "Uninstall"
; handles PATH values longer than NSIS_MAX_STRLEN without truncation.
Call un.RemoveFromUserPath
; Remove binaries
; Remove binaries (single binary)
Delete "$INSTDIR\bin\codewhale.exe"
Delete "$INSTDIR\bin\codew.exe"
Delete "$INSTDIR\bin\codewhale-tui.exe"
Delete "$INSTDIR\update-user-path.ps1"
Delete "$INSTDIR\Uninstall.exe"
RMDir "$INSTDIR\bin"
@@ -58,10 +58,10 @@ function makeIntermediateArtifacts(root) {
);
}
test("authoritative release inventory contains seven targets and 34 assets", () => {
test("authoritative release inventory contains seven targets and 27 assets (single binary)", () => {
const assets = allReleaseAssetNames();
assert.equal(assets.length, 34);
assert.equal(checksummedReleaseAssetNames().length, 33);
assert.equal(assets.length, 27);
assert.equal(checksummedReleaseAssetNames().length, 26);
for (const required of [
"codewhale-android-arm64",
"codew-android-arm64",
@@ -111,7 +111,7 @@ test("bundle helper creates the exact nine archives and checksum manifest", () =
try {
fs.mkdirSync(input, { recursive: true });
for (const name of allReleaseAssetNames().filter((asset) =>
/^(codewhale|codew|codewhale-tui)-(linux|android|macos|windows)-/.test(asset) &&
/^(codewhale|codew)-(linux|android|macos|windows)-/.test(asset) &&
!asset.endsWith(".tar.gz") &&
!asset.endsWith(".zip"),
)) {
@@ -159,7 +159,7 @@ test("bundle helper creates the exact nine archives and checksum manifest", () =
["-tzf", path.join(output, "codewhale-linux-x64.tar.gz")],
{ encoding: "utf8" },
);
for (const entry of ["codewhale", "codew", "codewhale-tui", "install.sh"]) {
for (const entry of ["codewhale", "codew", "install.sh"]) {
assert.match(linuxEntries, new RegExp(`codewhale-linux-x64/${entry}\\n`));
}
const extracted = path.join(tempRoot, "extracted");
@@ -169,7 +169,7 @@ test("bundle helper creates the exact nine archives and checksum manifest", () =
["-xzf", path.join(output, "codewhale-linux-x64.tar.gz"), "-C", extracted],
{ stdio: "pipe" },
);
for (const entry of ["codewhale", "codew", "codewhale-tui", "install.sh"]) {
for (const entry of ["codewhale", "codew", "install.sh"]) {
const mode = fs.statSync(path.join(extracted, "codewhale-linux-x64", entry)).mode & 0o777;
assert.equal(mode, 0o755, `${entry} should remain executable after artifact transport`);
}
+12 -17
View File
@@ -35,9 +35,8 @@ bundle() {
local platform="$1"
local cli_src="$2"
local shim_src="$3"
local tui_src="$4"
local ext="$5"
local variant="$6"
local ext="$4"
local variant="$5"
local stem="codewhale-${platform}${variant:+-}${variant}"
local stage_root
@@ -47,24 +46,20 @@ bundle() {
local cli_dst="codewhale"
local shim_dst="codew"
local tui_dst="codewhale-tui"
if [[ "${platform}" == windows-* ]]; then
cli_dst="codewhale.exe"
shim_dst="codew.exe"
tui_dst="codewhale-tui.exe"
fi
cp "${artifact_dir}/${cli_src}/${cli_src}" "${stage_dir}/${cli_dst}"
cp "${artifact_dir}/${shim_src}/${shim_src}" "${stage_dir}/${shim_dst}"
cp "${artifact_dir}/${tui_src}/${tui_src}" "${stage_dir}/${tui_dst}"
# actions/upload-artifact intentionally normalizes downloaded files to 0644.
# Restore the executable contract before constructing Unix archives.
if [[ "${platform}" != windows-* ]]; then
chmod 0755 \
"${stage_dir}/${cli_dst}" \
"${stage_dir}/${shim_dst}" \
"${stage_dir}/${tui_dst}"
"${stage_dir}/${shim_dst}"
fi
if [[ "${variant}" != "portable" ]]; then
@@ -107,23 +102,23 @@ bundle() {
}
bundle linux-x64 \
codewhale-linux-x64 codew-linux-x64 codewhale-tui-linux-x64 tar.gz ""
codewhale-linux-x64 codew-linux-x64 tar.gz ""
bundle linux-arm64 \
codewhale-linux-arm64 codew-linux-arm64 codewhale-tui-linux-arm64 tar.gz ""
codewhale-linux-arm64 codew-linux-arm64 tar.gz ""
bundle android-arm64 \
codewhale-android-arm64 codew-android-arm64 codewhale-tui-android-arm64 tar.gz ""
codewhale-android-arm64 codew-android-arm64 tar.gz ""
bundle macos-x64 \
codewhale-macos-x64 codew-macos-x64 codewhale-tui-macos-x64 tar.gz ""
codewhale-macos-x64 codew-macos-x64 tar.gz ""
bundle macos-arm64 \
codewhale-macos-arm64 codew-macos-arm64 codewhale-tui-macos-arm64 tar.gz ""
codewhale-macos-arm64 codew-macos-arm64 tar.gz ""
bundle windows-x64 \
codewhale-windows-x64.exe codew-windows-x64.exe codewhale-tui-windows-x64.exe zip ""
codewhale-windows-x64.exe codew-windows-x64.exe zip ""
bundle windows-x64 \
codewhale-windows-x64.exe codew-windows-x64.exe codewhale-tui-windows-x64.exe zip portable
codewhale-windows-x64.exe codew-windows-x64.exe zip portable
bundle windows-arm64 \
codewhale-windows-arm64.exe codew-windows-arm64.exe codewhale-tui-windows-arm64.exe zip ""
codewhale-windows-arm64.exe codew-windows-arm64.exe zip ""
bundle windows-arm64 \
codewhale-windows-arm64.exe codew-windows-arm64.exe codewhale-tui-windows-arm64.exe zip portable
codewhale-windows-arm64.exe codew-windows-arm64.exe zip portable
sort -o "${manifest}" "${manifest}"
echo "Bundle checksum manifest:"
+1 -7
View File
@@ -1,7 +1,7 @@
@echo off
setlocal enabledelayedexpansion
:: CodeWhale Windows installer
:: Copies codewhale.exe, codew.exe, and codewhale-tui.exe to %USERPROFILE%\bin
:: Copies codewhale.exe and codew.exe to %USERPROFILE%\bin (single binary, no codewhale-tui.exe)
set "BIN_DIR=%USERPROFILE%\bin"
set "SCRIPT_DIR=%~dp0"
@@ -22,12 +22,6 @@ if %ERRORLEVEL% neq 0 (
exit /b 1
)
copy /Y "%SCRIPT_DIR%codewhale-tui.exe" "%BIN_DIR%\codewhale-tui.exe" >nul
if %ERRORLEVEL% neq 0 (
echo ERROR: Failed to copy codewhale-tui.exe
exit /b 1
)
echo.
echo Done. Commands installed to %BIN_DIR%.
echo.