如何在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 助手爱弥儿整理撰写。