中文EN

dsh-plan-act-models

modelnpmMIT

简化RooCode和Cline在VSCode插件上的功能,为 Plan 与 Act 两种模式各绑定一套 provider、模型与思考复杂度,支持按工作区覆盖。

下载量 / Downloads
479

安装

dsh plugin --profile web add dsh-plan-act-models

沙箱测试

这个插件还没测过。提交测试 →

README

模式与模型(dsh-plan-act-models)

给 DeepSeek Harness 的对话框加一个模式下拉框,并按模式自动切换模型:

  • 对话框底部、原生模型选择器左侧是一个真正的下拉框:Plan、Act,以及你自己加的任意个

自定义模式,每一项都是 模式名:<模型>。选它就等于用宿主原生的方式换模型 —— 调的是

session.selectModel,所以下拉框和原生选择器永远显示同一个结果,重启后也还在

(选择存在 model/selection 投影里)。

  • 自定义模式由你命名,绑定自己的 provider / model / reasoningEffort,能力和 Plan / Act 完全一致

(同样的目录校验、同样的提交路径、同样进菜单)。区别只有一条:它只在你手动选择时生效,

插件永远不会自动切到自定义模式。

  • plan 模式与模型的强绑定已经解除:/plan、对话框上的 Plan 芯片、审批都不再隐式决定模型。

进入 plan 只是软切换到 Plan 那一项,你可以立刻改回 Act 或某个自定义模式,插件不会跟你抢。

  • 唯一保留的硬规则:批准计划进入「实施」那一刻,强制切到 Act(忽略之前选的是什么)。

判定只认 exit_plan_mode 返回 approved: true。这条规则和上面的软切换一样,会盖过

当前选中的自定义模式 —— 那是「进入 plan / 批准计划」的既定语义,不想被盖过就别让这两个事件发生。

  • 设置页那几组路由就是下拉框里的各项。enabled 只是自动切换的总开关;

关掉它,下拉框照样能手动切。

  • 插件不存 API Key,全部复用宿主凭据;不接管 subagent / 后台委派任务。

安装

分发包是 dsh-plan-act-models-0.5.0.tgz(npm pack 产物,无运行期依赖、可离线安装)。

完整步骤、验证清单与排错见 [INSTALL.md](./INSTALL.md),安装路线摘录:

  • 桌面版:应用内 设置 → 插件 → 从本地文件安装 选 tarball,然后重启应用。

桌面 profile 由应用独占管理,外部 dsh --profile desktop … 会报

managed exclusively by the Electron application。

  • CLI / Web 普通 profile:dsh plugin --profile <profile> add "<绝对路径>\dsh-plan-act-models-0.5.0.tgz",

Launcher 会自动把 bundle 写进 dsh.profile.bundles,然后重启。

  • 直接从本仓库装(不需要本地有 tarball):装最新 Release 附件,或按 git 引用装源码——
  dsh plugin --profile <profile> add "https://github.com/CynthiaYX/dsh-plan-act-models/releases/latest/download/dsh-plan-act-models.tgz"
  # 或锁定到某个 tag 的源码
  dsh plugin --profile <profile> add "github:CynthiaYX/dsh-plan-act-models#v0.5.0"

两者都指向同一套文件;Release 附件是 npm pack 产物,github: 走整仓 tarball,

仓库根就是包根,没有需要裁剪的子目录。

> 当前最新 Release:v0.5.0(附件 dsh-plan-act-models.tgz 与

> dsh-plan-act-models-0.5.0.tgz,两者 sha256 相同)。更新到新版只需重跑一次 add,

> 把 latest 换成新 tag 可以锁定版本。

配置入口:设置 → 模式与模型(首次默认关闭自动切换)。

本机开发时的链接安装

源码目录本身就是包(dsh-plan-act-models),开发时按 @local/dsh-restart 的先例手写 profile 层:

  • profile package.json 的 dependencies 加

"dsh-plan-act-models": "link:<克隆目录>/dsh-plan-act-models"(Windows 上写成

link:D:/private/DeepSeek-harness-plugin/dsh-plan-act-models 这种正斜杠形式),

dsh.profile.bundles 里追加 "dsh-plan-act-models"

  • node_modules\dsh-plan-act-models 目录联接指向本仓库(等价于 pnpm link:)
  • 本仓库自带的 cordis.patch.yml 由 bundle 机制自动插入 Loader 行;profile 的

cordis.patch.yml 只用来覆盖那一行的 config(同 id),不要再写第二条 - insert:

  • 本包的 exports 必须显式导出 ./package.json 与 ./cordis.patch.yml:宿主

@deepseek-ai/dsh-client-modules 会用 createRequire().resolve('<pkg>/package.json')

读 dsh.client 声明,不导出就会 ERR_PACKAGE_PATH_NOT_EXPORTED

发布流程

仓库 CynthiaYX/dsh-plan-act-models 就是分发仓库:仓库根 = npm 包根,tag 触发发布,

Release 附件同时提供 dsh-plan-act-models-<version>.tgz 与稳定名 dsh-plan-act-models.tgz

(后者让 releases/latest/download/dsh-plan-act-models.tgz 这种"永远最新"的安装/更新地址可用)。

1. 改 package.json 的 version,提交并推送。

2. 打 tag 并推送(注意:Windows PowerShell 5.1 不支持 &&,要用 ; 或分成两行):

   git tag v<version>
   git push origin main --tags

3. .github/workflows/release.yml 会先校验 tag 与 package.json 一致,再 npm test、npm pack,

