dsh-plan-act-models
简化RooCode和Cline在VSCode插件上的功能,为 Plan 与 Act 两种模式各绑定一套 provider、模型与思考复杂度,支持按工作区覆盖。
安装
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目录联接指向本仓库(等价于 pnpmlink:)- 本仓库自带的
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