remnote-bridge 0.1.11 → 0.1.13

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 (70) hide show
  1. package/dist/cli/addon/addon-manager.js +163 -0
  2. package/dist/cli/addon/registry.js +24 -0
  3. package/dist/cli/commands/addon.js +149 -0
  4. package/dist/cli/commands/clean.js +121 -52
  5. package/dist/cli/commands/connect.js +72 -33
  6. package/dist/cli/commands/disconnect.js +19 -19
  7. package/dist/cli/commands/edit-rem.js +8 -36
  8. package/dist/cli/commands/edit-tree.js +3 -20
  9. package/dist/cli/commands/health.js +19 -18
  10. package/dist/cli/commands/read-context.js +3 -20
  11. package/dist/cli/commands/read-globe.js +3 -20
  12. package/dist/cli/commands/read-rem.js +6 -32
  13. package/dist/cli/commands/read-tree.js +3 -20
  14. package/dist/cli/commands/search.js +97 -21
  15. package/dist/cli/config.js +148 -72
  16. package/dist/cli/daemon/daemon.js +104 -24
  17. package/dist/cli/daemon/dev-server.js +9 -1
  18. package/dist/cli/daemon/pid.js +36 -22
  19. package/dist/cli/daemon/registry.js +160 -0
  20. package/dist/cli/daemon/send-request.js +11 -11
  21. package/dist/cli/daemon/static-server.js +97 -34
  22. package/dist/cli/handlers/edit-handler.js +49 -140
  23. package/dist/cli/handlers/read-handler.js +9 -9
  24. package/dist/cli/handlers/rem-cache.js +10 -5
  25. package/dist/cli/handlers/tree-parser.js +16 -9
  26. package/dist/cli/main.js +67 -19
  27. package/dist/cli/protocol.js +18 -4
  28. package/dist/cli/server/config-server.js +280 -14
  29. package/dist/cli/server/ws-server.js +93 -44
  30. package/dist/cli/utils/output.js +29 -0
  31. package/dist/mcp/format.js +43 -0
  32. package/dist/mcp/index.js +0 -55
  33. package/dist/mcp/instructions.js +424 -216
  34. package/dist/mcp/resources/edit-rem-guide.js +37 -158
  35. package/dist/mcp/resources/edit-tree-guide.js +1 -1
  36. package/dist/mcp/resources/error-reference.js +9 -13
  37. package/dist/mcp/resources/rem-object-fields.js +6 -6
  38. package/dist/mcp/tools/edit-tools.js +69 -8
  39. package/dist/mcp/tools/infra-tools.js +44 -8
  40. package/dist/mcp/tools/read-tools.js +136 -20
  41. package/package.json +2 -2
  42. package/remnote-plugin/dist/bridge_widget-sandbox.js +17 -17
  43. package/remnote-plugin/dist/bridge_widget.js +17 -17
  44. package/remnote-plugin/dist/index-sandbox.js +31 -31
  45. package/remnote-plugin/dist/index.js +31 -31
  46. package/remnote-plugin/dist/manifest.json +1 -1
  47. package/remnote-plugin/package.json +1 -1
  48. package/remnote-plugin/public/manifest.json +1 -1
  49. package/remnote-plugin/src/bridge/multi-connection-manager.ts +151 -0
  50. package/remnote-plugin/src/bridge/websocket-client.ts +62 -16
  51. package/remnote-plugin/src/services/index.ts +0 -8
  52. package/remnote-plugin/src/services/read-rem.ts +1 -9
  53. package/remnote-plugin/src/services/search.ts +13 -10
  54. package/remnote-plugin/src/settings.ts +9 -7
  55. package/remnote-plugin/src/utils/index.ts +0 -5
  56. package/remnote-plugin/src/widgets/bridge_widget.tsx +105 -20
  57. package/remnote-plugin/src/widgets/index.tsx +41 -44
  58. package/remnote-plugin/webpack.config.js +35 -0
  59. package/skills/remnote-bridge/SKILL.md +45 -40
  60. package/skills/remnote-bridge/instructions/addon.md +134 -0
  61. package/skills/remnote-bridge/instructions/clean.md +110 -0
  62. package/skills/remnote-bridge/instructions/connect.md +80 -37
  63. package/skills/remnote-bridge/instructions/disconnect.md +22 -9
  64. package/skills/remnote-bridge/instructions/edit-rem.md +113 -327
  65. package/skills/remnote-bridge/instructions/health.md +23 -13
  66. package/skills/remnote-bridge/instructions/install-skill.md +58 -0
  67. package/skills/remnote-bridge/instructions/overall.md +99 -35
  68. package/skills/remnote-bridge/instructions/read-rem.md +15 -15
  69. package/skills/remnote-bridge/instructions/search.md +77 -18
  70. package/skills/remnote-bridge/instructions/setup.md +5 -6
