fufuyin/dsh-prompt-workbench

dsh-prompt-workbench

Prompt rewrite workbench for DeepSeek Harness: four rewrite modes, cancellable streaming output, and a token-level before/after diff.

待分类deepseekdeepseek-harnessdsh

dsh-prompt-workbench

English | 中文

一个给 DeepSeek Harness(dsh)用的提示词重写工作台:四种重写模式、可中断的流式输出,以及真正的增强前后逐词差异对比。

写好提示词是你在 agent harness 里收益最高的一步,也是最容易被跳过的一步。你打一句模糊的话,agent 只能猜,三轮之后你才开始解释自己到底想要什么。

dsh-prompt-workbench 就停在输入框上方,把那句模糊的话变成 agent 能准确执行的任务说明——不用离开你正在打字的那个框。

它刻意不只是一个「增强」按钮。三点让它更像个工作台,而不是一次性的改写器:

  • 你看得见改了什么。 结果会与你的草稿做逐词差异对比——新增高亮、删除划线。你审的是一份读得懂的改写,而不是一份得从头再读一遍的改写。
  • 流式输出,且能中途停。 结果逐步到达,任务随时可中断,长草稿不会让你对着卡死的输入框干等。
  • 它就待在你打字的地方——输入框工具行里的胶囊按钮,加上浮在输入框上方的面板,而不是另开一个窗口让你去找。

[!WARNING] 安装插件等于在你的 harness 里以你自己的权限运行第三方代码。本插件会把你放进面板的草稿发送到当前会话已经在用的模型路由,且仅此一项——分析本身在浏览器本地完成,不发任何请求。仓库公开不等于安全审计:装之前请先读源码。

目录

安装

dsh plugin --profile web add github:fufuyin/dsh-prompt-workbench

装完重启 profile 并刷新 Web GUI。多数插件刷新页面即可生效;若输入框工具行没出现胶囊按钮,请重启 profile。

开发时从本地检出安装:

git clone https://github.com/fufuyin/dsh-prompt-workbench.git
cd dsh-prompt-workbench
npm install
npm run build
dsh plugin --profile web add .

功能

  • 提示词分析 —— 本地对六个维度(目标 / 背景 / 约束 / 输出格式 / 验收标准 / 示例)打分,给出可执行度进度条与每个维度的命中证据。
  • 重构建议 —— 按严重度排序的建议,既点出缺口,也直接给出一段可一键插入的结构骨架。
  • 格式化输出 —— 重写结果按结构渲染(标题、列表、代码块),另有结构覆盖视图,显示骨架的哪些章节真的被填上了。
  • 四种重写模式 —— 细化需求、补充约束、结构化重写、精简表达。
  • 定向而非套模板 —— 分析结果会作为显式缺口清单交给模型,因此重写针对的是这一份草稿的漏洞,而不是对所有人套同一套模板。
  • 中英双语 —— 中英文草稿都能用,自动 模式会识别草稿语种并同语种输出。
  • 逐词差异 —— LCS 差异对比,新增高亮、删除划线;超过 token 上限时降级为纯文本,而不是让界面卡住。
  • 流式 / 可中断 / 超时 —— 增量投递,带实时字符计数;随时可停,卡住的流会在 180 秒后中止并给出可区分的错误。
  • 两个入口,一份状态 —— 输入框工具行的胶囊按钮与浮层面板共用同一个 store,两者永不打架。
  • 跟随主题 —— 所有颜色都走 --dsw-alias-* 变量,亮暗色都正常,并遵循 prefers-reduced-motion。
  • 提示词保护 —— 原样保留 @路径 引用、{变量}、<占位>、TODO、URL 与代码块,且绝不回答它正在重写的那条提示词。
  • 自检 —— 面板上的 ◎ 按钮(以及 GET /api/diag)会报告宿主如何看待本插件的浏览器半——这正是坏掉的界面无法自问自答的那个问题。

使用

  1. 在输入框打好草稿,一句话到多段都可。
  2. 点工具行的 ✦ 提示词增强。面板会在输入框上方打开,左栏已经带上你的草稿。也可以直接往左栏粘贴,或点 ⭯ 把当前输入框内容拉进来。
  3. 边打边看分析条。 它给出可执行度评分、六个维度的覆盖情况(悬停显示命中证据),以及检出的模糊词与未填占位符数量。这一步是本地即时完成:不花 token,也不离开你的机器。
  4. 照着建议列表补。 每条建议点出一个缺口,并在合适时提供 插入,把对应的结构骨架直接写进草稿。
  5. 选一个模式;需要强制时再选输出语言。
  6. 点 开始增强(或 Ctrl/Cmd + Enter)。右栏按结构流式呈现重写结果。上方的分析会作为显式缺口清单交给模型,所以重写针对的是这份草稿,而不是通用模板。
  7. 在右栏切换 结果(格式化后的重写)、差异(逐词差异:新增高亮、删除划线)与 结构(结果真的覆盖了哪些骨架章节)。
  8. 替换输入框 把重写写回输入框,追加 保留两者,复制 放进剪贴板。

