前言¶
用 DSH 跑本地编码代理(Claude Code、Codex、OpenCode、ZCode 等)时,常见的问题是「看不见」和「认不清」:任务分给了哪个代理、代理实际做了什么、提交是谁产生的、哪一步该验收,事后很难回溯。宥于本地环境,多数方案要么往云端导数据,要么需要自己写脚本拼日志。
下面介绍的插件 ningl32/agent-workbench 走的是另一条路:它以 DSH 客户端插件的形式,把本地多个代理的会话、提交和任务放进同一个只读观察面板里,数据只留在你机器上。README 里把核心循环概括为 See → Understand → Attribute → Accept,本文按这个思路展开。
这是什么¶
一句话定位:一个 local-first 的 DSH 工作台插件,把你的本地 AI 编码代理变成一个「可观测、可追责的代理团队」。
- 维护者:ningl32(GitHub 仓库 ningL32/agent-workbench)
- 插件名:fde-console,README 中显示为 fde-console — Super Workbench,package.json 版本 2.9.68
- 许可证:MIT
- 分类:客户端(社区目录 SkillHub 归类)
- 星标:0(截至 2026-11-07)
设计上有几条明确约束,是它的核心价值,也是后面安装时要注意的前提:
- 零云依赖、零第三方运行时依赖,只用 Node 内置模块(
node:sqlite)。 - 所有数据落在自有目录(默认
~/.dsh/fde-console/),数据结构为data/+ 配置。 - 对代理是只读观察,工作台不会写进你的代理进程。
- 凭据不落盘:git 凭据通过运行时读取 git config 获得,所有输出做 redaction,所有出站请求走 SSRF 白名单。
核心功能¶
README 列出的能力较多,下面只挑与日常使用直接相关的几项。
任务面板。 看板式任务管理,带 timeline、验收人签核(acceptor sign-off)、深链接、优先级、截止日期,每个任务还有每日 diary。
代理观测。 通过六个会话来源适配本地代理,提供会话列表、逐条 transcript 阅读器、running-now 检测、按项目分页;面板里能看到每个会话背后的 dispatch prompt(启动时的原始人类指令)。
提交归属。 AI 产生的提交可以按三种约定自动挂到任务上:分支名 task/<id>、提交信息里带 [#<id>]、或把任务绑定到项目目录。仓库侧有跨仓库误匹配的防护。约定细节在 docs/ATTRIBUTION.md,附一段可直接粘贴进 AGENTS.md 的片段和 commit-msg hook。
证据与验收。 每个任务上挂 timeline 和会话证据,证据按任务打分并支持一键或批量确认;另有自动生成的日报 / 周报,可导出为 Markdown。再用 Ctrl+K 在任务标题、会话标题、提交信息、diary 之间做全局搜索。
面板视图。 共七个视图:Overview、Task Radar(会议转写 → AI 拆解任务 → inbox 闸门)、Task Board、Agents、Members、Team Activity(多来源 commit/PR 流 + 任务归属)、Settings。
扩展接口。 MCP server 通过 stdio 暴露只读工具(列任务 / 搜工作 / 查代理状态),供任何 MCP 客户端使用;另有 webhook 出站、飞书 / 钉钉机器人通知、Gitea/GitHub/Gitee 动态流。想接 Cursor、Trae、Aider 等未覆盖的来源,可按 docs/ADAPTERS.md 自己写适配器。
热力图与积分卡(28 天活动网格、SVG 积分卡 endpoint)也属于观测层,适合做团队周会展示。
安装与启用¶
环境要求¶
README 明确列出:
- Node.js ≥ 22.13(使用内置
node:sqlite) - DSH 0.2.1-rc.2(
@deepseek-ai/dsh) - pnpm 在 PATH 上(插件安装会转发给它)
安装步骤¶
第一个坑:新 profile 默认只有 @deepseek-ai/dsh-base,Web 界面 bundle 是分开的。少了这一步插件会加载但不会激活,日志里是 fde-console: pending (waiting for service: webServer),端口不监听。README 给的命令如下,注意版本号要和你本地 dsh --version 对齐:
# 1. install / update the plugin into a profile (the profile is created on first use)
dsh plugin --profile fde-dev add <this repo path>
# 2. 安装与 dsh 版本对齐的 web surface bundle
dsh plugin --profile fde-dev add @deepseek-ai/dsh-web-app@0.2.1-rc.2 # ← use `dsh --version`
# 3. start(不要写 dsh --profile fde-dev web,web 是保留的 alias profile)
dsh --profile fde-dev --port 38082
第二个坑同样在 README 里:add @deepseek-ai/dsh-web-app@0.2.1-rc.2 如果不固定版本,会解析到一个不兼容的旧构建,所以版本号必须钉住。
启动后打开打印出的 URL(含 auth token),侧边栏会出现 Super Workbench。本地代理会自动被发现,第一个会话零配置就能看到。
数据目录与存储迁移¶
数据位于 <DSH_HOME|~/.dsh>/fde-console/。新数据目录先用 JSON 存储;要把自有单元迁到 SQLite + WAL,在所有实例停止的情况下运行迁移脚本:
node scripts/migrate-storage.js # 所有实例先停掉再跑
JSON 仍是导出和互操作格式。README 另提供 docs/VERIFY.md,按 测试门槛 → 插件加载 → API 往返 → UI 的顺序做验收。
用合成数据试玩¶
在正式接代理之前想先看一个填满数据的面板,可以灌一份完全合成的种子数据(占位名字、零网络请求):
node scripts/seed-demo.js # 默认数据目录 ~/.dsh/fde-console/data
node scripts/seed-demo.js --data-dir <dir> --force # 自定义目录 / 覆盖
种子脚本走 JSON 存储通道,因此只接受未迁移的空目录;如果目标是迁移后的 SQLite 目录,脚本会拒绝并提示改用新目录。想重置就删掉种子写入的 JSON 文件。
典型用法¶
1. 在 AGENTS.md 里落地归属约定。 把 docs/ATTRIBUTION.md 里的片段贴进项目,让代理按 task/<id> 分支名或 [#<id>] 提交信息产出,提交就会自动挂到对应任务,Team Activity 里可以直接验收。
2. 用 MCP server 让代理查询看板。 在 MCP 客户端配置里加:
{ "mcpServers": { "fde": { "command": "node", "args": ["<repo>/scripts/mcp-server.mjs"] } } }
这样代理可以自己查任务列表、搜工作项、看代理状态,形成「任务板 ↔ 代理」的双向查询。
3. 跑测试保持基线。 README 给的命令是 npm test,即 node --test test/*.test.js,400+ 用例、零网络。
适用场景与注意¶
适合谁:本地同时跑多个编码代理、需要按任务看板管理进度和验收、且不想把会话数据传上云的 DSH 用户;也适合想把代理活动做成日报 / 周报的团队。
务必注意的几点:
- 插件以当前 dsh 进程权限运行。安装前下载并检查源码与许可证(MIT),确认
cordis.patch.yml、plugin/、scripts/的内容符合你的安全要求。 - 端口以
--port显式指定(示例 38082),URL 带 auth token,注意别把它暴露到公网;出站请求走 SSRF 白名单,涉及 webhook 和 IM 通知时要预先配好白名单。 - Node 版本和 DSH 版本都卡得比较死(≥ 22.13、0.2.1-rc.2 系),升级前先看
docs/下的说明;@deepseek-ai/dsh-web-app必须钉版本。 - 星标为 0、维护者为单人,属于早期个人项目,采用前建议在测试 profile 上先跑一遍
npm test和docs/VERIFY.md。
结尾¶
ningl32/agent-workbench 的价值不在新概念,而是把本地代理的观测、提交归属、验收和报告收敛到同一个只读、本地优先的面板里,且不引入第三方运行时依赖。如果你已经在用 DSH 跑多个本地代理,值得放进一个专属 profile 试一轮。
目录页:https://www.skillhub.cn/plugins/ningL32/agent-workbench
GitHub:https://github.com/ningL32/agent-workbench