@@ -8,16 +8,47 @@
8
8
 
9
9
  `connect` 以 fork 子进程方式启动后台守护进程(daemon),daemon 内部启动三个服务:
10
10
 
11
- | 服务 | 默认端口 | 用途 |
12
- |------|----------|------|
13
- | WS Server | 3002 | CLI 命令 ↔ daemon ↔ Plugin 的双向通信 |
14
- | Plugin 服务 | 8080 | 将 remnote-plugin 加载到 RemNote 浏览器(默认静态服务器,`--dev` 时为 webpack-dev-server) |
15
- | ConfigServer | 3003 | HTTP 配置管理界面 |
11
+ | 服务 | 槽位 0 端口 | 用途 |
12
+ |------|------------|------|
13
+ | WS Server | 29100 | CLI 命令 ↔ daemon ↔ Plugin 的双向通信 |
14
+ | Plugin 服务 | 29101 | 将 remnote-plugin 加载到 RemNote 浏览器(默认静态服务器,`--dev` 时为 webpack-dev-server) |
15
+ | ConfigServer | 29102 | HTTP 配置管理界面 |
16
16
 
17
17
  daemon 启动后脱离父进程(detached),CLI 进程退出但 daemon 继续运行。
18
18
 
19
19
  ---
20
20
 
21
+ ## 多实例支持(`--instance`)
22
+
23
+ `connect` 支持通过 `--instance <name>` 启动多个独立的 daemon 实例,每个实例连接不同的 RemNote 知识库。
24
+
25
+ ```bash
26
+ # 默认实例
27
+ remnote-bridge connect
28
+
29
+ # 指定实例名
30
+ remnote-bridge connect --instance work
31
+ remnote-bridge connect --instance personal
32
+
33
+ # JSON 模式
34
+ remnote-bridge --json connect --instance work
35
+ ```
36
+
37
+ **槽位机制**:系统最多支持 4 个并发实例,每个实例占用一个槽位(固定端口组):
38
+
39
+ | 槽位 | WS 端口 | Plugin 服务端口 | 配置端口 |
40
+ |:-----|:--------|:---------------|:---------|
41
+ | 0 | 29100 | 29101 | 29102 |
42
+ | 1 | 29110 | 29111 | 29112 |
43
+ | 2 | 29120 | 29121 | 29122 |
44
+ | 3 | 29130 | 29131 | 29132 |
45
+
46
+ **实例名解析优先级**:CLI `--instance` 参数 > 环境变量 `REMNOTE_BRIDGE_INSTANCE` > 默认值 `default`。Headless 模式下固定为 `headless`。
47
+
48
+ **首次使用多实例时**,用户需在 RemNote 中为每个实例分别配置 dev plugin URL(对应各自的 Plugin 服务端口)。
49
+
50
+ ---
51
+
21
52
  ## 两种模式
22
53
 
23
54
  ### 标准模式(默认)
@@ -56,7 +87,7 @@ Headless 模式下 Plugin 可能需要 10-30 秒才能连接到 daemon,使用
56
87
  1. 打开 RemNote 桌面端或网页端
57
88
  2. 点击左侧边栏底部的插件图标(拼图形状)
58
89
  3. 点击「开发你的插件」(Develop Your Plugin)
