chore(workspace): M118 —— crates/app 退出默认构建,发布改打 iced bin(Slint 版停发)
M118(D26):Slint 退役树 `crates/app` 不再进 workspace。目录与源码原样保留(不删一个文件), 只是配置上不再可编。 - 根 Cargo.toml:`[workspace] exclude = ["crates/app"]`。摘掉的是整棵 slint 1.18 + usvg 0.48 依赖树(本机单路冷编 ≈14 分钟;并行超配时表现为 rustc 退 1 且零诊断,见踩坑记录 p2 T7)。 Cargo.lock 由 cargo 自己重算:8639 → 6343 行(-2389/+93),`name = "slint"` 1→0、 `name = "i-slint` 11→0、`name = "slint-build"` 1→0。锁必须一起提交:旧锁配 `--locked` 会直接 `cannot update the lock file`(release.yml 与 ci.yml 的冒烟都带 `--locked`)。 - ci.yml:clippy/test/build 的 `--workspace` 自然不再覆盖 unlucky-app;runtime-smoke(Linux 与 macOS 探针)打的是 Slint 版 `--bin unlucky-launcher`,该 bin 已不存在 → 换成 iced 版 `unlucky-launcher-iced`(它的 cli.rs 照抄 Slint 版口径,`--data-dir` 仍被接受)。 - release.yml:**Slint 版停发**。旧写法 `--bin unlucky-launcher` 打的是 crates/app 的 bin, 也就是说流水线一直在发 Slint 版;改为 `--bin unlucky-launcher-iced --bin ull`,Windows 导入表自检的 EXE 指向构建产物 `unlucky-launcher-iced.exe`。对外产物文件名不变。 - make_artifacts.py:拆成 `LAUNCHER_BIN = "unlucky-launcher-iced"`(找产物)与 `LAUNCHER_ASSET = "unlucky-launcher"`(落盘名),tar 内文件名/权限随之按对外名走。 - guards.yml / README(中英)/ packaging/README.md:逐条写明排除后的覆盖口径,历史实现段落 全部保留并加限定语(不提供构建方式,也不暗示自救)。 门禁:fmt exit 0;clippy --workspace --all-targets -j 4 -- -D warnings exit 0(44.6s); check --workspace --all-targets exit 0(5m20s,slint 命中 0 行);cargo deny check exit 0。
This commit is contained in:
1 parent
3f228ae092
commit
cf8c6912ec
9 files changed
+230
-2430
No files matched your search
@@ -15,8 +15,10 @@ attached to other agent tooling as an MCP server.
|
||||
- **Single-file native binary**: the launcher itself needs no JVM, no WebView and no sidecar
|
||||
runtime. The JDK a game needs is downloaded and managed per instance, not as a launcher
|
||||
dependency.
|
||||
- **Two UI stacks during the rewrite**: the released UI is Slint (Royalty-Free 2.0); the
|
||||
next-generation UI is iced 0.14 + Material 3 Expressive and is still being written (see Status).
|
||||
- **One UI stack in the build**: the UI is iced 0.14 + Material 3 Expressive. The earlier Slint
|
||||
implementation (`crates/app`) is kept as source-only history: it is excluded from the cargo
|
||||
workspace, so the workspace never builds, tests or ships it. v0.1.0 — the only tagged release so
|
||||
far — still carries a Slint build (see Status).
|
||||
- **CPU software-rendering fallback**: `--software-renderer` keeps the interface rendering
|
||||
normally on machines with no usable GPU or with broken drivers.
|
||||
- **AI agent + MCP**: chat, setting edits and crash diagnosis inside the launcher; `ull agent
|
||||
@@ -34,7 +36,14 @@ attached to other agent tooling as an MCP server.
|
||||
|
||||
Two tracks. They are not the same product yet, so read the headings before downloading anything.
|
||||
|
||||
### Track A — released: v0.1.0, Slint UI (this is what you can download today)
|
||||
### Track A — historical: v0.1.0, Slint UI (the only tagged release so far)
|
||||
|
||||
> **Historical implementation — no longer in the default build or the release matrix.** The Slint
|
||||
> tree (`crates/app`) is kept in the repository as source-only reference: it is excluded from the
|
||||
> cargo workspace, so `cargo build` / `cargo test` / `cargo clippy` never touch it and no artifact is
|
||||
> built from it. Read the source if you want to see how that UI was put together; do not expect to
|
||||
> build it. The list below is kept because it records what the v0.1.0 assets actually contain —
|
||||
> since v0.1.0 the pipeline builds the iced binary and ships it under the same public asset names.
|
||||
|
||||
- **GitHub Releases `v0.1.0`** (2026-11-01, flagged pre-release): single-file assets for Windows
|
||||
x64 (a bare `.exe`), Linux x64 and macOS (arm64 and x64) `.tar.gz`. Every release also carries
|
||||
@@ -67,16 +76,18 @@ Two tracks. They are not the same product yet, so read the headings before downl
|
||||
with automatic fallback, and the screenshot/diff channel the visual reviews use).
|
||||
- **Not done**: the component library (buttons, dialogs, lists, menus, search, and the rest of the
|
||||
M3 set), page migration, and the i18n pass. Every page in the iced binary is a placeholder.
|
||||
- **Slint stays until the flip**: `crates/app` remains the reference implementation until the iced
|
||||
build passes equivalence acceptance; only then is `unlucky-launcher-iced` renamed to
|
||||
`unlucky-launcher` and the Slint crate retired.
|
||||
- **Slint is retired from the build, kept as reference**: `crates/app` is no longer a workspace member
|
||||
(M118) — the source stays for historical reference only: not compiled, not tested, not shipped, and
|
||||
no longer buildable as a workspace member. What is left of the flip is the *rename*: until the iced
|
||||
build passes equivalence acceptance its binary is still called `unlucky-launcher-iced`, while the
|
||||
release pipeline already ships it under the public `unlucky-launcher` asset name.
|
||||
|
||||
Binaries in the workspace, so you can tell them apart:
|
||||
Binaries you may run into, so you can tell them apart:
|
||||
|
||||
| Binary | Crate | State |
|
||||
|--------|-------|-------|
|
||||
| `unlucky-launcher` | `crates/app` (Slint) | released in v0.1.0; still the usable GUI; also runs every CLI subcommand |
|
||||
| `unlucky-launcher-iced` | `crates/app-iced` (iced 0.14) | under construction; skeleton only, not shipped; same subcommand dispatch |
|
||||
| `unlucky-launcher-iced` | `crates/app-iced` (iced 0.14) | the only GUI binary the workspace builds; the release pipeline stages it under the public name `unlucky-launcher`; same subcommand dispatch |
|
||||
| `unlucky-launcher` | `crates/app` (Slint) | **historical**: that crate is excluded from the workspace, so this binary is no longer built or shipped; the v0.1.0 assets are the last Slint builds |
|
||||
| `ull` | `crates/cli` | the zero-UI build of the same command set, shipped as its own asset |
|
||||
|
||||
`unlucky-launcher` and `ull` are not duplicates. The GUI binary needs the graphics stack when it
|
||||
@@ -122,8 +133,9 @@ Unlucky-Launcher (cargo workspace)
|
||||
├── crates/agent # AI agent: ToolSpec registry + built-in client + MCP server (one core, two shapes)
|
||||
├── crates/design # design tokens: real HCT color / type / shape / spacing / elevation / motion / icons
|
||||
│ # / component metrics — zero UI dependencies, no third-party crates
|
||||
├── crates/app # Slint UI (bin `unlucky-launcher`): the released GUI, kept until equivalence acceptance
|
||||
├── crates/app-iced # next-generation iced UI (bin `unlucky-launcher-iced`): under construction
|
||||
├── crates/app # HISTORICAL Slint UI (bin `unlucky-launcher`): excluded from the workspace,
|
||||
│ # source-only reference — never built, tested or shipped any more
|
||||
├── crates/app-iced # the iced UI (bin `unlucky-launcher-iced`): the only GUI the workspace builds
|
||||
├── crates/cli # CLI (bin `ull`): headless, zero UI
|
||||
└── packaging # single-file artifact matrix and release scripts
|
||||
```
|
||||
@@ -149,7 +161,7 @@ Prerequisites:
|
||||
`rustfmt` and `clippy` components)
|
||||
- Windows: MSVC toolchain (what CI uses) or MinGW-w64 (`x86_64-pc-windows-gnu`)
|
||||
- Linux: `libxkbcommon-dev libfontconfig1-dev libgl1-mesa-dev libegl1-mesa-dev libwayland-dev
|
||||
libxcb1-dev` — needed by both UI stacks (Slint's winit + femtovg, iced's winit + wgpu/tiny-skia)
|
||||
libxcb1-dev` — winit + wgpu/tiny-skia ask for these at build time (the Slint build also needed femtovg)
|
||||
|
||||
```bash
|
||||
cargo fmt --all --check # formatting
|
||||
@@ -158,24 +170,29 @@ cargo test --workspace # tests
|
||||
cargo build --release # binaries land in target/release/
|
||||
```
|
||||
|
||||
`--workspace` covers the eight members in the module map. `crates/app` is excluded at the workspace
|
||||
level (M118), so none of these commands compiles the Slint tree — and there is no build command for
|
||||
it: that crate is kept as source-only reference and can no longer be built as a workspace member.
|
||||
|
||||
What the build produces:
|
||||
|
||||
- `unlucky-launcher` — the Slint UI (the released one). It is also the CLI: the same binary answers
|
||||
every subcommand listed above.
|
||||
- `unlucky-launcher-iced` — the iced UI skeleton. The name is temporary: it can only become
|
||||
`unlucky-launcher` at the flip, because two crates in one workspace cannot emit the same binary
|
||||
name into the same target directory. Same subcommand dispatch.
|
||||
- `unlucky-launcher-iced` — the GUI (iced). It is also the CLI: the same binary answers every
|
||||
subcommand listed above. The name is temporary — it becomes `unlucky-launcher` at the flip. The
|
||||
release artifacts already carry the public name: the pipeline builds this bin and
|
||||
`packaging/make_artifacts.py` stages it as `unlucky-launcher[.exe]`, so download links never change.
|
||||
- `unlucky-launcher` — **historical**: no workspace build produces this binary any more; it belonged
|
||||
to `crates/app`, which is excluded. The v0.1.0 assets are the last builds under this name.
|
||||
- `ull` — the CLI as a standalone, UI-free binary. Same command set, no graphics stack, smaller, and
|
||||
the right artifact for a machine that has no display at all.
|
||||
|
||||
Rendering switches:
|
||||
|
||||
- `unlucky-launcher --software-renderer` (equivalent to `SLINT_BACKEND=winit-software`) forces the
|
||||
CPU path on the Slint build
|
||||
- `unlucky-launcher-iced --software-renderer` forces tiny-skia (`ICED_BACKEND=tiny-skia`);
|
||||
`--screenshot <png>` writes one frame and exits, which is the acceptance channel
|
||||
- Both stacks fall back to the CPU path when no usable adapter is there: the Slint build through its
|
||||
own renderer fallback chain, the iced build through its explicit probe
|
||||
`--screenshot <png>` writes one frame and exits, which is the acceptance channel CI's headless
|
||||
smoke job uses
|
||||
- With no usable adapter the iced build's explicit probe falls back to the CPU path on its own
|
||||
- **Historical** (v0.1.0's Slint build still takes it): `unlucky-launcher --software-renderer`, i.e.
|
||||
`SLINT_BACKEND=winit-software`, forced the CPU renderer of that build through its own fallback chain
|
||||
|
||||
Dependency license check (optional locally, required in CI):
|
||||
`cargo deny check licenses bans sources`.
|
||||
@@ -214,8 +231,10 @@ Minimum baseline: **Windows 10**; Windows 8.1 / 8 / 7 are not supported.
|
||||
[NOTICE](NOTICE).
|
||||
- **Slint** (<https://slint.dev>), Royalty-Free 2.0: obligation for the Slint build that v0.1.0
|
||||
ships — an `AboutSlint` widget on the about page (still outstanding) and, until it lands, the
|
||||
NOTICE file, this section and a "Made with Slint" note on the release page. The obligation is
|
||||
kept for as long as a Slint-linked binary ships.
|
||||
NOTICE file, this section and a "Made with Slint" note on the release page. The obligation follows
|
||||
a **Slint-linked binary**: it applies to the v0.1.0 assets (and to any later build that links Slint
|
||||
again), not to new iced builds — `crates/app` is excluded from the workspace, so the pipeline no
|
||||
longer produces a Slint-linked binary.
|
||||
- **iced** (<https://github.com/iced-rs/iced>), MIT: the framework of the next-generation UI,
|
||||
together with `winit` and, through it, `wgpu` / `tiny-skia` (Apache-2.0 / MIT).
|
||||
- **Google Material Color Utilities** (Apache-2.0): the color tokens in `crates/design` are a Rust
|
||||
|
||||
Reference in new issue
Block a user