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

浮动代码工作台 beiryang/dsh-vscode-ide

Cordis
beiryang3 天前有提交已提供中文文档扫描:含敏感能力

在浮动窗口里编辑代码、看 diff、连 SSH 终端

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
dsh 原生插件 · ui
暂无时间戳·判据 →
装得上吗[实装验证]—
本站尚未做安装检查
暂无时间戳·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 3 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件
查看扫描证据(共 77 处,展示前 56 条)
  • 读取本地文件
    lib/index.js:17
    const pkg = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8'))
  • 写入本地文件
    lib/index.js:22
    appendFileSync(join(homedir(), '.dsh', 'code-space-remote.log'), `${new Date().toISOString()} ${line}\n`)
  • 写入本地文件
    lib/host/routes.js:154
    await mkdir(dir, { recursive: true })
  • 写入本地文件
    lib/host/routes.js:157
    await writeFile(file, JSON.stringify(payload.result, null, 2), 'utf8')
  • 读取本地文件
    lib/host/http.js:84
    st = statSync(absPath)
  • 读取本地文件
    lib/host/http.js:108
    body = readFileSync(absPath)
  • 读取本地文件
    lib/host/custom-assets.js:31
    info = await stat(abs)
  • 读取本地文件
    lib/host/custom-assets.js:37
    const raw = await readFile(abs, 'utf8')
  • 读取本地文件
    lib/host/custom-assets.js:154
    const svg = await readFile(svgPath, 'utf8')
  • 执行外部命令来自配置/变量
    lib/host/search.js:88
    execFile(
  • 读取本地文件
    lib/host/search.js:171
    entries = await readdir(dir, { withFileTypes: true })
  • 读取本地文件
    lib/host/search.js:191
    info = await stat(absolute)
  • 读取本地文件
    lib/host/search.js:198
    const buffer = await readFile(absolute)
  • 读取本地文件
    lib/host/search.js:311
    text = await readFile(file, 'utf8')
  • 写入本地文件
    lib/host/search.js:323
    await writeFile(tmp, next, 'utf8')
  • 写入本地文件
    lib/host/search.js:324
    await rename(tmp, file)
  • 读取本地文件
    lib/host/fsapi.js:43
    const rootReal = await realpath(root)
  • 读取本地文件
    lib/host/fsapi.js:48
    real = await realpath(abs)
  • 读取本地文件
    lib/host/fsapi.js:63
    const st = await stat(abs)
  • 读取本地文件
    lib/host/fsapi.js:66
    const dirents = await readdir(abs, { withFileTypes: true })
  • 读取本地文件
    lib/host/fsapi.js:73
    const s = await stat(child)
  • 读取本地文件
    lib/host/fsapi.js:94
    const st = await stat(abs)
  • 写入本地文件
    lib/host/fsapi.js:144
    await mkdir(dirnameOf(abs), { recursive: true })
  • 写入本地文件
    lib/host/fsapi.js:145
    await writeFile(tmp, body, 'utf8')
  • 写入本地文件
    lib/host/fsapi.js:146
    await rename(tmp, abs)
  • 删除本地文件
    lib/host/fsapi.js:148
    await rm(tmp, { force: true }).catch(() => {})
  • 写入本地文件
    lib/host/fsapi.js:207
    await mkdir(abs)
  • 写入本地文件
    lib/host/fsapi.js:209
    await writeFile(abs, '', { flag: 'wx' })
  • 删除本地文件递归
    lib/host/fsapi.js:220
    await rm(abs, { recursive: true, force: false })
  • 写入本地文件
    lib/host/fsapi.js:233
    await rename(abs, to)
  • 执行外部命令固定命令
    lib/host/fsapi.js:243
    spawn('explorer.exe', ['/select,', abs], { detached: true, stdio: 'ignore' }).unref()
  • 读取本地文件
    lib/host/remote-fs.js:48
    const raw = readFileSync(join(homedir(), '.dsh', 'code-space-remote.json'), 'utf8')
  • 读取本地文件
    lib/host/remote-fs.js:82
    privateKey = readFileSync(expandLocal(candidate))
  • 读取本地文件
    lib/host/git.js:171
    const info = await stat(join(dir, '.git'))
  • 读取本地文件
    lib/host/git.js:180
    entries = await readdir(dir, { withFileTypes: true })
  • 删除本地文件
    lib/host/git.js:250
    await unlink(abs)
  • 读取本地文件
    lib/host/terminal.js:59
    const meta = JSON.parse(await readFile(file, 'utf8'))
  • 读取本地文件
    lib/host/terminal.js:178
    config.privateKey = readFileSync(candidate)
  • 读取本地文件
    lib/host/terminal.js:309
    if (existsSync(candidate)) return { command: candidate, label: 'PowerShell 7' }
  • 启用终端会话(PTY)
    lib/host/terminal.js:358
    ptyProcess = pty.spawn(shell.command, ['-NoLogo', '-NoProfile'], {
  • 执行外部命令来自配置/变量
    lib/host/terminal.js:401
    const child = spawn(shell.command, ['-NoLogo', '-NoProfile', '-Command', LOCAL_BOOTSTRAP], {
  • 读取本地文件
    lib/host/static.js:43
    if (!existsSync(abs)) {
  • 读取本地文件
    install.mjs:48
    const hasPlugin = (dir) => existsSync(join(dir, 'node_modules', PKG, 'package.json'))
  • 读取本地文件
    install.mjs:51
    const siblings = readdirSync(dirname(profile), { withFileTypes: true })
  • 读取本地文件
    install.mjs:67
    if (!existsSync(file)) return undefined
  • 读取本地文件
    install.mjs:74
    if (!existsSync(join(profile, 'package.json'))) fail(`profile 目录不对:${profile}(找不到 package.json)`)
  • 读取本地文件
    install.mjs:82
    if (existsSync(targetDir)) {
  • 删除本地文件递归
    install.mjs:83
    rmSync(targetDir, { recursive: true, force: true })
  • 读取本地文件
    install.mjs:86
    const pkgJson = JSON.parse(readFileSync(pkgJsonPath, 'utf8'))
  • 写入本地文件
    install.mjs:92
    writeFileSync(pkgJsonPath, `${JSON.stringify(pkgJson, null, 2)}\n`, 'utf8')
  • 写入本地文件
    install.mjs:100
    writeFileSync(patchPath, cleaned, 'utf8')
  • 删除本地文件递归
    install.mjs:119
    rmSync(targetDir, { recursive: true, force: true })
  • 写入本地文件
    install.mjs:125
    mkdirSync(targetDir, { recursive: true })
  • 写入本地文件
    install.mjs:157
    mkdirSync(dirname(to), { recursive: true })
  • 写入本地文件
    install.mjs:187
    writeFileSync(pkgJsonPath, `${JSON.stringify(pkgJson, null, 2)}\n`, 'utf8')
  • 写入本地文件
    install.mjs:202
    writeFileSync(patchPath, `${text.replace(/ *$/, '')}\n${block}\n`, 'utf8')
扫描于 2026/11/4(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery@deepseek-ai/cosmokit
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

基于 Monaco 的类 VS Code 工作台,用于 DeepSeek Harness——浮动窗口、标签页、diff、Git、SSH 终端。

README

由 DeepSeek 最新模型翻译生成
dsh-vscode-ide DSH 里的 VS Code 式工作台:Monaco 编辑器内核 + 独立浮动工作台窗口 + 按需加载的功能模块。 不是 VS Code 移植,也不加载 .vsix 扩展;它是一个轻量工作台——把 VS Code 里真正每天用的那部分(快速打开、多标签、查找替换、diff、命令面板、主题)搬进 DSH,其余按需再加。 截图 工作台:文件树、Monaco 编辑器与 SSH 终端同处一个浮动窗口 | 跟随会话工作区的文件树 | 源代码管理与命令面板 | | 与 HEAD 比较的 diff | 基于 xterm.js 的 SSH 终端 | 设置页:主题、编辑器字体、主题与图标导入、诊断 和市场上同类插件的区别 | | 形态 | 编辑器 | 扩展能力 | 包体积 | | dsh-vscode-ide(本项目) | 独立浮动工作台,不挤对话区 | Monaco(VS Code 同款内核) | 内置模块按需加载 + 公开 ctx.vscodeIde 服务 | 默认集约 11 MB | | dsh-vscode-mode | 驻 DSH 右侧 Sidebar | Monaco | LSP + SVN + 代码片段 + 扩展管理 | 约 27 MB |
展开完整文档(README 剩余 1 节)
dsh-vscode-ide

DSH 里的 VS Code 式工作台:Monaco 编辑器内核 + 独立浮动工作台窗口 + 按需加载的功能模块。

不是 VS Code 移植,也不加载 .vsix 扩展;它是一个轻量工作台——把 VS Code 里真正每天用的那部分(快速打开、多标签、查找替换、diff、命令面板、主题)搬进 DSH,其余按需再加。

截图

工作台:文件树、Monaco 编辑器与 SSH 终端同处一个浮动窗口

| 跟随会话工作区的文件树 | 源代码管理与命令面板 |
| 与 HEAD 比较的 diff | 基于 xterm.js 的 SSH 终端 |

设置页:主题、编辑器字体、主题与图标导入、诊断

和市场上同类插件的区别

| | 形态 | 编辑器 | 扩展能力 | 包体积 |
| dsh-vscode-ide(本项目) | 独立浮动工作台,不挤对话区 | Monaco(VS Code 同款内核) | 内置模块按需加载 + 公开 ctx.vscodeIde 服务 | 默认集约 11 MB |
| dsh-vscode-mode | 驻 DSH 右侧 Sidebar | Monaco | LSP + SVN + 代码片段 + 扩展管理 | 约 27 MB |
| dsh-ide / dsh-workbench / dsh-ide-vscode | 驻右侧栏 | CodeMirror | 文件树 / Git 审查 | 1~3 MB |
| dock 系列 | 独立 dock 轨道 | CodeMirror | 拆成 6 个包,按需装 | 每个 0.1~1 MB |

取舍很明确:要 VS Code 的编辑手感(Monaco),但不要 VS Code 的体量(扩展宿主/LSP/SVN);界面是独立浮窗,不抢 DSH 的右侧栏。

架构

三层 + 强制边界,详见 docs/ARCHITECTURE.md:

kernel/ 工作台内核:窗口壳、布局、命令面板、注册表、主题(不 import 任何 feature) features/ 功能模块:editor / explorer / git / terminal(各自带视图、命令、样式) dsh/ DSH 插槽适配:左侧栏入口、设置页分区

kernel 越界会被 node scripts/check-boundary.mjs 拦下(构建前自动执行)。
第三方插件的接入点已经以契约 v1 的形式暴露为 ctx.vscodeIde(视图 / 状态项 / 命令 / 打开文件),所有贡献都带 apiVersion,内核只接受 1。

当前状态:1.1

- ✅ 独立浮窗壳:拖动、八向缩放、最大化、几何记忆(localStorage: dsv:layout.v1);最大化时顶部让出 44px,永远退得出来
- ✅ 左侧栏「Code Space」入口(点击开/关工作台)+ DSH 设置页分区(走 sidebar.panellist / settings.section 插槽)
- ✅ 速览:Ctrl+Alt+Q 临时藏起工作台看对话,再按原样回来(不丢编辑器状态);可拖动浮钮提供鼠标入口
- ✅ 文件树:跟随当前会话工作目录,按需展开;远程工作区自动走 SFTP
- ✅ Monaco 编辑器:ESM 预打包、按需加载;每文件一个 ITextModel,切标签不丢未保存内容
- ✅ 保存:Ctrl+S(临时文件 + rename 原子写)、Ctrl+W 关标签、脏标记与关闭确认
- ✅ 查找替换:Monaco 自带 widget(Ctrl+F)
- ✅ 快速打开 Ctrl+Alt+P / 命令面板 Ctrl+Alt+Shift+P(Ctrl+P 被 DSH 占用)
- ✅ 全局搜索与替换 Ctrl+Alt+Shift+F:浮动搜索面板(不占侧栏,Esc 关闭),整工作区搜内容、按文件分组、点击跳到对应行;⇄ 展开替换框,确认后全部替换;Git 仓库走 git grep,其余遍历(远程工作区暂不支持)
- ✅ 草稿恢复(hot exit):未保存内容写 localStorage: dsv:drafts.v1,重启后自动接回并保留脏标记
- ✅ Diff 视图:与磁盘版本比较 / 与 HEAD 比较 / 比较两个文件
- ✅ Git:分支与变更列表、diff、逐文件暂存、全部暂存、提交(下拉可选提交全部/提交并推送)、放弃更改、推送;远程工作区同样可用(命令在服务器上通过 SSH 执行);工作区根不是仓库时,可用「选择仓库目录…」把 Git 指向子目录(本地/远程通用)
- ✅ SSH 终端:xterm.js,多会话;面板在编辑器列内上下分(VS Code 那样,左侧文件树保持全高):拖分隔线调整高度,一直往下拖可收成一条线,点击或拖动那条线即可恢复;面板头部按钮还能改成右侧停靠;有远程工作区时自动复用其连接信息,没有时点「+SSH」手填主机/用户/私钥(或密码),首次使用无需预配远程工作区;可保存主机;只记住一台时「+SSH」直接连,多台或没有时才弹选择框,密码不落盘
- ✅ 本地 PowerShell 命令控制台(非 PTY,不支持 vim/top 等全屏程序)
- ✅ 主题:跟随 DSH / One Dark Pro / 导入任意 VS Code 主题 JSON(编辑器与外壳一起换皮)
- ✅ 图标:内置 Material Icon Theme,可导入任意 VS Code 图标主题(构建期合成 sprite,懒加载)
- ✅ 设置:编辑器字体/字号、自动换行、行号、Tab 宽度、终端字号、主题与图标导入、宿主诊断,全部持久化且改完即时生效
- ✅ 环境探针:await __dsv.probe(),probe(true) 落盘

安装

npm 尚未发布(注册受地区风控限制),当前请用 GitHub Release 里的安装包。

从 GitHub Release 安装(推荐)

1. 到 Releases 下载 dsh-vscode-ide-1.0.0.tgz
2. 解压并运行自带的安装器:

tar -xzf dsh-vscode-ide-1.0.0.tgz
cd package
node install.mjs

install.mjs 会自动找到已装有本插件的 profile;要指定目录就加 --profile "<目录>"。

3. 完全退出 DSH(托盘图标 → 退出)再打开——客户端 bundle 只在启动时加载。

从源码安装(开发)

npm install
npm run build # 必须:vendor/ 与 lib/client.js 不在仓库里
node install.mjs

npm(发布后)

dsh plugin --profile web add dsh-vscode-ide

卸载(保留 localStorage 里的窗口几何等用户数据)

node install.mjs --remove

使用

- 左侧栏点 Code Space:开 / 关工作台(再次点击关闭,窗口跑到屏幕外也能关掉)
- Ctrl+Alt+I 开关工作台、Ctrl+Alt+Q 速览(临时藏起工作台看对话,再按回来)
- 屏幕上的浮钮「对话」:等价 Ctrl+Alt+Q,可拖动到顺手位置,位置会记住
- 标题栏:拖动移动、⌕ 转到文件、> 命令面板、↻ 刷新工作区、– 最小化到对话(同 Ctrl+Alt+Q)、⤢ 最大化、✕ 关闭
- 四边/四角拖动可缩放,最小 720×460
- 设置:DSH 设置页 → Code Space,可改主题(跟随 DSH / One Dark Pro / 导入 VS Code 主题 JSON)、编辑器字体、终端字号,并导入图标主题
- 控制台:

await __dsv.probe() // 环境探针:origin / worker / 插槽尺寸 / 层级
__dsv.open(); __dsv.close(); __dsv.toggle()
__dsv.layout.resetGeometry() // 窗口拖丢时复位

__dsv.probe() 会输出一份结构化结果,重点看:

| 字段 | 含义 |
| location.origin | 页面真实 origin(http://127.0.0.1:<port> 还是 dsh-app://) |
| workers.sameOrigin | 插件静态路由上的 Worker 能否创建(Monaco 语言服务的前提) |
| workers.blob | blob Worker 是否被 CSP 放行 |
| layout.slot | 插槽容器实际尺寸(决定入口面板能做多大) |
| layout.bodyLayers | body 上各浮层的 z-index(决定壳与 DSH 模态的层级) |
| host / api | 宿主半边是否挂上、会话工作目录能否解析 |

安全边界

插件能读写用户磁盘,所以:

- 路由只接受本机回环 + 同源请求;
- 工作区内的路径先 realpath 再做前缀判断,只允许会话工作区之内;
- 读上限 2 MiB,写入走「临时文件 + rename」,不会写坏原文件;
- 远程工作区:文件操作走 SFTP,路径映射限制在工作区的远端根目录内;
- 主题 / 图标导入是唯一的例外:它会读你填的那一个 JSON(以及图标 JSON 同目录的 SVG),这是用户显式指定的路径,读到的内容只在浏览器里使用,不会写回磁盘。

开发

npm install # esbuild + typescript + monaco + xterm + 图标素材
npm run build # 边界检查 → monaco → xterm → icons → client
npm run smoke # 产物冒烟(不启动 DSH)
npm run typecheck # tsc --noEmit
node install.mjs # 装进 desktop profile(可加 --profile <dir>)

发布流程见 docs/PUBLISH.md。

路线图

| 版本 | 内容 |
| 0.1 – 0.6 | 壳 / Monaco / 快速打开 / 草稿 / diff / Git 只读 / SSH 终端 |
| 0.7 – 0.9 | 本地 PowerShell 控制台、Git 写操作、远程工作区 SFTP |
| 0.10 – 0.16 | 内核与 feature 分层、One Dark 主题、Material 图标、主题与图标导入 |
| 0.17 – 0.19 | 编辑器字体设置、速览与浮钮、高对比描边、设置页重排 |
| 1.0.0 | 首个公开发布版 |
| 1.1.10 | 内容搜索(浮动面板)、编辑器外观设置(字号/换行/行号/Tab) |
| 之后 | 全局内容搜索、远程 Git、编辑器细节设置(字号 / 换行 / 缩进)、TextMate 与 LSP(按需、带体积预算) |

License

MIT
预览分享卡片长什么样 ↓beiryang/dsh-vscode-ide
分享 · DeepSeek Harness Hub
beiryang/dsh-vscode-ide

在浮动窗口里编辑代码、看 diff、连 SSH 终端

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部