内容
<!-- mcp-name: io.github.ohad6k/ditto -->
<p align="center"><img src="assets/ditto.png" width="360" alt="Ditto"></p>
<h1 align="center">Ditto</h1>
<p align="center"><b>你的 AI 代理表现得就像刚刚认识你一样。Ditto 解决了这个问题。</b></p>
<p align="center">
<img src="https://img.shields.io/github/stars/ohad6k/ditto?style=for-the-badge&color=3a3a3a&labelColor=141414&logo=github&logoColor=white&cacheSeconds=1800" alt="stars">
<a href="https://discord.gg/QMnYtVcxk2"><img src="https://img.shields.io/badge/discord-join-3a3a3a?style=for-the-badge&labelColor=141414&logo=discord&logoColor=white" alt="discord"></a>
<img src="https://img.shields.io/badge/license-MIT-3a3a3a?style=for-the-badge&labelColor=141414" alt="MIT">
<img src="https://img.shields.io/badge/python-zero_deps-3a3a3a?style=for-the-badge&labelColor=141414&logo=python&logoColor=white" alt="Python, zero dependencies">
<img src="https://img.shields.io/badge/works_with-claude_·_codex_·_cursor_·_copilot-141414?style=for-the-badge&labelColor=3a3a3a" alt="works with claude, codex, cursor, copilot">
</p>
你的实际编码代理会话已经包含了你从未写下的规则:什么意味着“完成”,你一眼就能拒绝什么,如何调试,如何设计 UI,以及你实际工作时如何编写代码。
Ditto 从这些会话中提取精选的证据 —— 来自 Claude Code、Codex、Copilot CLI 和 OpenCode 日志开箱即用 —— 到一个私人工作配置文件中,你的代理在每次任务前都会读取该配置文件。工作、设计和写作的独立层意味着为正确的任务加载正确的部分。
## 不是记忆
记忆是你明确告诉模型的内容。
Ditto 挖掘你的工作已经证明的关于你的内容:你拒绝什么,“完成”意味着什么,你何时要求证明,你如何说话当你实际工作,以及使你停止任务的代理行为。
这就是为什么它读取原始会话日志,而不是你的 `CLAUDE.md` 或规则文件。
## 真实的运行
一行代码适用于同一个代理,两次:**“帮助我在 reddit 上发布 ditto。”** 一次是冷启动,一次是加载 Ditto 配置文件。
<table>
<tr>
<th width="500">🡒 代理</th>
<th width="500">🡒 代理 + ditto</th>
</tr>
<tr valign="top">
<td>
这是我会怎么玩。
**子版块:** r/ClaudeAI 和 r/ChatGPTCoding 是你的核心受众。r/LocalLLaMA 适合本地角度。r/cursor, r/SideProject, r/opensource 用于扩大影响。不要同时发布到所有板块 —— 发布到一个板块,调整标题,几天后再发布。
**标题:** 我构建了一个本地工具,读取你的 AI 编码日志并编写一个“你.md”文件,你的代理在每次任务前都会读取它
<details open>
<summary>完整回复</summary>
**标题(选择每个子版块):**
- 我构建了一个本地工具,读取你的 AI 编码日志并编写一个“你.md”文件,你的代理在每次任务前都会读取它
- ditto: 从你的 Claude Code 历史中挖掘出一个配置文件,让你的代理像你一样编码(本地,开源)
**正文:**
> 每个新鲜的代理会话都从零开始 —— 它不知道你如何工作,所以你每次都必须重新解释。所有这些都已经在你的会话日志中。所以我构建了 **ditto**:它读取你的历史,挖掘你如何决策和说话,并编写一个“你.md”文件,你的代理在每次任务前都会读取它。
> - 在本地运行,你的日志永远不会离开你的机器
> - 在处理前删除机密信息
> - 开源:[链接]
还要注意:用痛点而不是产品来开启,快速在第一小时内回复,添加演示 gif,并正确标记。
</details>
</td>
<td>
首先是洞察:挖掘的数字是你的整个帖子。“我阅读了 1,656 个会话”是一种坦白,而不是推销,而且没有人会滚动浏览过去坦白。所以用镜子而不是机制来开头。
一个子版块,而不是五个 —— 一个技能子版块,人们来这里寻找这个东西,而不是争论它。
**标题:** 我从 8 个月的 Claude Code 会话中构建了一个 Claude 技能
<details open>
<summary>完整的帖子</summary>
**正文:** 我每天都使用 Claude Code 和 Codex。8 个月,独自一人。每个会话都会被记录,但我从未真正回顾过它们。
然后我意识到那些日志可能是最诚实的记录,记录了我如何实际工作。不是我的 CLAUDE.md,不是我的文档,不是我记得要写的规则。而是实际的会话。
所以我构建了 ditto。
我做了什么:从我的本地 Claude/Codex 日志中提取了我输入的每个消息。剥离了工具输出、粘贴的错误、文件转储和助手回复。只保留了我的话。结果大约有 1,656 个会话和几乎 3M 个代币。
然后我将它分成块,让代理读取每个切片。每个切片都提取了诸如我如何定义完成、我拒绝什么样的代码、何时要求证明、是什么让我停止任务以及我实际工作时如何说话等模式。
然后我将重复的特征合并成一个 you.md 文件。
有用的部分是它作为 Claude 技能安装。所以现在我不用从头开始每个任务,Claude 先读取我的配置文件,已经知道我如何工作。
这不仅仅是记忆。记忆是你告诉模型的内容。这是更像挖掘你的工作已经证明的关于你的内容。
</details>
</td>
</tr>
</table>
我在 r/ClaudeSkills 上发布了它,内容如下:
<p align="center"><img src="assets/reddit-proof.png" width="460" alt="Ditto 加载的代理写的帖子:200 赞同票,32 条评论,102K 浏览量"></p>
<p align="center"><strong>200 赞同票 · 32 条评论 · 102K 浏览量</strong><br>
<sub>来自一个没有关注者的账户。冷启动计划是合理的。加载计划知道用户的声音 —— 而且有效。</sub></p>
## 它发现了什么
挖掘出的规则类型,每个都有实际会话的证据支持:
> **完成意味着它实时运行。** 永远不要相信代码编辑后的“完成”。必须先展示运行结果。
>
> **修复一个问题。** 重写或“清理”不相关的代码总是被拒绝。
>
> **构建速度比理解构建内容的速度快** —— 然后要求代理解释自己的系统。
>
> **对重复的请求感到沮丧**,直到它成功,而不是升级。
没有人写下这些规则。它们来自一个人的历史记录,并且有证据支持。
> 这是一个例子。你的配置文件是从你的日志中挖掘的,内容会有所不同。
## 卡片
挖掘完成后,`python ditto.py --card` 将你的配置文件渲染成一张可分享的卡片:原型、排名靠前的定律、会话统计和一个鲜明的事实。
<p align="center"><img src="assets/card.png" width="460" alt="Ditto 配置文件卡片:原型、定律、会话统计和鲜明的事实"></p>
分享卡片或一个简短的特征,而不是你的完整配置文件。
## 快速入门
安装跨代理引导程序 —— 在 Claude Code 和 Codex 中运行,并通过显式适配器为 Cursor 和 Gemini 安装配置文件:
```bash
npx skills add ohad6k/ditto@ditto
```
然后告诉你的代理:
```text
run ditto
```
这将安装引导程序并创建一个只读的全历史挖掘计划。你的代理必须显示成本并在模型工作前等待批准。它不会安装原生命名空间路由。
### 原生 Codex 插件
原生插件添加了 `ditto:mine`、`ditto:work`、`ditto:design` 和 `ditto:write`:
```bash
codex plugin marketplace add ohad6k/ditto --ref v0.3.7 --json
codex plugin add ditto@ditto --json
```
插件安装命令本身不会扫描日志,不会写入私有配置文件状态,也不会安排模型调用。要求代理安装、运行或更新 Ditto 仍然会消耗主机交互及其正常的系统和工具开销。
### 原生 Claude Code 插件
Claude Code 插件公开了相同的四个技能。从 Claude Code 中安装它:
```text
/plugin marketplace add ohad6k/ditto
/plugin install ditto@ditto
```
## MCP 服务器
Ditto 还附带了一个模型上下文协议(MCP)服务器,因此任何 MCP 客户端 —— Claude Desktop、Cursor 和其他代理 —— 都可以在任务前加载你的配置文件。服务器通过 stdio 实现 MCP,并公开一个工具 `load_ditto_profile`,该工具通过模型上下文协议返回你的挖掘工作、设计或写作配置文件。
使用发布的软件包运行它:`uvx ditto-cli mcp`,或从检出运行:`python ditto.py mcp`,并将 MCP 客户端指向它:
```json
{
"mcpServers": {
"ditto": { "command": "uvx", "args": ["ditto-cli", "mcp"] }
}
}
```
MCP 服务器是仅限标准库的,它提供你已经在本地挖掘的配置文件;它不进行任何网络调用。
## 运行它时会发生什么
Ditto 首先打印一个只读计划:
```json
{
"valid_sessions": "--",
"post_dedupe_source_tokens": "--",
"mode": "full",
"profile_scope": "full_profile",
"quality_default": true,
"candidate_index": null,
"selected_source_tokens": "--",
"planned_worker_calls": "--",
"planned_reducer_calls": "--"
}
```
完整历史的质量默认值读取所有合格的历史。Ditto 显示确切的计划,并在任何工作线程或缩减器运行前等待批准。缓存的报告会被重用,因此显示的剩余成本会随着时间的推移而减少。
如果你明确想要一个更便宜的初步了解,可以要求 `run ditto quick preview` 或使用 `--preview`:
```bash
python ditto.py plugin preflight --preview
```
快速预览从选定的历史中创建一个启动配置文件,而不是完整的配置文件。
快速预览的阶梯是:
| 候选人 | 新源文本 | 最大计划通过次数 |
|---|---:|---:|
| 4 × 25K | 100K 代币 | 4 个工作线程 + 1 个缩减器 |
| 6 × 25K | 至多 150K 代币 | 至多 6 个工作线程 + 1 个缩减器 |
| 8 × 25K | 160K 代币硬上限 | 至多 8 个工作线程 + 1 个缩减器 |
冻结的校准仅恢复了 22 个所需特征中的 5 个。因此,除非未来运行通过所有 22 个冻结要求,否则快速预览不能被描述为质量默认值。永久的非私有基线位于 `tests/fixtures/bounded-calibration-baseline.json` 中。
第一次真正的全历史发布挖掘恢复了 12 个相同的 22 个冻结要求:工作 `5/10`,设计 `5/5` 和写作 `2/7`。完整历史仍然是质量默认值,因为它在召回方面实质性地改进了预览,而不是因为它保证了完整的个人模型。验证包仅保留支持的规则;缺少的特征需要未来的挖掘改进,而不是软化的分数。
在更新时,不更改的段和证据哈希会被重用。相同的更新计划零个额外的 Ditto 挖掘通过。新的历史计划仅影响完整历史工作加一个缩减器。
这些是选定的源代币和计划的工作线程/缩减器通过次数,而不是提供商的计费事件。Ditto 无法衡量提供商的系统提示、工具流量、编排开销或专有订阅份额的百分比。
### 实验性自适应召回
通过显式 `--stage A`,接收者显著性和侦察员流水线对开发人员可用,但它是实验性的,不用于插件发布、质量默认值、更新或校准。
## 使结果值得信赖的原因
- 只有实际用户创作的 `.jsonl` 消息会被挖掘。`AGENTS.md`、`CLAUDE.md`、内存文件和键入的自我描述被拒绝为源证据。
- 每个有界工作线程涵盖工作、设计和写作,包含一个验证报告。
- 引语必须是简短的、带日期的、逐字逐句的已知会话 ID 引用。
- 推断的规则需要至少两个不同的会话,并且在可用时,还需要两个源/时间层。
- 一个未矛盾的明确指令可能会作为低频证据存活下来。
- 通用填充、虚构引用、未解决的矛盾、不完整的配置文件包和损坏的缓存都会关闭。
原生加载器是故意分开的:
| 技能 | 加载 |
|---|---|
| `ditto:work` | 核心工作配置文件 |
| `ditto:design` | 核心 + 设计品位 |
| `ditto:write` | 核心 + 写作声音 |
| `ditto:mine` | 仅显式设置、更新或加深请求 |
## 隐私
Ditto 的提取器、删除、缓存和生成的配置文件保持本地。选定的删除文本由您选择的模型提供商处理。使用本地模型,整个挖掘流程可以保持本地。
`ditto.py` 本身是一个仅限标准库的文件,不进行网络调用。`skills.sh` 命令下载所选的引导程序。存储库检出之外,该引导程序仅下载 `ditto.py` 和 `MINING_PROMPT.md`,并进行 SHA-256 验证。这些下载发生在日志发现之前,不会读取任何会话数据。
删除是尽力而为的,在处理前运行。检查私有输出后再共享。共享卡片或一个简短的特征,而不是你的完整配置文件或接收附件。
参见 [SECURITY.md](SECURITY.md) 以获取确切的边界。
## 原始单文件 CLI
遗留提取器仍然可用并向后兼容:
```bash
curl -O https://raw.githubusercontent.com/ohad6k/ditto/v0.3.7/ditto.py
python ditto.py --dry-run
python ditto.py --chunks 4 --out ditto-out
```
手动适配器仍然可用:
```bash
python ditto.py --install you.md --target codex
python ditto.py --install you.md --target claude
python ditto.py --install you.md --target cursor --repo .
python ditto.py --install you.md --target agents --repo .
python ditto.py --install you.md --target gemini --repo .
python ditto.py --install you.md --target opencode
```
## 支持矩阵
| 表面 | 此版本中的状态 |
|---|---|
| Codex 原生插件 | 在四个命名空间技能中本地验证 |
| Codex skills.sh 引导程序 | 支持 |
| Claude Code skills.sh/直接适配器 | 支持 |
| Claude 原生插件 | 未声明;验证期间主机不可用 |
| Cursor / Gemini 适配器 | 通过显式安装命令支持 |
| OpenCode | 双向验证:从其 SQLite 存储区挖掘会话,并从其全局规则安装配置文件 (`--target opencode`) |
| OpenClaw / Hermes Agent | 配置文件技能发现本地验证;[指南](docs/OPENCLAW_HERMES.md) |
## 更新和通知
运行 `update ditto` 以重用稳定缓存并仅计划更改的工作。
GitHub 星标会记录存储库,但不会订阅您发布。要接收发布通知,请在 GitHub 上选择 **Watch → Custom → Releases**。
## 限制
- Ditto 模拟您的工作、设计和写作。它不会使底层模型更智能。
- 稀疏或重复的历史可能会留下设计或写作不活跃。Ditto 报告确切的目标加深指令而不是编造角色。
- 提供商代币会计在 Ditto 的确切测量之外。
- 基准、排行榜和证明视频是单独的后续版本。
## 常见问题
人们反对的三件事,一次回答。
**“为什么不问 Claude 总结我的日志?”**
一次传递无法做到。我有 1,656 个会话,大约 3M 代币,原始日志大多是工具输出、文件转储和粘贴的错误。一次总结调用会烧毁该噪音。Ditto 只保留你输入的单词,每个验证段落都有自己的证据传递,并要求推断的规则至少有两个不同的会话才能存活。生成的配置文件保留会话收据而不是过时的工人计数分数。
**“Claude 已经有内存了。为什么我需要这个?”**
两者结合使用。内存是你告诉模型的内容:策划笔记、`CLAUDE.md`,它位于一个工具内。Ditto 从 Codex、Claude Code 和 Copilot CLI 读取支持的原始会话,并提取你从未写下的内容:你拒绝的内容、“完成”对你意味着什么,以及何时要求证明。输出是您拥有的普通文件,可以通过支持的代理加载。
**“Claude 只保留 30 天的日志。哪里来的 9 个月?”**
Claude Code 的保留期是一个设置(默认为 30,但默认为 30)。我的更长历史记录结合了 Claude Code、Codex 和 Copilot CLI 会话以及存档。如果您保持默认保留期,则较旧的 Claude 会话可能会在 Ditto 看到它们之前被删除。提高保留期,然后挖掘剩余的内容。
## 路线图
参见 [ROADMAP.md](ROADMAP.md) 以获取故意推迟的内容。
## 社区
- [分享 Ditto 发现的内容](https://github.com/ohad6k/ditto/issues/1)
- [Discord](https://discord.gg/QMnYtVcxk2)
## 许可证
MIT。由 [@ohad6k](https://github.com/ohad6k) 制作。