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.
Files changed (135) hide show
  1. package/dist/cli/commands/connect.d.ts +12 -0
  2. package/dist/cli/commands/connect.js +124 -0
  3. package/dist/cli/commands/disconnect.d.ts +11 -0
  4. package/dist/cli/commands/disconnect.js +100 -0
  5. package/dist/cli/commands/edit-rem.d.ts +13 -0
  6. package/dist/cli/commands/edit-rem.js +83 -0
  7. package/dist/cli/commands/edit-tree.d.ts +14 -0
  8. package/dist/cli/commands/edit-tree.js +67 -0
  9. package/dist/cli/commands/health.d.ts +12 -0
  10. package/dist/cli/commands/health.js +100 -0
  11. package/dist/cli/commands/install-skill.d.ts +6 -0
  12. package/dist/cli/commands/install-skill.js +39 -0
  13. package/dist/cli/commands/read-context.d.ts +20 -0
  14. package/dist/cli/commands/read-context.js +77 -0
  15. package/dist/cli/commands/read-globe.d.ts +16 -0
  16. package/dist/cli/commands/read-globe.js +60 -0
  17. package/dist/cli/commands/read-rem.d.ts +16 -0
  18. package/dist/cli/commands/read-rem.js +80 -0
  19. package/dist/cli/commands/read-tree.d.ts +17 -0
  20. package/dist/cli/commands/read-tree.js +85 -0
  21. package/dist/cli/commands/search.d.ts +12 -0
  22. package/dist/cli/commands/search.js +65 -0
  23. package/dist/cli/config.d.ts +55 -0
  24. package/dist/cli/config.js +139 -0
  25. package/dist/cli/daemon/daemon.d.ts +11 -0
  26. package/dist/cli/daemon/daemon.js +186 -0
  27. package/dist/cli/daemon/dev-server.d.ts +26 -0
  28. package/dist/cli/daemon/dev-server.js +81 -0
  29. package/dist/cli/daemon/pid.d.ts +34 -0
  30. package/dist/cli/daemon/pid.js +67 -0
  31. package/dist/cli/daemon/send-request.d.ts +24 -0
  32. package/dist/cli/daemon/send-request.js +92 -0
  33. package/dist/cli/handlers/context-read-handler.d.ts +18 -0
  34. package/dist/cli/handlers/context-read-handler.js +24 -0
  35. package/dist/cli/handlers/edit-handler.d.ts +30 -0
  36. package/dist/cli/handlers/edit-handler.js +133 -0
  37. package/dist/cli/handlers/globe-read-handler.d.ts +17 -0
  38. package/dist/cli/handlers/globe-read-handler.js +23 -0
  39. package/dist/cli/handlers/read-handler.d.ts +16 -0
  40. package/dist/cli/handlers/read-handler.js +78 -0
  41. package/dist/cli/handlers/rem-cache.d.ts +19 -0
  42. package/dist/cli/handlers/rem-cache.js +63 -0
  43. package/dist/cli/handlers/tree-edit-handler.d.ts +30 -0
  44. package/dist/cli/handlers/tree-edit-handler.js +188 -0
  45. package/dist/cli/handlers/tree-parser.d.ts +95 -0
  46. package/dist/cli/handlers/tree-parser.js +506 -0
  47. package/dist/cli/handlers/tree-read-handler.d.ts +28 -0
  48. package/dist/cli/handlers/tree-read-handler.js +53 -0
  49. package/dist/cli/main.d.ts +7 -0
  50. package/dist/cli/main.js +300 -0
  51. package/dist/cli/protocol.d.ts +39 -0
  52. package/dist/cli/protocol.js +35 -0
  53. package/dist/cli/server/config-server.d.ts +26 -0
  54. package/dist/cli/server/config-server.js +363 -0
  55. package/dist/cli/server/ws-server.d.ts +68 -0
  56. package/dist/cli/server/ws-server.js +335 -0
  57. package/dist/cli/utils/output.d.ts +11 -0
  58. package/dist/cli/utils/output.js +13 -0
  59. package/dist/mcp/daemon-client.d.ts +31 -0
  60. package/dist/mcp/daemon-client.js +99 -0
  61. package/dist/mcp/index.d.ts +7 -0
  62. package/dist/mcp/index.js +68 -0
  63. package/dist/mcp/instructions.d.ts +1 -0
  64. package/dist/mcp/instructions.js +249 -0
  65. package/dist/mcp/resources/edit-tree-guide.d.ts +1 -0
  66. package/dist/mcp/resources/edit-tree-guide.js +197 -0
  67. package/dist/mcp/resources/error-reference.d.ts +1 -0
  68. package/dist/mcp/resources/error-reference.js +132 -0
  69. package/dist/mcp/resources/outline-format.d.ts +1 -0
  70. package/dist/mcp/resources/outline-format.js +104 -0
  71. package/dist/mcp/resources/rem-object-fields.d.ts +1 -0
  72. package/dist/mcp/resources/rem-object-fields.js +331 -0
  73. package/dist/mcp/resources/separator-flashcard.d.ts +1 -0
  74. package/dist/mcp/resources/separator-flashcard.js +120 -0
  75. package/dist/mcp/tools/edit-tools.d.ts +5 -0
  76. package/dist/mcp/tools/edit-tools.js +47 -0
  77. package/dist/mcp/tools/infra-tools.d.ts +5 -0
  78. package/dist/mcp/tools/infra-tools.js +43 -0
  79. package/dist/mcp/tools/read-tools.d.ts +5 -0
  80. package/dist/mcp/tools/read-tools.js +195 -0
  81. package/dist/mcp/types.d.ts +12 -0
  82. package/dist/mcp/types.js +4 -0
  83. package/docs/instruction/connect.md +158 -0
  84. package/docs/instruction/disconnect.md +146 -0
  85. package/docs/instruction/edit-rem.md +509 -0
  86. package/docs/instruction/edit-tree.md +419 -0
  87. package/docs/instruction/health.md +159 -0
  88. package/docs/instruction/overall.md +751 -0
  89. package/docs/instruction/read-context.md +353 -0
  90. package/docs/instruction/read-globe.md +206 -0
  91. package/docs/instruction/read-rem.md +476 -0
  92. package/docs/instruction/read-tree.md +428 -0
  93. package/docs/instruction/search.md +196 -0
  94. package/package.json +41 -0
  95. package/remnote-plugin/package.json +48 -0
  96. package/remnote-plugin/postcss.config.js +5 -0
  97. package/remnote-plugin/public/bridge-icon.svg +8 -0
  98. package/remnote-plugin/public/manifest.json +22 -0
  99. package/remnote-plugin/src/bridge/message-router.ts +57 -0
  100. package/remnote-plugin/src/bridge/websocket-client.ts +245 -0
  101. package/remnote-plugin/src/index.css +1 -0
  102. package/remnote-plugin/src/services/breadcrumb.ts +26 -0
  103. package/remnote-plugin/src/services/create-rem.ts +59 -0
  104. package/remnote-plugin/src/services/delete-rem.ts +29 -0
  105. package/remnote-plugin/src/services/index.ts +16 -0
  106. package/remnote-plugin/src/services/move-rem.ts +39 -0
  107. package/remnote-plugin/src/services/powerup-filter.ts +31 -0
  108. package/remnote-plugin/src/services/read-context.ts +368 -0
  109. package/remnote-plugin/src/services/read-globe.ts +197 -0
  110. package/remnote-plugin/src/services/read-rem.ts +284 -0
  111. package/remnote-plugin/src/services/read-tree.ts +222 -0
  112. package/remnote-plugin/src/services/rem-builder.ts +124 -0
  113. package/remnote-plugin/src/services/reorder-children.ts +61 -0
  114. package/remnote-plugin/src/services/search.ts +56 -0
  115. package/remnote-plugin/src/services/write-rem-fields.ts +254 -0
  116. package/remnote-plugin/src/settings.ts +12 -0
  117. package/remnote-plugin/src/style.css +45 -0
  118. package/remnote-plugin/src/test-scripts/AGENTS.md +46 -0
  119. package/remnote-plugin/src/test-scripts/test-actions.ts +230 -0
  120. package/remnote-plugin/src/test-scripts/test-powerup-rendering.ts +722 -0
  121. package/remnote-plugin/src/test-scripts/test-rem-type-mapping.ts +283 -0
  122. package/remnote-plugin/src/test-scripts/test-richtext-builder.ts +207 -0
  123. package/remnote-plugin/src/test-scripts/test-richtext-matrix.ts +332 -0
  124. package/remnote-plugin/src/test-scripts/test-richtext-remaining.ts +245 -0
  125. package/remnote-plugin/src/test-scripts/test-rw-fields.ts +399 -0
  126. package/remnote-plugin/src/types.ts +419 -0
  127. package/remnote-plugin/src/utils/elision.ts +45 -0
  128. package/remnote-plugin/src/utils/index.ts +10 -0
  129. package/remnote-plugin/src/utils/tree-serializer.ts +269 -0
  130. package/remnote-plugin/src/widgets/bridge_widget.tsx +170 -0
  131. package/remnote-plugin/src/widgets/index.tsx +82 -0
  132. package/remnote-plugin/tailwind.config.js +7 -0
  133. package/remnote-plugin/tsconfig.json +21 -0
  134. package/remnote-plugin/webpack.config.js +125 -0
  135. package/skill/SKILL.md +428 -0
