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.
Files changed (43) hide show
  1. package/README.md +183 -114
  2. package/README.zh.md +183 -114
  3. package/dist/package.json +10 -4
  4. package/dist/src/nvim/sidecar-schema.d.ts +25 -0
  5. package/dist/src/nvim/sidecar-schema.js +64 -0
  6. package/dist/src/nvim/sidecar-schema.js.map +1 -0
  7. package/dist/src/nvim/sidecar.d.ts +16 -0
  8. package/dist/src/nvim/sidecar.js +173 -0
  9. package/dist/src/nvim/sidecar.js.map +1 -0
  10. package/dist/src/pi/index.js +10 -2
  11. package/dist/src/pi/index.js.map +1 -1
  12. package/dist/src/pi/install.js +22 -1
  13. package/dist/src/pi/install.js.map +1 -1
  14. package/dist/src/shared/ide-server.d.ts +20 -0
  15. package/dist/src/shared/ide-server.js +144 -0
  16. package/dist/src/shared/ide-server.js.map +1 -0
  17. package/dist/src/shared/lock-file.d.ts +16 -0
  18. package/dist/src/shared/lock-file.js +58 -0
  19. package/dist/src/shared/lock-file.js.map +1 -0
  20. package/dist/src/shared/paths.js +8 -1
  21. package/dist/src/shared/paths.js.map +1 -1
  22. package/dist/src/shared/protocol.d.ts +1 -1
  23. package/dist/src/shared/schema.js +1 -1
  24. package/dist/src/shared/schema.js.map +1 -1
  25. package/dist/test/nvim-sidecar.test.d.ts +1 -0
  26. package/dist/test/nvim-sidecar.test.js +148 -0
  27. package/dist/test/nvim-sidecar.test.js.map +1 -0
  28. package/dist/test/shared.test.js +10 -0
  29. package/dist/test/shared.test.js.map +1 -1
  30. package/nvim/bin/pi-x-ide-nvim-sidecar.cjs +21 -0
  31. package/nvim/doc/pi-x-ide.txt +112 -0
  32. package/nvim/lua/pi_x_ide/init.lua +442 -0
  33. package/nvim/plugin/pi-x-ide.lua +15 -0
  34. package/package.json +10 -4
  35. package/src/nvim/sidecar-schema.ts +71 -0
  36. package/src/nvim/sidecar.ts +219 -0
  37. package/src/pi/index.ts +12 -2
  38. package/src/pi/install.ts +24 -1
  39. package/src/shared/ide-server.ts +120 -0
  40. package/src/shared/lock-file.ts +65 -0
  41. package/src/shared/paths.ts +8 -1
  42. package/src/shared/protocol.ts +1 -1
  43. package/src/shared/schema.ts +1 -1
package/README.zh.md CHANGED
@@ -1,132 +1,113 @@
1
1
  # Pi × IDE
2
2
 
3
- Pi extension package for IDE selection context integration.
3
+ > 用于 IDE 选择上下文集成的 Pi 扩展包。
4
4
 
5
- 自动将 VS Code 体系 IDE Zed 中当前打开或选中的文件与文本范围附加到 Pi TUI,并作为对话上下文提交给 LLM。
5
+ 自动将 VS Code、ZedNeovim 中当前打开或选中的文件与文本范围附加到 Pi TUI,并作为对话上下文提交给 LLM。
6
6
 
7
- ## 环境依赖
7
+ ---
8
8
 
9
- - Node.js ≥ 26
10
- - pnpm ≥ 11(`packageManager` 声明为 `pnpm@11.5.2`)
11
- - VS Code ≥ 1.90(仅 VS Code 扩展需要)
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
- pnpm install
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
- ## 本地测试 VS Code 扩展
25
+ #### VS Code / Cursor / Windsurf
32
26
 
33
- ### 方式一:F5 启动 Extension Development Host(推荐)
27
+ **方式一:从 Marketplace 安装(推荐)**
34
28
 
35
- 1. VS Code 打开 **项目根目录**。
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
- ### 方式二:打包 VSIX 后安装
31
+ **方式二:通过 Pi CLI 安装**
43
32
 
44
- ```bash
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
- 这样安装的扩展在所有 VS Code 窗口中运行,不依赖 F5 Extension Host。
35
+ **方式三:Pi 启动时自动安装**
50
36
 
51
- ### 验证扩展是否运行
37
+ Pi 从支持的 VS Code 集成终端中启动时,会尝试自动安装或更新扩展。如需关闭:
52
38
 
53
39
  ```bash
