Files
MailUI4Agents/.gitignore
JianFeeeee cbfc3bdde7 fix(安全): 构建产物出库 + pre-push 加**按内容**的第二道闸
两个 36MB 的 .hap 被 f51c9c8(一个标题为「workspace 谓词抽成共享构造器」的
重构提交)顺手带进版本库,而它们**内嵌 AGC 配置真身**。

## 实测确认(不是推测)

用 python zipfile 打开两个 hap,逐字段核对形状(不打印值):
  resources/rawfile/agconnect-services.json
    client.client_id         HEX len=19
    code.code1..code4        HEX len=32  ×4   ← api_key 信封
    oauth_client.client_id   HEX len=19
    app_info.app_id          HEX len=19

`git merge-base --is-ancestor f51c9c8 origin-https/main` 判否
⇒ **仅本地、尚未推送**(本仓镜像是 public / 匿名可 clone)。

## 为什么只 rm --cached 不够

`git rm --cached` 只把文件移出 index,**blob 仍躺在未推送的提交里** ——
下一次 `git push` 会连它一起发出去。所以必须同时堵"下一次"。

## 改法

① .gitignore 加 `*.hap` / `*.app` / `*.ipa`
② .githooks/pre-push 加第二道闸:**按内容**查,不按路径
   —— 原先只按路径拦 agconnect-services.json,而 hap 里它只是
      一个 zip 条目,逐条列举路径追不上产物形态。

判据形态:本次推送范围内**新增或修改**的构建产物(`*.hap/*.app/*.ipa`)
          → 内容里出现 `agconnect-services.json` 这个**条目名** ⇒ 拦。
用条目名而非凭证值:值会变而条目名稳定,且搜值需把凭证读进内存。

## ★ 这一格踩了三个坑,每个都让闸**静默放行**(都实测过)

① `git diff "a..b"` 取不到"该范围新增的文件" —— 它的语义是
   「工作区 vs b」,**干净工作区上恒为空**。第一版这么写,
   实测含真凭证的 hap 被放行、push exit=0。
   ⇒ 改 `git log --diff-filter=AM --name-only`(天生吃范围)。
② `git rev-parse "a..b:path"` 输出**两行**(blob sha + `^a`),
   赋进变量是多行值 ⇒ 后续 `cat-file` 失败 ⇒ 被 `|| blob_sha=""`
   兼掉 ⇒ 静默跳过。
   `git ls-tree "a..b"` 也报错(不接受范围)。
   ⇒ 正确形状:rev-list 取 tip → ls-tree <tip> 取 blob。
③ ★★ `grep -q` 接管道 + `set -o pipefail`:grep 命中即退出 ⇒ 上游
   `git cat-file` 收 SIGPIPE 退 **141** ⇒ pipefail 取各段合取 ⇒
   整条管道 141 ⇒ `if` 判假。**"找到凭证"被读成"没找到"。**
   实测 PIPESTATUS=141 0。
   失效方向恰好是**放行**,与本钩子"宁可推不出去"相反。
   ⇒ 去掉 `-q`,让 grep 读完整条流(最后一段自然是它的码)。

## 验证(四态,都实测过)

  含真凭证的 hap   ⇒ 拦,裸仓没收到 commit
  干净的 hap        ⇒ 放行(只有 example.json)
  AGC json 路径     ⇒ 仍拦(第一道没坏)
  删分支            ⇒ 不误拦
  commit-hygiene    ⇒ 绿
2026-09-28 08:26:15 +08:00

94 lines
3.3 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/