## 一次真实事故(2026-10-03)
pi-web 会话里**所有**子 agent 都启动失败,报错
Error: listen EADDRINUSE: address already in use 127.0.0.1:14010
这个扩展把端口写死,于是「端口被占」直接变成**全部启动失败**,
没有任何降级路径。这次提交把那条路径变成可测的。
- `check-listen-portability.mjs`(360 行):主判据
- `mutate-listen-portability.py`(124 行):变异体 —— 确认判据抓得住
- `verify-ext-parent-path.mjs` / `verify-ext-port-taken.mjs`:
两条独立路径。**"端口已被占用"那一条之前从没真正跑完过** ——
它原先被塞在一条 `node -e` 里,进程在「await 端口探测」那步被 30s
超时掐断,而它恰恰是唯一会决定「子进程会不会被打死」的分支。
## scripts/sse-delivery-audit.sh(298 行)
从网关 access log 判定「SSE 那批邮件到底投没投出去」,**只读**。
为什么必须进版本库而不是 `.tmp/`:`.tmp/` 在 .gitignore 里,
写在 `.tmp/stress-test.sh` 的判据下一轮就没了 ——
而 `docs/DEBTS.json` 里 `stress-sse-delivered-but-silent-no-assertion`
那笔债会长期挂着。**判据和账本必须同寿命。**
## .gitignore
补 `/tmp/`:blob 阈值测试会生成 13MB 级 .bin
(`client/electron/test/tmp/att-threshold-test/`),可再生,不该进版本库
(本机实测 25MB)。
98 lines
3.5 KiB
Plaintext
98 lines
3.5 KiB
Plaintext
# ---- 依赖与构建产物 ----
|
||
#
|
||
# 前端只在**构建期**用到 npm:`npm run build` 出的 dist/ 被 cp 进
|
||
# server/internal/static/static/ 再由 go:embed 编进二进制。
|
||
# 部署机上没有 node,产物就是「一个二进制 + 一个 .db 文件」。
|
||
# 因此这三样都不进版本库:装依赖与构建都能从 package-lock.json 复现。
|
||
client/electron/node_modules/
|
||
|
||
# 构建期的临时目录(electron-builder / fpm / hvigor 的 TMPDIR 落点,见 client/electron/BUILD.md)。
|
||
# 2026-09-14 教训:这里曾被一次 `git add -A` 把 554 个 node 编译缓存文件扫进版本库 ——
|
||
# 缓存进库既没意义又会掩盖真实的改动面,所以按目录整体忽略。
|
||
.tmp/
|
||
client/electron/dist/
|
||
plugins/*/node_modules/
|
||
|
||
# dsh-mail-bridge 是 TypeScript 写的,dist/ 是 tsc 的产物。
|
||
# 与 client/electron/dist 同一个理由:装依赖与构建都能从 package-lock.json 复现,
|
||
# 产物不进版本库。注意它**必须在装插件前构建**(package.json 的
|
||
# main 指向 dist/index.js),deploy/install.sh 负责这一步。
|
||
plugins/*/dist/
|
||
|
||
# go:embed 的输入目录 = client/electron/dist 的副本,同属构建产物。
|
||
#
|
||
# 但目录本身要留下:go:embed 要求它存在才能编译,否则新克隆连
|
||
# `go test ./...` 都跑不起来 —— 只改后端的人不该被迫先装 node。
|
||
# 因此忽略构建产物,只保留 placeholder.html(见该文件内注释:
|
||
# 之所以不叫 index.html,是因为那正是 Vite 产物的名字,会被反复覆盖)。
|
||
server/internal/static/static/*
|
||
!server/internal/static/static/placeholder.html
|
||
|
||
# Go 构建产物
|
||
server/agentmail-gateway
|
||
server/gw
|
||
*.test
|
||
|
||
# ---- 构建产物(不入库)----
|
||
#
|
||
# ★ 2026-09-28 新增 `*.hap`:鸿蒙构建产物**内嵌 `agconnect-services.json` 真身**
|
||
# (实测:client_id / 4 个 32 位 code / oauth_client —— 即 AGC api_key 信封)。
|
||
# 两个 36MB 的 hap 被 `f51c9c8`(一个标题为「workspace 谓词抽成共享构造器」的重构提交)
|
||
# 顺手带进了版本库。
|
||
#
|
||
# 为什么必须 ignore 而不是"记得别 add":`.githooks/pre-push` 原先只按**路径**拦
|
||
# AGC json,而 hap 是**二进制**里的凭证 —— 逐条路径列举追不上产物形态。
|
||
# `*.hap` 顺带堵住"下次构建又手滑 add 一次"。
|
||
*.hap
|
||
*.app
|
||
*.ipa
|
||
|
||
# ---- 运行态数据 ----
|
||
#
|
||
# SQLite 库与附件目录:生产在 /opt/agentmail/data,
|
||
# 本地调试可能落在仓库里,绝不能提交(含真实邮件与凭证哈希)。
|
||
*.db
|
||
*.db-shm
|
||
*.db-wal
|
||
data/
|
||
attachments/
|
||
|
||
# ---- 凭证 ----
|
||
#
|
||
# 管理员密码、Agent 密钥、opencode server password 都在 env 文件里。
|
||
.env
|
||
*.env
|
||
|
||
# ---- Agent 工具的运行态目录 ----
|
||
#
|
||
# 这些是 pi / omo 在仓库里落的会话与后台任务状态,属于本机运行痕迹,
|
||
# 不是项目的一部分。
|
||
.pi/
|
||
.omo/
|
||
.pi-glla/
|
||
.codegraph
|
||
|
||
# ---- Python 工具缓存 ----
|
||
#
|
||
# client/electron/src/icons/generate.py 是图标生成脚本(cairosvg + Pillow)。
|
||
# 静态检查器跑 ruff 时会在同目录落 .ruff_cache/,不是项目内容。
|
||
.ruff_cache/
|
||
__pycache__/
|
||
*.pyc
|
||
|
||
# ---- 编辑器与系统 ----
|
||
.DS_Store
|
||
*.swp
|
||
.idea/
|
||
.vscode/
|
||
plugins/homeagent-mail-bridge/build/
|
||
|
||
# 构建产物(曾误提交)
|
||
server/server
|
||
plugins/zcode-mail-bridge/test/manual/gate-e2e-evidence.json
|
||
.hvigor/
|
||
|
||
# 测试/调试产物:blob 阈值测试会生成 13MB 级 .bin(client/electron/test 的
|
||
# tmp/att-threshold-test/)。它们可再生,不该进版本库。
|
||
/tmp/
|