remnote-bridge 0.1.0 → 0.1.2

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 (69) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +229 -0
  3. package/dist/cli/commands/install-skill.js +51 -11
  4. package/dist/cli/main.js +12 -4
  5. package/dist/mcp/index.js +1 -1
  6. package/dist/mcp/instructions.js +57 -20
  7. package/dist/mcp/resources/separator-flashcard.js +31 -29
  8. package/package.json +12 -5
  9. package/{skill → skills/remnote-bridge}/SKILL.md +64 -34
  10. package/{docs/instruction → skills/remnote-bridge/instructions}/connect.md +24 -0
  11. package/{docs/instruction → skills/remnote-bridge/instructions}/overall.md +52 -35
  12. package/dist/cli/commands/connect.d.ts +0 -12
  13. package/dist/cli/commands/disconnect.d.ts +0 -11
  14. package/dist/cli/commands/edit-rem.d.ts +0 -13
  15. package/dist/cli/commands/edit-tree.d.ts +0 -14
  16. package/dist/cli/commands/health.d.ts +0 -12
  17. package/dist/cli/commands/install-skill.d.ts +0 -6
  18. package/dist/cli/commands/read-context.d.ts +0 -20
  19. package/dist/cli/commands/read-globe.d.ts +0 -16
  20. package/dist/cli/commands/read-rem.d.ts +0 -16
  21. package/dist/cli/commands/read-tree.d.ts +0 -17
  22. package/dist/cli/commands/search.d.ts +0 -12
  23. package/dist/cli/config.d.ts +0 -55
  24. package/dist/cli/daemon/daemon.d.ts +0 -11
  25. package/dist/cli/daemon/dev-server.d.ts +0 -26
  26. package/dist/cli/daemon/pid.d.ts +0 -34
  27. package/dist/cli/daemon/send-request.d.ts +0 -24
  28. package/dist/cli/handlers/context-read-handler.d.ts +0 -18
  29. package/dist/cli/handlers/edit-handler.d.ts +0 -30
  30. package/dist/cli/handlers/globe-read-handler.d.ts +0 -17
  31. package/dist/cli/handlers/read-handler.d.ts +0 -16
  32. package/dist/cli/handlers/rem-cache.d.ts +0 -19
  33. package/dist/cli/handlers/tree-edit-handler.d.ts +0 -30
  34. package/dist/cli/handlers/tree-parser.d.ts +0 -95
  35. package/dist/cli/handlers/tree-read-handler.d.ts +0 -28
  36. package/dist/cli/main.d.ts +0 -7
  37. package/dist/cli/protocol.d.ts +0 -39
  38. package/dist/cli/server/config-server.d.ts +0 -26
  39. package/dist/cli/server/ws-server.d.ts +0 -68
  40. package/dist/cli/utils/output.d.ts +0 -11
  41. package/dist/mcp/daemon-client.d.ts +0 -31
  42. package/dist/mcp/index.d.ts +0 -7
  43. package/dist/mcp/instructions.d.ts +0 -1
  44. package/dist/mcp/resources/edit-tree-guide.d.ts +0 -1
  45. package/dist/mcp/resources/error-reference.d.ts +0 -1
  46. package/dist/mcp/resources/outline-format.d.ts +0 -1
  47. package/dist/mcp/resources/rem-object-fields.d.ts +0 -1
  48. package/dist/mcp/resources/separator-flashcard.d.ts +0 -1
  49. package/dist/mcp/tools/edit-tools.d.ts +0 -5
  50. package/dist/mcp/tools/infra-tools.d.ts +0 -5
  51. package/dist/mcp/tools/read-tools.d.ts +0 -5
  52. package/dist/mcp/types.d.ts +0 -12
  53. package/remnote-plugin/src/test-scripts/AGENTS.md +0 -46
  54. package/remnote-plugin/src/test-scripts/test-actions.ts +0 -230
  55. package/remnote-plugin/src/test-scripts/test-powerup-rendering.ts +0 -722
  56. package/remnote-plugin/src/test-scripts/test-rem-type-mapping.ts +0 -283
  57. package/remnote-plugin/src/test-scripts/test-richtext-builder.ts +0 -207
  58. package/remnote-plugin/src/test-scripts/test-richtext-matrix.ts +0 -332
  59. package/remnote-plugin/src/test-scripts/test-richtext-remaining.ts +0 -245
  60. package/remnote-plugin/src/test-scripts/test-rw-fields.ts +0 -399
  61. /package/{docs/instruction → skills/remnote-bridge/instructions}/disconnect.md +0 -0
  62. /package/{docs/instruction → skills/remnote-bridge/instructions}/edit-rem.md +0 -0
  63. /package/{docs/instruction → skills/remnote-bridge/instructions}/edit-tree.md +0 -0
  64. /package/{docs/instruction → skills/remnote-bridge/instructions}/health.md +0 -0
  65. /package/{docs/instruction → skills/remnote-bridge/instructions}/read-context.md +0 -0
  66. /package/{docs/instruction → skills/remnote-bridge/instructions}/read-globe.md +0 -0
  67. /package/{docs/instruction → skills/remnote-bridge/instructions}/read-rem.md +0 -0
  68. /package/{docs/instruction → skills/remnote-bridge/instructions}/read-tree.md +0 -0
  69. /package/{docs/instruction → skills/remnote-bridge/instructions}/search.md +0 -0
