remnote-bridge 0.1.7 → 0.1.8

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.
@@ -0,0 +1,22 @@
1
+ {
2
+ "manifestVersion": 1,
3
+ "id": "unofficial_remnote_bridge",
4
+ "name": "Unofficial RemNote Bridge",
5
+ "author": "baobao700508",
6
+ "repoUrl": "https://github.com/baobao700508/unofficial-remnote-bridge-cli",
7
+ "version": {
8
+ "major": 0,
9
+ "minor": 1,
10
+ "patch": 0
11
+ },
12
+ "theme": [],
13
+ "enableOnMobile": false,
14
+ "description": "Unofficial RemNote Bridge 桥接插件:通过 WebSocket 将 RemNote API 暴露给外部 CLI/MCP 调用",
15
+ "requestNative": false,
16
+ "requiredScopes": [
17
+ {
18
+ "type": "All",
19
+ "level": "ReadCreateModifyDelete"
20
+ }
21
+ ]
22
+ }
@@ -11,6 +11,7 @@ description: "RemNote 知识库操作指南。通过 remnote-bridge 命令行工
11
11
 
12
12
  | 命令 | 文档路径 |
13
13
  |:-----|:---------|
14
+ | setup | `instructions/setup.md` |
14
15
  | connect | `instructions/connect.md` |
15
16
  | disconnect | `instructions/disconnect.md` |
16
17
  | health | `instructions/health.md` |
