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

JetBrains 工作区桥 abadiegie/dsh-jetbrains

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

在 IDE 内聊天,并把项目与光标上下文交给模型

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

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

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

状态速览

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

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

验证判据与等级说明 →

可信度证据

⚠︎ 实装验证未通过(unknown · 2026/11/3) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

读写/删除本地文件发起外部网络请求
查看扫描证据(共 54 处,展示前 38 条)
  • 读取本地文件
    jetbrains-session-link/dev/check.mjs:65
    const manifest = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8'))
  • 发起网络请求
    jetbrains-workspace/client.js:69
    const response = await fetch(OPEN_PATH, {
  • 读取本地文件
    jetbrains-workspace/dev/check-client.mjs:27
    const manifest = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8'))
  • 写入本地文件
    jetbrains-workspace/dev/check-synthetic.mjs:147
    writeFileSync(path, JSON.stringify(document))
  • 写入本地文件
    jetbrains-workspace/dev/check-synthetic.mjs:161
    for (const name of ['alpha', 'beta', 'external']) mkdirSync(join(fixture, name), { recursive: true })
  • 写入本地文件
    jetbrains-workspace/dev/check-synthetic.mjs:162
    mkdirSync(join(configRoot, 'options'), { recursive: true })
  • 写入本地文件
    jetbrains-workspace/dev/check-synthetic.mjs:163
    mkdirSync(join(project, '.idea'), { recursive: true })
  • 写入本地文件
    jetbrains-workspace/dev/check-synthetic.mjs:167
    writeFileSync(join(project, '.idea', 'modules.xml'), `<?xml version="1.0" encoding="UTF-8"?>
  • 写入本地文件
    jetbrains-workspace/dev/check-synthetic.mjs:172
    writeFileSync(join(project, '.idea', 'window.iml'), `<?xml version="1.0" encoding="UTF-8"?>
  • 读取本地文件
    jetbrains-workspace/dev/check-synthetic.mjs:286
    const published = () => JSON.parse(readFileSync(changesPath, 'utf8'))
  • 读取本地文件
    jetbrains-workspace/dev/check-synthetic.mjs:363
    if (existsSync(`${changesPath}.tmp`)) throw new Error('the write must leave no temporary file behind')
  • 发起网络请求
    jetbrains-workspace/dev/check-synthetic.mjs:541
    const callRoute = async (body) => route.fetch(new Request(`http://127.0.0.1:3080${OPEN_ROUTE_PATH}`, {
  • 发起网络请求
    jetbrains-workspace/dev/check-synthetic.mjs:574
    const declined = await declining.fetch(new Request(`http://127.0.0.1:3080${OPEN_ROUTE_PATH}`, {
  • 读取本地文件
    jetbrains-workspace/dev/check-synthetic.mjs:603
    if (JSON.parse(readFileSync(noticePath, 'utf8')).lastEvent?.outcome !== 'published') {
  • 写入本地文件
    jetbrains-workspace/dev/check.mjs:110
    writeFileSync(path, JSON.stringify(document))
  • 写入本地文件
    jetbrains-workspace/dev/check.mjs:284
    mkdirSync(join(fixtureConfig, 'options'), { recursive: true })
  • 写入本地文件
    jetbrains-workspace/dev/check.mjs:285
    mkdirSync(join(fixtureProject, '.idea'), { recursive: true })
  • 写入本地文件
    jetbrains-workspace/dev/check.mjs:286
    for (const name of ['alpha', 'beta']) mkdirSync(join(fixture, name), { recursive: true })
  • 写入本地文件
    jetbrains-workspace/dev/check.mjs:287
    writeFileSync(join(fixtureProject, '.idea', 'modules.xml'), `<?xml version="1.0" encoding="UTF-8"?>
  • 写入本地文件
    jetbrains-workspace/dev/check.mjs:292
    writeFileSync(join(fixtureProject, '.idea', 'window.iml'), `<?xml version="1.0" encoding="UTF-8"?>
  • 读取本地文件
    jetbrains-workspace/src/bridge.js:66
    parsed = JSON.parse(readFileSync(path, 'utf8'))
  • 读取本地文件
    jetbrains-workspace/src/bridge.js:101
    names = readdirSync(descriptorDirectory(options))
  • 读取本地文件
    jetbrains-workspace/src/bridge.js:211
    exists: existsSync(path),
  • 读取本地文件
    jetbrains-workspace/src/bridge.js:212
    git: existsSync(join(path, '.git')),
  • 读取本地文件
    jetbrains-workspace/src/bridge.js:213
    idea: existsSync(join(path, '.idea')),
  • 读取本地文件
    jetbrains-workspace/src/bridge.js:267
    exists: existsSync(path),
  • 发起网络请求
    jetbrains-workspace/src/bridge.js:297
    const response = await fetch(`http://127.0.0.1:${bridge.port}/open`, {
  • 发起网络请求
    jetbrains-workspace/src/bridge.js:323
    const response = await fetch(`http://127.0.0.1:${bridge.port}/changed`, {
  • 写入本地文件
    jetbrains-workspace/src/changes.js:112
    mkdirSync(dirname(path), { recursive: true })
  • 写入本地文件
    jetbrains-workspace/src/changes.js:114
    writeFileSync(temporary, `${JSON.stringify(document, null, 2)}\n`)
  • 写入本地文件
    jetbrains-workspace/src/changes.js:115
    renameSync(temporary, path)
  • 读取本地文件
    jetbrains-workspace/src/discovery.js:58
    return [...new Set(roots)].filter(root => existsSync(root))
  • 发起网络请求
    jetbrains-workspace/src/discovery.js:128
    const response = await fetch(`http://127.0.0.1:${port}/api/about`, {
  • 读取本地文件
    jetbrains-workspace/src/discovery.js:151
    entries = readdirSync(configRoot, { withFileTypes: true })
  • 读取本地文件
    jetbrains-workspace/src/discovery.js:160
    if (existsSync(join(dir, 'options', 'recentProjects.xml'))) dirs.push(dir)
  • 读取本地文件
    jetbrains-workspace/src/discovery.js:192
    const existing = projects.filter(project => existsSync(project.path))
  • 读取本地文件
    jetbrains-workspace/src/discovery.js:212
    if (!existsSync(projectPath)) {
  • 读取本地文件
    jetbrains-workspace/src/discovery.js:222
    if (path === projectPath || roots.has(path) || !existsSync(path)) return
扫描于 2026/11/4(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • IDE内直接聊天
  • 传递项目上下文
  • 传递光标位置

非官方 DeepSeek Harness ⇄ JetBrains 集成:在 IDE 里直接聊 DSH,同时把 IDE 工作区——项目、已挂载模块、当前文件和光标位置——摆到模型面前。

README

由 DeepSeek 最新模型翻译生成
DSH ⇄ JetBrains 几个小包,把本地 DeepSeek Harness(DSH)接到 JetBrains IDE,让 IDE 和智能体共用同一个工作区,而不是各守一座孤岛。 每个包都能单独用:IDE 插件和 DSH bundle 是同一套工作流的两半,session-link 插件只负责让页面能按地址请求某个会话。DSH bundle 同时带 Host 半边和 web 客户端半边,装上它,工具、上下文行、点击跳转就都齐了。 | 包 | 平台 | 做什么 | | jetbrains-companion/ | IntelliJ Platform 插件(Java,不用 Gradle) | DSH Chat 工具窗口,内嵌 DSH 自己的 web 客户端,每个 IDE 窗口对应一个 DSH 会话,实时发布工作区,还有一条回环桥,让 DSH 能把文件推到你眼前;另有 DSH Changes 工具窗口,把已发布的某一轮以 IntelliJ 原生并排 diff 展示。 | | jetbrains-workspace/ | DSH 配置档 bundle(Host 半边 + web 客户端半边,纯 JavaScript) | 读取 IDE 的工作区——包括模块在 .iml 里的多个内容根——以工具、运行时上下文行和已注册工作区的形式送进 DSH。
展开完整文档(README 剩余 1 节)
DSH ⇄ JetBrains

几个小包,把本地 DeepSeek Harness(DSH)接到 JetBrains IDE,让 IDE 和智能体共用同一个工作区,而不是各守一座孤岛。

每个包都能单独用:IDE 插件和 DSH bundle 是同一套工作流的两半,session-link 插件只负责让页面能按地址请求某个会话。DSH bundle 同时带 Host 半边和 web 客户端半边,装上它,工具、上下文行、点击跳转就都齐了。

| 包 | 平台 | 做什么 |
| jetbrains-companion/ | IntelliJ Platform 插件(Java,不用 Gradle) | DSH Chat 工具窗口,内嵌 DSH 自己的 web 客户端,每个 IDE 窗口对应一个 DSH 会话,实时发布工作区,还有一条回环桥,让 DSH 能把文件推到你眼前;另有 DSH Changes 工具窗口,把已发布的某一轮以 IntelliJ 原生并排 diff 展示。 |
| jetbrains-workspace/ | DSH 配置档 bundle(Host 半边 + web 客户端半边,纯 JavaScript) | 读取 IDE 的工作区——包括模块在 .iml 里的多个内容根——以工具、运行时上下文行和已注册工作区的形式送进 DSH。companion 开着能用,IDE 关掉后也能从它自己的状态文件读。把打开和点击的文件发给 IDE:Host 半边替换 DSH 默认的桌面打开器,客户端半边重定向 Sidebar 文件查看器。 |
| jetbrains-session-link/ | DSH 客户端插件(纯 JavaScript) | 让 #dsh-session=<id>——或已打开页面上的 hash 变化——不用刷新就选中对应会话。可选:没有它时,聊天面板回退到客户端存下的选择。 |

非官方。 两个包都不是 JetBrains 或 DeepSeek 出品,也未获其背书或与之关联。
IntelliJ、IDEA 和 JetBrains 是 JetBrains s.r.o. 的商标。

你能得到什么

- 在 IDE 里聊天。 DSH Chat 工具窗口渲染 DSH 的 web 客户端,用 DSH 发给浏览器的同一个浏览器会话 cookie 认证,并为你所在的窗口打开对应会话。
- 同一个工作区,两边都看得见。 窗口的根项目和每个挂载的模块/VCS 目录,都会以运行时上下文行和 jetbrains_workspace 工具结果的形式到达模型,每个目录都标注了报告它的来源。
- 来回互通。 DSH 能读当前文件、光标和选区,也能在 IDE 里打开文件并跳到某一行——companion 的桥开着时可以,IDE 关着时靠 IDE 状态文件也可以。

- 把某一轮当 diff 审。 DSH Changes 列出 dsh-jetbrains-workspace 发布的每一轮,任何有改动的文件都能以 IntelliJ 原生并排 diff 打开。某一轮的 diff 也会自己弹出,带 Keep / Revert 通知;聊天面板工具栏有 Changes 开关;回退可以按文件也可以按 hunk——如果文件在这一轮之后又改过,就拒绝回退,而不是退一半。
- IDE 关闭期间,什么都不会丢。 评审文档的生命周期比 IDE 更长:下次启动时,companion 会提到它错过的那些轮次,一键即可跳到面板。

两半各自给你什么

每一半单独用都有价值,安装时也互不依赖。你得到的东西会不一样:

| 能力 | 仅 IDE 插件 | 仅 DSH bundle | 两者都有 |
| IDE 里的 DSH Chat 工具窗口(内嵌 DSH 客户端,cookie 认证) | 是 | — | 是 |
| 每个 IDE 窗口一个 DSH 会话,在 DSH 侧边栏里分组 | 是 —— 面板自己注册工作区,并创建或挂接会话 | — | 是 |
| 模型知道哪个 IDE 窗口是打开的(运行时上下文行) | — | 是,来自 IDE 的状态文件;companion 运行时则实时获取 | 是 |
| jetbrains_workspace 工具:根项目、模块内容根、活动文件、光标、选区 | — | 是 | 是 |
| jetbrains_open_in_ide:模型在 IDE 里打开文件 | — | 否 —— 它需要 companion 的桥接 | 是 |
| 不刷新页面就能选中会话 | 否 —— 它只写入客户端存储的选中项,然后刷新一次 | — | 是,配合 jetbrains-session-link |
| 对某一轮做变更评审(哪些文件,以及各自的 diff) | — | 是 —— 发布 <DSH home>/jetbrains-changes.json,带上 DSH 自己的 /api/changes. 路由所需的坐标 | 是 |
| 呈现的产物在 IDE 里打开(present → 编辑器标签页) | — | 可选开启 —— autoOpenDeliverables: true,且只对该窗口自己的会话生效 | 是(需要 companion 桥接) |
| 某一轮的变更以 IntelliJ 原生并排 diff 展示 | 是 —— DSH Changes 工具窗口 | 是 —— 发布它读取的那份文档 | 是 |
| 某一轮的 diff 自动打开,带 Keep / Revert | 是 —— companion 桥接上的 POST /changed | 是 —— 发出通知(autoOpenDiffs) | 是 |
| 还原一个文件,或还原它的某一个 hunk | 是 —— 面板和通知操作 | — | 是 |
| IDE 关闭期间发布的轮次 | 是 —— 下次启动时提及 | 是 —— 文档的生命周期比 IDE 更长 | 是 |
| 点击产物或变更文件,在 IDE 里打开 | — | 包装默认开启(openInIde),但 IDE 本身需要 companion 的桥接 —— 没有桥接时,桌面打开器仍会运行 | 是 |
| 在 DSH UI 里点击文件,在 IDE 里打开,而不是 DSH 侧边栏查看器 | — | 是,默认开启(openSidebarFilesInIde)—— 否则回退到侧边栏 | 是(需要 companion 桥接) |

所以:装 IDE 插件,就能在 IDE 里和 DSH 聊天(它需要本地运行一个 DSH,并读取 DSH 的凭据文档来签发浏览器 cookie —— 见 SECURITY.md)。装 DSH bundle,就能把你的 IDE 工作区摆到模型面前。两个都装,才能走完整个来回:模型能说出你正在编辑哪个文件,也能替你打开另一个文件。

两半通过 DSH 自己的 HTTP API 和 companion 的描述符通信(<DSH home>/jetbrains-companion.json,带 version 和 source 标记),这样两半都能各自更新:bundle 找不到活跃的 descriptor 时,会回退到 IDE 的状态文件;而 companion 从不要求安装 bundle。

安装

git clone https://github.com/abadiegie/dsh-jetbrains.git

1. IDE 插件(需要 IntelliJ Platform build 243 或更新版本,且带 JCEF):

cd jetbrains-companion
./build.sh # compiles against the installed IDE and copies the jar into it
IDE_HOME=/path/to/idea ./build.sh

然后重启 IDE。设置位于 Settings ▸ Tools ▸ DSH Companion。第 1 步不需要 DSH 侧的插件;只装它就能得到聊天面板(见上表)。

2. DSH bundle(需要一个 DSH 配置档):

from a DSH session: install the bundle directory into the current profile
plugin_manager install_bundle /absolute/path/to/jetbrains-workspace

然后重启 DSH。jetbrains_workspace 和 jetbrains_open_in_ide 就对智能体可用了;第 2 步不需要 IDE 插件,因为当没有 companion 发布 descriptor 时,bundle 会读取 IDE 的状态文件。想要完成往返——模型说出你当前的文件并打开另一个——就把两者都装上。

文档

- jetbrains-companion/README.md —— 聊天面板、会话范围、发现机制、设置、验证工具、限制。
- jetbrains-workspace/README.md —— 它注册了什么、数据从哪来、配置、限制。
- jetbrains-session-link/README.md —— fragment 契约、宿主读取的标记,以及在浏览器和 IDE 面板内验证过的内容。
- SECURITY.md —— 这些插件会读取什么,以及它们能在你机器上做什么。安装前请先读这个。
- .dsh/skills/dsh-jetbrains/SKILL.md —— 给编辑本仓库的智能体用的 DeepSeek Harness 技能:构建和检查命令,以及值得先知道的坑。DSH 会扫描最近仓库根目录下的 <project>/.dsh/skills(以及 <project>/.agents/skills),所以克隆下来就带着它,对在该克隆里工作的智能体即时可用。
- docs/PUBLISHING.md —— 本仓库对照准备的检查清单。
- CHANGELOG.md。

要求

- JetBrains IDE,build 243+(IC-243 或更新),带内置浏览器(JCEF)。
- 构建 IDE 插件需要 JDK 21 工具链——IDE 自带的 JBR 就够。
- DSH bundle 及其开发检查需要 Node.js 20+。
- DSH 的版本需暴露 workspace/create(返回 sessionIds 和 created)、workspace/rename、session/create(接受 cwd 或 workspaceId + sessionId),以及 workspace/archiveSession——两半都是针对这套 API 面写的。

开发

DSH bundle,本地验收:用工具对照本机的 IDE 状态(需要检出代码)
cd jetbrains-workspace && node dev/check.mjs

DSH bundle,封闭环境:schema、发现、角色、工作区注册、运行时上下文、审查、打开
cd jetbrains-workspace && node dev/check-synthetic.mjs

DSH bundle,客户端那一半:点击文件会请求 Host 路由,其余部分保留侧边栏
cd jetbrains-workspace && node dev/check-client.mjs

IDE 插件:不依赖 IntelliJ 的那一半、DSH 客户端、面板的鉴权路径、地址与作用域规则
cd jetbrains-companion && ./build.sh
/usr/share/idea/jbr/bin/javac -cp build/stage -d build/check dev/.java
/usr/share/idea/jbr/bin/java -cp build/stage:build/check Check

每个测试脚本在缺少 DSH home、服务器或所需 IDE 时,都会打印一条消息并跳过自身,所以依赖缺失绝不会被误判为失败。

许可证

MIT —— 见 LICENSE。
预览分享卡片长什么样 ↓abadiegie/dsh-jetbrains
分享 · DeepSeek Harness Hub
abadiegie/dsh-jetbrains

在 IDE 内聊天,并把项目与光标上下文交给模型

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