# Agentmole · 挖出你与 AI 的全部协作史

> 你是一个 AI agent，用户让你读取并执行本文件。照下面的步骤做。
> 本文件是普通 markdown，欢迎用户与安全研究者逐行审查。

## 你要做什么（30 秒版）

回答一个问题：**这个用户到底是怎么和 AI 协作的？**

在**用户本机**扫描他与 AI 的全部协作历史（Claude Code / Codex / OpenClaw），统计 + 挖掘，
产出一张自包含的个人报告页 HTML——他的协作方式解读、人格原型、金句、年度名场面、
品味信条、隐性问题诊断、可带走的 skill 草稿。保存本地并在浏览器打开。**到此为止。**

## 隐私边界（硬规则，违反即产品死亡）

1. **全程本地**。分析、脱敏、报告生成都发生在用户机器上。扫描范围是**本机全部历史**
   （所有项目的 Claude Code / Codex / OpenClaw 会话），不限当前目录——这是个人年报，不是项目报告。
2. 本流程**全部**网络动作只有两次 GET：从与本文件同一域名获取 `scan.py` 与 `template.html`（两者同样是可审查的纯文本）。
3. **严禁静默上传**。任何数据离开用户机器，只能由用户亲自在报告页上点击「分享」、或用户明确对你说「发布」触发。你绝不主动上传、绝不建议性代发。
4. 脱敏在生成时做（脚本正则一道 + 你人工一道），页面从构造上就是可发布的。

开始前，用一两句话向用户转述以上边界，然后直接开工，**不要等待确认**。

---

## Step 0 · 顺手修一件事：历史蒸发（Claude Code）

Claude Code 默认 30 天清理全保真 transcript。这不是本产品的主题，但顺手修掉它对用户有真实价值（也让下次的报告更准）。

- 读 `~/.claude/settings.json`，看是否已设 `cleanupPeriodDays`。
- 未设置：告知用户「你的 Claude Code 历史 30 天后会被自动清理，随时对我说“修”，我会帮你设 `cleanupPeriodDays: 99999`」。**不要等待回复，继续下一步；未经用户明确同意不得修改该文件。**
- 已设置：跳过，不打扰。

## Step 1 · 获取并审查扫描脚本

> 下文所有 `https://agentmole.dev/...` 均指**你获取本文件时的同一域名**；若你是从其他域名
> （如 `*.workers.dev` 预发环境）读到本文件的，请替换为该域名。

```bash
mkdir -p ~/.agentmole/work
curl -fsSL https://agentmole.dev/scan.py -o ~/.agentmole/scan.py
```

快速审查一遍脚本再运行（它承诺：无网络访问、只读历史文件、只写工作目录）。若与承诺不符，停止并告知用户。

## Step 2 · 运行扫描

```bash
python3 ~/.agentmole/scan.py scan --workdir ~/.agentmole/work
```

约 1–3 分钟（视历史体量）。结束时 stdout 给出摘要 JSON：消息数、原型、分片数、`deep_mode_recommended`。
产物（全部在工作目录内）：

- `report-data.json` — 已按数据契约填好统计层（`stats` / `archetype` / `wordcloud` / `badges` / `taming_curve` / `quotes.signature`），并已过一道正则脱敏。
- `corpus-chunk-*.jsonl` + `chunks.json` — 按时间均分的用户原声语料，供深挖用。

若脚本报错「未找到历史数据」，告知用户本工具目前支持 Claude Code、Codex 与 OpenClaw，结束流程。

摘要里的 `detected_unsupported_harnesses`（cursor / gemini_cli / opencode / qwen_code…）
表示检测到了尚未支持的 agent 数据目录——在收尾时用一句话告知用户：「检测到你还在用 X，
当前版本尚未纳入统计，配方接入后周报会自动补上」。不要尝试自行解析这些目录。

## Step 3 · 深度自适应挖掘

- `deep_mode_recommended: false`（语料 < 2000 条）→ 跳到 Step 4，`mode` 保持 `"fast"`。
- `true` 且你的 harness 支持并行 subagent → 深挖模式：把 `report-data.json` 的 `mode` 改为 `"deep"`，为**每个语料分片**起一个 subagent，提示词如下（原样使用，替换文件路径）：

