前言¶
DeepSeekRuntime(DSH)通过插件扩展能力,开发者可以在本地构建专用工作流。在软件研发流程中,任务、Bug、需求往往分散在禅道(ZenTao)等工具里,需要频繁在工具和 AI 之间切换。传统做法是手动复制标题、描述到 DSH,截图需要另存为图片再上传。这种方式不仅繁琐,而且截图往往只是占位符,模型看不到真实内容。
本文介绍 big-li99/dsh-zentao-panel,一个 DeepSeekRuntime 的禅道工作台插件。它把禅道任务/Bug/需求集成到 DSH 左侧边栏,支持多账号、截图转真实图片附件、卡片一键转对话上下文,并提供处理状态实时反馈。
这是什么¶
dsh-zentao-panel 是一个工作流插件,由维护者 big-li99 开发,分类为「工作流」。它在 DSH 左侧边栏以禅道图标为入口(与「记忆系统」同款形式),点击后面板占据主区域,查看指派给我的任务、Bug、需求,并支持一键转成 DSH 对话上下文。
核心功能¶
左侧栏全局面板¶
插件在 DSH 左侧边栏注册一个禅道图标,点击后以全局面板方式展示任务、Bug、需求三个分段标签。每个标签下显示卡片列表与详情,支持点击查看完整信息。
多账号支持¶
插件支持保存多个禅道账号,包括同实例切换账号、多实例混用。头部提供账号菜单,可一键切换、按账号移除。切换即时生效,无需重新登录;每账号使用独立的 cookie/缓存。
卡片插入对话¶
支持卡片拖拽或点击插入到 DSH 对话输入框。插入内容为精简 Markdown,仅包含标题与描述/重现步骤,不带元信息、原地址或页脚。
截图转真实图片附件¶
禅道描述里的 <img> 标签(含列表接口的占位符如 {35861.png})在插入时会被下载,作为 DSH 图片附件挂到输入框。发送后模型可以真正看到图片,而非占位符。
「处理」按钮¶
点击卡片上的「处理」按钮,会弹窗选择工作区、接入的模型(按接入方分组)和思考强度(默认带出当前会话的设置)。确认后新建会话,按所选模型设置并自动下发任务背景提示词(含图片附件)。下发过程不会跳转视图,仍留在禅道面板继续处理其他卡片。
关联会话跳转¶
处理过的卡片左侧会出现会话 chip,显示该 DSH 会话标题。点击即可跳回该会话继续跟进。会话被删除后 chip 显示「会话已删除」,点击可清除标记。关联按禅道账号隔离,只存本地 localStorage,不落任何远端。
实时状态反馈¶
处理过的卡片 chip 前有活性状态点。会话在跑时,卡片显示蓝色「处理中」胶囊(三点跳动);agent 等决策时,显示琥珀色「等你决策」(呼吸描边);后台会话完成后,显示绿色「已完成」徽标,同时弹出提醒条,点击「去看看」直接跳回会话。提醒不依赖面板是否打开(正开着的会话完成不重复提醒;安装了 dsh-notify-me 的话系统通知也会照发,两条通道独立)。
登录态持久化¶
插件支持登录态持久化,约 30 天免登。会话失效时自动重登。
主题跟随¶
全部颜色使用 DSH 语义 token(--dsw-alias-*),日间/夜间自动跟随。
只读,不回写禅道¶
插件为只读,不会向禅道回写任何数据。
安装与启用¶
从 npm 安装(推荐):
DSH="/Applications/DeepSeekRuntime.app/Contents/Resources/runtime/cli/bin/dsh"
"$DSH" plugin --profile desktop add dsh-zentao-panel
或从源码安装:
git clone https://github.com/big-li99/dsh-zentao-panel.git
DSH="/Applications/DeepSeekRuntime.app/Contents/Resources/runtime/cli/bin/dsh"
"$DSH" plugin --profile desktop add "$(pwd)/dsh-zentao-panel"
重启 DSH Desktop 生效(client 侧改动一般 ⌘R 重载渲染进程即可;host 侧改动需重装插件后重启)。
卸载¶
"$DSH" plugin --profile desktop remove dsh-zentao-panel
# 可选:清除本地凭据
rm -rf ~/.dsh/zentao-panel
配置¶
登录信息保存在 ~/.dsh/zentao-panel/config.json(权限 0600,仅本机),schema v2:
{
"version": 2,
"accounts": [ /* { id, baseUrl, account, password(base64 混淆), cookies } */ ],
"activeId": "当前激活账号的 id"
}
账号 id 由 baseUrl + account 哈希得到,同账号重复登录等于更新凭据;旧版单账号格式读取时自动迁移,无需手动处理。卸载插件后文件不会自动删除,需要时手动清理。
技术说明¶
数据链路¶
插件在 ZenTao 18.13 开源版实测,RESTful API v2 在该实例不可用。网页登录协议使用 md5(md5(password) + verifyRand) 加密,配合 jQuery 风格请求头。数据主通道为 /my-work-{task,bug,story}.json(需登录态 cookie,一次拿全量),详情接口为 /api.php/v1/{tasks,bugs,stories}/{id}。
界面挂载¶
插件利用 DSH 0.2.1-rc.2 的 slot 机制:左侧栏全局面板通过 sidebar.panellist 列表 slot 注册图标行({id, order, label}),同 id 在根作用域 main keyed slot 注册面板组件。点击图标调用 ctx.layout.selectPanel(id),面板占据整个主区域。main slot 按 entryKey = activePanelId ?? 'conversation' 只渲染当前选中面板,切回会话时面板卸载,重挂由模块级 paneCache 秒恢复列表。
用户主动跳转(会话 chip / 提醒条「去看看」)走 uiWorkspace.openSession,内部调用 replaceMain(..., "reveal") → selectPanel(null),自动切回会话视图。「处理」下发不走 openSession(会强制切视图),改为 sessions.retain(sessionId, {source:'zentao-panel'}) 后台保活,再通过 conversation.input.for(scope) 的服务级 setDraft / addAttachments / submit 发送,不需要视图挂载,发送完成后释放 retain。
旧版 DSH 没有这两个 slot 时,插件自动退回右缘悬浮按钮 + 侧滑面板。颜色使用 --dsw-alias-* 语义 token,暗色由 body[data-ds-dark-theme] 自动切换。
真实图片附件¶
宿主利用登录态 cookie 下载禅道图片,RPC zentao.image 返回 {name, mediaType, base64}。渲染端通过 new File([bytes], name, {type}) → conversation.createDrafts(sessionId, files) 获取 draft id,再通过 conversation.input.for(scope).addAttachments(ids) 添加附件。addAttachments 只接受已注册的 draft id,不直接收 File。由于用户消息不渲染 markdown,图片只能走附件通道,发送后模型可见。支持的格式为 png/jpeg/webp/gif,单图 ≤20MB、单边 ≤8192、单消息 ≤20 张;超大截图会先在浏览器里缩到 2048 长边再附加(DSH 宿主本身也会归一化到 ≤2048)。模型不支持图片输入时宿主会拒绝整条 prompt,此时可在输入框里移除图片附件后发送。
详见《计划书.md》附录 A。
适用场景与注意¶
本插件适合需要在 DSH 中直接处理禅道任务/Bug/需求、希望截图能被模型真实看到的开发者。使用前请检查 DSH 版本兼容性(当前兼容 DSH 0.2.1-rc.2),并在安装前阅读源码与许可证(MIT)。
插件以当前 DSH 进程权限运行,安装前应检查源码与许可证。
结尾¶
本文介绍了 big-li99/dsh-zentao-panel,一个将禅道任务/Bug/需求集成到 DSH 左侧边栏的工作流插件。它支持多账号、截图转真实图片附件、卡片一键转对话上下文,并提供处理状态实时反馈。更多细节可查看插件目录页与 GitHub 仓库。