dsh-task-board
可热插拔的 DeepSeek Harness (DSH) 任务看板插件:侧边栏入口 + 五列看板,任务以真实 DSH 会话执行并回写状态,支持 5 段 cron 定时与本地持久化。Hot-pluggable kanban task board for DeepSeek Harness — real session execution, cron scheduling, localStorage persistence.
- Stars
- 0
- Language
- JavaScript
- Created
- Aug 19, 2026
- Updated
- Aug 19, 2026
Introduction
dsh-task-board
可热插拔的 DeepSeek Harness (DSH) 任务看板 GUI 插件。以 cordis 插件 + 浏览器 DOM 扩展挂载(外挂形态,与 dsh-web-ui/packages/skins/skin-center 一致),不修改 DSH 源码;卸载即恢复原状,其它托管段(dsh-skin / skin-center / dshmarket / 个人配置)互不干扰。
社区安装(DSH 插件市场 / dshmarket):
dsh plugin --profile web add github:anitoce/dsh-task-board仓库带有
dsh-plugin等 GitHub topic,供 awesome-dsh-plugin 社区目录发现与收录。
- 侧边栏入口:侧边栏列(
[class*="sidebarCol"],DSH 0.1.0-rc.6 AppFrame 布局)内、「新会话」按钮下方注入「任务看板」入口行;宽栏显示图标+文字,折叠 rail 显示纯图标,颜色随 DSH 皮肤 token 自适应。 - 多列看板:待规划 / 待办 / 进行中 / 已完成 / 已失败 五列;卡片显示标题、描述、状态、更新时间、执行次数、定时标识;顶部支持搜索、新建任务、返回对话。
- 任务详情:点卡片打开详情(描述 / 执行 Prompt / 执行记录),不会一点就执行;提供「执行 / 重新执行」「删除(带确认)」「查看会话(跳转真实 transcript)」「移到待规划/待办」。
- 真实执行:点「执行」后通过客户端 runtime 连接工作区会话(
workspaces.connectWorkspace,空白会话复用或 host 新建),把任务标题设为会话名,以任务 Prompt 调用session.prompt([{ type: 'text', text }], 'queue')驱动真实 agent;随后订阅会话快照,回合真实结束后把卡片置为 已完成/已失败 并记录执行结果。执行会话出现在会话列表,可点进对话查看真实 transcript。 - 状态回写:卡片状态(进行中 → 完成/失败)由真实会话状态驱动;刷新页面/重启后,遗留的 running 任务按会话现状自动对账(reconcile)。
- 定时任务:详情面板可启用 5 段 cron(分 时 日 月 周;支持
*/*/n/a-b/a-b/n/ 逗号列表;日与周同时受限为「或」)+ 常用预设(每天 09:00、每小时、每 10 分钟、每周一 09:00);启用即计算并持久化「下次运行时间」;到点自动走同一真实执行链路。 - 系统提示词注入:host 半边通过
SystemPrompt.section注册plugin:task-board段(order 200),向每个 agent 声明本插件存在、能力与限制——插件在组合中即注入,移出组合即消失。 - 本地持久化:任务数据存于浏览器
localStorage(键dsh-task-board),刷新页面、重启 DSH 均不丢失。
快速开始
npm run build # 生成 lib/index.js(host 半边)与 dist/client.js(client 打包)
node scripts/dsh-task-board.js mount # 热挂载进 DSH profile(写入托管段 + 依赖链接)
# 刷新 http://127.0.0.1:3080 —— 侧边栏「新会话」下方出现「任务看板」
挂载写入的是 profile 的
cordis.patch.yml(DSH 自带watchUserPatches热监视,约 1 秒内热重组),因此无需重启 DSH。同一补丁文件在每次 DSH 启动时重放,挂载在重启后依然生效。
node scripts/dsh-task-board.js unmount # 热卸载;刷新后 GUI 恢复原状
node scripts/dsh-task-board.js status # 查看挂载状态(托管段/依赖链接/boot graph)
node scripts/dsh-task-board.js mount --profile <name> [--url http://127.0.0.1:3080] [--no-wait]
挂载仅改动两处、均可逆,且只属于本插件:
-
profile
package.json中一条"dsh-task-board": "link:<本目录>"依赖(离线pnpm install建立链接;失败时回退为node_modules手工 junction); -
profile
cordis.patch.yml中一个注释标记的托管段:# === dsh-task-board managed segment (managed by scripts/dsh-task-board.js; do not edit by hand) === - insert: - id: task-board name: dsh-task-board # === end dsh-task-board managed segment ===
不触碰 dsh.profile.bundles、$DSH_HOME/cordis.patch.yml、.dsh-market 状态或任何其它托管段。插件包内亦提供标准 bundle 形态(cordis.patch.yml + dsh.bundle.patch):如偏好 bundle 挂载,把 dsh-task-board 加入 dsh.profile.bundles 即可——但不要同时使用两种方式(同 id 行会冲突)。
验证步骤(对照验收)
- 挂载后侧边栏「新会话」下方出现「任务看板」入口;点击 → 中间列切换为五列看板;点「返回对话」或点击侧边栏任意会话项回到对话视图。
- 「+ 新建任务」填标题/描述/Prompt → 卡片出现在「待办」;刷新页面/重启 DSH → 任务仍在(localStorage 持久化)。
- 点卡片 → 详情可见内容与 Prompt(不会自动执行);详情内有「执行」「删除」「查看会话」按钮。
- 点「执行」→ 卡片变「进行中」,会话列表出现以任务标题命名的会话;agent 跑完后卡片落「已完成」或「已失败」,详情执行记录有结果与时间,可「查看会话」跳转真实 transcript。
- 删除有确认环节,删除后本地存储同步移除。
- 定时任务:详情 →「定时运行」勾选启用,选预设「每 10 分钟」(
*/10 * * * *),卡片出现定时标识;下一个整 10 分钟点自动进入「进行中」并最终完成,详情「上次触发」出现时间、执行记录新增一条(会话可跳转)。浏览器端调度,标签页需保持打开;刷新后调度自动恢复(重新计算下次运行时间)。 - 一键挂载/卸载;卸载后 GUI 恢复原状,其它托管段不受影响。
- agent 侧验证:挂载后任意会话(含子代理)的 system prompt 都包含
plugin:task-board段;卸载后消失。
架构
src/
├── index.js # host 半边:SystemPrompt.section('plugin:task-board', order 200)
└── client/ # 浏览器半边(微打包为 dist/client.js,__ModuleLoader__ 工厂契约)
├── index.js # cordis 插件入口:inject ['sessions','workspaces'],装配 store/executor/scheduler/ui
├── store.js # localStorage 持久化(v1 文档、迁移、订阅、跨标签页同步)
├── cron.js # 5 段 cron 解析/校验/nextRun 计算(纯逻辑)
├── status.js # 状态机:列流转、执行权限
├── executor.js # 真实执行驱动:connectWorkspace → rename → prompt('queue') → 快照订阅 → 回写
├── scheduler.js # 浏览器端 cron 调度循环(注入时钟,可测)
├── ui.js # DOM 扩展:侧边栏入口、五列看板、详情/新建/删除确认弹层
└── css.js # 样式(全部使用 DSH 皮肤 token,随主题自适应)
scripts/
├── build.js # 零依赖构建:host 复制 + client 微打包(无需网络/外部 bundler)
├── dsh-task-board.js # mount / unmount / status(托管段 + 依赖链接,热挂载)
└── run-tests.js # 逐文件测试运行器(兼容受限沙箱)
tests/ # node:test:存储读写 / 状态流转 / 执行触发 / cron 解析 / 调度器 / host 段 / 打包契约
执行链路(真实会话)
- 选工作区:
workspaces.list的 recent 工作区 → 当前会话 cwd 所属工作区 → 第一个工作区 → 用当前会话 cwd 新建; workspaces.connectWorkspace(id):复用空白会话或 host 新建,返回 sessionId;session.rename(任务标题):执行会话以任务标题出现在会话列表;session.prompt([{ type: 'text', text: 任务Prompt }], 'queue')驱动真实 agent 回合;- 订阅
session快照:runningtrue→false、lastAgentError、窗口内turn-error/assistant 节点共同判定 完成/失败,回写卡片并记录执行结果;手动执行在任务看板覆盖对话列时同步打开会话(不可见切换),完成后再读出真实 transcript 结果。 - 页面刷新后
reconcile():按会话现状对账遗留 running 任务(会话消失→失败;仍在运行→继续追踪;已结束→按错误/结果落状态)。
开发
npm run build # 构建(无需网络;client 由 scripts/build.js 微打包)
npm test # 37 个 node:test 用例(逐文件运行,兼容沙箱)
npm run verify # build + test
UI 样式遵循工作区规范 docs/dsh-ui-style-guide.md(DSH 官方 UI 风格:语义 token / 官方排版变量 / 官方圆角高度与焦点、动效约定)。
测试覆盖:存储读写/迁移/订阅、状态流转与执行权限、执行触发(含 prompt 拒绝、agent 错误、回合错误、reconcile 三种对账)、cron 解析与 nextRun(含闰年、OR 语义、周日 7==0)、调度器(启用/禁用/到点触发/跳过执行中/失效禁用/刷新恢复)、host 系统提示段注册与卸载、打包契约(__ModuleLoader__ 工厂、apply 全链路冒烟)。
已知限制
- 定时调度运行在浏览器标签页内,标签页需保持打开;浏览器后台节流可能延迟触发(最长约 1 分钟)。
- 未打开执行会话时完成的任务,结果文本在下次打开该会话/看板可见时补全(状态判定不受影响)。
- 插件包源码改动后需重新
npm run build并重新挂载(或重启 DSH)生效;client 包内容变更走 boot graph 的 rev 哈希。 - Windows 下若离线
pnpm install不可用,挂载脚本回退为手工 junction:DSH 重启不受影响,但 profile 内后续pnpm install可能清理该链接,重新执行mount即可恢复。