我用 200 行 Python 把 Claude Code 接进飞书,它开始自我迭代

6 阅读7分钟

健身间隙发一条语音,它自己改代码、重启、修复——记录 agent 从 CLI 工具升级为手机可控自治系统的全过程


昨晚健身休息,我拿起手机对着飞书机器人说了一句:

"飞书消息现在没法续聊,帮我想个办法记录上次对话。"

十分钟后,我回来看——它已经把 feishu_gateway.py 改完、重启了服务、还把这次的修改逻辑和规则写进了知识库。

我当时愣了一下。

这篇文章记录的,是它从「只能在电脑前手动操作的 CLI 工具」升级成「手机可控自我迭代系统」的那一晚,以及现在它在做什么。


技术背景:我在用什么

  • Claude Codeclaude CLI):Anthropic 的 agentic 编程工具,能读文件、改代码、跑命令、重启进程、验证结果
  • Feishu Bot(飞书机器人):通过 WebSocket 接收消息,回传结果
  • Gateway:自己写的 ~200 行 Python,连接两者的"转接器"
  • Skills.claude/skills/ 目录下的结构化任务定义,agent 的"工具箱"
  • Memorymemory/long/ + memory/scratch/,agent 的知识库和短期记忆

架构一句话:飞书 → Gateway → Claude Code → 文件系统/进程


为什么要做这个

Claude Code 在命令行里非常强——能自主完成"查代码 → 改代码 → 重启 → 验证"的完整闭环。但它有一个致命限制:你必须坐在电脑前

我想要的是另一种用法:随时随地发一句话,它自己把事推进到底。更关键的是,它要能自动记笔记、沉淀经验,让自己越用越强。


Gateway 实现:200 行接通两个世界

Gateway 的核心逻辑非常简单:

飞书消息
  → WebSocket 接收
  → 提取 user_id + content
  → 拼装 claude CLI 命令
  → subprocess 执行
  → 把输出回传飞书

image.png 关键设计决策:

① 用 claude --resume 实现续聊

Claude Code 支持 --resume <session_id> 参数接续上一次对话。Gateway 把每个用户的最新 session_id 存下来,下次消息来时带上,实现"接着聊"而不是每次新开。

# 简化示意
session_id = load_last_session(user_id)
cmd = ["claude", "--resume", session_id] if session_id else ["claude"]
result = subprocess.run(cmd + ["--print", message], ...)
save_session(user_id, result.session_id)

② clear 机制

用户发 /clear 时,主动清空 session_id,下次强制新开对话。其他情况默认续聊。

③ 进程管理

Gateway 以 daemon 方式运行,通过 Makefile 管理重启:

make gateway-restart   # 自动以正确用户身份重启

接入飞书前,必须坐在电脑前手动操作

image.png


让我惊呆的瞬间:它开始自己迭代自己

接通飞书的第一晚,gateway 还很简陋——只支持单轮对话,没有 --resume

我在健身休息时用语音说了一句需求:

"帮我记个待办:飞书消息现在没法续聊,需要想个办法。比如记录上次对话;只有我主动清除(clear)才新开会话。"

然后它做的事情,不是"给建议清单"就结束——而是像一个靠谱同事,把这条需求一路推进成了可用的能力

  1. 看清现状git status 确认代码状态,检查有没有 staged 改动
  2. 把需求写成规则:默认续聊 vs 新开的判断逻辑,clear 触发条件,异常兜底
  3. 动手实现:在 feishu_gateway.py 里增加 session 持久化 + clear 命令处理
  4. 重启验证:通过 make gateway-restart 重启,用飞书发消息验证续聊是否生效
  5. 沉淀复用:把规则和实现要点写进 memory/long/gateway.md,下次直接复用

图3:飞书对话——bot 分析完现状,主动问"提交代码 / 部署测试 / 继续开发?"

image.png

图4:重启日志——gateway 重启成功,续聊验证

image.png 从 v0(单轮无状态)到 v1(有状态续聊),整个过程我没有碰电脑。


现在它在做什么

每日工作入口

我:现在还有什么没做完?今天做什么最合适?
Bot:扫描 todo/inbox.md + 系统状态...

上午 — 工作项先清(外部依赖,趁工作时间)
  1. XX 限流/防护检查
  2. XX 上线变更

下午 — 系统修复
  3. 额度耗尽数据污染防护(P0,今早刚暴露)

