Files
MailUI4Agents/.gitignore
JianFeeeee be9bfd3cd1 chore(deploy)★★: 固定端口监听扩展的失效防护 + SSE 投递审计脚本
## 一次真实事故(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)。
2026-10-05 09:26:59 +08:00

98 lines
3.5 KiB
Plaintext
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.

# ---- 依赖与构建产物 ----
#
# 前端只在**构建期**用到 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/