Bundle
dsh-ide-bridge
IDE ↔ Harness 双向桥: IDE 侧 POST /ide-bridge {text} → 浏览器输入框草稿追加; 聊天内 /open-in-rider 链接 → Rider 跳转到对应行(toast 提示); /ide-bridge/links-config 两级开关(AGENTS.md 指令块)。
- Source
- yLong765
- Updated
- Updated 2 days ago
Readme
# IDE Bridge(dsh-ide-bridge)— IDE ↔ Harness 双向桥
DSH (Harness) 插件,让 IDE 和 Harness 双向联通:
- **IDE → Harness**:在 IDE 里触发动作,把文件引用(`@路径#L行号`)**追加**到 GUI 当前会话
的输入框草稿。只填不发送——回车权在你。
- **Harness → IDE**:模型回复中的文件引用渲染为**可点击链接**,点击后由配置的 IDE 打开
文件并跳到对应行;页面右上角 toast 提示,不开新标签页。
> 下文用 `<插件目录>` 指代本仓库的绝对路径,用 `<用户名>` 指代你的 Windows 账户名。
> 例如 `<插件目录>` 可能是 `D:/tools/RiderSendToHarness`——请按自己的环境替换。
## 组成
| 部分 | 位置 | 职责 |
|---|---|---|
| DSH 插件 `dsh-ide-bridge`(双面) | `<插件目录>/`(仓库根目录即插件包) | host 面:`/ide-bridge`(投递)、`/open-in-rider`(跳转)、`/ide-bridge/links-config`(开关);client 面:草稿追加、链接点击拦截 + toast、设置页 |
| Rider 原生插件 HarnessBridge | `rider-plugin/` | 编辑器右键 **Send to Harness**(`Ctrl+Alt+H`)→ 调 ps1;Settings → Tools → IDE Bridge 配脚本路径 |
| IDE 侧脚本 | `Send-ToHarness.ps1` / `.bat` / `send-to-harness.sh` | 文件名+行范围计算 → `POST /ide-bridge`(ps1 全功能;bat 精简;sh 跨平台) |
## 安装(DSH 插件)
从 GitHub 安装(仓库根目录即插件包,`package.json` 声明了 `dsh.bundle` / `dsh.client`):
```powershell
dsh plugin --profile web add github:yLong765/dsh-ide-bridge
```
pnpm 拉取 GitHub 快照并自动登记 bundles 层。**改动后需重启 `dsh web` + 刷新浏览器页面。**
- **更新**:改完代码先 `git push`,再重新执行上面的安装命令(拉取最新 commit 的快照),重启 `dsh web` + 刷新页面。
- **本地开发**(改码免重装,link 依赖;改完直接重启 `dsh web` + 刷新页面即可):
```powershell
dsh plugin --profile web add <插件目录>
```
## IDE → Harness
### Rider(原生插件)
右键菜单首项 **Send to Harness** / `Ctrl+Alt+H`。脚本路径在
**Settings → Tools → IDE Bridge** 配置(默认 `<插件目录>/Send-ToHarness.ps1`)。
源码 `rider-plugin/`,改码后 `powershell -File rider-plugin\build.ps1` + 重启 Rider。
### Visual Studio(工具 → 外部工具)
命令 `powershell.exe`,参数:
```
-NoProfile -ExecutionPolicy Bypass -File "<插件目录>/Send-ToHarness.ps1" -FilePath "$(ItemPath)" -LineNumber "$(CurLine)" -ProjectDir "$(ProjectDir)" -Selection "$(CurText)"
```
### VS Code(任务 + 快捷键)
`.vscode/tasks.json` 里 `command: powershell.exe`,args 用 `${file}` / `${lineNumber}` /
`${workspaceFolder}` / `${selectedText}`;keybindings 绑 `workbench.action.tasks.runTask` →
`Send to Harness`(建议 `Ctrl+Alt+H`)。
### 其他平台
`Send-ToHarness.bat`(cmd + 内置 curl,不做选区范围);`send-to-harness.sh`
(macOS/Linux,首尾行锚点定位)。任何能以 文件路径+行号 调命令行的工具都能接。
## Harness → IDE(可点击链接)
模型在回复中输出 `[Foo/Bar.cs:42](http://127.0.0.1:3080/open-in-rider?file=<绝对路径>&line=42)`,
点击后:捕获阶段拦截 → fetch(JSON 模式)→ host 按配置拉起 IDE
→ 右上角 toast(成功 ~2.6s,失败 ~5s 红边框)。修饰键/右键新标签不拦截(HTML 提示页兜底)。
### IDE 命令配置(设置页 "IDE 打开命令")
Settings → dsh-ide-bridge 页可配置多个 IDE,每张卡片三行:
| 字段 | 说明 |
|---|---|
| 名称 | 显示名;选中左侧单选 = 默认 IDE。id 由名称自动生成(`VS Code` → `vscode`),链接可用 `?ide=<id>` 指定 |
| 命令 | 可执行文件完整路径,**必填**——不做自动探测 |
| 参数 | **必填**;支持 `{file}` `{line}` `{project}` 占位符。**仅首次打开**设置页时 Rider / VS Code / Visual Studio 三行会预填参数与占位命令;保存后以你的配置为准(未改动的占位符行不会保存) |
设置保存到 `~/.dsh/ide-bridge-ides.json`,**立即生效**(无需重启)。
#### Rider
```
名称: Rider
命令: <Rider安装目录>/bin/rider64.exe
参数: {project} --line {line} {file} (设置页已预填此行)
```
- **找路径**:右键桌面/开始菜单的 Rider 快捷方式 → 属性 → "目标",去掉末尾的启动参数,
指向的 `rider64.exe` 就是。典型位置:`C:/Program Files/JetBrains Rider <版本>/bin/rider64.exe`
或任意盘的自定义安装目录。
- 参数中的 `{project}` 会从文件向上找 `.idea`/`.sln` 定位项目根(`--line` 前必须有项目目录,
这是 rider64 的要求);找不到项目时自动退化为不带行号直接打开。
#### VS Code
```
名称: VS Code
命令: C:/Users/<用户名>/AppData/Local/Programs/Microsoft VS Code/bin/code.cmd
参数: -g {file}:{line} (设置页已预填此行)
```
- **找路径**:默认安装即上面位置;也可在 VS Code 里 `Ctrl+Shift+P` → "Shell Command:
Install 'code' command in PATH" 后,于任意终端 `where code` 查看。
- `-g` 打开文件并跳到行;`.code-workspace` 跨文件夹工作区同样适用。
#### Visual Studio
```
名称: Visual Studio
命令: C:/Program Files/Microsoft Visual Studio/<年份>/<版本>/Common7/IDE/devenv.exe
参数: {file} (设置页已预填此行)
```
- **找路径**:`<年份>` 是 2019/2022 等,`<版本>` 是 Community/Professional/Enterprise,
只填你实际装的那个。开始菜单 VS 图标 → 右键 → 打开文件位置,进 `Common7\IDE` 即见
`devenv.exe`。
- VS 的 devenv 命令行**不支持行号**,点击链接只打开文件后需手动跳行(CLI 层面无解)。
#### 其他编辑器
任何"命令行打开文件"的编辑器都能配——Sublime(`{file}:{line}`)、
Vim/Neovim(`+{line} {file}`)等,按各自 CLI 语法填参数模板即可。
### 开关(DSH 设置界面)
Settings 面板 → 导航 **dsh-ide-bridge** 页"可点击文件链接"节:
- **全局开关**:开 / 关 两态。关(默认)= 删全局块;开 = 写全局块(`~/.dsh/AGENTS.md`)。
- **单独启用的工作区**:白名单列表,只显示显式启用的(各自 `<工作区>/AGENTS.md`)。
“+ 添加工作区”从 DSH 已注册工作区中挑选(已启用的不重复出现),“移除”删块。
**未列出的工作区跟随全局开关**——几十个工作区也不臃肿。
- 语义:开 = 写启用指令块(v2 标记,端口固定 3080);关/移除 = 删除块。
历史遗留的 v1(SendToHarness 时代)块不再被识别——若升级前开过,重开一次开关即可写入 v2 块。
脚本化走同一通道:
```
GET /ide-bridge/links-config # 全局状态
GET /ide-bridge/links-config?enabled=1 # 全局状态 + 已启用工作区白名单
GET /ide-bridge/links-config?path=<工作区> # 附带单个工作区状态
POST /ide-bridge/links-config {"scope":"global"|"workspace","path":"...","state":"on"|"off"|"clear"}
```
修改对**新会话**立即生效;旧会话在下次文件触碰时刷新。
## 行为细节
- 选区定位优先级(ps1):精确匹配 → 空白不敏感匹配(应对换行拍平/引号拆散)→ 光标行兜底。
- 草稿追加而非覆盖:引用新起一行拼在末尾;已有文字与引用 chip(U+FFFC)原样保留。
- 投递请求 30 秒未被浏览器取走会被丢弃(页面刷新不回放)。
- 脚本可选参数:`-Url http://127.0.0.1:3080`(覆盖地址);`-Debug` / `--debug`(诊断入参与定位方式)。
- IDE 拉起统一经 PowerShell `Start-Process`(完全分离,不会拖挂 dsh web 服务)。
- 未配置/未填命令时点击链接会 toast 明确提示,不会瞎猜。
- 聊天渲染器只放行 http/https/mailto,故走本路由(jetbrains:// 深度链接实测不可用)。
## 卸载 / 更新
```powershell
dsh plugin --profile web remove dsh-ide-bridge # 卸载 DSH 插件
```
更新:改完代码先 `git push`,再重新执行安装命令(GitHub 快照重新拉取),重启 `dsh web` + 刷新页面。
开发期用本地路径安装(`dsh plugin --profile web add <插件目录>`,link 依赖)则改码无需重装。
## 沿革
- `rider-send` → `dsh-send-to-harness` → **`dsh-ide-bridge`**(双向桥后更名)。
- AGENTS.md 指令块当前使用 v2 标记;v1 时代(SendToHarness 命名)的块需重开一次开关迁移。
Install
dsh plugin --profile web add github:yLong765/dsh-ide-bridge
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-ide-bridge from the hub
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.