diff --git a/client/electron/BUILD.md b/client/electron/BUILD.md index 82ac55a..e828761 100644 --- a/client/electron/BUILD.md +++ b/client/electron/BUILD.md @@ -139,6 +139,26 @@ AGENTMAIL_USER_KEY=<用户密钥> ./agentmail-web **要给用户装,优先分发 deb**:沙箱可用、依赖声明完整、可被包管理器卸载。 +### deb 打不出来时:先看 `/tmp` 有没有空间(2026-09-14 实测) + +本机曾以为"deb 打不出来是 fpm 的毛病"(报错停在 `fpm process failed 1`,栈顶是 +portable ruby 的 `Dir.chdir`,看着像路径权限)。**实际是 ENOSPC** —— fpm 会把 +`release/linux-unpacked`(约 291MB)**整份复制**到 `TMPDIR` 里再打包,而本机 +`/tmp` 是 9.8G 的 tmpfs 且被 `/tmp/gocache` 等占到 99%(只剩 ~100MB): + +```bash +df -h /tmp # 先看这里:Avail 只剩几十 MB 就该警惕 +grep -o 'Errno::ENOSPC' <构建日志> # 真正的报错行(栈里那行只是表象) + +# 把 TMPDIR 指到大盘上再打(工作区所在文件系统,147G 可用) +mkdir -p "$PWD/.tmp" +TMPDIR="$PWD/.tmp" npx electron-builder --linux deb -c.electronDownload.isVerifyChecksum=false +# → release/agentmail-web_0.1.0_amd64.deb(约 100MB) +``` + +结论:**不要**为了"本机打包能过"把 deb 从 `build.linux.target` 里摘掉, +也不要改 fpm 缓存 —— 那是在改测试迁就环境。deb 是声明的交付物之一。 + ## 验证产物的方法(别只看文件存在) ```bash diff --git a/docs/HARMONY-ALIGN-PLAN.md b/docs/HARMONY-ALIGN-PLAN.md index aedef62..9f91a67 100644 --- a/docs/HARMONY-ALIGN-PLAN.md +++ b/docs/HARMONY-ALIGN-PLAN.md @@ -333,3 +333,53 @@ WebUI 侧完全不读这个字段(`mailStore` 里没有 `total`),所以这 (给上游的可执行请求:在有人的环境里执行 `harmony-emu start && cd client/harmony && hvigorw assembleHap && hdc install entry/build/default/outputs/default/entry-default-unsigned.hap`, 即可让 P2a 之后所有阶段的"点击级判据"落地。) + +### 7.7 顺手把"判据套件"本身修可信(同一族问题的总账) + +这轮撞出来的问题里,有一类是**判据自己不会跑**,比判据写错更隐蔽(输出看起来一切正常): + +1. `cross-client-theme.test.mjs` 从来不在 `npm test` 链里(pi 已认领); +2. 有人新加的 4 条玻璃判据写在 `process.exit()` **之后** —— 一条都不执行、不计通过也不计失败; +3. `nav-merge.test.mjs`、`build-stamp.test.mjs` 写好了**也没接线**(各 8 / 4 条判据从未跑过); +4. `npm test` 是 `&&` 链:**前面红一条,后面全部不跑**(`packaging` 那条因此长期隐身)。 + +改法(`test/run-all.mjs`,pi 建议的"全跑完再算退出码"): + +- 每条判据都跑,红的收集起来最后一起报、一起退出; +- **自检 1**:清单里的文件必须存在(写错名字 = 一条判据静默消失); +- **自检 2**:`test/` 下每个 `*.test.mjs` 都必须在清单里 —— **新增判据忘了接线直接红**。 + 这条自检当场就抓出上面第 3 条那两个文件。 +- 变异验证:把 `theme.test.mjs` 强制红 → 后面 5 条判据照跑,汇总如实报"红 1/9"、退出码 1。 + +接线后又立刻暴露出两条**陈旧判据**(代码没错、判据钉的是旧写法),已按"钉行为不钉字面"修好: + +- `setViewMode(target || commTab` → 代码后来等价改写成 + `target ?? (isComm ? commTab : modes[0])`;改成钉"isComm 时落到 commTab"这个行为; +- `MailView.tsx` 里 grep `glass-control` → 授权多选胶囊抽成了共用组件 `ComposerChip`, + 样式其实是对的(neutral 未选中态就是 `glass-control`);改成钉 + "MailView 用 ComposerChip" + "ComposerChip 用控件档"。两条都做了变异验证(改坏必红)。 + +按 pi 的提议还给生成产物补了一条判据:用 **postcss 真解析** `background-takeover.generated.css`, +断言**每条规则的选择器形状**都恰好是 `html[data-bg='on'] .bg-xxx` 且**规则条数与清单一致** —— +把"生成器写坏产物"从"只有浏览器能发现"变成"跑判据就红"。 +(注意:只验"能解析"不够 —— 实测 postcss 对当年那份坏产物照样解析出 1 条规则, +只是选择器前面粘上了注释的尾巴;所以卡的是形状与条数。) + +套件现状:`npm test` = `node test/run-all.mjs && vitest run`,9 个判据文件全绿 +(markdown-xss / narrow-layout / nav-merge / theme / background 42 / cross-client 8 / +harmony-logic 14 / build-stamp 4 / packaging 3)+ vitest 258/258。 + +### 7.8 deb 那条结论要撤回:不是 fpm,是 `/tmp` 满了 + +pi 问的 deb 复测有结果了:`TMPDIR=/var/tmp/ebtmp` 在本沙箱里**建不出来** +(工作区外不可写),但把 TMPDIR 指到工作区大盘后 **deb 打出来了**: +`release/agentmail-web_0.1.0_amd64.deb`(约 100MB)。 + +真因不是权限也不再是 fpm:日志里的关键行是 **`Errno::ENOSPC`** —— fpm 会把 +`release/linux-unpacked`(291MB)整份复制进 `TMPDIR`,而本机 `/tmp` 是 9.8G 的 tmpfs、 +被 `/tmp/gocache`(4.5G)等占到 99%(仅剩 ~100MB 可用)。 +所以「本机打不出 deb」这个结论**撤回**:它是环境症状,不是工具链缺陷, +deb 也不必从 targets 里摘。已写进 `client/electron/BUILD.md`(含排查命令)。 + +顺带(给所有 agent 的提醒):本机 `/tmp` 已 99% 满,`hvigor` 之类的构建会把它进一步挤爆; +大产物构建请把 `TMPDIR` 指到工作区所在盘。