🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

提示词工作台 Ethereal-ljq/dsh-prompt-toolkit

DeepSeek Harness
Ethereal-ljq45 天前有提交已提供中文文档扫描:含敏感能力

把输入框草稿整理成可直接执行的命令

28.3/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Ethereal-ljq/dsh-prompt-toolkit
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:待复验
是什么
dsh 原生插件 · skill
装得上吗
曾在 dsh 0.2.0-rc.2 下真实安装成功,但当前 dsh 已更新至 0.2.1-rc.5,本站尚未在新版下复验
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 45 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 33 处,展示前 31 条)
  • 读取本地文件
    src/host/root.js:30
    if (existsSync(join(dir, 'package.json'))) {
  • 读取本地文件
    src/host/root.js:31
    const pkg = JSON.parse(readFileSync(join(dir, 'package.json'), 'utf8'))
  • 读取本地文件
    src/host/settings.js:26
    if (existsSync(newFile) || !existsSync(oldFile)) return false
  • 读取本地文件
    src/host/settings.js:27
    writeFileSync(newFile, readFileSync(oldFile))
  • 写入本地文件
    src/host/settings.js:27
    writeFileSync(newFile, readFileSync(oldFile))
  • 写入本地文件
    src/host/settings.js:117
    try { writeFileSync(STATE_FILE, JSON.stringify(next, null, 2)) } catch { }
  • 读取本地文件
    src/host/util.js:12
    try { return JSON.parse(readFileSync(file, 'utf8').replace(/^ FEFF/, '')) } catch { return fallback }
  • 写入本地文件
    src/host/favorites.js:76
    try { writeFileSync(FAV_FILE, JSON.stringify({ version: 1, updatedAt: Date.now(), items: list }, null, 2)) } catch { }
  • 读取本地文件
    src/host/beacon.js:27
    try { size = statSync(BEACON_FILE).size } catch { size = 0 }
  • 读取本地文件
    src/host/beacon.js:30
    const kept = readFileSync(BEACON_FILE, 'utf8').slice(-Math.floor(BEACON_MAX_BYTES / 2))
  • 写入本地文件
    src/host/beacon.js:32
    writeFileSync(BEACON_FILE, nl >= 0 ? kept.slice(nl + 1) : kept)
  • 写入本地文件
    src/host/beacon.js:34
    appendFileSync(BEACON_FILE, String(line == null ? '' : line) + '\n')
  • 读取本地文件
    src/host/tools.js:61
    try { entries = readdirSync(dir, { withFileTypes: true }) } catch { return }
  • 读取本地文件
    src/host/tools.js:77
    if (!existsSync(abs)) return '文件不存在:' + args.path
  • 读取本地文件
    src/host/tools.js:78
    const info = statSync(abs)
  • 读取本地文件
    src/host/tools.js:81
    const lines = readFileSync(abs, 'utf8').split('\n')
  • 读取本地文件
    src/host/tools.js:107
    const files = existsSync(scope) && statSync(scope).isDirectory() ? walkFiles(scope, LOOP_MAX_FILES) : [scope]
  • 读取本地文件
    src/host/tools.js:107
    const files = existsSync(scope) && statSync(scope).isDirectory() ? walkFiles(scope, LOOP_MAX_FILES) : [scope]
  • 发起网络请求
    src/client/20-store.js:71
    fetch(API + "/state", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify(Object.assign({ tier: store.tier, model:
  • 发起网络请求
    src/client/40-dom.js:43
    fetch(API + "/beacon", {
  • 发起网络请求
    src/client/60-capsule.js:231
    store.modelCatalogPromise = fetch(url, { cache: "no-store" })
  • 发起网络请求
    src/client/70-favorites.js:13
    fetch(API + "/favorites", { cache: "no-store" })
  • 发起网络请求
    src/client/70-favorites.js:31
    return fetch(API + "/favorites", {
  • 发起网络请求
    src/client/80-run.js:10
    fetch(API + "/run/abort", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ runId: run.runId }) }).catch(() =>
  • 写入剪贴板
    src/client/80-run.js:40
    navigator.clipboard.writeText(text).then(
  • 发起网络请求
    src/client/80-run.js:117
    fetch(API + "/trace?runId=" + encodeURIComponent(id), { cache: "no-store" })
  • 发起网络请求
    src/client/80-run.js:197
    fetch(API + "/run", {
  • 发起网络请求
    src/client/90-plugin.js:22
    fetch(API + "/state", { cache: "no-store" }).then((r) => r.json()).then((d) => {
  • 读取本地文件
    src/host/context.js:21
    if (!existsSync(cwd)) { out.degraded = true; out.reason = 'cwd-missing'; out.elapsedMs = Date.now() - started; return out }
  • 读取本地文件
    src/host/context.js:24
    const info = statSync(join(cwd, name))
  • 读取本地文件
    src/host/context.js:31
    try { entries = readdirSync(dir, { withFileTypes: true }) } catch { return }
扫描于 2026/11/1(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-llm@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-client-ui-primitives
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 草稿优化为可执行命令

DSH Web 提示词工作台:把输入框里的草稿优化成一条可直接执行的命令(引擎 fork 自 WestFox-AwA/dsh-prompt-optimizer,BSD-3-Clause,署名保留)

README

由 DeepSeek 最新模型翻译生成
dsh-prompt-toolkit DSH Web 的提示词工作台:把输入框里的草稿按所选档位整理成一条可直接执行的命令。 插件不接管键盘事件,默认不执行任何操作。在输入框左侧胶囊上点击 ✦ 后开始优化,结果写回输入框,是否发送由使用者决定。 安装 DSH 插件安装在某个 profile 中,不提供全局安装。 从 GitHub 安装 dsh plugin --profile web add github:Ethereal-ljq/dsh-prompt-toolkit 本地开发:安装正在修改的工作副本 dsh plugin --profile web add /path/to/dsh-prompt-toolkit 安装会同时完成 dsh.profile.bundles 的注册,无需手工维护该列表。 安装或升级后必须重启该 profile 的 web。 bundle 层在 web 启动时入栈,刷新页面不生效。 本包不需要构建:lib/client.js 是提交进仓库的构建产物,包内也没有 prepare 脚本,因此从 git 来源安装同样可以直接运行。 界面与操作 插件在页面上提供两处内容:输入框所在行的胶囊,以及右侧栏中的两个 tab (优化面板 / 收藏夹)。
展开完整文档(README 剩余 1 节)
dsh-prompt-toolkit

DSH Web 的提示词工作台:把输入框里的草稿按所选档位整理成一条可直接执行的命令。

插件不接管键盘事件,默认不执行任何操作。在输入框左侧胶囊上点击 ✦ 后开始优化,结果写回输入框,是否发送由使用者决定。

安装

DSH 插件安装在某个 profile 中,不提供全局安装。

从 GitHub 安装
dsh plugin --profile web add github:Ethereal-ljq/dsh-prompt-toolkit

本地开发:安装正在修改的工作副本
dsh plugin --profile web add /path/to/dsh-prompt-toolkit

安装会同时完成 dsh.profile.bundles 的注册,无需手工维护该列表。

安装或升级后必须重启该 profile 的 web。 bundle 层在 web 启动时入栈,刷新页面不生效。

本包不需要构建:lib/client.js 是提交进仓库的构建产物,包内也没有 prepare 脚本,因此从 git 来源安装同样可以直接运行。

界面与操作

插件在页面上提供两处内容:输入框所在行的胶囊,以及右侧栏中的两个 tab (优化面板 / 收藏夹)。

胶囊分为两段,中间以分隔线区分,悬停时仅高亮指向的一段:

- 左侧 ✦:执行优化,读取当前草稿并把结果写回输入框(不发送)。
- 右侧「优化 · 普通 ▾」:显示当前档位;点击展开设置菜单,内容为档位 / 上下文 / 优化模型 / 帮助。存在产出时,菜单中额外出现「查看产出」。

优化完成后,面板提供以下动作。左侧一组的动作不修改输入框,右侧一组会写入输入框:

| | 动作 | 说明 |
| 左 | 停止 / 丢弃 | 运行中显示「停止」,完成后显示「丢弃」。关闭面板,不修改输入框 |
| 左 | 复制 | 将当前产出(含手动编辑过的版本)复制到剪贴板 |
| 左 | 收藏本条 / 收藏夹 | 存入本地收藏夹;点击收藏夹中的条目可写回输入框 |
| 右 | 重新生成 | 可指定修正方向(例如"更短"),基于上一版产出重跑 |
| 右 | 填入输入框 | 仅写入,不发送 |
| 右 | 填入并发送 | 唯一的发送入口 |

设置菜单中的上下文控件用于选择优化时读入多少会话历史;「优化模型」与对话模型相互独立,可以单独指定。

与上游的关系

引擎(宿主半边与提示词层)fork 自 WestFox-AwA/dsh-prompt-optimizer,原作者「啃轮胎的西狐」,BSD-3-Clause,署名与许可一并保留(见 LICENSE)。
界面与交互为本项目自有。

包名与上游相同(@dsh-external/dsh-prompt-toolkit),两者不能同时安装。

数据落在哪

| 文件 | 内容 |
| $DSH_HOME/prompt-toolkit.json | 设置(档位 / 模型 / 上下文 / 按会话的档位) |
| $DSH_HOME/prompt-toolkit-favorites.json | 收藏夹 |
| $DSH_HOME/prompt-toolkit-beacon.jsonl | 客户端动作遥测,用于事后排查;上限 512KB,超出后截断 |

运行期文件写入 DSH_HOME,不写入插件目录:安装进 profile 之后插件目录可能只读。

开发

设计约束、模块划分、构建与测试方式见 docs/ARCHITECTURE.md。
预览分享卡片长什么样 ↓Ethereal-ljq/dsh-prompt-toolkit
分享 · DeepSeek Harness Hub
Ethereal-ljq/dsh-prompt-toolkit

把输入框草稿整理成可直接执行的命令

回到顶部