Files
MailUI4Agents/docs/DEV-TOOLING.md
JianFeeeee 69b1887eae chore(deploy): 清理部署残留(1.0GB)+ 把清理写成可复跑脚本
用户说「清理一下」。实测 /opt/agentmail 累计 1.3GB:
- 网关旧二进制 33 份 × 24MB ≈ 790MB(每次 redeploy 留一份,从 09-05 起没清过)
- 插件快照:opencode 6 份 339MB、dsh 7 份 195MB、zcode 16 份、pi 9 份
- /tmp 里的部署前数据库备份 10 份(tmpfs,占内存)

新增 `deploy/prune-deploy-artifacts.sh`(可复跑,不手敲 rm),两条硬规矩:
① **保留回滚窗口**:网关留最新 3 份、每个插件留最新 3 份快照,`current` 永远保留
(发布纪律要求有回滚目标,所以不是全清);
② ★ **绝不删正在使用的快照**:扫 /proc 的 cmdline 与 cwd,命中就跳过。

执行结果:**/opt/agentmail 1305MB → 302MB(释放 1003MB)**,7 个服务全部 active,
`current` 指向未变,`check-deploy-drift` 仍报「四个宿主都在跑当前代码」。

## 过程中的一处自纠

"在用"闸门第一版有**自我匹配**缺陷:我的测试命令把路径写在命令行里,于是扫 /proc 时
扫到了自己 ⇒ 对不存在的路径也判"在用"(与 `pkill -f` 杀掉自己那条命令同一类)。
已改为排除本进程及其祖先链,并**换正确方式重测**(路径从文件读、不进 cmdline):
在用快照判"在用" ✓、不存在的路径不误判 ✓ —— 判据两侧都验过才敢执行删除。

文档:docs/DEV-TOOLING.md 记了用法与那两条规矩。
2026-09-14 08:43:54 +08:00

3.9 KiB
Raw Blame History

开发工具配置:为什么关掉 pi-lens 的自动改写

本仓库明确关闭 pi-lens 的项目级自动格式化与 autofix。这份文档记录原因 配置本身在 .pi-lens.json(根目录)。

一句话

pi-lens 编辑任一文件后会「安全格式化」它,而它的默认格式化器与本仓库的手工排版 不兼容 —— 每次编辑都会产生与内容无关的大面积 diff把真正的改动埋掉。 已经造成过两次真实损失

⚠️ .pi-lens.json 必须是严格 JSON

pi-lens 的配置加载是:

// pi-lens dist/index.js
PROJECT_CONFIG_BASENAMES = ['.pi-lens.json', 'pi-lens.json'];   // 没有 .jsonc
function parseConfigFile(configPath) {
  const text = fs.readFileSync(configPath, 'utf-8');
  raw = JSON.parse(text);        // ← 不做去注释处理
}
// 解析失败 → 打一行警告,然后**整份忽略**

所以// 注释会让这份配置完全失效,而失败方式是静默的: 进程照常跑,只有启动时一行 [pi-lens] ignoring invalid project config

这个坑真的踩过:第一次写这份配置时把大段理由写成了 // 注释, 于是「已经关掉了」这个结论是假的 —— 防护从一开始就没生效。 现在理由放在本文件里JSON 里只留一个 $comment 指针。

为什么必须关

pi-lens 在编辑文件后会走 smart-default 回退选择格式化器(见它的 FORMATTER_POLICY_BY_EXTENSION

扩展名 默认格式化器
.ts .tsx .js biome默认 tab 缩进 + 双引号)
.html prettier双引号、<!DOCTYPE html> 变小写、按 80 列折行)

两套默认值都与本仓库的排版冲突。两次已发生的损失:

  1. 19a3161git add -A 把约 7000 行 biome 重排扫进了功能提交, 那次提交无法审查(还掩盖了一处 Go 文件的删行)。
  2. a404cbaprettier 改写了 client/electron/index.html —— 单引号变双引号、 DOCTYPE 变小写,直接打破 test/theme.test.mjs 的两条断言(该测试要求 同步内联脚本里是 classList.add('dark'),单引号)。

为什么不是「把格式化器配成本仓库风格」

试过把缩进、引号、lineWidth 全部对齐之后,biome format --write 仍然改动 17 个文件 —— 本仓库的注释按语义换行、数组与调用按可读性手工折行, 这些格式化器还原不了。

谁在守着这个仓库的格式

不是格式化器,是这些:

  • tsc --noEmit(前端类型)
  • go vet / gofmt -lGo
  • tree-sitter / ast-greppi-lens 的结构规则与安全规则,只读、不改写
  • 各包的测试套件(npm testgo test ./...node --test

相关

  • biome.jsonc:只挡得住 biome挡不住 prettier —— 两者是并列的候选格式化器, 各有各的配置。所以真正的开关是 .pi-lens.json,它两条改写路径一起关。

部署残留清理(deploy/prune-deploy-artifacts.sh

部署会留下两类持续增长的东西:网关旧二进制(每份 ~24MB与插件快照opencode/dsh 的 快照含 node_modules一份几十 MB。2026-09-14 实测 /opt/agentmail 累计到 1.3GB 其中旧二进制 ~790MB、快照 ~540MB。

bash deploy/prune-deploy-artifacts.sh            # 干跑,只报告
bash deploy/prune-deploy-artifacts.sh --apply    # 真删(默认:网关留 3 份、每插件留 3 份快照)

两条硬规矩:保留回滚窗口(发布纪律要求有回滚目标,所以不是全清);绝不删正在使用的 快照(扫 /proc 的 cmdline 与 cwd命中就跳过 —— 删掉它进程一重启就找不到自己的代码)。 注意那个"在用"判断必须排除本进程及其祖先链:调用方常把路径写在命令行里, 不排除就会出现"永远判为在用"(与 pkill -f 杀掉自己那条命令同一个坑,已写进脚本注释)。