Back to home@raosay

dsh-kanban

A minimal DeepSeek Harness (DSH) web GUI kanban board with per-task model selection

Stars
0
Language
TypeScript
Created
Aug 17, 2026
Updated
Aug 17, 2026
GitHub repo

Introduction

dsh-kanban

一个独立的 DeepSeek Harness (DSH) Web GUI 插件:只提供看板能力,并增强支持任务执行时选定特定模型

English · DSH 插件生态参考


这是什么

dsh-kanban 是一个遵循 DSH 官方 cordis bundle 标准的独立插件。它参考 dsh-web-uipackages/dsh-task-board,但做了两点关键裁剪与增强:

方向说明
只保留看板只做多列看板 + 任务的创建 / 移动 / 详情 / 删除 / 真实执行。去掉了定时调度(cron)、归档、以及模式(agent 预设)/ 权限 / 工作区等执行目标选择,保持插件最小化、职责单一。
增强:按任务选模型新建任务或编辑任务详情时,可从模型目录中选择一个具体模型(provider / model)。任务执行时,插件在发送提示词之前调用 session.selectModel 应用该模型;留空则使用会话默认模型。

特性

  • 🗂 多列看板:待规划 / 待办 / 进行中 / 已完成 / 已失败,卡片实时反映执行状态。
  • 🚀 真实执行:复用/创建会话 → 应用模型 → 重命名会话 → session.prompt 发送提示词 → 监听回合结束并自动落列(成功 / 失败)。
  • 🎯 按任务选定模型:模型下拉来自 host 级 llm.models 目录(无需会话即可列出 provider 分组与模型),执行前通过 session.selectModel 下发。
  • 🧾 执行历史:每次执行记录会话、开始/结束时间、结果与失败原因,可一键跳转到对应会话查看完整对话。
  • 💾 本地持久化:数据存浏览器 localStorage(键 dsh.kanban.v1),跨标签页同步。
  • 🔌 零侵入挂载:侧边栏入口 + 中间栏面板均通过 DOM 注入,与 ssh / task-board 等面板协同互斥,不改动任何 dsh 源码。

快速开始

前置条件

  • 已安装并初始化 DSH(dsh web 可正常启动,且存在 web profile)。
  • Node.js ≥ 22、pnpm ≥ 10。

方式一:本地构建后 link(推荐,适合开发 / 二次修改)

# 1. 克隆仓库
git clone https://github.com/raosay/dsh-kanban.git
cd dsh-kanban

# 2. 安装依赖并构建(产出 lib/index.js 与 lib/client.js)
pnpm install
pnpm build

# 3. 安装进你的 web profile(把克隆目录链接进 profile)
dsh plugin --profile web add link:"$PWD"

# 4. 重启 dsh web(先停掉当前 dsh web,再重新运行 `dsh web`)

说明:dsh plugin add link:<path> 会把插件加入 ~/.dsh/profiles/<profile> 的依赖,并自动把它追加到 dsh.profile.bundles(因为包声明了 dsh.bundle)。重启后侧边栏即出现「看板」入口。

方式二:直接按 git 地址安装

dsh plugin --profile web add github:raosay/dsh-kanban

pnpm ≥ 10 默认拦截 git 依赖的 prepare 构建脚本。若安装时提示 Ignored build scripts: dsh-kanban,请按提示把 dsh-kanban 加入 ~/.dsh/profiles/<profile>/pnpm-workspace.yamlallowBuilds 后重跑一次。

验证

重启 dsh web 后:

  1. 侧边栏「新会话」按钮下方出现「看板」入口。
  2. 点开看板 →「新建任务」,能看到「模型」下拉(来自 llm.models,形如 deepseek-v4-flash · DeepSeek)。
  3. 选一个模型后执行任务,卡片依次经历「进行中 → 已完成 / 已失败」,执行历史里可跳转到对应会话。

使用指南

创建任务

点「+ 新建任务」,填写:

  • 标题(必填):一句话描述要做什么。
  • 描述(可选):背景、范围、验收标准。
  • 执行提示词(可选):发送给 agent 的完整指令;留空则用标题作为提示词。
  • 模型(可选):从模型目录选择一个具体模型;留空 = 会话默认模型。

