pi-x-ide 1.4.0 → 1.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +183 -114
- package/README.zh.md +183 -114
- package/dist/package.json +10 -4
- package/dist/src/nvim/sidecar-schema.d.ts +25 -0
- package/dist/src/nvim/sidecar-schema.js +64 -0
- package/dist/src/nvim/sidecar-schema.js.map +1 -0
- package/dist/src/nvim/sidecar.d.ts +16 -0
- package/dist/src/nvim/sidecar.js +173 -0
- package/dist/src/nvim/sidecar.js.map +1 -0
- package/dist/src/pi/index.js +10 -2
- package/dist/src/pi/index.js.map +1 -1
- package/dist/src/pi/install.js +22 -1
- package/dist/src/pi/install.js.map +1 -1
- package/dist/src/shared/ide-server.d.ts +20 -0
- package/dist/src/shared/ide-server.js +144 -0
- package/dist/src/shared/ide-server.js.map +1 -0
- package/dist/src/shared/lock-file.d.ts +16 -0
- package/dist/src/shared/lock-file.js +58 -0
- package/dist/src/shared/lock-file.js.map +1 -0
- package/dist/src/shared/paths.js +8 -1
- package/dist/src/shared/paths.js.map +1 -1
- package/dist/src/shared/protocol.d.ts +1 -1
- package/dist/src/shared/schema.js +1 -1
- package/dist/src/shared/schema.js.map +1 -1
- package/dist/test/nvim-sidecar.test.d.ts +1 -0
- package/dist/test/nvim-sidecar.test.js +148 -0
- package/dist/test/nvim-sidecar.test.js.map +1 -0
- package/dist/test/shared.test.js +10 -0
- package/dist/test/shared.test.js.map +1 -1
- package/nvim/bin/pi-x-ide-nvim-sidecar.cjs +21 -0
- package/nvim/doc/pi-x-ide.txt +112 -0
- package/nvim/lua/pi_x_ide/init.lua +442 -0
- package/nvim/plugin/pi-x-ide.lua +15 -0
- package/package.json +10 -4
- package/src/nvim/sidecar-schema.ts +71 -0
- package/src/nvim/sidecar.ts +219 -0
- package/src/pi/index.ts +12 -2
- package/src/pi/install.ts +24 -1
- package/src/shared/ide-server.ts +120 -0
- package/src/shared/lock-file.ts +65 -0
- package/src/shared/paths.ts +8 -1
- package/src/shared/protocol.ts +1 -1
- package/src/shared/schema.ts +1 -1
package/README.zh.md
CHANGED
|
@@ -1,132 +1,113 @@
|
|
|
1
1
|
# Pi × IDE
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> 用于 IDE 选择上下文集成的 Pi 扩展包。
|
|
4
4
|
|
|
5
|
-
自动将 VS Code
|
|
5
|
+
自动将 VS Code、Zed 和 Neovim 中当前打开或选中的文件与文本范围附加到 Pi TUI,并作为对话上下文提交给 LLM。
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
---
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
- Pi CLI(`@earendil-works/pi-coding-agent ≥ 0.79`)
|
|
9
|
+
## 安装与使用
|
|
10
|
+
|
|
11
|
+
### 1. 安装 Pi CLI
|
|
13
12
|
|
|
14
|
-
|
|
13
|
+
[Pi Quickstart](https://github.com/earendil-works/pi/blob/main/packages/coding-agent/docs/quickstart.md)
|
|
14
|
+
|
|
15
|
+
### 2. 安装 Pi 扩展包
|
|
15
16
|
|
|
16
17
|
```bash
|
|
17
|
-
|
|
18
|
-
pnpm build
|
|
18
|
+
pi install npm:pi-x-ide
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
将 `pi-x-ide` 安装为全局 Pi 扩展,Pi 启动时自动加载,无需额外参数。
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
| --------------------- | --------------------------------------------------------------------------- |
|
|
25
|
-
| `pnpm build` | 编译 Pi 侧 TypeScript → `dist/` + VS Code 侧 esbuild bundle → `vscode/out/` |
|
|
26
|
-
| `pnpm typecheck` | 类型检查(不产出文件) |
|
|
27
|
-
| `pnpm test` | 编译 + 运行单元测试 |
|
|
28
|
-
| `pnpm package:vscode` | 打包 VS Code 扩展为 VSIX |
|
|
29
|
-
| `pnpm vsix` | `pnpm package:vscode` 的别名 |
|
|
23
|
+
### 3. 安装 IDE 扩展
|
|
30
24
|
|
|
31
|
-
|
|
25
|
+
#### VS Code / Cursor / Windsurf
|
|
32
26
|
|
|
33
|
-
|
|
27
|
+
**方式一:从 Marketplace 安装(推荐)**
|
|
34
28
|
|
|
35
|
-
|
|
36
|
-
2. 进入 **Run and Debug** 面板(`Ctrl+Shift+D`)。
|
|
37
|
-
3. 选择 **Run Pi x IDE VS Code Extension**。
|
|
38
|
-
4. 按 **F5**:
|
|
39
|
-
- preLaunchTask 会自动执行 `pnpm build`。
|
|
40
|
-
- 打开一个标题包含 `[Extension Development Host]` 的新 VS Code 窗口。
|
|
29
|
+
在 IDE 的扩展商店中搜索并安装 `balaenis.pi-x-ide`。
|
|
41
30
|
|
|
42
|
-
|
|
31
|
+
**方式二:通过 Pi CLI 安装**
|
|
43
32
|
|
|
44
|
-
|
|
45
|
-
pnpm package:vscode
|
|
46
|
-
code --install-extension './vscode'-0.1.0.vsix
|
|
47
|
-
```
|
|
33
|
+
在 Pi TUI 中运行 `/ide install`,会自动检测 `code`、`cursor` 或 `windsurf` 并安装扩展。
|
|
48
34
|
|
|
49
|
-
|
|
35
|
+
**方式三:Pi 启动时自动安装**
|
|
50
36
|
|
|
51
|
-
|
|
37
|
+
当 Pi 从支持的 VS Code 集成终端中启动时,会尝试自动安装或更新扩展。如需关闭:
|
|
52
38
|
|
|
53
39
|
```bash
|
|
54
|
-
|
|
40
|
+
PI_X_IDE_AUTO_INSTALL=0
|
|
55
41
|
```
|
|
56
42
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
如果没有,在 VS Code 中执行 **Developer: Reload Window**。
|
|
43
|
+
更多配置项见 [配置参考](#pi-侧环境变量)。
|
|
60
44
|
|
|
61
|
-
|
|
45
|
+
#### Zed
|
|
62
46
|
|
|
63
|
-
在
|
|
47
|
+
无需安装任何扩展。Pi 在 Zed 终端中运行时(`ZED_TERM=true` 或 `TERM_PROGRAM=zed`)会自动检测并连接。Pi 通过读取 Zed 本地状态数据库获取活跃编辑器和选区信息。
|
|
64
48
|
|
|
65
|
-
|
|
66
|
-
pi -e ./src/pi/index.ts
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
Pi TUI 应显示:
|
|
49
|
+
需要 Node.js ≥ 26,Zed 在同一台机器上运行。
|
|
70
50
|
|
|
71
|
-
|
|
72
|
-
- 输入框下方 widget:IDE 名称、workspace、当前文件、选区范围、`pending/sent` 状态
|
|
51
|
+
#### Neovim
|
|
73
52
|
|
|
74
|
-
|
|
53
|
+
Neovim 支持由一个 Lua 插件和一个内置的 Node.js sidecar 组成。只要当前目录匹配 Neovim workspace,Pi 可以从任意终端启动,不要求在 Neovim 内部运行。
|
|
75
54
|
|
|
76
|
-
|
|
77
|
-
PI_X_IDE_AUTO_INSTALL=0
|
|
78
|
-
```
|
|
55
|
+
**lazy.nvim:**
|
|
79
56
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
```json
|
|
57
|
+
```lua
|
|
83
58
|
{
|
|
84
|
-
"
|
|
85
|
-
|
|
86
|
-
|
|
59
|
+
"balaenis/pi-x-ide",
|
|
60
|
+
init = function()
|
|
61
|
+
vim.opt.rtp:prepend(vim.fn.stdpath("data") .. "/lazy/pi-x-ide/nvim")
|
|
62
|
+
end,
|
|
63
|
+
config = function()
|
|
64
|
+
require("pi_x_ide").setup({
|
|
65
|
+
keymap = "<C-A-k>",
|
|
66
|
+
})
|
|
67
|
+
end,
|
|
87
68
|
}
|
|
88
69
|
```
|
|
89
70
|
|
|
90
|
-
|
|
71
|
+
> **注意:** `init` 块手动将 `nvim/` 子目录加入 runtime path,以规避部分版本 lazy.nvim 的 Lua 模块解析兼容性问题。
|
|
91
72
|
|
|
92
|
-
|
|
73
|
+
**原生 package:**
|
|
93
74
|
|
|
94
|
-
```
|
|
95
|
-
/ide
|
|
75
|
+
```vim
|
|
76
|
+
set runtimepath+=/path/to/pi-x-ide/nvim
|
|
77
|
+
lua require("pi_x_ide").setup({ keymap = "<leader>pa" })
|
|
96
78
|
```
|
|
97
79
|
|
|
98
|
-
|
|
80
|
+
完整配置选项、命令和故障排查见 [配置参考](#neovim-2)。
|
|
99
81
|
|
|
100
|
-
|
|
82
|
+
### 4. 连接 Pi 并验证
|
|
101
83
|
|
|
102
|
-
|
|
84
|
+
在 IDE workspace **同一项目目录** 启动 Pi:
|
|
103
85
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
```text
|
|
107
|
-
IDE: vscode ✓ src/foo.ts#L10,20 pending
|
|
86
|
+
```bash
|
|
87
|
+
pi
|
|
108
88
|
```
|
|
109
89
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
在 VS Code 中选中文本后按:
|
|
90
|
+
Pi 自动加载 `pi-x-ide` 并连接 IDE。TUI 底部应显示 `IDE: vscode ✓`,输入框下方 widget 显示 IDE 名称、workspace、当前文件和选区范围。
|
|
113
91
|
|
|
114
|
-
|
|
115
|
-
- macOS:`Cmd+Alt+K`
|
|
92
|
+
**验证是否正常:**
|
|
116
93
|
|
|
117
|
-
|
|
94
|
+
在 IDE 中打开文件并选中文本,widget 应实时更新:
|
|
118
95
|
|
|
119
96
|
```text
|
|
120
|
-
|
|
97
|
+
IDE: vscode ✓ src/foo.ts#L10,20 pending
|
|
121
98
|
```
|
|
122
99
|
|
|
123
|
-
|
|
100
|
+
按 `Ctrl+Alt+K`(Linux/Windows)或 `Cmd+Alt+K`(macOS),Pi 输入框应插入 `@src/foo.ts#L10,20`。
|
|
101
|
+
|
|
102
|
+
在 Pi 中输入对话提示并提交,选中文本会作为 LLM 上下文注入(不写入 session 历史)。提交后 widget 显示 `sent`。
|
|
124
103
|
|
|
125
|
-
|
|
104
|
+
**如果连接未出现:**
|
|
126
105
|
|
|
127
|
-
|
|
106
|
+
- 在 Pi 中运行 `/ide auto` 重新匹配
|
|
107
|
+
- 如果 IDE 在 Pi 之后启动,reload IDE 窗口后再次运行 `/ide auto`
|
|
108
|
+
- 运行 `/ide` 手动从列表中选择连接
|
|
128
109
|
|
|
129
|
-
|
|
110
|
+
### `/ide` 命令参考
|
|
130
111
|
|
|
131
112
|
| 命令 | 行为 |
|
|
132
113
|
| -------------- | ------------------------------------------------- |
|
|
@@ -138,63 +119,151 @@ Pi 输入框应插入:
|
|
|
138
119
|
| `/ide attach` | 手动把最新 selection range 插入输入框 |
|
|
139
120
|
| `/ide install` | 通过支持的 IDE CLI 安装或更新 `balaenis.pi-x-ide` |
|
|
140
121
|
|
|
141
|
-
|
|
122
|
+
### 配置参考
|
|
123
|
+
|
|
124
|
+
#### VS Code
|
|
125
|
+
|
|
126
|
+
| 键 | 类型 | 默认值 | 说明 |
|
|
127
|
+
| -------------------- | --------------------- | --------- | ---------------------------- |
|
|
128
|
+
| `piXIde.rangeFormat` | `"comma"` \| `"dash"` | `"comma"` | 手动快捷键生成的文件引用格式 |
|
|
129
|
+
|
|
130
|
+
#### Zed
|
|
131
|
+
|
|
132
|
+
| 环境变量 | 默认值 | 说明 |
|
|
133
|
+
| ----------------- | ------------ | -------------------------- |
|
|
134
|
+
| `PI_X_IDE_ZED_DB` | (自动检测) | 覆盖 Zed SQLite 数据库路径 |
|
|
135
|
+
|
|
136
|
+
默认数据库路径:
|
|
137
|
+
|
|
138
|
+
- **Linux:** `~/.local/share/zed/db/0-stable/db.sqlite`
|
|
139
|
+
- **macOS:** `~/Library/Application Support/Zed/db/0-stable/db.sqlite`
|
|
140
|
+
- **Windows:** `%LOCALAPPDATA%\Zed\db\0-stable\db.sqlite`
|
|
141
|
+
- **WSL + Windows 版 Zed:** `/mnt/c/Users/<user>/AppData/Local/Zed/db/0-stable/db.sqlite`
|
|
142
142
|
|
|
143
|
-
|
|
143
|
+
当 Pi 运行在 WSL 中而 Zed 是 Windows 应用时,pi-x-ide 会将 Windows 路径(`C:\Users\<user>\project`)规范化为 `/mnt/c/Users/<user>/project`,并将 WSL UNC 路径规范化为 `/home/<user>/project`。
|
|
144
|
+
|
|
145
|
+
#### Neovim
|
|
146
|
+
|
|
147
|
+
```lua
|
|
148
|
+
require("pi_x_ide").setup({
|
|
149
|
+
enabled = true,
|
|
150
|
+
keymap = "<C-A-k>",
|
|
151
|
+
range_format = "comma", -- 或 "dash"
|
|
152
|
+
debounce_ms = 150,
|
|
153
|
+
-- sidecar_cmd = { "node", "/absolute/path/to/pi-x-ide-nvim-sidecar.cjs" },
|
|
154
|
+
-- workspace_folders = { "/path/to/project" },
|
|
155
|
+
})
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
如果 sidecar 无法启动,请运行 `:PiXIdeStatus`,确认 Neovim 的 `PATH` 中可以找到 Node.js,或将 `sidecar_cmd` 设置为绝对 Node 命令。
|
|
159
|
+
|
|
160
|
+
**命令:**
|
|
161
|
+
|
|
162
|
+
| 命令 | 行为 |
|
|
163
|
+
| --------------- | ---------------------------------------------------- |
|
|
164
|
+
| `:PiXIdeStart` | 启动 Neovim sidecar 并写入 lock file |
|
|
165
|
+
| `:PiXIdeStop` | 停止 sidecar 并移除 lock file |
|
|
166
|
+
| `:PiXIdeStatus` | 显示 sidecar 是否正在运行 |
|
|
167
|
+
| `:PiXIdeAttach` | 将当前文件或选区作为 `@relative/path#Lx,y` 附加到 Pi |
|
|
168
|
+
|
|
169
|
+
#### Pi 侧环境变量
|
|
170
|
+
|
|
171
|
+
Pi 侧变量可设为真实环境变量或写入 `~/.pi/config.json` 的 `env` 中。真实环境变量优先级更高。
|
|
172
|
+
|
|
173
|
+
| 变量 | 默认值 | 说明 |
|
|
174
|
+
| ----------------------- | --------------------- | ------------------------------ |
|
|
175
|
+
| `PI_X_IDE_AUTO_INSTALL` | `1` | Pi 启动时自动安装 VS Code 扩展 |
|
|
176
|
+
| `PI_X_IDE_LOCK_DIR` | `~/.pi/pi-x-ide/lock` | IDE 连接 lock file 存放目录 |
|
|
177
|
+
| `PI_X_IDE_ZED_DB` | (自动检测) | 覆盖 Zed SQLite 数据库路径 |
|
|
178
|
+
|
|
179
|
+
编辑器 schema 指导见 [schemas/config.json](schemas/config.json)。
|
|
180
|
+
|
|
181
|
+
### 功能对比
|
|
182
|
+
|
|
183
|
+
| 功能 | VS Code | Zed | Neovim |
|
|
184
|
+
| --------------------------------- | ----------- | --------------------------- | ------------------------ |
|
|
185
|
+
| 实时文件追踪 | ✅ 实时推送 | ✅ 1 秒轮询 | ✅ 通过 sidecar 实时推送 |
|
|
186
|
+
| 实时选区追踪 | ✅ 实时推送 | ✅ 1 秒轮询 | ✅ 通过 sidecar 实时推送 |
|
|
187
|
+
| `Ctrl+Alt+K` / `Cmd+Alt+K` 快捷键 | ✅ | 手动输入 `@<relative-path>` | 用户自定义 keymap |
|
|
188
|
+
| LLM 上下文注入 | ✅ | ✅ | ✅ |
|
|
189
|
+
| `/ide auto` | ✅ | ✅ | ✅ |
|
|
190
|
+
|
|
191
|
+
### Lock File 协议
|
|
192
|
+
|
|
193
|
+
IDE WebSocket server 启动后默认将连接信息写入 `~/.pi/pi-x-ide/lock/`。可通过 `PI_X_IDE_LOCK_DIR` 覆盖。
|
|
144
194
|
|
|
145
195
|
Pi 通过 `ctx.cwd` 与 lock file 中的 `workspaceFolders` 做最长路径匹配,选中最匹配且最新的 IDE 连接。只有当前 `cwd` 位于某个 IDE `workspaceFolders` 内或与其相等时,Pi 才会自动连接;如果 `cwd` 只是父级目录(例如 `~/`),请运行 `/ide` 手动选择连接。
|
|
146
196
|
|
|
147
197
|
协议详情见 [docs/specs/ide-protocol.md](docs/specs/ide-protocol.md)。
|
|
148
198
|
|
|
149
|
-
|
|
199
|
+
---
|
|
150
200
|
|
|
151
|
-
|
|
201
|
+
## 开发
|
|
152
202
|
|
|
153
|
-
|
|
203
|
+
### 环境依赖
|
|
154
204
|
|
|
155
|
-
|
|
205
|
+
- Node.js ≥ 26
|
|
206
|
+
- pnpm ≥ 11(`packageManager` 声明为 `pnpm@11.5.2`)
|
|
207
|
+
- VS Code ≥ 1.90(仅 VS Code 扩展需要)
|
|
208
|
+
- Neovim ≥ 0.9(仅 Neovim 插件需要)
|
|
156
209
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
210
|
+
### 安装与构建
|
|
211
|
+
|
|
212
|
+
Clone 仓库后构建:
|
|
213
|
+
|
|
214
|
+
```bash
|
|
215
|
+
git clone https://github.com/balaenis/pi-x-ide.git
|
|
216
|
+
cd pi-x-ide
|
|
217
|
+
pnpm install
|
|
218
|
+
pnpm build
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
加载本地构建(无需全局安装):
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
pi -e ./src/pi/index.ts
|
|
225
|
+
```
|
|
160
226
|
|
|
161
|
-
|
|
227
|
+
常用命令:
|
|
162
228
|
|
|
163
|
-
|
|
229
|
+
| 命令 | 说明 |
|
|
230
|
+
| --------------------- | ----------------------------------------------------------------------------------------------- |
|
|
231
|
+
| `pnpm build` | 编译 Pi 侧 TypeScript → `dist/` + Neovim sidecar → `nvim/bin/` + VS Code bundle → `vscode/out/` |
|
|
232
|
+
| `pnpm typecheck` | 类型检查(不产出文件) |
|
|
233
|
+
| `pnpm test` | 编译 + 运行单元测试 |
|
|
234
|
+
| `pnpm package:vscode` | 打包 VS Code 扩展为 VSIX |
|
|
235
|
+
| `pnpm vsix` | `pnpm package:vscode` 的别名 |
|
|
164
236
|
|
|
165
|
-
###
|
|
237
|
+
### 本地测试 VS Code 扩展
|
|
166
238
|
|
|
167
|
-
|
|
239
|
+
#### 方式一:F5 启动 Extension Development Host(推荐)
|
|
168
240
|
|
|
169
|
-
|
|
241
|
+
1. 用 VS Code 打开 **项目根目录**。
|
|
242
|
+
2. 进入 **Run and Debug** 面板(`Ctrl+Shift+D`)。
|
|
243
|
+
3. 选择 **Run Pi x IDE VS Code Extension**。
|
|
244
|
+
4. 按 **F5**:
|
|
245
|
+
- preLaunchTask 会自动执行 `pnpm build`。
|
|
246
|
+
- 打开一个标题包含 `[Extension Development Host]` 的新 VS Code 窗口。
|
|
170
247
|
|
|
171
|
-
|
|
172
|
-
- Pi 从 Zed 集成终端启动
|
|
173
|
-
- Node.js ≥ 26(需要 `node:sqlite`)
|
|
248
|
+
#### 方式二:打包 VSIX 后安装
|
|
174
249
|
|
|
175
|
-
|
|
250
|
+
```bash
|
|
251
|
+
pnpm package:vscode
|
|
252
|
+
code --install-extension './vscode'-0.1.0.vsix
|
|
253
|
+
```
|
|
176
254
|
|
|
177
|
-
|
|
178
|
-
| ----------------- | ------------ | -------------------------- |
|
|
179
|
-
| `PI_X_IDE_ZED_DB` | (自动检测) | 覆盖 Zed SQLite 数据库路径 |
|
|
255
|
+
这样安装的扩展在所有 VS Code 窗口中运行,不依赖 F5 Extension Host。
|
|
180
256
|
|
|
181
|
-
|
|
257
|
+
#### 验证扩展是否运行
|
|
182
258
|
|
|
183
|
-
|
|
259
|
+
```bash
|
|
260
|
+
ls -l ~/.pi/pi-x-ide/lock
|
|
261
|
+
```
|
|
184
262
|
|
|
185
|
-
- **
|
|
186
|
-
- **macOS:** `~/Library/Application Support/Zed/db/0-stable/db.sqlite`
|
|
187
|
-
- **Windows:** `%LOCALAPPDATA%\\Zed\\db\\0-stable\\db.sqlite`
|
|
188
|
-
- **WSL + Windows 版 Zed:** `/mnt/c/Users/<user>/AppData/Local/Zed/db/0-stable/db.sqlite`
|
|
263
|
+
应看到类似 `vscode-12345-48123.lock` 的文件。如果没有,在 VS Code 中执行 **Developer: Reload Window**。
|
|
189
264
|
|
|
190
|
-
|
|
265
|
+
### 发布
|
|
191
266
|
|
|
192
|
-
|
|
267
|
+
本项目使用 [Release Please](https://github.com/googleapis/release-please) 和 [Conventional Commits](https://www.conventionalcommits.org/) 来自动化版本管理和发布流程。
|
|
193
268
|
|
|
194
|
-
|
|
195
|
-
| --------------------------------- | ----------- | --------------------------- |
|
|
196
|
-
| 实时文件追踪 | ✅ 实时推送 | ✅ 1 秒轮询 |
|
|
197
|
-
| 实时选区追踪 | ✅ 实时推送 | ✅ 1 秒轮询 |
|
|
198
|
-
| `Ctrl+Alt+K` / `Cmd+Alt+K` 快捷键 | ✅ | 手动输入 `@<relative-path>` |
|
|
199
|
-
| LLM 上下文注入 | ✅ | ✅ |
|
|
200
|
-
| `/ide auto` | ✅ | ✅ |
|
|
269
|
+
详见 [RELEASE.md](RELEASE.md)。
|
package/dist/package.json
CHANGED
|
@@ -1,18 +1,24 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-x-ide",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.2",
|
|
4
4
|
"description": "Pi extension package for IDE selection context integration.",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist",
|
|
7
7
|
"schemas",
|
|
8
|
-
"src"
|
|
8
|
+
"src",
|
|
9
|
+
"nvim/lua",
|
|
10
|
+
"nvim/plugin",
|
|
11
|
+
"nvim/doc",
|
|
12
|
+
"nvim/bin"
|
|
9
13
|
],
|
|
10
14
|
"keywords": [
|
|
11
15
|
"pi-package",
|
|
12
16
|
"pi",
|
|
13
17
|
"ide",
|
|
14
18
|
"vscode",
|
|
15
|
-
"zed"
|
|
19
|
+
"zed",
|
|
20
|
+
"neovim",
|
|
21
|
+
"nvim"
|
|
16
22
|
],
|
|
17
23
|
"license": "Apache-2.0",
|
|
18
24
|
"repository": {
|
|
@@ -30,7 +36,7 @@
|
|
|
30
36
|
"type": "commonjs",
|
|
31
37
|
"main": "./dist/src/pi/index.js",
|
|
32
38
|
"scripts": {
|
|
33
|
-
"build": "tsc -p tsconfig.json && pnpm --filter './vscode' compile",
|
|
39
|
+
"build": "tsc -p tsconfig.json && node scripts/build-nvim-sidecar.mjs --production && pnpm --filter './vscode' compile",
|
|
34
40
|
"typecheck": "tsc -p tsconfig.json --noEmit && pnpm --filter './vscode' typecheck",
|
|
35
41
|
"generate:config-schema": "node scripts/generate-config-schema.cjs",
|
|
36
42
|
"check:config-schema": "node scripts/generate-config-schema.cjs --check",
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { AtMentionedParams, EditorSelectionSnapshot, SelectionClearedParams } from "../shared/protocol";
|
|
2
|
+
export interface SidecarConfig {
|
|
3
|
+
workspaceFolders?: string[];
|
|
4
|
+
name?: string;
|
|
5
|
+
lockDir?: string;
|
|
6
|
+
}
|
|
7
|
+
export type NvimSidecarMessage = {
|
|
8
|
+
type: "selection_changed";
|
|
9
|
+
snapshot: EditorSelectionSnapshot;
|
|
10
|
+
} | {
|
|
11
|
+
type: "selection_cleared";
|
|
12
|
+
reason?: SelectionClearedParams["reason"];
|
|
13
|
+
} | {
|
|
14
|
+
type: "at_mentioned";
|
|
15
|
+
snapshot: AtMentionedParams;
|
|
16
|
+
rangeText?: string;
|
|
17
|
+
} | {
|
|
18
|
+
type: "workspace_changed";
|
|
19
|
+
workspaceFolders: string[];
|
|
20
|
+
} | {
|
|
21
|
+
type: "shutdown";
|
|
22
|
+
};
|
|
23
|
+
export declare function parseSidecarConfig(value: unknown): SidecarConfig | undefined;
|
|
24
|
+
export declare function parseNvimSidecarMessage(value: unknown): NvimSidecarMessage | undefined;
|
|
25
|
+
export declare function parseJsonLine(line: string): unknown;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseSidecarConfig = parseSidecarConfig;
|
|
4
|
+
exports.parseNvimSidecarMessage = parseNvimSidecarMessage;
|
|
5
|
+
exports.parseJsonLine = parseJsonLine;
|
|
6
|
+
const schema_1 = require("../shared/schema");
|
|
7
|
+
function isRecord(value) {
|
|
8
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
9
|
+
}
|
|
10
|
+
function isStringArray(value) {
|
|
11
|
+
return Array.isArray(value) && value.every((item) => typeof item === "string");
|
|
12
|
+
}
|
|
13
|
+
function parseSidecarConfig(value) {
|
|
14
|
+
if (!isRecord(value))
|
|
15
|
+
return undefined;
|
|
16
|
+
const workspaceFolders = value.workspaceFolders;
|
|
17
|
+
const name = value.name;
|
|
18
|
+
const lockDir = value.lockDir;
|
|
19
|
+
if (workspaceFolders !== undefined && !isStringArray(workspaceFolders))
|
|
20
|
+
return undefined;
|
|
21
|
+
if (name !== undefined && typeof name !== "string")
|
|
22
|
+
return undefined;
|
|
23
|
+
if (lockDir !== undefined && typeof lockDir !== "string")
|
|
24
|
+
return undefined;
|
|
25
|
+
return { workspaceFolders, name, lockDir };
|
|
26
|
+
}
|
|
27
|
+
function parseNvimSidecarMessage(value) {
|
|
28
|
+
if (!isRecord(value) || typeof value.type !== "string")
|
|
29
|
+
return undefined;
|
|
30
|
+
switch (value.type) {
|
|
31
|
+
case "selection_changed":
|
|
32
|
+
return (0, schema_1.isEditorSelectionSnapshot)(value.snapshot)
|
|
33
|
+
? { type: "selection_changed", snapshot: value.snapshot }
|
|
34
|
+
: undefined;
|
|
35
|
+
case "selection_cleared": {
|
|
36
|
+
const params = { source: "nvim", reason: value.reason ?? "no-active-editor" };
|
|
37
|
+
return (0, schema_1.isSelectionClearedParams)(params) ? { type: "selection_cleared", reason: params.reason } : undefined;
|
|
38
|
+
}
|
|
39
|
+
case "at_mentioned": {
|
|
40
|
+
const snapshot = value.snapshot;
|
|
41
|
+
if (!(0, schema_1.isAtMentionedParams)(snapshot))
|
|
42
|
+
return undefined;
|
|
43
|
+
const rangeText = typeof value.rangeText === "string" ? value.rangeText : snapshot.rangeText;
|
|
44
|
+
return { type: "at_mentioned", snapshot, rangeText };
|
|
45
|
+
}
|
|
46
|
+
case "workspace_changed":
|
|
47
|
+
return isStringArray(value.workspaceFolders)
|
|
48
|
+
? { type: "workspace_changed", workspaceFolders: value.workspaceFolders }
|
|
49
|
+
: undefined;
|
|
50
|
+
case "shutdown":
|
|
51
|
+
return { type: "shutdown" };
|
|
52
|
+
default:
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function parseJsonLine(line) {
|
|
57
|
+
try {
|
|
58
|
+
return JSON.parse(line);
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=sidecar-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sidecar-schema.js","sourceRoot":"","sources":["../../../src/nvim/sidecar-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { IdeWebSocketServer } from "../shared/ide-server";
|
|
3
|
+
export interface NvimSidecarOptions {
|
|
4
|
+
workspaceFolders?: string[];
|
|
5
|
+
name?: string;
|
|
6
|
+
lockDir?: string;
|
|
7
|
+
stdin?: NodeJS.ReadableStream;
|
|
8
|
+
stdout?: NodeJS.WritableStream;
|
|
9
|
+
stderr?: NodeJS.WritableStream;
|
|
10
|
+
}
|
|
11
|
+
export interface NvimSidecarHandle {
|
|
12
|
+
server: IdeWebSocketServer;
|
|
13
|
+
lockFilePath: string;
|
|
14
|
+
stop: () => Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
export declare function startNvimSidecar(options?: NvimSidecarOptions): Promise<NvimSidecarHandle>;
|