Skip to main content
Workboard 插件会向 Control UI 添加一个可选的看板式工作板:适合代理大小的工作卡片、分配给代理,以及返回卡片任务、运行和仪表板会话的链接。 Workboard 的设计刻意保持小巧:它只跟踪一个 OpenClaw Gateway 的本地操作工作。它不是 GitHub Issues、Linear、Jira 或其他团队项目管理系统的替代品。

启用它

Workboard 已捆绑,但默认处于禁用状态:
  1. 在 Control UI 中打开 插件,或使用相对于 已配置 Control UI 基础路径的 /settings/plugins。例如,基础路径为 /openclaw 时, 使用 /openclaw/settings/plugins
  2. 找到 Workboard 并选择 启用。由于 Workboard 已包含在 OpenClaw 中,因此不需要执行 安装 操作。
  3. 如果 UI 提示需要重启,请重启 Gateway。
在插件运行时加载后,Workboard 选项卡会出现在仪表板导航中。 当它被禁用时,该选项卡会继续在导航中隐藏。直接打开 /workboard 路由时,如果插件被禁用或被 plugins.allow/plugins.deny 阻止,则会显示插件不可用状态,而不是卡片 数据。 等效的 CLI 工作流为:

配置

Workboard 没有特定于插件的配置。使用标准的插件条目启用/禁用它:

卡片字段

卡片还携带用于尝试、评论、链接、证明、 制品、自动化设置、附件、工作进程日志、工作进程协议 状态、声明、诊断、通知、模板 id、归档状态,以及 过期会话检测的紧凑元数据,另外还有一个最近事件列表(creatededitedmovedlinkedspecifieddecomposedclaimedheartbeatexecution_updatedattempt_startedattempt_updatedcomment_addedlink_addedproof_addedartifact_addedattachment_addeddiagnosticnotificationdispatchorchestrationprotocol_violationarchivedunarchivedstale)。这些元数据让 操作员无需打开关联会话,就能看到卡片如何在看板中流转;它是本地运行上下文,不是会话记录或 GitHub issue 历史的替代品。 插件和 Control UI 使用同一份 Workboard 卡片契约。因此,仪表板刷新会保留工作区来源与权限、认领状态、诊断 操作以及通知序列号,而不是投影出一个更小的、仅供 UI 使用的 卡片副本。未知的诊断类型、诊断严重性和通知类型会被忽略,直到两个界面都支持它们;它们绝不会 被改写成另一种有效状态。 打开的仪表板会根据 plugin.workboard.changed 失效通知进行更新。每个 事件只包含存储时钟周期和修订号;随后 UI 会通过正常的 operator.read RPC 重新读取规范化卡片。多个修订会合并为 一次后续读取。Workboard 会在卡片被拖动、 编辑或写入时延迟该读取,然后在本地交互结束后恢复。重新连接时总会执行一次规范化重新加载。没有常规的整卡轮询,刷新 仍可作为手动恢复手段。 当存在多个看板时,工具栏会包含一个由已持久化的看板元数据支持的看板筛选器,而不仅仅依赖当前可见的卡片。因此,空看板和已归档看板仍然可以被选择。没有显式看板 id 的卡片属于规范的 default 看板。每个看板都有一个规范的 /workboard/<boardId> 页面,可添加书签、共享或固定到侧边栏。之前发布的 /workboard?board=<boardId> 形式仍作为兼容别名保留,并在保留其他查询参数的同时重定向到该页面。选择所有看板会返回 /workboard 卡片存储在插件自身的 Gateway 状态中,并随着该 Gateway 的其余 OpenClaw 状态一起移动(见 存储)。

从卡片开始工作

未关联的卡片可以直接开始工作:
  • Run Codex / Run Claude 启动一次带任务跟踪的代理运行,使用明确的引擎,发送卡片提示,并将卡片标记为 running。Codex 运行使用 openai/gpt-5.6-sol;Claude 运行使用 anthropic/claude-sonnet-4-6
  • Open Codex / Open Claude 创建一个已关联的仪表板会话,但不会发送卡片提示或移动卡片,适用于保留在看板上进行的手动工作。