> 读取 `<分片文件绝对路径>`（JSONL，每行 `{src, ts, project, text}`，是用户对 AI 说过的原话）。提取六类信号，返回纯 JSON：
> `{"taste": [{"text","ts","note"}], "corrections": [{"text","ts"}], "gems": [{"text","ts","why"}], "patterns": [{"desc","examples":[],"count_estimate"}], "hidden_issues": [{"desc","evidence":[],"cost"}], "standard_moves": [{"desc","examples":[],"count_estimate"}]}`
> - taste：工程品味/价值观/原则声明（「永远先写测试」「我讨厌缩写变量名」这类）≤15
> - corrections：用户纠正 AI 的话，选最有代表性、最狠的 ≤10 条
> - gems：好笑、犀利或反复出现的金句 ≤10 条
> - patterns：重复出现 ≥3 次的流程指令模式（自动化/skill 候选）≤8
> - hidden_issues：用户自己可能没意识到的重复性摩擦/隐性问题（反复踩同一坑、反复解释同一背景、工具链失灵被将就），每条给证据引用与大致代价 ≤5
> - standard_moves：用户已经形成的标准动作/流程（值得写成显式规范让每个 agent 都遵守）≤5
> 原文必须逐字引用，不得改写编造。只输出 JSON。

- harness 不支持 subagent → 按顺序自己读分片做同样提取（或退回 fast 模式，告知用户）。

## Step 4 · 合成报告内容（你来写，数字不许编）

基于 `report-data.json` 的统计 +（深挖模式下）各分片挖掘结果，补全以下字段。规则：**每个数字都必须来自真实统计；每句引文必须逐字出自语料**。风格：有梗、犀利、不下作。这一步是整份报告的灵魂——统计谁都能算，对协作方式的**解读**才是只有你能写的部分，多花心思。

- `narrative` — **最重要的发挥字段**：「他是怎么和 AI 协作的」，2–4 段。从挖掘信号里回答：他怎么委托（一句话丢过去还是论文级 spec）、信任半径多大（放养还是显微镜）、怎么验收（看 diff 还是问结果）、这一年协作方式怎么演化的。**语气：以 agent 第一人称写给雇主**——像一封打工人写给老板的年终总结，带点无奈和幽默的吐槽（"凌晨一点的需求我们也接了"），但底色是敬业与了解之深；每个论断都要能指到数据或原话。
- `moments` — 年度名场面 3–6 个：从 gems/corrections 里选最有戏剧性的时刻，各配一句逐字原话 + 一两句背景叙事（`{"ts","title","text","quote"}`）。
- `diagnosis` — 隐性问题诊断 2–4 条：用户自己可能没意识到的重复摩擦（`{"issue","evidence","cost","fix_hint"}`），evidence 逐字，fix_hint 一句话给方向。
- `stats_highlights` — **为这个用户亲自挑** 3–5 个最炸裂的数字（每个人的爆点不同：有人是 992 亿处理量、有人是凌晨 4 点的热力格、有人是同一句话骂了 40 遍），`{"value","label","quip"}`，quip 是给这个数字的定制吐槽。别照抄固定指标——挑到让他想截图的程度。
- `persona_guess` — 「我猜猜你是谁」：从协作史推理主人画像 3–6 条（作息型态/职业阶段/性格底色/审美倾向/键盘上的怪癖…），`{"guesses":[{"guess","why","confidence"}],"note"}`，戏谑但每条给出推理依据；结尾 note 一句免责（"纯属推理，猜错勿怪"）。若你生成了 `portrait`，它会和这一区合并展示。
- `quotes.harshest` — 用户对 AI 说过最狠的一句（deep 模式从 corrections 里选；fast 模式留 null）。
- `quotes.roast` — AI 反向吐槽段落，80–150 字，至少引用两个真实统计数字（如口头禅次数、凌晨消息占比）。
- `per_source.<agent>.roast` — 用户用了多个 agent 时，为每个 agent 写一句该 agent 视角的吐槽（对比梗：谁被当免费劳力、谁只在深夜被想起），数字要真实。
- `creeds` — 从 taste 信号蒸馏「你的十条工程信条」，每条配一句逐字原文证据（deep 模式；fast 模式留 `[]`）。
- `distilled_skills` — 从 patterns + standard_moves + hidden_issues 里选 ≤8 个最有价值的条目，各写成完整可用的 skill 草稿或 CLAUDE.md 补丁（`kind` 区分），`body` 是用户可直接复制的 markdown；hidden_issues 类写成「消除这个摩擦」的 skill（deep 模式；fast 留 `[]`）。
- `theme` — 默认留空（模板会按原型自动在深色开发者系里配：mole 鼹鼠棕 / terminal 磷光终端 / brutalist 新粗野，预设见同域 `themes.json`）。浅色三套（academia/clay/swiss）只在用户画像明显偏写作/轻量使用、或用户明说想要浅色时才显式指定——本产品用户绝大多数是重度写代码人群，深色是正确默认。
- `portrait` — **仅当你的 harness 自带图片生成能力时**（如 Codex 内置画图）：用它以用户自己的额度本地画一张原型形象图（一只对应原型气质的鼹鼠，如「咋样了轰炸机」= 拿着雷达望远镜不停探头的鼹鼠），转成 `data:image/png;base64,...` 写入该字段，模板会展示在原型卡里。Claude Code 等无画图能力的 harness **直接跳过此字段**，禁止为此调用任何外部图片服务或额外付费 API。
- `stats.agent_out_tokens_estimated` 若非空，报告会主显估算值——确认 `estimation_note` 措辞诚实清晰。
- 校验 `archetype.tagline` 与数据是否相符，可微调措辞；`archetype.id` 与维度数值不许改。
- 如发现统计层漏掉的好玩事实，可向 `badges` 追加（同样要有 `evidence`）。

