dsh-shell-switch

DSH PLUGIN开发与运行时

仓库 codel6i/dsh-shell-switch

开发与运行时 L4 · 沙盒安装通过 安全审查:低风险 可信度:银 可安装插件
安装这个插件

为 DSH 的 Windows 桌面端补上 shell 切换面板,在设置里一键在 PowerShell 与 Git Bash 之间切换 Agent 执行命令所用的 shell,切换即时生效无需重启。

一句话选型结论

按资料字段整理

dsh-shell-switch 是开发与运行时类的 DSH 可安装插件,验证等级 L4 · 沙盒安装通过,安全审查为低风险,列出 4 项功能,有可直接复制的安装命令。验证通过不等于安全:插件会读写文件、执行命令或联网,装前先到仓库确认它做了什么;涉及密钥或系统权限的,建议先在隔离环境试装。

分类开发与运行时 收录类型可安装插件 验证等级L4 · 沙盒安装通过 安全审查低风险
验证等级 L4 L4 · 沙盒安装通过
GitHub 星标 0 复刻 0 · 未关闭 issue 0
最近更新 2026-10-06 创建于 2026-10-02
README 11.8 KB 正文体量,越大说明说明书写得越细

安装

可安装插件
在 DSH 里执行,装完用 dsh plugin list 确认已挂上;标了 L4 / L5 的命令已在沙盒里真实跑通
dsh plugin --profile web add github:codel6i/dsh-shell-switch#v0.1.8
  1. 1
    确认版本与运行环境

    仓库没有标注兼容版本与 Node.js 要求,先确认你的 DSH 版本能装,再继续。

  2. 2
    执行安装命令

    在 DSH 里执行上面的命令;多包仓库要注意区分具体子包名,别装错包。

  3. 3
    确认已挂载

    用 dsh plugin list 查看列表里是否出现这个插件,出现即挂载成功。

  4. 4
    试跑并检查权限

    加载后跑一个最小用例,确认它能正常工作;同时看它申请了哪些文件、命令或网络权限。

兼容 DSH 版本未标注版本不匹配时安装会报错
Node.js 要求未标注来自仓库 package.json 的 engines 字段
前置依赖无需要同时安装的同级依赖
npm 包名未发布到 npm可用 npm view 查看包信息

能做什么

4 项功能
字段来自项目仓库与公开索引,中文说明由本站标注

dsh-shell-switch:为 DeepSeek Harness 切换 PowerShell 与 Git Bash 的 shell 面板

  • 设置面板切换 PowerShell / Git Bash
  • 同一时刻仅一个 shell 工具可见
  • 自动探测 Git Bash 可执行路径
  • 面板实时显示宿主探测状态

适用场景

终端命令GitHub 集成

上游标签

ai-agentscordisdshdsh-plugingit-bashpowershellwindows-shell

验证等级与安全审查

L4 · 沙盒安装通过
自动化流程结论,不是人工审核
验证等级L4 · 沙盒安装通过安装命令在隔离沙盒内真实执行成功,无依赖错误
安全审查低风险静态分析结论,未标注不代表已通过审查
仓库健康度活跃按仓库活跃度与最近更新时间给出
可信度银综合仓库活跃度与验证结果

上面的结论来自上游最近一次自动化验证(2026-10-08): 同一套检查会在插件发新版后重跑,页面显示的是最新一次的逐项结果。

逐项检查结果

L1 · 已找到 ✓ 通过
  • L1.0_DEFAULTED_FROM_L3 由 L3 推定 默认通过——L3 安装规范已通过(全库 L3 扫描策略)
L2 · 结构化 ✓ 通过
  • L2.0_DEFAULTED_FROM_L3 由 L3 推定 默认通过——L3 安装规范已通过(全库 L3 扫描策略)
L3 · 安装规范 ✓ 通过
  • L3.1_INSTALL_COMMAND_PARSED 安装命令已解析 方式:安装规范解析
  • L3.2_DSH_VERSION_DECLARED DSH 版本已声明 方式:DSH 版本声明
L4 · 安装已测 ✓ 通过
  • L4.1_INSTALL_EXECUTED_CONFINED 受限沙盒内执行安装 方式:沙盒安装执行
  • L4.2_INSTALL_SUCCESS 沙盒安装成功 方式:沙盒安装执行
  • L4.3_ARTIFACT_CONFIRMED 安装产物已确认 方式:沙盒安装执行