自主启动使用 Gateway 的任务跟踪代理运行路径(除非明确选择 Codex/Claude,否则使用默认代理和模型);随后 Workboard 会将生成的任务、运行 ID 和会话密钥链接回卡片。每次已关联的执行还会记录一条尝试摘要(引擎、模式、模型、运行 ID、时间戳、状态、滚动失败计数),以便重复失败保持可见。 仪表板会从 Gateway 任务账本刷新任务状态,并通过任务 ID、运行 ID 或关联的会话密钥将任务匹配到卡片。处于队列中/运行中的任务会保持卡片的生命周期处于活动状态;已完成、失败、超时或已取消的任务会使用与关联会话相同的同步规则将卡片推向 reviewblocked(参见 会话生命周期同步)。

代理工具

证明状态是工作者报告的结果,而非独立验证。passed 条目表示工作者报告其命令或检查已成功;需要独立质量门禁的使用者应检查所附的命令、URL 或工件,并运行自己的验证器。workboard_proof 会返回新记录的 proofId。当 workboard_complete 报告同一证明的终止状态时,传入 proofId,即可在原位置解决待处理记录,同时保留其身份和时间戳。已经具有相同终止状态的证明将原样复用。不带 proofId 的完成证明仍采用追加模式,因此后续重试不会仅仅因为命令或备注相同就重写较早的历史记录。 已认领的卡片会拒绝来自其他代理的代理工具变更,除非调用方持有 workboard_claim 返回的认领令牌。代理工具或 Gateway RPC 调用返回的每张卡片都会将 metadata.claim.token 脱敏为 [redacted](令牌本身仅从 workboard_claim 顶层返回一次),因此控制面板操作员和其他代理可以检查认领状态,而不会看到可用的令牌。恢复操作通过 workboard_promote/workboard_reassign/workboard_reclaim 进行,这些操作不需要令牌。

调度

调度是 Gateway 本地的:它不会生成任意 OS 进程。正常的 OpenClaw 子代理会话仍然负责执行。一次调度流程:
  1. 提升依赖已就绪的卡片。
  2. 在就绪卡片上记录调度元数据。
  3. 阻止已过期的认领或超时运行。
  4. 将看板配置的分诊卡标记为编排候选。
  5. 认领一小批就绪卡片,并通过 Gateway 子代理运行时启动 worker 运行。
Worker 会获得受限的卡片上下文,以及通过 Workboard 工具执行心跳、 完成或阻塞卡片所需的认领令牌。 Workspace 路径遵循调用方现有的文件系统权限。具有 operator.write 的 Gateway 客户端可以使用已配置的 agent 工作区; operator.admin 客户端可以使用其他主机检出目录。受沙箱限制的 agent 工具使用 其沙箱工作区访问权限,而未受沙箱限制的仅工作区工具使用其 配置的工作区根目录。Workboard 在分配工作区时记录该权限,并在调度时 再次将其与当前调用方的权限求交,因此持久化的卡片不会扩大后续调用方的访问权限。 较旧的卡片如果带有显式的主机工作区但没有记录的权限,则必须先将该工作区 重新保存,才能进行完整主机调度;没有主机路径的卡片会在首次调度时采用 当前调用方的权限。 仅当工作区绑定的调度请求的仓库根目录与目标 agent 工作区完全匹配时, 才接受目录或 Git 检出目录。worktree 请求会被缩小到该目录并持久化为目录工作区, 因此主机不会物化该检出目录,也不会执行仓库设置代码。目标 worker 必须为该确切 工作区使用可写、非共享的 Docker 沙箱,且不得使用提升执行权限、持久化的主机/节点 exec 覆盖, 以及未分类的插件和 MCP 工具。Workboard 枚举其已注册工具,而不是信任 workboard_* 前缀,并且如果活动挂载/配置哈希已过期,调度会拒绝热 Docker 容器。 调度会报告不兼容的目标策略,而不是启动一个限制更少的 worker。 完整主机调度可以针对其他本地检出目录,并保留正常的受管 worktree 设置。 工作区权限不会创建第二套卡片生命周期权限模型。 可以修改 Workboard 卡片的调用方,可以在所有界面上手动将其推进相同的状态; 只读的工作区访问只会阻止需要写入的 worker 调度。

Worker 选择

