Commit Graph
2 Commits
Author SHA1 Message Date
KennethCheng b30b2f0e28 feat: 实现 Phase 1 — Bootstrap(Slint hello window + 编译验证通过)
完成 AGENTS.md §57 Phase 1 的全部交付:可编译的 Cargo 工程、能打开的
Slint hello window、release profile、Windows subsystem、tracing 日志、
thiserror 错误框架。`cargo build` 与 `cargo build --release` 均通过,
0 warning。

实现概览
--------

新增 / 修改的文件:

  src/lib.rs           lib crate 入口;`slint!{}` 内嵌一个最小 AppWindow
                       (标题 "Gotify",480×320,深灰背景 + 两行文本);
                       `pub fn run() -> AppResult<()>` 调 AppWindow::new
                       + run()。
  src/main.rs          thin binary entry;含
                       `#![cfg_attr(not(debug_assertions),
                          windows_subsystem = "windows")]`
                       让 release build 不弹 console(AGENTS.md §43);
                       debug build 保留 console 让 tracing 日志可见。
  src/error.rs         `AppError` + `AppResult`,thiserror 2.0.20;Phase 1
                       只有 `Logging(String)` 与 `Ui(String)` 两个变体,
                       §24 的 ConfigError / NetworkError / WebSocketError
                       / StorageError / WindowsError / ParseError 等后续
                       Phase 落地时再加。
  src/logging.rs       `init_logging()`:tracing-subscriber 0.3.23,启
                       env-filter feature;debug 默认 debug 级,release
                       默认 info 级,`RUST_LOG` 可覆盖;关闭 ANSI(release
                       通常没有真实终端)。符合 §25 的"默认不记录消息正文"
                       基线——具体红线靠代码 review 强制。
  Cargo.toml           实际可编译的 manifest:[[bin]] 指向 src/main.rs;
                       仅引入 Phase 1 真正用到的依赖(slint / tracing /
                       tracing-subscriber / thiserror);reqwest /
                       tungstenite / serde / url / anyhow 等推迟到对应
                       Phase 的模块创建后再引入——避免提前下载无用 crate,
                       也让 AGENTS.md §44 的 "Cargo 依赖最小化原则" 落到
                       每一阶段的 commit 上。
  Cargo.lock           已生成(564 个 transitive deps,含 slint 1.18.0、
                       skia-bindings、accesskit、parley、fontique 等)。
                       二进制工程,lock 文件进 git——保证可重现构建。

技术选型说明
------------

- Slint 版本选择:AGENTS.md §1 写的是 "Slint 1.17.x 或当前稳定兼容版
  本"。首次尝试钉死 `slint = { version = "1", features =
  ["internal-interpreter"] }`,cargo 报 `internal-interpreter` feature 不
  存在(slint 1.18.0 已移除该 feature,slint!{} macro 走 default feature
  set 即可)。改为 `slint = "1"`,cargo 自动选到 1.18.0,与 Rust 1.98.1 +
  MSVC 工具链编译通过。AGENTS.md §1 的措辞明确允许"当前稳定兼容版本",
  本次选 1.18.0 不偏离约束。
- release profile:opt-level=z / lto / codegen-units=1 / panic=abort /
  strip=true(AGENTS.md §42 模板)。Phase 1 未做 benchmark,所以 release
  vs release-balanced 的实际选择留到 Phase 8 Performance。
- 没引 slint-build / 没建 build.rs:Phase 1 hello window 内嵌在
  `slint!{}` macro 里,足以通过验收。Phase 2 切到独立 .slint 文件 +
  `include_slint!()` 时再决定是否需要 build.rs。

验证结果
--------

  cargo build          exit 0, 5.21s(增量;首次冷编译约 1m40s,要编
                                  i-slint-core / parley / skia 等)
  cargo build --release exit 0, 1m38s(profile 内 LTO 阶段耗时长)
  warnings             0
  debug   .exe         25.58 MB, PE subsystem = 3 (WINDOWS_CUI / console)
  release .exe          7.82 MB, PE subsystem = 2 (WINDOWS_GUI)

AGENTS.md §57 Phase 1 验收标准(`cargo run` + `cargo build --release`
能打开无 console 的 Windows GUI)全部满足。PE subsystem 通过直接读
Optional Header 的 Subsystem 字段验证——而不是盲目信任 cfg_attr。

下一步
------

进 Phase 2 — UI Shell(MainWindow / Sidebar / Message list / Empty
state / Settings / Dark-Light-System 主题)。本阶段仍然只用 mock 消息,
不接网络。

遗留
----

- commit message 之前那条 root commit (`a3a6a7c`) subject 前有个 UTF-8
  BOM (`\ufeff`),是 PowerShell 5.1 `Set-Content -Encoding UTF8` 默认带
  BOM 造成的。本 commit 用 `[System.IO.File]::WriteAllText` 直接写
  UTF-8 without BOM,新 commit 不再带 BOM;老的那个根 commit 的 BOM 只
  是显示瑕疵,不影响任何 git 操作,留着不重写。
- 首次 cargo build 拉了 564 个 crate、走代理拉取成功(crates.io 直连也
  通,HTTPS_PROXY 走 127.0.0.1:7890 是兜底)。
- target/ 1.4 GB 在 .gitignore 内,不会进 git。
- 用户的 .cargo/bin 不在 PowerShell 当前 session 的 PATH 上(用 rustup
  默认安装路径 `C:\Users\Administrator\.cargo\bin`),后续 cargo 命令
  脚本里临时加 PATH 即可,未修改用户全局环境。
2026-09-19 04:15:19 +08:00
KennethCheng a3a6a7c91d chore: 初始化 Windows-Gotify-Client-Rust 项目骨架
使用 Rust + Slint 重建一个轻量、现代、Windows 原生体验良好的 Gotify
桌面客户端。本次只搭目录骨架与占位文件,未进入 Phase 1(Bootstrap)。

本次提交内容
------------
- 保留 AGENTS.md(1363 行定制 Agent 实施计划,含 8 阶段路线图)
- 新建 Cargo.toml([package] 元数据 + AGENTS.md §44 依赖模板 + §42
  release profile;无 [[bin]],等 Phase 1 才加 src/main.rs)
- 新建 README.md(项目导览,引用 AGENTS.md)
- 新建 .gitignore(Rust / Slint / Windows / IDE / 密钥)
- 新建 LICENSE(MIT 占位)
- 按 AGENTS.md §4 建好全部 10 个目录,每个空目录放 .gitkeep:
    assets/        assets/fonts/
    ui/            scripts/
    src/           src/gotify/
    src/storage/   src/windows/
    src/services/  tests/

未提交(Phase 1 起才落地)
------------------------
- src/main.rs 及所有 .rs 业务代码
- ui/*.slint 视图
- scripts/build-release.ps1 等构建脚本
- Cargo.lock(当前 Cargo.toml 是占位、无可编译代码)

技术栈约束(来自 AGENTS.md §1 / §2)
------------------------------------
- Rust stable + Slint 1.17.x + Windows 10/11
- 显式禁用:Tauri / Wails / Electron / WebView2 / WPF / WinUI 3 / Node 运行时
- 单一主程序,无浏览器运行时依赖;UI 由 Slint 原生渲染

仓库
----
远程:https://gitea.kennethcheng.cc/KennethCheng/Windows-Gotify-Client-Rust
2026-09-19 04:02:51 +08:00