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.
- package/dist/cli/addon/addon-manager.js +163 -0
- package/dist/cli/addon/registry.js +24 -0
- package/dist/cli/commands/addon.js +149 -0
- package/dist/cli/commands/clean.js +121 -52
- package/dist/cli/commands/connect.js +72 -33
- package/dist/cli/commands/disconnect.js +19 -19
- package/dist/cli/commands/edit-rem.js +8 -36
- package/dist/cli/commands/edit-tree.js +3 -20
- package/dist/cli/commands/health.js +19 -18
- package/dist/cli/commands/read-context.js +3 -20
- package/dist/cli/commands/read-globe.js +3 -20
- package/dist/cli/commands/read-rem.js +6 -32
- package/dist/cli/commands/read-tree.js +3 -20
- package/dist/cli/commands/search.js +97 -21
- package/dist/cli/config.js +148 -72
- package/dist/cli/daemon/daemon.js +104 -24
- package/dist/cli/daemon/dev-server.js +9 -1
- package/dist/cli/daemon/pid.js +36 -22
- package/dist/cli/daemon/registry.js +160 -0
- package/dist/cli/daemon/send-request.js +11 -11
- package/dist/cli/daemon/static-server.js +97 -34
- package/dist/cli/handlers/edit-handler.js +49 -140
- package/dist/cli/handlers/read-handler.js +9 -9
- package/dist/cli/handlers/rem-cache.js +10 -5
- package/dist/cli/handlers/tree-parser.js +16 -9
- package/dist/cli/main.js +67 -19
- package/dist/cli/protocol.js +18 -4
- package/dist/cli/server/config-server.js +280 -14
- package/dist/cli/server/ws-server.js +93 -44
- package/dist/cli/utils/output.js +29 -0
- package/dist/mcp/format.js +43 -0
- package/dist/mcp/index.js +0 -55
- package/dist/mcp/instructions.js +424 -216
- package/dist/mcp/resources/edit-rem-guide.js +37 -158
- package/dist/mcp/resources/edit-tree-guide.js +1 -1
- package/dist/mcp/resources/error-reference.js +9 -13
- package/dist/mcp/resources/rem-object-fields.js +6 -6
- package/dist/mcp/tools/edit-tools.js +69 -8
- package/dist/mcp/tools/infra-tools.js +44 -8
- package/dist/mcp/tools/read-tools.js +136 -20
- package/package.json +2 -2
- package/remnote-plugin/dist/bridge_widget-sandbox.js +17 -17
- package/remnote-plugin/dist/bridge_widget.js +17 -17
- package/remnote-plugin/dist/index-sandbox.js +31 -31
- package/remnote-plugin/dist/index.js +31 -31
- package/remnote-plugin/dist/manifest.json +1 -1
- package/remnote-plugin/package.json +1 -1
- package/remnote-plugin/public/manifest.json +1 -1
- package/remnote-plugin/src/bridge/multi-connection-manager.ts +151 -0
- package/remnote-plugin/src/bridge/websocket-client.ts +62 -16
- package/remnote-plugin/src/services/index.ts +0 -8
- package/remnote-plugin/src/services/read-rem.ts +1 -9
- package/remnote-plugin/src/services/search.ts +13 -10
- package/remnote-plugin/src/settings.ts +9 -7
- package/remnote-plugin/src/utils/index.ts +0 -5
- package/remnote-plugin/src/widgets/bridge_widget.tsx +105 -20
- package/remnote-plugin/src/widgets/index.tsx +41 -44
- package/remnote-plugin/webpack.config.js +35 -0
- package/skills/remnote-bridge/SKILL.md +45 -40
- package/skills/remnote-bridge/instructions/addon.md +134 -0
- package/skills/remnote-bridge/instructions/clean.md +110 -0
- package/skills/remnote-bridge/instructions/connect.md +80 -37
- package/skills/remnote-bridge/instructions/disconnect.md +22 -9
- package/skills/remnote-bridge/instructions/edit-rem.md +113 -327
- package/skills/remnote-bridge/instructions/health.md +23 -13
- package/skills/remnote-bridge/instructions/install-skill.md +58 -0
- package/skills/remnote-bridge/instructions/overall.md +99 -35
- package/skills/remnote-bridge/instructions/read-rem.md +15 -15
- package/skills/remnote-bridge/instructions/search.md +77 -18
- 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 |
|
|
14
|
-
| Plugin 服务 |
|
|
15
|
-
| ConfigServer |
|
|
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. 在输入框中填入
|
|
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
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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":
|
|
111
|
-
"devServerPort":
|
|
112
|
-
"configPort":
|
|
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":
|
|
127
|
-
"devServerPort":
|
|
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": "
|
|
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.
|
|
149
|
-
|
|
150
|
-
|
|
186
|
+
1. 解析实例名(--instance / 环境变量 / 默认 'default')
|
|
187
|
+
|
|
188
|
+
2. 加载注册表,清理过期槽位
|
|
189
|
+
├─ 实例已在运行 → 返回 ok + alreadyRunning: true
|
|
190
|
+
└─ 未运行 → 继续
|
|
191
|
+
|
|
192
|
+
3. 分配槽位(第一个空闲槽位)
|
|
193
|
+
├─ 无空闲 → 报错 "已达最大实例数上限(4)"
|
|
194
|
+
└─ 有空闲 → 占位
|
|
151
195
|
|
|
152
|
-
|
|
196
|
+
4. fork 守护进程(detached, 传入 SLOT_INDEX / SLOT_WS_PORT 等环境变量)
|
|
153
197
|
|
|
154
|
-
|
|
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
|
-
|
|
203
|
+
6. daemon 通过 IPC 发送 ready 信号给父进程
|
|
160
204
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
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
|
|
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
|
-
超时时间可通过配置文件
|
|
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
|
-
|
|
|
220
|
-
|
|
|
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`
|
|
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
|
-
"
|
|
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 文件删除** |
|
|
120
|
-
|
|
|
131
|
+
| **PID 文件删除** | `~/.remnote-bridge/instances/{slotIndex}.pid` 被删除 |
|
|
132
|
+
| **注册表释放** | 实例对应的槽位在 `registry.json` 中释放 |
|
|
133
|
+
| **日志保留** | `~/.remnote-bridge/instances/{slotIndex}.log` 保留 |
|
|
121
134
|
|
|
122
135
|
---
|
|
123
136
|
|