Codex Kanban logo Codex Kanban sidebar:400px

设计约束与交互说明

1. 窄栏模拟:左侧严格按照 400px 侧边栏宽度排版,支持原生拖拽落列、横向平滑滚动与卡片点击呼出覆盖抽屉。

2. 双向驱动:UI 的每次拖拽都会立即触发对应的 MCP Tool Call,并与远端 Agent 共享状态。

3. 与实现同步(2026-10-03):真实 logo 资源、仓库切换器 suffix「添加仓库」入口与项目路径行、详情抽屉头部(ID + 状态 Tag + 复制 + 关闭)、SVG 图标已对齐代码实现(ui/src)。

实时 MCP Tool Call 审计日志 (Audit Log)

15:20:01 board_list() → 200 OK (8ms)
15:20:02 task_list({ repo: "lj-kbr-v2-web" }) → 9 tasks sync

Codex Kanban 架构分层与 MCP 工具契约

人与 Codex Agent 共享底层 Git Worktree 执行上下文与任务数据库,所有 UI 操作均为对 MCP 工具集的标准化调用。

Layer 1: Host UI Presentation
Codex Webview Sidebar / React Kanban UI
Host postMessage
⬇ JSON-RPC Bridge ⬇
Layer 2: MCP Apps Bridge & Transport
标准 MCP 协议层 (Stdio / SSE Client)
@modelcontextprotocol/sdk
⬇ Tool Call Dispatch ⬇
Layer 3: Kanban MCP Server
7 组核心工具处理函数与状态校验
kanban-server:v1
⬇ Subsystems ⬇

Tasks Engine

管理任务增删改查、排序及优先级流转。

Git Worktree Engine

自动分流分支、捕获差异 diff、创建 PR。

Sessions Manager

监控 Codex Agent 终端输出与心跳生命周期。

MCP Tools 契约清单

board_list()

获取当前仓库的所有任务看板与列定义配置。

input: { repo?: string }
output: { boards: Board[] }
task_list()

供人和 Agent 多维度拉取任务列表。

input: { status?, assignee? }
output: { tasks: Task[] }
task_get()

获取单个任务详情、分支名及 Session 输出。

input: { id: string }
output: { task: TaskDetail }
task_create()

创建协同任务,写入默认 Backlog。

input: { title, desc, priority, assignee }
output: { task: Task }
task_update()

局部修改任务描述、验收标准或分支。

input: { id, patch: Partial<Task> }
output: { ok: boolean }
task_move()

拖拽卡片切换状态,同步驱动生命周期事件。

input: { id: string, status: Status }
output: { id, status }
task_assign()

指派给 Codex 时自动拉起专属 Agent 执行会话。

input: { id: string, assignee: "human" | "codex" }
output: { sessionId?: string }

Task 生命周期状态机

Backlog ➔ Todo ➔ Assign to Codex ➔ Doing (Agent) ➔ PR Created ➔ Review ➔ Merged & Done

Review 验收工作流 — 实现与验收分离

实现会话(executionBinding)与验收会话(reviewBinding)是两个不同的 Codex 聊天,复用同一实现工作区; 每轮结论持久留存,跨 Agent 更新以 expectedRevision CAS 防静默覆盖。 返工全程保留在 Review 列,不移动看板卡片;approved 不自动移动 Done。

1

进入验收 用户 / Agent task_move(doing → review)

任务进入 Review 列,review.status = pending。不自动创建 Reviewer、不自动选择工作区; projectless 任务不参与 Review 流转(purpose=review、外部会话记录与状态更新均被拒绝)。

review: pending
▼ 用户点击「开始 Review」
2

启动首次验收(服务端解析工作区,仅此时可选模型) task_execution_request · purpose=review · start

服务端按 executionBinding → externalExecutionSession → worktreePath 解析唯一实现工作区并锁定到请求, 调用者不能指定;workspaceMode 固定 existing。

🛑 守卫:无来源 → REVIEW_WORKSPACE_REQUIRED 多来源互不相同 → REVIEW_WORKSPACE_CONFLICT —— 拒绝启动,board.repo 不是工作区猜测来源
▼ 新建独立验收会话(新聊天,不是新 worktree)
3

验收会话绑定 验收会话 · reviewBinding claim → created → bound

reviewBinding.threadId ≠ executionBinding.threadId(同一 Codex 聊天不得兼任实现与验收,Core 强制拒绝); workspacePath 必须等于实现工作区,不另建 worktree、不切换目录。

▼ 真实 running 回执(投递 / 创建 / 绑定 ≠ running)
4

开始验收(开轮) 验收会话 task_execution_report · running

只有真实开始回执才开新一轮并推进状态;重复 running 回执不重复开轮; 回执按请求 purpose 分流写 reviewExecution,不触碰实现执行状态。

review: reviewing
▼ 结论必须经 task_review_update 提交(expectedRevision CAS,跨 Agent 共用)
5A

要求修改 task_review_update · changes_requested

须携带非空 conclusion;关闭当前 Round 并持久留存结论与工作区,随后进入下方返工循环。

changes_requested
5B

验收通过 task_review_update · approved

须携带非空 conclusion;会话 completed 只是执行结束,永远不等于 approved。

approved
↺ 返工循环(任务保留在 Review 列,不移动看板卡片)
R1

点击「继续修改」用户

目标是实现会话,不是验收会话;默认提示词按最新 Round 结论生成,发送前可编辑(系统协议封装不可编辑)。

▼
R2

实现会话继续修改 实现会话 · executionBinding

复用原聊天与原工作区(禁止换聊天 / 换工作区 / 换模型);真实 running 回执把 Review 推进到 fixing。

fixing
▼ 修复完成(execution completed 不推断验收通过)
R3