54
- ls -l ~/.pi/pi-x-ide/lock
40
+ PI_X_IDE_AUTO_INSTALL=0
55
41
  ```
56
42
 
57
- 应看到类似 `vscode-12345-48123.lock` 的文件。
58
-
59
- 如果没有,在 VS Code 中执行 **Developer: Reload Window**。
43
+ 更多配置项见 [配置参考](#pi-侧环境变量)。
60
44
 
61
- ## 连接 Pi
45
+ #### Zed
62
46
 
63
- **同一个项目目录** 启动 Pi
47
+ 无需安装任何扩展。Pi Zed 终端中运行时(`ZED_TERM=true` 或 `TERM_PROGRAM=zed`)会自动检测并连接。Pi 通过读取 Zed 本地状态数据库获取活跃编辑器和选区信息。
64
48
 
65
- ```bash
66
- pi -e ./src/pi/index.ts
67
- ```
68
-
69
- Pi TUI 应显示:
49
+ 需要 Node.js ≥ 26,Zed 在同一台机器上运行。
70
50
 
71
- - Footer:`IDE: vscode ✓`
72
- - 输入框下方 widget:IDE 名称、workspace、当前文件、选区范围、`pending/sent` 状态
51
+ #### Neovim
73
52
 
74
- Pi 从支持的 VS Code 体系集成终端中启动时,它也会异步尝试自动安装或更新 Marketplace 扩展 `balaenis.pi-x-ide`,不会阻塞 Pi 启动。如需只关闭这个安装尝试,设置:
53
+ Neovim 支持由一个 Lua 插件和一个内置的 Node.js sidecar 组成。只要当前目录匹配 Neovim workspace,Pi 可以从任意终端启动,不要求在 Neovim 内部运行。
75
54
 
76
- ```bash
77
- PI_X_IDE_AUTO_INSTALL=0
78
- ```
55
+ **lazy.nvim:**
79
56
 
80
- Pi 侧环境变量也可以写入 `~/.pi/config.json`:
81
-
82
- ```json
57
+ ```lua
83
58
  {
84
- "env": {
85
- "PI_X_IDE_AUTO_INSTALL": "0"
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
- 真实环境变量优先级高于 `~/.pi/config.json` 中的值。编辑器 schema 指导见 [schemas/config.json](schemas/config.json)。
71
+ > **注意:** `init` 块手动将 `nvim/` 子目录加入 runtime path,以规避部分版本 lazy.nvim 的 Lua 模块解析兼容性问题。
91
72
 
92
- 如果 VS Code 后启动,在 Pi 里执行:
73
+ **原生 package:**
93
74
 
94
- ```text
95
- /ide auto
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
- 如果自动安装成功但没有出现连接,请 reload IDE 窗口后再次运行 `/ide auto`。你也可以运行 `/ide install`,手动选择支持的 `code`、`cursor` 或 `windsurf` CLI
80
+ 完整配置选项、命令和故障排查见 [配置参考](#neovim-2)
99
81
 
100
- ## 功能验证
82
+ ### 4. 连接 Pi 并验证
101
83
 
102
- ### 实时选区
84
+ IDE workspace **同一项目目录** 启动 Pi:
103
85
 
104
- 在 VS Code 中打开文件并选中文本,Pi TUI widget 应实时显示:
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
- - Linux/Windows:`Ctrl+Alt+K`
115
- - macOS:`Cmd+Alt+K`
92
+ **验证是否正常:**
116
93
 
117
- Pi 输入框应插入:
94
+ IDE 中打开文件并选中文本,widget 应实时更新:
118
95
 
119
96
  ```text
120
- @src/foo.ts#L10,20
97
+ IDE: vscode ✓ src/foo.ts#L10,20 pending
121
98
  ```
122
99
 
123
- ### LLM 上下文注入
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
- 在 Pi 中输入普通对话提示,提交后进行 LLM 调用时,当前 `pending` 的选中文本会临时注入 `context` 事件,不写入 session 历史。
104
+ **如果连接未出现:**
126
105
 
127
- 提交完成后 TUI 显示 `sent`。
106
+ - Pi 中运行 `/ide auto` 重新匹配
107
+ - 如果 IDE 在 Pi 之后启动,reload IDE 窗口后再次运行 `/ide auto`
108
+ - 运行 `/ide` 手动从列表中选择连接
128
109
 
129
- ## `/ide` 命令参考
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
- ## Lock file 协议
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
- IDE WebSocket server 启动后默认将连接信息写入 `~/.pi/pi-x-ide/lock/`。可通过真实环境变量 `PI_X_IDE_LOCK_DIR` 覆盖,也可在 `~/.pi/config.json` `env` 中配置。
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
- 本项目使用 [Release Please](https://github.com/googleapis/release-please) 和 [Conventional Commits](https://www.conventionalcommits.org/) 来自动化版本管理和发布流程。
201
+ ## 开发
152
202
 
153
- 详见 [RELEASE.md](RELEASE.md)。
203
+ ### 环境依赖
154
204
 
155
- ## VS Code 配置项
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
- | `piXIde.rangeFormat` | `"comma"` \| `"dash"` | `"comma"` | 手动快捷键生成的文件引用格式 |
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
- ## Zed 编辑器支持
227
+ 常用命令:
162
228
 
163
- Pi 在 Zed 终端中运行时(`ZED_TERM=true` 或 `TERM_PROGRAM=zed`),Pi 会自动检测并连接 Zed,无需安装任何 Zed 扩展。
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
- Pi 直接读取 Zed 的本地 SQLite 状态数据库,获取当前活跃编辑器文件、选中文本范围和缓冲区内容。数据库每秒轮询一次,变化会实时反映在 Pi TUI widget 中。
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
- - Zed 在同一台机器上运行
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
- 这个 Pi 侧变量也可以配置在 `~/.pi/config.json` 的 `env` 中。
257
+ #### 验证扩展是否运行
182
258
 
183
- 默认数据库路径:
259
+ ```bash
260
+ ls -l ~/.pi/pi-x-ide/lock
261
+ ```
184
262
 
185
- - **Linux:** `~/.local/share/zed/db/0-stable/db.sqlite`
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
- Pi 运行在 WSL 中,而 Zed 是 Windows 应用时,pi-x-ide 会将 `C:\\Users\\<user>\\project` 这类 Windows 路径规范化为 `/mnt/c/Users/<user>/project`,并将匹配当前发行版的 WSL UNC 路径(例如 `\\\\wsl.localhost\\Ubuntu\\home\\<user>\\project`)规范化为 `/home/<user>/project`。
265
+ ### 发布
191
266
 
192
- ### 功能对比
267
+ 本项目使用 [Release Please](https://github.com/googleapis/release-please) 和 [Conventional Commits](https://www.conventionalcommits.org/) 来自动化版本管理和发布流程。
193
268
 
194
- | 功能 | VS Code | Zed |
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.0",
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":";;AAwBA,gDASC;AAED,0DA2BC;AAED,sCAMC;AArED,6CAA4G;AAe5G,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC;AACjF,CAAC;AAED,SAAgB,kBAAkB,CAAC,KAAc;IAC/C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,MAAM,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC;IAChD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,IAAI,gBAAgB,KAAK,SAAS,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC;QAAE,OAAO,SAAS,CAAC;IACzF,IAAI,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACrE,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC3E,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC7C,CAAC;AAED,SAAgB,uBAAuB,CAAC,KAAc;IACpD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAEzE,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,mBAAmB;YACtB,OAAO,IAAA,kCAAyB,EAAC,KAAK,CAAC,QAAQ,CAAC;gBAC9C,CAAC,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE;gBACzD,CAAC,CAAC,SAAS,CAAC;QAChB,KAAK,mBAAmB,CAAC,CAAC,CAAC;YACzB,MAAM,MAAM,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,kBAAkB,EAAE,CAAC;YAC9E,OAAO,IAAA,iCAAwB,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7G,CAAC;QACD,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;YAChC,IAAI,CAAC,IAAA,4BAAmB,EAAC,QAAQ,CAAC;gBAAE,OAAO,SAAS,CAAC;YACrD,MAAM,SAAS,GAAG,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC7F,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;QACvD,CAAC;QACD,KAAK,mBAAmB;YACtB,OAAO,aAAa,CAAC,KAAK,CAAC,gBAAgB,CAAC;gBAC1C,CAAC,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,EAAE;gBACzE,CAAC,CAAC,SAAS,CAAC;QAChB,KAAK,UAAU;YACb,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;QAC9B;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,SAAgB,aAAa,CAAC,IAAY;IACxC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -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>;