remnote-bridge 0.1.0
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/commands/connect.d.ts +12 -0
- package/dist/cli/commands/connect.js +124 -0
- package/dist/cli/commands/disconnect.d.ts +11 -0
- package/dist/cli/commands/disconnect.js +100 -0
- package/dist/cli/commands/edit-rem.d.ts +13 -0
- package/dist/cli/commands/edit-rem.js +83 -0
- package/dist/cli/commands/edit-tree.d.ts +14 -0
- package/dist/cli/commands/edit-tree.js +67 -0
- package/dist/cli/commands/health.d.ts +12 -0
- package/dist/cli/commands/health.js +100 -0
- package/dist/cli/commands/install-skill.d.ts +6 -0
- package/dist/cli/commands/install-skill.js +39 -0
- package/dist/cli/commands/read-context.d.ts +20 -0
- package/dist/cli/commands/read-context.js +77 -0
- package/dist/cli/commands/read-globe.d.ts +16 -0
- package/dist/cli/commands/read-globe.js +60 -0
- package/dist/cli/commands/read-rem.d.ts +16 -0
- package/dist/cli/commands/read-rem.js +80 -0
- package/dist/cli/commands/read-tree.d.ts +17 -0
- package/dist/cli/commands/read-tree.js +85 -0
- package/dist/cli/commands/search.d.ts +12 -0
- package/dist/cli/commands/search.js +65 -0
- package/dist/cli/config.d.ts +55 -0
- package/dist/cli/config.js +139 -0
- package/dist/cli/daemon/daemon.d.ts +11 -0
- package/dist/cli/daemon/daemon.js +186 -0
- package/dist/cli/daemon/dev-server.d.ts +26 -0
- package/dist/cli/daemon/dev-server.js +81 -0
- package/dist/cli/daemon/pid.d.ts +34 -0
- package/dist/cli/daemon/pid.js +67 -0
- package/dist/cli/daemon/send-request.d.ts +24 -0
- package/dist/cli/daemon/send-request.js +92 -0
- package/dist/cli/handlers/context-read-handler.d.ts +18 -0
- package/dist/cli/handlers/context-read-handler.js +24 -0
- package/dist/cli/handlers/edit-handler.d.ts +30 -0
- package/dist/cli/handlers/edit-handler.js +133 -0
- package/dist/cli/handlers/globe-read-handler.d.ts +17 -0
- package/dist/cli/handlers/globe-read-handler.js +23 -0
- package/dist/cli/handlers/read-handler.d.ts +16 -0
- package/dist/cli/handlers/read-handler.js +78 -0
- package/dist/cli/handlers/rem-cache.d.ts +19 -0
- package/dist/cli/handlers/rem-cache.js +63 -0
- package/dist/cli/handlers/tree-edit-handler.d.ts +30 -0
- package/dist/cli/handlers/tree-edit-handler.js +188 -0
- package/dist/cli/handlers/tree-parser.d.ts +95 -0
- package/dist/cli/handlers/tree-parser.js +506 -0
- package/dist/cli/handlers/tree-read-handler.d.ts +28 -0
- package/dist/cli/handlers/tree-read-handler.js +53 -0
- package/dist/cli/main.d.ts +7 -0
- package/dist/cli/main.js +300 -0
- package/dist/cli/protocol.d.ts +39 -0
- package/dist/cli/protocol.js +35 -0
- package/dist/cli/server/config-server.d.ts +26 -0
- package/dist/cli/server/config-server.js +363 -0
- package/dist/cli/server/ws-server.d.ts +68 -0
- package/dist/cli/server/ws-server.js +335 -0
- package/dist/cli/utils/output.d.ts +11 -0
- package/dist/cli/utils/output.js +13 -0
- package/dist/mcp/daemon-client.d.ts +31 -0
- package/dist/mcp/daemon-client.js +99 -0
- package/dist/mcp/index.d.ts +7 -0
- package/dist/mcp/index.js +68 -0
- package/dist/mcp/instructions.d.ts +1 -0
- package/dist/mcp/instructions.js +249 -0
- package/dist/mcp/resources/edit-tree-guide.d.ts +1 -0
- package/dist/mcp/resources/edit-tree-guide.js +197 -0
- package/dist/mcp/resources/error-reference.d.ts +1 -0
- package/dist/mcp/resources/error-reference.js +132 -0
- package/dist/mcp/resources/outline-format.d.ts +1 -0
- package/dist/mcp/resources/outline-format.js +104 -0
- package/dist/mcp/resources/rem-object-fields.d.ts +1 -0
- package/dist/mcp/resources/rem-object-fields.js +331 -0
- package/dist/mcp/resources/separator-flashcard.d.ts +1 -0
- package/dist/mcp/resources/separator-flashcard.js +120 -0
- package/dist/mcp/tools/edit-tools.d.ts +5 -0
- package/dist/mcp/tools/edit-tools.js +47 -0
- package/dist/mcp/tools/infra-tools.d.ts +5 -0
- package/dist/mcp/tools/infra-tools.js +43 -0
- package/dist/mcp/tools/read-tools.d.ts +5 -0
- package/dist/mcp/tools/read-tools.js +195 -0
- package/dist/mcp/types.d.ts +12 -0
- package/dist/mcp/types.js +4 -0
- package/docs/instruction/connect.md +158 -0
- package/docs/instruction/disconnect.md +146 -0
- package/docs/instruction/edit-rem.md +509 -0
- package/docs/instruction/edit-tree.md +419 -0
- package/docs/instruction/health.md +159 -0
- package/docs/instruction/overall.md +751 -0
- package/docs/instruction/read-context.md +353 -0
- package/docs/instruction/read-globe.md +206 -0
- package/docs/instruction/read-rem.md +476 -0
- package/docs/instruction/read-tree.md +428 -0
- package/docs/instruction/search.md +196 -0
- package/package.json +41 -0
- package/remnote-plugin/package.json +48 -0
- package/remnote-plugin/postcss.config.js +5 -0
- package/remnote-plugin/public/bridge-icon.svg +8 -0
- package/remnote-plugin/public/manifest.json +22 -0
- package/remnote-plugin/src/bridge/message-router.ts +57 -0
- package/remnote-plugin/src/bridge/websocket-client.ts +245 -0
- package/remnote-plugin/src/index.css +1 -0
- package/remnote-plugin/src/services/breadcrumb.ts +26 -0
- package/remnote-plugin/src/services/create-rem.ts +59 -0
- package/remnote-plugin/src/services/delete-rem.ts +29 -0
- package/remnote-plugin/src/services/index.ts +16 -0
- package/remnote-plugin/src/services/move-rem.ts +39 -0
- package/remnote-plugin/src/services/powerup-filter.ts +31 -0
- package/remnote-plugin/src/services/read-context.ts +368 -0
- package/remnote-plugin/src/services/read-globe.ts +197 -0
- package/remnote-plugin/src/services/read-rem.ts +284 -0
- package/remnote-plugin/src/services/read-tree.ts +222 -0
- package/remnote-plugin/src/services/rem-builder.ts +124 -0
- package/remnote-plugin/src/services/reorder-children.ts +61 -0
- package/remnote-plugin/src/services/search.ts +56 -0
- package/remnote-plugin/src/services/write-rem-fields.ts +254 -0
- package/remnote-plugin/src/settings.ts +12 -0
- package/remnote-plugin/src/style.css +45 -0
- package/remnote-plugin/src/test-scripts/AGENTS.md +46 -0
- package/remnote-plugin/src/test-scripts/test-actions.ts +230 -0
- package/remnote-plugin/src/test-scripts/test-powerup-rendering.ts +722 -0
- package/remnote-plugin/src/test-scripts/test-rem-type-mapping.ts +283 -0
- package/remnote-plugin/src/test-scripts/test-richtext-builder.ts +207 -0
- package/remnote-plugin/src/test-scripts/test-richtext-matrix.ts +332 -0
- package/remnote-plugin/src/test-scripts/test-richtext-remaining.ts +245 -0
- package/remnote-plugin/src/test-scripts/test-rw-fields.ts +399 -0
- package/remnote-plugin/src/types.ts +419 -0
- package/remnote-plugin/src/utils/elision.ts +45 -0
- package/remnote-plugin/src/utils/index.ts +10 -0
- package/remnote-plugin/src/utils/tree-serializer.ts +269 -0
- package/remnote-plugin/src/widgets/bridge_widget.tsx +170 -0
- package/remnote-plugin/src/widgets/index.tsx +82 -0
- package/remnote-plugin/tailwind.config.js +7 -0
- package/remnote-plugin/tsconfig.json +21 -0
- package/remnote-plugin/webpack.config.js +125 -0
- package/skill/SKILL.md +428 -0
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
# read-context
|
|
2
|
+
|
|
3
|
+
> 读取当前上下文视图,支持 focus(鱼眼)和 page(页面)两种模式,提供以焦点为中心的渐进式上下文。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 功能
|
|
8
|
+
|
|
9
|
+
`read-context` 根据用户在 RemNote 中的当前位置,生成上下文感知的 Markdown 大纲。两种模式适用于不同场景:
|
|
10
|
+
|
|
11
|
+
- **focus 模式**(默认):以当前焦点 Rem 为中心,向上追溯祖先,构建鱼眼视图——焦点完全展开,周围递减
|
|
12
|
+
- **page 模式**:以当前打开的页面 Rem 为根,均匀展开子树
|
|
13
|
+
|
|
14
|
+
核心能力:
|
|
15
|
+
- 鱼眼深度梯度(focus 模式):焦点 depth=3、siblings depth=1、叔伯 depth=0
|
|
16
|
+
- 面包屑路径:输出从根到当前位置的完整路径
|
|
17
|
+
- 焦点标记:焦点 Rem 的文本前缀 `* `,便于快速定位
|
|
18
|
+
- 三个维度的预算控制:深度(depth/ancestorLevels)、全局节点上限(maxNodes)、单层兄弟上限(maxSiblings)
|
|
19
|
+
- Powerup 噪音过滤(硬编码过滤,无选项)
|
|
20
|
+
- Portal 感知:识别 Portal 类型并输出引用的 Rem ID
|
|
21
|
+
- **无缓存**——每次调用都从 SDK 获取最新数据
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 用法
|
|
26
|
+
|
|
27
|
+
### 人类模式
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
remnote-bridge read-context [--mode <mode>] [--ancestor-levels <N>] [--depth <N>] [--max-nodes <N>] [--max-siblings <N>]
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
| 参数/选项 | 类型 | 必需 | 说明 |
|
|
34
|
+
|-----------|------|:----:|------|
|
|
35
|
+
| `--mode <mode>` | string | 否 | 模式:`focus`(默认)或 `page` |
|
|
36
|
+
| `--ancestor-levels <N>` | integer | 否 | 向上追溯几层祖先(默认 2,仅 focus 模式) |
|
|
37
|
+
| `--depth <N>` | integer | 否 | 展开深度(默认 3,仅 page 模式) |
|
|
38
|
+
| `--max-nodes <N>` | integer | 否 | 全局节点上限(默认 200) |
|
|
39
|
+
| `--max-siblings <N>` | integer | 否 | 每个父节点下展示的 children 上限(默认 20) |
|
|
40
|
+
|
|
41
|
+
Focus 模式输出示例:
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
<!-- path: 机器学习笔记 > 监督学习 > 线性回归 -->
|
|
45
|
+
<!-- focus: 线性回归 (id3) -->
|
|
46
|
+
监督学习 <!--id1 doc-->
|
|
47
|
+
逻辑回归 <!--id2 doc children:5-->
|
|
48
|
+
* 线性回归 <!--id3 doc-->
|
|
49
|
+
损失函数 <!--id4-->
|
|
50
|
+
均方误差 <!--id5-->
|
|
51
|
+
交叉熵 <!--id6-->
|
|
52
|
+
梯度下降 <!--id7-->
|
|
53
|
+
正则化 <!--id8 children:3-->
|
|
54
|
+
决策树 <!--id9 doc children:8-->
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Page 模式输出示例:
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
<!-- page: 机器学习笔记 -->
|
|
61
|
+
<!-- path: 机器学习笔记 -->
|
|
62
|
+
机器学习笔记 <!--kLr doc top-->
|
|
63
|
+
监督学习 <!--id1 doc-->
|
|
64
|
+
线性回归 <!--id3 doc-->
|
|
65
|
+
逻辑回归 <!--id2 doc-->
|
|
66
|
+
无监督学习 <!--id4 doc-->
|
|
67
|
+
聚类 <!--id10-->
|
|
68
|
+
降维 <!--id11-->
|
|
69
|
+
<!--...elided 3 siblings (parent:kLr range:2-4 total:5)-->
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### JSON 模式
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
remnote-bridge read-context --json '{"mode":"focus","ancestorLevels":3,"maxNodes":100}'
|
|
76
|
+
remnote-bridge read-context --json '{"mode":"page","depth":5,"maxSiblings":10}'
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## JSON 输入参数
|
|
82
|
+
|
|
83
|
+
| 字段 | 类型 | 必需 | 说明 |
|
|
84
|
+
|------|------|:----:|------|
|
|
85
|
+
| `mode` | string | 否 | 模式:`"focus"` 或 `"page"`(默认 `"focus"`) |
|
|
86
|
+
| `ancestorLevels` | number | 否 | 向上追溯几层祖先(默认 2,仅 focus 模式) |
|
|
87
|
+
| `depth` | number | 否 | 展开深度(默认 3,仅 page 模式) |
|
|
88
|
+
| `maxNodes` | number | 否 | 全局节点上限(默认 200) |
|
|
89
|
+
| `maxSiblings` | number | 否 | 每个父节点下展示的 children 上限(默认 20) |
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## JSON 输出
|
|
94
|
+
|
|
95
|
+
### 成功(focus 模式)
|
|
96
|
+
|
|
97
|
+
```json
|
|
98
|
+
{
|
|
99
|
+
"ok": true,
|
|
100
|
+
"command": "read-context",
|
|
101
|
+
"data": {
|
|
102
|
+
"nodeCount": 42,
|
|
103
|
+
"outline": "<!-- path: Root > Docs > My Note -->\n<!-- focus: My Note (remId1) -->\n* My Note <!--remId1 type:concept-->\n SubItem <!--remId2-->\n...",
|
|
104
|
+
"breadcrumb": ["Root", "Docs", "My Note"],
|
|
105
|
+
"mode": "focus"
|
|
106
|
+
},
|
|
107
|
+
"timestamp": "2026-03-07T10:00:00.000Z"
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### 成功(page 模式)
|
|
112
|
+
|
|
113
|
+
```json
|
|
114
|
+
{
|
|
115
|
+
"ok": true,
|
|
116
|
+
"command": "read-context",
|
|
117
|
+
"data": {
|
|
118
|
+
"nodeCount": 25,
|
|
119
|
+
"outline": "<!-- page: My Note -->\n<!-- path: Root > Docs > My Note -->\nMy Note <!--remId1 doc-->\n SubItem <!--remId2-->\n...",
|
|
120
|
+
"breadcrumb": ["Root", "Docs", "My Note"],
|
|
121
|
+
"mode": "page"
|
|
122
|
+
},
|
|
123
|
+
"timestamp": "2026-03-07T10:00:00.000Z"
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### 无焦点 Rem(focus 模式)
|
|
128
|
+
|
|
129
|
+
```json
|
|
130
|
+
{
|
|
131
|
+
"ok": false,
|
|
132
|
+
"command": "read-context",
|
|
133
|
+
"error": "当前没有聚焦的 Rem,请先在 RemNote 中点击一个 Rem",
|
|
134
|
+
"timestamp": "2026-03-07T10:00:00.000Z"
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### 无打开的页面(page 模式)
|
|
139
|
+
|
|
140
|
+
```json
|
|
141
|
+
{
|
|
142
|
+
"ok": false,
|
|
143
|
+
"command": "read-context",
|
|
144
|
+
"error": "无法获取当前面板 ID,请确保有打开的页面",
|
|
145
|
+
"timestamp": "2026-03-07T10:00:00.000Z"
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### 参数错误
|
|
150
|
+
|
|
151
|
+
```json
|
|
152
|
+
{
|
|
153
|
+
"ok": false,
|
|
154
|
+
"command": "read-context",
|
|
155
|
+
"error": "--mode must be \"focus\" or \"page\"",
|
|
156
|
+
"timestamp": "2026-03-07T10:00:00.000Z"
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
```json
|
|
161
|
+
{
|
|
162
|
+
"ok": false,
|
|
163
|
+
"command": "read-context",
|
|
164
|
+
"error": "numeric options must be numbers",
|
|
165
|
+
"timestamp": "2026-03-07T10:00:00.000Z"
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### daemon 不可达
|
|
170
|
+
|
|
171
|
+
```json
|
|
172
|
+
{
|
|
173
|
+
"ok": false,
|
|
174
|
+
"command": "read-context",
|
|
175
|
+
"error": "守护进程未运行,请先执行 remnote-bridge connect",
|
|
176
|
+
"timestamp": "2026-03-07T10:00:00.000Z"
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## 内部流程
|
|
183
|
+
|
|
184
|
+
```
|
|
185
|
+
1. CLI 解析参数(mode, ancestorLevels, depth, maxNodes, maxSiblings)
|
|
186
|
+
2. sendRequest → WS → daemon
|
|
187
|
+
3. daemon ContextReadHandler:
|
|
188
|
+
├─ 合并配置默认值(config.ts)
|
|
189
|
+
└─ forwardToPlugin('read_context', { mode, ancestorLevels, depth, maxNodes, maxSiblings })
|
|
190
|
+
4. Plugin 端 readContext() 分支:
|
|
191
|
+
│
|
|
192
|
+
├─ mode === 'focus' → readContextFocus():
|
|
193
|
+
│ ├─ plugin.focus.getFocusedRem() → 获取焦点 Rem
|
|
194
|
+
│ ├─ 向上追溯 ancestorLevels 层 → ancestorPath[]
|
|
195
|
+
│ ├─ buildBreadcrumb(plugin, focusRem) → 面包屑路径
|
|
196
|
+
│ ├─ 从最顶层祖先开始递归 buildFisheyeNode():
|
|
197
|
+
│ │ ├─ 获取子节点 → filterNoisyChildren(Powerup 过滤)
|
|
198
|
+
│ │ ├─ 鱼眼深度梯度判断:
|
|
199
|
+
│ │ │ ├─ 焦点本身 → depth=3,所有 children 可见
|
|
200
|
+
│ │ │ ├─ 焦点的 siblings → buildShallowNode(depth=1, maxChildrenPreview=3)
|
|
201
|
+
│ │ │ ├─ 祖先路径节点 → 继续鱼眼递归
|
|
202
|
+
│ │ │ └─ 叔伯节点 → buildShallowNode(depth=0, maxChildrenPreview=0)
|
|
203
|
+
│ │ ├─ sliceSiblings → maxSiblings 省略(前 70% + 后 30%)
|
|
204
|
+
│ │ ├─ maxNodes 预算检查 → 超限时停止递归
|
|
205
|
+
│ │ └─ Portal 感知(rem.type === 6 → getPortalDirectlyIncludedRem)
|
|
206
|
+
│ ├─ 序列化为 Markdown 大纲
|
|
207
|
+
│ │ ├─ 头部:<!-- path: ... --> + <!-- focus: Name (id) -->
|
|
208
|
+
│ │ ├─ 焦点 Rem 文本前缀 * 标记
|
|
209
|
+
│ │ └─ buildOutline() + 省略占位符
|
|
210
|
+
│ └─ 返回 { nodeCount, outline, breadcrumb, mode: 'focus' }
|
|
211
|
+
│
|
|
212
|
+
└─ mode === 'page' → readContextPage():
|
|
213
|
+
├─ plugin.window.getFocusedPaneId() → 获取当前面板
|
|
214
|
+
├─ plugin.window.getOpenPaneRemId(paneId) → 获取页面 Rem ID
|
|
215
|
+
├─ plugin.rem.findOne(remId) → 加载 Rem 对象
|
|
216
|
+
├─ buildBreadcrumb(plugin, pageRem) → 面包屑路径
|
|
217
|
+
├─ 递归 buildSubtreeNode():
|
|
218
|
+
│ ├─ 获取子节点 → filterNoisyChildren(Powerup 过滤)
|
|
219
|
+
│ ├─ depth 检查 → 到达 maxDepth 时折叠
|
|
220
|
+
│ ├─ sliceSiblings → maxSiblings 省略(前 70% + 后 30%)
|
|
221
|
+
│ ├─ maxNodes 预算检查 → 超限时停止递归
|
|
222
|
+
│ └─ Portal 感知
|
|
223
|
+
├─ 序列化为 Markdown 大纲
|
|
224
|
+
│ ├─ 头部:<!-- page: Name --> + <!-- path: ... -->
|
|
225
|
+
│ └─ buildOutline() + 省略占位符
|
|
226
|
+
└─ 返回 { nodeCount, outline, breadcrumb, mode: 'page' }
|
|
227
|
+
5. CLI 格式化输出(人类模式打印 outline / JSON 模式单行)
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
## 输出字段说明
|
|
233
|
+
|
|
234
|
+
| 字段 | 类型 | 说明 |
|
|
235
|
+
|------|------|------|
|
|
236
|
+
| `data.outline` | string | Markdown 大纲文本(核心输出) |
|
|
237
|
+
| `data.nodeCount` | number | 树中节点总数 |
|
|
238
|
+
| `data.breadcrumb` | string[] | 从根到当前位置的路径数组 |
|
|
239
|
+
| `data.mode` | string | 实际使用的模式:`"focus"` 或 `"page"` |
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
## Focus 模式:鱼眼深度梯度
|
|
244
|
+
|
|
245
|
+
focus 模式的核心特点是**渐进式展开**——离焦点越近,展开越深;离焦点越远,展开越浅:
|
|
246
|
+
|
|
247
|
+
| 节点角色 | 展开深度 | children 可见度 | 说明 |
|
|
248
|
+
|:---------|:---------|:---------------|:-----|
|
|
249
|
+
| 焦点本身 | depth=3 | 所有 children(受 maxSiblings 限制) | 完全展开 |
|
|
250
|
+
| 焦点的 siblings | depth=1 | 前 3 个 children | 浅层预览 |
|
|
251
|
+
| 祖先路径节点 | 递归展开 | 所有 children(受 maxSiblings 限制) | 沿路径展开 |
|
|
252
|
+
| 叔伯节点 | depth=0 | 不展开 | 仅显示标题 |
|
|
253
|
+
|
|
254
|
+
### 祖先追溯
|
|
255
|
+
|
|
256
|
+
`ancestorLevels` 控制从焦点 Rem 向上追溯几层祖先作为上下文起点:
|
|
257
|
+
- 默认 2:从焦点的祖父级开始展示
|
|
258
|
+
- 设为 0:仅展示焦点本身及其子树
|
|
259
|
+
- 更大的值提供更多上下文,但输出也更长
|
|
260
|
+
|
|
261
|
+
### 焦点标记
|
|
262
|
+
|
|
263
|
+
焦点 Rem 的 Markdown 文本以 `* ` 前缀标记,便于 Agent 在大纲中快速定位:
|
|
264
|
+
|
|
265
|
+
```
|
|
266
|
+
监督学习 <!--id1-->
|
|
267
|
+
* 线性回归 <!--id3--> ← 焦点 Rem
|
|
268
|
+
损失函数 <!--id4-->
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## 两种模式对比
|
|
274
|
+
|
|
275
|
+
| 维度 | focus 模式 | page 模式 |
|
|
276
|
+
|:-----|:----------|:----------|
|
|
277
|
+
| 触发点 | 当前焦点 Rem(光标位置) | 当前打开的页面 Rem |
|
|
278
|
+
| SDK 入口 | `plugin.focus.getFocusedRem()` | `plugin.window.getFocusedPaneId()` → `getOpenPaneRemId()` |
|
|
279
|
+
| 深度参数 | `ancestorLevels`(向上几层) | `depth`(向下几层) |
|
|
280
|
+
| 展开策略 | 鱼眼(焦点完全展开,周围递减) | 均匀展开(全树同深度控制) |
|
|
281
|
+
| 大纲头注释 | `<!-- path: ... -->` + `<!-- focus: Name (id) -->` | `<!-- page: Name -->` + `<!-- path: ... -->` |
|
|
282
|
+
| 适用场景 | 精确定位到某个 Rem 的上下文 | 浏览整个页面的结构 |
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
## 与 read-tree 的关键差异
|
|
287
|
+
|
|
288
|
+
| 维度 | read-tree | read-context |
|
|
289
|
+
|:-----|:---------|:------------|
|
|
290
|
+
| 入口参数 | `remId`(指定 Rem) | 无(自动获取当前焦点/页面) |
|
|
291
|
+
| 展开规则 | 递归展开**所有** children | focus: 鱼眼梯度 / page: 均匀展开 |
|
|
292
|
+
| 面包屑 | 可选(`--ancestor-levels`) | **内置**(始终输出 breadcrumb) |
|
|
293
|
+
| 缓存 | 有(供 edit-tree 使用) | **无缓存** |
|
|
294
|
+
| 焦点标记 | 无 | focus 模式 `* ` 前缀 |
|
|
295
|
+
| Powerup 过滤选项 | `--includePowerup` | 硬编码过滤(无选项) |
|
|
296
|
+
| 序列化方式 | 完整字段(buildFullSerializableRem) | 最小字段(createMinimalSerializableRem) |
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
## 预算控制
|
|
301
|
+
|
|
302
|
+
三个维度协作限制输出规模:
|
|
303
|
+
|
|
304
|
+
### ancestorLevels / depth
|
|
305
|
+
|
|
306
|
+
- **focus 模式**:`ancestorLevels` 控制向上追溯几层祖先(默认 2)
|
|
307
|
+
- **page 模式**:`depth` 控制向下展开几层(默认 3,-1 为无限)
|
|
308
|
+
- 到达深度限制时折叠,标注 `children:N`
|
|
309
|
+
|
|
310
|
+
### maxSiblings(单层上限)
|
|
311
|
+
|
|
312
|
+
- 默认 20
|
|
313
|
+
- 超限时保留前 70%(`ceil(max * 0.7)`)+ 后 30%(`floor(max * 0.3)`),中间插入省略行
|
|
314
|
+
|
|
315
|
+
### maxNodes(全局节点上限)
|
|
316
|
+
|
|
317
|
+
- 默认 200
|
|
318
|
+
- 每访问一个节点,预算递减 1
|
|
319
|
+
- 预算耗尽后,剩余节点生成非精确省略占位符
|
|
320
|
+
|
|
321
|
+
---
|
|
322
|
+
|
|
323
|
+
## 退出码
|
|
324
|
+
|
|
325
|
+
| 退出码 | 含义 | 触发条件 |
|
|
326
|
+
|:------:|------|----------|
|
|
327
|
+
| 0 | 成功 | 读取成功 |
|
|
328
|
+
| 1 | 业务错误 | 参数无效、无焦点 Rem、Plugin 异常等 |
|
|
329
|
+
| 2 | daemon 不可达 | daemon 未运行或 WS 连接失败 |
|
|
330
|
+
|
|
331
|
+
---
|
|
332
|
+
|
|
333
|
+
## 配置依赖
|
|
334
|
+
|
|
335
|
+
| 配置项 | 默认值 | 说明 |
|
|
336
|
+
|--------|--------|------|
|
|
337
|
+
| `defaults.readContextMode` | `"focus"` | 默认模式 |
|
|
338
|
+
| `defaults.readContextAncestorLevels` | 2 | focus 模式默认祖先层数 |
|
|
339
|
+
| `defaults.readContextDepth` | 3 | page 模式默认展开深度 |
|
|
340
|
+
| `defaults.maxNodes` | 200 | 默认全局节点上限 |
|
|
341
|
+
| `defaults.maxSiblings` | 20 | 默认单层兄弟上限 |
|
|
342
|
+
|
|
343
|
+
---
|
|
344
|
+
|
|
345
|
+
## 注意事项
|
|
346
|
+
|
|
347
|
+
- read-context **不缓存**结果——每次调用都重新从 SDK 获取最新数据
|
|
348
|
+
- focus 模式需要用户在 RemNote 中有焦点 Rem(光标需在某个 Rem 上)
|
|
349
|
+
- page 模式需要 RemNote 中有打开的页面
|
|
350
|
+
- 输出使用 `createMinimalSerializableRem` 序列化,不包含 backText、practiceDirection 等详细信息
|
|
351
|
+
- Powerup 过滤是硬编码的,无法通过参数关闭
|
|
352
|
+
- Portal 感知:Portal 类型的 Rem(`type === 6`)会标注 `type:portal` 和 `refs:{id1,id2,...}`
|
|
353
|
+
- 面包屑路径通过 `buildBreadcrumb()` 从当前 Rem 向上追溯到根构建,每层使用 Markdown 文本
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
# read-globe
|
|
2
|
+
|
|
3
|
+
> 读取知识库全局概览,仅展开 Document 层级,提供知识库的宏观结构视图。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 功能
|
|
8
|
+
|
|
9
|
+
`read-globe` 获取知识库中所有顶层 Rem(`parent === null`),过滤出 Document 类型的节点,递归展开为 Markdown 大纲。非 Document 的子 Rem 不会递归展开,仅在元数据中标注 `children:N`。
|
|
10
|
+
|
|
11
|
+
核心能力:
|
|
12
|
+
- 仅展开 Document 层级,过滤非文档内容
|
|
13
|
+
- 三个维度的预算控制:深度(depth)、全局节点上限(maxNodes)、单层兄弟上限(maxSiblings)
|
|
14
|
+
- Powerup 噪音过滤(硬编码过滤,无选项)
|
|
15
|
+
- Portal 感知:识别 Portal 类型并输出引用的 Rem ID
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 用法
|
|
20
|
+
|
|
21
|
+
### 人类模式
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
remnote-bridge read-globe [--depth <N>] [--max-nodes <N>] [--max-siblings <N>]
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
| 参数/选项 | 类型 | 必需 | 说明 |
|
|
28
|
+
|-----------|------|:----:|------|
|
|
29
|
+
| `--depth <N>` | integer | 否 | Document 嵌套深度(默认 -1,无限展开) |
|
|
30
|
+
| `--max-nodes <N>` | integer | 否 | 全局节点上限(默认 200) |
|
|
31
|
+
| `--max-siblings <N>` | integer | 否 | 每个父节点下展示的 Document 子节点上限(默认 20) |
|
|
32
|
+
|
|
33
|
+
输出示例:
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
<!-- globe: 知识库概览 -->
|
|
37
|
+
机器学习笔记 <!--kLr doc top-->
|
|
38
|
+
监督学习 <!--id1 doc-->
|
|
39
|
+
线性回归 <!--id2 doc-->
|
|
40
|
+
逻辑回归 <!--id3 doc-->
|
|
41
|
+
无监督学习 <!--id4 doc children:3-->
|
|
42
|
+
项目管理 <!--id5 doc top-->
|
|
43
|
+
<!--...elided 3 siblings (parent:id5 range:2-4 total:5)-->
|
|
44
|
+
数学基础 <!--id6 doc top-->
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### JSON 模式
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
remnote-bridge read-globe --json '{"depth":-1,"maxNodes":100,"maxSiblings":10}'
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## JSON 输入参数
|
|
56
|
+
|
|
57
|
+
| 字段 | 类型 | 必需 | 说明 |
|
|
58
|
+
|------|------|:----:|------|
|
|
59
|
+
| `depth` | number | 否 | Document 嵌套深度(-1 = 无限,默认 -1) |
|
|
60
|
+
| `maxNodes` | number | 否 | 全局节点上限(默认 200) |
|
|
61
|
+
| `maxSiblings` | number | 否 | 每个父节点下展示的 Document 子节点上限(默认 20) |
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## JSON 输出
|
|
66
|
+
|
|
67
|
+
### 成功
|
|
68
|
+
|
|
69
|
+
```json
|
|
70
|
+
{
|
|
71
|
+
"ok": true,
|
|
72
|
+
"command": "read-globe",
|
|
73
|
+
"data": {
|
|
74
|
+
"nodeCount": 42,
|
|
75
|
+
"outline": "<!-- globe: 知识库概览 -->\n机器学习笔记 <!--kLr doc top-->\n 监督学习 <!--id1 doc-->\n..."
|
|
76
|
+
},
|
|
77
|
+
"timestamp": "2026-03-07T10:00:00.000Z"
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### daemon 不可达
|
|
82
|
+
|
|
83
|
+
```json
|
|
84
|
+
{
|
|
85
|
+
"ok": false,
|
|
86
|
+
"command": "read-globe",
|
|
87
|
+
"error": "守护进程未运行,请先执行 remnote-bridge connect",
|
|
88
|
+
"timestamp": "2026-03-07T10:00:00.000Z"
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### 参数错误
|
|
93
|
+
|
|
94
|
+
```json
|
|
95
|
+
{
|
|
96
|
+
"ok": false,
|
|
97
|
+
"command": "read-globe",
|
|
98
|
+
"error": "--depth, --max-nodes, --max-siblings must be numbers",
|
|
99
|
+
"timestamp": "2026-03-07T10:00:00.000Z"
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## 内部流程
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
1. CLI 解析参数(depth, maxNodes, maxSiblings)
|
|
109
|
+
2. sendRequest → WS → daemon
|
|
110
|
+
3. daemon GlobeReadHandler:
|
|
111
|
+
├─ 应用配置默认值(config.ts)
|
|
112
|
+
└─ forwardToPlugin('read_globe', { depth, maxNodes, maxSiblings })
|
|
113
|
+
4. Plugin 端 readGlobe():
|
|
114
|
+
├─ plugin.rem.getAll() → 获取所有 Rem
|
|
115
|
+
├─ 过滤 parent === null 的顶层 Rem
|
|
116
|
+
├─ 并行检查 isDocument() → 仅保留 Document
|
|
117
|
+
├─ 递归构建 Document 树(buildGlobeNode):
|
|
118
|
+
│ ├─ 获取子节点 → filterNoisyChildren(Powerup 过滤)
|
|
119
|
+
│ ├─ 二次过滤:仅保留 Document 子节点
|
|
120
|
+
│ ├─ 统计非 Document 子节点数量(标注 children:N)
|
|
121
|
+
│ ├─ depth 检查 → 折叠/展开
|
|
122
|
+
│ ├─ sliceSiblings → maxSiblings 省略(前 70% + 后 30%)
|
|
123
|
+
│ ├─ maxNodes 预算检查 → 超限时停止递归
|
|
124
|
+
│ └─ Portal 感知(rem.type === 6 → getPortalDirectlyIncludedRem)
|
|
125
|
+
├─ 序列化为 Markdown 大纲
|
|
126
|
+
│ ├─ 头部:<!-- globe: 知识库概览 -->
|
|
127
|
+
│ ├─ 每个顶层 Document 调用 buildOutline()
|
|
128
|
+
│ └─ 省略占位符调用 serializeElidedLine()
|
|
129
|
+
└─ 返回 { nodeCount, outline }
|
|
130
|
+
5. CLI 格式化输出(人类模式打印 outline / JSON 模式单行)
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## 输出字段说明
|
|
136
|
+
|
|
137
|
+
| 字段 | 类型 | 说明 |
|
|
138
|
+
|------|------|------|
|
|
139
|
+
| `data.outline` | string | Markdown 大纲文本(核心输出) |
|
|
140
|
+
| `data.nodeCount` | number | 树中 Document 节点总数 |
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## 与 read-tree 的关键差异
|
|
145
|
+
|
|
146
|
+
| 维度 | read-tree | read-globe |
|
|
147
|
+
|:-----|:---------|:----------|
|
|
148
|
+
| 入口参数 | `remId`(指定 Rem) | 无(整个知识库) |
|
|
149
|
+
| 展开规则 | 递归展开**所有** children | **仅递归展开 Document** 子节点 |
|
|
150
|
+
| 非 Document 处理 | 正常展开 | 不展开,标注 `children:N` |
|
|
151
|
+
| 默认 depth | 3 | -1(无限) |
|
|
152
|
+
| 缓存 | 有(供 edit-tree 使用) | **无缓存** |
|
|
153
|
+
| Powerup 过滤选项 | `--includePowerup` | 硬编码过滤(无选项) |
|
|
154
|
+
| 序列化方式 | 完整字段(buildFullSerializableRem) | 最小字段(createMinimalSerializableRem) |
|
|
155
|
+
| 祖先路径 | 支持 `--ancestor-levels` | 不支持 |
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## 预算控制
|
|
160
|
+
|
|
161
|
+
三个维度协作限制输出规模:
|
|
162
|
+
|
|
163
|
+
### depth(Document 嵌套深度)
|
|
164
|
+
|
|
165
|
+
- 默认 -1(无限展开所有 Document 层级)
|
|
166
|
+
- 当 `currentDepth >= depth` 且有 Document 子节点时,折叠并标注 `children:N`
|
|
167
|
+
|
|
168
|
+
### maxSiblings(单层 Document 上限)
|
|
169
|
+
|
|
170
|
+
- 默认 20
|
|
171
|
+
- 超限时保留前 70%(`ceil(max * 0.7)`)+ 后 30%(`floor(max * 0.3)`),中间插入省略行
|
|
172
|
+
|
|
173
|
+
### maxNodes(全局节点上限)
|
|
174
|
+
|
|
175
|
+
- 默认 200
|
|
176
|
+
- 每访问一个 Document 节点,预算递减 1
|
|
177
|
+
- 预算耗尽后,剩余节点生成非精确省略占位符
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## 退出码
|
|
182
|
+
|
|
183
|
+
| 退出码 | 含义 | 触发条件 |
|
|
184
|
+
|:------:|------|----------|
|
|
185
|
+
| 0 | 成功 | 读取成功 |
|
|
186
|
+
| 1 | 业务错误 | 参数非数字、Plugin 异常等 |
|
|
187
|
+
| 2 | daemon 不可达 | daemon 未运行或 WS 连接失败 |
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## 配置依赖
|
|
192
|
+
|
|
193
|
+
| 配置项 | 默认值 | 说明 |
|
|
194
|
+
|--------|--------|------|
|
|
195
|
+
| `defaults.readGlobeDepth` | -1 | 默认 Document 嵌套深度 |
|
|
196
|
+
| `defaults.maxNodes` | 200 | 默认全局节点上限 |
|
|
197
|
+
| `defaults.maxSiblings` | 20 | 默认单层兄弟上限 |
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## 注意事项
|
|
202
|
+
|
|
203
|
+
- read-globe **不缓存**结果——每次调用都重新从 SDK 获取最新数据
|
|
204
|
+
- 输出中非 Document 子 Rem 的数量通过 `children:N` 标注,但不包含在 `nodeCount` 中
|
|
205
|
+
- Powerup 过滤是硬编码的,无法通过参数关闭
|
|
206
|
+
- 输出使用 `createMinimalSerializableRem` 序列化,不包含闪卡方向、backText 等详细信息——仅提供文档层级结构概览
|