dsh-composer-polish
by tianji-qingtian
One-click draft polisher for the DeepSeek Harness ( dsh ) composer. Type a rambling draft, hit the ✨ 润色 / Polish button in the input tool row, and a few seconds later the…
安装
dsh plugin --profile web add github:tianji-qingtian/dsh-composer-polishGitHub 源码安装:首次需按提示配置 allowBuilds 构建授权后重试
安装与环境配置指引、插件开发教程见 DSH 中文社区文档 ↗
安装即在你的机器上以你的权限运行第三方代码——它可读写文件、使用凭据、访问网络,DSH 的工具审批不会为插件代码加沙箱。「检测到 manifest」仅代表发现 dsh.bundle / dsh.plugin 清单,不构成兼容性或安全审查;安装前请审阅源码,不熟悉的插件先在不含密钥的环境试用。
README
DeepSeek Harness(dsh)输入框的一键草稿润色插件。在输入框写一段啰嗦的草稿,点工具行里的 ✨ 润色 按钮,几秒后润色好的文本直接替换输入框里的草稿——你预览、再改改、然后决定发送。不搞评测、不打分:草稿进,更好的草稿出。
Harness 处于 developer preview,迭代很快——可能随其升级出现不兼容变更。
English README: README.md。
特性
- 工具行里的 ✨ 按钮——挂在
conversation.input.right,官方指定的"需要点击的东西"座位,紧挨发送按钮。草稿为空或纯空白时禁用,润色中转圈,双击不会重复触发。 - 零前缀 flash 改写——host 端用单次
deepseek-v4-flash流调用改写(reasoningEffort: 'off',约 2000 token 上限),主模型完全不跑、前缀缓存不碰。若固定模型 id 在 provider 目录里找不到,会通过llm.listModels找一次 flash 类模型重试。 - 回填输入框,不是发消息——润色结果通过官方唯一公开写入路径
inputActions.setDraft填回输入框。你可以继续编辑,也可以再润一次;不按发送不会发出任何东西。带图片的草稿只润文字,图片不动、不丢。 - 失败静默——改写失败或返回空时草稿原样不动(只写 console 日志,不弹窗)。
- 隐私——
/polish命令注册时设recordInput: false,草稿原文不进会话日志;只有润色结果会记录在command/done。 - 不造新协议——Client→Host 复用 harness 内置的
commandsremote(和内置/命令走同一条路)。 - 中英双语 UI——按钮文案、tooltip 跟随 harness 的
locale服务。 - 跟随草稿语言与语气——改写用草稿的语言作答,并保留作者语气(去掉口水话,但不会改得更正式、更营销腔、更机器腔);代码块、文件路径、命令行、标识符、技术术语原样保留。
截图
输入框工具行、发送按钮旁的 ✨ 润色按钮:

安装
前置条件
dsh CLI 必须在 PATH 上。如果你只通过 npx 跑过 harness,dsh 其实没装,会报 zsh: command not found: dsh——先全局装一次:
npm install -g @deepseek-ai/dsh
pnpm add -g @deepseek-ai/dsh 也可以,前提是你的 pnpm 全局 bin 目录在 PATH 上(否则 pnpm 会提示先跑 pnpm setup)。不想全局装的话,给下面的命令加 npx @deepseek-ai/dsh … 前缀即可。
加入 profile bundle
# 1. 把 bundle 加进 web profile(pnpm 托管;仓库里提交了构建好的 lib/ 产物,
# 安装时不跑构建脚本)
dsh plugin --profile web add "github:tianji-qingtian/dsh-composer-polish#v0.1.3"
# 2. 用该 profile 重启 harness —— add 只改 profile 文件,
# 已运行的实例不会热加载新 bundle
dsh --profile web
重启后 ✨ 按钮出现在输入框工具行发送按钮旁边,host 半载入后 /polish 命令注册。可在 Settings → Plugins 里确认 dsh-composer-polish 已列出。
工作原理
| 环节 | 机制 |
|---|---|
| 按钮座位 | conversation.input.right 列表 slot(session scope);标准 kit 的 selector hook useInput((s) => s) 读草稿,inputActions.setDraft() 写回 |
| Client → Host | 内置 commands remote,硬注入(inject: ['remote', 'remote.commands']):ctx.remote.commands.execute(sessionId, '/polish ' + draft)——和内置斜杠命令同一往返通道,无自定义 RPC |
| Host 改写 | /polish 命令 handler → 零前缀 ctx.llm.stream(deepseek-official / deepseek-v4-flash,reasoningEffort: 'off',maxTokens 2000),固定模型缺失时用目录里发现的 flash 类模型重试一次 |
| 结果通道 | handler 返回 { kind: 'success', text };client 从 CommandExecution.result.text 取出,setDraft 回填 |
| 隐私 | recordInput: false → command/run 不写 args,草稿原文永不落会话日志 |
| 防覆盖 | client 在点击时记下 draftRev;润色期间草稿变了就丢弃结果,不覆盖更新的编辑 |
| 长度上限 | 两端都按 50 KB 封顶;超长草稿在 client 端截断后再送 |
行为规格(来自 REQUIREMENTS.md)
| # | 场景 | 行为 |
|---|---|---|
| 1 | 草稿非空,点 ✨ | 读草稿 → flash 改写 → 回填 |
| 2 | 草稿为空/纯空白 | 按钮禁用 |
| 3 | 改写失败/返回空 | 草稿不动,仅 console 日志,无弹窗 |
| 4 | 改写进行中 | 按钮转圈,禁止重复触发 |
| 5 | 草稿含图片附件 | 只润文字;图片不动、不丢 |
| 6 | 中/英文草稿 | 按草稿语言改写 |
| 7 | 代码块/列表/技术术语 | 结构保留、代码原样、不改技术准确性 |
构建
pnpm install
pnpm build # tsdown:lib/index.js(ESM host)+ lib/client.js(ModuleLoader client bundle)
已知限制
- 润色期间草稿被继续编辑时,结果会被丢弃(防覆盖)——这是有意设计,你更新的编辑永远赢。
- 超过 50 KB 的草稿发送前截断(这个体量也超出单次 flash 调用能合理重排的范围了)。
- 润色结果会记在
command/done(commands 通道自身的生命周期日志);通过recordInput: false挡在日志外的只是原始草稿。 - 改写模型固定为
deepseek-v4-flash;harness 若改了模型 id,目录回退会挑一个 flash 类替代并打一行日志。
License
MIT
原始 README: https://github.com/tianji-qingtian/dsh-composer-polish/blob/main/README.zh.md ↗
同类插件
查看全部 →
archify
Agent 技能:生成美观、可校验的架构图、工作流图、时序图、数据流图与生命周期图——自包含 HTML、带动画与清晰导出

dsh-turn-rewind
对话回退:基于持久 Change Ledger 回滚会话与工作区状态。

dsh-plugin-cc
把 DeepSeek Harness 接入 Claude Code:评审、批评、委派与会话导入

dsh-interconnect
跨实例互联:经 interconnect 服务在多个 DSH 实例间转发消息与事件。

dsh-chat-import
把 13 家 coding agent(Claude Code、Codex、ChatGPT、Cursor、Gemini、opencode 等)的完整对话历史导入为可续聊的 DeepSeek Harness 会话,并支持反向导出回 Claude Code。

dsh-crew
DSH 插件:从 Claude Code / Codex 向 DSH agent 派活——原生 subagent 进度、宿主内 worker 会话(分级预设),以及为纯文本宿主补上视觉与图像生成的多模态桥