每次流程默认最多启动 3 个 worker。就绪卡片会按 优先级、然后位置、然后创建时间排序。一次流程只会为每个 owner/agent 启动一张卡片,并跳过那些在看板上已经有运行中或审核中工作的 owner。 已归档卡片、带有活动认领的卡片,以及不处于 ready 状态的卡片,绝不会被选中用于 worker 启动(但它们仍可能受到调度数据侧的影响: 过期认领清理、依赖提升、超时清理)。 会话键会针对每个 board/card 进行确定性生成,因此重复调度会回到 同一 worker 车道,而不是创建无关的会话:
  • 已分配卡片:agent:<agentId>:subagent:workboard-<boardId>-<cardId>
  • 未分配卡片:subagent:workboard-<boardId>-<cardId>(Gateway 会解析 配置的默认 agent)
如果在卡片被认领后无法启动 worker,Workboard 会阻塞该 卡片、清除认领、记录运行启动失败,并追加一行 worker 日志—— 该日志可在仪表板、CLI JSON、agent 工具以及卡片诊断中查看。

入口点

  • 仪表板调度操作
  • openclaw workboard dispatch
  • 命令可用频道中的 /workboard dispatch
当 Gateway 可用时,这三者都使用 Gateway 子代理运行时。CLI 有一个 操作员回退机制:如果 Gateway 调用因连接/不可用错误失败(或者对于旧版 Gateway,因 unknown method 错误失败),并且没有显式的 --url/--token 目标,同时也没有配置远程 Gateway(OPENCLAW_GATEWAY_URLgateway.mode: remote)适用,那么 CLI 会在本地 SQLite 状态上执行仅数据的调度—— 它可以提升依赖、清理过期认领并阻塞超时运行,但无法启动 worker。来自可达 Gateway 的认证、 权限和验证失败不被视为不可用;它们会作为命令错误暴露出来, 当提供了显式的 --url/--token 目标时,任何 Gateway 失败也同样如此。 看板元数据可以设置 autoDecomposeautoDecomposePerDispatchdefaultAssigneeorchestratorProfile。OpenClaw 会记录这一意图并 在 worker 上下文中暴露它;实际的规格说明/分解仍然通过正常的 Workboard 工具运行。

CLI 和斜杠命令

list 的文本输出默认隐藏已归档卡片(--include-archived 会覆盖这一行为);--json 始终包含已归档卡片,与现有脚本使用的完整卡片 契约保持一致。showmove 接受不含歧义的 id 前缀。listcreateshowmove 始终直接读写本地插件 状态。只有 dispatch 会调用正在运行的 Gateway,并采用上文 所述的回退机制。 有关完整标志、JSON 输出、Gateway 回退行为、id 前缀处理、dispatch 选择规则以及故障排查,请参见 Workboard CLI /workboard list/workboard show <card-id>/workboard create <title>/workboard move <card-id> --status <status>/workboard dispatch 与 CLI 保持一致。List 和 show 对任何已授权的命令发送者都是只读操作。 Create、move 和 dispatch 在聊天界面上需要所有者权限,或者使用具有 operator.write/operator.admin 的 Gateway 客户端。手动 operator 移动使用 与仪表板拖放相同的认领覆盖行为。它们的 worktree 访问仍遵循上文 所述的相同工作区边界。

会话生命周期同步

卡片可以链接到现有的仪表板会话,或者链接到你从卡片开始工作时创建的会话。已链接的卡片会内联显示会话生命周期:运行中、过期、已链接空闲、完成、失败或缺失。你也可以在 Sessions 选项卡中使用 Add to Workboard 捕获一个现有会话;卡片会链接到该会话,使用会话标签或最近的用户提示作为标题,并在可用时基于最近的用户提示以及最新的助手回复填充备注。 如果链接的会话丢失,卡片仍会保留链接以便提供上下文,并且仍然提供开始控制来重启到一个新的会话中。如果一个处于活动状态的已链接会话停止报告最近活动,Workboard 会将该卡片标记为 stale,并将其作为元数据存储,直到生命周期将其清除。 当卡片处于活动工作状态时,Workboard 会跟随链接的会话: 人工审核状态优先。 将卡片移动到 reviewblockeddone 会停止该卡片的自动同步,直到你将其移回 todorunning 启动卡片会使用常规的 Gateway 会话;Workboard 只存储卡片元数据和链接。对话记录、模型选择以及运行生命周期仍由常规会话系统管理。对一个正在运行的已链接卡片使用 Stop 可中止当前运行——Workboard 会将该卡片标记为 blocked,以便它仍然可见,供后续跟进。 新卡片可以从 Workboard 模板(bugfixdocsreleasepr_reviewplugin)开始。模板会预填标题、备注、标签和优先级;模板 id 会作为卡片元数据存储。