L5 · 运行已测 ✕ 未通过
  • L5.1_INSTALL_PASSED_SANDBOXED 沙盒安装通过 方式:沙盒安装执行
  • L5.2_WEB_BOOT_READY Web 启动就绪 boot failed
  • L5.3_HTTP_SERVED HTTP 服务响应

风险详情

  • 审查结论 通过
  • 结论说明 vet 静态分析未发现可疑行为,判定为干净(clean)。
  • 风险计数 严重 0 / 高 0 / 中 0
  • 风险详情 未发现严重或警告级问题。

选择建议

装之前先看这几条
按条目字段给出的判断,不替你决定用不用

值得选的地方

  • 验证等级 L4:在沙盒里真实装过,依赖能装上,不是纸面声明。
  • 静态安全审查为低风险,没有发现明显可疑行为。
  • 有可直接复制的安装命令,不用自己翻文档找入口。
  • 列出了 4 项功能,能直接看出它解决什么问题。

先想清楚的地方

  • 没有声明 Node.js 版本要求,版本不匹配可能装不上。
  • 验证通过不等于安全:插件会读写文件、执行命令或联网,装前先到仓库确认它做了什么。

更适合

  • 需要在开发与运行时场景里给 DSH 补能力的人。
  • 想装完就能用、不想自己排依赖的人。
  • 能接受在本地装依赖、愿意自己确认权限的人。

不太适合

  • 只使用 DSH 官方内置能力、不接受第三方插件的人。

同类对比

6 个同类
同分类里挑最接近的几条,字段以各自详情页为准
插件验证等级安全审查星标兼容版本安装命令
dsh-shell-switch当前 L4 · 沙盒安装通过 低风险 0 未标注 有
deepseek-harness L3 · 安装规范通过 低风险 24.6 万 未标注 无
rea L4 · 沙盒安装通过 低风险 2.6 万 0.1.1-rc.2 有
dsh-TUI L4 · 沙盒安装通过 中风险 4,292 0.1.7-rc.2 等 5 个 有
mirage L3 · 安装规范通过 低风险 3,681 未标注 无
dashi-taskboard L4 · 沙盒安装通过 低风险 3,311 0.1.1-rc.2 有

仓库档案

开发与运行时
字段来自项目仓库与公开索引,中文说明由本站标注
作者 / 维护方codel6i仓库 dsh-shell-switch · 默认分支 main
分类开发与运行时dev
收录类型可安装插件声明了 dsh.bundle、可用 dsh plugin add 安装的条目
开发语言TypeScript仓库主语言
许可证MIT商用或二次分发前请确认条款原文
星标 / 复刻 / issue0 / 0 / 0收录时的数值,非实时
创建 / 更新2026-10-02 · 2026-10-06最后推送 2026-10-06
本站收录2026-10-02首次进入本站目录的时间

README 全文

11.8 KB
作者原文,中文版优先;只做安全转义,不改内容

dsh-shell-switch

给 dsh Windows 桌面端加一个 shell 切换面板:在「设置 → Shell」里选择 Agent 执行命令时用 PowerShell 还是 Git Bash。切换即时生效,不需要重启。

> English: README.en.md


它到底切换了什么

dsh 在 Windows 上默认只给模型一个 pwsh 工具(@deepseek-ai/dsh-tool-pwsh + pwsh-sandbox 执行器),
Git Bash 没有任何入口。本插件补上这一档,并且让同一时刻只有一个 shell 工具对模型可见:

当前 shell 模型看到的工具 模型收到的提示词 另一个工具
pwsh(默认) pwsh “The active command shell is PowerShell…” bash 从工具列表中移除,调用被拒绝
gitbash bash(Git Bash 5.x / MINGW64) “The active command shell is Git Bash… Git Bash is D:\...\Git\bin\bash.exe” pwsh 从工具列表中移除,调用被拒绝

真机实测(把开关切到 Git Bash 后,模型用 bash 工具执行):

shell=5.2.37(1)-release
bash-path=/usr/bin/bash
MINGW64_NT-10.0-26200
cwd=/d/deepseek/deepseek-cli
env-style=/c/Users/lss

后台任务同样可用(隔离 realm 里的 bash 工具照样能拿到 jobs 注册表):

// bash { run_in_background: true } → started background job bash-6
// job_output bash-6 →
"bg-start 10:55:47\ntick-1\ntick-2\ntick-3\nbg-done 10:55:50\nshell=5.2.37(1)-release"   // exit 0