最后把两个 tgz 挂到该 tag 的 Release 上。

4. 装/更新的人用 设置 → 插件 或 dsh plugin add <Release 附件地址> 即可,不需要本地构建。

上传前清单

本包尚未发布到 npm,GitHub Release 才是当前的发布通道。发布前依次确认:

1. node --test 全绿(176 个用例)。

2. npm pack --dry-run 的文件列表里没有 lib/*.js(该 glob 曾指向不存在的文件)。

3. package.json 无 private,license 与 repository 齐全。

4. cordis.patch.yml 的 id 与 client.js 的 ENTRY 逐字相同 —— client.test.mjs

做静态比对,client-bundle.test.mjs 真的执行 apply() 并断言传进

configForms.get() 的 namespace 就是 patch 的 id。改一处必须改另一处。

5. 若要同时发 npm,上传后 npm view dsh-plan-act-models version 应回显对应版本。

配置

字段 · 含义

enabled · 自动切换总开关。关闭后不再自动切模型;下拉框仍可手选。

plan · 下拉框里 Plan 那一项:provider、model、reasoningEffort(留空 = 跟随模型默认)。

act · 下拉框里 Act 那一项,同上。

modes · 自定义模式表:键是稳定 id(页面按 m1、m2… 生成),值是 name + 与上面同样的三项路由。

projects · 按工作区根目录(session.header.cwd)的覆盖表:inherit / override / off。

项目覆盖是完整的一对,不做半合并;项目设为 off 时该项目内所有模式都不可选。

它只覆盖 Plan / Act 两项 —— 自定义模式是全局的,不参与项目覆盖(页面上也暂时不提供这个编辑器,

见「已知限制」)。

自定义模式

modes 里每个条目就是菜单里多出来的一项,路由能力和 Plan / Act 完全一致:

modes:
  m1:
    name: 审查
    provider: cline-pass
    model: deepseek-v4.1-flash-1017
    reasoningEffort: low
  • 名字只用于显示。会话里存的是切到的 provider/model/effort,不是模式 id ——

所以改名、删掉、重新排一遍都不会影响已经在跑(或已经存盘)的会话。

  • name 留空时按位置退化成 模式 1、模式 2…;设置页保存时也会写入同样的默认名,

所以页面和宿主对同一个条目的叫法一致。

  • 设置页最多 12 个(MODE_LIMIT);这是页面的上限,宿主按配置里写多少就渲染多少。
  • 一个条目 provider/model 不全时,它照样出现在菜单里、标成 未配置 且不可点 ——

不静默消失,你能看见自己配错了哪一项。

  • 顺序 = 配置里的书写顺序,永远排在 Plan、Act 之后。

对话框里的模式下拉框

composer 底部、原生模型选择器紧左边,样式是一枚胶囊(圆角 + 模式圆点 + 着色模式词 + 箭头),

点开后向上弹出宿主风格的卡片菜单。Plan 是蓝色、Act 是绿色、自定义模式是琥珀色、自定义 占位是虚线灰,

模型名本身用次级文本色 —— 所以扫一眼就知道当前在哪条轨上。

它不是 <select>:原生弹出层无法着色,这正是旧版看起来像一颗跑错片场的系统控件的原因。

改成「按钮 + 手写 listbox」后,配色跟着宿主 --dsw-* 主题变量走,深/浅色都对。

情况 · 下拉框显示

会话当前选择 = Plan 那一项 · Plan:DeepSeek V4.1 Flash

会话当前选择 = Act 那一项 · Act:DeepSeek V4.1 Flash

会话当前选择 = 某个自定义模式 · 审查:DeepSeek V4.1 Flash(琥珀色)

当前选择哪一项都不是(在原生选择器里手动换过模型) · 自定义:<模型>(灰、虚线边框、不可选,只说明现状)

当前工作区在 projects 里被设为 off · 所有项都灰掉并标 此项目已停用

某项 provider/model 不完整 · 该项灰掉并标 未配置

宿主没有 session.selectModel · 所有项都灰掉,悬停提示 宿主不支持切换模型(菜单仍可打开,那里写着原因)

  • 显示哪一项只看会话已提交的模型选择,不看 plan 模式。所以在 plan 模式下选 Act 是允许的,

下拉框会如实显示 Act。plan 投影只用来在几项配置完全相同时(provider/model/effort 一样)

决定先选中哪一个 —— 并列时内建的 Plan / Act 优先,不会被同路由的自定义模式顶掉。

  • 选项文字里的模型名优先用模型目录的 name,查不到退回 model id;思考复杂度不进正文,只在悬停提示里:

Plan:DeepSeek V4.1 Flash — cline-pass/deepseek-v4.1-flash-1017 (max) · 全局配置

(来自项目覆盖时末尾是 · 项目覆盖:<工作区>;自定义模式永远显示 · 全局配置,因为它不参与覆盖)。

  • 切一项 = 调宿主的 session.selectModel。它的三个副作用都是宿主原生的:

校验路由 → 更新 model/selection 投影(所有客户端立刻同步)→ 写进会话日志。

同时会把该选择存成 profile 的全局默认模型,与手动改原生选择器完全等价。

  • 键盘全程可用:Enter/Space/↓ 打开,↑/↓/Home/End 移动,Enter/Space 选中

…(truncated)

以上内容来自 npm 上的 README,我们只做格式化,不改内容。

版本

npm 上共发布:2,最后更新 2026-10-28

链接

GitHub · Homepage · npm

同类插件