@@ -7,21 +7,21 @@ description: "RemNote 知识库操作指南。通过 remnote-bridge 命令行工
7
7
 
8
8
  本 skill 指导 AI Agent 通过 remnote-bridge 操作 RemNote 知识库。
9
9
 
10
- **详细命令文档**位于 `docs/instruction/` 目录下,执行具体命令前务必先读取对应文件:
10
+ **详细命令文档**位于 `instructions/` 目录下,执行具体命令前务必先读取对应文件:
11
11
 
12
12
  | 命令 | 文档路径 |
13
13
  |:-----|:---------|
14
- | connect | `docs/instruction/connect.md` |
15
- | disconnect | `docs/instruction/disconnect.md` |
16
- | health | `docs/instruction/health.md` |
17
- | read-rem | `docs/instruction/read-rem.md` |
18
- | edit-rem | `docs/instruction/edit-rem.md` |
19
- | read-tree | `docs/instruction/read-tree.md` |
20
- | edit-tree | `docs/instruction/edit-tree.md` |
21
- | read-globe | `docs/instruction/read-globe.md` |
22
- | read-context | `docs/instruction/read-context.md` |
23
- | search | `docs/instruction/search.md` |
24
- | 全局概览 | `docs/instruction/overall.md` |
14
+ | connect | `instructions/connect.md` |
15
+ | disconnect | `instructions/disconnect.md` |
16
+ | health | `instructions/health.md` |
17
+ | read-rem | `instructions/read-rem.md` |
18
+ | edit-rem | `instructions/edit-rem.md` |
19
+ | read-tree | `instructions/read-tree.md` |
20
+ | edit-tree | `instructions/edit-tree.md` |
21
+ | read-globe | `instructions/read-globe.md` |
22
+ | read-context | `instructions/read-context.md` |
23
+ | search | `instructions/search.md` |
24
+ | 全局概览 | `instructions/overall.md` |
25
25
 
26
26
  ---
27
27
 
@@ -42,7 +42,7 @@ RemNote 中所有内容的基本单元都是 **Rem**。文档、文件夹、闪
42
42
 
43
43
  两个独立维度:
44
44
 
45
- - **type**(闪卡语义):`concept`(`::`,加粗)、`descriptor`(`;;`,斜体)、`default`(普通)、`portal`(只读)
45
+ - **type**(闪卡语义):`concept`(加粗)、`descriptor`(斜体)、`default`(普通)、`portal`(只读)
46
46
  - **isDocument**(页面语义):与 type 完全独立
47
47
 
48
48
  ### CDF 框架(Concept-Descriptor Framework)
@@ -55,19 +55,30 @@ RemNote 推荐的知识结构化方法:
55
55
  损失函数 ;; 均方误差 (MSE) ← Descriptor
