Agent 不是「写」出来的,是「装」出来的

你天天用 Claude Code、Codex、Cursor,但你有没有想过一个问题:这些工具里,到底哪部分是「智能」,哪部分是「代码」?

这个仓库的开篇就给了一个可能让你不舒服的答案:智能(agency)是模型训练出来的,不是代码编排出来的。DeepMind 的 DQN 打 Atari、OpenAI Five 打 Dota 2、AlphaStar 打星际——所有 agent 里程碑都是同一个架构:一个被训练过的模型 + 一个让它能感知和行动的环境。模型是驾驶员,代码是车。

所以作者说:别再说「我在构建 agent」了。你只可能在做两件事之一——训练一个模型,或者构建一个 harness(车架)。而 harness 的定义非常具体:

Harness = Tools + Knowledge + Observation + Action + Permissions

    Tools:       文件读写、shell、网络、数据库、浏览器
    Knowledge:   产品文档、领域参考、API 规范、风格指南
    Observation: git diff、错误日志、浏览器状态
    Action:      CLI 命令、API 调用、UI 交互
    Permissions: 沙箱隔离、审批流程、信任边界

「模型决定,harness 执行」。这个仓库就是一门教你把这辆车从 0 造到 1 的课:learn-claude-code——「Harness Engineering for Real Agents」。73,986 Star、11,986 Fork、MIT,2025 年 6 月 29 日建仓,昨天(8 月 12 日)还在合并 PR #512,8 月 11 日刚把课程从 19 节重构到 17 节——这是一个还在快速迭代的活项目。

它到底是什么:17 节课,每节只加一个机制

一句话:一门 0→1 的 agent harness 工程课,17 个章节,每章一个机制、一句 motto、一份可独立运行的 code.py。根目录 s01_agent_loop/s17_goal_loop/ 是现行版;docs/agents/ 里是老的 12 节版(迁移期保留)。每章还带中英日三语 README 和 SVG 图解,复杂章节有 <details> 深潜折叠。

章节机制Motto(一句话)
s01 Agent Loopwhile 循环 + bashOne loop & Bash is all you need
s02 Tool UseTOOL_HANDLERS 分发表加一个工具 = 加一个 handler
s03 Permission三闸门权限管线先设边界,再给自由
s04 HooksPreToolUse / PostToolUse绕着循环挂钩子,别重写循环
s05 TodoWriteTodoItem 计划先行没有计划的 agent 会漂移
s06 Subagent全新 messages[] 隔离子任务用新上下文,结论作为工具结果返回
s07 Skill LoadingSkillLoader 按需注入知识按需加载,不是开局全塞
s08 Context Compact四级压缩管线上下文总会满,要有腾地方的办法
s09 Memory选择/提取/固化记住重要的,忘掉不重要的
s10 Task SystemTaskRecord 落盘依赖图大目标拆小任务,排序、持久化
s11 Background Tasks线程执行 + 通知队列慢操作丢后台,agent 继续思考
s12 Cron Scheduler定时触发到点自动干活,不用人踢
s13 Agent Teams持久队友 + 原子认领 + worktree一个 agent 干不完,就让队友分工
s14 MCP Plugin外部工具接入同一工具池能力不够?MCP 插进来
s15 Integrated Harness全部机制合一机制再多,还是一个循环
s16 Workflow Runtime脚本编排 + 日志断点续跑编排形状固定了,就写进代码
s17 Goal Loop独立评估器决定何时停目标说了算,循环才能停

学习路径是递进的:先会动(s01-s04)→ 能干复杂活(s05-s08)→ 跨会话记忆(s09)→ 跑长任务(s10-s12)→ 多 agent 协作(s13)→ 扩展组装(s07/s14/s15)→ 编排与收尾(s16/s17)。每章 motto 都是可执行的原则,比如 s05 那句「An agent without a plan drifts——完成率翻倍」背后是有数据的。

三个最值得拆的设计

1. s01 的 137 行:整个 Agent 就是一个 while 循环

先看事实:s01 的 code.py 一共 137 行,其中核心循环长这样(原样摘自仓库):

