在 VS Code 里直接调用 dsh 智能体写代码
33.5/100
综合分
5
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/9/19 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
自动兼容检查未通过:缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装;安装清单取自 tools/fixtures/panel-test-plugin/package.json。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add 642463401/DSHIDE该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:需留意
是什么
dsh 原生插件 · dev
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 74 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
⚠︎ 实装验证未通过(unknown · 2026/10/27) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装;安装清单取自 tools/fixtures/panel-test-plugin/package.json
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✗npm 包fleetide-panel-test-plugin(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✗入口文件缺少入口声明
源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/28 23:39:01
🔴 安全扫描发现高危能力自动 · 静态分析源码
v2.7.0🔴 扫描:高危尚无人工评估
静态扫描发现安装期即执行代码,或命令参数由运行时变量拼接(参数来源无法静态判定,从严处理)。
命令参数由运行时变量拼接读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 90 处,展示前 88 条)
- 执行外部命令固定命令vscode/build/copilot-migrate-pr.ts:139
return execFileSync('gh', args, { encoding: 'utf-8', maxBuffer: 50 * 1024 * 1024 }); - 执行外部命令固定命令vscode/build/copilot-migrate-pr.ts:143
return execFileSync('git', args, { - 读取本地文件vscode/build/copilot-migrate-pr.ts:360
return fs.existsSync(path.join(repoRoot, '.git', 'rebase-apply')); - 写入本地文件vscode/build/copilot-migrate-pr.ts:438
fs.writeFileSync(tmpPatch, rewrittenPatch); - 删除本地文件vscode/build/copilot-migrate-pr.ts:450
fs.unlinkSync(tmpPatch); - 执行外部命令固定命令vscode/build/gulpfile.cli.ts:47
const r = cp.spawnSync('cargo', ['--version']); - 执行外部命令固定命令vscode/build/gulpfile.cli.ts:58
const proc = cp.spawn('cargo', ['--color', 'always', 'build'], { - 读取本地文件vscode/build/gulpfile.cli.ts:61
env: existsSync(platformOpensslDir) ? { OPENSSL_DIR: platformOpensslDir, ...process.env } : process.env - 写入本地文件vscode/build/gulpfile.cli.ts:79
mkdirSync(dir, { recursive: true }); - 执行外部命令来自配置/变量vscode/build/gulpfile.cli.ts:81
cp.spawnSync( - 删除本地文件递归vscode/build/gulpfile.cli.ts:93
rmSync(dir, { recursive: true, force: true }); - 读取本地文件vscode/build/gulpfile.cli.ts:102
} else if (err.toString().includes('Could not find directory of OpenSSL installation') && !existsSync(platformOpensslDir)) { - 删除本地文件vscode/build/gulpfile.extensions.ts:178
fs.rmSync(tsBuildInfoFile, { force: true }); - 读取本地文件vscode/build/gulpfile.reh.ts:144
const npmrc = fs.readFileSync(path.join(REPO_ROOT, 'remote', '.npmrc'), 'utf8'); - 读取本地文件vscode/build/gulpfile.reh.ts:151
const nodeJsChecksums = fs.readFileSync(path.join(REPO_ROOT, 'build', 'checksums', 'nodejs.txt'), 'utf8'); - 执行外部命令运行时拼接vscode/build/gulpfile.reh.ts:164
const contents = cp.execSync(`docker run --rm ${imageName}:${nodeVersion}-alpine /bin/sh -c 'cat \`which node\`'`, { maxBuffer: 100 * 1024 * 1024, enc - 读取本地文件vscode/build/gulpfile.reh.ts:255
if (!fs.existsSync(nodePath)) { - 读取本地文件vscode/build/gulpfile.reh.ts:377
const manifest = JSON.parse(fs.readFileSync(path.join(REPO_ROOT, extensionPath)).toString()); - 读取本地文件vscode/build/gulpfile.reh.ts:381
const builtInExtensions: Array<{ name: string; platforms?: string[]; clientOnly?: boolean }> = JSON.parse(fs.readFileSync(path.join(REPO_ROOT, 'produc - 执行外部命令固定命令vscode/build/gulpfile.reh.ts:538
const proc = cp.spawn('signtool.exe', ['verify', '/pa', filePath]); - 执行外部命令固定命令vscode/build/gulpfile.reh.ts:552
const proc = cp.spawn('signtool.exe', ['remove', '/s', filePath]); - 读取本地文件vscode/build/gulpfile.scan.ts:117
readdirSync(destinationExe).forEach(file => { - 读取本地文件vscode/build/gulpfile.scan.ts:124
if (!existsSync(path.join(destinationPdb, pdb))) { - 读取本地文件vscode/build/gulpfile.vscode.ts:47
const packageLock = JSON.parse(fs.readFileSync(path.join(root, 'package-lock.json'), 'utf8')) as { - 读取本地文件vscode/build/gulpfile.vscode.ts:244
const contents = fs.readFileSync(filename); - 执行外部命令固定命令vscode/build/gulpfile.vscode.ts:608
const proc = cp.spawn('signtool.exe', ['verify', '/pa', filePath]); - 执行外部命令固定命令vscode/build/gulpfile.vscode.ts:622
const proc = cp.spawn('signtool.exe', ['remove', '/s', filePath]); - 读取本地文件vscode/build/gulpfile.vscode.ts:693
if (fs.existsSync(builtInCopilotExtensionDir)) { - 执行外部命令来自配置/变量vscode/build/gulpfile.vscode.web.ts:48
const proc = cp.spawn(process.execPath, args, { - 执行外部命令来自配置/变量vscode/build/gulpfile.vscode.win32.ts:50
cp.spawn(innoSetupPath, args, { stdio: ['ignore', 'inherit', 'inherit'] }) - 写入本地文件vscode/build/gulpfile.vscode.win32.ts:72
fs.mkdirSync(outputPath, { recursive: true }); - 读取本地文件vscode/build/gulpfile.vscode.win32.ts:81
const productJson = JSON.parse(fs.readFileSync(originalProductJsonPath, 'utf8')); - 写入本地文件vscode/build/gulpfile.vscode.win32.ts:126
fs.writeFileSync(productJsonPath, JSON.stringify(productJson, undefined, '\t')); - 发起网络请求vscode/build/lib/builtInExtensionsCG.ts:40
const response = await fetch(`${repositoryContentBaseUrl}/${fileName}`); - 读取本地文件vscode/build/lib/copilot.ts:258
if (!fs.existsSync(copilotSdkBase)) { - 读取本地文件vscode/build/lib/copilot.ts:267
if (!fs.existsSync(ripgrepSource)) { - 读取本地文件vscode/build/lib/copilot.ts:271
diagnostics = fs.existsSync(binDir) - 读取本地文件vscode/build/lib/copilot.ts:272
? `Available bin entries: ${JSON.stringify(fs.readdirSync(binDir))}` - 写入本地文件vscode/build/lib/copilot.ts:284
fs.mkdirSync(ripgrepDest, { recursive: true }); - 写入本地文件vscode/build/lib/copilot.ts:287
fs.writeFileSync(shimMarkerPath, 'Shims created successfully'); - 删除本地文件vscode/build/lib/copilot.ts:318
fs.rmSync(path.join(sdkPrebuildsTarget, 'mediaremote-adapter'), { recursive: true, force: true }); - 删除本地文件vscode/build/lib/copilot.ts:368
return { dir: stagedPackageDir, cleanup: () => fs.rmSync(staged, { recursive: true, force: true }) }; - 删除本地文件vscode/build/lib/copilot.ts:370
fs.rmSync(staged, { recursive: true, force: true }); - 读取本地文件vscode/build/lib/copilot.ts:386
lock = JSON.parse(fs.readFileSync(lockfilePath, 'utf8')); - 读取本地文件vscode/build/lib/copilot.ts:414
const version = JSON.parse(fs.readFileSync(path.join(packageDir, 'package.json'), 'utf8')).version; - 删除本地文件vscode/build/lib/copilot.ts:426
fs.rmSync(target, { recursive: true, force: true }); - 写入本地文件vscode/build/lib/copilot.ts:427
fs.mkdirSync(path.dirname(target), { recursive: true }); - 删除本地文件vscode/build/lib/copilot.ts:440
fs.rmSync(path.join(prebuildsDir, platformArch), { recursive: true, force: true }); - 执行外部命令固定命令vscode/build/lib/date.ts:19
return execSync('git log -1 --format=%cI HEAD', { cwd: root, encoding: 'utf8' }).trim(); - 执行外部命令来自配置/变量vscode/build/lib/esbuild.ts:21
const proc = cp.spawn(process.execPath, args, { - 执行外部命令来自配置/变量vscode/build/lib/esbuild.ts:52
const proc = cp.spawn(process.execPath, args, { - 发起网络请求vscode/build/lib/fetch.ts:55
const response = await fetch(url, { - 读取密钥环境变量vscode/build/lib/fetch.ts:111
if (process.env.GITHUB_TOKEN) { - 读取密钥环境变量vscode/build/lib/fetch.ts:112
ghApiHeaders.Authorization = 'Basic ' + Buffer.from(process.env.GITHUB_TOKEN).toString('base64'); - 读取本地文件vscode/build/lib/npmPackage.ts:30
if (fs.existsSync(packageDir)) { - 写入本地文件vscode/build/lib/npmPackage.ts:46
fs.mkdirSync(packageDir, { recursive: true }); - 删除本地文件vscode/build/lib/npmPackage.ts:50
fs.rmSync(packageDir, { recursive: true, force: true }); - 删除本地文件vscode/build/lib/npmPackage.ts:53
fs.rmSync(tempDir, { recursive: true, force: true }); - 删除本地文件vscode/build/lib/npmPackage.ts:71
fs.rmSync(targetDir, { recursive: true, force: true }); - 写入本地文件vscode/build/lib/npmPackage.ts:72
fs.mkdirSync(targetDir, { recursive: true }); - 删除本地文件vscode/build/lib/npmPackage.ts:76
fs.rmSync(targetDir, { recursive: true, force: true }); - 删除本地文件vscode/build/lib/npmPackage.ts:79
fs.rmSync(tempDir, { recursive: true, force: true }); - 执行外部命令来自配置/变量vscode/build/lib/npmPackage.ts:85
execFileSync(process.platform === 'win32' ? 'npm.cmd' : 'npm', ['pack', `${packageName}@${version}`, '--pack-destination', tempDir, '--silent'], { std - 读取本地文件vscode/build/lib/npmPackage.ts:87
const tarball = fs.readdirSync(tempDir).find(name => name.endsWith('.tgz')); - 读取本地文件vscode/build/lib/npmPackage.ts:97
return JSON.parse(fs.readFileSync(lockFilePath, 'utf8')); - 读取本地文件vscode/build/lib/npmPackage.ts:114
const actual = createHash('sha512').update(fs.readFileSync(tarballPath)).digest('base64'); - 执行外部命令来自配置/变量vscode/build/lib/preLaunch.ts:14
const child = spawn(command, args, { cwd: rootDir, stdio: 'inherit', env: process.env, shell: process.platform === 'win32' }); - 读取本地文件vscode/build/lib/propertyInitOrderChecker.ts:48
const configHostParser: ts.ParseConfigHost = { fileExists: fs.existsSync, readDirectory: ts.sys.readDirectory, readFile: file => fs.readFileSync(file, - 读取本地文件vscode/build/lib/screenshotBlocksCi.ts:76
const manifest: Manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8')); - 读取本地文件vscode/build/lib/screenshotBlocksCi.ts:80
if (fs.existsSync(markdownPath)) { - 读取本地文件vscode/build/lib/screenshotBlocksCi.ts:81
committed = fs.readFileSync(markdownPath, 'utf8'); - 发起网络请求vscode/build/lib/screenshotDiffReport.ts:159
https.get(url, (res) => { - 读取本地文件vscode/build/lib/screenshotDiffReport.ts:503
if (!fs.existsSync(localManifestPath)) { - 读取本地文件vscode/build/lib/screenshotDiffReport.ts:508
const baseManifestPath = baseManifestPathArg && fs.existsSync(baseManifestPathArg) ? baseManifestPathArg : null; - 读取本地文件vscode/build/lib/screenshotDiffReport.ts:514
const local = JSON.parse(fs.readFileSync(localManifestPath, 'utf8')) as LocalManifest; - 读取本地文件vscode/build/lib/screenshotDiffReport.ts:516
? JSON.parse(fs.readFileSync(baseManifestPath, 'utf8')) as BaseCommitResponse - 写入本地文件vscode/build/lib/screenshotDiffReport.ts:530
fs.mkdirSync(tmpDir, { recursive: true }); - 写入本地文件vscode/build/lib/screenshotDiffReport.ts:531
fs.writeFileSync( - 执行外部命令来自配置/变量vscode/build/lib/tsgo.ts:43
const child = cp.spawn(process.execPath, args, { - 读取本地文件vscode/extensions/esbuild-common.mts:116
const watchPathStat = await stat(watchPath); - 读取本地文件vscode/extensions/postinstall.mjs:17
for (const name of fs.readdirSync(root)) { - 删除本地文件vscode/extensions/postinstall.mjs:21
fs.rmSync(filePath, { recursive: true }); - 读取本地文件vscode/extensions/postinstall.mjs:39
for (const name of fs.readdirSync(libRoot)) { - 删除本地文件vscode/extensions/postinstall.mjs:50
fs.unlinkSync(path.join(libRoot, name)); - 读取本地文件vscode/src/bootstrap-node.ts:239
const isPortable = !('target' in product) && fs.existsSync(portableDataPath); - 读取本地文件vscode/src/bootstrap-node.ts:241
const isTempPortable = isPortable && fs.existsSync(portableTempPath); - 写入本地文件vscode/src/server-main.ts:193
fs.mkdirSync(logsPath, { recursive: true }); - 写入本地文件vscode/src/server-main.ts:219
fs.appendFileSync(diagnosticsFile, `${line}\n`);
扫描于 2026/11/4(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- VSCode分支
- 进程内智能体内核
- 调用智能体写代码
DSH 生态 IDE——VS Code 分支,把 dsh 作为进程内智能体内核
README
由 DeepSeek 最新模型翻译生成DSHIDE
DSHIDE 是构建在 Visual Studio Code 与 dsh(DeepSeek 开源 Agent 框架)之上的 AI 原生 IDE。编辑器层是 VS Code,全部原生功能完整保留(编辑、调试、Git、终端、扩展生态);AI 层是 dsh,以进程内内核的形式直接跑在 IDE 里。
与其它 AI IDE 的不同
- dsh 即 IDE 内核。 无伴生进程、无 localhost 服务。dsh 的整套 Agent 树(agent preset、沙箱、审批栈、存储、插件系统)在扩展宿主内以 fleetide profile 启动(位于 ~/.dsh),与 dsh CLI 完全同款协议栈,零翻译层。
- 原生 Chat,无自绘面板。 聊天界面就是 VS Code 原生 Chat 面板,dsh 是默认参与者;审批与提问走原生弹窗(fail-closed,关窗即拒绝)。
- 四模式 + 思考长度 + 多模型/多供应商,聊天里直接切。
展开完整文档(README 剩余 1 节)
DSHIDE DSHIDE 是构建在 Visual Studio Code 与 dsh(DeepSeek 开源 Agent 框架)之上的 AI 原生 IDE。编辑器层是 VS Code,全部原生功能完整保留(编辑、调试、Git、终端、扩展生态);AI 层是 dsh,以进程内内核的形式直接跑在 IDE 里。 与其它 AI IDE 的不同 - dsh 即 IDE 内核。 无伴生进程、无 localhost 服务。dsh 的整套 Agent 树(agent preset、沙箱、审批栈、存储、插件系统)在扩展宿主内以 fleetide profile 启动(位于 ~/.dsh),与 dsh CLI 完全同款协议栈,零翻译层。 - 原生 Chat,无自绘面板。 聊天界面就是 VS Code 原生 Chat 面板,dsh 是默认参与者;审批与提问走原生弹窗(fail-closed,关窗即拒绝)。 - 四模式 + 思考长度 + 多模型/多供应商,聊天里直接切。 /mode 切换 standard / code(PTC)/ minimal / cordis 四种 agent preset;/think 切换思考长度(off / low / high / max);/model 切换模型供应方与型号(如 deepseek-v4-flash / deepseek-v4-pro);/provider 新增供应方(36 家内置路由一键启用,或自定义 OpenAI 兼容网关)。 - 插件管理在 IDE 内。 dsh 插件面板为 fleetide profile 安装/移除插件,转发到 dsh CLI 执行。 - Copilot 已彻底移除。 唯一的 AI 入口是 dsh,唯一的认证是 DeepSeek API Key(/auth),由 dsh 统一存放在 ~/.dsh/.credentials.yaml——IDE 自身从不落盘密钥。 - 与浏览器端 dsh 共享同一 home。 本机若同时使用 dsh 的 web UI(3080 端口),两者共享 ~/.dsh 与 API Key;IDE 会话独立存放于 ~/.dsh/sessions-fleetide,互不干扰。 快速上手(Windows) 1. 前置:Node.js ≥ 22.19(推荐 24 LTS)+ dsh CLI: npm i -g @deepseek-ai/dsh 2. 用安装包安装 DSHIDE(user / system 安装器),或直接运行解压版构建目录里的 DSH Code.exe。 3. 在 Chat 面板输入 /auth,粘贴 DeepSeek API Key(写入 ~/.dsh/.credentials.yaml)。 4. 直接在 Chat 里提问即可,无需 @ 前缀。 | 命令 | 作用 | | /auth | 配置 / 更换 DeepSeek API Key | | /mode | 选择 agent preset:标准(standard)/ PTC(code)/ 极简(minimal)/ 创造(cordis),下一次新会话起生效、会话开始后锁定 | | /think | 切换思考长度:off / low / high / max,当前会话立即生效 | | /model | 切换模型供应方/型号(如 deepseek-v4-flash / deepseek-v4-pro),当前会话立即生效并成为全局默认 | | /provider | 新增模型供应方:启用内置路由(Anthropic / OpenAI / OpenRouter…)或自定义 OpenAI 兼容网关 | 自动补全:输入 / 即弹出五条命令的补全列表;在 /mode 、/think 或 /model 后(命令后跟一个空格)会自动弹出参数列表,继续输入可过滤(支持输入中文名过滤,如输入「标」即可匹配「标准模式」),回车即补全。/model 的参数来自 dsh 实时模型目录。无需记忆完整拼写。 完整手册与故障排查见 docs/MANUAL.zh.md。 从源码构建 DSHIDE 是 VS Code 的 fork,自带内置扩展 extensions/fleetide-dsh。 rem 一次性环境(独立 Node 24 + 国内镜像 + signtool PATH) tools\build-env.cmd rem 全量 win32-x64 构建(输出:VSCode-win32-x64\) tools\build-ide.cmd rem 安装器链 npm run gulp vscode-win32-x64-inno-updater vscode-win32-x64-user-setup vscode-win32-x64-system-setup 注意: - Electron 二进制经 ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ 下载(已内置在 build-env.cmd)。 - 扩展用 esbuild 打包:cd extensions\fleetide-dsh && node --experimental-transform-types esbuild.mts。 - 对上游源码的改动记录在 patches/ 目录,便于未来 rebase。 架构 DSHIDE(桌面应用) ├─ 工作台(编辑器 / 调试 / 终端) ← VS Code,原封不动 ├─ 扩展宿主 │ └─ fleetide-dsh(内置扩展) │ ├─ Chat participant:/auth /mode /think /model /provider、流式回合 │ ├─ dsh 内核:进程内 boot,fleetide profile(sessions-fleetide) │ │ └─ agent preset · 沙箱 · 审批栈 · 插件 · 存储 │ ├─ 语言模型桥(VS Code LM API ⇄ dsh 模型路由) │ └─ 插件管理面板 └─ ~/.dsh(与本机 dsh CLI / web UI 共享) 与 dsh 的关系 DSHIDE 不属于 dsh 仓库,它是 dsh 的消费方。dsh 代码在运行时从 $DSH_HOME/profiles/node_modules 加载(由 dsh CLI 物化),因此本仓库不含任何第三方 Agent 代码,dsh 升级与 IDE 发版互不耦合。 许可与署名 - 本仓库 fork 自 microsoft/vscode,遵循 MIT 协议。产品品牌(名称、图标、安装器、遥测标识)已全部更换;本项目与 Microsoft 无隶属关系,亦未经其背书。 - GitHub Copilot 已从本 fork 移除,DSHIDE 中没有任何 Copilot / GitHub 认证代码在运行。 - dsh 及其各包版权归其所有者,不随本仓库分发。 - fleetide-dsh 扩展与全部 fork 改动与基座同为 MIT 协议。 常见问题 - 需要先跑一个 dsh 服务吗? 不需要。内核进程内启动;本机的 dsh CLI / web UI(3080)可并行运行,互不影响。 - Key 存在哪里? ~/.dsh/.credentials.yaml,由 dsh 管理。DSHIDE 自身不写、不持久化密钥。 - 改名后快捷方式失效? 主程序由 FleetIDE.exe 更名为 DSH Code.exe,请重建快捷方式或重新安装。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
642463401/DSHIDE
在 VS Code 里直接调用 dsh 智能体写代码
相关插件 · 开发 / 工程
隐私简历生成器reactive-resume/reactive-resume
Reactive Resume 已迁至 GitHub 上的…
★ 45,288已汉化MCP
71.7
长时任务执行闭环AMAP-ML/LongHorizon-Harness
面向 Computer-Use Agent 的 Loop Engineering
★ 1,764已汉化DSH
70.5
多代理编排运行时Enderfga/claw-orchestrator
面向编程智能体的运行时。把 Claude Code、Codex、Antigravity、Grok…
★ 586已汉化MCP
69.4
记忆进化插件csyangwen/dsh-memory-evolve
dsh-memory-evolve 使用场景指南
★ 461已汉化DSH
67.9
原生编程智能体paean-ai/deeptide
由 DeepSeek 打造,为 DeepSeek 而生。
★ 1,107已汉化DSH
67.7
多引擎接力台emo-xiaoyu/harness-mix
macOS/Linux 已加入源码构建与启动适配;目标系统的完整桌面验收仍需在对应机器执行。安装方式、Linux…
★ 419已汉化DSH
66.8
这是你的仓库?认领条目