59
- 4. 在输入框中填入 `http://localhost:8080`(即 connect 输出的 Plugin 服务地址)
90
+ 4. 在输入框中填入 connect 输出的 Plugin 服务地址(如 `http://localhost:29101`)
60
91
  5. 等待插件加载完成
61
92
 
62
93
  ### 非首次使用(之前已加载过此插件)
@@ -82,10 +113,11 @@ remnote-bridge connect
82
113
  输出示例:
83
114
 
84
115
  ```
85
- 守护进程已启动(PID: 12345)
86
- WS Server: ws://127.0.0.1:3002
87
- Plugin 服务: http://localhost:8080
88
- 配置页面: http://127.0.0.1:3003
116
+ 正在启动守护进程(实例: default,槽位: 0)...
117
+ 守护进程已启动(PID: 12345,实例: default)
118
+ WS Server: ws://127.0.0.1:29100
119
+ Plugin 服务: http://localhost:29101
120
+ 配置页面: http://127.0.0.1:29102
89
121
  超时: 30 分钟无 CLI 交互后自动关闭
90
122
  ```
91
123
 
@@ -106,11 +138,15 @@ remnote-bridge --json connect
106
138
  "ok": true,
107
139
  "command": "connect",
108
140
  "alreadyRunning": false,
141
+ "instance": "default",
109
142
  "pid": 12345,
110
- "wsPort": 3002,
111
- "devServerPort": 8080,
112
- "configPort": 3003,
143
+ "wsPort": 29100,
144
+ "devServerPort": 29101,
145
+ "configPort": 29102,
146
+ "slotIndex": 0,
113
147
  "timeoutMinutes": 30,
148
+ "headless": false,
149
+ "portChanged": false,
114
150
  "timestamp": "2026-03-06T10:00:00.000Z"
115
151
  }
116
152
  ```
@@ -122,9 +158,12 @@ remnote-bridge --json connect
122
158
  "ok": true,
123
159
  "command": "connect",
124
160
  "alreadyRunning": true,
161
+ "instance": "default",
125
162
  "pid": 12345,
126
- "wsPort": 3002,
127
- "devServerPort": 8080,
163
+ "wsPort": 29100,
164
+ "devServerPort": 29101,
165
+ "configPort": 29102,
166
+ "slotIndex": 0,
128
167
  "timestamp": "2026-03-06T10:00:00.000Z"
129
168
  }
130
169
  ```
@@ -135,8 +174,7 @@ remnote-bridge --json connect
135
174
  {
136
175
  "ok": false,
137
176
  "command": "connect",
138
- "error": "守护进程启动超时(60 秒)",
139
- "timestamp": "2026-03-06T10:00:00.000Z"
177
+ "error": "已达最大实例数上限(4),无可用槽位"
140
178
  }
141
179
  ```
142
180
 
@@ -145,24 +183,28 @@ remnote-bridge --json connect
145
183
  ## 启动流程
146
184
 
147
185
  ```
148
- 1. 检查 PID 文件 (.remnote-bridge.pid)
149
- ├─ 已在运行 → 返回 ok + alreadyRunning: true
150
- └─ 未运行 / stale PID → 继续
186
+ 1. 解析实例名(--instance / 环境变量 / 默认 'default')
187
+
188
+ 2. 加载注册表,清理过期槽位
189
+ ├─ 实例已在运行 → 返回 ok + alreadyRunning: true
190
+ └─ 未运行 → 继续
191
+
192
+ 3. 分配槽位(第一个空闲槽位)
193
+ ├─ 无空闲 → 报错 "已达最大实例数上限(4)"
194
+ └─ 有空闲 → 占位
151
195
 
152
- 2. fork 守护进程(detached, stdio 全部 ignore)
196
+ 4. fork 守护进程(detached, 传入 SLOT_INDEX / SLOT_WS_PORT 等环境变量)
153
197
 
154
- 3. daemon 内部按顺序启动:
198
+ 5. daemon 内部按顺序启动:
155
199
  ├─ WS Server(必须成功,否则 daemon 退出)
