DeepSeek Harness Hub
← 返回列表

lvyuanx/dsh-board-ui

DeepSeek Harnessspec-screened在 GitHub 查看 ↗
未验证

看板形态的 DeepSeek Harness Web UI 外壳插件 dsh.client plugin

尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/8/24 · 已提供中文文档

看板形态的 DeepSeek Harness Web UI 外壳插件 (dsh.client plugin)

综合分
29.8
GitHub 分
29.8
用户评分
★ Stars
3
周下载量
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add lvyuanx/dsh-board-ui
该插件未发布到 npm,走 GitHub 源安装(pnpm 若拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑)
数据截至 2026/9/17(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

dsh-board-ui

DeepSeek Harness Web 界面(http://127.0.0.1:3080)的看板形态 UI 外壳插件

自定义 UI 外壳插件 — 以 dsh.client 客户端插件(@deepseek-ai/dsh-board-ui)的形式
整体接管 DeepSeek Harness Web 界面的 root 槽位,把界面重构为看板形态(参考
Tower):顶部栏 + 左侧导航 + 中央状态列卡片 + 右侧悬浮会话抽屉。

快速开始

前置要求:Node.js ≥ 18、pnpm。

pnpm install            # 安装依赖(仅 esbuild;如被询问请允许 esbuild 的 build script)
node build.mjs          # 构建 lib/client.js
node scripts/verify.mjs # 冒烟测试(root 注册/槽位声明/layout 服务/主题/字典/CSS/列派生)

说明:lib/(构建产物)刻意提交进仓库 — 插件运行时直接从 lib/ 消费,clone 后
开箱即用,无需先执行构建。

安装为 dsh web 客户端插件

市场/普通安装直接让 dsh 通过 GitHub 安装:

dsh plugin --profile web add https://github.com/lvyuanx/dsh-board-ui.git

仓库中的 dsh.bundle 会自动加载 cordis.patch.yml:禁用官方 ui-layout 并插入本插件。
首次安装需要重启 dsh web;之后每次 rebuild 后刷新浏览器即可看到新 bundle。

本地开发可以把当前 checkout 接入 profile:

dsh plugin --profile web add "$PWD"
pnpm watch

回退:

dsh plugin --profile web remove @deepseek-ai/dsh-board-ui

删除后重启 dsh web 即恢复官方 UI。

看板:六状态生命周期

产品是 Multi-Agent 任务编排与执行系统,看板按任务生命周期建模(不再是
Jira 式的「任务池」概念):

待执行 ──开始执行──▶ 进行中 ──全部 Agent 完成──▶ 验收中 ──验收通过──▶ 已完成
│  ▲                        │
需要人工 │  │ 处理完成               │ 验收失败
▼  │                        ▼
需要处理 ──────────────────▶ 进行中(重新执行)

| 列 | 含义 | 数据来源(运行时投影) |
|---|---|---|
| 待执行 | 已创建、未开始执行(规划会话) | board store planningIds;以下任一信号自动移出:等审批/计划审阅(pendingInteraction)、对话中出现开始指令或非只读工具调用(planStartedInConversation,读取运行时 conversation 节点)、已 spawn 子代理(列表投影,刷新后依然可靠) |
| 进行中 | turn 打开,Agent 正在执行 | session.running |
| 需要处理 | Agent 被用户交互阻塞(审批/计划审阅/提问) | session.pendingInteraction(approval/plan-review/question,优先于 running,与官方 workspace 呈现一致) |
| 验收中 | 执行完成、等待最终验收 | session.completed === true(宿主真实标志:未选中状态下结束)+ 有子 Agent |
| 失败 | 主会话或子 Agent 异常终止 | 子代理诊断行,或主会话最后一个 turn/end 为 error / max-tokens / interrupted / blocked / aborted |
| 已完成 | 验收通过 | 其余非空会话 |

- 任务状态与 Agent 状态分离:卡片上的「子 Agent」统计用标记表达
● N 运行中 / ✓ N 已完成 / ○ N 等待 / ✕ N 失败(绿色只给运行中圆点,已完成为
中性灰勾,绝不用头像)。
- 失败设独立列,暂停不设列:失败显示为卡片红色提示 ⚠ N 个 Agent 执行失败 +
重试/查看错误;暂停是卡片操作/徽标(⏸ 已暂停,卡仍留在进行中列,真实执行
session.cancel(),队列保留)。
- 主会话失败也算失败:宿主列表投影不暴露主会话的 turn 错误,所以看板在读
取已打开会话的 conversation(最后一个已关闭 turn 的 turn/end reason)后,
把 server_is_overloaded 这类主会话 LLM/API 错误也归入「失败」列(⚠ 主会话
执行失败:…),而不是因为子 Agent 全部成功就落进「已完成」。记录持久化,
刷新后依然有效;未打开过的会话保持宿主投影状态。
- 颜色语义:蓝 = 待执行/验收中/主要操作/进度;绿 = 仅运行中/成功/验收通过;
橙 = 需要处理;灰 = 等待/已完成统计/辅助;红 = 仅失败/异常。
- 列头:状态名 + 任务数量(徽标计数)+ 状态描述(如「进行中 3 / 2 个 Agent
正在运行」——数字是任务数,Agent 数走描述)。
- 卡片操作:每状态只显示一个主操作(开始执行 / 暂停 / 继续执行 / 处理 /
查看验收结果 / 查看结果),其余进 ⋯ 菜单(重新验收、重新执行、查看执行详情、
重命名、复制会话、归档…)。
- 验收中 → 已完成:前端映射(见 columns.ts 的 TODO(acceptance))——打开任务
即完成验收(宿主同时清除 completed 提醒位);「重新验收」给真实会话发一条
验收指令(TODO(acceptance):等宿主提供真实验收 RPC 后替换)。

功能总览(已完成)

- 看板:待执行 / 进行中 / 需要处理 / 验收中 / 失败 / 已完成 六状态列
- 待执行:点 + 新建规划会话(plan);说「开始执行」或调用非只读工具(非plan)→ 自动流转进状态列
- 主任务卡片聚合子代理计数(● 运行中 / ✓ 已完成 / ○ 等待 / ✕ 失败)
- 全部卡片显示所属项目徽标(8 色板按工作区稳定分配)+ 状态色条 + 统计胶囊 +
状态提示行(等待原因 / 验收提示 / 失败告警 / 验收时间)
- 拖拽排序 / 拖到「进行中」启动计划;右键菜单(打开/重命名/复制/归档/移出待执行)
- j/k 键盘导航(含待执行卡片)、Enter 打开、空白处点击收起抽屉
- 抽屉:悬浮不挤压看板、左缘拖拽调宽(420–1100px)、默认折叠、滑入动画
- 双 tab:对话 / 活动(待处理横幅 + 后台任务 + 子代理)
- 顶栏:工作区切换下拉(tower.im 式)、全局搜索(Ctrl+K 命令面板)、主题切换、构建版本标记
- 主题:亮色优先 + 完整暗色(body[data-ds-dark-theme] 联动官方主题服务)
- 细节:卡片入场错落动画、reduced-motion 支持、焦点环、对比度修正(AA)、窄窗导航自动收起为 56px rail
- 回退:删除 cordis.patch.yml 中两处 board-ui 行(禁用 ui-layout + insert)即恢复官方 UI

未做 / 有意跳过(含 TODO)

- 真实验收状态(TODO(acceptance)):宿主暂无 review/acceptance 状态,验收中
用运行时真实 completed 标志做前端映射;「重新验收/重新执行/重试」目前发送
真实提示词(TODO(acceptance) 注释处),等宿主提供验收 RPC 后替换
- 子 Agent 等待/失败粒度(TODO(agent-state)):官方 subagent catalog 只暴露
running/inactive(其文档自述「no durable outcome」),等待(○)仅在父会话运行
中且运行时未标记完成时统计;失败(✕)来自 catalog 诊断行
- 设置页 tower 化:官方设置组件使用哈希类名,纯 CSS 重塑在升级后易碎;建议以后通过重新注册设置槽位的方式做
- 看板密度切换、列折叠(候选,未排期)

目录

- src/client/ — 浏览器端插件源码(React + JSX)
- index.tsx — 入口(apply/inject、layout 服务、主题呈现器、注册、卡片动作面)
- frame/BoardFrame.tsx — 看板外壳(顶栏/导航/看板/抽屉/详情栏/浮层)
- board/Board.tsx + columns.ts — 五列看板与状态派生(纯函数,可单测)
- palette/Palette.tsx — Ctrl+K 命令面板
- theme/tokens.css — 设计 tokens(亮/暗)
- locale.ts — zh/en 字典(命名空间 "board")
- lib/client.js — 构建产物(__ModuleLoader__.load 工厂格式,已提交)
- lib/index.js — 节点端空壳(loader 需要一个活 fiber)
- build.mjs — esbuild 构建(iife + globalName + 手工 footer 返回 exports)
- scripts/verify.mjs — 冒烟测试(root 注册/槽位声明/layout 服务/主题/字典/CSS/列派生)
- docs/评估与重构方案.md — 评估与方案
- REPORT_client-plugin-mount.md — 挂载链路技术报告

两个契约

1. package.json 的 dsh.client = 模块边(bundle 里 require() 的包,经启动图解析)。
2. bundle 的 export const inject = cordis 服务边(apply(ctx) 注入的服务)。

License

MIT © 2026 lvyuanx

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

💬 加入 DPharness 群聊

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

点击加入 QQ 群
DPharness 群聊二维码,手机 QQ 扫码进群
扫码进群