READMESource: main@260bc686
dsh-prompt-switcher
DeepSeek Harness(DSH) Web 插件。新建对话时输入 /,可以从本地目录里的 .md 提示词模板中选一个。模板的约束力等同于 AGENTS.md,对这个对话之后的每一轮都有效。还可以设置对所有新对话生效的全局提示词,并通过 WebDAV 在多台设备之间同步提示词模板。
- 兼容版本:DSH
>=0.1.7-alpha.1,即 0.1.7 系列的 alpha 版及之后的正式版;Node>=22.19 - 插件形式:标准 DSH bundle。
package.json里声明了dsh.bundle.patch和dsh.client,Host 半和 Browser 半都是纯 ESM,没有运行时依赖,安装时不需要构建 - 收录在 mikulo/dsh-plugins 插件清单中
功能
| 设置页 | 设置 → 提示词模板:选择模板目录(弹出系统文件夹对话框,也可以直接填路径),读取目录第一层的全部 .md 文件(不读子目录),每个模板有激活开关和「编辑」按钮,另有「刷新」按钮 |
/ 菜单 |
已激活的模板按文件名显示在 / 菜单里,默认排在 Harness 自带指令之前(可以关闭) |
| 约束整个对话 | 选中模板并发送第一条消息后,模板以 AGENTS.md 同样的方式写入会话,之后每一轮都生效。上下文压缩、恢复会话、分叉会话后都会保留 |
| 只对新对话生效 | 已经进行过对话的会话里使用模板会被拒绝:模板不生效,消息也不发出,草稿保留 |
| 全局提示词 | 选一个 .md 文件(以文件名作为名称),或者直接输入一段文本并为其取名(保存为模板目录下的 名称.md),作为全局提示词。开启后,之后新建的每个对话都会遵守它;在新对话里再用 / 选择模板时,模板追加在全局提示词之后,两者同时生效,不会互相覆盖 |
| WebDAV 云同步 | 独立的「WebDAV 云同步」标签页:配置服务器、可选的 HTTP / SOCKS5 代理、一键测试连接;「同步到本地」「同步到云端」列出对方目录第一层的 .md 文件,勾选后同步,遇到同名文件逐个询问是否覆盖(可全部覆盖 / 全部跳过) |
| 模板编辑 | 整页编辑视图:大号等宽编辑框,Ctrl+S 保存,显示未保存状态,检测保存冲突,并自动同步在外部编辑器里所做的修改。「用其他程序打开…」会弹出系统的“打开方式”对话框,由你自己选择编辑器 |
安装
通过 dsh-plugins 清单(推荐)
git clone https://github.com/mikulo/dsh-plugins.git
cd dsh-plugins
node install.mjs --profile web --only dsh-prompt-switcher
直接安装
dsh plugin --profile web add github:mikulo/dsh-prompt-switcher
安装后重启 dsh web 并刷新页面。
- 更新:
dsh plugin --profile web update @mikulo/dsh-prompt-switcher,然后重启dsh web - 卸载:
dsh plugin --profile web remove @mikulo/dsh-prompt-switcher
插件的 Browser 半会随页面热更新,Host 半必须重启
dsh web才会加载新代码。两边版本不一致时,设置页顶部会提示“请重启 dsh web”。
使用
- 打开 设置 → 提示词模板,点击「选择文件夹」,选中存放模板的目录。
- 只读取该目录第一层的
*.md文件,扩展名不区分大小写。列表按文件名显示。 - 新目录中的模板默认全部关闭,打开开关才会激活。
- 目录里的文件增删改之后,点击「刷新」。
- 只读取该目录第一层的
- 新建对话,在输入框输入
/,已激活的模板(例如代码审查)会出现在菜单里。继续输入文字可以过滤。 - 选中模板后,输入框变为
/代码审查,接着输入第一条消息并发送。之后这个对话的每一轮都会遵守该模板。
仓库里的 examples/ 有两个示例模板,可以把它设为模板目录来体验。
全局提示词
在 设置 → 提示词模板 → 全局提示词 中配置:
- 选择来源:
- 模板文件:从模板目录的
.md文件中选一个,文件名(不含扩展名)就是全局提示词的名称。之后更换模板目录不影响已选的文件。 - 自定义文本:填写名称(必填)和内容,点击「保存」或按 Ctrl+S。内容保存为模板目录下的
名称.md(需要先配置模板目录),之后也会出现在模板列表里,可以用「编辑」修改。目录中已有同名的其他文件时,会先询问是否覆盖。改名后保存会写入新文件,旧文件保留。
- 模板文件:从模板目录的
- 打开「启用全局提示词」开关。配置不完整时开关打不开,并提示原因。
规则:
- 只对开启之后新建的顶层对话生效;已开始的对话和子代理会话不会被注入。分叉出来的会话沿用原会话的状态(原会话有就有,没有就没有)。
- 对话开始时绑定的是当时的快照:之后修改或关闭全局提示词,只影响再之后新建的对话。上下文压缩后会重新注入同一份快照。
- 在新对话中用
/选择模板时,会话里依次是 全局提示词 → 模板 → 你的第一条消息。模板追加在全局提示词之后,两者同时生效。/菜单中的模板说明会显示“追加在全局提示词「…」之后”。 - 全局提示词启用了但读不到(文件被删、内容为空等)时,设置页显示原因,新对话照常进行,只是不注入。
WebDAV 云同步
在 设置 → 提示词模板 顶部切换到「WebDAV 云同步」标签页:
- 服务器:填写存放模板的 WebDAV 目录地址(例如
https://dav.jianguoyun.com/dav/prompts/)、用户名和密码(坚果云等服务请使用应用专用密码)。密码只保存在本机,不会回传到页面;再次保存时密码框留空表示保持不变。 - 代理(默认关闭):打开「通过代理连接」后,可选 HTTP 或 SOCKS5,地址默认
127.0.0.1:7891,可以修改。开关决定「测试连接」和同步是否经过代理。暂不支持需要认证的代理。 - 测试连接:用表单里当前(可以尚未保存)的配置访问该目录,显示成功、认证失败、目录不存在、代理连不上等结果。
- 点「保存配置」后才能同步。
同步(只处理两边目录第一层的 .md 文件,不含子目录):
- 同步到本地:列出云端目录的
.md文件,默认全部勾选,「全选 / 取消全选」一键切换。点「同步到本地」下载到模板目录。 - 同步到云端:列出本地模板目录的
.md文件,操作同上,上传到云端目录;云端目录不存在时自动创建。 - 目标位置已有同名文件时,逐个询问「覆盖 / 跳过」,同名文件不止一个时还可以「全部覆盖 / 全部跳过」,也可以「取消同步」。完成后列出每个文件的结果(新增 / 覆盖 / 跳过 / 失败)。
说明:只支持 Basic 认证;单个文件上限 1 MiB;配置保存在 $DSH_HOME/dsh-prompt-switcher.json,其中密码是明文。
编辑模板
在列表中点「编辑」进入编辑视图:
- 「保存」或 Ctrl+S 保存,「放弃修改」回到上次保存的内容,标题旁显示“已保存 / 未保存”,Tab 键插入两个空格。
- 用其他程序打开…:Windows 上弹出“你要如何打开这个文件?”对话框,macOS 上弹出“选取应用程序”对话框,Linux 上用默认程序打开。在外部编辑器保存后,编辑视图约 2 秒内自动同步。如果这里也有未保存的修改,会让你选择「载入磁盘版本」或「保留我的修改」。
- 文件在打开后被其他程序改过时,保存会被拒绝,并提供「载入磁盘版本 / 仍然覆盖保存」。
- 关闭设置对话框时,未保存的草稿会保留到页面刷新前。
- 保存时保留文件原有的 BOM 和 CRLF 换行。
- 修改模板只影响之后新建的对话。已经开始的对话使用的是第一次发送时的模板快照。
工作原理
| 需求 | 实现 |
|---|---|
| 设置页面 | Browser 半向 settings.section 槽位注册页面 |
| 文件夹对话框 | 优先使用 Host 的 directoryPicker 服务(原生对话框)。该服务不可用时,Windows 上用 PowerShell 的 FolderBrowserDialog,其他平台提示手动输入 |
| 设置与模板读写 | Host 路由 /api/dsh-prompt-switcher/*,只接受本机回环地址的请求。只接受当前目录扫描结果里的文件名,访问不到目录以外的路径。配置保存在 $DSH_HOME/dsh-prompt-switcher.json(默认 ~/.dsh) |
/ 菜单显示中文名 |
Host 命令名只能用 ASCII,所以 Browser 半注册了自己的 / 输入触发源。选中后提交 Host 命令 /prompt-template <模板id> <消息>。置顶就是调整触发源的 order |
| 绑定模板 | Handler 先确认这是新对话,然后 agent.inject(模板消息),再 agent.steer(用户消息),与官方 /plan 的做法相同 |
| 约束力等同于 AGENTS.md | 模板以带来源 {kind:'prompt-switcher', form:'instructions'} 的 <system-reminder> user 消息写入会话日志,措辞与 dsh-agent-instructions 一致,即不高于 system、developer 或用户的直接指令 |
| 持续生效 | 会话投影从完整日志中折叠出已绑定的模板快照,所以恢复和分叉会话都能还原。agent/pre-step 钩子在模板被上下文压缩掉后,重新注入同一份快照 |
| 全局提示词 | agent/pre-step 钩子在新顶层对话的第一轮,把全局提示词以来源 {kind:'prompt-switcher-global', form:'instructions'} 的 <system-reminder> 消息放在本步消息最前面;通过 / 模板开始的对话,由命令 handler 依次注入 全局提示词 → 模板 → 用户消息。同一会话投影同时折叠全局提示词和模板快照,压缩后按同样顺序补回 |
| WebDAV 同步 | Host 半只用 Node 内置模块实现 WebDAV 客户端(PROPFIND 列目录、GET 下载、PUT 上传、MKCOL 建目录,Basic 认证)。代理:HTTP 代理用 CONNECT 隧道,SOCKS5 由代理解析域名,隧道建立后再按需做 TLS。只接受当前列表里的文件名;是否覆盖同名文件由 Host 在写入前重新检查 |
注意:
- 子代理(subagent)的会话不继承模板,也不注入全局提示词。
- 单个模板上限为 1 MiB。模板中的
</system-reminder>会被转义。 - 设置接口只接受本机访问。通过局域网打开的 Web 页面不能修改本插件的设置。
开发
npm run build # src/ → lib/:写入版本号,校验 Host/Client 协议号与模块 id,并做语法检查
npm test # 确认 lib/ 与 src/ 一致,然后用伪造的 Harness 服务跑 Host 与 Client 冒烟测试,
# 并用本地假 WebDAV 服务器、HTTP 代理和 SOCKS5 代理跑同步测试
- 修改
src/后运行npm run build,并把lib/一起提交。插件通过github:安装时直接使用仓库里的lib/,没有安装时构建脚本。 - 修改 Host 与 Client 之间的接口时,同时递增
src/index.js和src/client.js中的HOST_PROTOCOL。
本地联调可以用 link 安装:dsh plugin --profile web add link:<本仓库绝对路径>。改代码后重新构建,再重启 dsh web。
更新日志
- 1.3.0:自定义全局提示词保存为模板目录下的
名称.md;新增「WebDAV 云同步」标签页(服务器配置、HTTP / SOCKS5 代理、测试连接、双向选择性同步与同名覆盖确认)。 - 1.2.0:新增全局提示词(模板文件或自定义文本),对之后新建的每个对话生效;
/模板追加在全局提示词之后。 - 1.1.0:首个公开版本:
/选择提示词模板、模板编辑器、外部编辑器同步。
No comments yet. Be the first to write one.