仪表板工作流

  1. 在 Control UI 中打开 Workboard 选项卡。
  2. 创建一张卡片,填写标题、备注、优先级、标签、可选 agent,以及 可选的关联 session;或者打开 Sessions,并为 现有 session 选择 Add to Workboard
  3. 将卡片在各列之间拖动,或者聚焦其紧凑状态控件并使用 菜单或 ArrowLeft/ArrowRight。在拖动过程中,源卡片会变暗, 可放置的列会获得轮廓高亮。
  4. 从卡片开始工作,以创建或复用一个 dashboard session。
  5. 在 agent 工作时,从卡片打开关联的 session。
  6. 让 lifecycle sync 将运行中的工作移动到 review/blocked,然后在被接受时手动将卡片移至 done

会话看板小组件

Workboard 为会话仪表板提供两个原生小组件(参见 仪表板)。agent 使用其 dashboard 工具并通过 content: { kind: "plugin", pluginKind, props } 固定这些小组件;它们会以带有实时数据的一等 UI 组件进行渲染——无需沙盒框架或能力授权:
  • workboard:card 配合 props: { cardId } 显示一张卡片,其中包含其状态 控件、优先级和分配的 agent。
  • workboard:mini 可选配 props: { boardId, limit },显示各状态的 数量、排名靠前的 ready/running 卡片,并链接到完整的看板页面。 不提供 boardId 时,它会汇总所有看板;提供 boardId 时,它会限定在 该看板内(未明确指定看板 id 创建的卡片会归属于 default)。

诊断

诊断结果由本地卡片元数据计算得出。内置检查会标记:

权限

Gateway RPC 方法位于 workboard.* 下: 没有任何 RPC 方法需要 operator.admin。以只读 operator 访问连接的浏览器可以检查看板,但不能修改卡片。管理员作用域会扩大可接受的 Workboard 主机路径;它不会改变可用的方法。

存储

Workboard 将持久化数据存储在 OpenClaw 状态目录下一个由插件拥有的关系型 SQLite 数据库中:看板、卡片、标签、生命周期事件、运行尝试、评论、依赖链接、证明、工件引用、附件元数据和二进制内容、诊断信息、通知、工作器日志、协议状态以及订阅都保存在 Workboard 的表中(而不是插件的键值条目中)。卡片导出会保留看板叙事内容,而不会内联附件二进制内容。 .28 版本中使用过 Workboard 的安装,可以运行 openclaw doctor --fix,将随附的旧版插件状态命名空间(workboard.cardsworkboard.boardsworkboard.notify,以及如果存在的话 workboard.attachments)迁移到关系型数据库中。

故障排查

标签页显示 Workboard 不可用
如果已配置 plugins.allow,请将 workboard 添加进去。如果 plugins.deny 中包含 workboard,请在启用插件前将其移除。 卡片无法保存 确认浏览器连接具有 operator.write 访问权限。只读 operator 会话可以列出卡片,但不能创建、编辑、移动或删除卡片。 启动卡片不会打开预期的会话 检查卡片的 agent id 和关联会话,然后打开 Sessions 或 Chat,以 查看实际的运行状态。 Dispatch 不会启动工作进程 确认至少有一张没有活动认领的 ready 卡片:
如果 CLI 报告的是仅数据分发(data-only dispatch),请启动或重启 Gateway 后重试——仅数据分发会更新本地看板状态,但不能启动子代理工作进程运行。若同一 owner 或 agent 的另一张卡片已经在运行或等待审查,当前卡片也可能会被跳过;请先完成、阻塞或释放该活动工作,再为同一 owner 继续分发更多卡片。

相关内容