156
200
  ├─ ConfigServer(非关键,失败不阻塞)
157
- └─ Plugin 服务(默认静态服务器;--dev 时为 webpack-dev-server + 依赖自动安装 + 崩溃重试)
201
+ └─ Plugin 服务(默认静态服务器;--dev 时为 webpack-dev-server
158
202
 
159
- 4. daemon 写入 PID 文件
203
+ 6. daemon 通过 IPC 发送 ready 信号给父进程
160
204
 
161
- 5. daemon 通过 IPC 发送 ready 信号给父进程
162
-
163
- 6. 父进程(CLI)收到 ready输出结果 → 退出
164
- ├─ 60 秒内未收到 → 超时失败
165
- └─ 收到 error → 启动失败
205
+ 7. 父进程(CLI)收到 ready 更新注册表 输出结果 → 退出
206
+ ├─ 60 秒内未收到 → 超时失败,释放槽位
207
+ └─ 收到 error启动失败,释放槽位
166
208
  ```
167
209
 
168
210
  ---
@@ -172,7 +214,7 @@ remnote-bridge --json connect
172
214
  - **默认模式秒级启动**:使用预构建 plugin,无需安装依赖
173
215
  - **`--dev` 模式首次较慢**:会自动安装 remnote-plugin 的依赖(约 600+ 个包),在 Windows 上可能需要 30-60 秒。connect 命令的超时为 60 秒
174
216
  - **`--dev` 依赖自动修复**:如果 webpack-dev-server 因依赖损坏而崩溃,daemon 会自动执行清洁重装(删除 node_modules + package-lock.json 后重新安装)并重试,最多重试 2 次,无需手动干预
175
- - **端口残留**:多次 connect 失败后可能出现端口被占用(`EADDRINUSE`),先执行 `remnote-bridge disconnect`,如仍有残留可通过 `netstat -ano | findstr 3002` 定位 PID 后 `taskkill /F /PID <pid>` 强制终止
217
+ - **端口残留**:多次 connect 失败后可能出现端口被占用(`EADDRINUSE`),先执行 `remnote-bridge disconnect`(或 `remnote-bridge clean` 清理所有实例),如仍有残留可通过 `netstat -ano | findstr 29100` 定位 PID 后 `taskkill /F /PID <pid>` 强制终止
176
218
 
177
219
  ---
178
220
 
@@ -180,7 +222,7 @@ remnote-bridge --json connect
180
222
 
181
223
  daemon 启动后开始计时,默认 **30 分钟无 CLI 交互**自动关闭(执行优雅 shutdown)。每次收到 CLI 请求时重置计时器。
182
224
 
183
- 超时时间可通过配置文件 `.remnote-bridge.json` 的 `daemonTimeoutMinutes` 字段调整。
225
+ 超时时间可通过配置文件 `~/.remnote-bridge/config.json` 的 `daemonTimeoutMinutes` 字段调整。
184
226
 
185
227
  ---
186
228
 
@@ -203,12 +245,11 @@ daemon 启动后开始计时,默认 **30 分钟无 CLI 交互**自动关闭(
203
245
 
204
246
  | 配置项 | 默认值 | 说明 |
205
247
  |--------|--------|------|
206
- | wsPort | 3002 | WS Server 监听端口 |
207
- | devServerPort | 8080 | Plugin 服务端口 |
208
- | configPort | 3003 | ConfigServer 端口 |
209
248
  | daemonTimeoutMinutes | 30 | 无活动自动关闭的分钟数 |
210
249
 
211
- 三个端口不允许冲突(配置加载时校验)。
250
+ 端口由槽位自动分配(29100/29110/29120/29130 系列),通过 `~/.remnote-bridge/slots.json` 自定义。
251
+
252
+ 配置文件位置:`~/.remnote-bridge/config.json`(全局配置,所有实例共享)。
212
253
 
213
254
  ---
214
255
 
@@ -216,5 +257,7 @@ daemon 启动后开始计时,默认 **30 分钟无 CLI 交互**自动关闭(
216
257
 
217
258
  | 文件 | 位置 | 生命周期 |
218
259
  |------|------|----------|
219
- | `.remnote-bridge.pid` | 项目根目录 | daemon 运行期间存在,关闭时删除 |
220
- | `.remnote-bridge.log` | 项目根目录 | 追加写入,跨会话保留 |
260
+ | `{slotIndex}.pid` | `~/.remnote-bridge/instances/` | daemon 运行期间存在,关闭时删除 |
261
+ | `{slotIndex}.log` | `~/.remnote-bridge/instances/` | 追加写入,跨会话保留 |
262
+ | `registry.json` | `~/.remnote-bridge/` | 记录实例→槽位映射,进程退出后自动清理 |
263
+ | `slots.json` | `~/.remnote-bridge/` | 槽位端口定义,不存在时自动生成默认值 |
@@ -6,14 +6,26 @@
6
6
 
7
7
  ## 功能
8
8
 
9
- `disconnect` 向守护进程发送 SIGTERM 信号,触发优雅关闭:
9
+ `disconnect` 向指定实例的守护进程发送 SIGTERM 信号,触发优雅关闭:
10
10
 
11
11
  1. 关闭 WS Server(断开所有连接)
12
12
  2. 关闭 ConfigServer
13
13
  3. 停止 Plugin 服务(静态文件服务器 或 webpack-dev-server)
14
- 4. 删除 PID 文件
14
+ 4. 删除 PID 文件,释放注册表槽位
15
15
  5. 内存缓存随进程退出自动消失
16
16
 
17
+ ### 多实例支持
18
+
19
+ 通过 `--instance <name>` 指定要停止的实例。不指定时停止 `default` 实例。
20
+
21
+ ```bash
22
+ # 停止默认实例
23
+ remnote-bridge disconnect
24
+
25
+ # 停止指定实例
26
+ remnote-bridge disconnect --instance work
27
+ ```
28
+
17
29
  ---
18
30
 
19
31
  ## 用法
@@ -48,9 +60,9 @@ remnote-bridge --json disconnect
48
60
  "ok": true,
49
61
  "command": "disconnect",
50
62
  "wasRunning": true,
63
+ "instance": "default",
51
64
  "pid": 12345,
52
- "forced": false,
53
- "timestamp": "2026-03-06T10:00:00.000Z"
65
+ "forced": false
54
66
  }
55
67
  ```
56
68
 
@@ -61,9 +73,9 @@ remnote-bridge --json disconnect
61
73
  "ok": true,
62
74
  "command": "disconnect",
63
75
  "wasRunning": true,
76
+ "instance": "work",
64
77
  "pid": 12345,
65
- "forced": true,
66
- "timestamp": "2026-03-06T10:00:00.000Z"
78
+ "forced": true
67
79
  }
