dsh-agents-viewer:把 AGENTS.md 指令链放进 DSH 右侧栏

前言

在 DSH(DeepSeek Harness)里调试智能体,绕不开 AGENTS.md。全局的 ~/.dsh/AGENTS.md、共享的 ~/.agents/AGENTS.md,再加上项目根到会话 cwd 每一层目录里的 AGENTS.md / CLAUDE.md / AGENTS.local.md / CLAUDE.local.md,文件分散、层级多,改完要猜下一次哪次工具调用会读到。dsh-agents-viewer 做的事情是把这些指令文件收拢到一个入口:右侧栏原生 tab 里查看和编辑,聊天头部给一键按钮,另配一条不依赖界面的 /agents 命令。它定位的是编辑与查看,不重写 DSH 的指令加载逻辑。

这是什么

dsh-agents-viewer 是一个 DSH dual-face bundle 插件:宿主半在 index.js,客户端半在 runtime/client.js,由 package.json 的 dsh.client 声明。维护者为 atrestandbed-bot,包版本 0.7.0,MIT 许可。

它需要带 ctx.sidebarRightTabs 的 DSH。README 标注 0.2.2-rc.1(Electron 44.7.0)已验证,engines.dsh 只保留下限 >=0.2.2-rc.1,没有上限,dsh.client.inject 为空,服务在运行时探测。作者的取舍是:DSH 小版本更新不用改清单;真改了 API,最坏少一个 tab,DSH 仍能启动。

核心功能

右侧栏原生 tab

在右侧栏的「添加」菜单或引导页里打开 AGENTS.md。用的是 DSH 自己的 tab、分栏、全屏、拖拽和收起,而不是浮动抽屉加遮罩,也没有 requestAnimationFrame 跟随或者「等 30 秒兜底按钮」那类做法。

聊天头部按钮

文件/侧栏按钮那一簇的左边有一个 AGENTS.md 图标,点一下打开原生 tab。右侧栏已展开且当前就是 AGENTS.md 时,再点一次收起侧栏。按钮默认显示;/agents c 和 /agents o 把状态写入持久化文件,下次启动 DSH 后才按新状态显示或隐藏。

完整指令链

面板覆盖全局 ~/.dsh/AGENTS.md、共享 ~/.agents/AGENTS.md,以及项目根到会话 cwd 每一层目录下的 AGENTS.md / CLAUDE.md / AGENTS.local.md / CLAUDE.local.md。面板和 /agents 命令同口径,子目录里的文件也能直接改。链外的任意子目录不出现。

精确项目

tab 正文从标准 props 拿到 sessionId 和 useSessions,宿主按 session id 反查 ~/.dsh/storages/workspace.json 定位工作区,不再用「最近更新的工作区」猜。拿不到会话时才退回最近工作区,并在 tab 上标「推断」、保存前确认。

原地编辑保存

列表点选 → 编辑 → Ctrl+S 或「保存」。文件不存在时写内容保存即创建。

安装与启用

推荐直接用 DSH 的插件页安装这个包,它会自动处理依赖和 bundles;或者在本 checkout 里跑 npm run adapt:install。

手动装进某个 profile(以 Windows 桌面 profile 为例)按三步走。这段在做什么:先把包目录复制进 profile 的 node_modules,再在 profile 的 package.json 里登记依赖和 bundles,最后重启 DSH。

$profile = "$env:USERPROFILE\.dsh\profiles\desktop"
$name    = "dsh-agents-viewer"

# 1) 把包目录复制进去(要包含 runtime/)
Copy-Item -Recurse -Force "<这个包的路径>" "$profile\node_modules\$name"

# 2) 在 profile 的 package.json 里登记:
#    dependencies 里加   "dsh-agents-viewer": "file:<这个包的绝对路径>"
#    dsh.profile.bundles 末尾追加   "dsh-agents-viewer"
#    注意:bundles 才是“启用”开关;只在 dependencies 里是“装了但没启用”。

# 3) 重启 DSH(客户端 tab 的类型注册发生在启动时)

改之前建议先备份 profile 的 package.json 和 cordis.patch.yml。

升级 DSH 后可以先跑自适应检查,看版本、engines、profile 副本是否一致:

npm run adapt          # 只检查:版本、engines、profile 副本是否一致
# 退出 DSH 后,需要把本 checkout 同步进 profile 时:
npm run adapt:install

另外提供一个手动的清单核对脚本,可直接指定安装位置,也可以核对 app.asar:

node scripts/check-compat.mjs
# 或指定安装位置
node scripts/check-compat.mjs --asar "D:/Program Files/DeepSeek Harness/resources/app.asar"

它会核对 dsh.client.inject 里的每个包是否存在、engines.dsh 是否接受当前版本、客户端 bundle 是否还按 window.__ModuleLoader__.load 注册。DSH 改了模块名时,这里会先报 FAIL。

典型用法

/agents 命令不依赖界面,任何情况下都可用:

/agents                列出所有 AGENTS.md
/agents <序号>          看全文
/agents all            看全部
/agents w <序号>        用外部编辑器打开
/agents n              新建(项目级)
/agents n global       新建全局
/agents n shared       新建共享
/agents o              记录“显示按钮”(下次启动生效)
/agents c              记录“隐藏按钮”(下次启动生效)
/agents help           用法

界面路径与命令路径等价:在右侧栏「添加」菜单里打开 tab,点头部按钮切换,列表里点选后编辑、Ctrl+S 保存。

实现要点

只看实现思路里值得留意的几处:

  • 客户端用 ctx.sidebarRightTabs.register({ id, kind, priority, title, guide, keepMounted }) 注册页面类型,正文通过 ctx.slots.register({ name: 'sidebar.right.pane.tab', key: id }, Body) 挂载。正文的标准 props 直接给 sessionId 和 useSessions,没有 DOM 观察和 URL 解析。
  • 头部按钮注册进 conversation.session.header.utilities(list 槽,order: -100)。点击时:侧栏收起 → openTab('agents');已展开且当前 tab 是 agents → toggleExpanded() 收起;展开但是别的 tab → 切到 agents。
  • 宿主用 webServer.register 暴露 /dsh-agents-viewer/list、/read、/write,resolveProject(hint) 从 hint 里的 session-<uuid> 反查 workspace.json。
  • 白名单是全局、共享,加上项目根到 cwd 的目录链,其余路径一律 403;写盘是宿主进程直接 fs.writeFileSync,白名单是唯一入口。
  • 兼容性上,客户端只 Cordis-inject slots,sidebarRightTabs / sidebarRight 用嵌套 ctx.inject 按需等待;宿主对 webServer.register / commands.register / workingDirectory.ensure 先判类型,缺了只打 warning。webserver/index-inject 全包 try/catch,插件异常不会把 index 变成 500。

适用场景与注意

适合在 DSH 里维护 AGENTS.md 指令链的开发者:需要跨全局、共享、项目多层编辑,或者需要一条不依赖界面的兜底命令。README 标注的兼容性区间是 dsh >=0.2.2-rc.1,验证版本为 0.2.2-rc.1(Electron 44.7.0)。

几点必须留意:

  • 插件以当前 dsh 进程权限运行,能读写白名单内的路径;安装前先读一遍源码,确认许可证为 MIT。
  • 面板保存不触发指令热刷新:宿主直接写盘,dsh-agent-instructions 只在后续一次 read / write / edit 工具调用时刷新。当前会话要立刻看到新内容,需要新开会话,或让 agent 对该文件做一次读写。
  • /agents o 和 /agents c 不是即时显隐,只改持久化状态,按钮在下次启动或刷新的页面加载时读取。
  • 首次安装或升级需要重启 DSH,客户端模块图在启动时组装。
  • 改 profile 的 bundles、connection 或启动项前先完整退出 DSH:运行中改动会触发 HMR,当前浏览器连接被换掉,进行中的会话以 turn/end: aborted / disposed 结束。只改插件工作目录里的代码则可以热重载。
  • 目录页是社区站点的插件列表,与 DeepSeek / 幻方没有官方从属关系,不是官方应用商店。

另外,README 专门说明一类 desktop welcome: Web authentication failed 启动失败不是插件造成的,失败点在桌面壳向自己刚启动的 Host 换 cookie 的一步,插件尚未参与。判断方法是崩溃日志里的 --- error --- 是否为该信息,以及点「禁用第三方插件」后是否继续崩。

结尾

dsh-agents-viewer 的价值在于把分散的 AGENTS.md 收进 DSH 原生界面,读和改走同一个口径,另留一条不依赖界面的命令通道。目录页:https://www.skillhub.cn/plugins/atrestandbed-bot/dsh-agents-viewer ;源码:https://github.com/atrestandbed-bot/dsh-agents-viewer

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