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

VS Code 侧边栏 Xizhi1024/deepseek-harness-dsh-for-vscode

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

把 Cursor 式的 AI 编程体验带进 VS Code——底层跑的是你自己的 DeepSeek Harness…

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

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

自动兼容检查有告警:未发布到 npm registry,仅可从源码安装。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Xizhi1024/deepseek-harness-dsh-for-vscode
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

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

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意

未发布到 npm registry,仅可从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包dsh-vs-sidebar(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/30 15:54:05

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

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

可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 64 处,展示前 64 条)
  • 执行外部命令固定命令
    src/extension.js:531
    const out = execFileSync('powershell.exe', ['-NoProfile', '-NonInteractive', '-Command', command], {
  • 读取本地文件
    src/extension.js:540
    const stat = fs.readFileSync(`/proc/${pid}/stat`, 'utf8');
  • 写入本地文件
    src/extension.js:562
    fs.mkdirSync(path.dirname(heartbeatFilePath), { recursive: true });
  • 写入本地文件
    src/extension.js:569
    fs.writeFileSync(heartbeatFilePath, payload, 'utf8');
  • 读取本地文件
    src/extension.js:1247
    return fs.readdirSync(profilesRoot, { withFileTypes: true })
  • 读取本地文件
    src/extension.js:1250
    .filter((name) => fs.existsSync(path.join(profilesRoot, name, 'package.json')));
  • 写入本地文件
    src/extension.js:1673
    fs.mkdirSync(snapshotDir, { recursive: true });
  • 写入本地文件
    src/extension.js:1675
    fs.writeFileSync(snapshotPath, payload.beforeText, 'utf8');
  • 发起网络请求
    src/extension.js:2531
    await threadAttachmentCoordinator.request(targetWebview, text);
  • 执行外部命令固定命令
    src/serverManager.js:840
    const out = execFileSync('tasklist', ['/FI', `PID eq ${pid}`, '/FO', 'CSV', '/NH'], {
  • 读取本地文件
    src/serverManager.js:867
    const parsed = JSON.parse(fs.readFileSync(registryFile, 'utf8'));
  • 写入本地文件
    src/serverManager.js:886
    fs.mkdirSync(path.dirname(path.resolve(registryFile)), { recursive: true });
  • 写入本地文件
    src/serverManager.js:887
    fs.writeFileSync(registryFile, JSON.stringify(entries, null, 2) + '\n');
  • 读取本地文件
    src/serverManager.js:1034
    const stat = fs.statSync(logPath);
  • 读取本地文件
    src/serverManager.js:1365
    parsed = JSON.parse(fs.readFileSync(registryFile, 'utf8'));
  • 删除本地文件
    src/serverManager.js:1372
    try { fs.unlinkSync(registryFile); } catch { }
  • 读取本地文件
    src/localRuntimeResolver.js:56
    for (const entry of fs.readdirSync(root, { withFileTypes: true })) {
  • 读取本地文件
    src/localRuntimeResolver.js:119
    entries = fs.readdirSync(root, { withFileTypes: true });
  • 执行外部命令来自配置/变量
    src/launchMethodResolver.js:30
    execFile(file, args, { windowsHide: true, env }, (error, stdout) => {
  • 执行外部命令来自配置/变量
    src/processDiscovery.js:56
    execFile(file, args,
  • 发起网络请求
    src/textDocumentBridge.js:174
    const unauthorized = await fetch(bridge.env.DSH_VSCODE_OPEN_URL, {
  • 发起网络请求
    src/textDocumentBridge.js:181
    const relative = await fetch(bridge.env.DSH_VSCODE_OPEN_URL, {
  • 发起网络请求
    src/textDocumentBridge.js:191
    const accepted = await fetch(bridge.env.DSH_VSCODE_OPEN_URL, {
  • 写入剪贴板
    src/interactionBridge.js:61
    await vscode.env.clipboard.writeText(request.text);
  • 读取剪贴板
    src/interactionBridge.js:63
    const text = await vscode.env.clipboard.readText();
  • 发起网络请求
    src/commands/addFileToThread.js:75
    await coordinator.request(view.webview, text);
  • 发起网络请求
    src/commands/addFileToThread.js:150
    await coordinator.request(view.webview, text);
  • 发起网络请求
    src/commands/ctrlIEdit.js:228
    await coordinator.request(targetWebview, text);
  • 发起网络请求
    src/commands/ctrlKEdit.js:105
    await coordinator.request(targetWebview, draft);
  • 读取本地文件
    src/changeWatcher.js:188
    statSync = (...args) => fs.statSync(...args),
  • 读取本地文件
    src/changeWatcher.js:189
    readFileSync = (...args) => fs.readFileSync(...args),
  • 写入本地文件
    src/changeWatcher.js:190
    writeFileSync = (...args) => fs.writeFileSync(...args),
  • 写入本地文件
    src/changeWatcher.js:191
    mkdirSync = (...args) => fs.mkdirSync(...args),
  • 读取本地文件
    src/callExportJournal.js:60
    const parsed = JSON.parse(fs.readFileSync(filePath, 'utf8'));
  • 写入本地文件
    src/callExportJournal.js:71
    fs.mkdirSync(path.dirname(filePath), { recursive: true });
  • 写入本地文件
    src/callExportJournal.js:72
    fs.writeFileSync(temporary, JSON.stringify(entries, null, 2), { mode: 0o600 });
  • 写入本地文件
    src/callExportJournal.js:73
    fs.renameSync(temporary, filePath);
  • 写入本地文件
    src/changeTree.js:486
    fs.mkdirSync(directory, { recursive: true });
  • 写入本地文件
    src/changeTree.js:488
    fs.writeFileSync(originalPath, preview.beforeText, 'utf8');
  • 读取本地文件
    src/changeTree.js:534
    targetExists = Boolean(resolvedFsPath) && fs.existsSync(resolvedFsPath);
  • 读取本地文件
    src/changeTree.js:542
    snapshotExists = Boolean(snapshotPath) && fs.existsSync(snapshotPath);
  • 读取本地文件
    src/changeTree.js:571
    snapshotExists = Boolean(snapshotPath) && fs.existsSync(snapshotPath);
  • 写入本地文件
    src/changeTree.js:607
    fs.mkdirSync(directory, { recursive: true });
  • 写入本地文件
    src/changeTree.js:609
    fs.writeFileSync(originalPath, before.text, 'utf8');
  • 读取本地文件
    src/changeTree.js:683
    if (fs.existsSync(candidate)) return candidate;
  • 读取本地文件
    src/changeTree.js:764
    const text = fs.readFileSync(entry.beforeSnapshotPath, 'utf8');
  • 写入本地文件
    src/changeTree.js:765
    fs.writeFileSync(targetPath, text, 'utf8');
  • 发起网络请求
    src/mcp/manager.js:187
    const page = await client.request('tools/list', cursor ? { cursor } : {}, { timeoutMs: 15000 });
  • 发起网络请求
    src/mcp/manager.js:213
    const raw = await client.request('tools/call', {
  • 读取本地文件
    src/managedRuntimeLaunch.js:124
    const stat = fs.lstatSync(runtime.executablePath);
  • 读取本地文件
    src/managedRuntimeLaunch.js:144
    const stat = fs.lstatSync(patchPath);
  • 读取本地文件
    src/runtimeArtifact.js:178
    const stream = fs.createReadStream(filePath);
  • 发起网络请求
    src/runtimeDownloader.js:20
    const request = https.get(url, { signal, headers: { 'user-agent': 'dsh-vs-sidebar-runtime' } }, (response) => {
  • 发起网络请求
    src/mcp/transportStdio.js:48
    const result = await rpc.request('initialize', {
  • 发起网络请求
    src/mcp/transportStdio.js:63
    return rpc.request(method, params, { ...options, timeoutMs });
  • 读取本地文件
    src/detection/profileProbe.js:67
    const packageText = fs.readFileSync(packageJsonPath, 'utf8');
  • 读取本地文件
    src/detection/profileProbe.js:68
    const patchText = fs.readFileSync(patchPath, 'utf8');
  • 读取本地文件
    src/runtimeArchive.js:74
    const gunzip = fs.createReadStream(archivePath).pipe(zlib.createGunzip());
  • 发起网络请求
    runtime-integration/dsh-vscode-integration/lib/client.js:570
    fetch(LINKIFY_OPEN_URL, {
  • 读取本地文件
    runtime-integration/dsh-vscode-integration/lib/index.js:11
    const packageJson = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8'));
  • 发起网络请求
    runtime-integration/dsh-vscode-integration/lib/index.js:69
    const response = await fetch(endpoint, {
  • 执行外部命令固定命令
    runtime-integration/dsh-vscode-integration/lib/index.js:218
    const out = execFileSync('powershell.exe', ['-NoProfile', '-NonInteractive', '-Command', command], {
  • 读取本地文件
    runtime-integration/dsh-vscode-integration/lib/index.js:227
    const stat = readFileSync(`/proc/${pid}/stat`, 'utf8');
  • 发起网络请求
    runtime-integration/dsh-vscode-integration/lib/tools.js:621
    const execute = (params, options) => generation.request(entry.method, params, {
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库

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

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

1 张 · 点击查看大图

功能亮点

  • 侧边栏直连本地会话
  • 在编辑器内写代码

README

由 DeepSeek 最新模型翻译生成
DeepSeek Harness(dsh) for VS Code 简体中文 · English 把 Cursor 式的 AI 编程体验带进 VS Code——底层跑的是你自己的 DeepSeek Harness (DSH) Agent。 在 VS Code 辅助侧边栏嵌入完整 DSH Web UI:每个窗口自动启动并持有一个本地 dsh web 服务(cwd = 当前工作区),你的模块、技能、MCP、凭据、会话全部可用。在此之上补齐 IDE 集成层: - 侧边栏即对话:Ctrl+Alt+B 打开;复制/粘贴/右键菜单、文件跳转、主题跟随全部原生 - 上下文附加:右键把文件 / 选区 / 文件夹 / Problems 以紧凑链接加入对话草稿,绝不粘贴源码、绝不自动发送 - DSH 变更评审:DSH 推送的工作区编辑进入专门树视图,diff / 接受 / 撤销,写文件前必须审批(默认开启) - @dsh 聊天参与者:VS Code 原生聊天里输入 @dsh 直连本地 DSH 会话,流式回复,不占 Copilot 配额(默认开启) - 进阶可选:Ctrl+K / Ctrl+I 内联编辑、模型路由进 VS Code 选择器、MCP 消费、终端 / UI 桥、FIM Tab 补全——全部挂在显式同意开关后 ⚠️ 兼容性 | 项 | 要求 |
展开完整文档(README 剩余 1 节)
DeepSeek Harness(dsh) for VS Code

简体中文 · English

把 Cursor 式的 AI 编程体验带进 VS Code——底层跑的是你自己的 DeepSeek Harness (DSH) Agent。

在 VS Code 辅助侧边栏嵌入完整 DSH Web UI:每个窗口自动启动并持有一个本地 dsh web 服务(cwd = 当前工作区),你的模块、技能、MCP、凭据、会话全部可用。在此之上补齐 IDE 集成层:

- 侧边栏即对话:Ctrl+Alt+B 打开;复制/粘贴/右键菜单、文件跳转、主题跟随全部原生
- 上下文附加:右键把文件 / 选区 / 文件夹 / Problems 以紧凑链接加入对话草稿,绝不粘贴源码、绝不自动发送
- DSH 变更评审:DSH 推送的工作区编辑进入专门树视图,diff / 接受 / 撤销,写文件前必须审批(默认开启)
- @dsh 聊天参与者:VS Code 原生聊天里输入 @dsh 直连本地 DSH 会话,流式回复,不占 Copilot 配额(默认开启)
- 进阶可选:Ctrl+K / Ctrl+I 内联编辑、模型路由进 VS Code 选择器、MCP 消费、终端 / UI 桥、FIM Tab 补全——全部挂在显式同意开关后

⚠️ 兼容性

| 项 | 要求 |
| VS Code | ≥ 1.106,仅桌面版;不支持远程 / 虚拟 / 不受信任工作区 |
| DSH CLI | npm i -g @deepseek-ai/dsh,建议 ≥ 0.1.0-rc.7(更老的运行时会自动降级重试,但部分功能受限) |
| Node.js | 自动发现;非标准位置设 dsh.local.nodePath |

📦 安装

- Marketplace(推荐):扩展视图搜索 DeepSeek Harness(发布者 Xizhi1024),或 code --install-extension Xizhi1024.dsh-vs-sidebar
- VSIX:从 Releases 下载 → Extensions: Install from VSIX...

🚀 使用

1. 按 Ctrl+Alt+B 打开侧边栏——扩展自动启动(或复用)本地 dsh web 并加载 UI
2. 编辑器里选中代码 → 右键 添加到 DSH 对话,草稿收到 文件:行号 紧凑链接,回车发送
3. VS Code 聊天视图输入 @dsh + 问题,回复来自本地 DSH 会话
4. 让 DSH 经桥提议编辑:变更进入 DSH 变更 视图,diff / 接受 / 撤销,未批准不写文件

将 VS Code 选区以紧凑链接添加到 DSH 对话

常用命令(命令面板 DSH: 前缀):新建/切换会话 · 打开会话历史 · 重启/停止服务 · 在浏览器打开 · 新建 DSH 实例(Ctrl+Alt+N)· 诊断 · 干净重启 · 设置 DSH FIM API Key。

⚙️ 配置

| 键 | 默认 | 说明 |
| dsh.port | 3080 | DSH Web 服务端口 |
| dsh.autoStart | true | VS Code 启动即拉起服务 |
| dsh.home.mode | shared | shared=共享官方 ~/.dsh;isolated=扩展私有目录 |
| dsh.profile | web | DSH profile 目录名 |
| dsh.executablePath | (空) | 手动指定 DSH 可执行文件/包目录/shim,优先于自动发现 |
| dsh.closePolicy | onVscodeExit | 何时停止自有服务 |
| dsh.features.changes-review | true | DSH 变更评审(写前审批) |
| dsh.changes.observe-tools | true | 工具产生的编辑归因进变更树(「工具」分组) |
| dsh.features.chat-participant | true | @dsh 聊天参与者 |
| dsh.features.ctrl-k / ctrl-i | false | 内联编辑命令(Ctrl+K / Ctrl+I) |
| dsh.features.lm-route | false | DSH 模型进 VS Code 语言模型选择器 |
| dsh.features.mcp-consume | false | DSH 消费 VS Code 侧 MCP 服务器 |
| dsh.features.tab-completion | false | FIM Tab 补全——需设置 dsh.fim.baseUrl + DSH: 设置 FIM API Key 并重启 DSH 服务 |
| dsh.fim.baseUrl | (空) | 上游 FIM 端点(OpenAI 兼容 completions API 完整 URL) |
| dsh.keybindings.ctrlL | true | Ctrl+L 把选区加入对话草稿(绝不发送) |
| dsh.bridge.terminal / editorRead / ui | false | 终端 / 编辑器读取 / UI 表面桥(同意开关) |

完整键列表见 package.json;诊断用命令 DSH: Diagnose。

License

MIT
预览分享卡片长什么样 ↓Xizhi1024/deepseek-harness-dsh-for-vscode
分享 · DeepSeek Harness Hub
Xizhi1024/deepseek-harness-dsh-for-vscode

把 Cursor 式的 AI 编程体验带进 VS Code——底层跑的是你自己的 DeepSeek Harness…

这是你的仓库?认领条目

回到顶部