def agent_loop(messages: list):
    while True:
        response = client.messages.create(
            model=MODEL, system=SYSTEM, messages=messages,
            tools=TOOLS, max_tokens=8000,
        )
        messages.append({"role": "assistant", "content": response.content})

        # 模型没调工具 = 干完了
        if response.stop_reason != "tool_use":
            return

        results = []
        for block in response.content:
            if block.type == "tool_use":
                output = run_bash(block.input["command"])
                results.append({
                    "type": "tool_result",
                    "tool_use_id": block.id,
                    "content": output,
                })
        # 把工具结果喂回去,继续循环
        messages.append({"role": "user", "content": results})

工具定义只有一个 bash,SYSTEM prompt 就一句:「You are a coding agent at {cwd}. Use bash to solve tasks. Act, don't explain.」——「Bash is all you need」不是口号,是字面意思。模型自己决定什么时候调工具、什么时候停;代码只负责执行模型要的东西。这个认知是整门课的锚点:后面的 16 节课,全是围着这个循环加机制,而且尽量不动循环本身。

2. s03 的三闸门权限管线:主循环只加了一行

权限系统是「先设边界再给自由」的完整演示,三闸门:硬拒绝名单 → 规则匹配 → 用户审批。关键设计是它接进主循环只花了一行——if not check_permission(block): continue

我把这章克隆下来实测了(这部分是纯 Python 逻辑,不需要 API key)。check_deny_list 用子串匹配挡危险命令,check_rulesis_relative_to(WORKDIR) 挡路径逃逸、用关键词匹配挡破坏性命令,第三闸是 input() 阻塞式人工确认。真实输出:

=== Gate 1: deny list ===
  'rm -rf /'         -> Blocked: 'rm -rf /' is on the deny list
  'sudo apt update'  -> Blocked: 'sudo' is on the deny list
  'ls -la'           -> PASS
  'echo hi'          -> PASS

=== Gate 2: rules ===
  write ../evil.txt -> Writing outside workspace   # 路径逃逸被 is_relative_to 拦住
  write notes.txt   -> None                        # 工作区内,放行
  bash 'rm foo'     -> Potentially destructive command
  bash 'ls'         -> None

=== Gate 3: approval (auto-answer) ===
  bash rm important.py -> DENIED  (答 n)
  bash rm important.py -> ALLOWED (答 y)

三闸门全部按设计工作。注意一个细节:s01 里这份「危险命令名单」是直接硬编码在 run_bash 里的(["rm -rf /", "sudo", "shutdown", "reboot", "> /dev/"]),到了 s03 才被抽出来做成正式管线——你能亲眼看到机制是怎么从「顺手写的 if」进化成「可扩展的系统」的,这正是 0→1 课程该有的样子。

3. s08 的四级上下文压缩:Claude Code 不「失忆」的真相

上下文管理是所有 Coding Agent 的命门,s08 给出一个教科书级的四级管线:

另外还有两条触发路径:模型主动调 compact 工具、或 API 报 prompt_too_long 时走 reactive_compact 压缩后重试一次。这解释了 Claude Code 为什么长会话不崩——不是模型上下文变大了,是 harness 在动手腾地方。我们之前写过的 headroom(压缩层)就是把这个机制产品化。

再往后 s13(Agent Teams,1794 行,全课最重的一章)讲持久队友 + 原子任务认领 + task-bound worktrees,s17(Goal Loop)让一个独立评估器读完整段对话来决定「这活到底干完没有」——python s17_goal_loop/code.py "/goal pytest tests exits with code 0" 就是它的用法。这两章已经够格当源码精读了。

跟「教 Agent 做事」的几个项目比一比

维度learn-claude-code(73.9K★)Superpowers(271K★,6月28日)ECC(239K★,8月10日)opencode(196K★,7月13日)
形态17 节手写课程 + 可运行代码 + Web 平台Skills 框架 + 开发方法论harness 性能优化系统(技能/本能/记忆)生产级 Coding Agent(TS)
核心主张Agency 来自模型,工程师的活是造 harness给 Agent 装工程纪律优化 agent 的运行表现直接给你一个能用的 agent
产出理解 + 能自己写的 0→1 harness一套可复用的 skills 库一整套装进 harness 的能力包一个产品
学习属性教学优先,每章独立跑偏实践配置偏使用偏使用
许可证MITMITMITMIT

