remnote-bridge 0.1.10 → 0.1.12
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 +3 -31
- package/dist/cli/commands/edit-tree.js +3 -20
- package/dist/cli/commands/health.js +19 -18
- package/dist/cli/commands/read-context.js +8 -23
- package/dist/cli/commands/read-globe.js +3 -20
- package/dist/cli/commands/read-rem.js +3 -31
- 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/context-read-handler.js +5 -3
- package/dist/cli/handlers/read-handler.js +4 -3
- package/dist/cli/handlers/tree-parser.js +16 -9
- package/dist/cli/main.js +51 -9
- 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/instructions.js +103 -10
- package/dist/mcp/resources/edit-rem-guide.js +3 -4
- package/dist/mcp/resources/error-reference.js +5 -3
- package/dist/mcp/resources/rem-object-fields.js +3 -3
- package/dist/mcp/tools/infra-tools.js +54 -6
- package/dist/mcp/tools/read-tools.js +16 -3
- 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/message-router.ts +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-context.ts +13 -4
- 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 +14 -9
- 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 +37 -9
- 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 +76 -21
- package/skills/remnote-bridge/instructions/read-context.md +34 -8
- package/skills/remnote-bridge/instructions/read-rem.md +10 -10
- package/skills/remnote-bridge/instructions/search.md +73 -14
- package/skills/remnote-bridge/instructions/setup.md +1 -1
|
@@ -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
|
|
|
@@ -348,9 +348,9 @@ edit-rem(remId, oldStr, newStr)
|
|
|
348
348
|
|
|
349
349
|
### 简化 JSON 作为操作目标
|
|
350
350
|
|
|
351
|
-
**问题**:缓存中存储完整 51 字段 JSON,但 AI 看到的是
|
|
351
|
+
**问题**:缓存中存储完整 51 字段 JSON,但 AI 看到的是 8 字段简化 JSON。oldStr 来自简化输出,在完整 JSON 上匹配不到。
|
|
352
352
|
|
|
353
|
-
**方案**:Portal 路径在**简化 JSON**(
|
|
353
|
+
**方案**:Portal 路径在**简化 JSON**(8 字段)上执行 str_replace:
|
|
354
354
|
|
|
355
355
|
1. 防线 1 + 2:不变(完整 JSON 对比)
|
|
356
356
|
2. **str_replace**:将缓存的完整 JSON 转换为简化 JSON,在简化 JSON 上执行 str_replace
|
|
@@ -635,21 +635,49 @@ newStr: "\"text\": [\n \"点击\",\n {\n \"i\": \"m\",\n \"iUrl
|
|
|
635
635
|
|
|
636
636
|
### 示例 4:修改高亮颜色(Rem 级别 vs RichText 级别)
|
|
637
637
|
|
|
638
|
-
|
|
638
|
+
#### ⚠️ highlightColor vs h — 两种完全不同的高亮
|
|
639
|
+
|
|
640
|
+
| 属性 | 位置 | 值类型 | 效果 | 修改方式 |
|
|
641
|
+
|:-----|:-----|:-------|:-----|:---------|
|
|
642
|
+
| `highlightColor` | RemObject 顶层字段 | 字符串 `"Red"`/`"Yellow"` 等,或 `null` | 整行背景色(左侧彩色竖条) | str_replace 顶层字段 |
|
|
643
|
+
| `h` | RichText 元素内部 | 数字 0-9 | 文字片段的荧光底色 | str_replace text 数组内的对象 |
|
|
644
|
+
|
|
645
|
+
#### RichText `h` 颜色值对照表(必须用数字,不是字符串)
|
|
646
|
+
|
|
647
|
+
| 值 | 颜色 | 值 | 颜色 | 值 | 颜色 |
|
|
648
|
+
|:---|:-----|:---|:-----|:---|:-----|
|
|
649
|
+
| 0 | 无(默认) | 4 | Green | 7 | Gray |
|
|
650
|
+
| 1 | Red | 5 | Purple | 8 | Brown |
|
|
651
|
+
| 2 | Orange | 6 | Blue | 9 | Pink |
|
|
652
|
+
| 3 | Yellow | — | — | — | — |
|
|
653
|
+
|
|
654
|
+
#### 4a. 设置/清除整行背景色(highlightColor)
|
|
639
655
|
|
|
640
656
|
```
|
|
657
|
+
// 设置为黄色背景
|
|
641
658
|
oldStr: "\"highlightColor\": null"
|
|
642
|
-
newStr: "\"highlightColor\": \"
|
|
659
|
+
newStr: "\"highlightColor\": \"Yellow\""
|
|
660
|
+
|
|
661
|
+
// 清除背景色
|
|
662
|
+
oldStr: "\"highlightColor\": \"Yellow\""
|
|
663
|
+
newStr: "\"highlightColor\": null"
|
|
643
664
|
```
|
|
644
665
|
|
|
645
|
-
|
|
666
|
+
#### 4b. 给文字加/去荧光底色(RichText h 字段)
|
|
667
|
+
|
|
668
|
+
先 read_rem 找到 text 数组中目标文字对象的精确 JSON。用 `h` 值旁边的 `"i"` 和 `"text"` 字段一起匹配,确保唯一。
|
|
646
669
|
|
|
647
670
|
```
|
|
648
|
-
|
|
649
|
-
|
|
671
|
+
// "Todo List" 文字加黄色荧光(h: 0 → 3)
|
|
672
|
+
oldStr: "\"h\": 0,\n \"i\": \"m\",\n \"text\": \"Todo List \""
|
|
673
|
+
newStr: "\"h\": 3,\n \"i\": \"m\",\n \"text\": \"Todo List \""
|
|
674
|
+
|
|
675
|
+
// 去掉荧光(h: 3 → 0)
|
|
676
|
+
oldStr: "\"h\": 3,\n \"i\": \"m\",\n \"text\": \"Todo List \""
|
|
677
|
+
newStr: "\"h\": 0,\n \"i\": \"m\",\n \"text\": \"Todo List \""
|
|
650
678
|
```
|
|
651
679
|
|
|
652
|
-
|
|
680
|
+
⚠️ **关键**:oldStr 中必须包含足够的上下文(如 `"i": "m"` 和 `"text": "..."`)来唯一定位。不能只写 `"h": 0` — 可能匹配到多处。
|
|
653
681
|
|
|
654
682
|
### 示例 5:添加完形填空
|
|
655
683
|
|
|
@@ -714,5 +742,5 @@ newStr: "\"text\": [\n \"光合作用需要\",\n {\n \"cId\": \"cloz
|
|
|
714
742
|
| `invalid JSON` | 替换后的文本不是合法 JSON | 检查 newStr 的引号、逗号、括号完整性 |
|
|
715
743
|
| `Failed to update field` | SDK setter 调用失败 | 检查字段值是否在允许范围内(如 type 不能设为 portal) |
|
|
716
744
|
| `Field '...' is read-only and was ignored` | 修改了只读字段 | 该字段只能读取,不可通过 edit-rem 修改 |
|
|
717
|
-
| `old_str not found in the simplified Portal JSON` | Portal 编辑时 oldStr 在简化 JSON 中不匹配 | 检查 oldStr 是否匹配
|
|
745
|
+
| `old_str not found in the simplified Portal JSON` | Portal 编辑时 oldStr 在简化 JSON 中不匹配 | 检查 oldStr 是否匹配 8 字段简化 JSON 格式(而非完整 51 字段 JSON) |
|
|
718
746
|
| `守护进程未运行` | daemon 未启动 | 执行 `remnote-bridge connect` |
|
|
@@ -6,11 +6,19 @@
|
|
|
6
6
|
|
|
7
7
|
## 功能
|
|
8
8
|
|
|
9
|
-
`health`
|
|
9
|
+
`health` 分两步检查指定实例的系统状态:
|
|
10
10
|
|
|
11
|
-
1.
|
|
11
|
+
1. **本地检查**:通过注册表查找实例,确认 daemon 进程是否存活
|
|
12
12
|
2. **远程检查**:通过 WS 连接 daemon,获取 Plugin 连接状态和 SDK 就绪状态
|
|
13
13
|
|
|
14
|
+
### 多实例支持
|
|
15
|
+
|
|
16
|
+
通过 `--instance <name>` 指定要检查的实例。不指定时检查 `default` 实例。
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
remnote-bridge health --instance work
|
|
20
|
+
```
|
|
21
|
+
|
|
14
22
|
---
|
|
15
23
|
|
|
16
24
|
## 用法
|
|
@@ -24,7 +32,7 @@ remnote-bridge health
|
|
|
24
32
|
输出示例(全部健康):
|
|
25
33
|
|
|
26
34
|
```
|
|
27
|
-
✅ 守护进程 运行中(PID: 12345,已运行 5 分钟)
|
|
35
|
+
✅ 守护进程 运行中(PID: 12345,实例: default,槽位: 0,已运行 5 分钟)
|
|
28
36
|
✅ Plugin 已连接
|
|
29
37
|
✅ SDK 就绪
|
|
30
38
|
|
|
@@ -34,7 +42,7 @@ remnote-bridge health
|
|
|
34
42
|
输出示例(部分不健康):
|
|
35
43
|
|
|
36
44
|
```
|
|
37
|
-
✅ 守护进程 运行中(PID: 12345,已运行 2 分钟)
|
|
45
|
+
✅ 守护进程 运行中(PID: 12345,实例: work,槽位: 1,已运行 2 分钟)
|
|
38
46
|
❌ Plugin 未连接
|
|
39
47
|
❌ SDK 未就绪
|
|
40
48
|
|
|
@@ -80,11 +88,12 @@ remnote-bridge health --reload
|
|
|
80
88
|
"ok": true,
|
|
81
89
|
"command": "health",
|
|
82
90
|
"exitCode": 0,
|
|
91
|
+
"instance": "default",
|
|
92
|
+
"slotIndex": 0,
|
|
83
93
|
"daemon": { "running": true, "pid": 12345, "reachable": true, "uptime": 300 },
|
|
84
94
|
"plugin": { "connected": true },
|
|
85
95
|
"sdk": { "ready": true },
|
|
86
|
-
"timeoutRemaining": 1500
|
|
87
|
-
"timestamp": "2026-03-06T10:00:00.000Z"
|
|
96
|
+
"timeoutRemaining": 1500
|
|
88
97
|
}
|
|
89
98
|
```
|
|
90
99
|
|
|
@@ -95,11 +104,12 @@ remnote-bridge health --reload
|
|
|
95
104
|
"ok": false,
|
|
96
105
|
"command": "health",
|
|
97
106
|
"exitCode": 1,
|
|
107
|
+
"instance": "work",
|
|
108
|
+
"slotIndex": 1,
|
|
98
109
|
"daemon": { "running": true, "pid": 12345, "reachable": true, "uptime": 120 },
|
|
99
110
|
"plugin": { "connected": false },
|
|
100
111
|
"sdk": { "ready": false },
|
|
101
|
-
"timeoutRemaining": 1680
|
|
102
|
-
"timestamp": "2026-03-06T10:00:00.000Z"
|
|
112
|
+
"timeoutRemaining": 1680
|
|
103
113
|
}
|
|
104
114
|
```
|
|
105
115
|
|
|
@@ -110,10 +120,10 @@ remnote-bridge health --reload
|
|
|
110
120
|
"ok": false,
|
|
111
121
|
"command": "health",
|
|
112
122
|
"exitCode": 2,
|
|
123
|
+
"instance": "default",
|
|
113
124
|
"daemon": { "running": false },
|
|
114
125
|
"plugin": { "connected": false },
|
|
115
|
-
"sdk": { "ready": false }
|
|
116
|
-
"timestamp": "2026-03-06T10:00:00.000Z"
|
|
126
|
+
"sdk": { "ready": false }
|
|
117
127
|
}
|
|
118
128
|
```
|
|
119
129
|
|
|
@@ -123,7 +133,7 @@ remnote-bridge health --reload
|
|
|
123
133
|
|
|
124
134
|
| 检查项 | 检查方式 | 含义 |
|
|
125
135
|
|--------|----------|------|
|
|
126
|
-
| **daemon** |
|
|
136
|
+
| **daemon** | 注册表查找 + `kill(pid, 0)` 探活 | 守护进程是否在运行且可达 |
|
|
127
137
|
| **plugin** | daemon 内部的 `pluginConnected` 状态 | RemNote Plugin 是否已通过 WS 连接到 daemon |
|
|
128
138
|
| **sdk** | Plugin 的 hello 握手中的 `sdkReady` 字段 | RemNote SDK 是否就绪(知识库已加载,可调用 API) |
|
|
129
139
|
|
|
@@ -179,7 +189,7 @@ headless 模式下 `health` 基础输出额外包含 `headless` 对象:
|
|
|
179
189
|
"headless": {
|
|
180
190
|
"status": "running",
|
|
181
191
|
"chromeConnected": true,
|
|
182
|
-
"pageUrl": "http://localhost:
|
|
192
|
+
"pageUrl": "http://localhost:29101",
|
|
183
193
|
"reloadCount": 0,
|
|
184
194
|
"lastError": null,
|
|
185
195
|
"recentConsoleErrors": []
|
|
@@ -218,7 +228,7 @@ headless 模式下 `health` 基础输出额外包含 `headless` 对象:
|
|
|
218
228
|
| 症状 | 可能原因 | 解决方案 |
|
|
219
229
|
|------|----------|----------|
|
|
220
230
|
| daemon 未运行 | 未执行 connect / 已超时关闭 | 执行 `connect` |
|
|
221
|
-
| daemon 运行但不可达 | WS 端口被占用或配置不匹配 | 检查
|
|
231
|
+
| daemon 运行但不可达 | WS 端口被占用或配置不匹配 | 检查 `~/.remnote-bridge/slots.json` 中的端口配置 |
|
|
222
232
|
| Plugin 未连接(标准模式) | RemNote 未打开 / Plugin 未安装 / URL 不匹配 | 打开 RemNote,确认 Plugin 中的 WS URL 设置 |
|
|
223
233
|
| Plugin 未连接(headless 模式) | Chrome 页面加载异常 | `health --diagnose` 查看截图和状态,`health --reload` 重载页面 |
|
|
224
234
|
| SDK 未就绪 | 知识库加载中 / Plugin 异常 | 等待几秒后重试,或刷新 RemNote 页面 |
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# install-skill
|
|
2
|
+
|
|
3
|
+
> 将 remnote-bridge Skill 安装到 AI Agent 环境中。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 功能
|
|
8
|
+
|
|
9
|
+
`install-skill` 将 Skill 文档(SKILL.md + instructions/*.md)安装到 AI Agent 可发现的位置。支持两种安装方式:
|
|
10
|
+
|
|
11
|
+
| 方式 | 说明 |
|
|
12
|
+
|:-----|:-----|
|
|
13
|
+
| Vercel Skills CLI(默认) | 通过 `npx skills add` 安装,适用于支持 Vercel Skills 生态的 Agent |
|
|
14
|
+
| Claude Code 直接复制(fallback) | 将文件复制到 `~/.claude/skills/remnote-bridge/`,仅适用于 Claude Code |
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 用法
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
# 通过 Vercel Skills CLI 安装(推荐)
|
|
22
|
+
remnote-bridge install-skill
|
|
23
|
+
|
|
24
|
+
# 直接复制到 Claude Code skills 目录
|
|
25
|
+
remnote-bridge install-skill-copy
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 安装逻辑
|
|
31
|
+
|
|
32
|
+
### install-skill
|
|
33
|
+
|
|
34
|
+
1. 检测 `npx` 是否可用
|
|
35
|
+
2. 可用 → 执行 `npx skills add baobao700508/unofficial-remnote-bridge-cli -s remnote-bridge`
|
|
36
|
+
3. 不可用或执行失败 → 自动 fallback 到文件复制模式
|
|
37
|
+
|
|
38
|
+
### install-skill-copy
|
|
39
|
+
|
|
40
|
+
直接将 Skill 文件从 npm 包内复制到 `~/.claude/skills/remnote-bridge/`:
|
|
41
|
+
- `SKILL.md`
|
|
42
|
+
- `instructions/*.md`(所有 Markdown 文件)
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## 退出码
|
|
47
|
+
|
|
48
|
+
| 退出码 | 含义 |
|
|
49
|
+
|:-------|:-----|
|
|
50
|
+
| 0 | 安装成功 |
|
|
51
|
+
| 1 | 安装失败(找不到源文件、权限不足等) |
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## AI Agent 注意事项
|
|
56
|
+
|
|
57
|
+
- 此命令通常由用户在初始设置时手动执行,Agent 一般不需要调用
|
|
58
|
+
- 安装完成后,Agent 即可通过 Skill 接口发现和使用 remnote-bridge 功能
|