Skip to content

Refactor/base UI migration - #3

Merged
wlchn merged 9 commits into
masterfrom
refactor/base-ui-migration
Sep 17, 2026
Merged

wlchn merged 9 commits into
masterfrom
refactor/base-ui-migration

Conversation

@wlchn

@wlchn wlchn commented Sep 17, 2026

Copy link
Copy Markdown
Owner

No description provided.

`cargo clippy --all-targets` 从 15 条警告降到 0。改动都是行为等价的:

- `&PathBuf` 参数改为 `&Path`(6 处 backup_path/managed_path 等)
- `assert_eq!(x, true)` 改为 `assert!(x)`
- `Default::default()` 后赋字段改为结构体更新语法
- lib.rs 两处多余借用(`&app` → `app`)见下一提交
- apps.rs 的 test 模块移到文件末尾(原先后面还有 diagnose_failure)
- skills.rs 文档列表补空行,顺带修正 anthropics 源数量 19 → 16

新增的 clippy 门禁在下一个提交里开启。
装 tauri-plugin-window-state 2.4.1:窗口拖过之后下次启动停在原位,而不是
回到 tauri.conf.json 的居中默认值。capability 补 `window-state:default`
(只用于恢复位置尺寸,不读窗口内容)。

顺带两处:

- `rust-version` 1.77.2 → 1.87。原值是假声明——依赖树需要 edition2024,
  README 也一直写 1.87+;`rust-version` 是给 rustup 的承诺,不该留旧值。
- lib.rs 里 `PrefsState::load(&app)` / `KeysState::load(&app.handle())`
  的多余借用(clippy 警告的收尾)。

注意 Cargo.lock 被本机 cargo 1.98 从 lockfile v3 重写为 v4(需要 Cargo 1.78+,
与新的 rust-version 一致)。
… gate

恢复 push / pull_request 自动触发。当初(ddbfebf)停用的理由是「推送后 CI 会失败」,
但在本机跑完四道闸全部通过(check:locales / test:messages / tsc+vite build /
cargo test 84 passed),Linux runner 侧无法复现那个理由,也拿不到 Actions 日志,
所以先恢复、由第一次失败日志来定位。

同时消除两处版本真值的重复:

- Node:CI 从硬编码 22 改为读 .nvmrc(新增,24),与本机一致
- pnpm:从 action 的 `version: 10` 改为读 package.json 的 packageManager
  (10.34.5)。两者同时存在 pnpm/action-setup 会直接报错,所以必须删掉前者。
  已用真正的 pnpm 10.34.5 跑通 install --frozen-lockfile,确认 lockfile 兼容。

新增 `cargo clippy --all-targets -- -D warnings` 门禁(当前基线 0 警告)。
package.json 补 engines(node >=20 / pnpm >=10),README 本来就写 pnpm 10+,
且 onlyBuiltDependencies 是 pnpm 10 专有机制 —— 现在它在 npm 层面强制。

刻意没加 `cargo fmt --check`:全库从没 rustfmt 过(48 个 hunk),加门禁要先做一次
横跨 13 个文件的格式化,留作独立决定。
六个页面改为 React.lazy + Suspense,各自成 chunk。入口包 601 kB → 385 kB
(gzip 193 → 127 kB),vite 的「chunks larger than 500 kB」警告消失。

页面都是命名导出,所以逐个映射一次 `{ default: m.X }`。Suspense 兜底用的是
一个居中 spinner —— chunk 从本地 tauri:// 读,正常一帧内就绪。
逐条对照代码核实后修正:

- Skill 安装源 33 → 30(README 中英、ROADMAP)。skills.rs 里实际是
  anthropics 16 + superpowers 14;ROADMAP 自称的「19 个全量」也与它自己
  列出的清单对不上(19 是旧布局时期的数字)。
- 命令数 30 → 32(ROADMAP)
- development.md 的 CI 描述:原文称「不按分支过滤,push/PR 都跑」,这是被
  ddbfebf 停用前的事实;同时补上新增的 clippy 步骤与版本真值来源