安装

插件已经按 dsh bundle 规范打包(package.json 的 dsh.bundle.patch 指向 cordis.patch.yml)。

方式 A:本地包(离线可用,推荐)

# 在插件目录构建出 lib/ 后打包
cd <插件目录>; npm install; npm run build; npm pack
# 安装进指定 profile
dsh plugin --profile desktop add file:<插件目录>\dsh-shell-switch-0.1.7.tgz

在本会话中也可以直接用内置的 plugin_manager 工具:install_bundle + file:...tgz。

方式 B:从 git 仓库安装

dsh plugin --profile desktop add github:codel6i/dsh-shell-switch

仓库里的 package.json 带 prepare: npm run build,所以从 git 安装时会自动构建出 lib/
(lib/ 本身不入库)。

> pnpm 11 的前置条件:git 依赖要跑 prepare 必须先进白名单,否则安装会以
> ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 失败(错误信息里会给出确切的键)。把 profile 的
> pnpm-workspace.yaml 改成:
>
> yaml > allowBuilds: > dsh-shell-switch@git+https://github.com/codel6i/dsh-shell-switch.git: true >
>
> 顺带说明:dsh 界面里的"批准构建"只认 pnpm 写下的占位值 set this to true or false,
> 而 git 依赖的 prepare 是硬失败、不会产生占位,所以这条路要先手工写白名单;
> 安装 dshmarket 之后也可以用它界面里的批准入口。

方式 C:手动挂载

  1. 把插件目录(含 lib/)复制到 \profiles\\node_modules\dsh-shell-switch\;
  2. 在 profile 的 package.json 里把 "dsh-shell-switch" 加进 dsh.profile.bundles;
  3. 重启 dsh(或触发一次配置重载)。

插件本身是一个 bundle:cordis.patch.yml 里插入了 3 行(见下文),不需要改动 dsh 源码。


使用

