From 7e0cdb7812dd5e6813494e3d592de97ec8b3f0c9 Mon Sep 17 00:00:00 2001 From: willamhou Date: Sun, 24 May 2026 12:26:14 +0800 Subject: [PATCH] Prepare v0.1.3 linux arm64 release --- .github/workflows/release-smoke.yml | 4 ++- .github/workflows/release.yml | 12 ++++++-- CHANGELOG.md | 32 +++++++++++++++++++++ Cargo.lock | 2 +- Cargo.toml | 2 +- README.ja-JP.md | 14 ++++----- README.md | 14 ++++----- README.zh-CN.md | 14 ++++----- docs/dogfood-evidence.md | 2 +- docs/install.md | 40 ++++++++++++-------------- docs/public-beta.md | 8 +++--- docs/release.md | 14 ++++----- npm/README.md | 1 + npm/bin/deepseek.js | 2 +- npm/package.json | 11 +++---- npm/platforms/linux-arm64/LICENSE | 4 +++ npm/platforms/linux-arm64/package.json | 28 ++++++++++++++++++ npm/platforms/linux-x64/package.json | 2 +- npm/platforms/macos-arm64/package.json | 2 +- npm/platforms/macos-x64/package.json | 2 +- npm/platforms/windows-x64/package.json | 2 +- npm/scripts/check-version-sync.js | 9 ++++-- npm/scripts/test-wrapper-resolution.js | 1 + packaging/homebrew/deepseek.rb | 13 +++++---- packaging/homebrew/verify-formula.js | 6 ++-- src/cli/commands/update.rs | 30 +++++++++++++++++-- src/tui.rs | 2 +- 27 files changed, 189 insertions(+), 84 deletions(-) create mode 100644 npm/platforms/linux-arm64/LICENSE create mode 100644 npm/platforms/linux-arm64/package.json diff --git a/.github/workflows/release-smoke.yml b/.github/workflows/release-smoke.yml index 47475f1..66fd9d2 100644 --- a/.github/workflows/release-smoke.yml +++ b/.github/workflows/release-smoke.yml @@ -6,7 +6,7 @@ on: version: description: "Release version without the v prefix" required: true - default: "0.1.2" + default: "0.1.3" repository: description: "Release asset repository" required: true @@ -28,6 +28,8 @@ jobs: include: - name: linux-x64 os: ubuntu-latest + - name: linux-arm64 + os: ubuntu-24.04-arm - name: macos-x64 os: macos-15-intel - name: macos-arm64 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b4f43ef..b236904 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -29,6 +29,11 @@ jobs: artifact: deepseek-linux-x64 binary: ./target/release/deepseek npm_platform: linux-x64 + - name: linux-arm64 + os: ubuntu-24.04-arm + artifact: deepseek-linux-arm64 + binary: ./target/release/deepseek + npm_platform: linux-arm64 - name: macos-x64 os: macos-15-intel artifact: deepseek-macos-x64 @@ -243,8 +248,9 @@ jobs: run: | mkdir -p target/homebrew-shas printf '%064d deepseek-linux-x64.tar.gz\n' 1 > target/homebrew-shas/deepseek-linux-x64.tar.gz.sha256 - printf '%064d deepseek-macos-x64.tar.gz\n' 2 > target/homebrew-shas/deepseek-macos-x64.tar.gz.sha256 - printf '%064d deepseek-macos-arm64.tar.gz\n' 3 > target/homebrew-shas/deepseek-macos-arm64.tar.gz.sha256 + printf '%064d deepseek-linux-arm64.tar.gz\n' 2 > target/homebrew-shas/deepseek-linux-arm64.tar.gz.sha256 + printf '%064d deepseek-macos-x64.tar.gz\n' 3 > target/homebrew-shas/deepseek-macos-x64.tar.gz.sha256 + printf '%064d deepseek-macos-arm64.tar.gz\n' 4 > target/homebrew-shas/deepseek-macos-arm64.tar.gz.sha256 version="$(node -e "const fs = require('fs'); process.stdout.write(fs.readFileSync('Cargo.toml', 'utf8').match(/^version = \"([^\"]+)\"/m)[1])")" cargo run --bin deepseek -- update homebrew-formula --version "$version" --repo willamhou/DeepSeekCode --dist target/homebrew-shas --formula packaging/homebrew/deepseek.rb --out target/deepseek.rb node packaging/homebrew/verify-formula.js --formula target/deepseek.rb --release @@ -282,7 +288,7 @@ jobs: echo echo "Automated release generated from ${GITHUB_SHA}." echo - echo "Artifacts include Linux x64, macOS x64, macOS arm64, and Windows x64 packages plus SHA-256 checksum files." + echo "Artifacts include Linux x64, Linux arm64, macOS x64, macOS arm64, and Windows x64 packages plus SHA-256 checksum files." echo "Docker image target: ghcr.io/${GITHUB_REPOSITORY,,}:${GITHUB_REF_NAME#v} (also :${GITHUB_REF_NAME} and :latest)." echo echo "Verification gates completed in this workflow:" diff --git a/CHANGELOG.md b/CHANGELOG.md index 906dffe..c1dcc88 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,37 @@ # Changelog +## 0.1.3 - 2026-05-24 + +Linux arm64 distribution hardening. + +### Added + +- Linux arm64 release matrix target using the native `ubuntu-24.04-arm` + hosted runner. +- Linux arm64 release asset support in `deepseek update download-plan` and + `deepseek update release-smoke`. +- Linux arm64 npm platform package metadata and wrapper resolution support. +- Homebrew formula support for Linux arm64 release assets. +- Manual clean-machine release-smoke and Homebrew smoke workflows for public + release/tap verification evidence. + +### Changed + +- Release assets now cover Linux x64, Linux arm64, macOS x64, macOS arm64, and + Windows x64. +- Documentation points at the `v0.1.3` release/install paths. + +### Verification + +- `cargo fmt --check` +- `cargo test --lib -- --test-threads=1` +- `cargo package --allow-dirty` +- `npm --prefix npm test` +- `node scripts/check-secrets.js` +- `node npm/scripts/check-version-sync.js` +- `node packaging/homebrew/verify-formula.js` +- `target/debug/deepseek update download-plan --version 0.1.3 --platform linux-arm64 --json` + ## 0.1.2 - 2026-05-24 Public beta release for the Linux/macOS local code-agent CLI milestone. diff --git a/Cargo.lock b/Cargo.lock index 004c1a2..8097ab7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -158,7 +158,7 @@ dependencies = [ [[package]] name = "deepseek_code" -version = "0.1.2" +version = "0.1.3" dependencies = [ "crossterm", "flate2", diff --git a/Cargo.toml b/Cargo.toml index 5a0368f..2402765 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "deepseek_code" -version = "0.1.2" +version = "0.1.3" edition = "2021" default-run = "deepseek" description = "DeepSeek-first terminal code agent" diff --git a/README.ja-JP.md b/README.ja-JP.md index 2224b64..5d9bda4 100644 --- a/README.ja-JP.md +++ b/README.ja-JP.md @@ -7,7 +7,7 @@ DeepSeekCode は DeepSeek-first のターミナル code agent です。ローカ 同じターミナルで作業を続ける流れを前提にしています。 > Public beta status: Linux/macOS の dogfood とリポジトリ作業には今日から利用できます。 -> `v0.1.2` は GitHub Release binaries、検証済み GHCR image、TUI/service smoke gates、 +> `v0.1.3` は GitHub Release binaries、検証済み GHCR image、TUI/service smoke gates、 > `deepseek quickstart`、release-binary smoke verifier を備えています。Homebrew、 > npm registry publishing、より広い external repo evidence、リッチな launch media は > 引き続き product-hardening work です。 @@ -52,11 +52,11 @@ deepseek doctor --json または release archive をダウンロード: ```bash -deepseek update download-plan --version 0.1.2 +deepseek update download-plan --version 0.1.3 curl -L -o deepseek-linux-x64.tar.gz \ - https://github.com/willamhou/DeepSeekCode/releases/download/v0.1.2/deepseek-linux-x64.tar.gz + https://github.com/willamhou/DeepSeekCode/releases/download/v0.1.3/deepseek-linux-x64.tar.gz curl -L -o deepseek-linux-x64.tar.gz.sha256 \ - https://github.com/willamhou/DeepSeekCode/releases/download/v0.1.2/deepseek-linux-x64.tar.gz.sha256 + https://github.com/willamhou/DeepSeekCode/releases/download/v0.1.3/deepseek-linux-x64.tar.gz.sha256 shasum -a 256 -c deepseek-linux-x64.tar.gz.sha256 tar -xzf deepseek-linux-x64.tar.gz ./deepseek version @@ -65,7 +65,7 @@ tar -xzf deepseek-linux-x64.tar.gz または公開済み container を実行: ```bash -docker run --rm ghcr.io/willamhou/deepseekcode:0.1.2 version +docker run --rm ghcr.io/willamhou/deepseekcode:0.1.3 version ``` local checkout からインストール: @@ -110,7 +110,7 @@ git から無視されます。 - RLM helpers: recursive/long-input analysis、model-session context、live queue status、event replay、cancel、recover、drain controls。 - Linux/macOS/Windows entrypoints は CI smoke 済み。release assets は Linux x64、 - macOS x64、macOS arm64、Windows x64 を含みます。 + Linux arm64、macOS x64、macOS arm64、Windows x64 を含みます。 - 実 model-backed README demo と online multi-file external fixture evidence を 記録済みです。 @@ -139,7 +139,7 @@ cargo test --lib -- --test-threads=1 node scripts/check-secrets.js deepseek quickstart --json deepseek update publish-status --json -deepseek update release-smoke --version 0.1.2 --json +deepseek update release-smoke --version 0.1.3 --json deepseek tui --entrypoint-smoke --smoke-bin "$(command -v deepseek)" ``` diff --git a/README.md b/README.md index 3da75db..9f830ee 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ loop: inspect a repository, edit files, run checks, review the diff, and keep working from the same terminal. > Public beta status: usable today for Linux/macOS dogfooding and repository -> work. `v0.1.2` ships GitHub Release binaries, a verified GHCR image, TUI and +> work. `v0.1.3` ships GitHub Release binaries, a verified GHCR image, TUI and > service smoke gates, `deepseek quickstart`, and a release-binary smoke > verifier. Homebrew, npm registry publishing, broader external repo evidence, > and richer launch media are still product-hardening work. @@ -52,11 +52,11 @@ deepseek doctor --json Or download a release archive: ```bash -deepseek update download-plan --version 0.1.2 +deepseek update download-plan --version 0.1.3 curl -L -o deepseek-linux-x64.tar.gz \ - https://github.com/willamhou/DeepSeekCode/releases/download/v0.1.2/deepseek-linux-x64.tar.gz + https://github.com/willamhou/DeepSeekCode/releases/download/v0.1.3/deepseek-linux-x64.tar.gz curl -L -o deepseek-linux-x64.tar.gz.sha256 \ - https://github.com/willamhou/DeepSeekCode/releases/download/v0.1.2/deepseek-linux-x64.tar.gz.sha256 + https://github.com/willamhou/DeepSeekCode/releases/download/v0.1.3/deepseek-linux-x64.tar.gz.sha256 shasum -a 256 -c deepseek-linux-x64.tar.gz.sha256 tar -xzf deepseek-linux-x64.tar.gz ./deepseek version @@ -65,7 +65,7 @@ tar -xzf deepseek-linux-x64.tar.gz Or run the published container: ```bash -docker run --rm ghcr.io/willamhou/deepseekcode:0.1.2 version +docker run --rm ghcr.io/willamhou/deepseekcode:0.1.3 version ``` For a local checkout: @@ -111,7 +111,7 @@ git. - RLM helpers for recursive and long-input analysis, model-session context, live queue status, event replay, cancellation, recovery, and drain controls. - CI-smoked Linux/macOS/Windows entrypoints plus release assets for Linux x64, - macOS x64, macOS arm64, and Windows x64. + Linux arm64, macOS x64, macOS arm64, and Windows x64. - Verified model-backed README demo and online multi-file external fixture evidence for the current release-readiness path. @@ -141,7 +141,7 @@ cargo test --lib -- --test-threads=1 node scripts/check-secrets.js deepseek quickstart --json deepseek update publish-status --json -deepseek update release-smoke --version 0.1.2 --json +deepseek update release-smoke --version 0.1.3 --json deepseek tui --entrypoint-smoke --smoke-bin "$(command -v deepseek)" ``` diff --git a/README.zh-CN.md b/README.zh-CN.md index 9eb18bd..ebd3426 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -6,7 +6,7 @@ DeepSeekCode 是一个 DeepSeek-first 的终端 code agent,面向本地开发 阅读仓库、修改文件、运行检查、查看 diff,然后继续在同一个终端里迭代。 > Public beta 状态:今天已经可以用于 Linux/macOS dogfood 和仓库内代码任务。 -> `v0.1.2` 已提供 GitHub Release 二进制、实测 GHCR 镜像、TUI/service smoke gate、 +> `v0.1.3` 已提供 GitHub Release 二进制、实测 GHCR 镜像、TUI/service smoke gate、 > `deepseek quickstart` 和 release-binary smoke verifier。Homebrew、npm registry > 发布、更广的外部仓库证据,以及更精致的发布素材仍属于产品硬化工作。 @@ -48,11 +48,11 @@ deepseek doctor --json 或者下载 release archive: ```bash -deepseek update download-plan --version 0.1.2 +deepseek update download-plan --version 0.1.3 curl -L -o deepseek-linux-x64.tar.gz \ - https://github.com/willamhou/DeepSeekCode/releases/download/v0.1.2/deepseek-linux-x64.tar.gz + https://github.com/willamhou/DeepSeekCode/releases/download/v0.1.3/deepseek-linux-x64.tar.gz curl -L -o deepseek-linux-x64.tar.gz.sha256 \ - https://github.com/willamhou/DeepSeekCode/releases/download/v0.1.2/deepseek-linux-x64.tar.gz.sha256 + https://github.com/willamhou/DeepSeekCode/releases/download/v0.1.3/deepseek-linux-x64.tar.gz.sha256 shasum -a 256 -c deepseek-linux-x64.tar.gz.sha256 tar -xzf deepseek-linux-x64.tar.gz ./deepseek version @@ -61,7 +61,7 @@ tar -xzf deepseek-linux-x64.tar.gz 或者运行已发布的容器镜像: ```bash -docker run --rm ghcr.io/willamhou/deepseekcode:0.1.2 version +docker run --rm ghcr.io/willamhou/deepseekcode:0.1.3 version ``` 本地 checkout 安装: @@ -105,7 +105,7 @@ deepseek tui --runtime-url http://127.0.0.1:13000 - RLM helpers:递归/长输入分析、model-session context、live queue status、 event replay、cancel、recover 和 drain controls。 - Linux/macOS/Windows entrypoint 已纳入 CI smoke;release assets 覆盖 Linux x64、 - macOS x64、macOS arm64 和 Windows x64。 + Linux arm64、macOS x64、macOS arm64 和 Windows x64。 - 已提交真实 model-backed README demo,并记录 online multi-file external fixture 证据。 @@ -133,7 +133,7 @@ cargo test --lib -- --test-threads=1 node scripts/check-secrets.js deepseek quickstart --json deepseek update publish-status --json -deepseek update release-smoke --version 0.1.2 --json +deepseek update release-smoke --version 0.1.3 --json deepseek tui --entrypoint-smoke --smoke-bin "$(command -v deepseek)" ``` diff --git a/docs/dogfood-evidence.md b/docs/dogfood-evidence.md index a7fd509..37d19e1 100644 --- a/docs/dogfood-evidence.md +++ b/docs/dogfood-evidence.md @@ -130,7 +130,7 @@ deepseek dogfood report --limit 20 \ After installing a published release binary, verify the current platform with: ```bash -deepseek update release-smoke --version 0.1.2 --json +deepseek update release-smoke --version 0.1.3 --json ``` This is the lightweight operator command for checking release archive diff --git a/docs/install.md b/docs/install.md index 1bf7bef..a916b70 100644 --- a/docs/install.md +++ b/docs/install.md @@ -139,31 +139,31 @@ deepseek dogfood report --limit 20 \ ## Release Binary -GitHub Release 已经提供 `v0.1.2` 的 Linux x64、macOS x64、macOS arm64 和 -Windows x64 包,以及对应 `.sha256` 文件。例如 Linux x64: +GitHub Release 已经提供 `v0.1.3` 的 Linux x64、Linux arm64、macOS x64、 +macOS arm64 和 Windows x64 包,以及对应 `.sha256` 文件。例如 Linux x64: 先让 CLI 根据当前平台打印下载、checksum 和解压命令: ```bash -deepseek update download-plan --version 0.1.2 -deepseek update download-plan --version 0.1.2 --json +deepseek update download-plan --version 0.1.3 +deepseek update download-plan --version 0.1.3 --json ``` 也可以让 CLI 直接完成当前平台 release binary smoke:下载 archive 和 `.sha256`、 校验 checksum、解压 binary,并在隔离目录跑 `version`、`config init`、`doctor`、 `exec --json` 和一个 benchmark sample。这个命令只适用于当前机器架构已经有对应 -release asset 的平台,例如 Linux x64、macOS x64、macOS arm64: +release asset 的平台,例如 Linux x64、Linux arm64、macOS x64、macOS arm64: ```bash -deepseek update release-smoke --version 0.1.2 -deepseek update release-smoke --version 0.1.2 --json +deepseek update release-smoke --version 0.1.3 +deepseek update release-smoke --version 0.1.3 --json ``` ```bash curl -L -o deepseek-linux-x64.tar.gz \ - https://github.com/willamhou/DeepSeekCode/releases/download/v0.1.2/deepseek-linux-x64.tar.gz + https://github.com/willamhou/DeepSeekCode/releases/download/v0.1.3/deepseek-linux-x64.tar.gz curl -L -o deepseek-linux-x64.tar.gz.sha256 \ - https://github.com/willamhou/DeepSeekCode/releases/download/v0.1.2/deepseek-linux-x64.tar.gz.sha256 + https://github.com/willamhou/DeepSeekCode/releases/download/v0.1.3/deepseek-linux-x64.tar.gz.sha256 shasum -a 256 -c deepseek-linux-x64.tar.gz.sha256 tar -xzf deepseek-linux-x64.tar.gz ./deepseek version @@ -174,7 +174,7 @@ tar -xzf deepseek-linux-x64.tar.gz ```bash DSCODE_RELEASE_BASE_URL=https:/// \ - deepseek update download-plan --version 0.1.2 + deepseek update download-plan --version 0.1.3 ``` 本地 release binary 路径固定为: @@ -217,16 +217,15 @@ docker run --rm deepseek-code:local version Tag 版 `Release Matrix` workflow 会把同一个 Dockerfile 构建并推送到 GHCR: ```bash -docker pull ghcr.io/willamhou/deepseekcode:0.1.2 -docker run --rm ghcr.io/willamhou/deepseekcode:0.1.2 version +docker pull ghcr.io/willamhou/deepseekcode:0.1.3 +docker run --rm ghcr.io/willamhou/deepseekcode:0.1.3 version ``` 同一次 tag 发布会写入 ``、`v` 和 `latest` 三个 tag;镜像名会按 -GHCR 要求转成小写。`v0.1.2` 的 workflow 已推送公开 registry manifest,digest 为 -`sha256:c927e14280c6a7f41a11811a23d0f7824eaf936cdd58ca2f7a7f28d62b12d75a`;有 Docker -权限的机器仍应按上面的 `docker run` 命令做本地 pull/run smoke。 +GHCR 要求转成小写。每次发布后都要读取公开 registry manifest 并记录真实 digest; +有 Docker 权限的机器仍应按上面的 `docker run` 命令做本地 pull/run smoke。 -npm wrapper 位于 `npm/`,用于发布时把平台 binary 包装成 `deepseek` 命令。root 包通过 optional dependency 解析当前平台的 binary 包,例如 `@deepseek-code/cli-linux-x64`、`@deepseek-code/cli-macos-arm64`、`@deepseek-code/cli-macos-x64` 和 `@deepseek-code/cli-windows-x64`。发布前至少验证 wrapper 语法、平台包解析和本地 binary 转发: +npm wrapper 位于 `npm/`,用于发布时把平台 binary 包装成 `deepseek` 命令。root 包通过 optional dependency 解析当前平台的 binary 包,例如 `@deepseek-code/cli-linux-x64`、`@deepseek-code/cli-linux-arm64`、`@deepseek-code/cli-macos-arm64`、`@deepseek-code/cli-macos-x64` 和 `@deepseek-code/cli-windows-x64`。发布前至少验证 wrapper 语法、平台包解析和本地 binary 转发: ```bash (cd npm && npm run check:version) @@ -248,11 +247,9 @@ npm tarball,并在 tag run 且配置 `NPM_TOKEN` 时先发布平台包,再 齐全;加 `--json` 会输出 `deepseek.publish_status.v1`,便于 CI 或 release 脚本消费。输出中的 `public_install` 会区分 source checkout、GitHub Release、 npm、Homebrew、GHCR 和 Cargo registry 当前是 `source_available`、 -`ready_to_publish`、`requires_publish` 还是 `source_only_policy`。目前 GitHub -Release 和 GHCR 已有公开验证;`v0.1.2` 的 npm 发布 job 因缺少 `NPM_TOKEN` -明确跳过,Homebrew tap job 也因缺少 `HOMEBREW_TAP_REPOSITORY` 或 -`HOMEBREW_TAP_TOKEN` 跳过。在配置 registry/tap 凭据并完成外部验证前,不要把 -npm/Homebrew 写成已可用。 +`ready_to_publish`、`requires_publish` 还是 `source_only_policy`。每次 tag 发布后 +都要重新记录 GitHub Release、GHCR、npm 和 Homebrew 的真实状态;在配置 +registry/tap 凭据并完成外部验证前,不要把 npm/Homebrew 写成已可用。 ## Runtime 服务模板 @@ -280,6 +277,7 @@ release assets: - `deepseek-macos-arm64.tar.gz` - `deepseek-macos-x64.tar.gz` - `deepseek-linux-x64.tar.gz` +- `deepseek-linux-arm64.tar.gz` 正式发布前必须把 formula 里的 `sha256` 占位值替换为对应 release asset 的真实 SHA-256。GitHub `Release Matrix` workflow 会为每个 archive 上传旁路 diff --git a/docs/public-beta.md b/docs/public-beta.md index f79e57a..153bf34 100644 --- a/docs/public-beta.md +++ b/docs/public-beta.md @@ -55,8 +55,8 @@ deepseek For release archive users, start with: ```bash -deepseek update download-plan --version 0.1.2 -deepseek update release-smoke --version 0.1.2 --json +deepseek update download-plan --version 0.1.3 +deepseek update release-smoke --version 0.1.3 --json ``` Then try a bounded task in an existing repository: @@ -72,7 +72,7 @@ The strongest current proof points are: - the two README SVG demos, including the model-backed edit/test loop; - `deepseek quickstart` and `deepseek doctor --json` for first-run readiness; - CI-smoked TUI entrypoints and service/shell fixtures; -- `deepseek update release-smoke --version 0.1.2 --json` for release binary +- `deepseek update release-smoke --version 0.1.3 --json` for release binary verification on the current platform; - online Python, Rust, and Node external fixture evidence recorded through dogfood tooling. @@ -106,7 +106,7 @@ cargo test --lib -- --test-threads=1 node scripts/check-secrets.js deepseek quickstart --json deepseek update publish-status --json -deepseek update release-smoke --version 0.1.2 --json +deepseek update release-smoke --version 0.1.3 --json ``` Also check: diff --git a/docs/release.md b/docs/release.md index 3c4ce66..4dc4210 100644 --- a/docs/release.md +++ b/docs/release.md @@ -278,8 +278,8 @@ gh workflow run "Release Matrix" gh run watch ``` -The workflow builds release binaries for Linux x64, macOS x64, macOS arm64, -and Windows x64. Linux runs the full serial test suite with +The workflow builds release binaries for Linux x64, Linux arm64, macOS x64, +macOS arm64, and Windows x64. Linux jobs run the full serial test suite with `cargo test -- --test-threads=1`; macOS and Windows run `cargo check --all-targets` before the release binary/package smoke so the platform matrix still catches compile drift without depending on Unix-specific @@ -360,8 +360,8 @@ gh attestation verify deepseek-macos-arm64.tar.gz.sha256 --repo / evidence: it downloads the archive and `.sha256`, verifies the checksum, extracts the `deepseek` binary, and runs the same install verifier used by `deepseek update verify-install`. It only executes binaries for the current -platform, so Linux arm64 hosts still need an x64 runner until Linux arm64 -release assets exist. +platform; use the Release Smoke workflow when you need clean hosted evidence +for Linux x64, Linux arm64, macOS x64, and macOS arm64 from one run. If GitHub release downloads are slow or blocked for an operator, mirror the release archive and `.sha256` files to a private/static asset host and point the @@ -388,9 +388,9 @@ ruby -c packaging/homebrew/deepseek.rb Before publishing a tap, download the release matrix `.sha256` files next to their archives and run `deepseek update homebrew-formula`. The updater reads -`deepseek-linux-x64.tar.gz.sha256`, `deepseek-macos-x64.tar.gz.sha256`, and -`deepseek-macos-arm64.tar.gz.sha256`, then rewrites the formula with matching -release URLs and checksums. +`deepseek-linux-x64.tar.gz.sha256`, `deepseek-linux-arm64.tar.gz.sha256`, +`deepseek-macos-x64.tar.gz.sha256`, and `deepseek-macos-arm64.tar.gz.sha256`, +then rewrites the formula with matching release URLs and checksums. To automate tap publishing from the tag workflow, set repository variable `HOMEBREW_TAP_REPOSITORY` to the tap repository, for example diff --git a/npm/README.md b/npm/README.md index f54f905..22f6512 100644 --- a/npm/README.md +++ b/npm/README.md @@ -6,6 +6,7 @@ Published installs resolve the binary from the platform-specific optional npm package for the current host: - `@deepseek-code/cli-linux-x64` +- `@deepseek-code/cli-linux-arm64` - `@deepseek-code/cli-macos-x64` - `@deepseek-code/cli-macos-arm64` - `@deepseek-code/cli-windows-x64` diff --git a/npm/bin/deepseek.js b/npm/bin/deepseek.js index 26ffd7b..b0a0009 100755 --- a/npm/bin/deepseek.js +++ b/npm/bin/deepseek.js @@ -15,7 +15,7 @@ const TARGETS = { triple: "x86_64-apple-darwin", }, "linux:arm64": { - packageSuffix: null, + packageSuffix: "linux-arm64", triple: "aarch64-unknown-linux-gnu", }, "linux:x64": { diff --git a/npm/package.json b/npm/package.json index 27c79c7..fcfac69 100644 --- a/npm/package.json +++ b/npm/package.json @@ -1,6 +1,6 @@ { "name": "@deepseek-code/cli", - "version": "0.1.2", + "version": "0.1.3", "description": "npm wrapper for the DeepSeek Code CLI", "license": "SEE LICENSE IN LICENSE", "homepage": "https://github.com/willamhou/DeepSeekCode", @@ -13,10 +13,11 @@ "deepseek": "bin/deepseek.js" }, "optionalDependencies": { - "@deepseek-code/cli-linux-x64": "0.1.2", - "@deepseek-code/cli-macos-arm64": "0.1.2", - "@deepseek-code/cli-macos-x64": "0.1.2", - "@deepseek-code/cli-windows-x64": "0.1.2" + "@deepseek-code/cli-linux-arm64": "0.1.3", + "@deepseek-code/cli-linux-x64": "0.1.3", + "@deepseek-code/cli-macos-arm64": "0.1.3", + "@deepseek-code/cli-macos-x64": "0.1.3", + "@deepseek-code/cli-windows-x64": "0.1.3" }, "files": [ "bin", diff --git a/npm/platforms/linux-arm64/LICENSE b/npm/platforms/linux-arm64/LICENSE new file mode 100644 index 0000000..3247091 --- /dev/null +++ b/npm/platforms/linux-arm64/LICENSE @@ -0,0 +1,4 @@ +Copyright (c) 2026 DeepSeekCode contributors. All rights reserved. + +This source tree is distributed without an open-source license unless a +separate written license is provided by the copyright holder. diff --git a/npm/platforms/linux-arm64/package.json b/npm/platforms/linux-arm64/package.json new file mode 100644 index 0000000..ffbff8b --- /dev/null +++ b/npm/platforms/linux-arm64/package.json @@ -0,0 +1,28 @@ +{ + "name": "@deepseek-code/cli-linux-arm64", + "version": "0.1.3", + "description": "Linux arm64 binary for the DeepSeek Code CLI", + "license": "SEE LICENSE IN LICENSE", + "homepage": "https://github.com/willamhou/DeepSeekCode", + "repository": { + "type": "git", + "url": "git+https://github.com/willamhou/DeepSeekCode.git", + "directory": "npm/platforms/linux-arm64" + }, + "os": [ + "linux" + ], + "cpu": [ + "arm64" + ], + "files": [ + "bin", + "LICENSE" + ], + "publishConfig": { + "access": "public" + }, + "engines": { + "node": ">=18" + } +} diff --git a/npm/platforms/linux-x64/package.json b/npm/platforms/linux-x64/package.json index d7c2e64..d7f4a06 100644 --- a/npm/platforms/linux-x64/package.json +++ b/npm/platforms/linux-x64/package.json @@ -1,6 +1,6 @@ { "name": "@deepseek-code/cli-linux-x64", - "version": "0.1.2", + "version": "0.1.3", "description": "Linux x64 binary for the DeepSeek Code CLI", "license": "SEE LICENSE IN LICENSE", "homepage": "https://github.com/willamhou/DeepSeekCode", diff --git a/npm/platforms/macos-arm64/package.json b/npm/platforms/macos-arm64/package.json index bfba0a6..124f736 100644 --- a/npm/platforms/macos-arm64/package.json +++ b/npm/platforms/macos-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@deepseek-code/cli-macos-arm64", - "version": "0.1.2", + "version": "0.1.3", "description": "macOS arm64 binary for the DeepSeek Code CLI", "license": "SEE LICENSE IN LICENSE", "homepage": "https://github.com/willamhou/DeepSeekCode", diff --git a/npm/platforms/macos-x64/package.json b/npm/platforms/macos-x64/package.json index 53858fe..4024d8e 100644 --- a/npm/platforms/macos-x64/package.json +++ b/npm/platforms/macos-x64/package.json @@ -1,6 +1,6 @@ { "name": "@deepseek-code/cli-macos-x64", - "version": "0.1.2", + "version": "0.1.3", "description": "macOS x64 binary for the DeepSeek Code CLI", "license": "SEE LICENSE IN LICENSE", "homepage": "https://github.com/willamhou/DeepSeekCode", diff --git a/npm/platforms/windows-x64/package.json b/npm/platforms/windows-x64/package.json index f19c5f8..444b54c 100644 --- a/npm/platforms/windows-x64/package.json +++ b/npm/platforms/windows-x64/package.json @@ -1,6 +1,6 @@ { "name": "@deepseek-code/cli-windows-x64", - "version": "0.1.2", + "version": "0.1.3", "description": "Windows x64 binary for the DeepSeek Code CLI", "license": "SEE LICENSE IN LICENSE", "homepage": "https://github.com/willamhou/DeepSeekCode", diff --git a/npm/scripts/check-version-sync.js b/npm/scripts/check-version-sync.js index 6a97193..8d003d3 100644 --- a/npm/scripts/check-version-sync.js +++ b/npm/scripts/check-version-sync.js @@ -5,7 +5,7 @@ const { join } = require("path"); const repoRoot = join(__dirname, "..", ".."); const npmRoot = join(repoRoot, "npm"); -const platformDirs = ["linux-x64", "macos-arm64", "macos-x64", "windows-x64"]; +const platformDirs = ["linux-arm64", "linux-x64", "macos-arm64", "macos-x64", "windows-x64"]; const failures = []; function readText(path) { @@ -65,7 +65,12 @@ if (cargoVersion && homebrewVersion !== cargoVersion) { fail(`Homebrew formula version ${homebrewVersion ?? ""} does not match Cargo.toml ${cargoVersion}`); } -for (const artifact of ["deepseek-linux-x64", "deepseek-macos-x64", "deepseek-macos-arm64"]) { +for (const artifact of [ + "deepseek-linux-x64", + "deepseek-linux-arm64", + "deepseek-macos-x64", + "deepseek-macos-arm64", +]) { const expected = `/releases/download/v${cargoVersion}/${artifact}.tar.gz`; if (cargoVersion && !homebrewFormula.includes(expected)) { fail(`Homebrew formula is missing release URL suffix ${expected}`); diff --git a/npm/scripts/test-wrapper-resolution.js b/npm/scripts/test-wrapper-resolution.js index 7e400ad..5c3fa26 100644 --- a/npm/scripts/test-wrapper-resolution.js +++ b/npm/scripts/test-wrapper-resolution.js @@ -13,6 +13,7 @@ const { spawnSync } = require("node:child_process"); const TARGETS = { "darwin:arm64": "macos-arm64", "darwin:x64": "macos-x64", + "linux:arm64": "linux-arm64", "linux:x64": "linux-x64", }; diff --git a/packaging/homebrew/deepseek.rb b/packaging/homebrew/deepseek.rb index 0032523..1d2f676 100644 --- a/packaging/homebrew/deepseek.rb +++ b/packaging/homebrew/deepseek.rb @@ -1,24 +1,27 @@ class Deepseek < Formula desc "DeepSeek-first terminal code agent" homepage "https://github.com/willamhou/DeepSeekCode" - version "0.1.2" + version "0.1.3" on_macos do if Hardware::CPU.arm? - url "https://github.com/willamhou/DeepSeekCode/releases/download/v0.1.2/deepseek-macos-arm64.tar.gz" + url "https://github.com/willamhou/DeepSeekCode/releases/download/v0.1.3/deepseek-macos-arm64.tar.gz" sha256 "0000000000000000000000000000000000000000000000000000000000000000" else - url "https://github.com/willamhou/DeepSeekCode/releases/download/v0.1.2/deepseek-macos-x64.tar.gz" + url "https://github.com/willamhou/DeepSeekCode/releases/download/v0.1.3/deepseek-macos-x64.tar.gz" sha256 "0000000000000000000000000000000000000000000000000000000000000000" end end on_linux do if Hardware::CPU.intel? - url "https://github.com/willamhou/DeepSeekCode/releases/download/v0.1.2/deepseek-linux-x64.tar.gz" + url "https://github.com/willamhou/DeepSeekCode/releases/download/v0.1.3/deepseek-linux-x64.tar.gz" + sha256 "0000000000000000000000000000000000000000000000000000000000000000" + elsif Hardware::CPU.arm? + url "https://github.com/willamhou/DeepSeekCode/releases/download/v0.1.3/deepseek-linux-arm64.tar.gz" sha256 "0000000000000000000000000000000000000000000000000000000000000000" else - odie "DeepSeekCode Homebrew formula currently publishes Linux x64 only" + odie "DeepSeekCode Homebrew formula currently publishes Linux x64 and arm64 only" end end diff --git a/packaging/homebrew/verify-formula.js b/packaging/homebrew/verify-formula.js index ae2528c..6e3d6d0 100755 --- a/packaging/homebrew/verify-formula.js +++ b/packaging/homebrew/verify-formula.js @@ -108,7 +108,7 @@ if (stringValue(formula, "version") !== version) { failures.push(`formula version must match Cargo.toml ${version}`); } -for (const platform of ["macos-arm64", "macos-x64", "linux-x64"]) { +for (const platform of ["macos-arm64", "macos-x64", "linux-x64", "linux-arm64"]) { const url = `https://github.com/willamhou/DeepSeekCode/releases/download/${expectedTag}/deepseek-${platform}.tar.gz`; if (!formula.includes(`url "${url}"`)) { failures.push(`missing release URL for ${platform}`); @@ -128,8 +128,8 @@ if (!formula.includes('system "#{bin}/deepseek", "doctor", "--json"')) { const shas = [...formula.matchAll(/^\s*sha256\s+"([0-9a-fA-F]{64})"/gm)].map((match) => match[1].toLowerCase(), ); -if (shas.length !== 3) { - failures.push(`expected 3 sha256 entries, found ${shas.length}`); +if (shas.length !== 4) { + failures.push(`expected 4 sha256 entries, found ${shas.length}`); } const placeholderShas = shas.filter((sha) => /^0{64}$/.test(sha)).length; if (args.release && placeholderShas > 0) { diff --git a/src/cli/commands/update.rs b/src/cli/commands/update.rs index d919885..0e28bd9 100644 --- a/src/cli/commands/update.rs +++ b/src/cli/commands/update.rs @@ -715,12 +715,13 @@ fn current_release_platform() -> String { fn release_archive_name(platform: &str) -> AppResult { let archive = match platform { "linux-x64" => "deepseek-linux-x64.tar.gz", + "linux-arm64" => "deepseek-linux-arm64.tar.gz", "macos-x64" => "deepseek-macos-x64.tar.gz", "macos-arm64" => "deepseek-macos-arm64.tar.gz", "windows-x64" => "deepseek-windows-x64.zip", other => { return Err(app_error(format!( - "unsupported release platform `{other}`; expected linux-x64, macos-x64, macos-arm64, or windows-x64" + "unsupported release platform `{other}`; expected linux-x64, linux-arm64, macos-x64, macos-arm64, or windows-x64" ))) } }; @@ -1104,6 +1105,7 @@ fn release_asset_status(dist: Option<&str>) -> PublishStatusCheck { let expected = [ "deepseek-linux-x64.tar.gz", + "deepseek-linux-arm64.tar.gz", "deepseek-macos-x64.tar.gz", "deepseek-macos-arm64.tar.gz", "deepseek-windows-x64.zip", @@ -1293,7 +1295,13 @@ fn homebrew_tap_status(env: &impl Fn(&str) -> Option) -> PublishStatusCh } } -const NPM_PLATFORMS: &[&str] = &["linux-x64", "macos-arm64", "macos-x64", "windows-x64"]; +const NPM_PLATFORMS: &[&str] = &[ + "linux-x64", + "linux-arm64", + "macos-arm64", + "macos-x64", + "windows-x64", +]; fn npm_metadata_failures(repo: &Path, version: &str) -> AppResult> { let npm_root = repo.join("npm"); @@ -1477,6 +1485,7 @@ fn is_owner_repo(value: &str) -> bool { #[derive(Debug, Clone, PartialEq, Eq)] struct HomebrewShas { linux_x64: String, + linux_arm64: String, macos_x64: String, macos_arm64: String, } @@ -1484,6 +1493,7 @@ struct HomebrewShas { fn read_homebrew_shas(dist: &Path) -> AppResult { Ok(HomebrewShas { linux_x64: read_sha256_file(&dist.join("deepseek-linux-x64.tar.gz.sha256"))?, + linux_arm64: read_sha256_file(&dist.join("deepseek-linux-arm64.tar.gz.sha256"))?, macos_x64: read_sha256_file(&dist.join("deepseek-macos-x64.tar.gz.sha256"))?, macos_arm64: read_sha256_file(&dist.join("deepseek-macos-arm64.tar.gz.sha256"))?, }) @@ -1538,8 +1548,11 @@ fn render_homebrew_formula(version: &str, repo: &str, shas: &HomebrewShas) -> Ap if Hardware::CPU.intel? url "https://github.com/{repo}/releases/download/{tag}/deepseek-linux-x64.tar.gz" sha256 "{linux_x64}" + elsif Hardware::CPU.arm? + url "https://github.com/{repo}/releases/download/{tag}/deepseek-linux-arm64.tar.gz" + sha256 "{linux_arm64}" else - odie "DeepSeekCode Homebrew formula currently publishes Linux x64 only" + odie "DeepSeekCode Homebrew formula currently publishes Linux x64 and arm64 only" end end @@ -1560,6 +1573,7 @@ end macos_arm64 = shas.macos_arm64, macos_x64 = shas.macos_x64, linux_x64 = shas.linux_x64, + linux_arm64 = shas.linux_arm64, )) } @@ -2212,6 +2226,7 @@ mod tests { "example/deepseek", &HomebrewShas { linux_x64: "a".repeat(64), + linux_arm64: "d".repeat(64), macos_x64: "b".repeat(64), macos_arm64: "c".repeat(64), }, @@ -2225,6 +2240,7 @@ mod tests { assert!(formula.contains(&format!("sha256 \"{}\"", "a".repeat(64)))); assert!(formula.contains(&format!("sha256 \"{}\"", "b".repeat(64)))); assert!(formula.contains(&format!("sha256 \"{}\"", "c".repeat(64)))); + assert!(formula.contains(&format!("sha256 \"{}\"", "d".repeat(64)))); } #[test] @@ -2236,6 +2252,11 @@ mod tests { format!("{} deepseek-linux-x64.tar.gz\n", "a".repeat(64)), ) .unwrap(); + std::fs::write( + root.join("deepseek-linux-arm64.tar.gz.sha256"), + format!("{} deepseek-linux-arm64.tar.gz\n", "d".repeat(64)), + ) + .unwrap(); std::fs::write( root.join("deepseek-macos-x64.tar.gz.sha256"), format!("{} deepseek-macos-x64.tar.gz\n", "b".repeat(64)), @@ -2250,6 +2271,7 @@ mod tests { let shas = read_homebrew_shas(&root).unwrap(); assert_eq!(shas.linux_x64, "a".repeat(64)); + assert_eq!(shas.linux_arm64, "d".repeat(64)); assert_eq!(shas.macos_x64, "b".repeat(64)); assert_eq!(shas.macos_arm64, "c".repeat(64)); } @@ -2309,6 +2331,7 @@ mod tests { for (index, artifact) in [ "deepseek-linux-x64.tar.gz", + "deepseek-linux-arm64.tar.gz", "deepseek-macos-x64.tar.gz", "deepseek-macos-arm64.tar.gz", "deepseek-windows-x64.zip", @@ -2421,6 +2444,7 @@ mod tests { std::fs::create_dir_all(&root).unwrap(); for artifact in [ "deepseek-linux-x64.tar.gz", + "deepseek-linux-arm64.tar.gz", "deepseek-macos-x64.tar.gz", "deepseek-macos-arm64.tar.gz", "deepseek-windows-x64.zip", diff --git a/src/tui.rs b/src/tui.rs index 3267880..177be86 100644 --- a/src/tui.rs +++ b/src/tui.rs @@ -21417,7 +21417,7 @@ model.model = "deepseek-v4-pro" let (kind, detail) = app.mcp_detail.as_ref().expect("change detail"); assert_eq!(*kind, TuiMcpDetailKind::Change); assert!(detail.contains("DeepSeekCode Changelog")); - assert!(detail.contains("## 0.1.2 - 2026-05-24")); + assert!(detail.contains("## 0.1.3 - 2026-05-24")); assert_eq!(app.status, "changelog shown"); app.composer_focused = true;