- routes.md 测试覆盖 17 → 28,并补上原先整个漏掉的 host_gemini 7 个
- app-store.md 的 version_args 漏了 Option<>(registry.rs:17)
- architecture.md locales 461 → 460 行
- security.md capability 清单补 window-state
- wiki 基线 master @ 33db781 → 0298f87,并去掉写死的 master 字样(分支已变)
CI 失败的真正原因(由 Actions 日志确认,修正了 b094ee1 里「Linux runner 环境
差异、本地无法复现」的猜测):pnpm-lock.yaml 里 1185 个包的 tarball 全被固化成
`http://registry.m.jd.com/...`,GitHub runner 访问不到,`pnpm install
--frozen-lockfile` 直接 ERR_SOCKET_TIMEOUT。

根因是仓库没有项目级 .npmrc,lockfile 就跟随了本机 ~/.npmrc 的私服地址 ——
pnpm 只在「生效 registry ≠ 默认值」时才把完整 tarball 地址写进 resolution。

两处改动:

1. `.npmrc`(新增)钉住公共 registry。它是 pnpm 的默认值,所以此后不再往
   lockfile 写 tarball 字段,也就不会被本机私服再次污染。
2. `pnpm-lock.yaml` 剥掉 1185 个 `tarball:` 字段,回到规范形式。**只删 URL,
   版本与 integrity 一字未动**(794 个 name@version 集合改前后完全一致)。

没有采用「删掉 lockfile 重新生成」:那样会把依赖顺手升级(实测
@types/react 19.2.18→19.3.0、@tauri-apps/plugin-opener 2.5.4→2.5.5、
@types/node 26.5.0→26.6.1),并丢掉 ~/.npmrc 里 legacy-peer-deps 造成的
peer 变体(2343 → 320 条目),是两件不该顺带发生的事。

验证:

- 全部 1185 条 integrity 逐条比对公共源 dist.shasum:0 处不一致 —— 内网镜像
  是透传代理,tarball 字节与公共源相同,所以剥掉 URL 不会引发哈希校验失败。
- pnpm 接受该 lockfile 且判定与 package.json 同步。
- 端到端:公共源生成的 lockfile tarball 字段为 0,全新 store 冷安装
  `--frozen-lockfile` 成功。全量冷装未跑完(公共源 tarball 实测约 176 KiB/s,
  内网镜像 1.06 MiB/s),但日志确认已从推导出的 registry.npmjs.org URL 正常下载。

代价:本机从公共源下载比内网镜像慢约 6 倍(store 有缓存,属一次性成本)。
要换回镜像就改 .npmrc 那一行,但须同时重新生成 lockfile。
上一提交的注释把内网镜像域名写进了这个公开仓库,虽然只是说明历史、不含任何
凭据,但没必要把内网基础设施的名字提交出去。改为中性表述「内网镜像」,
技术内容(为什么需要钉 registry、代价是什么)一字未减。
给编码智能体一份项目约定。内容只写「不看代码就会踩坑」的部分,不复述 README
里能读到的模块清单。

- AGENTS.md 是单一真值(Codex / Cursor 等也读这个名字)
- CLAUDE.md 用 @AGENTS.md 导入它,只额外强调 nvm 那一条 —— Claude Code 读
  CLAUDE.md 而非 AGENTS.md,导入可让两边拿到同一份内容且不分叉(官方推荐做法)

重点内容:

- 开篇即 nvm use:项目要 Node 24(.nvmrc 声明)。开发机上装了 Node 14 且 nvm
  未设 default alias,新开终端默认落在 14 上,pnpm 直接报错
- 版本表含真值来源,并写明三者各自怎么拦下你(Node 14 / pnpm 9 被 engines /
  Rust < 1.87 编译不过)
- 四个坑:改 .npmrc registry 必须重生成 lockfile、不要跑 cargo fmt、scripts/
  不在 tsconfig include 内、版本号四处硬编码
- 设计不变量:安全边界在 Rust(前端只传 id)、后端错误是「码」不是文案、
  写宿主配置必须可逆、前后端类型契约是手写的
把 master 上的 PR #2 合并提交(6edc646)纳入本分支,使本分支可 fast-forward
到 master。结果树与本分支原树完全一致(合并零文件改动)。

master 当前仍是坏的:其 pnpm-lock.yaml 有 1185 处内网域名、且缺 .npmrc,
clone 后 pnpm install 会 ERR_SOCKET_TIMEOUT。本分支的 074193f 修掉了这一点。
@wlchn
wlchn merged commit 904ba2e into master Sep 17, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant