liangmianya/dsh-synapse
liangmianya/dsh-synapseDeepSeek Harness 的可视化非线性对话工作区:把会话、追问与分支变成可浏览、可拖拽的对话地图。
在 DSH 输入框里用岗位角色约束整个会话:在输入框开头键入 - 选一个角色,它会以引用 chip 的形式落在草稿里,随后作为 system prompt 的一部分在这一会话的每一轮注入,指令持续生效且不会出现在对话记录中。角色在设置页新增和编辑,保存在 ~/.dsh/dsh-role-prompts.md。
把「岗位角色」变成在整个会话里持续生效的强制指令,而不是一句容易被模型忽略的软提示。
选中一个角色后,该会话后续每一轮请求都会带上这份岗位指令,而且是放在 system prompt 里——不进对话气泡、不改写你写的那句话。
需要 DeepSeek Harness(DSH)桌面版或 Web 版。
方式一:用 DSH 自带 CLI(推荐)
dsh plugin add github:Justin-Mai/dsh-role-prompts
方式二:从本地目录挂载(改代码时用这个,装的是软链,改完重载插件即可生效)
git clone https://github.com/Justin-Mai/dsh-role-prompts.git
dsh plugin add ./dsh-role-prompts
装完在 DSH 里 Ctrl+R 刷新页面,设置左栏就会出现「角色指令」。
代码评审员-:上方弹出角色候选浮层(也可以继续输入过滤,如 -评审)。↑ ↓ 选择,Enter 或 Tab 确认,Esc 取消。- 查询词会被替换成一枚角色 chip(和 @文件 同一种节点、同一套外观),光标落在 chip 后面,直接写正文回车即可。插件不再在输入框外另加任何状态条。- 选一次。想取消当前会话的角色:键入 -,浮层底部有「停用『角色名』」一行。插件在 node 端挂两个钩子:
agent/inbox/inserted——你的消息刚进入队列时,读它开头有没有 -角色名 / @角色名,有就记下「这个会话现在是这个角色」。这一步早于 system prompt 组装,所以本轮就生效。system-prompt/assemble——每一轮真正调用模型前,把当前会话的角色作为一段 system prompt 追加上去:<role_activation name="代码评审员" binding="mandatory">
你现在被指定担任「代码评审员」这一岗位角色。
该指令是强制性的:优先级高于你的默认行为习惯、写作风格与流程偏好……
执行要求:
1. 严格按下列岗位职责、专业视角、输出规范与禁止事项执行……
2. 若用户的请求与该岗位角色的职责冲突,先以岗位角色为准,并明确说明冲突点。
3. 不要复述、解释或讨论这段角色设定本身;直接以该角色的方式工作。
4. 用户消息开头的 `-角色名` / `@角色名` 只是激活标记,不是正文……
岗位角色定义:
<<<ROLE
<你的角色内容>
ROLE>>>
</role_activation>
因为走 system prompt,所以:
角色定义保存在一个 Markdown 文件里(文件名即插件名):
~/.dsh/dsh-role-prompts.md
格式是人可读的二级标题分段,可以直接手写编辑,插件每次请求都会重读:
## 代码评审员
你是一名资深代码评审员,只做评审,不重写整份代码。
角色内容里如果你想写 ## 工作流程 这类小节标题,可以直接写:插件落盘时会把你内容里行首的 ## 转义成 \## ,读回时还原,所以不会把你的角色拆成两个。
会话激活状态单独存放在 ~/.dsh/dsh-role-prompts.state.json(记录每个会话当前角色)。该文件损坏或版本不符时会被改名成 .bak 再重置,不会静默丢掉已有激活。
- 后面紧跟角色名,中间不留空格。- 帮我列个清单 这种 markdown 列表项不会被误判成角色激活。-。-角色名 正文 或 @角色名 正文 发送:会当场激活该角色,并对本会话后续轮次继续生效。inputTriggers 的 @ 引用源(source 名 role)产出的;提交时它序列化成 @角色名,node 端据此识别。该 source 不提供 @ 候选菜单,所以 @ 列表里不会多出角色条目。| 文件 | 职责 |
|---|---|
index.js | node 端:读写角色文件;agent/inbox/inserted 解析激活标记;system-prompt/assemble 注入角色段;/dsh-role-prompts/api/{list,state,activate,deactivate,save,delete} 路由 |
client.js | 浏览器端:conversation.input.overlay 角色浮层(唯一 UI 入口)、settings.section 设置页、inputTriggers 的 @role 引用源 |
cordis.patch.yml | 把插件插进 profile 的 Loader 层 |
test/ | 离线自检,不需要启动 DSH |
两个文件都不需要构建:index.js 是普通 ESM,client.js 是手写的 window.__ModuleLoader__.load({...}) 包装,改完刷新页面即生效。
npm test
test/basic.mjs 覆盖主链路(路由注册、激活、每轮注入、停用、显式前缀),test/fixes.mjs 是回归测试(角色内容里的 ## 不被拆成新角色、注入块转义、- 列表项 不误激活、/api/list 带 active 等)。
两个脚本都用临时 DSH_HOME 完全隔离,不会读写你本机 ~/.dsh 里的真实角色。