remnote-bridge 0.1.17 → 0.1.18
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/mcp/instructions.js +22 -6
- package/dist/mcp/tools/edit-tools.js +3 -1
- package/dist/mcp/tools/read-tools.js +2 -1
- package/package.json +1 -1
- package/skills/remnote-bridge/SKILL.md +2 -2
- package/skills/remnote-bridge/instructions/edit-rem.md +8 -1
- package/skills/remnote-bridge/instructions/edit-tree.md +22 -4
- package/skills/remnote-bridge/instructions/overall.md +4 -3
- package/skills/remnote-bridge/instructions/read-rem.md +6 -6
- package/skills/remnote-bridge/instructions/read-tree.md +3 -1
package/dist/mcp/instructions.js
CHANGED
|
@@ -80,10 +80,19 @@ CDF 的核心优势:Concept 自动生成双向闪卡("什么是线性回归
|
|
|
80
80
|
通过 RichText 中的 \`cId\` 标记实现(不是分隔符),练习时 \`cId\` 标记的文本被遮盖:
|
|
81
81
|
|
|
82
82
|
\`\`\`json
|
|
83
|
-
["The ", {"cId": "
|
|
83
|
+
["The ", {"cId": "8291740362058173", "i": "m", "text": "capital"}, " of France is Paris"]
|
|
84
84
|
\`\`\`
|
|
85
85
|
|
|
86
|
-
|
|
86
|
+
#### 创建填空的两条路径
|
|
87
|
+
|
|
88
|
+
| 路径 | 方式 | cId 生成 | 推荐度 |
|
|
89
|
+
|:-----|:-----|:---------|:-------|
|
|
90
|
+
| **edit_tree(推荐)** | 新增行写 \`{{填空文本}}\` | SDK 自动生成安全 cId | ⭐ 优先 |
|
|
91
|
+
| edit_rem(兜底) | changes.text 中手写含 cId 的 RichText | 必须自行生成随机 cId | 仅修改已有 cloze |
|
|
92
|
+
|
|
93
|
+
**优先用 edit_tree**:新增行写 \`水的化学式是{{H2O}}\`,SDK 通过 \`createSingleRemWithMarkdown\` 自动生成唯一 cId,零碰撞风险。
|
|
94
|
+
|
|
95
|
+
**edit_rem 仅用于修改已有 cloze**:先 \`read_rem\` 获取现有 cId,修改时保留原 cId。如必须新建 cloze,cId **禁止**使用有语义的命名(如 \`"cloze1"\`、\`"c1"\`),必须使用随机数字串(如 \`"7390281645937102"\`)。⚠️ cId 碰撞会导致同一 Rem 内多个填空被识别为同一个,练习行为异常且不可逆。
|
|
87
96
|
|
|
88
97
|
### 链接机制
|
|
89
98
|
|
|
@@ -376,7 +385,7 @@ newStr: " 静态数组 <!--id1_2 type:concept-->\\n 动态数组 <!--id1_1
|
|
|
376
385
|
**模板规则**:
|
|
377
386
|
- \`{{remId}}\` 展开为**不含缩进**的完整行内容,缩进由你控制
|
|
378
387
|
- 只匹配纯字母数字(\`[a-zA-Z0-9]+\`),与 RemNote cloze 语法 \`{{text}}\` 不冲突
|
|
379
|
-
- 新增行不能用 \`{{}}
|
|
388
|
+
- 新增行不能用 \`{{remId}}\` 模板引用(新增行没有 remId),但可以用 \`{{文本}}\` 创建填空卡片——SDK 自动生成唯一 cId,零碰撞风险(推荐的 cloze 创建方式)
|
|
380
389
|
- 可以混用:部分行用 \`{{id}}\`,部分行手动写
|
|
381
390
|
|
|
382
391
|
#### ⚠️ children_captured 详解
|
|
@@ -416,6 +425,11 @@ oldStr: " {{idZ}}" newStr: " {{idZ}}\\n 新行"
|
|
|
416
425
|
- Descriptor(描述属性):作为某个 Concept 的子 Rem,回答"X 的 Y 是什么?"——如"假设 → 因变量与自变量呈线性关系"
|
|
417
426
|
- 通常 Descriptor 是 Concept 的直接子节点,二者配合构成完整的 CDF 知识结构
|
|
418
427
|
|
|
428
|
+
**完形填空(Cloze)**:
|
|
429
|
+
- 创建(推荐):\`edit_tree\` 新增行写 \`水的化学式是{{H2O}}\`,SDK 自动生成唯一 cId
|
|
430
|
+
- 修改已有 cloze:先 \`read_rem\` 获取现有 cId,再 \`edit_rem\` 传含原 cId 的 RichText 数组
|
|
431
|
+
- ⚠️ **禁止**在 \`edit_rem\` 中手造有语义命名的 cId(如 \`"cloze1"\`)——cId 碰撞会导致多个填空被识别为同一个,练习行为异常且不可逆
|
|
432
|
+
|
|
419
433
|
**修改现有 Rem 的闪卡行为**(\`read_rem\` → \`edit_rem\`):修改 \`type\`、\`practiceDirection\`、\`backText\` 字段。
|
|
420
434
|
|
|
421
435
|
### 场景 G:排查连接问题
|
|
@@ -543,6 +557,7 @@ tags, sources, positionAmongstSiblings, portalDirectlyIncludedRem
|
|
|
543
557
|
- 纯文本行:\`新内容\`
|
|
544
558
|
- 带前缀:\`# 新标题\`、\`- [ ] 新待办\`、\`> 引用内容\`、\`1. 列表项\`
|
|
545
559
|
- 带箭头:\`问题 → 答案\`、\`概念 ↔ 定义\`、\`题目 ↓\`
|
|
560
|
+
- 完形填空:\`水的化学式是{{H2O}}\`(SDK 自动生成安全 cId,推荐的 cloze 创建方式)
|
|
546
561
|
- 带元数据注释(metadata-only,无 remId):\`新行 <!--type:concept doc-->\`
|
|
547
562
|
- Portal 行:\`<!--portal refs:id1,id2-->\`
|
|
548
563
|
- 嵌套新增(父+子一起创建):
|
|
@@ -558,6 +573,7 @@ tags, sources, positionAmongstSiblings, portalDirectlyIncludedRem
|
|
|
558
573
|
# 数据结构 <!--kLr type:concept doc top-->
|
|
559
574
|
## 线性结构 <!--ABC type:concept-->
|
|
560
575
|
数组 → Array <!--DEF-->
|
|
576
|
+
{{二分查找}}的时间复杂度是 O(log n) <!--EFG-->
|
|
561
577
|
链表 ↓ <!--GHI type:concept-->
|
|
562
578
|
单向链表 <!--JKL role:card-item-->
|
|
563
579
|
双向链表 <!--MNO role:card-item-->
|
|
@@ -598,8 +614,8 @@ tags, sources, positionAmongstSiblings, portalDirectlyIncludedRem
|
|
|
598
614
|
| \`q\` | \`true\` | 行内代码(红色等宽样式) |
|
|
599
615
|
| \`code\` | \`true\` | 代码块(带语言标签和复制按钮) |
|
|
600
616
|
| \`language\` | string | 代码语言(如 \`"python"\`) |
|
|
601
|
-
| \`cId\` | string | 完形填空 ID |
|
|
602
|
-
| \`hiddenCloze\` | \`true\` |
|
|
617
|
+
| \`cId\` | string | 完形填空 ID(由 SDK 自动生成,禁止手动编造——创建填空用 edit_tree \`{{文本}}\` 语法) |
|
|
618
|
+
| \`hiddenCloze\` | \`true\` | 完形填空隐藏状态(只读,RemNote 自动管理) |
|
|
603
619
|
| \`iUrl\` | string | 超链接 URL(**不是 \`url\`!**) |
|
|
604
620
|
| \`qId\` | string | 行内引用的 Rem ID |
|
|
605
621
|
|
|
@@ -619,7 +635,7 @@ tags, sources, positionAmongstSiblings, portalDirectlyIncludedRem
|
|
|
619
635
|
{"i": "m", "q": true, "text": "code"} // 行内代码
|
|
620
636
|
{"i": "m", "iUrl": "https://...", "text": "链接"} // 超链接(iUrl 不是 url!)
|
|
621
637
|
{"b": true, "h": 1, "i": "m", "text": "重点"} // 粗体+红色高亮
|
|
622
|
-
{"cId": "
|
|
638
|
+
{"cId": "4718093625140386", "i": "m", "text": "答案"} // 完形填空(⚠️ 创建填空用 edit_tree {{文本}};cId 禁止用 "cloze1"/"c1" 等有语义命名)
|
|
623
639
|
{"_id": "remId", "b": true, "i": "q"} // Rem 引用加粗
|
|
624
640
|
{"i": "x", "text": "E = mc^2"} // LaTeX
|
|
625
641
|
{"i": "a", "onlyAudio": false, "url": "..."} // 视频(onlyAudio 必填!)
|
|
@@ -18,6 +18,7 @@ export function registerEditTools(server) {
|
|
|
18
18
|
'\\n\\n操作指南:' +
|
|
19
19
|
'\\n- changes 对象的键=字段名,值=新值。21 个可写字段:text, backText, type, isDocument, parent, fontSize, highlightColor, isTodo, todoStatus, isCode, isQuote, isListItem, isCardItem, isSlot, isProperty, enablePractice, practiceDirection, tags, sources, positionAmongstSiblings, portalDirectlyIncludedRem' +
|
|
20
20
|
'\\n- RichText 编辑(text/backText):传完整 RichText 数组,元素为纯字符串或格式化对象如 {"i":"m","text":"...","b":true}。backText 传 null 可清除背面' +
|
|
21
|
+
'\\n- ⚠️ 完形填空(cloze):创建填空优先用 edit_tree 的 {{文本}} 语法(SDK 自动生成安全 cId)。edit_rem 仅用于修改已有 cloze(保留原 cId)。如必须新建 cloze,cId 禁止用有语义的命名(如 "cloze1"),必须用随机数字串(如 "7390281645937102")' +
|
|
21
22
|
'\\n- tags/sources 使用 diff 机制:传入目标 ID 数组,系统自动计算增删差异' +
|
|
22
23
|
'\\n- portalDirectlyIncludedRem:传入目标 ID 数组(仅 type=portal 的 Rem 可修改),系统自动 diff' +
|
|
23
24
|
'\\n- parent + positionAmongstSiblings 联动:通过同一个 SDK 调用写入,可单独或同时修改' +
|
|
@@ -79,12 +80,13 @@ export function registerEditTools(server) {
|
|
|
79
80
|
'\\n ⚠️ 有序列表必须用 `1. `(Lazy Numbering):RemNote 自动编号,不要写 `2. ` `3. ` 等。`2.`~`9.` 会被容错归一化并返回 templateWarnings 警告,`10.` 及以上不识别为列表。' +
|
|
80
81
|
'\\n- 箭头分隔符(闪卡):→ ← ↔(单行)、↓ ↑ ↕(多行,带 backText 或子节点为答案)' +
|
|
81
82
|
'\\n- 元数据注释(可选):<!--type:concept--> <!--doc--> <!--tag:Name(id)--> 可组合' +
|
|
83
|
+
'\\n- 完形填空:{{填空文本}}(SDK 自动生成安全 cId,推荐方式)' +
|
|
82
84
|
'\\n- Portal 创建:<!--portal refs:id1,id2--> 或 <!--portal-->(空 Portal)' +
|
|
83
85
|
'\\n\\n行引用模板 {{remId}}:' +
|
|
84
86
|
'\\n在 oldStr/newStr 中使用 {{remId}} 引用缓存大纲中已有行的完整内容(不含缩进),系统在 str_replace 前自动展开。缩进仍由你控制。' +
|
|
85
87
|
'\\n优势:避免反复抄写行内容(含 remId 和元数据标记),减少 token 开销和复制错误。' +
|
|
86
88
|
'\\n示例 reorder:oldStr=" {{id1}}\\n {{id2}}" newStr=" {{id2}}\\n {{id1}}"' +
|
|
87
|
-
'\\n规则:只匹配纯字母数字(与 RemNote cloze {{text}} 不冲突);未找到的 {{xxx}} 原样保留并输出 templateWarnings
|
|
89
|
+
'\\n规则:只匹配纯字母数字(与 RemNote cloze {{text}} 不冲突);未找到的 {{xxx}} 原样保留并输出 templateWarnings;新增行不能用 {{remId}} 模板引用,但可以用 {{文本}} 创建填空卡片;可混用模板和手写内容。' +
|
|
88
90
|
'\\n\\n⚠️ 插入位置红线:新行必须插在目标层级所有兄弟的末尾,不能插在父 Rem 和它的 children 之间,否则触发 children_captured 错误。如需"创建新父节点并移入已有 children",必须分两次 edit_tree 完成。' +
|
|
89
91
|
'\\n\\n六种禁止操作:' +
|
|
90
92
|
'\\n- content_modified:修改已有行内容 → 改用 edit_rem' +
|
|
@@ -66,7 +66,7 @@ export function registerReadTools(server) {
|
|
|
66
66
|
'\\n- full=true 时返回全部 51 个字段,Portal 类型自动简化为 8 个关键字段' +
|
|
67
67
|
'\\n- 关键字段:id, text, backText(null), type(concept/descriptor/default/portal), parent, isDocument(false), tags([]), fontSize(H1/H2/H3/null), highlightColor(Red/.../Pink/null), practiceDirection(forward/backward/both/none), isTodo(false), todoStatus(Finished/Unfinished/null)——括号内为默认值' +
|
|
68
68
|
'\\n- children 字段属于 R-F 层级,默认不输出,需 full=true 或 fields 指定' +
|
|
69
|
-
'\\n- text/backText 是 RichText JSON 数组,元素为纯字符串或带 i 字段的对象(i:"m" 格式化文本, i:"q" Rem 引用, i:"x" LaTeX, i:"i" 图片, i:"a"
|
|
69
|
+
'\\n- text/backText 是 RichText JSON 数组,元素为纯字符串或带 i 字段的对象(i:"m" 格式化文本, i:"q" Rem 引用, i:"x" LaTeX, i:"i" 图片, i:"a" 音视频)。完形填空元素含 cId 字段(如 {"cId":"8291740362058173","i":"m","text":"答案"})' +
|
|
70
70
|
'\\n- 可能附加 cacheOverridden(覆盖旧缓存时)和 powerupFiltered(过滤统计)元数据' +
|
|
71
71
|
'\\n\\n关键约束:' +
|
|
72
72
|
'\\n- 结果自动写入缓存供 edit_rem 使用。缓存存储完整 RemObject,不受 fields/full 选项影响' +
|
|
@@ -124,6 +124,7 @@ export function registerReadTools(server) {
|
|
|
124
124
|
'\\n大纲每行格式:{缩进}{Markdown前缀}{内容}{箭头}{backText} <!-- {remId} {元数据标记} -->' +
|
|
125
125
|
'\\n- 缩进:每级 2 空格' +
|
|
126
126
|
'\\n- Markdown 前缀:# ## ### (标题), - [ ] - [x] (待办), ` (代码)' +
|
|
127
|
+
'\\n- 完形填空:RichText 中带 cId 的元素渲染为 {{文本}},与 edit_tree 新增行的 {{}} 语法对称' +
|
|
127
128
|
'\\n- 箭头编码 practiceDirection:→←↔(单行闪卡,text→backText);↓↑↕(多行闪卡,答案在子节点)' +
|
|
128
129
|
'\\n- 元数据标记:type:concept/descriptor/portal, doc, children:N, tag:Name(id), role:card-item, top, refs:id1,id2(Portal引用)' +
|
|
129
130
|
'\\n- 省略占位符:<!--...elided N siblings (parent:id range:x-y total:z)-->(精确)或 >=N nodes(预算耗尽)' +
|
package/package.json
CHANGED
|
@@ -169,8 +169,8 @@ Portal 的编辑同步意味着修改一处会影响另一处。Portal 引用的
|
|
|
169
169
|
{ "i": "m", "iUrl": "https://example.com", "text": "点击访问" }
|
|
170
170
|
// 红色高亮 + 粗体(h 是数字,不是字符串)
|
|
171
171
|
{ "b": true, "h": 1, "i": "m", "text": "重点" }
|
|
172
|
-
//
|
|
173
|
-
{ "cId": "
|
|
172
|
+
// 完形填空(⚠️ 创建填空优先用 edit-tree 的 {{文本}} 语法,SDK 自动生成安全 cId。edit-rem 仅修改已有 cloze,禁止手动编造 cId)
|
|
173
|
+
{ "cId": "8291740362058173", "i": "m", "text": "答案内容" }
|
|
174
174
|
// Rem 引用(_id 排在所有小写 key 之前)
|
|
175
175
|
{ "_id": "remId", "i": "q" }
|
|
176
176
|
// Rem 引用加粗
|
|
@@ -14,6 +14,12 @@
|
|
|
14
14
|
- **字段白名单校验**:21 个可写字段通过,只读和未知字段产生警告
|
|
15
15
|
- **前置条件**:必须先 `read-rem` 建立缓存,否则防线 1 拒绝
|
|
16
16
|
|
|
17
|
+
> **⚠️ 完形填空(cloze)注意事项**
|
|
18
|
+
>
|
|
19
|
+
> **创建填空优先用 `edit-tree` 的 `{{文本}}` 语法**(SDK 自动生成安全 cId,零碰撞风险)。
|
|
20
|
+
> `edit-rem` 仅用于**修改已有 cloze**(先 `read-rem` 获取现有 cId,修改时保留原 cId)。
|
|
21
|
+
> 如必须通过 `edit-rem` 新建 cloze,cId **禁止**使用有语义的命名(如 `"cloze1"`、`"c1"`),必须使用随机数字串(如 `"7390281645937102"`)。
|
|
22
|
+
|
|
17
23
|
---
|
|
18
24
|
|
|
19
25
|
## 前置条件
|
|
@@ -316,7 +322,7 @@ RemObject 51 个字段中,21 个可编辑(RW),30 个只读(R + R-F)
|
|
|
316
322
|
|
|
317
323
|
| 字段 | SDK setter | 值类型 | 约束 / 特殊处理 |
|
|
318
324
|
|------|-----------|--------|-----------------|
|
|
319
|
-
| `text` | `rem.setText()` | RichText | RichText
|
|
325
|
+
| `text` | `rem.setText()` | RichText | RichText 数组。⚠️ 若含 cId 元素(完形填空),须原样保留 cId——禁止编造新 cId,创建填空用 `edit-tree {{文本}}` |
|
|
320
326
|
| `backText` | `rem.setBackText()` | RichText \| null | null → `setBackText([])`(清除背面);字符串 → 包装为 `[string]` |
|
|
321
327
|
| `type` | `rem.setType()` | RemTypeValue | `portal` 不可设置(只能通过 `createPortal()` 创建) |
|
|
322
328
|
| `isDocument` | `rem.setIsDocument()` | boolean | — |
|
|
@@ -434,6 +440,7 @@ isPowerupPropertyListItem, isPowerupSlot
|
|
|
434
440
|
- RichText 是 JSON 数组,元素为纯字符串或格式化对象
|
|
435
441
|
- 格式化对象的 key 按**字母序**排列(`_id` < `b` < `i` < `text`)
|
|
436
442
|
- 修改 text/backText 时,传入的是**完整的新数组**,不是部分替换
|
|
443
|
+
- ⚠️ **完形填空(cloze)**:若原文含 `cId` 元素,写回时**必须原样保留** cId 值,禁止修改或删除。创建新填空请用 `edit-tree` 的 `{{文本}}` 语法(SDK 自动生成安全 cId),不要在此处手动构造含 cId 的 RichText 元素
|
|
437
444
|
|
|
438
445
|
### Tags Diff 操作
|
|
439
446
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# edit-tree
|
|
2
2
|
|
|
3
|
-
> 通过 str_replace 对 Markdown
|
|
3
|
+
> 通过 str_replace 对 Markdown 大纲进行结构编辑(行级增/删/移/重排),新增行支持 `{{文本}}` 填空语法,禁止修改已有行内容。
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -9,14 +9,14 @@
|
|
|
9
9
|
`edit-tree` 基于 `read-tree` 缓存的 Markdown 大纲,使用 str_replace 替换文本片段,解析新旧大纲的结构差异,自动生成并执行原子操作。
|
|
10
10
|
|
|
11
11
|
核心能力:
|
|
12
|
-
- **新增行**:在大纲中插入无 remId 的新行,支持 Markdown
|
|
12
|
+
- **新增行**:在大纲中插入无 remId 的新行,支持 Markdown 前缀、箭头分隔符、`{{文本}}` 填空语法
|
|
13
13
|
- **删除行**:从大纲中移除带 remId 的行(必须同时删除所有子行)
|
|
14
14
|
- **移动行**:改变行的缩进层级或移到不同父节点下
|
|
15
15
|
- **重排行**:调换同级行的顺序
|
|
16
16
|
- 三道防线保障数据安全(缓存存在性、乐观并发检测、精确匹配)
|
|
17
17
|
- SDK bug 自动修复(practiceDirection 保护)
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
**核心限制**:**禁止修改已有行的内容**(内容修改走 `edit-rem`)。新增行的内容格式不受此限,支持 Markdown 前缀、箭头、`{{文本}}` 填空等。
|
|
20
20
|
|
|
21
21
|
---
|
|
22
22
|
|
|
@@ -204,7 +204,7 @@ newStr: " 新增行\n {{idZ}}"
|
|
|
204
204
|
- `{{remId}}` 展开为**不含缩进**的完整行内容,缩进由你控制
|
|
205
205
|
- 只匹配纯字母数字(`[a-zA-Z0-9]+`),与 RemNote cloze 语法 `{{text}}` 不冲突
|
|
206
206
|
- 匹配到但不在缓存大纲中的 `{{xxx}}` 原样保留(可能是 cloze),并输出 templateWarnings
|
|
207
|
-
-
|
|
207
|
+
- 新增行不能用 `{{remId}}` 模板引用(没有 remId),但可以用 `{{文本}}` 创建填空卡片(两者不冲突:模板只匹配纯字母数字)
|
|
208
208
|
|
|
209
209
|
### 完整匹配模式(回退)
|
|
210
210
|
|
|
@@ -338,6 +338,22 @@ oldStr: " 子节点 A <!--idA-->"
|
|
|
338
338
|
newStr: " <!--portal refs:refId1,refId2-->\n 子节点 A <!--idA-->"
|
|
339
339
|
```
|
|
340
340
|
|
|
341
|
+
#### 完形填空新增行
|
|
342
|
+
|
|
343
|
+
在新增行内容中使用 `{{文本}}` 语法创建填空卡片。SDK 通过 `createSingleRemWithMarkdown` 自动生成唯一 cId,零碰撞风险。**这是创建填空的推荐方式**(优于 edit-rem 手动编造 cId)。
|
|
344
|
+
|
|
345
|
+
```
|
|
346
|
+
# 模板模式
|
|
347
|
+
oldStr: " {{idA}}"
|
|
348
|
+
newStr: " 水的化学式是{{H2O}}\n {{idA}}"
|
|
349
|
+
|
|
350
|
+
# 完整匹配模式
|
|
351
|
+
oldStr: " 子节点 A <!--idA-->"
|
|
352
|
+
newStr: " 法国的首都是{{巴黎}}\n 子节点 A <!--idA-->"
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
> 注意:`{{文本}}` 与模板引用 `{{remId}}` 不冲突——模板只匹配纯字母数字(`[a-zA-Z0-9]+`),中文/空格/标点不会被误匹配。
|
|
356
|
+
|
|
341
357
|
#### 嵌套新增
|
|
342
358
|
|
|
343
359
|
新增行下面可以再嵌套新增行,通过缩进表示父子关系:
|
|
@@ -435,6 +451,8 @@ newStr: " 子节点 C <!--idC-->\n 子节点 A <!--idA-->\n 子节点 B <!--i
|
|
|
435
451
|
| 缩进跳级 | `indent_skip` | 缩进跳级:行 ... 的缩进级别为 N,但找不到上一级的父节点。 | 检查缩进是否正确(每级 2 空格) |
|
|
436
452
|
| 新行劫持已有子节点 | `children_captured` | New line "..." accidentally captured existing children (...). | 把新行插到兄弟末尾,不要插在父 Rem 和 children 之间 |
|
|
437
453
|
|
|
454
|
+
> ⚠️ "修改已有行内容 → 使用 edit-rem"仅指**修改已存在 Rem 的文本**。创建含 `{{文本}}` 填空的**新行**应使用 edit-tree 的新增行功能,不要走 edit-rem 手动编造 cId。
|
|
455
|
+
|
|
438
456
|
---
|
|
439
457
|
|
|
440
458
|
## 操作执行顺序
|
|
@@ -91,6 +91,7 @@ Rem 有两个**独立维度**的类型:
|
|
|
91
91
|
| 创建反向问答 | `edit-tree` 新增行 `问题 ← 答案` |
|
|
92
92
|
| 创建双向问答 | `edit-tree` 新增行 `问题 ↔ 答案` |
|
|
93
93
|
| 创建多行答案 | `edit-tree` 新增行 `问题 ↓`(子行自动成为答案) |
|
|
94
|
+
| 创建完形填空 | `edit-tree` 新增行写 `水的化学式是{{H2O}}`(SDK 自动生成安全 cId,⚠️ **禁止**用 `edit-rem` 手动编造 cId) |
|
|
94
95
|
| 改变闪卡类型/方向 | `edit-rem` 修改 `type`、`backText`、`practiceDirection` |
|
|
95
96
|
|
|
96
97
|
`practiceDirection` 的取值:`forward`(正向)、`backward`(反向)、`both`(双向)、`none`(不练习)。
|
|
@@ -589,8 +590,8 @@ Portal:portalType [R], portalDirectlyIncludedRem [Portal-W]
|
|
|
589
590
|
| `q` | `true` | 行内代码(红色等宽样式) |
|
|
590
591
|
| `code` | `true` | 代码块(带语言标签和复制按钮) |
|
|
591
592
|
| `language` | `string` | 代码块语言(如 `"javascript"`) |
|
|
592
|
-
| `cId` | `string` | 完形填空 ID |
|
|
593
|
-
| `hiddenCloze` | `true` |
|
|
593
|
+
| `cId` | `string` | 完形填空 ID(由 SDK 自动生成,禁止手动编造——创建填空用 `edit-tree` 的 `{{文本}}` 语法) |
|
|
594
|
+
| `hiddenCloze` | `true` | 完形填空隐藏状态(只读,RemNote 自动管理) |
|
|
594
595
|
| `iUrl` | `string` | 外部超链接 URL(`url` 字段已废弃,必须用 `iUrl`) |
|
|
595
596
|
| `qId` | `string` | 行内引用链接的 Rem ID |
|
|
596
597
|
|
|
@@ -603,7 +604,7 @@ Portal:portalType [R], portalDirectlyIncludedRem [Portal-W]
|
|
|
603
604
|
{ "i": "m", "q": true, "text": "code" } // 行内代码
|
|
604
605
|
{ "i": "m", "iUrl": "https://...", "text": "链接" } // 超链接
|
|
605
606
|
{ "b": true, "h": 1, "i": "m", "text": "重点" } // 粗体+红色高亮(h 是数字)
|
|
606
|
-
{ "cId": "
|
|
607
|
+
{ "cId": "4718093625140386", "i": "m", "text": "答案" } // 完形填空(cId 必须随机,禁止用 "c1" 等有语义命名)
|
|
607
608
|
{ "_id": "remId", "b": true, "i": "q" } // Rem 引用加粗(_id 排最前)
|
|
608
609
|
{ "i": "x", "text": "E = mc^2" } // LaTeX
|
|
609
610
|
{ "i": "a", "onlyAudio": false, "url": "..." } // 视频(onlyAudio 必填!)
|
|
@@ -182,7 +182,7 @@ RemObject 共 51 个字段,按读写权限分为三类:
|
|
|
182
182
|
|
|
183
183
|
| 字段 | 类型 | 权限 | 说明 |
|
|
184
184
|
|------|------|:----:|------|
|
|
185
|
-
| `text` | `RichText` | RW | 正面文本(RichText 数组)。UI
|
|
185
|
+
| `text` | `RichText` | RW | 正面文本(RichText 数组)。UI:文本内容立即更新显示。⚠️ 若含 cId 元素(完形填空),edit-rem 写回时须原样保留 cId 值 |
|
|
186
186
|
| `backText` | `RichText \| null` | RW | 背面文本。null=无背面;设值即产生闪卡正反面结构。UI:显示为"正面 → 背面"箭头分隔格式 |
|
|
187
187
|
|
|
188
188
|
### 类型系统
|
|
@@ -487,9 +487,9 @@ RemObject 中的 `text` 和 `backText` 字段使用 RichText 格式——一个
|
|
|
487
487
|
| `q` | `true` | 行内代码(红色等宽样式) |
|
|
488
488
|
| `code` | `true` | 代码块(带语言标签和复制按钮) |
|
|
489
489
|
| `language` | `string` | 代码块语言(如 `"javascript"`、`"python"`) |
|
|
490
|
-
| `cId` | `string` | 完形填空 ID |
|
|
491
|
-
| `hiddenCloze` | `true` |
|
|
492
|
-
| `revealedCloze` | `true` |
|
|
490
|
+
| `cId` | `string` | 完形填空 ID(由 SDK 自动生成,禁止手动编造——创建填空用 `edit-tree` 的 `{{文本}}` 语法。修改已有 cloze 时必须保留原 cId) |
|
|
491
|
+
| `hiddenCloze` | `true` | 完形填空隐藏状态(只读,RemNote 自动管理,禁止通过 edit-rem 写入) |
|
|
492
|
+
| `revealedCloze` | `true` | 完形填空已揭示状态(只读,RemNote 自动管理,禁止通过 edit-rem 写入) |
|
|
493
493
|
| `iUrl` | `string` | 外部超链接 URL(**注意**:`url` 字段已废弃无效,必须用 `iUrl`) |
|
|
494
494
|
| `qId` | `string` | 行内引用链接的 Rem ID |
|
|
495
495
|
|
|
@@ -532,9 +532,9 @@ RemObject 中的 `text` 和 `backText` 字段使用 RichText 格式——一个
|
|
|
532
532
|
"i": "m",
|
|
533
533
|
"text": "重点"
|
|
534
534
|
}
|
|
535
|
-
//
|
|
535
|
+
// 完形填空(⚠️ cId 由 SDK 自动生成。创建填空用 edit-tree {{文本}} 语法;edit-rem 仅修改已有 cloze,必须保留原 cId,禁止手动编造)
|
|
536
536
|
{
|
|
537
|
-
"cId": "
|
|
537
|
+
"cId": "8291740362058173",
|
|
538
538
|
"i": "m",
|
|
539
539
|
"text": "答案内容"
|
|
540
540
|
}
|
|
@@ -43,6 +43,7 @@ remnote-bridge read-tree <remId> [--depth N] [--max-nodes N] [--max-siblings N]
|
|
|
43
43
|
第一部分 <!--id1-->
|
|
44
44
|
小节 1.1 <!--id1_1-->
|
|
45
45
|
小节 1.2 → 答案 <!--id1_2-->
|
|
46
|
+
法国的首都是{{巴黎}} <!--id1_3-->
|
|
46
47
|
第二部分 <!--id2 children:5-->
|
|
47
48
|
```
|
|
48
49
|
|
|
@@ -159,7 +160,7 @@ read-tree 的核心输出是 Markdown 大纲文本。每一行对应一个 Rem
|
|
|
159
160
|
|
|
160
161
|
- **缩进**:每级 2 个空格(根节点 0 个空格)
|
|
161
162
|
- **Markdown 前缀**:映射 Rem 的格式属性
|
|
162
|
-
- **内容**:Rem 的 text 字段(已通过 SDK 转为 Markdown)
|
|
163
|
+
- **内容**:Rem 的 text 字段(已通过 SDK 转为 Markdown)。RichText 中的完形填空(cloze)元素渲染为 `{{文本}}`(如 `学习 {{Python}} 语言`)。cId 不在大纲中显示;创建新 cloze 用 `edit-tree` 新增行的 `{{文本}}` 语法(SDK 自动生成 cId)
|
|
163
164
|
- **箭头分隔符**:表示 practiceDirection(闪卡方向)
|
|
164
165
|
- **remId**:该行对应的 Rem ID
|
|
165
166
|
- **元数据标记**:空格分隔的属性标记
|
|
@@ -225,6 +226,7 @@ read-tree 的核心输出是 Markdown 大纲文本。每一行对应一个 Rem
|
|
|
225
226
|
# 数据结构 <!--kLr type:concept doc top-->
|
|
226
227
|
## 线性结构 <!--ABC type:concept-->
|
|
227
228
|
数组 → Array <!--DEF-->
|
|
229
|
+
{{二分查找}}的时间复杂度是 O(log n) <!--EFG-->
|
|
228
230
|
链表 ↓ <!--GHI type:concept-->
|
|
229
231
|
单向链表 <!--JKL role:card-item-->
|
|
230
232
|
双向链表 <!--MNO role:card-item-->
|