56
56
  ```
57
57
 
58
- ### 分隔符与闪卡方向
58
+ ### 闪卡的 CLI 操作方式
59
59
 
60
- | 分隔符 | type | 默认方向 | 用途 |
61
- |:-------|:-----|:---------|:-----|
62
- | `::` | concept | both | 概念定义 |
63
- | `;;` | descriptor | forward | 描述属性 |
64
- | `>>` | default | forward | 正向问答 |
65
- | `<<` | default | backward | 反向问答 |
66
- | `<>` | default | both | 双向问答 |
67
- | `>>>` | default | forward | 多行答案 |
68
- | `::>` | concept | both | 概念型多行答案 |
69
- | `;;>` | descriptor | forward | 描述型多行答案 |
70
- | `{{}}` | default | forward | 完形填空 |
60
+ 闪卡由 `type`、`backText`、`practiceDirection` 三个字段控制。通过 CLI 操作闪卡,修改的是这些**字段**。
61
+
62
+ **禁止**:在文本中插入分隔符(`::`、`;;`、`>>`、`<<` 等)来创建闪卡。分隔符是 RemNote 编辑器的输入语法,CLI 无法识别。
63
+
64
+ | 闪卡操作 | CLI 方法 |
65
+ |:---------|:---------|
66
+ | 创建概念定义 | `edit-tree` 新增行 `概念 定义`,再 `edit-rem` 设 `type: "concept"` |
67
+ | 创建正向问答 | `edit-tree` 新增行 `问题 答案` |
68
+ | 创建多行答案 | `edit-tree` 新增行 `问题 ↓`(子行自动成为答案) |
69
+ | 改变闪卡类型 | `edit-rem` 修改 `type`、`backText`、`practiceDirection` |
70
+
71
+ ### 理解用户意图:分隔符映射
72
+
73
+ 用户在 RemNote 编辑器中通过分隔符创建闪卡。当用户提到这些分隔符时,理解其意图并映射到上述 CLI 操作:
74
+
75
+ | 用户说 / 编辑器分隔符 | 对应 type | 对应 practiceDirection |
76
+ |:----------------------|:----------|:----------------------|
77
+ | `::` | concept | both |
78
+ | `;;` | descriptor | forward |
79
+ | `>>` / `<<` / `<>` | default | forward / backward / both |
80
+ | `>>>` / `::>` / `;;>` | default / concept / descriptor | 多行(子 Rem 为答案) |
81
+ | `{{}}` | default | forward(完形填空) |
71
82
 
72
83
  ### 三种链接机制
73
84
 
@@ -141,16 +152,35 @@ Rem 的属性(文本、类型、格式、标签) → edit-rem (前置
141
152
 
142
153
  ## 3. 标准工作流
143
154
 
155
+ ### ⚠️ connect 后需要用户配合(重要)
156
+
157
+ `connect` 成功只意味着 daemon 和 webpack-dev-server 已启动,**Plugin 并未自动连接**。用户必须在 RemNote 中完成操作,Plugin 才能连接到 daemon:
158
+
159
+ **首次使用**(RemNote 从未加载过此插件):
160
+ 1. 打开 RemNote 桌面端或网页端
161
+ 2. 点击左侧边栏底部的插件图标(拼图形状)
162
+ 3. 点击「开发你的插件」(Develop Your Plugin)
163
+ 4. 在输入框中填入 `http://localhost:8080`(即 connect 输出的 webpack-dev-server 地址)
164
+ 5. 等待插件加载完成
165
+
166
+ **非首次使用**(之前已加载过此插件):
167
+ - 只需**刷新 RemNote 页面**即可(浏览器 F5 或 Cmd+R),插件会自动重新连接
168
+
169
+ **你必须**:执行 `connect` 后,**立即告知用户需要完成上述操作**,不要直接调用业务命令。引导用户完成后,用 `health` 确认三层就绪再继续。
170
+
171
+ ### 完整流程
172
+
144
173
  ```
145
174
  1. connect -- 启动会话(幂等,重复调用安全)
146
- 2. health -- 确认三层就绪:daemon Plugin → SDK(链式依赖)
147
- 3. read-globe -- 了解知识库结构(首次探索)
175
+ 2. ⚠️ 引导用户在 RemNote 中加载插件(首次填端口,非首次刷新页面)
176
+ 3. health -- 确认三层就绪:daemon → Plugin → SDK(链式依赖)
177
+ 4. read-globe -- 了解知识库结构(首次探索)
148
178
  或 read-context -- 了解用户当前上下文
149
- 4. search "关键词" -- 定位目标 Rem(结果不进缓存!)
150
- 5. read-tree <id> -- 展开子树 → 写入缓存(edit-tree 的前置)
151
- 6. read-rem <id> -- 读取属性 → 写入缓存(edit-rem 的前置)
152
- 7. edit-rem / edit-tree -- 执行修改
153
- 8. disconnect -- 结束会话(缓存全部清空,幂等)
179
+ 5. search "关键词" -- 定位目标 Rem(结果不进缓存!)
180
+ 6. read-tree <id> -- 展开子树 → 写入缓存(edit-tree 的前置)
181
+ 7. read-rem <id> -- 读取属性 → 写入缓存(edit-rem 的前置)
182
+ 8. edit-rem / edit-tree -- 执行修改
183
+ 9. disconnect -- 结束会话(缓存全部清空,幂等)
154
184
  ```
155
185
 
156
186
  **超时**:daemon 默认 30 分钟无 CLI 交互自动关闭,每次请求重置计时器。长时间操作间可用 health 保活。
@@ -299,12 +329,12 @@ read-tree / read-globe / read-context 输出 Markdown 大纲,edit-tree 基于
299
329
 
300
330
  ### 新增行格式
301
331
 
302
- 新增行可用 Markdown 前缀和箭头分隔符:
332
+ 新增行可用 Markdown 前缀和箭头:
303
333
 
304
334
  ```markdown
305
335
  # 新标题
306
336
  新闪卡 → 答案
307
- 概念 :: 定义
337
+ 问题 回答
308
338
  - [ ] 新待办
309
339
  `代码块`
310
340
  ```
@@ -18,6 +18,30 @@ daemon 启动后脱离父进程(detached),CLI 进程退出但 daemon 继
18
18
 
19
19
  ---
20
20
 
