pi-x-ide 1.3.0 → 1.4.1
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 +187 -104
- package/README.zh.md +187 -104
- package/dist/package.json +14 -5
- 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/install.js +13 -8
- package/dist/src/pi/install.js.map +1 -1
- package/dist/src/pi/zed.js +19 -12
- package/dist/src/pi/zed.js.map +1 -1
- package/dist/src/shared/config-options.d.ts +89 -0
- package/dist/src/shared/config-options.js +88 -0
- package/dist/src/shared/config-options.js.map +1 -0
- package/dist/src/shared/config.d.ts +7 -0
- package/dist/src/shared/config.js +51 -0
- package/dist/src/shared/config.js.map +1 -0
- 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 +4 -3
- 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/install.test.js +13 -0
- package/dist/test/install.test.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 +37 -0
- package/dist/test/shared.test.js.map +1 -1
- package/dist/test/zed.test.js +12 -0
- package/dist/test/zed.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 +14 -5
- package/schemas/config.json +120 -0
- package/src/nvim/sidecar-schema.ts +71 -0
- package/src/nvim/sidecar.ts +219 -0
- package/src/pi/install.ts +13 -8
- package/src/pi/zed.ts +19 -12
- package/src/shared/config-options.ts +100 -0
- package/src/shared/config.ts +54 -0
- package/src/shared/ide-server.ts +120 -0
- package/src/shared/lock-file.ts +65 -0
- package/src/shared/paths.ts +4 -3
- package/src/shared/protocol.ts +1 -1
- package/src/shared/schema.ts +1 -1
package/README.zh.md
CHANGED
|
@@ -1,120 +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
|
-
```
|
|
49
|
+
需要 Node.js ≥ 26,Zed 在同一台机器上运行。
|
|
68
50
|
|
|
69
|
-
|
|
51
|
+
#### Neovim
|
|
70
52
|
|
|
71
|
-
|
|
72
|
-
- 输入框下方 widget:IDE 名称、workspace、当前文件、选区范围、`pending/sent` 状态
|
|
53
|
+
Neovim 支持由一个 Lua 插件和一个内置的 Node.js sidecar 组成。只要当前目录匹配 Neovim workspace,Pi 可以从任意终端启动,不要求在 Neovim 内部运行。
|
|
73
54
|
|
|
74
|
-
|
|
55
|
+
**lazy.nvim:**
|
|
75
56
|
|
|
76
|
-
```
|
|
77
|
-
|
|
57
|
+
```lua
|
|
58
|
+
{
|
|
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,
|
|
68
|
+
}
|
|
78
69
|
```
|
|
79
70
|
|
|
80
|
-
|
|
71
|
+
> **注意:** `init` 块手动将 `nvim/` 子目录加入 runtime path,以规避部分版本 lazy.nvim 的 Lua 模块解析兼容性问题。
|
|
81
72
|
|
|
82
|
-
|
|
83
|
-
/ide auto
|
|
84
|
-
```
|
|
73
|
+
**原生 package:**
|
|
85
74
|
|
|
86
|
-
|
|
75
|
+
```vim
|
|
76
|
+
set runtimepath+=/path/to/pi-x-ide/nvim
|
|
77
|
+
lua require("pi_x_ide").setup({ keymap = "<leader>pa" })
|
|
78
|
+
```
|
|
87
79
|
|
|
88
|
-
|
|
80
|
+
完整配置选项、命令和故障排查见 [配置参考](#neovim-2)。
|
|
89
81
|
|
|
90
|
-
###
|
|
82
|
+
### 4. 连接 Pi 并验证
|
|
91
83
|
|
|
92
|
-
在
|
|
84
|
+
在 IDE workspace **同一项目目录** 启动 Pi:
|
|
93
85
|
|
|
94
|
-
```
|
|
95
|
-
|
|
86
|
+
```bash
|
|
87
|
+
pi
|
|
96
88
|
```
|
|
97
89
|
|
|
98
|
-
|
|
90
|
+
Pi 自动加载 `pi-x-ide` 并连接 IDE。TUI 底部应显示 `IDE: vscode ✓`,输入框下方 widget 显示 IDE 名称、workspace、当前文件和选区范围。
|
|
99
91
|
|
|
100
|
-
|
|
92
|
+
**验证是否正常:**
|
|
101
93
|
|
|
102
|
-
|
|
103
|
-
- macOS:`Cmd+Alt+K`
|
|
104
|
-
|
|
105
|
-
Pi 输入框应插入:
|
|
94
|
+
在 IDE 中打开文件并选中文本,widget 应实时更新:
|
|
106
95
|
|
|
107
96
|
```text
|
|
108
|
-
|
|
97
|
+
IDE: vscode ✓ src/foo.ts#L10,20 pending
|
|
109
98
|
```
|
|
110
99
|
|
|
111
|
-
|
|
100
|
+
按 `Ctrl+Alt+K`(Linux/Windows)或 `Cmd+Alt+K`(macOS),Pi 输入框应插入 `@src/foo.ts#L10,20`。
|
|
101
|
+
|
|
102
|
+
在 Pi 中输入对话提示并提交,选中文本会作为 LLM 上下文注入(不写入 session 历史)。提交后 widget 显示 `sent`。
|
|
112
103
|
|
|
113
|
-
|
|
104
|
+
**如果连接未出现:**
|
|
114
105
|
|
|
115
|
-
|
|
106
|
+
- 在 Pi 中运行 `/ide auto` 重新匹配
|
|
107
|
+
- 如果 IDE 在 Pi 之后启动,reload IDE 窗口后再次运行 `/ide auto`
|
|
108
|
+
- 运行 `/ide` 手动从列表中选择连接
|
|
116
109
|
|
|
117
|
-
|
|
110
|
+
### `/ide` 命令参考
|
|
118
111
|
|
|
119
112
|
| 命令 | 行为 |
|
|
120
113
|
| -------------- | ------------------------------------------------- |
|
|
@@ -126,61 +119,151 @@ Pi 输入框应插入:
|
|
|
126
119
|
| `/ide attach` | 手动把最新 selection range 插入输入框 |
|
|
127
120
|
| `/ide install` | 通过支持的 IDE CLI 安装或更新 `balaenis.pi-x-ide` |
|
|
128
121
|
|
|
129
|
-
|
|
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
|
+
|
|
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)。
|
|
130
180
|
|
|
131
|
-
|
|
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` 覆盖。
|
|
132
194
|
|
|
133
195
|
Pi 通过 `ctx.cwd` 与 lock file 中的 `workspaceFolders` 做最长路径匹配,选中最匹配且最新的 IDE 连接。只有当前 `cwd` 位于某个 IDE `workspaceFolders` 内或与其相等时,Pi 才会自动连接;如果 `cwd` 只是父级目录(例如 `~/`),请运行 `/ide` 手动选择连接。
|
|
134
196
|
|
|
135
197
|
协议详情见 [docs/specs/ide-protocol.md](docs/specs/ide-protocol.md)。
|
|
136
198
|
|
|
137
|
-
|
|
199
|
+
---
|
|
138
200
|
|
|
139
|
-
|
|
201
|
+
## 开发
|
|
140
202
|
|
|
141
|
-
|
|
203
|
+
### 环境依赖
|
|
142
204
|
|
|
143
|
-
|
|
205
|
+
- Node.js ≥ 26
|
|
206
|
+
- pnpm ≥ 11(`packageManager` 声明为 `pnpm@11.5.2`)
|
|
207
|
+
- VS Code ≥ 1.90(仅 VS Code 扩展需要)
|
|
208
|
+
- Neovim ≥ 0.9(仅 Neovim 插件需要)
|
|
144
209
|
|
|
145
|
-
|
|
146
|
-
| -------------------- | --------------------- | --------- | ---------------------------- |
|
|
147
|
-
| `piXIde.rangeFormat` | `"comma"` \| `"dash"` | `"comma"` | 手动快捷键生成的文件引用格式 |
|
|
210
|
+
### 安装与构建
|
|
148
211
|
|
|
149
|
-
|
|
212
|
+
Clone 仓库后构建:
|
|
150
213
|
|
|
151
|
-
|
|
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
|
+
```
|
|
152
220
|
|
|
153
|
-
|
|
221
|
+
加载本地构建(无需全局安装):
|
|
154
222
|
|
|
155
|
-
|
|
223
|
+
```bash
|
|
224
|
+
pi -e ./src/pi/index.ts
|
|
225
|
+
```
|
|
156
226
|
|
|
157
|
-
|
|
227
|
+
常用命令:
|
|
158
228
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
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` 的别名 |
|
|
162
236
|
|
|
163
|
-
###
|
|
237
|
+
### 本地测试 VS Code 扩展
|
|
164
238
|
|
|
165
|
-
|
|
166
|
-
| ----------------- | ------------ | -------------------------- |
|
|
167
|
-
| `PI_X_IDE_ZED_DB` | (自动检测) | 覆盖 Zed SQLite 数据库路径 |
|
|
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
|
-
- **macOS:** `~/Library/Application Support/Zed/db/0-stable/db.sqlite`
|
|
173
|
-
- **Windows:** `%LOCALAPPDATA%\\Zed\\db\\0-stable\\db.sqlite`
|
|
174
|
-
- **WSL + Windows 版 Zed:** `/mnt/c/Users/<user>/AppData/Local/Zed/db/0-stable/db.sqlite`
|
|
248
|
+
#### 方式二:打包 VSIX 后安装
|
|
175
249
|
|
|
176
|
-
|
|
250
|
+
```bash
|
|
251
|
+
pnpm package:vscode
|
|
252
|
+
code --install-extension './vscode'-0.1.0.vsix
|
|
253
|
+
```
|
|
177
254
|
|
|
178
|
-
|
|
255
|
+
这样安装的扩展在所有 VS Code 窗口中运行,不依赖 F5 Extension Host。
|
|
179
256
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
257
|
+
#### 验证扩展是否运行
|
|
258
|
+
|
|
259
|
+
```bash
|
|
260
|
+
ls -l ~/.pi/pi-x-ide/lock
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
应看到类似 `vscode-12345-48123.lock` 的文件。如果没有,在 VS Code 中执行 **Developer: Reload Window**。
|
|
264
|
+
|
|
265
|
+
### 发布
|
|
266
|
+
|
|
267
|
+
本项目使用 [Release Please](https://github.com/googleapis/release-please) 和 [Conventional Commits](https://www.conventionalcommits.org/) 来自动化版本管理和发布流程。
|
|
268
|
+
|
|
269
|
+
详见 [RELEASE.md](RELEASE.md)。
|
package/dist/package.json
CHANGED
|
@@ -1,17 +1,24 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-x-ide",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.1",
|
|
4
4
|
"description": "Pi extension package for IDE selection context integration.",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist",
|
|
7
|
-
"
|
|
7
|
+
"schemas",
|
|
8
|
+
"src",
|
|
9
|
+
"nvim/lua",
|
|
10
|
+
"nvim/plugin",
|
|
11
|
+
"nvim/doc",
|
|
12
|
+
"nvim/bin"
|
|
8
13
|
],
|
|
9
14
|
"keywords": [
|
|
10
15
|
"pi-package",
|
|
11
16
|
"pi",
|
|
12
17
|
"ide",
|
|
13
18
|
"vscode",
|
|
14
|
-
"zed"
|
|
19
|
+
"zed",
|
|
20
|
+
"neovim",
|
|
21
|
+
"nvim"
|
|
15
22
|
],
|
|
16
23
|
"license": "Apache-2.0",
|
|
17
24
|
"repository": {
|
|
@@ -29,9 +36,11 @@
|
|
|
29
36
|
"type": "commonjs",
|
|
30
37
|
"main": "./dist/src/pi/index.js",
|
|
31
38
|
"scripts": {
|
|
32
|
-
"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",
|
|
33
40
|
"typecheck": "tsc -p tsconfig.json --noEmit && pnpm --filter './vscode' typecheck",
|
|
34
|
-
"
|
|
41
|
+
"generate:config-schema": "node scripts/generate-config-schema.cjs",
|
|
42
|
+
"check:config-schema": "node scripts/generate-config-schema.cjs --check",
|
|
43
|
+
"test": "pnpm check:config-schema && pnpm build && node --test dist/test/*.test.js",
|
|
35
44
|
"lint": "eslint .",
|
|
36
45
|
"lint:fix": "eslint . --fix",
|
|
37
46
|
"format": "prettier --write .",
|
|
@@ -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>;
|