傍晚 — 收尾
  4. Auto-Trader 首周报告

图5:飞书截图——"今天做什么"

image.png

告警根因分析 + 修复建议

当系统通知里有异常,它不只是转发,而是定位根因并给出可执行方案:

通知:入场价: None | 保证金: ... | 杠杆: ...

Bot 分析:
注意到关键问题:入场价显示 None,说明下单可能失败了。

找到原因:
BTC 最小下单量是 0.001 BTC(约 $66 名义),
但 $9.78 × 5x = $48.9 名义,不够最小单。

解决方案(二选一):
1. 提高单笔比例到 3%:$489 × 3% × 5 = $73.4 > $66 ✓
2. 提高杠杆到 7x:$489 × 2% × 7 = $68.5 > $66

image.png

执行闭环:从分析到下单

选定方案后,直接下指令:

我:现在就进行下单,直接触发很重要,我们节奏快一点

Bot:
Binance 最小名义是 $100 不是 $66。用 $20 保证金试:
下单成功!现在设止损止盈:

实盘测试完成!
BTC LONG 已建仓:
- 入场价:$65,996.4
- 数量:0.002 BTC(~$132 名义)
- 保证金:~$18.9(7x 杠杆)
- 止盈:$68,999(+4.55%)
- 止损:$63,799(-3.33%)

链路完整验证通过:下单 → TP/SL → 可在 Binance 查看持仓
[opus | Bash x8 | 59s | $0.980] 任务已完成

分析完直接执行,BTC LONG 建仓完成:


自我进化机制:它在没人管的时候做什么

这是我觉得最有意思的部分。

系统里有一个 self-evolve skill,会定期运行:扫描知识库、检查 todo、审计 skills,然后给我发一份"自检报告":

image.png 知识进化报告 0227 评分: 7/10 修复: 3项(tech.md skill列表、inbox/backlog过期项、调度频率描述) 关键: auto-trader绩效严重过时(记录1笔+5 vs 实际3笔-195) 建议: 额度耗尽保护机制(日均22次无效重试)

这不是我触发的。是它运行一段时间后,自己沉淀出来的习惯。

普通工具,你用多用少,它都一样。Agent 不是——你每次用它,它就多理解你一点。这个积累,只有"已经开始用"的人才有。


技术选型说明

为什么用 Claude Code 而不是其他方案?

Claude Code 的核心优势是原生的 agentic 能力:它不只是"接收 prompt → 返回文字",而是真的能操作文件系统、执行命令、管理进程。这让 gateway 可以非常薄——不需要在中间层实现任何业务逻辑,全部交给 Claude Code 处理。

为什么不用 OpenDevin / Claude Swarm 这类方案?

这些方案通常需要更重的基础设施。我的出发点是:先跑起来,再迭代。一个能用的 200 行比一个完美的 2000 行更有价值。

Skills 系统怎么用?

.claude/skills/ 下的每个目录是一个 skill,包含 SKILL.md(指令定义)和可选的脚本/资产。Claude Code 在收到相关指令时会自动加载对应 skill 的上下文。

.claude/skills/
├── writer/          ← 内容创作流程
├── fin-auto-trader/ ← 金融 agent 决策
├── self-evolve/     ← 系统自检与进化
└── ...

三个缺一不可的要素

做这套系统之后,我认为一个真正能用的 agent 闭环需要三个条件:

  1. 手机可达:不绑在电脑前,随时随地发需求
  2. 自主执行:自己检查现状 → 自己动手修改 → 自己重启验证
  3. 持续迭代:每次修复都留下记录,下次可以基于上次继续

缺了任何一个,它就还是个"工具",而不是"搭档"。


越早开始,它越快变聪明

这套东西有个复利效应——你每次用它,它就多一点上下文,多一条经验,多理解你一分。

这个"半年",从你开始用它那天算起。

别等准备好了再开始。你开始的那一刻,它才开始变好。


下一篇,你来选

A:金融 agent——每天定时"看盘 + 复盘 + 行动" 策略因子权重根据结果反馈自我调整,越跑越贴合你的风格

image.png B:2 分钟把 agent 放进手机的最简部署方法 最小化依赖,一个命令启动,先跑起来再说

评论区告诉我你更想看哪个。

如果你也在做类似的事,欢迎私信交流。