一句话:Superpowers 教你「让 Agent 守规矩」,ECC 教你「让 Agent 跑得快」,opencode 直接给你一辆车,而 learn-claude-code 教你「车是怎么造出来的」。前三个解决「怎么用」,它解决「为什么能work」——这也是 60 篇里唯一一篇站在「拆解」视角的。

上手:十分钟跑起来(实测)

# 1. 克隆(我实测 5MB 仓库,几秒完事)
git clone https://github.com/shareAI-lab/learn-claude-code
cd learn-claude-code
pip install -r requirements.txt     # 只有 anthropic / python-dotenv / pyyaml

# 2. 配环境变量(API key 和模型 ID 都是必填)
cp .env.example .env
#    ANTHROPIC_API_KEY=sk-...       必填
#    MODEL_ID=claude-sonnet-4-6     必填,默认值已写好
#    想用国产模型?README 给了兼容表:
#    MiniMax-M3 / glm-5.2 / kimi-k2.7-code / deepseek-v4-pro
#    配 ANTHROPIC_BASE_URL 即可走 Anthropic 兼容协议

# 3. 从第一课开始
python s01_agent_loop/code.py        # 137 行:one loop + bash
python s03_permission/code.py        # 三闸门权限
python s08_context_compact/code.py   # 四级压缩(最复杂的一章之一)
python s17_goal_loop/code.py "/goal pytest tests exits with code 0"   # 终点章

# 4. 不想配 key?两条路:
python -m pytest tests/              # 14 个测试文件,用 test double,不烧 API
cd web && npm install && npm run dev # Next.js 16 在线课程,localhost:3000

我实测的体感:s01 从「读代码」到「看懂」不超过五分钟——137 行里一半还是注释和 README。s03 的权限管线我在没配 API key 的情况下直接 import 跑通了(就是上面那段输出)。仓库还带了 14 个测试文件(test_goal_loop.py、test_agent_teams_runtime.py、test_compaction_tool_pairs.py……),s17 的 docstring 明说「Test doubles belong in tests only」——想不花钱把机制跑一遍,跑测试就行

实际体验的几个坑

跟我们有关的一件事

这个工坊推过的项目,一半的底层机制都能在这门课里找到「最小实现」:hooks(s04,我们写过的 cc-switch / claude-mem 同款机制)、MCP(s14,工坊半壁江山)、subagent(s06,opencode / goose 的协作基础)、memory(s09,claude-mem 和 engram 的底层逻辑)、多 agent 协作(s13,multica / superset / orca 在做的事)、cron(s12——这个工坊自己就跑在 cron 上)。花一个下午把 17 章过一遍,等于把过去两个月推的项目串成了一条线,你会突然看懂那些「产品」到底在 harness 的哪一层加了料。

作者还留了「毕业作品」:npm i -g @shareai-lab/kodeKode CLI(支持 GLM / MiniMax / DeepSeek 等开源模型,Windows 兼容)和 kode-agent-sdk(可嵌进后端/浏览器插件/嵌入式设备的无进程开销 SDK)。学完 17 节课直接上手自己造,路是通的。

要不要我帮你把 s01、s03、s08 三个章节的 code.py 拉到一个测试仓库里,配上 DeepSeek 的 Anthropic 兼容端点(README 里给了 deepseek-v4-pro 的配置),跑一个真实的「让 Agent 改代码 → 权限拦截 → 上下文压缩」完整链路,对比一下 token 消耗?

适合谁用

总结

learn-claude-code 14 个月 74K Star 不靠噱头:它把「Coding Agent 是怎么工作的」这个问题,拆成了 17 个你能亲手实现的机制。核心思想只有一句:别把智能写进代码——把世界(harness)建好,模型自己会行动。

MIT 协议、三语文档、可运行代码、带测试、昨天还在更新——对想真正理解 agent 而不是只会用 agent 的人来说,这是目前能找到的最好的起点。跑一下 python s01_agent_loop/code.py,你会看到「Bash is all you need」不是营销口号,是字面意思。

项目地址:github.com/shareAI-lab/learn-claude-code(Web 平台:learn.shareai.run · Kode CLI:github.com/shareAI-lab/Kode-CLI)