READMESource: main@6e5e33c4
dsh-task-board
一个 DeepSeek Harness(DSH)Web 客户端插件:把侧边栏那份「一列标题 + 几天前」的会话列表,换成一个全屏任务大屏——每个会话一张卡片,卡片里是这个会话最近几条消息,状态一眼可见,点一下直接进去。
它解决什么
DSH 的会话列表只给你标题和时间,任务一多就完全看不出「哪些在跑、哪些等我拍板、哪些已经完事」。这个插件把这些信息铺开成一张大屏:
- 一屏同时看 4 / 9 / 16 个任务,每个格子都是活的(流式输出实时追加)
- 按状态分组排序:进行中 → 待确定 → 已完成,看得见的永远是当前在处理的
- 卡片上直接回一句话,不用先切会话
- 每张卡片显示所属工作区,跨工作区也不会认错
功能
| 能力 | 说明 |
|---|---|
| 全屏任务大屏 | 左下角「任务大屏」按钮打开,铺满窗口,Esc 或右上角 ✕ 关闭 |
| 每格一个对话窗 | 显示最近 5 条消息(我 / AI / 工具),工具连续同名折叠成 bash ×3,流式输出实时追加 |
| 状态分组 | 进行中 / 待确定 / 已完成,自动推断 + 手动覆盖 |
| 排序 | 进行中 → 待确定 → 已完成,同状态内按最近活跃时间倒序 |
| 状态修改 | 每张卡片标题前的下拉,选择记在本地 |
| 搜索 | 按任务标题或工作区名过滤 |
| 状态筛选 | 只看某一类状态 |
| 格子数 | 4 / 9 / 16 三档,等分整屏,选择记在本地 |
| 内联回复 | 卡片底部输入框,回车直接进该会话队列 |
| 工作区标签 | 标题行右侧显示所属工作区 |
| 运行中徽标 | 侧边栏按钮上的绿色数字,显示当前有几个任务在跑 |
| 中英双语 | 跟随 DSH 的界面语言 |
安装
DSH 以 bundle 方式安装本地插件包:
- 把本仓库克隆或下载到本地,得到包含
package.json的目录 - 在 DSH 里用插件管理器安装这个目录(
plugin_manager的install_bundle,target 传该目录的绝对路径) - 安装返回
application: applied后,刷新 Web 页面,左下角会出现「任务大屏」
卸载:在插件管理器里移除 @local/dsh-ui-task-board 即可,本插件不改动 DSH 的任何原有文件。
配置
不需要额外配置。以下状态存在浏览器本地(不会写入会话日志,也不影响 Host):
| localStorage 键 | 内容 |
|---|---|
dsh.task-board.status.v1 |
会话 id → 状态(todo / doing / done) |
dsh.task-board.grid.v1 |
每屏格子数(4 / 9 / 16) |
状态派生规则:没有手动设置过的会话,运行中记为「进行中」,否则记为「待确定」。
实现要点
- 纯客户端插件:Host 半身是空实现,全部逻辑在
client.js(单文件,无构建步骤) - 注册两个槽位,不覆盖任何已有 UI:
sidebar.footer.action:启动按钮shell.overlay:全屏大屏
- 每个卡片通过
ctx.sessions.retain(sessionId, { source: 'taskBoard' })拿到该会话的最近事件窗口,订阅变化后重新折叠,卸载时释放引用 - 会话列表来自槽位标准 prop
useSessions;列表接口在超大会话库上可能很慢,此时退回用控制通道已填充的byId渲染,避免长时间空屏 - 内联回复调用
binding.session.prompt([{ type: 'text', text }], 'queue') - 样式全部使用宿主主题变量(
--dsw-alias-*、--dsw-radius-*),明暗主题自动跟随
自检
node --check client.js
node tools/render-test.mjs
tools/render-test.mjs 是一个离线渲染冒烟测试:用假 Host 加载 client.js,喂若干合成会话,把大屏渲染成 HTML 后断言卡片数量、排序、格子布局与控件存在性。它不依赖浏览器,可在 CI 里跑。
已知限制
- 状态只记录在本机浏览器,换机器不同步
- 实时刷新、跳转导航、状态持久化这三条依赖真实运行中的 Web 页面,离线冒烟测试覆盖不到
- 大屏一次性渲染所选格数,大量任务靠底部「再看 N 个」翻页,未做虚拟滚动
No comments yet. Be the first to write one.