Back to home@ANITOCE

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
GitHub repo

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]

挂载仅改动两处、均可逆,且只属于本插件:

  1. profile package.json 中一条 "dsh-task-board": "link:<本目录>" 依赖(离线 pnpm install 建立链接;失败时回退为 node_modules 手工 junction);

  2. 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 行会冲突)。

验证步骤(对照验收)

  1. 挂载后侧边栏「新会话」下方出现「任务看板」入口;点击 → 中间列切换为五列看板;点「返回对话」或点击侧边栏任意会话项回到对话视图。
  2. 「+ 新建任务」填标题/描述/Prompt → 卡片出现在「待办」;刷新页面/重启 DSH → 任务仍在(localStorage 持久化)。
  3. 点卡片 → 详情可见内容与 Prompt(不会自动执行);详情内有「执行」「删除」「查看会话」按钮。
  4. 点「执行」→ 卡片变「进行中」,会话列表出现以任务标题命名的会话;agent 跑完后卡片落「已完成」或「已失败」,详情执行记录有结果与时间,可「查看会话」跳转真实 transcript。
  5. 删除有确认环节,删除后本地存储同步移除。
  6. 定时任务:详情 →「定时运行」勾选启用,选预设「每 10 分钟」(*/10 * * * *),卡片出现定时标识;下一个整 10 分钟点自动进入「进行中」并最终完成,详情「上次触发」出现时间、执行记录新增一条(会话可跳转)。浏览器端调度,标签页需保持打开;刷新后调度自动恢复(重新计算下次运行时间)。
  7. 一键挂载/卸载;卸载后 GUI 恢复原状,其它托管段不受影响。
  8. 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 段 / 打包契约

执行链路(真实会话)

  1. 选工作区:workspaces.list 的 recent 工作区 → 当前会话 cwd 所属工作区 → 第一个工作区 → 用当前会话 cwd 新建;
  2. workspaces.connectWorkspace(id):复用空白会话或 host 新建,返回 sessionId;
  3. session.rename(任务标题):执行会话以任务标题出现在会话列表;
  4. session.prompt([{ type: 'text', text: 任务Prompt }], 'queue') 驱动真实 agent 回合;
  5. 订阅 session 快照:running true→false、lastAgentError、窗口内 turn-error/assistant 节点共同判定 完成/失败,回写卡片并记录执行结果;手动执行在任务看板覆盖对话列时同步打开会话(不可见切换),完成后再读出真实 transcript 结果。
  6. 页面刷新后 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 即可恢复。