diff --git a/README.md b/README.md index a799e98..c447a4f 100644 --- a/README.md +++ b/README.md @@ -173,10 +173,11 @@ This list is the reason to believe the rest. None of it is hidden behind marketi section*, *Add override*. Each writes `[page] 占位动作 …` to stderr and changes nothing — instance management from the GUI is the instance-wizard work still outstanding, and settings change as you edit them rather than on a Save. -- **Linux and macOS artifacts are unverified.** The reference machine is Windows; the `linux-x64`, - `linux-arm64`, `macos-arm64` and `macos-x64` archives are produced by the CI matrix and have not - been downloaded and run end to end. Treat them as untested output, not as "supported because the - matrix lists them". +- **Linux and macOS artifacts are unverified, and this release does not even build them.** The + reference machine is Windows; the `linux-x64`, `linux-arm64`, `macos-arm64` and `macos-x64` slots + sit in the CI matrix but the default release run skips them, and they have never been downloaded and + run end to end. `gh workflow run release.yml -f all_slots=true` builds them for evidence. Treat them + as untested output, not as "supported because the matrix lists them". - **macOS is not finalised.** It has two rounds of real-device evidence (Apple Silicon), which is why the build exists — but the menu-bar name, the placement of the three window buttons (macOS puts them top-left; ours are drawn top-right), and 300s+ steady state still need a real machine. macOS @@ -207,19 +208,20 @@ Grab the file for your platform from |------|-------|-------| | `windows-x64` | `unlucky-launcher__windows_x64.exe` | bare `.exe`, double-click to run | | `windows-arm64` | `unlucky-launcher__windows_arm64.exe` | bare `.exe` — **not yet published**, see below | -| `linux-x64` | `unlucky-launcher__linux_x64.tar.gz` | one archive, one top-level directory | -| `linux-arm64` | `unlucky-launcher__linux_arm64.tar.gz` | same | -| `macos-arm64` | `unlucky-launcher__macos_arm64.tar.gz` | same | -| `macos-x64` | `unlucky-launcher__macos_x64.tar.gz` | same | -| every slot | `ull___[.exe]` | bare CLI binary, its own asset | +| `linux-x64` | `unlucky-launcher__linux_x64.tar.gz` | one archive, one top-level directory — **not yet published** | +| `linux-arm64` | `unlucky-launcher__linux_arm64.tar.gz` | same — **not yet published** | +| `macos-arm64` | `unlucky-launcher__macos_arm64.tar.gz` | same — **not yet published** | +| `macos-x64` | `unlucky-launcher__macos_x64.tar.gz` | same — **not yet published** | +| every published slot | `ull___[.exe]` | bare CLI binary, its own asset | | all | `SHA256SUMS.txt` | `sha256sum -c` eats it directly | -`windows-arm64` is the one row documented but **not in the current release**: the CI ARM64 runner is -missing the Windows SDK's ARM64 import libraries — the cause is located and the fix is in progress. -The row stays because the architecture is still supported and the slot still builds (unpublished) in -the matrix; what decides whether a slot reaches a Release is `PUBLISH_SLOTS` in -`.github/workflows/release.yml`, which today names `windows-x64` only — so `windows-x64` is the -only downloadable Windows asset. +**This release publishes `windows-x64` and nothing else.** The publish job keeps only the slots named +in `PUBLISH_SLOTS` (`.github/workflows/release-publish.yml`) and deletes every other artifact before +it writes `SHA256SUMS.txt`, so a row marked **not yet published** is a naming rule, not a downloadable +asset. Of those rows `windows-arm64` is the one CI still builds — natively, on GitHub's +`windows-11-arm` runner, for evidence — but that slot's toolchain check has not gone green yet, so its +`.exe` stays out of the release. The row stays because the architecture is still supported; it rejoins +the download list once the build is green. Each UNIX archive contains the executable plus `LICENSE`, `NOTICE` and `README.md`, in one top-level directory. Windows ships a bare `.exe` (a single file cannot carry the texts), so those three @@ -293,7 +295,7 @@ merge. The macOS probe is not there yet — manual dispatch only, result recorde |----------|---------| | `.github/workflows/ci.yml` | fmt + clippy + test + release build (Windows / Linux matrix); Linux runtime smoke (Xvfb, one real frame, PNG asserted non-blank); macOS runtime probe (manual dispatch only) | | `.github/workflows/guards.yml` | zero-UI guards (`crates/core`, `crates/presenter`, `crates/design`), 400-lines-per-file guard, cargo-deny licence and source guard | -| `.github/workflows/release.yml` | tag `v*` → six-slot build → single-file artifacts + `SHA256SUMS.txt` → GitHub Release | +| `.github/workflows/release.yml` | tag `v*` → build both Windows slots (`windows-x64` + `windows-arm64`) on native runners → single-file artifacts + `SHA256SUMS.txt` → GitHub Release (publishes `windows-x64` only; `-f all_slots=true` builds all six slots for evidence) | ## Architecture and module map diff --git a/README.zh-CN.md b/README.zh-CN.md index eb2bc09..179462f 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -140,8 +140,9 @@ unlucky-launcher --version # CLI,版本 + 系统摘要 - **有一批按钮是占位。** 实例页:*新建实例*、*导入*、*复制*、*打开文件夹*、*删除*。日志页:*打开文件夹*。 设置页框架:*保存*、*重置本组*、*添加覆盖*。点下去只往 stderr 写一行 `[page] 占位动作 …`,什么都不改 ——图形界面里的实例管理就是还欠着的那块实例向导;设置项是边改边生效,而不是靠「保存」。 -- **Linux 与 macOS 产物未验证。** 参考机是 Windows;`linux-x64`、`linux-arm64`、`macos-arm64`、 - `macos-x64` 四份归档由 CI 矩阵产出,还没被下载下来端到端跑过。把它们当**未经测试的产出**,而不是 +- **Linux 与 macOS 产物未验证,而且本版连构建都不跑。** 参考机是 Windows;`linux-x64`、`linux-arm64`、 + `macos-arm64`、`macos-x64` 四档只躺在 CI 矩阵里,默认的发布流程会跳过它们,也还没被下载下来端到端跑过; + `gh workflow run release.yml -f all_slots=true` 才编它们来取证。把它们当**未经测试的产出**,而不是 「矩阵里有就算支持」。 - **macOS 未定型。** 有两轮真机证据(Apple Silicon),构建因此存在——但菜单栏显示名、三个窗口按钮的位置 (macOS 习惯在左上,我们自绘在右上)、300s+ 稳态仍需真机复核。macOS 产物未签名,首次启动要自己清掉 @@ -169,17 +170,18 @@ unlucky-launcher --version # CLI,版本 + 系统摘要 |------|------|------| | `windows-x64` | `unlucky-launcher_<版本>_windows_x64.exe` | 裸 `.exe`,双击即用 | | `windows-arm64` | `unlucky-launcher_<版本>_windows_arm64.exe` | 裸 `.exe` —— **暂未发布**,见下 | -| `linux-x64` | `unlucky-launcher_<版本>_linux_x64.tar.gz` | 单个归档,解压出一个顶层目录 | -| `linux-arm64` | `unlucky-launcher_<版本>_linux_arm64.tar.gz` | 同上 | -| `macos-arm64` | `unlucky-launcher_<版本>_macos_arm64.tar.gz` | 同上 | -| `macos-x64` | `unlucky-launcher_<版本>_macos_x64.tar.gz` | 同上 | -| 每个槽位 | `ull_<版本>_<平台>_<架构>[.exe]` | 裸 CLI 文件,独立资产 | +| `linux-x64` | `unlucky-launcher_<版本>_linux_x64.tar.gz` | 单个归档,解压出一个顶层目录 —— **暂未发布** | +| `linux-arm64` | `unlucky-launcher_<版本>_linux_arm64.tar.gz` | 同上 —— **暂未发布** | +| `macos-arm64` | `unlucky-launcher_<版本>_macos_arm64.tar.gz` | 同上 —— **暂未发布** | +| `macos-x64` | `unlucky-launcher_<版本>_macos_x64.tar.gz` | 同上 —— **暂未发布** | +| 每个已发布槽位 | `ull_<版本>_<平台>_<架构>[.exe]` | 裸 CLI 文件,独立资产 | | 全平台 | `SHA256SUMS.txt` | `sha256sum -c` 可直吃 | -`windows-arm64` 是表里唯一「写了但**本次未发布**」的一行:CI 的 ARM64 runner 上缺 Windows SDK 的 -ARM64 导入库——原因已定位,正在修。这一行不删,是因为架构仍然要支持、槽位也仍在矩阵里构建(只是不进 -Release);决定一个槽位能否进 Release 的是 `.github/workflows/release.yml` 里的 `PUBLISH_SLOTS`, -它现在只写了 `windows-x64`——所以 `windows-x64` 是当前唯一可下载的 Windows 资产。 +**本版只发布 `windows-x64`。** 发布 job 只留 `PUBLISH_SLOTS` 里点名的槽位 +(`.github/workflows/release-publish.yml`),其余产物在写 `SHA256SUMS.txt` 之前就被删掉——所以表里标 +**暂未发布** 的行是命名规则,不是本版可下载的资产。这几行里 `windows-arm64` 是 CI 唯一真跑的那档:M140 起在 +GitHub 原生 `windows-11-arm` runner 上编来取证,但该槽位的工具链体检还没绿,所以它的 `.exe` 不进 Release; +行不删是因为架构仍要支持,绿了就把键加回 `PUBLISH_SLOTS`。 UNIX 归档里是二进制加 `LICENSE`、`NOTICE`、`README.md`,都在一个顶层目录下。Windows 发的是裸 `.exe` (一个文件装不下这三份文本),所以这三份作为并列资产挂在 Release 上——下 Windows 二进制不会把许可条款 @@ -240,7 +242,7 @@ cargo deny check licenses bans sources # 依赖许可(CI 必 |----------|------| | `.github/workflows/ci.yml` | fmt + clippy + test + release build(Windows / Linux 矩阵);Linux runtime smoke(Xvfb 真渲染一帧、断言 PNG 非空白);macOS 运行期探针(仅手动 dispatch) | | `.github/workflows/guards.yml` | `crates/core` / `crates/presenter` / `crates/design` 零 UI 守门、单文件 ≤400 行守门、cargo-deny 许可与来源守门 | -| `.github/workflows/release.yml` | tag `v*` → 六槽位构建 → 单文件产物 + `SHA256SUMS.txt` → GitHub Release | +| `.github/workflows/release.yml` | tag `v*` → 构建两个 Windows 槽位(`windows-x64` + `windows-arm64`,各自原生 runner)→ 单文件产物 + `SHA256SUMS.txt` → GitHub Release(只发布 `windows-x64`;`-f all_slots=true` 才整表六槽位取证) | ## 架构与模块地图 diff --git a/crates/cli/src/commands/mod.rs b/crates/cli/src/commands/mod.rs index b422684..9a41fa2 100644 --- a/crates/cli/src/commands/mod.rs +++ b/crates/cli/src/commands/mod.rs @@ -84,10 +84,12 @@ pub(crate) fn map_auth_error(error: unlucky_core::auth::AuthError) -> CliError { AuthError::CredentialExpired => Some("重新登录:%prog% accounts add msa".to_string()), // M117:id 缺失是「没配置」,不是「没实现」。hint 里给**能照抄的命令**(两条路: // 运行期一次性的、构建期烘进二进制的),别只丢一个变量名让用户自己猜。 + // M149:官方发布构建已把 id 烘进二进制(真值走仓库 Secret,不进 git 文件),所以能走到这个 + // hint 的只可能是自建且没注入 id 的二进制——文案与 `cli/help.rs` 对齐:官方构建已内置。 AuthError::Unsupported(_) => Some(format!( - "先配 Azure 公共客户端 id(id 不进仓库):\ -`{env}= %prog% accounts add msa`;\ -想让二进制自带就构建时注入 `{env}= cargo build`。环境变量优先于构建期注入。", + "官方构建已内置微软登录所需的客户端 id,装完即可用;自建构建得自己给:\ +运行期 `{env}= %prog% accounts add msa`(优先于内置值);\ +或构建时注入 `{env}= cargo build` 让二进制自带。", env = unlucky_core::auth::microsoft::CLIENT_ID_ENV )), AuthError::Conflict { .. } => Some("用 `%prog% accounts list` 查看已有账户".to_string()), diff --git a/packaging/make_artifacts.py b/packaging/make_artifacts.py index 7805d11..6cd8110 100644 --- a/packaging/make_artifacts.py +++ b/packaging/make_artifacts.py @@ -4,7 +4,7 @@ Release matrix (see `packaging/README.md` for the full contract): Windows x64 unlucky-launcher__windows_x64.exe (bare exe, no zip) - Windows arm64 unlucky-launcher__windows_arm64.exe (bare exe, cross-built) + Windows arm64 unlucky-launcher__windows_arm64.exe (bare exe, native arm64 runner) Linux x64 unlucky-launcher__linux_x64.tar.gz Linux arm64 unlucky-launcher__linux_arm64.tar.gz macOS arm64 unlucky-launcher__macos_arm64.tar.gz @@ -40,10 +40,11 @@ one is the single writer of the **manifest**, and it derives every sha256/size f use this flag: `release-publish.yml` recomputes `SHA256SUMS.txt` after pruning the publish whitelist and generates the manifest from *that*, so the manifest always describes what ships. -Slot and build directory are overridable because a cross build's binaries live in -`target//release` and the build host (x64) is not the artifact (arm64): CI -passes both from its matrix, and the executable header is read back so a binary can -never be shipped under a slot name it was not built for. +Slot and build directory are overridable because the build host is not always the +artifact: a cross build's binaries live in `target//release` under an x64 +host, while every native slot (all six in CI, M140) puts them in `target/release`. +CI passes both from its matrix, and the executable header is read back so a binary +can never be shipped under a slot name it was not built for. Usage: cargo build --release --locked