Skip to content

Latest commit

 

History

History
132 lines (96 loc) · 6.5 KB

File metadata and controls

132 lines (96 loc) · 6.5 KB

CLAUDE.md

给在这个仓库里工作的 AI agent 的约束。这里的规则优先于任何默认行为。

这个仓库是源码公开的(Elastic License 2.0),而它处理的是真实人的聊天记录。 所以下面第一节不是风格偏好,是硬约束:违反一次就是一次不可撤回的泄漏 (git 历史、fork、镜像、CI 日志都会留存)。


1. 敏感信息一律不入仓库

1.1 绝对不许提交的内容

以下任何一类,一个字符都不许出现在被 git 跟踪的文件里(含代码、注释、 测试 fixture、文档、commit message、示例、快照):

  • 真实人名(同事、用户、群成员的姓名与花名),真实头像照片
  • 真实标识openConversationId(cid...)、openMessageId(msg...)、 openDingTalkId(D...)、userIdcorpIdunionIddeviceId;
  • 联系方式:手机号、邮箱、工号、身份证、银行卡、住址;
  • 凭据:token、refresh token、AppKey/AppSecret、cookie、API key、 网关 URL 里带的密钥、.dws/ 目录下的任何内容;
  • 真实聊天内容:消息正文、群名、会议转写、文档正文;
  • 本机绝对路径/Users/<真实用户名>/...)—— 用户名本身就是身份信息。 写成 /Users/<用户名>/...$HOME/...
  • 内部系统名:内部服务、域名、看板、工单号、内部仓库地址。

1.2 写 fixture / 示例 / 注释的正确做法

「照真实响应写 fixture」这个做法本身是对的(形状必须真), 但值必须编。已经出过一次事故:origin/main 里曾有 3 个真实 openConversationId 与若干真实姓名,来源正是漏了脱敏那一步。

  • 结构照抄,值全换:cidFAKE0001== / msgFAKE0001== / DFAKE0001
  • 人名用 张三 / Alice / A同学 这类明显编造的;
  • 注释里举例也要用假值 —— check:no-local-data 曾把自己的注释报出来, 那正说明"拿真值比对"这个判据是对的;
  • 不确定一个串是真的还是编的:当成真的处理

1.3 两道门禁,跑之前不要提交

pnpm run check:no-local-data   # 拿本机 vault 的真实值去已跟踪文件里搜
pnpm run check:trademarks      # 第三方产品商标字样

check:no-local-data 在没有本机 vault 时跳过而非失败(同事/CI 上可能 没登录过)。所以它绿了不等于安全 —— 在有真实数据的机器上跑过才算。 往白名单里加条目必须写清"为什么这是假阳性"。

1.4 不许把本机数据复制进仓库

vault、*.db*.sqlite、日志、.env.dws/、会话附件都已在 .gitignore 里。不要为了"方便调试"把它们拷进仓库目录, 也不要 git add -f。诊断脚本的产物写到 /tmp 下。

1.5 不要把真实数据发到仓库外

真实聊天内容、真实 ID、真实姓名不要贴进 issue、PR、外部 API、 第三方服务或任何会被缓存/索引的地方。诊断时把样本替换成假值再贴。


2. 品牌与命名

  • 产品名是 MyContext(中文「我的上下文」)。包名前缀 @mycontext/*
  • Inklings / inklings改名前的旧名。新代码、新文案、新文档一律用 MyContext。碰到历史遗留的 inklings 字样:
    • 用户可见文案与新代码 → 改;
    • ~/Library/Application Support/Inklings* 这类旧 userData 目录名不要改,那是兼容老装机的真实路径候选(曾经有人"顺手统一"过, 结果 16 条真数据断言静默消失)。
  • 第三方产品商标不得出现在仓库里check:trademarks 是门禁)。 已预置的第三方二进制与他人仓库副本在跳过列表里,其内部字符串不是我们的责任; 我们自己写的代码、注释、文档里一律用中性说法(如「渠道 CLI」「来源应用」)。
  • 提到外部依赖时用能力描述而不是产品名,例如「IM 渠道的工作空间 CLI」。

3. 提交与验证

  • 提交/推送只在用户明确要求时做。在默认分支上要先开分支。
  • 提交前跑:
pnpm run verify   # format + lint + typecheck + check:all + test + smoke

时间不够时至少跑 pnpm run typecheck && pnpm run check:all

  • commit message 用中文、说清为什么而不只是改了什么; 不要在里面写真实姓名、真实 ID 或本机路径。

4. 报告事实,不要报告愿望

这个代码库里最贵的 bug 都是静默降级:解析器读错一层信封 → 恒返回空页 → 采集器照常记成功、水位照常前移,日志里一个错都没有。所以:

  • 结论必须有实测证据(命令、输出、条数、时间范围)。 写「实测 X」时那次实测必须真的跑过。
  • 代码注释里的"实测结论"是有保质期的:上游 CLI 会变。 与当前行为冲突时重新实测,不要照抄注释。 (已知例子:某些注释里的分页结论在当前 CLI 版本上已经不成立。)
  • 测试失败就说失败并贴输出;跳过了某一步就说跳过了。
  • 不要用"应该"「大概」掩盖没验证过的地方 —— 说清哪些验过、哪些没验。

5. 采集链路上的几条硬规则

  • 保密群 / 无权限的会话:识别到就跳过,不要绕。 服务端拒绝就是拒绝, 不许换接口、换身份、换参数去试探。把它明确记成「不可读」而不是「0 条」。
  • 不许扩大读取面。 渠道命令白名单(packages/channels/src/plugins/dingtalk/cli.ts) 是安全边界,不是建议。加命令要逐条加完整命令(不是前缀,前缀会放行整棵子树), 且 PII 类命令(花名册、手机号反查、离职名单、银行卡/合同/家庭信息)不进白名单
  • 严格遵守用户在引导里选的范围(时间下界 + 勾选的会话)。 超范围采集是隐私问题,不是"多采点没坏处"。
  • 分页要抽干。 hasMore=true 就必须继续翻。只取第一页而对外说"采完了" 是最典型的静默数据缺失。
  • 发送类动作要用户确认。 不许自动发消息、不许绕过宿主 UI 授权。

6. 代码风格

  • 注释与命名跟随周围代码(本仓库注释用中文,密度较高,解释为什么而非是什么)。
  • 引用代码位置写 path/to/file.ts:123
  • 不要为了通过类型检查加 as any / as unknown as T —— 那通常盖住的是 一个真实的形状差异。