21
+ ## ⚠️ connect 后需要用户配合
22
+
23
+ `connect` 成功只意味着 daemon 和 webpack-dev-server 已启动,**Plugin 并未自动连接**。用户必须在 RemNote 中完成以下操作:
24
+
25
+ ### 首次使用(RemNote 从未加载过此插件)
26
+
27
+ 1. 打开 RemNote 桌面端或网页端
28
+ 2. 点击左侧边栏底部的插件图标(拼图形状)
29
+ 3. 点击「开发你的插件」(Develop Your Plugin)
30
+ 4. 在输入框中填入 `http://localhost:8080`(即 connect 输出的 webpack-dev-server 地址)
31
+ 5. 等待插件加载完成
32
+
33
+ ### 非首次使用(之前已加载过此插件)
34
+
35
+ 只需**刷新 RemNote 页面**即可(浏览器 F5 或 Cmd+R),插件会自动重新连接到已启动的 daemon。
36
+
37
+ ### AI Agent 注意事项
38
+
39
+ - 执行 `connect` 后,**必须立即告知用户完成上述操作**
40
+ - **禁止在 connect 后直接调用业务命令**——此时 Plugin 尚未连接,命令会报 "Plugin 未连接" 错误
41
+ - 引导用户完成操作后,用 `health` 确认三层就绪(daemon → Plugin → SDK),再执行业务命令
42
+
43
+ ---
44
+
21
45
  ## 用法
22
46
 
23
47
  ### 人类模式
@@ -51,7 +51,7 @@ Agent 的核心任务是将用户的自然语言请求翻译为 CLI 命令。以
51
51
  | 用户表述 | 操作类型 | CLI 命令 |
52
52
  |:---------|:---------|:---------|
53
53
  | "改文本"、"改标题"、"改颜色"、"改类型" | 修改 Rem 属性 | `edit-rem` |
54
- | "创建一个概念定义 (::)" | 修改 type + backText | `edit-rem` |
54
+ | "创建一个概念定义"、"做个 ::" | 新增行(edit-tree 箭头)+ type(edit-rem) | `edit-tree` + `edit-rem` |
55
55
  | "新增一个子节点"、"添加笔记" | 结构操作:新增 | `edit-tree` |
56
56
  | "删除这个"、"移除" | 结构操作:删除 | `edit-tree` |
57
57
  | "移动到…下面" | 结构操作:移动 | `edit-tree` |
@@ -66,42 +66,52 @@ Rem 有两个**独立维度**的类型:
66
66
 
67
67
  #### type 字段(闪卡语义)
68
68
 
69
- | type 值 | 触发分隔符 | 含义 | UI 表现 |
70
- |:--------|:----------|:-----|:--------|
71
- | `concept` | `::` `::>` | 概念定义 | 文字**加粗** |
72
- | `descriptor` | `;;` `;;>` | 描述/属性 | 文字*斜体* |
73
- | `default` | 无分隔符 / `>>` / `<<` / `<>` / `>>>` / `{{}}` | 普通 Rem | 正常字重 |
74
- | `portal` | | 嵌入引用容器 | 紫色左边框(**只读**,不可通过 setType 设置) |
69
+ | type 值 | 含义 | UI 表现 | CLI 设置方式 |
70
+ |:--------|:-----|:--------|:-------------|
71
+ | `concept` | 概念定义 | 文字**加粗** | `edit-rem` `type: "concept"` |
72
+ | `descriptor` | 描述/属性 | 文字*斜体* | `edit-rem` `type: "descriptor"` |
73
+ | `default` | 普通 Rem | 正常字重 | `edit-rem` `type: "default"` |
74
+ | `portal` | 嵌入引用容器 | 紫色左边框 | **只读**,不可通过 CLI 设置 |
75
75
 
76
76
  #### isDocument 字段(页面语义)
77
77
 
78
78
  `isDocument` 与 `type` 完全独立——一个 `concept` 类型的 Rem 可以同时是 Document。
79
79
 
80
- ### 2.4 分隔符与闪卡
80
+ ### 2.4 闪卡的 CLI 操作方式
81
81
 
82
- 用户输入的分隔符决定了 Rem 的 `type`、`backText` 和默认 `practiceDirection`。理解分隔符是理解用户创建闪卡意图的关键。
82
+ 闪卡由 `type`、`backText`、`practiceDirection` 三个字段控制。通过 CLI 操作闪卡,修改的是这些**字段**和大纲**箭头**。
83
83
 
84
- | 分隔符 | type | backText | 默认方向 | 用途 |
85
- |:-------|:-----|:---------|:---------|:-----|
86
- | (无) | `default` | `null` | — | 无闪卡行为 |
87
- | `::` | `concept` | 后半部分 | `both` | 概念定义(CDF 框架) |
88
- | `;;` | `descriptor` | 后半部分 | `forward` | 描述属性(CDF 框架) |
89
- | `>>` | `default` | 后半部分 | `forward` | 正向问答 |
90
- | `<<` | `default` | 后半部分 | `backward` | 反向问答 |
91
- | `<>` | `default` | 后半部分 | `both` | 双向问答 |
92
- | `>>>` | `default` | `null` | `forward` | 多行答案(子 Rem 为答案) |
93
- | `::>` | `concept` | `null` | `both` | 概念型多行答案 |
94
- | `;;>` | `descriptor` | `null` | `forward` | 描述型多行答案 |
95
- | `{{}}` | `default` | `null` | `forward` | 完形填空(Cloze) |
84
+ **禁止**:在文本中插入分隔符(`::`、`;;`、`>>`、`<<` 等)来创建闪卡。分隔符是 RemNote 编辑器的输入语法,CLI 无法识别。
96
85
 