@@ -0,0 +1,399 @@
1
+ /**
2
+ * RW 字段行为观察测试
3
+ *
4
+ * 每个 RW 字段创建一个**独立**的 Rem,清晰标注字段名,
5
+ * 方便截图逐个观察视觉行为。
6
+ */
7
+ import type { ReactRNPlugin, PluginRem as Rem } from '@remnote/plugin-sdk';
8
+
9
+ async function delay(ms: number) {
10
+ return new Promise((r) => setTimeout(r, ms));
11
+ }
12
+
13
+ export async function runRwFieldTests(plugin: ReactRNPlugin): Promise<void> {
14
+ // 防止重复运行
15
+ const alreadyRan = await plugin.storage.getSession('rw-test-v3-ran');
16
+ if (alreadyRan) {
17
+ console.log('[RW-TEST] 已运行过,跳过');
18
+ return;
19
+ }
20
+ await plugin.storage.setSession('rw-test-v3-ran', true);
21
+
22
+ console.log('[RW-TEST] ========== 开始逐字段行为观察 ==========');
23
+
24
+ try {
25
+ // ── 找到 "mcp 测试" 文档 ──
26
+ const allRem = await plugin.rem.getAll();
27
+ let parentDoc: Rem | undefined;
28
+ for (const r of allRem) {
29
+ const t = r.text ? await plugin.richText.toString(r.text) : '';
30
+ if (t.trim() === 'mcp 测试') { parentDoc = r; break; }
31
+ }
32
+ if (!parentDoc) { console.error('[RW-TEST] 找不到 "mcp 测试"'); return; }
33
+
34
+ // ── 先清理上次测试残留(以 "RW:" 开头的 Rem)──
35
+ const children = await parentDoc.getChildrenRem();
36
+ for (const c of children) {
37
+ const t = c.text ? await plugin.richText.toString(c.text) : '';
38
+ if (t.startsWith('RW:') || t.startsWith('辅助') || t.startsWith('兄弟') || t.startsWith('RW 字段测试') || t.startsWith('[PASS]') || t.startsWith('[FAIL]') || t.startsWith('测试文本')) {
39
+ await c.remove();
40
+ await delay(100);
41
+ }
42
+ }
43
+ await delay(500);
44
+
45
+ // 创建辅助 Rem(用于 tags/sources 测试)
46
+ const helperTag = await plugin.rem.createRem();
47
+ if (!helperTag) return;
48
+ await helperTag.setParent(parentDoc._id, 0);
49
+ await helperTag.setText(['辅助: 标签Rem']);
50
+ await delay(200);
51
+
52
+ const helperSource = await plugin.rem.createRem();
53
+ if (!helperSource) return;
54
+ await helperSource.setParent(parentDoc._id, 1);
55
+ await helperSource.setText(['辅助: 来源Rem']);
56
+ await delay(200);
57
+
58
+ let pos = 2; // 当前插入位置
59
+
60
+ // ── 工具函数:创建一个独立测试 Rem ──
61
+ async function createTestRem(label: string): Promise<Rem | null> {
62
+ const r = await plugin.rem.createRem();
63
+ if (!r) return null;
64
+ await r.setParent(parentDoc!._id, pos++);
65
+ await r.setText([`RW: ${label} — 初始状态`]);
66
+ await delay(300);
67
+ return r;
68
+ }
69
+
70
+ // ════════════════════════════════════════════════
71
+ // 1. text
72
+ // ════════════════════════════════════════════════
73
+ {
74
+ const r = await createTestRem('text');
75
+ if (r) {
76
+ // 默认文本已设为 "RW: text — 初始状态",改为新值
77
+ await r.setText(['RW: text — 已改为新文本内容']);
78
+ await delay(500);
79
+ console.log('[RW-TEST] text: done');
80
+ }
81
+ }
82
+
83
+ // ════════════════════════════════════════════════
84
+ // 2. backText
85
+ // ════════════════════════════════════════════════
86
+ {
87
+ const r = await createTestRem('backText');
88
+ if (r) {
89
+ await r.setBackText(['这是背面文本(答案面)']);
90
+ await delay(500);
91
+ console.log('[RW-TEST] backText: done');
92
+ }
93
+ }
94
+
95
+ // ════════════════════════════════════════════════
96
+ // 3. type = CONCEPT
97
+ // ════════════════════════════════════════════════
98
+ {
99
+ const r = await createTestRem('type=CONCEPT');
100
+ if (r) {
101
+ await r.setType(1 as any); // CONCEPT
102
+ await delay(500);
103
+ console.log('[RW-TEST] type=CONCEPT: done');
104
+ }
105
+ }
106
+
107
+ // ════════════════════════════════════════════════
108
+ // 4. type = DESCRIPTOR
109
+ // ════════════════════════════════════════════════
110
+ {
111
+ const r = await createTestRem('type=DESCRIPTOR');
112
+ if (r) {
113
+ await r.setType(2 as any); // DESCRIPTOR
114
+ await delay(500);
115
+ console.log('[RW-TEST] type=DESCRIPTOR: done');
116
+ }
117
+ }
118
+
119
+ // ════════════════════════════════════════════════
120
+ // 5. isDocument = true
121
+ // ════════════════════════════════════════════════
122
+ {
123
+ const r = await createTestRem('isDocument=true');
124
+ if (r) {
125
+ await r.setIsDocument(true);
126
+ await delay(500);
127
+ console.log('[RW-TEST] isDocument: done');
128
+ }
129
+ }
130
+
131
+ // ════════════════════════════════════════════════
132
+ // 6. fontSize = H1
133
+ // ════════════════════════════════════════════════
134
+ {
135
+ const r = await createTestRem('fontSize=H1');
136
+ if (r) {
137
+ await r.setFontSize('H1');
138
+ await delay(500);
139
+ console.log('[RW-TEST] fontSize=H1: done');
140
+ }
141
+ }
142
+
143
+ // ════════════════════════════════════════════════
144
+ // 7. fontSize = H2
145
+ // ════════════════════════════════════════════════
146
+ {
147
+ const r = await createTestRem('fontSize=H2');
148
+ if (r) {
149
+ await r.setFontSize('H2');
150
+ await delay(500);
151
+ console.log('[RW-TEST] fontSize=H2: done');
152
+ }
153
+ }
154
+
155
+ // ════════════════════════════════════════════════
156
+ // 8. fontSize = H3
157
+ // ════════════════════════════════════════════════
158
+ {
159
+ const r = await createTestRem('fontSize=H3');
160
+ if (r) {
161
+ await r.setFontSize('H3');
162
+ await delay(500);
163
+ console.log('[RW-TEST] fontSize=H3: done');
164
+ }
165
+ }
166
+
167
+ // ════════════════════════════════════════════════
168
+ // 9. highlightColor = Red
169
+ // ════════════════════════════════════════════════
170
+ {
171
+ const r = await createTestRem('highlightColor=Red');
172
+ if (r) {
173
+ await r.setHighlightColor('Red');
174
+ await delay(500);
175
+ console.log('[RW-TEST] highlightColor=Red: done');
176
+ }
177
+ }
178
+
179
+ // ════════════════════════════════════════════════
180
+ // 10. highlightColor = Blue
181
+ // ════════════════════════════════════════════════
182
+ {
183
+ const r = await createTestRem('highlightColor=Blue');
184
+ if (r) {
185
+ await r.setHighlightColor('Blue');
186
+ await delay(500);
187
+ console.log('[RW-TEST] highlightColor=Blue: done');
188
+ }
189
+ }
190
+
191
+ // ════════════════════════════════════════════════
192
+ // 11. isTodo = true (未完成)
193
+ // ════════════════════════════════════════════════
194
+ {
195
+ const r = await createTestRem('isTodo=true');
196
+ if (r) {
197
+ await r.setIsTodo(true);
198
+ await delay(500);
199
+ console.log('[RW-TEST] isTodo: done');
200
+ }
201
+ }
202
+
203
+ // ════════════════════════════════════════════════
204
+ // 12. todoStatus = Finished
205
+ // ════════════════════════════════════════════════
206
+ {
207
+ const r = await createTestRem('todoStatus=Finished');
208
+ if (r) {
209
+ await r.setIsTodo(true);
210
+ await delay(200);
211
+ await r.setTodoStatus('Finished');
212
+ await delay(500);
213
+ console.log('[RW-TEST] todoStatus=Finished: done');
214
+ }
215
+ }
216
+
217
+ // ════════════════════════════════════════════════
218
+ // 13. isCode = true
219
+ // ════════════════════════════════════════════════
220
+ {
221
+ const r = await createTestRem('isCode=true');
222
+ if (r) {
223
+ await r.setIsCode(true);
224
+ await delay(500);
225
+ console.log('[RW-TEST] isCode: done');
226
+ }
227
+ }
228
+
229
+ // ════════════════════════════════════════════════
230
+ // 14. isQuote = true
231
+ // ════════════════════════════════════════════════
232
+ {
233
+ const r = await createTestRem('isQuote=true');
234
+ if (r) {
235
+ await r.setIsQuote(true);
236
+ await delay(500);
237
+ console.log('[RW-TEST] isQuote: done');
238
+ }
239
+ }
240
+
241
+ // ════════════════════════════════════════════════
242
+ // 15. isListItem = true
243
+ // ════════════════════════════════════════════════
244
+ {
245
+ const r = await createTestRem('isListItem=true');
246
+ if (r) {
247
+ await r.setIsListItem(true);
248
+ await delay(500);
249
+ console.log('[RW-TEST] isListItem: done');
250
+ }
251
+ }
252
+
253
+ // ════════════════════════════════════════════════
254
+ // 16. isCardItem = true
255
+ // ════════════════════════════════════════════════
256
+ {
257
+ const r = await createTestRem('isCardItem=true');
258
+ if (r) {
259
+ await r.setIsCardItem(true);
260
+ await delay(500);
261
+ console.log('[RW-TEST] isCardItem: done');
262
+ }
263
+ }
264
+
265
+ // ════════════════════════════════════════════════
266
+ // 17. isSlot = true
267
+ // ════════════════════════════════════════════════
268
+ {
269
+ const r = await createTestRem('isSlot=true');
270
+ if (r) {
271
+ await r.setIsSlot(true);
272
+ await delay(500);
273
+ console.log('[RW-TEST] isSlot: done');
274
+ }
275
+ }
276
+
277
+ // ════════════════════════════════════════════════
278
+ // 18. isProperty = true
279
+ // ════════════════════════════════════════════════
280
+ {
281
+ const r = await createTestRem('isProperty=true');
282
+ if (r) {
283
+ await r.setIsProperty(true);
284
+ await delay(500);
285
+ console.log('[RW-TEST] isProperty: done');
286
+ }
287
+ }
288
+
289
+ // ════════════════════════════════════════════════
290
+ // 19. enablePractice = true
291
+ // ════════════════════════════════════════════════
292
+ {
293
+ const r = await createTestRem('enablePractice=true');
294
+ if (r) {
295
+ await r.setEnablePractice(true);
296
+ await delay(500);
297
+ console.log('[RW-TEST] enablePractice: done');
298
+ }
299
+ }
300
+
301
+ // ════════════════════════════════════════════════
302
+ // 20. practiceDirection = forward
303
+ // ════════════════════════════════════════════════
304
+ {
305
+ const r = await createTestRem('practiceDirection=forward');
306
+ if (r) {
307
+ await r.setPracticeDirection('forward');
308
+ await delay(500);
309
+ console.log('[RW-TEST] practiceDirection=forward: done');
310
+ }
311
+ }
312
+
313
+ // ════════════════════════════════════════════════
314
+ // 21. tags (addTag)
315
+ // ════════════════════════════════════════════════
316
+ {
317
+ const r = await createTestRem('tags-addTag');
318
+ if (r) {
319
+ await r.addTag(helperTag._id);
320
+ await delay(500);
321
+ console.log('[RW-TEST] tags: done');
322
+ }
323
+ }
324
+
325
+ // ════════════════════════════════════════════════
326
+ // 22. sources (addSource)
327
+ // ════════════════════════════════════════════════
328
+ {
329
+ const r = await createTestRem('sources-addSource');
330
+ if (r) {
331
+ await r.addSource(helperSource._id);
332
+ await delay(500);
333
+ console.log('[RW-TEST] sources: done');
334
+ }
335
+ }
336
+
337
+ // ════════════════════════════════════════════════
338
+ // 23. aliases (getOrCreateAliasWithText)
339
+ // ════════════════════════════════════════════════
340
+ {
341
+ const r = await createTestRem('aliases');
342
+ if (r) {
343
+ await r.getOrCreateAliasWithText(['测试别名文本']);
344
+ await delay(500);
345
+ console.log('[RW-TEST] aliases: done');
346
+ }
347
+ }
348
+
349
+ // ════════════════════════════════════════════════
350
+ // 24. positionAmongstSiblings — 位置变更测试
351
+ // 创建 3 个编号兄弟,然后把 #1 移到末尾
352
+ // ════════════════════════════════════════════════
353
+ {
354
+ const posLabel = await plugin.rem.createRem();
355
+ if (posLabel) {
356
+ await posLabel.setParent(parentDoc._id, pos++);
357
+ await posLabel.setText(['── position 测试区 ──']);
358
+ await delay(200);
359
+ }
360
+
361
+ const a = await plugin.rem.createRem();
362
+ const b = await plugin.rem.createRem();
363
+ const c = await plugin.rem.createRem();
364
+ if (a && b && c) {
365
+ await a.setParent(parentDoc._id, pos++);
366
+ await a.setText(['pos: 兄弟A(将被移到末尾)']);
367
+ await delay(200);
368
+ await b.setParent(parentDoc._id, pos++);
369
+ await b.setText(['pos: 兄弟B']);
370
+ await delay(200);
371
+ await c.setParent(parentDoc._id, pos++);
372
+ await c.setText(['pos: 兄弟C']);
373
+ await delay(200);
374
+
375
+ // 等 5 秒让截图者看到初始顺序 A→B→C
376
+ console.log('[RW-TEST] position: 初始顺序 A→B→C,等待 5 秒后移动 A 到末尾...');
377
+ await delay(5000);
378
+
379
+ // 把 A 移到末尾(position=99 会被钳位)
380
+ await a.setParent(parentDoc._id, 99);
381
+ await delay(500);
382
+ console.log('[RW-TEST] position: A 已移到末尾,现在顺序应为 B→C→A');
383
+ }
384
+ }
385
+
386
+ // ── 完成标记 ──
387
+ const doneRem = await plugin.rem.createRem();
388
+ if (doneRem) {
389
+ await doneRem.setParent(parentDoc._id, pos);
390
+ await doneRem.setText(['===== 全部测试 Rem 创建完毕,请截图观察 =====']);
391
+ }
392
+
393
+ await plugin.storage.setSession('rw-test-done', true);
394
+ console.log('[RW-TEST] ========== 全部字段 Rem 创建完毕 ==========');
395
+
396
+ } catch (err) {
397
+ console.error('[RW-TEST] 出错:', err);
398
+ }
399
+ }