68
80
  ```
69
81
 
@@ -74,7 +86,7 @@ remnote-bridge --json disconnect
74
86
  "ok": true,
75
87
  "command": "disconnect",
76
88
  "wasRunning": false,
77
- "timestamp": "2026-03-06T10:00:00.000Z"
89
+ "instance": "default"
78
90
  }
79
91
  ```
80
92
 
@@ -116,8 +128,9 @@ daemon 收到 SIGTERM 后依次执行:
116
128
  | **缓存清空** | 所有 `rem:*` 和 `tree:*` 缓存随 daemon 进程退出消失 |
117
129
  | **Plugin 断开** | WS 连接关闭,Plugin 进入重连循环(指数退避) |
118
130
  | **端口释放** | wsPort / devServerPort / configPort 全部释放 |
119
- | **PID 文件删除** | `.remnote-bridge.pid` 被删除 |
120
- | **日志保留** | `.remnote-bridge.log` 保留(追加写入,不删除) |
131
+ | **PID 文件删除** | `~/.remnote-bridge/instances/{slotIndex}.pid` 被删除 |
132
+ | **注册表释放** | 实例对应的槽位在 `registry.json` 中释放 |
133
+ | **日志保留** | `~/.remnote-bridge/instances/{slotIndex}.log` 保留 |
121
134
 
122
135
  ---
123
136