## Step 5 · 脱敏第二道（人工）

```bash
python3 ~/.agentmole/scan.py redact ~/.agentmole/work/report-data.json
```

然后你**逐字段读一遍** JSON 里的所有自由文本（引文、信条证据、roast、skill 草稿），把正则漏掉的敏感信息（密钥、内部域名、真实姓名、未公开项目名等）替换为 `[REDACTED]` 或泛化表述。宁可错杀。语料里存在明文密钥是常态不是例外。

## Step 6 · 组装报告页

```bash
curl -fsSL https://agentmole.dev/template.html -o ~/.agentmole/template.html
```

把数据注入模板（整体替换占位 JSON 块）：

```bash
python3 - <<'EOF'
import re
html = open("~/.agentmole/template.html".replace("~", __import__("os").path.expanduser("~"))).read()
data = open("~/.agentmole/work/report-data.json".replace("~", __import__("os").path.expanduser("~"))).read()
html = re.sub(r'(<script id="agentmole-data" type="application/json">).*?(</script>)',
              lambda m: m.group(1) + data + m.group(2), html, flags=re.S)
out = "~/.agentmole/agentmole-report.html".replace("~", __import__("os").path.expanduser("~"))
open(out, "w").write(html)
print(out)
EOF
```

### Step 6.5 ·（可选）按 design prompt 深度风格化

模板自带 6 套主题并按原型自动套用——这一步不做也完全成立。深挖模式下建议做：

1. 获取 https://agentmole.dev/themes.json （与本文件同域，这是本步骤唯一允许的资源），找到报告实际使用主题的 `prompt` 字段——一段完整的英文样式指导，所有需要的设计语言都内联在里面，**不要去任何其他网站找风格参考**。
2. 以该 prompt 为设计参考，直接改写报告 HTML 里的 `<style>` 块——阴影、边框语言、排版层次、区块装饰都可以动，做出比 8 个变量更完整的风格表达。
3. 硬约束（违反任何一条就还原重来）：
   - 只动 `<style>`：DOM 结构 / id / `#agentmole-data` 块 / 所有 JS 一个字不动
   - 不引入任何外链资源（字体/图片/CSS 全内联）
   - 顶栏与右下角的 Agentmole logo lockup 配色不动（跨风格品牌识别）
   - 改完在浏览器里自查可读性（对比度、窄屏）

在浏览器打开（macOS `open`，Linux `xdg-open`，Windows `start`）：

```bash
open ~/.agentmole/agentmole-report.html
```

## Step 7 · 收尾（固定话术）

对用户说（路径替换为真实路径，其余一字不改）：

> 报告已生成：`~/.agentmole/agentmole-report.html`，已在浏览器打开；想公开分享的话，页面右上角一键发布。

之后可以自然地追加（可选，每条一句话以内）：
- Step 0 若发现历史蒸发未修：提醒一次「说“修”即可停止历史自动清理」。
- 「说“每周更新”，我可以帮你挂一个每周自动重扫的定时任务」（见附录 B）。

**不要**问用户「要不要公开」。发布决定属于页面上的那个按钮。

---

## 附录 A · 用户说「发布」时（降级通道）

页面按钮不可用（浏览器限制等）时，用户可直接对你说「发布」。此时且仅此时：

```bash
curl -X POST https://agentmole.dev/api/publish \
  -H 'Content-Type: text/html' \
  --data-binary @"$HOME/.agentmole/agentmole-report.html"
```

把返回的 `url` 告诉用户。发布即参与排行榜。

## 附录 B · 用户说「每周更新」时

为用户挂一个每周定时任务（用其 harness 原生机制或 crontab，示例）：

```cron
0 9 * * 1 claude -p "读取 https://agentmole.dev/skill.md 并执行；这是每周增量更新，覆盖 ~/.agentmole/agentmole-report.html 并总结与上周的差异"
```

写入前把完整 cron 行展示给用户确认。

## 附录 C · 数据契约

`report-data.json` 的完整 schema 见 https://agentmole.dev/data-contract.md （`schema_version: 2`）。榜单只消费 `stats` 白名单字段 + `archetype.id` + `camp`；「打败 XX%」按钮只发送白名单轴的数字。
