Files
MailUI4Agents/docs/DEV-TOOLING.md
JianFeeeee 33e44074e7 fix(tooling): pi-lens 的项目防护其实一直没生效(JSON 里带注释 → 整份被忽略)
## 现场

跑 `pi --help` 时有一行不起眼的警告:

    [pi-lens] ignoring invalid project config …/.pi-lens.json:
    Expected double-quoted property name in JSON at position 60

`.pi-lens.json` 是 `d50c55d` 专门加的项目级防护(关掉 pi-lens 的格式化与
autofix),但它的说明写成了 `//` 注释 —— 读 pi-lens 的源码确认:

    PROJECT_CONFIG_BASENAMES = ['.pi-lens.json', 'pi-lens.json'];  // 没有 .jsonc
    raw = JSON.parse(text);                                        // 不去注释
    // 解析失败 → 打一行警告,然后**整份忽略**

所以「已经关掉了」这个结论是**错的**,防护从落地那天起就没生效过。
而它要防的是两次已发生的真实损失:一次是 `19a3161` 把约 7000 行 biome 重排
扫进功能提交(无法审查、还掩盖了一处删行),一次是 prettier 改坏
`client/electron/index.html` 并打破 `test/theme.test.mjs` 的两条断言。

失败方式是静默的:进程照常跑,只有启动时一行警告 —— 而我正是在
`pi --help` 的输出里才看见它。

## 修

- `.pi-lens.json` 改为**严格 JSON**(只有 `$schema` / `format` / `autofix`;
  `$comment` 也不行 —— pi-lens 校验未知键,会为它刷一条
  「unknown key … ignored」的警告,而噪声会训练人忽略告警)。
- 理由移到 `docs/DEV-TOOLING.md`(含 pi-lens 的源码依据、两次事故、
  以及「为什么不是把格式化器配成本仓库风格」——试过,仍改 17 个文件)。
- `biome.jsonc`(允许注释)里加指针:它只是两道闸中的一道,真正的总开关是
  `.pi-lens.json`,而那份**必须是严格 JSON**。
- 验证:`pi --help` 现在 **0 行** pi-lens 输出;反向对照(故意塞回一行注释)
  会重新出现 `ignoring invalid project config`。

## 顺带:仓库里有一个活的凭据

`scripts/verify-l2.sh` 把**管理员 user key 硬编码**在文件里(`1759666` 起就在
git 历史里)。实测它**仍然有效**(`/auth/me` → 200),属于用户 `jianf`。

- 已改为从 `VERIFY_L2_TOKEN` 或 `/root/gotmp/verify-l2-token.txt`(600)读取,
  两者都没有时**报错退出**(反向对照验过:EXIT=2,不静默跑);
- 跑通一次确认可用(6 通过 0 失败)。

**但删掉当前这行不能把它从历史里拿掉** —— 要真正作废必须轮换那把 key。
这需要你定(它是你账号的密钥,可能还有别的工具在用),见提交后的说明。
2026-09-12 23:49:55 +08:00

70 lines
2.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`,它两条改写路径一起关。