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.
Files changed (68) 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 +3 -31
  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 +8 -23
  11. package/dist/cli/commands/read-globe.js +3 -20
  12. package/dist/cli/commands/read-rem.js +3 -31
  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/context-read-handler.js +5 -3
  23. package/dist/cli/handlers/read-handler.js +4 -3
  24. package/dist/cli/handlers/tree-parser.js +16 -9
  25. package/dist/cli/main.js +51 -9
  26. package/dist/cli/protocol.js +18 -4
  27. package/dist/cli/server/config-server.js +280 -14
  28. package/dist/cli/server/ws-server.js +93 -44
  29. package/dist/cli/utils/output.js +29 -0
  30. package/dist/mcp/instructions.js +103 -10
  31. package/dist/mcp/resources/edit-rem-guide.js +3 -4
  32. package/dist/mcp/resources/error-reference.js +5 -3
  33. package/dist/mcp/resources/rem-object-fields.js +3 -3
  34. package/dist/mcp/tools/infra-tools.js +54 -6
  35. package/dist/mcp/tools/read-tools.js +16 -3
  36. package/package.json +2 -2
  37. package/remnote-plugin/dist/bridge_widget-sandbox.js +17 -17
  38. package/remnote-plugin/dist/bridge_widget.js +17 -17
  39. package/remnote-plugin/dist/index-sandbox.js +31 -31
  40. package/remnote-plugin/dist/index.js +31 -31
  41. package/remnote-plugin/dist/manifest.json +1 -1
  42. package/remnote-plugin/package.json +1 -1
  43. package/remnote-plugin/public/manifest.json +1 -1
  44. package/remnote-plugin/src/bridge/message-router.ts +1 -1
  45. package/remnote-plugin/src/bridge/multi-connection-manager.ts +151 -0
  46. package/remnote-plugin/src/bridge/websocket-client.ts +62 -16
  47. package/remnote-plugin/src/services/index.ts +0 -8
  48. package/remnote-plugin/src/services/read-context.ts +13 -4
  49. package/remnote-plugin/src/services/read-rem.ts +1 -9
  50. package/remnote-plugin/src/services/search.ts +13 -10
  51. package/remnote-plugin/src/settings.ts +9 -7
  52. package/remnote-plugin/src/utils/index.ts +0 -5
  53. package/remnote-plugin/src/widgets/bridge_widget.tsx +105 -20
  54. package/remnote-plugin/src/widgets/index.tsx +41 -44
  55. package/remnote-plugin/webpack.config.js +35 -0
  56. package/skills/remnote-bridge/SKILL.md +14 -9
  57. package/skills/remnote-bridge/instructions/addon.md +134 -0
  58. package/skills/remnote-bridge/instructions/clean.md +110 -0
  59. package/skills/remnote-bridge/instructions/connect.md +80 -37
  60. package/skills/remnote-bridge/instructions/disconnect.md +22 -9
  61. package/skills/remnote-bridge/instructions/edit-rem.md +37 -9
  62. package/skills/remnote-bridge/instructions/health.md +23 -13
  63. package/skills/remnote-bridge/instructions/install-skill.md +58 -0
  64. package/skills/remnote-bridge/instructions/overall.md +76 -21
  65. package/skills/remnote-bridge/instructions/read-context.md +34 -8
  66. package/skills/remnote-bridge/instructions/read-rem.md +10 -10
  67. package/skills/remnote-bridge/instructions/search.md +73 -14
  68. 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 | 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
 
@@ -348,9 +348,9 @@ edit-rem(remId, oldStr, newStr)
348
348
 
349
349
  ### 简化 JSON 作为操作目标
350
350
 
351
- **问题**:缓存中存储完整 51 字段 JSON,但 AI 看到的是 9 字段简化 JSON。oldStr 来自简化输出,在完整 JSON 上匹配不到。
351
+ **问题**:缓存中存储完整 51 字段 JSON,但 AI 看到的是 8 字段简化 JSON。oldStr 来自简化输出,在完整 JSON 上匹配不到。
352
352
 
353
- **方案**:Portal 路径在**简化 JSON**(9 字段)上执行 str_replace:
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
- **Rem 级别的 `highlightColor`**(整行背景色,值为英文字符串):
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\": \"Red\""
659
+ newStr: "\"highlightColor\": \"Yellow\""
660
+
661
+ // 清除背景色
662
+ oldStr: "\"highlightColor\": \"Yellow\""
663
+ newStr: "\"highlightColor\": null"
643
664
  ```
644
665
 
645
- **RichText 级别的 `h`**(行内文字高亮,值为数字 0-9):
666
+ #### 4b. 给文字加/去荧光底色(RichText h 字段)
667
+
668
+ 先 read_rem 找到 text 数组中目标文字对象的精确 JSON。用 `h` 值旁边的 `"i"` 和 `"text"` 字段一起匹配,确保唯一。
646
669
 
647
670
  ```
648
- oldStr: "\"text\": [\n \"普通文本\"\n ]"
649
- newStr: "\"text\": [\n {\n \"h\": 1,\n \"i\": \"m\",\n \"text\": \"红色高亮文本\"\n }\n ]"
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
- > **区分**:`highlightColor` RemObject 顶层字段,值为字符串(`"Red"`, `"Blue"` 等);RichText `h` 是行内格式标记,值为数字(1=Red, 2=Orange 等,见 RemColor 枚举)。
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 是否匹配 9 字段简化 JSON 格式(而非完整 51 字段 JSON) |
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. **本地检查**:读取 PID 文件,确认 daemon 进程是否存活
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** | PID 文件 + `kill(pid, 0)` 探活 | 守护进程是否在运行且可达 |
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:8080",
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 端口被占用或配置不匹配 | 检查 `.remnote-bridge.json` 中的 `wsPort` |
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 功能