若发现异常,点面板标题栏的 ◎ 做宿主侧自检,或直接打开 /dsh-prompt-workbench/api/diag。

四种模式

  • 细化需求 —— 把模糊诉求拆成明确、可执行、可验收的具体要求:真正的目标、预期结果、交付物。
  • 补充约束 —— 把隐含边界显式化:范围内、范围外、平台限制、风格规则、非目标、验收标准。
  • 结构化重写 —— 把整条提示词重排为可扫读的层级(目标 / 背景 / 输入 / 具体要求 / 输出格式 / 验收标准),内容不变。
  • 精简表达 —— 去冗余、去对冲、去重复,合并重叠表述,同时保留每一个独立事实。

配置

点面板标题栏的 ⚙。这些都是插件自己的偏好,按浏览器 profile 存在 localStorage 的版本化键下;存储损坏或被禁用时会退回默认值,而不是让面板坏掉。

  • 实时分析 —— 默认开。随输入运行本地分析(防抖、免费、离线)。
  • 显示重构建议 —— 默认开。显示建议列表。
  • 生成时自动滚动到最新内容 —— 默认开。跟随流式输出,同时不干扰你手动滚动。
  • 默认模式 —— 默认「细化需求」。面板打开时选中的模式。
  • 默认结果视图 —— 默认「增强结果」。可选 结果 / 差异 / 结构。

插件刻意不做服务端持久化设置:它不改变宿主任何运行方式,因此不需要设置 schema,也不需要写你的配置。它跟随你当前会话的默认模型路由——在输入框的模型选择器里换模型,下一次重写就用新模型。当前路由会以只读标签显示在面板标题栏。

硬限制

以下限制全部在 Host 侧强制:

  • 草稿长度 —— 24,000 字符。超过:明确报错,绝不静默截断。
  • 差异对比规模 —— 每侧 700 token。超过:差异视图降级为纯文本并注明原因。
  • 并发任务 —— 8 条。优先回收已完成任务。
  • 单次模型调用 —— 180 秒墙钟。超过:以「超时」中止,与用户主动停止可区分。

架构

everything-is-a-plugin 的 harness 意味着这是两个半成品加一个 patch 层:

cordis.patch.yml        安装本插件的 profile patch
src/analyze.ts          SHARED — 解析、维度、建议、骨架(纯函数)
src/index.ts            HOST   — 插件入口;注册插件的 HTTP 路由
src/runs.ts             HOST   — 任务表与每次运行的那一次模型调用
src/prompt.ts           HOST   — 模式与系统指令(纯函数)
src/http.ts             HOST   — JSON / 同源 / 请求体辅助
src/client/index.ts     CLIENT — inject 声明、样式注入、挂载
src/client/panel.ts     CLIENT — 两个输入框入口
src/client/api.ts       CLIENT — fetch 通道
src/client/prefs.ts     CLIENT — 版本化 localStorage 偏好
src/client/store.ts     CLIENT — 两者共用的那个 store
src/client/diff.ts      CLIENT — token 级 LCS 差异
src/client/styles.ts    CLIENT — 整份样式表,一个字符串
scripts/preflight.mjs   prepack 跑的后构建断言
tests/                  每个纯模块的单元测试

src/analyze.ts 是最有意思的一个:它是纯函数,且两个半成品都 import 它。浏览器端每次按键(防抖)跑它,所以建议即时、免费、离线;Host 端每次重写跑一次,把得到的缺口清单交给模型。一份实现、两个消费者,还有一套直接断言它的测试。

Host 半负责模型调用与任务表;浏览器半以固定节奏轮询,且只接收自上次游标以来的增量,所以长文本重写的流量是有界的,而不是反复回传整个缓冲区。

两个半成品如何通信

走插件自己在 ctx.webServer.register() 上注册的 HTTP 路由,而不是 @Remote / ctx.remote。这不是风格选择:宿主网关确实能从第三方包发现 @Remote 标记,但客户端的 $mount 路径会拒绝一切非生成式 strict codec 的描述符,而且挂载远程命名空间的清单是闭源内建列表。要提供生成式 codec,就得用 harness 自己的代码生成工具链。

由于插件自有路由不受连接层的 Host/Origin 检查保护,两个写路由自行做同源校验。轮询路由刻意不做:浏览器在同源 GET 上不发 Origin,在那里强制会把自己插件的流量拒掉。

GET /api/diag 报告宿主如何看待本插件的浏览器半,并附带一个有界的最近请求环(方法、路径、状态码、耗时、原始 origin 头,以及据此得出的判定)。插件路由在会话日志里完全不可见,所以这是唯一能报告浏览器侧故障的入口。

状态

面向 DeepSeek Harness 开发者预览版。harness 本身会带来破坏性变更,请固定你构建所依据的版本。

参与贡献

欢迎提 issue 与 PR。CONTRIBUTING.md 包含开发环境、项目结构、项目红线,以及如何报告缺陷。

许可证

MIT © 2026 fufuyin

免责声明

这是一个社区插件,与 DeepSeek 官方无关,按「现状」提供,不附带任何担保。安装它等于在你自己的权限下于 harness 内运行第三方代码,请先阅读源码,风险自担。