dshbase

插件目录 / Developer / dsh-composer-polish

dsh-composer-polish

已验证 · 实测可装 tianji-qingtian

✓ 持续维护 基于 3 个官方 DSH 包

查看 GitHub ↗ ← 返回插件目录

6Stars
0Forks
0未关闭 issue
JavaScript语言
2026-08-14最近推送
跨平台平台

功能简介

DSH插件:一键✨草稿润色——快速重写,自动回填输入框

✅
我们的评价
可用 — 实测通过,早期项目

DSH插件:一键✨草稿润色——快速重写,自动回填输入框 实测能干净安装、正常启动。早期项目,但功能可用。

「已验证」表示我们的自动化 CI 在干净 profile 里实际执行了 dsh plugin add 并启动成功——仅此而已。功能描述与版本兼容性均为作者声明。这不是安全审计,也不代表对第三方代码的背书。

README

dsh-composer-polish

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 polished text replaces the draft in the input box — you preview, maybe edit, then send. No scoring, no evaluations: draft in → better draft out.

The harness is in developer preview and iterates quickly — expect compatibility-breaking changes.

中文说明见 README.zh.md。

Features

  • ✨ button in the tool row — sits in conversation.input.right, the official seat for clickable controls beside the send button. Disabled while the draft is empty or pure whitespace, shows a spinner while polishing, and never lets double-clicks fire a second request.
  • Zero-prefix flash rewrite — the host half rewrites the draft with a single deepseek-v4-flash stream (reasoningEffort: 'off', ~2000 token cap). The main model never runs and its prefix cache is never touched. If the pinned model id is missing from the provider catalog, it retries once with a flash-class model discovered via llm.listModels.
  • Fill-back, not chat — the polished text goes straight into the input box through inputActions.setDraft, the official public draft write path. You can edit it again or polish a second time; nothing is sent until you press send. Image attachments are never touched — only the text is replaced.
  • Fails silent — a failed or empty rewrite leaves the draft untouched (console log only, no toasts).
  • Privacy — the /polish command registers with recordInput: false, so the raw draft never lands in the session log; only the polished result is recorded in command/done.
  • No custom wire protocol — Client→Host rides the harness's built-in commands remote (the same channel the shipped / commands use).
  • i18n zh/en — button label and tooltip follow the harness locale service.
  • Language and voice follow the draft — the rewrite answers in the draft's language and keeps the user's voice (it strips filler but won't turn the text more formal, salesy, or robotic); code blocks, file paths, command lines, identifiers, and technical terms stay verbatim.

Screenshots

The ✨ Polish button in the composer tool row, next to the send button:

polish button demo

Install

Prerequisites

The dsh CLI must be on your PATH. If you only ever ran the harness through npx, dsh is not installed and you will get zsh: command not found: dsh — install it globally first:

npm install -g @deepseek-ai/dsh

pnpm add -g @deepseek-ai/dsh also works if your pnpm global bin dir is on PATH (otherwise pnpm asks you to run pnpm setup first). Alternatively skip the global install and prefix the commands below with npx @deepseek-ai/dsh ….

Add the bundle

# 1. add the bundle to your web profile (pnpm-backed; the built lib/ artifacts
#    are committed in this repo, so no build script runs at install time)
dsh plugin --profile web add "github:tianji-qingtian/dsh-composer-polish#v0.1.3"

# 2. restart the harness with that profile — `add` only edits the profile
#    files; a running instance does not hot-load the new bundle
dsh --profile web

After the restart the ✨ button appears in the composer tool row, next to the send button, and the /polish command is registered once the host half loads. Verify under Settings → Plugins that dsh-composer-polish is listed.

How it works

Piece Mechanism
Button seat conversation.input.right list slot (session scope); the standard kit's selector hook useInput((s) => s) reads the draft, inputActions.setDraft() writes it back
Client → Host built-in commands remote, hard-injected (inject: ['remote', 'remote.commands']): ctx.remote.commands.execute(sessionId, '/polish ' + draft) — the same roundtrip the shipped slash commands use; no custom RPC
Host rewrite /polish command handler → zero-prefix ctx.llm.stream on deepseek-official / deepseek-v4-flash (reasoningEffort: 'off', maxTokens 2000), one-shot, with a one-time catalog fallback when the pinned model id is unavailable
Result channel handler returns { kind: 'success', text }; the client reads it from CommandExecution.result.text and fills it back via setDraft
Privacy recordInput: false → command/run omits args, so the raw draft is never written to the session log
Stale-edit guard the client captures draftRev at click time; if the draft changed while polishing, the result is discarded instead of clobbering newer edits
Draft cap both halves cap the draft at 50 KB; longer drafts are truncated client-side before sending

Behavior spec (from REQUIREMENTS.md)

# Scenario Behavior
1 Non-empty draft, click ✨ read draft → flash rewrite → fill back
2 Empty / whitespace-only draft button disabled
3 Rewrite fails / returns empty draft untouched, console log only, no toast
4 Rewrite in flight button shows spinner, repeat clicks blocked
5 Draft has image attachments only the text is polished; images untouched
6 Chinese / English draft rewritten in the draft's language
7 Code blocks / lists / technical terms structure kept, code verbatim, no accuracy changes

Build

pnpm install
pnpm build   # tsdown: lib/index.js (ESM host) + lib/client.js (ModuleLoader client bundle)

Known limitations

  • The fill-back is skipped when the draft changed during the rewrite (stale-edit guard) — by design, your newer edits always win.
  • Drafts over 50 KB are truncated before the rewrite (a draft of that size is beyond what a single flash call can meaningfully restructure anyway).
  • The polished result is recorded in command/done (the commands channel's own lifecycle log); only the original draft is kept out of the log via recordInput: false.
  • deepseek-v4-flash is pinned as the rewrite model; if the harness renames model ids, the catalog fallback picks a flash-class replacement and logs a line.

License

MIT

安装

🧩 让 Agent 自动装(推荐)

装一次目录插件,之后本站所有插件都能让 DeepSeek Harness 自动找、自动装:

dsh plugin add dshbase-catalog

然后对 agent 说「帮我装 dsh-composer-polish」,它会在目录里找到并自动安装。文档:dshbase-catalog · 已验证场景包。

该插件是 GitHub 源码(未发 npm)——直接从仓库装:

Web profile:

dsh plugin --profile web add github:tianji-qingtian/dsh-composer-polish

Headless(CLI)profile:

dsh plugin --profile headless add github:tianji-qingtian/dsh-composer-polish

实测报告

验证通过:从 GitHub 源码完成 L1 安装 + L2 加载 + L3 运行(dsh 0.1.0-rc.6)。

使用场景

扩展 agent 的编码能力面——给它一个新工具、工作流或集成,让它接手以前做不了的开发任务。

适合谁

想让 dsh 在真实代码库上像队友一样干活的开发者——能改、能跑、能验证,而不只是回答问题。

二次开发建议

工具/命令面就是缝:暴露更多 SDK 能力、加更聪明的上下文接线,或收紧改代码与验证之间的循环。

安全:尚未扫描——我们的每日静态扫描将很快覆盖它。

分享徽章

Developer 里更多

浏览全部 7797 个插件 →