提交待复查 实现会话 task_review_update · recheck_pending

由实现方在修复完成后显式提交;Core 校验只能从 changes_requested / fixing 进入。

recheck_pending
▼ 用户点击「继续验收」——复用 reviewBinding(同一聊天 / 同一工作区 / 禁止改模型)
R4

继续验收(复查) 验收会话 task_execution_request · purpose=review · continue

真实 running 回执开启新一轮 Round #N+1;复查前重新核对实现工作区,与 reviewBinding 不一致即拒绝继续。

Round #N+1
↺ 回到「验收结论」分支(步骤 5):新结论写入新 Round,旧轮结论不被覆盖;approved 后从 5B 出口离开循环
▼ 5B 出口:仅在 approved 后开放
6

标记完成 用户 task_move(review → done)

approved 不自动移动 Done——最终业务流转始终由显式操作触发;UI 的「标记完成」在 approved 之前不可用。

done

🔐 实现会话 ≠ 验收会话

同一 Codex 聊天(threadId + hostId)不得同时写入 executionBinding 与 reviewBinding;created 与 bound 两个阶段都由 Core 强制校验并拒绝。

📁 实现工作区 = 验收工作区

Review 复用实现实际修改的目录:不另建 worktree、不凭 board.repo 猜测; 无唯一工作区或来源冲突直接拒绝启动;每次复查重新核对,工作区漂移即拒绝继续。

🗂 多轮结论留存 + CAS

每轮 ReviewRound 持久保存状态、结论、工作区与更新者,新一轮不覆盖旧轮; 跨 Agent 更新必须携带 expectedRevision,过期返回 REVIEW_STALE, 须 task_get 读取最新状态后重试,不得静默覆盖他人结论。

执行方: 用户操作 实现会话 · executionBinding 验收会话 · reviewBinding | 涉及 MCP 工具(点击可看演示回执): task_move task_execution_request task_execution_bind task_execution_report task_review_update

TaskLane 执行回执卡片 · 交互原型

执行会话调用 task_execution_report 回报状态变更时,宿主把一张 TaskLane 卡片写进该会话的对话流;点击卡片展开完整看板 widget,自动聚焦该任务详情。
task_execution_report(state, activity) ──▶ 会话内折叠卡片(默认) ──▶ 点击展开 → 全屏 widget ──▶ 锁定任务所属仓库 + 打开任务详情
① 宿主会话流(卡片折叠态)点击卡片联动右侧展开
帮我修复登录会话 30 分钟超时的问题,走 TASK-129 的执行流程。
✓ task_execution_claim ✓ task_execution_bind · created ✓ task_execution_bind · bound
已认领并绑定工作区(worktree fix/login-timeout),开始执行,进度会通过看板回报。
TaskLane TASK-129 P1 Running
修复登录会话 30 分钟超时
agent 正在复现超时路径,定位会话续期逻辑…
看板 codex-kanban-mcp·14:24 更新 展开详情
执行完成,全部 42 项测试通过。
TaskLane TASK-124 P2 Completed
导出报告支持自定义时间区间
agent +120 −34 · 12 files · task_export
看板 codex-kanban-mcp·14:32 更新 展开详情
状态预览 —— 点击切换 TASK-129 卡片的回执状态(同一会话每次回执各出一张卡,此处合并演示) ● running(首个回执:Ready → Doing) waiting blocked failed completed
卡片只读、可点击;执行操作入口在展开后的 widget 内,会话内不重复提供。
② 展开后的详情(fullscreen widget)看板范围锁定任务所属仓库,无跨仓库内容
Codex 内容面板 · ui://widget/tasklane/board-panel-v0315.html 已锁定 codex-kanban-mcp
codex-kanban-mcp 项目模式 /Users/hubert/Desktop/projects/codex-kanban-mcp
Backlog 2
TASK-131
补充 smoke 覆盖
P3human
Ready 1
TASK-130
归档视图支持搜索
P2human
Doing 1
TASK-129
修复登录会话 30 分钟超时
P1running
Review 1
TASK-124
导出报告支持自定义时间区间
P2agent
Done 3
TASK-118
deadline 排序
P2done

1回执即出卡

执行会话每次调用 task_execution_report(running / waiting / blocked / failed / completed)都向会话写入一张折叠卡片:任务 ID、标题、优先级、负责人与活动摘要一屏可读。running / completed 至少各一张属预期;错误结果(校验失败)不渲染卡片、保持纯文本。

2展开 = 完整 widget

卡片默认折叠,点击展开渲染完整看板面板(宿主 fullscreen)。工具结果合并 widget 字段(widget / mode: project / lockedBoardId / repoRoot / projectDir / taskId),面板据此锁定任务所属仓库——任务列表、归档区与执行入口都只在该看板范围内。

3聚焦任务详情

面板加载完成后读取 taskId 自动打开该任务详情(同一实例仅一次),时间线展示从认领、绑定到各次回执的真实链路;projectDir 优先执行绑定的工作区路径。关闭详情回到看板;归档任务仍可通过 task_get 读取。
#142 Doing

Fix OAuth callback race condition in auth-worker

Backlog
Todo
Doing
Review
Done
任务描述与验收标准
元信息 (Metadata)
Priority
Assignee
Repository
lj-kbr-v2-web
Base Branch
feat/oauth-callback
Worktree
.wt/feat-oauth-callback
Codex Agent 执行会话
● Running (04m 28s) sess_9f81a7b
[codex] Running test suite: vitest run tests/auth.spec.ts
✓ tests/auth.spec.ts (4 tests passed)
[codex] Patching src/workers/oauth-callback.ts... OK
[codex] Ready for peer review.
变更审查 (Diff Review) +184 −39