给在这个仓库里工作的 AI agent 的约束。这里的规则优先于任何默认行为。
这个仓库是源码公开的(Elastic License 2.0),而它处理的是真实人的聊天记录。 所以下面第一节不是风格偏好,是硬约束:违反一次就是一次不可撤回的泄漏 (git 历史、fork、镜像、CI 日志都会留存)。
以下任何一类,一个字符都不许出现在被 git 跟踪的文件里(含代码、注释、 测试 fixture、文档、commit message、示例、快照):
- 真实人名(同事、用户、群成员的姓名与花名),真实头像与照片;
- 真实标识:
openConversationId(cid...)、openMessageId(msg...)、openDingTalkId(D...)、userId、corpId、unionId、deviceId; - 联系方式:手机号、邮箱、工号、身份证、银行卡、住址;
- 凭据:token、refresh token、AppKey/AppSecret、cookie、API key、
网关 URL 里带的密钥、
.dws/目录下的任何内容; - 真实聊天内容:消息正文、群名、会议转写、文档正文;
- 本机绝对路径(
/Users/<真实用户名>/...)—— 用户名本身就是身份信息。 写成/Users/<用户名>/...或$HOME/...; - 内部系统名:内部服务、域名、看板、工单号、内部仓库地址。
「照真实响应写 fixture」这个做法本身是对的(形状必须真),
但值必须编。已经出过一次事故:origin/main 里曾有 3 个真实
openConversationId 与若干真实姓名,来源正是漏了脱敏那一步。
- 结构照抄,值全换:
cidFAKE0001==/msgFAKE0001==/DFAKE0001; - 人名用
张三/Alice/A同学这类明显编造的; - 注释里举例也要用假值 ——
check:no-local-data曾把自己的注释报出来, 那正说明"拿真值比对"这个判据是对的; - 不确定一个串是真的还是编的:当成真的处理。
pnpm run check:no-local-data # 拿本机 vault 的真实值去已跟踪文件里搜
pnpm run check:trademarks # 第三方产品商标字样check:no-local-data 在没有本机 vault 时跳过而非失败(同事/CI 上可能
没登录过)。所以它绿了不等于安全 —— 在有真实数据的机器上跑过才算。
往白名单里加条目必须写清"为什么这是假阳性"。
vault、*.db、*.sqlite、日志、.env、.dws/、会话附件都已在
.gitignore 里。不要为了"方便调试"把它们拷进仓库目录,
也不要 git add -f。诊断脚本的产物写到 /tmp 下。
真实聊天内容、真实 ID、真实姓名不要贴进 issue、PR、外部 API、 第三方服务或任何会被缓存/索引的地方。诊断时把样本替换成假值再贴。
- 产品名是
MyContext(中文「我的上下文」)。包名前缀@mycontext/*。 Inklings/inklings是改名前的旧名。新代码、新文案、新文档一律用MyContext。碰到历史遗留的inklings字样:- 用户可见文案与新代码 → 改;
~/Library/Application Support/Inklings*这类旧 userData 目录名 → 不要改,那是兼容老装机的真实路径候选(曾经有人"顺手统一"过, 结果 16 条真数据断言静默消失)。
- 第三方产品商标不得出现在仓库里(
check:trademarks是门禁)。 已预置的第三方二进制与他人仓库副本在跳过列表里,其内部字符串不是我们的责任; 我们自己写的代码、注释、文档里一律用中性说法(如「渠道 CLI」「来源应用」)。 - 提到外部依赖时用能力描述而不是产品名,例如「IM 渠道的工作空间 CLI」。
- 提交/推送只在用户明确要求时做。在默认分支上要先开分支。
- 提交前跑:
pnpm run verify # format + lint + typecheck + check:all + test + smoke时间不够时至少跑 pnpm run typecheck && pnpm run check:all。
- commit message 用中文、说清为什么而不只是改了什么; 不要在里面写真实姓名、真实 ID 或本机路径。
这个代码库里最贵的 bug 都是静默降级:解析器读错一层信封 → 恒返回空页 → 采集器照常记成功、水位照常前移,日志里一个错都没有。所以:
- 结论必须有实测证据(命令、输出、条数、时间范围)。 写「实测 X」时那次实测必须真的跑过。
- 代码注释里的"实测结论"是有保质期的:上游 CLI 会变。 与当前行为冲突时重新实测,不要照抄注释。 (已知例子:某些注释里的分页结论在当前 CLI 版本上已经不成立。)
- 测试失败就说失败并贴输出;跳过了某一步就说跳过了。
- 不要用"应该"「大概」掩盖没验证过的地方 —— 说清哪些验过、哪些没验。
- 保密群 / 无权限的会话:识别到就跳过,不要绕。 服务端拒绝就是拒绝, 不许换接口、换身份、换参数去试探。把它明确记成「不可读」而不是「0 条」。
- 不许扩大读取面。 渠道命令白名单(
packages/channels/src/plugins/dingtalk/cli.ts) 是安全边界,不是建议。加命令要逐条加完整命令(不是前缀,前缀会放行整棵子树), 且 PII 类命令(花名册、手机号反查、离职名单、银行卡/合同/家庭信息)不进白名单。 - 严格遵守用户在引导里选的范围(时间下界 + 勾选的会话)。 超范围采集是隐私问题,不是"多采点没坏处"。
- 分页要抽干。
hasMore=true就必须继续翻。只取第一页而对外说"采完了" 是最典型的静默数据缺失。 - 发送类动作要用户确认。 不许自动发消息、不许绕过宿主 UI 授权。
- 注释与命名跟随周围代码(本仓库注释用中文,密度较高,解释为什么而非是什么)。
- 引用代码位置写
path/to/file.ts:123。 - 不要为了通过类型检查加
as any/as unknown as T—— 那通常盖住的是 一个真实的形状差异。