type
Post
status
Published
date
Apr 22, 2026
slug
zero-claw-zh
summary
用 Claude Code 模拟 openclaw 风格的个人助理——补齐心跳、记忆、进化三件事,知识库走 Karpathy 的 LLM Wiki。
tags
工具
Agentic Engineering
category
Agentic Engineering
icon
password
priority
3
为什么做 zero-claw
openclaw 我一直在用,底层挂 Claude 订阅,前不久被封号了。换成 minimax 的 API——不算便宜,能力还偏弱,用着不顺手。
Claude Code 推出了 channel 机制,把外部消息源作为 channel 接进 session。那一刻发现半个 claw 的雏形就在那里。于是我开始用 Claude Code 模拟 openclaw。
用了几周,效果出乎意料地好。底层是 claude 订阅(不按 token 计费),1M context,skill 生态和 MCP 工具链都现成。问题是 channel 机制对主动输入 claude 命令有限制,稳定性也不足。我加了一个 Supervisor 来补这一层,实现多 agent 看管。
几周下来,它已经不只是对齐了 openclaw——它变成了一个可以随 git 搬家的个人助理和知识库。我自己已经拿它完全替代了 openclaw 在日常用,顺手也开源出来:zero-claw。
快速上手
如果你已经有 claude 订阅、还有余量,zero-claw 就是为这个场景做的——把订阅额度变成一个 openclaw 风格的个人助理:持续记忆、自我进化、可选知识库。
在一个 Claude Code session 里依次跑:
/zero-claw:setup 是一个向导,会问你要 BotFather 的 bot token 和自己的 Telegram user_id,生成 ecosystem.config.cjs,用 pm2 起进程,可选再加一个监督 bot。之后 ./start.sh,就可以在 Telegram 上和主 bot 对话了。之前在用 openclaw 的话,zero-claw 自带一个
migrate-from-openclaw 技能,可以把原有配置和数据迁过来。zero 的设计理念
"zero" 的核心是粘合已有的工具,而不是重造轮子——让组合出来的个人助理随着每一个工具能力变强而变强。Claude Code 已经把两件最贵的事做完了:
- 最强的 Agent 大脑:Opus + 1M context
- 成熟的编排工具:skills 生态、MCP、channel、CronCreate、sub-agent
剩下的问题是,一个合格的个人 AI 助理还缺什么。答案不长,三件:心跳(自己推进时间)、记忆(状态跨 session 持久化)、进化(自己修自己)。zero-claw 就只做这三件事,再加一个可选的知识库模块(用 Karpathy 的 LLM Wiki 思路)。
具体约束是:
- 行为全用 markdown 描述(CLAUDE.md、HEARTBEAT.md、SLEEP.md、SOUL.md),不写框架代码
- 状态全部 git 追踪——journal、memory、wiki 都是纯 markdown
- 不做平台抽象层——Claude Code 本身升级了,zero-claw 的能力自动跟着升级
- 自定义代码只做稳定性和命令控制(如重启),大脑和编排完全交给 Claude Code
Supervisor:稳定性和命令控制
openclaw 配了一个 web 端做管理面板,仔细想想其实没必要。用 openclaw 时,web 上能做的事其实也不多——要装什么、配什么,直接跟 bot 讲它自己会去处理;web 真正不可替代的只有一件:触发重启。zero-claw 沿用这个模式——日常需求跟主 bot 说,只有需要重启生效、重塑状态时才用 Supervisor 介入。
Supervisor 只做两件事:稳定性(watchdog)和命令控制(
/restart、/status、/logs、/send <text>)。稳定性这边,claude 进程偶尔会崩、Telegram plugin 的子进程也会掉,失联后整个 session 就静默了;watchdog 负责发现并把它救回来。命令控制这边,claude 和 openclaw 一样偶尔需要重启,也需要把一句话主动塞进 session——后者刚好补上 channel 机制不允许主动输入 claude 命令的短板。实现上,tmux 包住 claude,外面一个 Node.js 进程做看管。两个入口共用一套 dispatcher:Telegram 上的监督 bot,和本地 CLI(headless 模式下通过 Unix socket 通信)。
说到底,Supervisor 就是一个简易的控制台——把 channel 从"能跑"变成"能活下去、能被控制",让后面的心跳、记忆、进化有一个稳定的宿主。
心跳
心跳是 bot 自己的主动脉搏,不是被用户消息触发的。主 bot 启动时,它调用 Claude Code 的 CronCreate 给自己注册一个小时级 cron(醒着的时段 8 点到 23 点),每次回调就一句话:
Read HEARTBEAT.md and follow it.HEARTBEAT.md 是一份普通的 markdown 清单,bot 按清单做事:
- 给 Telegram 发一句在线状态(MCP 断线就跳过)
- review 上一小时的对话
- 把事件写进
journal/YYYY-MM-DD.md,格式是- HH:MM 描述 (skills: x, y) (candidate-skill: foo),skill tag 后面进化时会用
- 如果上一小时有长期关系性内容,直接写到
memory/*.md
- 如果配置了知识库 vault,跑一次 llm-wiki 的 Capture/Ingest/Recompile
心跳的边界很明确:"上一小时的、便宜的、当下能做的工作"。真正需要深度反思的动作放到夜里的 sleep。
记忆:memory follows git
助理要有持续记忆,最难的不是怎么存,是怎么迁移和升级。openclaw 升级时要手动备份——文件散在各处,没有统一的时间线。zero-claw 的整个助理状态都在同一个 git 仓库里,每一次 commit 就是一个天然 checkpoint:升级出问题直接 revert,换机器 clone 就把整个状态带走。
分层如下:
journal/YYYY-MM-DD.md:时间流水。心跳每小时追加,只追加不重写。
memory/*.md:用户与 bot 之间的关系性记忆——偏好、反馈模式、交互习惯。每个文件一个主题,带 frontmatter(type: user/feedback/project/reference)。MEMORY.md是索引,保持 200 行以内。
USER.md:用户画像(名字、时区、语言、Telegram id)。主 agent 在对话中发现新信息时反应式更新。
SOUL.md:bot 的身份和人格——名字、定位、核心职责、原则、边界。这个文件只有用户写,心跳和 sleep 都不碰。
<vault>/_wiki/:世界知识。llm-wiki 在管,下节讲。
边界很重要。memory 只装"用户-bot 关系"的东西;世界知识进 wiki;原始事件只在 journal 里,永远不回写。代码模式、git 历史、一次性任务细节一律不存——那些是 Claude Code 本来就能查的。
这里刻意没用 Claude Code 自带的 auto-memory(它存在用户 home 目录下的 Claude Code 缓存里),因为那套东西不随仓库走。portable 才是核心诉求。
进化:sleep 驱动的 evolve
白天心跳只干便宜的事,深度反思留给 sleep。这是 zero-claw 的第三件核心补充。
Sleep 是 Supervisor 驱动的,不是 bot 自己的 cron。原因是主机凌晨可能关机,bot 自己的 cron 会错过;Supervisor 在宿主开机后检查 catch-up,再把 sleep prompt 输进 TUI。Sleep 跑完不发 Telegram 消息——它把结论写进当天 journal,等早上第一个心跳再报出来。
Sleep 按 SLEEP.md 的流程走:
- review 今天和昨天的 journal(被 catch-up 唤醒时,真正的内容在昨天)
- memory 蒸馏:从 journal 里把值得长留的关系性内容提炼成
memory/*.md条目——journal 是流水,memory 是沉淀下来的结构
- 跑 evolve:skill 库自升级
- wiki lint(如果配置了 vault)
evolve 是整个进化机制里最有意思的一环。它是一个 meta-skill,作用范围严格限定在
.claude/skills/ 下的自身 skill 列表里。两种动作:- upgrade(抽象触发):只有当能用一句话说清不变式("when X, do Y")时才新增或修改 skill。候选来源是心跳在 journal 里留下的
(candidate-skill:)tag,加上过去 7 天的重复模式。核心原则是 "Evolution is abstraction, not counting."——不是看到三次类似的事就总结一个 skill,而是先能抽象出清晰规则,再做 sanity check 找到近 7 天的具体案例。
- retire(使用触发):90 天内
(skills:)tag 里零引用的 skill,过了 90 天宽限期就删除。
commit 格式是
evolve(YYYY-MM-DD): ...,没有动作就不 commit——"安静的一天没改动本来就是正确结果"。它还会在写之前检查 git log --grep='^Revert.*evolve(',避免把用户已经 revert 过的变更重新写回去。心跳、记忆、进化这三件事加起来,bot 就有了持续在时间上运转并自我改善的骨架。
知识库:llm-wiki + 反向提问式 learn
到这里只解决了"助理能记住和进化"。但助理作为知识工作者的搭档,还要能沉淀世界知识——读过的论文、看过的项目、研究过的领域。
zero-claw 的知识库直接走 Karpathy 的 LLM Wiki 理念:原始资料(论文、文章、repo)丢进 vault 的 raw 目录,LLM 把它们编译成一个结构化的 wiki——摘要、实体页、概念页、反向链接都是 LLM 写的。和 RAG 的区别在于,RAG 是每次查都重新检索一遍,wiki 是一个持续累积的、结构化的产物。
Karpathy 原版的一个关键观察是:人维护的 wiki 会随规模崩溃,因为维护成本增长得比价值快。LLM 维护的 wiki 不会——维护成本由 LLM 自己扛。
zero-claw 把这套思路落成一个 skill,五个操作:
- Capture:bot 把自己 session 里有价值的上下文存成一个新的原始文件
- Ingest:编译原始文件到 wiki 页,自动建
[[links]]反向链接,更新_wiki/index.md和_wiki/log.md
- Recompile:增量失效——
wiki-graph --diff --json算出脏页,简单页自动重编译,密集页列出来给用户审
- Query:查询时顺带把有价值的综合落回 wiki,让每次探索都有累积
- Lint:机械检查(坏链、孤岛、缺 frontmatter)和语义检查(矛盾、过时断言、缺交叉引用)
节奏上,每次心跳跑 Capture+Ingest+Recompile,每晚 sleep 跑 Lint。
知识库建起来之后还有一个问题:输入从哪来?光整理已有资料是不够的。zero-claw 的答案是一个叫
learn 的 skill,它反转了人和 LLM 的常见关系——不是你问 LLM 问题,而是 LLM 用 ZPD(最近发展区)难度自适应对话问你。触发词像"学习/搞懂/梳理/带我过一遍",进 learn 模式后它大致这么做:
- 先用 5 轮左右的探测对话,摸你的背景、目标、知识边缘
- 内部(你看不到)搭一个话题图,列出 4-8 个节点,挑出 20% 的骨干概念、3 条共识、3 条争议
- 进入"测试、校准、澄清"三拍循环——每题按你的回答调难度(答错直接降 1-2 档,连对 2 道才升 1 档)
一个 learn session 结束后,它给 bot 留下两样东西:
memory/learn/<slug>.md 存学习者状态(可续上),以及当 session 值得沉淀时,下一次心跳的 llm-wiki Capture 会把这节课蒸馏出的骨干概念、共识、争议结构写进 vault,变成 wiki 的持续输入。最好的学习不是问 LLM,而是让 LLM 问你——这句话在这里是字面意义上的机制。
助理 + 知识库
从替换 openclaw 起步,zero-claw 最后长成的样子是:
- 大脑和编排:Claude Code 提供 Opus + skill 生态 + channel + CronCreate
- 稳定性底座:Supervisor(tmux + Node.js 看管)
- 持续运转的骨架:心跳 + 记忆 + sleep 驱动的进化
- 知识库:Karpathy 的 LLM Wiki + learn 反向提问做持续输入
- 可编程的定时任务:CRONTAB.md 让用户自定义邮件摘要、新闻推送、周期性提醒等,和心跳共用同一套 CronCreate 机制
它本质上就是一个可以随 git clone 到新机器的个人 AI 助理——大脑借用 Claude Code,知识库借用 Karpathy 的思路,自己造的部分只有心跳、记忆、进化这三块缺口,和一个做稳定性与命令控制的 Supervisor。
回到 zero 的核心理念:粘合已有工具、不重造轮子——Claude Code 的大脑和编排、Karpathy 的知识库范式、git 的版本控制与迁移。粘合的好处在于,被粘合的任意一个工具变强,整个助理都跟着变强:Claude Code 放出新的 skill、更长的 context、更强的模型,zero-claw 什么都不用改就能继承。代码越少,借到的杠杆越长。