97
- **重要**:分隔符决定创建时的**默认**方向,用户可以事后独立修改 `practiceDirection`。`practiceDirection` 的取值:`forward`(正向)、`backward`(反向)、`both`(双向)、`none`(不练习)。
86
+ | 闪卡操作 | CLI 方法 |
87
+ |:---------|:---------|
88
+ | 创建概念定义 | `edit-tree` 新增行 `概念 ↔ 定义`,再 `edit-rem` 设 `type: "concept"` |
89
+ | 创建正向问答 | `edit-tree` 新增行 `问题 → 答案` |
90
+ | 创建反向问答 | `edit-tree` 新增行 `问题 ← 答案` |
91
+ | 创建双向问答 | `edit-tree` 新增行 `问题 ↔ 答案` |
92
+ | 创建多行答案 | `edit-tree` 新增行 `问题 ↓`(子行自动成为答案) |
93
+ | 改变闪卡类型/方向 | `edit-rem` 修改 `type`、`backText`、`practiceDirection` |
98
94
 
99
- **CDF(Concept-Descriptor Framework)**:RemNote 推荐的知识结构化方法——`Concept` 是需要理解的概念,`Descriptor` 是概念的属性/描述。典型结构:
95
+ `practiceDirection` 的取值:`forward`(正向)、`backward`(反向)、`both`(双向)、`none`(不练习)。
96
+
97
+ ### 2.5 理解用户意图:编辑器分隔符映射
98
+
99
+ 用户在 RemNote 编辑器中通过分隔符创建闪卡。当用户提到这些分隔符时,理解其意图并映射到上述 CLI 操作:
100
+
101
+ | 用户说 / 编辑器分隔符 | 对应 type | 对应 practiceDirection |
102
+ |:----------------------|:----------|:----------------------|
103
+ | `::` | concept | both |
104
+ | `;;` | descriptor | forward |
105
+ | `>>` / `<<` / `<>` | default | forward / backward / both |
106
+ | `>>>` / `::>` / `;;>` | default / concept / descriptor | 多行(子 Rem 为答案) |
107
+ | `{{}}` | default | forward(完形填空) |
108
+
109
+ **CDF(Concept-Descriptor Framework)**:RemNote 推荐的知识结构化方法——`Concept`(type:concept)是需要理解的概念,`Descriptor`(type:descriptor)是概念的属性/描述。在 CLI 大纲中的表现:
100
110
 
101
111
  ```
102
- 线性回归 :: 最基本的回归模型 Concept
103
- 假设 ;; 因变量与自变量呈线性关系 Descriptor
104
- 损失函数 ;; 均方误差 (MSE) Descriptor
112
+ 线性回归 最基本的回归模型 <!--id1 type:concept-->
113
+ 假设 因变量与自变量呈线性关系 <!--id2 type:descriptor-->
114
+ 损失函数 均方误差 (MSE) <!--id3 type:descriptor-->
105
115
  ```
106
116
 
107
117
  ### 2.5 三种链接机制
@@ -170,11 +180,17 @@ RemNote SDK → 知识库
170
180
  一次**会话(Session)= 守护进程的生命周期**。
171
181
 
172
182
  ```
173
- connect → daemon 启动 → 会话开始
183
+ connect → daemon 启动
184
+
185
+ ⚠️ 用户在 RemNote 中加载插件(首次填端口,非首次刷新页面)
186
+
187
+ health → 确认三层就绪 → 会话可用
174
188
  ↕ (业务命令:read-rem, edit-tree, search, ...)
175
189
  disconnect → daemon 关闭 → 会话结束,缓存清空
176
190
  ```
177
191
 
192
+ > **重要**:`connect` 成功只意味着 daemon 已启动,Plugin 并未自动连接。首次使用需用户在 RemNote「开发你的插件」中填入 `http://localhost:8080`;非首次只需刷新 RemNote 页面。必须引导用户完成此步后再用 `health` 确认就绪。
193
+
178
194
  `connect` 启动三个服务:
179
195
 
180
196
  | 服务 | 默认端口 | 用途 |
@@ -322,18 +338,19 @@ Agent 需要根据用户意图选择正确的读取命令:
322
338
 