执行任务

在任务详情里点「执行」/「再次执行」。执行会真实驱动一个 dsh agent 会话:

  1. 连接(复用空白会话或新建)到最近使用的工作区。
  2. 若任务指定了模型,先调用 session.selectModel 应用。
  3. 将会话重命名为任务标题。
  4. 发送提示词,并监听回合结束,把任务落到「已完成」或「已失败」。

任务详情

  • 查看描述、提示词、模型设置与执行历史。
  • 修改模型、手动移动到「待规划 / 待办」。
  • 删除(带确认)、跳转到执行会话。

模型选择实现原理

新建/编辑任务                    执行时
──────────────                   ──────────────
llm.models({})                connectWorkspace()
   │  (host 级目录,无需会话)        │
   ▼                                ▼
{ provider, model }      session.selectModel({ sessionId,
(随任务存 localStorage)        provider, model })
                                       │
                                       ▼
                              session.prompt(...)  ← 发送提示词
  • 目录来源llm.models(session-independent 的模型目录),返回 provider 分组 + 每个 provider 下的模型。
  • 应用时机src/core/execution.tsapplyModel,在发送提示词之前调用。
  • 持久化:模型以 { provider, model } 存在任务记录上,随看板一起落到 localStorage

⚠️ 注意:DSH 的 session.selectModel 是唯一的模型选择原语,它会把所选模型同时记为默认模型(与官方模型选择器行为一致)。因此按任务选定模型,也会影响之后新建会话的默认模型。

目录结构

dsh-kanban/
├── package.json           # 包清单:dsh.bundle.patch + dsh.client 声明
├── cordis.patch.yml       # bundle patch:向 profile 插入插件行
├── tsdown.config.ts       # tsdown 构建配置
├── tsconfig.json          # 类型检查配置
├── tsconfig.build.json    # 类型产物构建配置
├── build/                 # 客户端打包预设(复用 dsh-web-ui 共享预设)
└── src/
    ├── index.ts           # host 半区:system-prompt 公告(让 agent 知晓本插件)
    ├── invariant.ts       # 空 invariant(无跨包运行时断言)
    ├── mount-once.ts      # host 单实例守卫
    ├── core/              # 框架无关的核心(tasks / execution / store / controller / use-cases)
    └── client/            # 浏览器半区(wiring / sidebar / board-mount / 组件 / 样式)
  • host 半区src/index.ts):向每个 agent 的 system prompt 注入一段公告,说明看板的存在与协作方式。
  • browser 半区src/client/):看板 UI + 与真实运行时(sessions / workspaces / connection)的 wiring。
  • coresrc/core/):与 cordis 无关的纯领域逻辑,可脱离运行时做单元测试。

构建与开发

pnpm install       # 安装依赖
pnpm build         # tsc 产出类型 + tsdown 产出 lib/index.js 与 lib/client.js
pnpm run bundle    # 仅 tsdown(产出运行时产物,不含类型)
pnpm run typecheck # 仅类型检查
pnpm run watch     # 监听模式(配合开发)

prepare 脚本已配置为 tsdown:通过 git 地址安装时,pnpm 会自动构建运行时产物。

数据存储

  • 键:dsh.kanban.v1(浏览器 localStorage)。
  • 内容:任务数组(含标题、描述、提示词、状态、创建/更新时间、执行历史、模型选择)。
  • 跨标签页:监听 storage 事件,一个标签页的修改会同步到其他标签页。

限制与注意事项

  • 消耗 API 额度:执行任务会真实驱动 dsh agent 会话。
  • 默认模型副作用:见上文「模型选择实现原理」的 ⚠️ 说明。
  • 壳布局依赖:面板通过 DOM 注入挂载,依赖 dsh Web GUI 的壳布局([class*="centerCol"] / [data-pane="conversation"] / [class*="logoRow"] 等选择器)。若 dsh 壳改版,可能需要同步调整这些选择器。
  • 与 dsh-task-board 定位重叠:本插件与 dsh-web-ui 的 dsh-task-board 都提供看板,建议二选一安装,避免侧边栏出现两个看板入口。

License

Apache-2.0

致谢