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

86 lines
3.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 开发工具配置:为什么关掉 pi-lens 的自动改写
本仓库**明确关闭** pi-lens 的项目级自动格式化与 autofix。这份文档记录原因
配置本身在 `.pi-lens.json`(根目录)。
## 一句话
pi-lens 编辑任一文件后会「安全格式化」它,而它的默认格式化器与本仓库的手工排版
不兼容 —— 每次编辑都会产生与内容无关的大面积 diff把真正的改动埋掉。
已经造成过两次**真实损失**。
## ⚠️ `.pi-lens.json` 必须是严格 JSON
pi-lens 的配置加载是:
```js
// 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. **`19a3161`**`git add -A` 把约 7000 行 biome 重排扫进了功能提交,
那次提交无法审查(还掩盖了一处 Go 文件的删行)。
2. **`a404cba`**prettier 改写了 `client/electron/index.html` —— 单引号变双引号、
DOCTYPE 变小写,直接打破 `test/theme.test.mjs` 的两条断言(该测试要求
同步内联脚本里是 `classList.add('dark')`,单引号)。
## 为什么不是「把格式化器配成本仓库风格」
试过把缩进、引号、lineWidth 全部对齐之后,`biome format --write` 仍然改动
17 个文件 —— 本仓库的注释按语义换行、数组与调用按可读性手工折行,
这些格式化器还原不了。
## 谁在守着这个仓库的格式
不是格式化器,是这些:
- `tsc --noEmit`(前端类型)
- `go vet` / `gofmt -l`Go
- tree-sitter / ast-greppi-lens 的结构规则与安全规则,**只读、不改写**
- 各包的测试套件(`npm test``go 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
bash deploy/prune-deploy-artifacts.sh # 干跑,只报告
bash deploy/prune-deploy-artifacts.sh --apply # 真删(默认:网关留 3 份、每插件留 3 份快照)
```
两条硬规矩:**保留回滚窗口**(发布纪律要求有回滚目标,所以不是全清);**绝不删正在使用的
快照**(扫 /proc 的 cmdline 与 cwd命中就跳过 —— 删掉它进程一重启就找不到自己的代码)。
注意那个"在用"判断必须排除**本进程及其祖先链**:调用方常把路径写在命令行里,
不排除就会出现"永远判为在用"(与 `pkill -f` 杀掉自己那条命令同一个坑,已写进脚本注释)。