323
339
  ```
324
340
  1. connect ← 启动会话
325
- 2. health ← 确认系统就绪
326
- 3. read-globe 了解知识库结构(首次探索)
341
+ 2. ⚠️ 引导用户在 RemNote 中加载插件(首次填端口,非首次刷新页面)
342
+ 3. health 确认系统就绪(daemon → Plugin → SDK 三层全通过)
343
+ 4. read-globe ← 了解知识库结构(首次探索)
327
344
  或 read-context ← 了解用户当前上下文
328
- 4. search "关键词" ← 定位目标 Rem(中文搜索可能需单字策略,详见 search.md)
329
- 5. read-tree <id> ← 展开目标区域的子树
330
- 6. read-rem <id> ← 读取详细属性(编辑前必需)
331
- 7. edit-rem <id> ... ← 修改 Rem 属性
345
+ 5. search "关键词" ← 定位目标 Rem(中文搜索可能需单字策略,详见 search.md)
346
+ 6. read-tree <id> ← 展开目标区域的子树
347
+ 7. read-rem <id> ← 读取详细属性(编辑前必需)
348
+ 8. edit-rem <id> ... ← 修改 Rem 属性
332
349
  或 edit-tree <id> ...← 修改树结构
333
- 8. disconnect ← 结束会话
350
+ 9. disconnect ← 结束会话
334
351
  ```
335
352
 
336
- **注意**:步骤 6 是 `edit-rem` 的强制前置条件,步骤 5 是 `edit-tree` 的强制前置条件。跳过会触发防线 1 错误。
353
+ **注意**:步骤 7 是 `edit-rem` 的强制前置条件,步骤 6 是 `edit-tree` 的强制前置条件。跳过会触发防线 1 错误。步骤 2 是必须的——connect 后不引导用户加载插件就直接调用业务命令,会报"Plugin 未连接"错误。
337
354
 
338
355
  ---
339
356
 