面板有两个入口,内容相同:

  • 设置 → Shell:左下角账户/设置入口打开设置面板,左侧导航里的 Shell;
  • 插件 → dsh-shell-switch → 点开 dsh-shell-switch 这一行:该行的配置页就是同一个面板
    (即 dsh 的 plugins.row.config 槽,key 为 dsh-shell-switch#shell-switch)。

面板内容:

  1. 当前 shell 二选一:PowerShell / Git Bash;
  2. (可选)Git Bash 可执行文件:留空即自动探测;探测失败时在这里填 bash.exe 绝对路径;
  3. (可选)隐藏未启用的 shell 工具:默认开;关掉则两个工具都留在列表里,未启用的那个仍会拒绝调用。

面板下半部分随选择变化:选中哪一项,就换成那一项的说明卡片——执行器(含解析到的路径与来源)、
路径风格、环境变量、模型当前拿到的工具,以及另一个工具的下场(已隐藏 / 仍列出但会被拒绝);
再下面是只影响 Git Bash 的路径设置与隐藏开关,最后一行是宿主实时状态。

面板下方那行是宿主实时状态(面板从 GET /shell-switch/status 读取,经 dsh 的连接鉴权),
例如 已找到 Git Bash:D:\Application\DevTool\Git\bin\bash.exe(来自 git --exec-path)· 模型当前拿到的 shell 工具:pwsh。
它直接回答"到底认没认出来":路径、来源、以及此刻模型手上的 shell 工具;读不到时明确写"读不到宿主状态",不猜。

> 插件页里那行 cordis:group(id 是 shell-switch-bash)是容器行,它自身没有插件实现,
> 所以点它的启用开关会报"找不到该插件"——这是正常的,不影响功能;
> 真正在运行的是它下面两行:@deepseek-ai/dsh-bash-sandbox(执行器)和 @deepseek-ai/dsh-tool-bash(bash 工具)。
> 需要隔离 realm 才能让第二个 shell 服务与 dsh 自带的 pwsh-sandbox 共存,所以这一层容器去不掉。

写入落在 profile 的 cordis.patch.yml:

- id: shell-switch
name: dsh-shell-switch
config:
activeShell: gitbash      # pwsh | gitbash
gitBashPath: ''           # 留空 = 自动探测
hideInactiveTool: true

怎么确认切换生效

  • 让模型跑一条命令:pwsh 档会走 PowerShell,gitbash 档会走 Git Bash(uname -s 返回 MINGW64_NT-...);
  • 切换后模型手里的工具名会立刻换挡,系统提示词里也会写明当前 shell 与 Git Bash 的真实路径。

工作原理

cordis.patch.yml 插入 3 行:

行 id 作用
shell-switch 本插件(宿主半 + 客户端半),activeShell 就是开关
shell-switch-bash 一个 cordis:group,用 isolate: { shell: true } 把 shell 服务隔离在组内
├ shell-switch-bash-exec @deepseek-ai/dsh-bash-sandbox:Git Bash 的执行器(保留沙箱语义)
└ shell-switch-bash-tool @deepseek-ai/dsh-tool-bash:官方 bash 工具,run_in_background 等能力原样保留

> 为什么必须隔离:一个 Cordis 上下文只允许一个 shell 服务实现。Windows 上部署自带的执行器是
> pwsh-sandbox,它必须继续服务其他消费者,所以 Git Bash 执行器只能活在自己的 realm 里。

宿主半(src/index.ts)在开关之上做五件事:

  1. 探测 Git Bash:gitBashPath → git --exec-path → where git 推导安装根 → PATH 中的 Git 目录 → 常见安装位置;
    顺手排除 C:\Windows\System32\bash.exe(那是 WSL 存根,不是 Git Bash)。
  2. 让 bash 能被解析:把 Git 安装的 bin 目录插到进程 PATH 最前面;插件卸载时精确移除该项(不动其他项)。
  3. 控制模型可见的工具:监听 system-prompt/assemble 瀑布,把当前不该出现的那一个 shell 工具从 assembly.tools 里剔除。
  4. 兜底拒绝 + 说明当前 shell:tools.guard 拒绝调用未启用的 shell(覆盖“工具列表还是上一步缓存”的窗口),
    并用一个动态提示词段告诉模型当前 shell、方言和 Git Bash 的真实路径。
  5. 把实时事实交给面板:GET /shell-switch/status 返回当前 shell、探测到的 bash.exe 与来源、可见/隐藏的工具。
    路由只在有 web server 的部署里注册,且只回答通过 connection.requestRejection 的调用方(未鉴权 401)。

客户端半(src/client/)把同一个面板注册到两处:settings.section(设置 → Shell)与
plugins.row.config(本 bundle 的 shell-switch 行配置页,key dsh-shell-switch#shell-switch)。
读写走 dsh 官方的 configForms / settings Remote,不新增任何自定义 Remote;状态行走上面那条宿主路由。

> 为什么配置字段必须 volatile:dsh 的设置服务只服务含 volatile 字段的 Config
> (settings.describe() 里 volatileForm(schema) 会丢弃其余字段,一个不剩就整行跳过)。
> 字段不是 volatile 时,这一行没有设置命名空间:面板绑不上、控件被锁、写入也会被拒。
> 同时 volatile 意味着配置改动就地更新,不必重挂载插件行。src/config.ts 里三个字段都标了 volatile,
> 且宿主半在读哨兵、提示词、工具过滤、状态接口时都重新读取当前值。


配置项

字段 类型 默认 说明
activeShell pwsh | gitbash pwsh 当前 shell,面板写入的就是它
gitBashPath string '' bash.exe 绝对路径;留空自动探测
hideInactiveTool boolean true 是否把未启用的 shell 工具从模型工具列表中隐藏

边界与已知取舍

  • 仅 Windows 生效:其他平台上 dsh 本来就只有一个 shell,插件不注册任何东西(只写一行日志)。
  • 探测不到 Git Bash 时自动降级:不会隐藏 pwsh、不会拒绝它,提示词也改回 PowerShell——
    宁可维持“能跑命令”,也不让模型手里没有可用 shell。日志里会写明原因(未安装 / 配置路径不存在)。
  • 只切换 Agent 的执行 shell,不改 dsh 内置终端(terminal_open / 右侧终端)的 shell。
  • PATH 副作用:启用 Git Bash 时会把 \bin 放在 PATH 首位(只加这一项,usr\bin 不加),
    于是进程内 bash/git 等解析到 Git for Windows;插件停用时移除。
  • 工具列表会随开关变化:这是刻意的(hideInactiveTool: false 可以关掉),
    代价是切换后请求头里的 tool 列表会变一次。
  • 受限权限模式下的 Git Bash 侧未在本机实测:本机是 danger-full-access,bash-sandbox 直接放行;
    workspace-write / read-only 下会走 dsh 自带的沙箱 runner 包裹 bash。若某个部署在这种模式下
    报 runner 失败,把 cordis.patch.yml 里 shell-switch-bash-exec 的 name 换成
    @deepseek-ai/dsh-bash-local 即可(放弃 bash 侧的沙箱约束,其余行为不变)。
  • 客户端半热更新,宿主半要重启:面板(浏览器半)由 dsh 的客户端 HMR 自动热更新,装完即生效;
    但宿主半的 schema 改动必须重启 dsh 进程(例如新增配置字段、把字段改成 volatile、新增 HTTP 路由)。
    判断办法:Config.listConfigs({ entry: 'include:shell-switch' }) 的投影里出现 x-cordis.volatile: true
    才算新模块已加载。

开发

npm install
npm run typecheck   # tsc --noEmit(宿主 + 客户端)
npm test            # 构建 lib/ 后跑全部单测
npm run check       # 上面两步
src/ids.ts          两侧共用的 entry id 与工具名
src/config.ts       配置 schema 与显式 resolve
src/detect.ts       Git Bash 探测(环境/文件系统/git 探针全部可注入,便于测试)
src/path.ts         PATH 前缀插入与精确回滚
src/prompt.ts       模型可见的当前 shell 说明
src/index.ts        宿主半:探测 + PATH + 工具可见性 + 守卫 + 提示词段
src/client/         客户端半:设置页(controller + 组件 + 中英词条)
scripts/build.mjs   esbuild:宿主 ESM + 客户端 __ModuleLoader__ bundle
tests/              单测:探测与 PATH、隐藏/拒绝、设置热更新、客户端注册与渲染、产物形状

构建产物:lib/index.js(宿主,@deepseek-ai/* 全部 external)与 lib/client.js
(window.__ModuleLoader__.load({ id, factory }) 包装,外部依赖只有平台模块表里的
react / react/jsx-runtime / @deepseek-ai/dsh-client-store / @deepseek-ai/dsh-client-ui-primitives)。


License

MIT

常见问题

7 问
答案由本站依据条目字段整理,不引用上游原文
dsh-shell-switch 怎么安装?

在 DSH 里执行 `dsh plugin --profile web add github:codel6i/dsh-shell-switch#v0.1.8` 即可。

dsh-shell-switch 的验证等级是什么意思?

L4 · 沙盒安装通过。安装命令在隔离沙盒内真实执行成功,无依赖错误

dsh-shell-switch 安全吗?

低风险。vet 静态分析未发现可疑行为,判定为干净(clean)。

dsh-shell-switch 装之前要先确认什么?

先看它会读写哪些文件、执行哪些命令、连接哪些网络地址;验证等级只说明装得上、跑得起来,不等于安全。涉及密钥或系统权限的,建议先在隔离环境试装。

dsh-shell-switch 用的是什么许可证?

上游标注为 MIT。商用或二次分发前请到仓库确认许可证原文。

dsh-shell-switch 有哪些功能?

设置面板切换 PowerShell / Git Bash、同一时刻仅一个 shell 工具可见、自动探测 Git Bash 可执行路径、面板实时显示宿主探测状态。

这条记录的数据可靠吗?

本站按仓库名去重后合并整理,字段以作者仓库与 npm 元数据为准;安装命令、仓库地址与 README 保持原文,带 L4 / L5 标记的安装命令已在隔离沙盒里真实跑通。

同名或近似条目

1 条
不同作者的仓库分开列,请确认你要装的是哪一个
开发与运行时
按星标排序,可作替代方案

rea

rea

L4 · 沙盒安装通过 2.6 万 星

dsh-TUI

dsh-TUI

Claude Code 风格全屏终端 UI:像素鲸鱼顶栏、实时工作状态行、思考流式展开。

L4 · 沙盒安装通过 4,292 星

mirage

mirage

把文件系统与 bash 提供者换成 mirage 虚拟工作区:文件工具与 shell 命令作用于挂载的资源(RAM、S3、Redis、Sla

L3 · 安装规范通过 3,681 星

dashi-taskboard

dashi-taskboard

把当前已安装并运行中的 Codex Taskboard 嵌入 DeepSeek Harness 侧边栏,并通过 Launcher 运行时描述

L4 · 沙盒安装通过 3,311 星

插件的元信息来自作者仓库;分类、验证等级与安全结论的中文说明为中文整理,最近核验 2026-10-08。