@@ -246,15 +247,15 @@ Rem 的属性(文本、类型、格式、标签) → edit-rem (前置
246
247
 
247
248
  ## 3. 标准工作流
248
249
 
249
- ### ⚠️ connect 后需要用户配合(重要)
250
+ ### ⚠️ 标准模式:connect 后需要用户配合
250
251
 
251
- `connect` 成功只意味着 daemon 和 webpack-dev-server 已启动,**Plugin 并未自动连接**。用户必须在 RemNote 中完成操作,Plugin 才能连接到 daemon:
252
+ `connect` 成功只意味着 daemon 和 Plugin 服务已启动,**Plugin 并未自动连接**。用户必须在 RemNote 中完成操作,Plugin 才能连接到 daemon:
252
253
 
253
254
  **首次使用**(RemNote 从未加载过此插件):
254
255
  1. 打开 RemNote 桌面端或网页端
255
256
  2. 点击左侧边栏底部的插件图标(拼图形状)
256
257
  3. 点击「开发你的插件」(Develop Your Plugin)
257
- 4. 在输入框中填入 `http://localhost:8080`(即 connect 输出的 webpack-dev-server 地址)
258
+ 4. 在输入框中填入 `http://localhost:8080`(即 connect 输出的 Plugin 服务地址)
258
259
  5. 等待插件加载完成
259
260
 
260
261
  **非首次使用**(之前已加载过此插件):
@@ -262,7 +263,50 @@ Rem 的属性(文本、类型、格式、标签) → edit-rem (前置
262
263
 
263
264
  **你必须**:执行 `connect` 后,**立即告知用户需要完成上述操作**,不要直接调用业务命令。引导用户完成后,用 `health` 确认三层就绪再继续。
264
265
 
265
- ### 完整流程
266
+ ### Headless 模式:自动连接
267
+
268
+ 标准模式每次 connect 后都需要用户手动操作 RemNote。Headless 模式通过 setup(一次性)+ headless Chrome 实现自动连接,后续 connect 无需用户介入。
269
+
270
+ #### 首次使用(setup)
271
+
272
+ setup 会弹出 Chrome 窗口,用户需要完成两件事:
273
+ 1. **登录 RemNote**
274
+ 2. **配置 dev plugin**:插件图标 → 开发你的插件 → 填入 `http://localhost:8080`
275
+
276
+ 完成后**彻底退出 Chrome**(macOS 必须 Cmd+Q,仅关窗口不够)。
277
+
278
+ **Agent 交互方式**:
279
+ ```
280
+ 1. 调用 setup
281
+ 2. 立即告知用户:
282
+ "已打开 Chrome 浏览器。请完成以下操作:
283
+ 1. 登录 RemNote
284
+ 2. 在 RemNote 中配置开发插件:点击左下角插件图标 → 开发你的插件 → 输入 http://localhost:8080
285
+ 3. 完成后彻底退出 Chrome(macOS 请按 Cmd+Q)"
286
+ 3. 等待 setup 返回(阻塞,最长 10 分钟)
287
+ 4. 成功 → 进入下一步 connect --headless
288
+ ```
289
+
290
+ setup 只需执行一次。之后每次连接直接用 `connect --headless`。
291
+
292
+ #### 后续使用(connect --headless)
293
+
294
+ ```
295
+ 1. connect --headless -- 启动 daemon + headless Chrome 自动加载 RemNote 和 Plugin
296
+ 2. health -- 等待三层就绪(Plugin 需要 10-30 秒连接,可多次轮询)
297
+ 3. 业务操作
298
+ 4. disconnect -- 结束会话
299
+ ```
300
+
301
+ **无需任何用户操作**——headless Chrome 在后台自动完成登录和 Plugin 加载。
302
+
303
+ #### 排查
304
+
305
+ - `health --diagnose`:截图 + Chrome 状态 + console 错误(确认页面是否正常加载)
306
+ - `health --reload`:重载 headless Chrome 页面(Plugin 未连接时尝试)
307
+ - 如果 Plugin 始终不连接,可能是 RemNote 登录 session 过期,需重新 setup
308
+
309
+ ### 完整流程(标准模式)
266
310
 
267
311
  ```
268
312
  1. connect -- 启动会话(幂等,重复调用安全)
@@ -11,23 +11,52 @@
11
11
  | 服务 | 默认端口 | 用途 |
12
12
  |------|----------|------|
13
13
  | WS Server | 3002 | CLI 命令 ↔ daemon ↔ Plugin 的双向通信 |
14
- | webpack-dev-server | 8080 | 将 remnote-plugin 热加载到 RemNote 浏览器 |
14
+ | Plugin 服务 | 8080 | 将 remnote-plugin 加载到 RemNote 浏览器(默认静态服务器,`--dev` 时为 webpack-dev-server) |
15
15
  | ConfigServer | 3003 | HTTP 配置管理界面 |
16
16
 
17
17
  daemon 启动后脱离父进程(detached),CLI 进程退出但 daemon 继续运行。
18
18
 
19
19
  ---
20
20
 
21
- ## ⚠️ connect 后需要用户配合
21
+ ## 两种模式
22
22
 
23
- `connect` 成功只意味着 daemon 和 webpack-dev-server 已启动,**Plugin 并未自动连接**。用户必须在 RemNote 中完成以下操作:
23
+ ### 标准模式(默认)
24
+
25
+ 启动 daemon 后需要用户手动在 RemNote 中加载 Plugin。适用于用户已打开 RemNote 的场景。
26
+
27
+ ### Headless 模式(`--headless`)
28
+
29
+ 自动启动 headless Chrome 加载 Plugin,无需用户操作。适用于无 GUI 环境或全自动连接场景。
30
+
31
+ **前置条件**:必须先执行 `setup` 完成 RemNote 登录。
32
+
33
+ ```bash
34
+ # 首次:先 setup 登录
35
+ remnote-bridge setup
36
+
37
+ # 然后启动 headless 连接
38
+ remnote-bridge connect --headless
39
+
40
+ # JSON 模式
41
+ remnote-bridge --json connect --headless
42
+ ```
43
+
44
+ Headless 模式下 Plugin 可能需要 10-30 秒才能连接到 daemon,使用 `health` 确认就绪。
45
+
46
+ 排查工具:`health --diagnose`(截图+状态+console 错误)、`health --reload`(重载 Chrome 页面)。
47
+
48
+ ---
49
+
50
+ ## ⚠️ 标准模式:connect 后需要用户配合
51
+
52
+ `connect`(不传 `--headless`)成功只意味着 daemon 和 Plugin 服务已启动,**Plugin 并未自动连接**。用户必须在 RemNote 中完成以下操作:
24
53
 
25
54
  ### 首次使用(RemNote 从未加载过此插件)
26
55
 
27
56
  1. 打开 RemNote 桌面端或网页端
28
57
  2. 点击左侧边栏底部的插件图标(拼图形状)
29
58
  3. 点击「开发你的插件」(Develop Your Plugin)
30
- 4. 在输入框中填入 `http://localhost:8080`(即 connect 输出的 webpack-dev-server 地址)
59
+ 4. 在输入框中填入 `http://localhost:8080`(即 connect 输出的 Plugin 服务地址)
31
60
  5. 等待插件加载完成
32
61
 
33
62
  ### 非首次使用(之前已加载过此插件)
@@ -55,7 +84,7 @@ remnote-bridge connect
55
84
  ```
56
85
  守护进程已启动(PID: 12345)
57
86
  WS Server: ws://127.0.0.1:3002
58
- webpack-dev-server: http://localhost:8080
87
+ Plugin 服务: http://localhost:8080
59
88
  配置页面: http://127.0.0.1:3003
60
89
  超时: 30 分钟无 CLI 交互后自动关闭
61
90
  ```
@@ -125,7 +154,7 @@ remnote-bridge --json connect
125
154
  3. daemon 内部按顺序启动:
126
155
  ├─ WS Server(必须成功,否则 daemon 退出)
127
156
  ├─ ConfigServer(非关键,失败不阻塞)
128
- └─ webpack-dev-server(含依赖自动安装 + 崩溃重试)
157
+ └─ Plugin 服务(默认静态服务器;--dev 时为 webpack-dev-server + 依赖自动安装 + 崩溃重试)
129
158
 
130
159
  4. daemon 写入 PID 文件
131
160
 
@@ -140,8 +169,9 @@ remnote-bridge --json connect
140
169
 
141
170
  ## Windows 注意事项
142
171
 
143
- - **首次 connect 较慢**:daemon 启动时会自动安装 remnote-plugin 的依赖(约 600+ 个包),在 Windows 上可能需要 30-60 秒。connect 命令的超时为 60 秒
144
- - **依赖自动修复**:如果 webpack-dev-server 因依赖损坏而崩溃,daemon 会自动执行清洁重装(删除 node_modules + package-lock.json 后重新安装)并重试,最多重试 2 次,无需手动干预
172
+ - **默认模式秒级启动**:使用预构建 plugin,无需安装依赖
173
+ - **`--dev` 模式首次较慢**:会自动安装 remnote-plugin 的依赖(约 600+ 个包),在 Windows 上可能需要 30-60 秒。connect 命令的超时为 60 秒
174
+ - **`--dev` 依赖自动修复**:如果 webpack-dev-server 因依赖损坏而崩溃,daemon 会自动执行清洁重装(删除 node_modules + package-lock.json 后重新安装)并重试,最多重试 2 次,无需手动干预
145
175
  - **端口残留**:多次 connect 失败后可能出现端口被占用(`EADDRINUSE`),先执行 `remnote-bridge disconnect`,如仍有残留可通过 `netstat -ano | findstr 3002` 定位 PID 后 `taskkill /F /PID <pid>` 强制终止
146
176
 
147
177
  ---
@@ -165,7 +195,7 @@ daemon 启动后开始计时,默认 **30 分钟无 CLI 交互**自动关闭(
165
195
  | 退出码 | 含义 |
166
196
  |--------|------|
167
197
  | 0 | 启动成功,或已在运行 |
168
- | 1 | 启动失败(超时、端口冲突、webpack-dev-server 异常等) |
198
+ | 1 | 启动失败(超时、端口冲突、Plugin 服务异常等) |
169
199
 
170
200
  ---
171
201
 
@@ -174,7 +204,7 @@ daemon 启动后开始计时,默认 **30 分钟无 CLI 交互**自动关闭(
174
204
  | 配置项 | 默认值 | 说明 |
175
205
  |--------|--------|------|
176
206
  | wsPort | 3002 | WS Server 监听端口 |
177
- | devServerPort | 8080 | webpack-dev-server 端口 |
207
+ | devServerPort | 8080 | Plugin 服务端口 |
178
208
  | configPort | 3003 | ConfigServer 端口 |
179
209
  | daemonTimeoutMinutes | 30 | 无活动自动关闭的分钟数 |
180
210
 
@@ -10,7 +10,7 @@
10
10
 
11
11
  1. 关闭 WS Server(断开所有连接)
12
12
  2. 关闭 ConfigServer
13
- 3. 停止 webpack-dev-server 子进程
13
+ 3. 停止 Plugin 服务(静态文件服务器 或 webpack-dev-server
14
14
  4. 删除 PID 文件
15
15
  5. 内存缓存随进程退出自动消失
16
16
 
@@ -57,6 +57,18 @@ remnote-bridge health
57
57
  remnote-bridge --json health
58
58
  ```
59
59
 
60
+ ### Headless 诊断模式
61
+
62
+ ```bash
63
+ # 截图 + 详细状态 + console 错误 + 排查建议
64
+ remnote-bridge health --diagnose
65
+
66
+ # 重载 headless Chrome 页面
67
+ remnote-bridge health --reload
68
+ ```
69
+
70
+ `--diagnose` 和 `--reload` 不能同时使用,仅在 headless 模式下可用。
71
+
60
72
  ---
61
73
 
62
74
  ## JSON 输出
@@ -149,11 +161,65 @@ daemon 运行 → Plugin 连接 → SDK 就绪
149
161
 
150
162
  ---
151
163
 
164
+ ## Headless 模式附加输出
165
+
166
+ ### health 基础输出(headless 模式下额外字段)
167
+
168
+ headless 模式下 `health` 基础输出额外包含 `headless` 对象:
169
+
170
+ ```json
171
+ {
172
+ "ok": true,
173
+ "command": "health",
174
+ "exitCode": 0,
175
+ "daemon": { "running": true, "pid": 12345, "reachable": true, "uptime": 300 },
176
+ "plugin": { "connected": true },
177
+ "sdk": { "ready": true },
178
+ "timeoutRemaining": 1500,
179
+ "headless": {
180
+ "status": "running",
181
+ "chromeConnected": true,
182
+ "pageUrl": "http://localhost:8080",
183
+ "reloadCount": 0,
184
+ "lastError": null,
185
+ "recentConsoleErrors": []
186
+ }
187
+ }
188
+ ```
189
+
190
+ ### --diagnose 输出
191
+
192
+ ```json
193
+ {
194
+ "ok": true,
195
+ "command": "health",
196
+ "mode": "diagnose",
197
+ "headless": { "status": "running", "chromeConnected": true, "pageUrl": "...", "reloadCount": 0, "lastError": null, "recentConsoleErrors": [] },
198
+ "screenshotPath": "/Users/xxx/.remnote-bridge/headless-screenshot-1234567890.png",
199
+ "pluginConnected": true,
200
+ "sdkReady": true
201
+ }
202
+ ```
203
+
204
+ ### --reload 输出
205
+
206
+ ```json
207
+ {
208
+ "ok": true,
209
+ "command": "health",
210
+ "mode": "reload"
211
+ }
212
+ ```
213
+
214
+ ---
215
+
152
216
  ## 常见问题诊断
153
217
 
154
218
  | 症状 | 可能原因 | 解决方案 |
155
219
  |------|----------|----------|
156
220
  | daemon 未运行 | 未执行 connect / 已超时关闭 | 执行 `connect` |
157
221
  | daemon 运行但不可达 | WS 端口被占用或配置不匹配 | 检查 `.remnote-bridge.json` 中的 `wsPort` |
158
- | Plugin 未连接 | RemNote 未打开 / Plugin 未安装 / URL 不匹配 | 打开 RemNote,确认 Plugin 中的 WS URL 设置 |
222
+ | Plugin 未连接(标准模式) | RemNote 未打开 / Plugin 未安装 / URL 不匹配 | 打开 RemNote,确认 Plugin 中的 WS URL 设置 |
223
+ | Plugin 未连接(headless 模式) | Chrome 页面加载异常 | `health --diagnose` 查看截图和状态,`health --reload` 重载页面 |
159
224
  | SDK 未就绪 | 知识库加载中 / Plugin 异常 | 等待几秒后重试,或刷新 RemNote 页面 |
225
+ | Chrome 状态 crashed | headless Chrome 崩溃或断开 | `health --reload` 尝试恢复,或 disconnect + connect --headless 重启 |
@@ -206,7 +206,7 @@ disconnect → daemon 关闭 → 会话结束,缓存清空
206
206
  | 服务 | 默认端口 | 用途 |
207
207
  |:-----|:---------|:-----|
208
208
  | WS Server | 3002 | CLI ↔ daemon ↔ Plugin 通信 |
209
- | webpack-dev-server | 8080 | 热加载 Plugin 到 RemNote |
209
+ | Plugin 服务 | 8080 | 加载 Plugin 到 RemNote(默认静态服务器,`--dev` 时为 webpack-dev-server) |
210
210
  | ConfigServer | 3003 | HTTP 配置界面 |
211
211
 
212
212
  超时机制:daemon 默认 **30 分钟无活动**自动关闭。每次收到 CLI 请求时重置计时器。
@@ -0,0 +1,130 @@
1
+ # setup
2
+
3
+ > 启动 Chrome 浏览器让用户登录 RemNote,保存登录凭证到本地 profile。这是 headless 模式(`connect --headless`)的前置步骤。
4
+
5
+ ---
6
+
7
+ ## 功能
8
+
9
+ `setup` 启动一个有界面的 Chrome 窗口(使用独立 profile 目录 `~/.remnote-bridge/chrome-profile`),打开 RemNote 登录页面。用户在浏览器中完成登录后关闭 Chrome,命令写入 `.setup-done` 标记并返回。
10
+
11
+ 后续 `connect --headless` 使用相同 profile 目录,复用已保存的登录凭证,实现免登录的 headless 连接。
12
+
13
+ ---
14
+
15
+ ## 前置条件
16
+
17
+ - 需要**桌面环境(GUI)**,无 GUI 环境会报错
18
+ - 需要系统安装 Chrome/Chromium
19
+
20
+ ---
21
+
22
+ ## 用法
23
+
24
+ ### 人类模式
25
+
26
+ ```bash
27
+ remnote-bridge setup
28
+ ```
29
+
30
+ 输出示例:
31
+
32
+ ```
33
+ 正在启动 Chrome...
34
+ 请在浏览器中登录 RemNote,完成后关闭浏览器窗口。
35
+ setup 完成!
36
+ profile 目录: /Users/xxx/.remnote-bridge/chrome-profile
37
+ 现在可以使用 `remnote-bridge connect --headless` 启动无头连接。
38
+ ```
39
+
40
+ ### JSON 模式
41
+
42
+ ```bash
43
+ remnote-bridge --json setup
44
+ ```
45
+
46
+ ---
47
+
48
+ ## JSON 输出
49
+
50
+ ### 首次 setup
51
+
52
+ ```json
53
+ {
54
+ "ok": true,
55
+ "command": "setup",
56
+ "profileDir": "/Users/xxx/.remnote-bridge/chrome-profile",
57
+ "alreadyDone": false
58
+ }
59
+ ```
60
+
61
+ ### 已完成 setup
62
+
63
+ ```json
64
+ {
65
+ "ok": true,
66
+ "command": "setup",
67
+ "profileDir": "/Users/xxx/.remnote-bridge/chrome-profile",
68
+ "alreadyDone": true
69
+ }
70
+ ```
71
+
72
+ ### 失败
73
+
74
+ ```json
75
+ {
76
+ "ok": false,
77
+ "command": "setup",
78
+ "error": "未检测到桌面环境(无 DISPLAY/WAYLAND_DISPLAY),setup 需要 GUI 才能登录"
79
+ }
80
+ ```
81
+
82
+ ---
83
+
84
+ ## AI Agent 使用流程
85
+
86
+ setup 会弹出 Chrome 窗口,用户需要完成两件事:登录 RemNote + 配置 dev plugin。
87
+
88
+ ### 交互步骤
89
+
90
+ 1. 调用 `setup`
91
+ 2. **立即告知用户**:
92
+ > 已打开 Chrome 浏览器。请完成以下操作:
93
+ > 1. 登录 RemNote
94
+ > 2. 在 RemNote 中配置开发插件:点击左下角插件图标 → 开发你的插件 → 输入 `http://localhost:8080`
95
+ > 3. 完成后彻底退出 Chrome(macOS 请按 Cmd+Q,仅关窗口不够)
96
+ 3. 等待 `setup` 命令返回(阻塞式,超时 600 秒)
97
+ 4. 收到成功 → 继续执行 `connect --headless`
98
+
99
+ ### setup 之后
100
+
101
+ `setup` 只需执行一次。登录凭证和 plugin 配置都已保存,之后每次只需 `connect --headless` 即可自动连接,无需用户操作。
102
+
103
+ 如果后续 headless 模式下 Plugin 始终不连接,可能是 RemNote 登录 session 过期,需重新 setup(删除 `~/.remnote-bridge/chrome-profile/.setup-done` 后重新执行)。
104
+
105
+ ---
106
+
107
+ ## 幂等性
108
+
109
+ 已完成 setup 后重复调用返回 `ok: true, alreadyDone: true`,不会再次打开 Chrome。
110
+
111
+ 如需重新登录(切换账号),删除 `~/.remnote-bridge/chrome-profile/.setup-done` 文件后重新执行。
112
+
113
+ ---
114
+
115
+ ## 退出码
116
+
117
+ | 退出码 | 含义 |
118
+ |--------|------|
119
+ | 0 | 成功(首次完成或已完成) |
120
+ | 1 | 失败(无 GUI、无 Chrome、超时等) |
121
+
122
+ ---
123
+
124
+ ## 产生的文件
125
+
126
+ | 文件 | 位置 | 说明 |
127
+ |------|------|------|
128
+ | Chrome profile | `~/.remnote-bridge/chrome-profile/` | Chrome 用户数据(含登录凭证) |
129
+ | `.setup-done` | `~/.remnote-bridge/chrome-profile/.setup-done` | setup 完成标记(JSON,含时间戳) |
130
+