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