@@ -1,12 +0,0 @@
1
- /**
2
- * connect 命令
3
- *
4
- * 启动后台守护进程(WS Server + webpack-dev-server),等待 Plugin 连接。
5
- * - 已在运行 → 打印提示,退出码 0
6
- * - stale PID → 清理后正常启动
7
- * - 启动失败 → 退出码 1
8
- */
9
- export interface ConnectOptions {
10
- json?: boolean;
11
- }
12
- export declare function connectCommand(options?: ConnectOptions): Promise<void>;
@@ -1,11 +0,0 @@
1
- /**
2
- * disconnect 命令
3
- *
4
- * 停止守护进程,释放端口和资源。
5
- * - 守护进程运行中 → 发送 SIGTERM,等待退出
6
- * - 守护进程未运行 → 打印提示,退出码 0
7
- */
8
- export interface DisconnectOptions {
9
- json?: boolean;
10
- }
11
- export declare function disconnectCommand(options?: DisconnectOptions): Promise<void>;
@@ -1,13 +0,0 @@
1
- /**
2
- * edit-rem 命令
3
- *
4
- * 通过 str_replace 编辑 Rem 的 JSON 序列化。
5
- * 三道防线保证安全:缓存存在性、并发检测、精确匹配。
6
- * - 退出码:0 成功 / 1 业务错误 / 2 守护进程不可达
7
- */
8
- export interface EditRemOptions {
9
- json?: boolean;
10
- oldStr: string;
11
- newStr: string;
12
- }
13
- export declare function editRemCommand(remId: string, options: EditRemOptions): Promise<void>;
@@ -1,14 +0,0 @@
1
- /**
2
- * edit-tree 命令
3
- *
4
- * 通过 str_replace 编辑 Rem 子树结构(行级增/删/移/重排)。
5
- * - 禁止修改已有行内容(走 edit-rem)
6
- * - --json 结构化 JSON 输出
7
- * - 退出码:0 成功 / 1 业务错误 / 2 守护进程不可达
8
- */
9
- export interface EditTreeOptions {
10
- json?: boolean;
11
- oldStr: string;
12
- newStr: string;
13
- }
14
- export declare function editTreeCommand(remId: string, options: EditTreeOptions): Promise<void>;
@@ -1,12 +0,0 @@
1
- /**
2
- * health 命令
3
- *
4
- * 检查守护进程、Plugin 连接、SDK 状态,输出 ✅/❌ 列表。
5
- * - 全部健康 → 退出码 0
6
- * - 部分不健康 → 退出码 1
7
- * - 守护进程不可达 → 退出码 2
8
- */
9
- export interface HealthOptions {
10
- json?: boolean;
11
- }
12
- export declare function healthCommand(options?: HealthOptions): Promise<void>;
@@ -1,6 +0,0 @@
1
- /**
2
- * install skill 命令
3
- *
4
- * 将 SKILL.md 和 docs/instruction/*.md 安装到 ~/.claude/skills/remnote-bridge/
5
- */
6
- export declare function installSkillCommand(): Promise<void>;
@@ -1,20 +0,0 @@
1
- /**
2
- * read-context 命令
3
- *
4
- * 读取当前上下文视图。
5
- * - --mode focus|page(默认 focus)
6
- * - --ancestor-levels N 向上追溯几层祖先(默认 2,仅 focus 模式)
7
- * - --depth N 展开深度(默认 3,仅 page 模式)
8
- * - --max-nodes N 全局节点上限(默认 200)
9
- * - --max-siblings N 每个父节点下展示的 children 上限(默认 20)
10
- * - --json 结构化 JSON 输出
11
- */
12
- export interface ReadContextOptions {
13
- json?: boolean;
14
- mode?: string;
15
- ancestorLevels?: string;
16
- depth?: string;
17
- maxNodes?: string;
18
- maxSiblings?: string;
19
- }
20
- export declare function readContextCommand(options?: ReadContextOptions): Promise<void>;
@@ -1,16 +0,0 @@
1
- /**
2
- * read-globe 命令
3
- *
4
- * 读取知识库全局概览(仅 Document 层级)。
5
- * - --depth N 控制 Document 嵌套深度(默认 -1 无限)
6
- * - --max-nodes N 全局节点上限(默认 200)
7
- * - --max-siblings N 每个父节点下展示的 children 上限(默认 20)
8
- * - --json 结构化 JSON 输出
9
- */
10
- export interface ReadGlobeOptions {
11
- json?: boolean;
12
- depth?: string;
13
- maxNodes?: string;
14
- maxSiblings?: string;
15
- }
16
- export declare function readGlobeCommand(options?: ReadGlobeOptions): Promise<void>;
@@ -1,16 +0,0 @@
1
- /**
2
- * read-rem 命令
3
- *
4
- * 读取单个 Rem 的完整 JSON 对象。
5
- * - 默认输出 [RW] + [R] 字段(34 个)
6
- * - --full 输出全部 51 个字段(含 [R-F])
7
- * - --fields 指定输出字段子集
8
- * - 退出码:0 成功 / 1 业务错误 / 2 守护进程不可达
9
- */
10
- export interface ReadRemOptions {
11
- json?: boolean;
12
- fields?: string;
13
- full?: boolean;
14
- includePowerup?: boolean;
15
- }
16
- export declare function readRemCommand(remId: string, options?: ReadRemOptions): Promise<void>;
@@ -1,17 +0,0 @@
1
- /**
2
- * read-tree 命令
3
- *
4
- * 读取 Rem 子树并序列化为带缩进的 Markdown 大纲。
5
- * - --depth N 控制展开深度(默认 3,-1 = 全部展开)
6
- * - --json 结构化 JSON 输出
7
- * - 退出码:0 成功 / 1 业务错误 / 2 守护进程不可达
8
- */
9
- export interface ReadTreeOptions {
10
- json?: boolean;
11
- depth?: string;
12
- maxNodes?: string;
13
- maxSiblings?: string;
14
- ancestorLevels?: string;
15
- includePowerup?: boolean;
16
- }
17
- export declare function readTreeCommand(remId: string, options?: ReadTreeOptions): Promise<void>;
@@ -1,12 +0,0 @@
1
- /**
2
- * search 命令
3
- *
4
- * 在知识库中按文本搜索 Rem。
5
- * - --limit N 结果数量上限(默认 20)
6
- * - --json 结构化 JSON 输出
7
- */
8
- export interface SearchOptions {
9
- json?: boolean;
10
- limit?: string;
11
- }
12
- export declare function searchCommand(query: string, options?: SearchOptions): Promise<void>;
@@ -1,55 +0,0 @@
1
- /**
2
- * 配置加载
3
- *
4
- * 从项目根目录读取 .remnote-bridge.json,合并默认值。
5
- * 文件不存在时使用全部默认值,不报错。
6
- */
7
- export interface DefaultsConfig {
8
- maxNodes: number;
9
- maxSiblings: number;
10
- cacheMaxSize: number;
11
- readTreeDepth: number;
12
- readTreeAncestorLevels: number;
13
- readTreeIncludePowerup: boolean;
14
- readGlobeDepth: number;
15
- readContextMode: 'focus' | 'page';
16
- readContextAncestorLevels: number;
17
- readContextDepth: number;
18
- searchNumResults: number;
19
- }
20
- export declare const DEFAULT_DEFAULTS: Readonly<DefaultsConfig>;
21
- export interface BridgeConfig {
22
- wsPort: number;
23
- devServerPort: number;
24
- configPort: number;
25
- daemonTimeoutMinutes: number;
26
- defaults: DefaultsConfig;
27
- }
28
- export declare const DEFAULT_CONFIG: Readonly<BridgeConfig>;
29
- /**
30
- * 查找项目根目录(monorepo 根:包含 .git 目录的最近祖先)
31
- *
32
- * 从 startDir 向上查找 .git 目录,找到即返回。
33
- * 到达文件系统根仍未找到时回退到 cwd。
34
- */
35
- export declare function findProjectRoot(startDir?: string): string;
36
- /**
37
- * 加载配置。不存在时返回默认值。
38
- */
39
- export declare function loadConfig(projectRoot?: string): BridgeConfig;
40
- /**
41
- * 获取配置文件路径
42
- */
43
- export declare function configFilePath(projectRoot?: string): string;
44
- /**
45
- * 原子写入配置文件(写临时文件 → rename)
46
- */
47
- export declare function saveConfig(filePath: string, config: BridgeConfig): void;
48
- /**
49
- * PID 文件路径
50
- */
51
- export declare function pidFilePath(projectRoot?: string): string;
52
- /**
53
- * 日志文件路径
54
- */
55
- export declare function logFilePath(projectRoot?: string): string;
@@ -1,11 +0,0 @@
1
- /**
2
- * 守护进程主逻辑
3
- *
4
- * 作为 fork 子进程运行:
5
- * 1. 启动 WS Server
6
- * 2. 启动 webpack-dev-server 子进程
7
- * 3. 写入 PID 文件
8
- * 4. 管理自动超时关闭
9
- * 5. 通过 IPC 向父进程发送 ready 信号
10
- */
11
- export {};
@@ -1,26 +0,0 @@
1
- /**
2
- * webpack-dev-server 子进程管理
3
- *
4
- * 在 remnote-plugin 目录下启动 npm run dev。
5
- */
6
- export interface DevServerOptions {
7
- pluginDir: string;
8
- port: number;
9
- onLog?: (message: string, level: 'info' | 'warn' | 'error') => void;
10
- onExit?: (code: number | null) => void;
11
- }
12
- export declare class DevServerManager {
13
- private child;
14
- private options;
15
- constructor(options: DevServerOptions);
16
- /**
17
- * 启动 webpack-dev-server。
18
- * 如果 remnote-plugin 目录不存在,抛出错误。
19
- */
20
- start(): void;
21
- /**
22
- * 停止 webpack-dev-server。
23
- */
24
- stop(): Promise<void>;
25
- isRunning(): boolean;
26
- }
@@ -1,34 +0,0 @@
1
- /**
2
- * PID 文件管理
3
- *
4
- * 写入、读取、stale 检测、清理。
5
- */
6
- /**
7
- * 写入 PID 文件
8
- */
9
- export declare function writePid(filePath: string, pid: number): void;
10
- /**
11
- * 读取 PID 文件。文件不存在返回 null。
12
- */
13
- export declare function readPid(filePath: string): number | null;
14
- /**
15
- * 删除 PID 文件
16
- */
17
- export declare function removePid(filePath: string): void;
18
- /**
19
- * 检查进程是否存活
20
- */
21
- export declare function isProcessAlive(pid: number): boolean;
22
- /**
23
- * 检查守护进程状态。返回:
24
- * - { running: true, pid } — 守护进程正在运行
25
- * - { running: false } — 守护进程未运行(无 PID 文件或 stale)
26
- *
27
- * 若 PID 文件存在但进程已死(stale),自动清理 PID 文件。
28
- */
29
- export declare function checkDaemon(pidPath: string): {
30
- running: true;
31
- pid: number;
32
- } | {
33
- running: false;
34
- };
@@ -1,24 +0,0 @@
1
- /**
2
- * Daemon 通信工具 — CLI 命令向守护进程发送请求的通用方法
3
- *
4
- * 封装 WS 连接建立、请求发送、响应等待、超时处理的完整流程。
5
- * 所有业务命令(health、read-rem、edit-rem 等)均通过此函数与 daemon 通信。
6
- */
7
- export declare class DaemonNotRunningError extends Error {
8
- constructor();
9
- }
10
- export declare class DaemonUnreachableError extends Error {
11
- constructor(cause: string);
12
- }
13
- /**
14
- * 向守护进程发送请求并等待响应。
15
- *
16
- * 流程:读取 PID 文件 → 建立 WS 连接 → 发送 BridgeRequest → 等待 BridgeResponse → 关闭连接
17
- *
18
- * @throws DaemonNotRunningError — PID 文件不存在或进程已死
19
- * @throws DaemonUnreachableError — WS 连接失败
20
- * @throws Error — daemon 返回 error 字段或响应超时
21
- */
22
- export declare function sendDaemonRequest(action: string, payload?: Record<string, unknown>, options?: {
23
- timeout?: number;
24
- }): Promise<unknown>;
@@ -1,18 +0,0 @@
1
- /**
2
- * ContextReadHandler — read-context 请求的业务编排
3
- *
4
- * 职责:转发到 Plugin 获取上下文视图,返回结果。
5
- */
6
- import type { DefaultsConfig } from '../config.js';
7
- export interface ContextReadResult {
8
- nodeCount: number;
9
- outline: string;
10
- breadcrumb: string[];
11
- mode: 'focus' | 'page';
12
- }
13
- export declare class ContextReadHandler {
14
- private forwardToPlugin;
15
- private defaults;
16
- constructor(forwardToPlugin: (action: string, payload: Record<string, unknown>) => Promise<unknown>, defaults?: DefaultsConfig);
17
- handleReadContext(payload: Record<string, unknown>): Promise<ContextReadResult>;
18
- }