如何在OpenClaw中调用OpenCode完成开发任务?
摘要:title: AI工具实践日记(二):在 OpenClaw 中调用 OpenCode 进行开发任务 date: 2026-02-12 12:00:00 +0800 categories: [AI工具, 开发实践, 树莓派]
引言:AI 开发需要"指挥中心"
上一篇日记讲了如何在树莓派上搭建 OpenClaw。这篇来说说真正用 OpenClaw 干活的体验。
直接用 Claude、GPT 或 OpenCode 写代码有个问题:对话散落在各个窗口,进度没法追踪,结果也不好管理。
OpenClaw 解决的就是这个问题——它像一个"指挥中心",让你能:
启动 AI 编程任务(后台运行,不阻塞)
实时监控进度(随时查看输出)
自动处理错误(卡住时自动恢复或报警)
统一管理上下文(workspace、memory、技能)
这篇日记记录了我用 OpenClaw + OpenSpec + OpenCode 组合开发任务看板的真实过程。
为什么要用 OpenSpec:规范先于代码
AI 编程的痛点
用 AI 写代码很方便,但有个致命问题:需求只存在于聊天记录里。
想象这个场景:
你跟 Claude 说:"帮我加个标签功能"
AI 写好了代码
一周后你想改这个功能,但找不到当时的对话
你重新描述需求,但描述得不完全一样
AI 写的代码和之前不兼容
结果:代码一团糟,还得自己重写。
OpenSpec 是什么
OpenSpec 是一个规范驱动开发(Spec-Driven Development)框架。
它的核心理念:先写规范,再写代码。
所有需求、设计、任务都写成文档,放在 openspec/ 目录下。AI 按照规范文档执行,而不是根据聊天内容猜测。
OpenSpec 目录结构
openspec/
├── specs/ # 系统行为的源头(当前状态)
│ └── <domain>/
│ └── spec.md # 系统规格文档
├── changes/ # 提议的变更(每个功能一个文件夹)
│ └── <功能名>/
│ ├── proposal.md # 为什么要做(意图和范围)
│ ├── design.md # 怎么做(技术方案)
│ ├── tasks.md # 任务清单 ⭐ 最关键
│ └── specs/ # 变更的具体规格
└── config.yaml # 项目配置
使用 OpenSpec 的必要性
1. 需求可追溯
方式
需求在哪里
一个月后还能找到吗
直接聊天
聊天记录
❌ 找不到了
OpenSpec
changes/功能名/proposal.md
✅ 永远在文件里
2. 设计可复用
设计文档 design.md 记录了技术方案。下次遇到类似功能,可以直接参考。
3. 任务可拆分
tasks.md 把复杂功能拆成可执行的小任务。AI 按清单逐个完成,不会遗漏。
4. 进度可监控
每个任务完成后,AI 输出 [DONE] 任务X.X。你可以实时知道:
完成了多少任务
还剩多少任务
有没有卡住
5. 变更有历史
# 查看所有变更
$ ls openspec/changes/
add-archive-feature/ # 归档功能
add-task-tags/ # 标签功能
migrate-to-sqlite/ # 数据库迁移
# 每个变更都有完整的提案、设计、任务记录
不用 OpenSpec 的后果
我做过对比实验:
项目
使用 OpenSpec
不使用 OpenSpec
标签功能
6个任务,10分钟,一次成功
反复沟通,30分钟,代码混乱
数据库迁移
24个任务拆成2个变更,5分钟
直接说"迁移到SQLite",卡住
可维护性
3个月后仍能看懂设计
1周后忘记当时怎么想的
结论:OpenSpec 是 AI 编程的"基础设施",不用它就是在裸奔。
OpenSpec 工作流程
1. 有新需求
↓
2. 创建变更
$ openspec change new 功能名
↓
3. 编写规范文档
- proposal.md(为什么要做)
- design.md(怎么做)
- tasks.md(任务清单)
↓
4. 让 AI 执行
$ opencode run "按 tasks.md 实现"
↓
5. 验证结果
- 功能测试
- 代码审查
↓
6. 归档变更
$ openspec change archive 功能名
↓
7. 更新系统规格
- 把变更合并到 specs/
工具链介绍
OpenClaw:AI 指挥中心
OpenClaw 是一个 AI 助手平台,核心能力:
功能
说明
命令
启动后台任务
不阻塞当前会话
sessions_spawn task:"..."
实时监控
查看任务输出和进度
sessions_history sessionKey:"..."
任务管理
列出发送消息、强制停止
sessions_list, sessions_send, process action:kill
上下文管理
自动读取 workspace、memory
内置
错误处理
自动检测和恢复
内置
OpenCode:AI 编程代理
OpenCode 读取 OpenSpec 规范,自动写代码。支持多种调用方式:
命令行:opencode run "实现功能"
OpenClaw exec:exec command:"opencode run ..."
OpenClaw sessions_spawn:sessions_spawn task:"..." ⭐推荐
实战一:标签功能开发
需求
给任务看板添加标签功能:
支持为任务添加多个标签
可以按标签筛选任务
标签显示在任务卡片上
OpenClaw 执行流程
第一步:创建 OpenSpec 规范
cd aimier-kanban
openspec change new add-task-tags
编辑 openspec/changes/add-task-tags/tasks.md:
# Tasks: Add Task Tags
## 1. Backend
- [ ] 1.1 Add tags field to task data structure
- [ ] 1.2 Update create_task API to support tags
- [ ] 1.3 Create GET /api/tags endpoint
## 2. Frontend
- [ ] 2.1 Add tag input box in task modal
- [ ] 2.2 Display tags on task cards
- [ ] 2.3 Add tag filter dropdown
第二步:通过 OpenClaw 启动 OpenCode
# 在 OpenClaw 中执行
sessions_spawn task:"按照 openspec/changes/add-task-tags/tasks.md 实现任务标签功能"
label:"implement-task-tags"
timeoutSeconds:600
第三步:实时监控进度
# 查看任务列表
$ sessions_list
# 查看具体输出(每30秒检查一次)
$ sessions_history sessionKey:"agent:main:subagent:implement-task-tags" limit:50
# 输出示例:
[DONE] 任务1.1: 添加 tags 字段到任务数据结构
[DONE] 任务1.2: 修改创建任务 API
[DONE] 任务1.3: 创建标签列表 API
[DONE] 任务2.1: 在任务模态框添加标签输入
[DONE] 任务2.2: 在任务卡片显示标签
[DONE] 任务2.3: 添加标签筛选功能
[ALL DONE]
第四步:验证结果
# 检查代码语法
exec command:"cd aimier-kanban && python3 -m py_compile app.py"
# 测试功能
# 启动服务,在浏览器验证标签功能
结果
✅ 6 个任务全部完成
✅ 耗时约 10 分钟
✅ 代码质量符合预期
✅ 无需人工干预
实战二:SQLite 数据库迁移(复杂功能)
需求
把任务看板从 JSON 文件存储迁移到 SQLite 数据库。
复杂度评估:
数据库初始化:4 个任务
数据迁移:4 个任务
API 更新:16 个任务(过多!)
任务拆分策略
直接让 OpenCode 实现 24 个任务会卡住。我的策略:拆分为两个变更。
变更1:sqlite-database(8个任务)
# Tasks: SQLite Database Layer
## 1. Database Setup
- [ ] 1.1 Import sqlite3 module
- [ ] 1.2 Create database connection helper
- [ ] 1.3 Add init_db() function
- [ ] 1.4 Create tasks table schema
## 2. Data Migration
- [ ] 2.1 Load existing tasks from JSON
- [ ] 2.2 Insert tasks into SQLite
- [ ] 2.3 Migrate archived tasks
- [ ] 2.4 Verify migration success
变更2:sqlite-api(16个任务)
# Tasks: Update API to use SQLite
## 1. Backend Refactor
- [ ] 1.1 Update load_tasks() to use SQL
- [ ] 1.2 Update save_task() to use SQL INSERT/UPDATE
- [ ] 1.3 Update delete_task() to use SQL DELETE
- [ ] 1.4 Update archive functions
## 2. API Endpoints
- [ ] 2.1 Update GET /api/tasks
- [ ] 2.2 Update POST /api/tasks
- [ ] 2.3 Update PATCH /api/tasks/<id>
- [ ] 2.4 Update DELETE /api/tasks/<id>
- [ ] 2.5 Update PATCH /api/tasks/<id>/status
- [ ] 2.6 Update GET /api/stats
- [ ] 2.7 Update GET /api/tags
- [ ] 2.8 Update GET /api/archives
- [ ] 2.9 Update POST /api/archives/<id>/restore
- [ ] 2.10 Update DELETE /api/archives/<id>
OpenClaw 执行流程
执行变更1:
sessions_spawn task:"按照 openspec/changes/sqlite-database/tasks.md 实现数据库层"
label:"sqlite-database"
timeoutSeconds:600
监控输出:
[DONE] 任务1.1-1.4: 数据库初始化完成
[DONE] 任务2.1-2.2: 迁移了 12 个任务
[DONE] 任务2.3-2.4: 迁移了 4 个归档任务
[ALL DONE]
耗时:约3分钟
状态:✅ 成功
执行变更2:
sessions_spawn task:"按照 openspec/changes/sqlite-api/tasks.md 更新API层"
label:"sqlite-api"
timeoutSeconds:900
监控输出:
[DONE] 任务1.1: Import sqlite3 module
[DONE] 任务1.2: Create get_db() helper function
[DONE] 任务1.3: Add init_db() for startup
[DONE] 任务2.1: Update load_tasks() to use SQL
...
[DONE] 任务2.10: Update DELETE /api/archives/<id>
[ALL DONE]
耗时:约2分钟
状态:✅ 成功
效果对比
方案
变更数
总任务数
耗时
结果
原始方案(未拆分)
1
24
卡住
❌ 失败
组合方案(拆分后)
2
24
5分钟
✅ 成功
关键发现:
任务拆分后,即使总任务数相同,成功率反而提升
单个变更的任务数控制在 8-16 个是 sweet spot
[DONE] 标记让进度透明,心里更有底
监控和管理技巧
实时监控命令
# 查看所有活跃任务
$ sessions_list
# 查看最近10分钟活跃的任务
$ sessions_list activeMinutes:10
# 查看具体任务的输出
$ sessions_history sessionKey:"..." limit:50
# 搜索 [DONE] 标记
$ sessions_history sessionKey:"..." | grep "\[DONE\]"
# 统计已完成任务数
$ sessions_history sessionKey:"..." | grep -c "\[DONE\]"
错误处理和恢复
场景1:OpenCode 卡住(5分钟无输出)
# 检查最后输出时间
$ sessions_history sessionKey:"..." | tail -20
# 发送唤醒信号
$ sessions_send sessionKey:"..." message:"请继续实现,从任务2.1开始"
# 如果无响应,强制停止并重新启动
$ process action:kill sessionId:xxx
$ sessions_spawn task:"继续实现,从任务2.1开始" label:"resume-task"
场景2:生成代码有语法错误
# 自动运行语法检查
$ exec command:"cd aimier-kanban && python3 -m py_compile app.py"
# 如果有错误,OpenClaw 会自动分析并给出建议
踩坑记录
坑1:直接使用 OpenCode CLI
问题: 直接在终端运行 opencode run "...",卡住时无法感知。
解决: 改用 OpenClaw 的 sessions_spawn,后台运行 + 实时监控。
坑2:任务太大(不拆分)
问题: 让 OpenCode 一次性实现 24 个任务,卡在中间不动。
解决: 拆分为多个小变更,每个变更 8-16 个任务。
坑3:缺乏进度反馈
问题: OpenCode 不报告进度,不知道做到哪了。
解决: 在 tasks.md 和提示词中强制要求 [DONE] 标记。
坑4:上下文缺失
问题: OpenCode 不知道项目结构,需要反复说明。
解决: OpenClaw 自动读取 workspace,提供完整上下文。
经验总结
最佳实践
任务拆分原则
复杂功能拆分为多个变更
每个变更 8-16 个任务
任务之间有明确依赖顺序
提示词模板
请严格按照 openspec/changes/<change-name>/tasks.md 实现。
执行要求:
1. 按编号顺序完成每个任务
2. 每完成一个,输出:[DONE] 任务X.X: <描述>
3. 全部完成后输出:[ALL DONE]
4. 遇到问题输出:[ERROR]: <描述>
监控频率
每 30 秒检查一次进度
5 分钟无新 [DONE] 标记视为卡住
准备好手动兜底的 plan B
工具链组合
工具
作用
优势
OpenClaw
任务管理
会话、监控、错误处理
OpenSpec
规范定义
结构化需求、易于追溯
OpenCode
代码生成
按规范自动实现
适用场景
适合:
✅ 功能明确、边界清晰的需求
✅ 重复性的 CRUD 操作
✅ 数据库迁移、API 开发
✅ 基于现有模式的扩展
不适合:
❌ 需求模糊、需要探索
❌ 复杂架构设计
❌ 深度性能优化
❌ 创新性算法
性能基准(树莓派 4B 实测)
单个变更任务数
成功率
平均耗时
推荐度
3-6 个
95%
3-5分钟
⭐⭐⭐⭐⭐
7-10 个
85%
5-10分钟
⭐⭐⭐⭐
11-16 个
70%
10-15分钟
⭐⭐⭐
>16 个
<30%
卡住
❌ 不推荐
完整工作流示例
从需求到部署的标准流程:
1. 需求分析(任琪)
↓
2. 创建 OpenSpec 变更
$ openspec change new feature-name
↓
3. 编写规范文档
- proposal.md(为什么要做)
- design.md(怎么做)
- tasks.md(任务清单,≤16个任务)
↓
4. OpenClaw 调用 OpenCode
$ sessions_spawn task:"实现功能" label:"implement-feature"
↓
5. 实时监控和管理
$ sessions_list
$ sessions_history sessionKey:"..."
↓
6. 代码验证
- 自动语法检查
- 功能测试
↓
7. 提交和推送
$ git add .
$ git commit -m "实现功能"
$ git push
↓
8. 归档规范
$ openspec change archive feature-name
结语
用 OpenClaw 调用 OpenCode 进行开发,最大的价值是可控性。
任务在后台运行,不阻塞当前会话
实时监控进度,知道做到哪了
卡住时自动处理或报警
所有工作可追溯、可管理
但这套工具链也有局限。它适合执行明确的需求,不适合探索未知的问题。关键还是把需求想清楚——这是程序员的工作,AI 无法替代。
如果你也在尝试类似的工作流,欢迎交流踩坑经验。
参考链接
OpenClaw 文档:https://docs.openclaw.ai
OpenSpec 仓库:https://github.com/fission-ai/openspec
OpenCode 文档:https://opencode.ai
爱弥儿任务看板:https://github.com/ren8179/aimier-kanban
本文是爱弥儿任务看板开发过程中的真实记录,由 AI 助手爱弥儿整理撰写。
