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,104 @@
|
|
|
1
|
+
export const OUTLINE_FORMAT_CONTENT = `
|
|
2
|
+
# Markdown 大纲格式规范
|
|
3
|
+
|
|
4
|
+
read_tree / read_globe / read_context 的输出核心是 Markdown 大纲文本。edit_tree 基于此大纲进行结构编辑。
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 1. 行结构
|
|
9
|
+
|
|
10
|
+
每行的完整格式为:
|
|
11
|
+
|
|
12
|
+
\\\`\\\`\\\`
|
|
13
|
+
{缩进}{Markdown 前缀}{内容}{箭头分隔符}{backText} <!-- {remId} {元数据标记} -->
|
|
14
|
+
\\\`\\\`\\\`
|
|
15
|
+
|
|
16
|
+
- **缩进**:每级 2 个空格,根节点 0 个空格
|
|
17
|
+
- **remId**:该行对应的 Rem ID(edit_tree 新增行无 remId)
|
|
18
|
+
- **元数据标记**:空格分隔的属性标记
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 2. Markdown 前缀
|
|
23
|
+
|
|
24
|
+
| 前缀 | 含义 | 对应字段 |
|
|
25
|
+
|:-----|:-----|:---------|
|
|
26
|
+
| \\\`# \\\` | H1 标题 | fontSize: 'H1' |
|
|
27
|
+
| \\\`## \\\` | H2 标题 | fontSize: 'H2' |
|
|
28
|
+
| \\\`### \\\` | H3 标题 | fontSize: 'H3' |
|
|
29
|
+
| \\\`- [ ] \\\` | 未完成待办 | isTodo: true, todoStatus: 'Unfinished' |
|
|
30
|
+
| \\\`- [x] \\\` | 已完成待办 | isTodo: true, todoStatus: 'Finished' |
|
|
31
|
+
| \\\`\\\\\\\`...\\\\\\\`\\\` | 代码块 | isCode: true |
|
|
32
|
+
| \\\`---\\\` | 分隔线 | Divider Powerup |
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## 3. 箭头分隔符
|
|
37
|
+
|
|
38
|
+
### 有 backText 的箭头
|
|
39
|
+
|
|
40
|
+
| 箭头 | 格式 | practiceDirection |
|
|
41
|
+
|:-----|:-----|:------------------|
|
|
42
|
+
| \\\` → \\\` | text → backText | forward |
|
|
43
|
+
| \\\` ← \\\` | text ← backText | backward |
|
|
44
|
+
| \\\` ↔ \\\` | text ↔ backText | both |
|
|
45
|
+
|
|
46
|
+
### 多行闪卡的箭头
|
|
47
|
+
|
|
48
|
+
| 箭头 | 格式 | practiceDirection | 说明 |
|
|
49
|
+
|:-----|:-----|:------------------|:-----|
|
|
50
|
+
| \\\` ↓\\\`(尾部) | text ↓ | forward | 无 backText |
|
|
51
|
+
| \\\` ↑\\\`(尾部) | text ↑ | backward | 无 backText |
|
|
52
|
+
| \\\` ↕\\\`(尾部) | text ↕ | both | 无 backText |
|
|
53
|
+
| \\\` ↓ \\\` | text ↓ backText | forward | 有 backText |
|
|
54
|
+
| \\\` ↑ \\\` | text ↑ backText | backward | 有 backText |
|
|
55
|
+
| \\\` ↕ \\\` | text ↕ backText | both | 有 backText |
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## 4. 元数据标记
|
|
60
|
+
|
|
61
|
+
| 标记 | 含义 | 何时出现 |
|
|
62
|
+
|:-----|:-----|:---------|
|
|
63
|
+
| \\\`type:concept\\\` | concept 类型 | type 不为 default 时 |
|
|
64
|
+
| \\\`type:descriptor\\\` | descriptor 类型 | type 不为 default 时 |
|
|
65
|
+
| \\\`type:portal\\\` | Portal 类型 | type 为 portal 时 |
|
|
66
|
+
| \\\`refs:id1,id2,...\\\` | Portal 引用的 Rem | 仅 portal |
|
|
67
|
+
| \\\`doc\\\` | isDocument = true | 独立于 type |
|
|
68
|
+
| \\\`top\\\` | 顶层 Rem | 无父节点 |
|
|
69
|
+
| \\\`children:N\\\` | 折叠子节点数 | 深度超限且有子节点 |
|
|
70
|
+
| \\\`role:card-item\\\` | 多行答案行 | isCardItem = true |
|
|
71
|
+
| \\\`tag:Name(id)\\\` | 标签 | 每个 tag 一个 |
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## 5. 省略占位符
|
|
76
|
+
|
|
77
|
+
### 精确省略(sibling 裁剪)
|
|
78
|
+
\\\`\\\`\\\`
|
|
79
|
+
<!--...elided {N} siblings (parent:{parentId} range:{from}-{to} total:{total})-->
|
|
80
|
+
\\\`\\\`\\\`
|
|
81
|
+
|
|
82
|
+
### 非精确省略(预算耗尽)
|
|
83
|
+
\\\`\\\`\\\`
|
|
84
|
+
<!--...elided >={N} nodes (parent:{parentId} range:{from}-{to} total:{total})-->
|
|
85
|
+
\\\`\\\`\\\`
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## 6. 完整示例
|
|
90
|
+
|
|
91
|
+
\\\`\\\`\\\`markdown
|
|
92
|
+
# 数据结构 <!--kLr type:concept doc top-->
|
|
93
|
+
## 线性结构 <!--ABC type:concept-->
|
|
94
|
+
数组 → Array <!--DEF-->
|
|
95
|
+
链表 ↓ <!--GHI type:concept-->
|
|
96
|
+
单向链表 <!--JKL role:card-item-->
|
|
97
|
+
双向链表 <!--MNO role:card-item-->
|
|
98
|
+
- [x] 复习完成 <!--PQR-->
|
|
99
|
+
## 树结构 <!--VWX type:concept children:8-->
|
|
100
|
+
<!--...elided 3 siblings (parent:kLr range:3-5 total:6)-->
|
|
101
|
+
嵌入视图 <!--p01 type:portal refs:ref1,ref2-->
|
|
102
|
+
重要概念 <!--QRS tag:数学(tag01) tag:基础(tag02)-->
|
|
103
|
+
\\\`\\\`\\\`
|
|
104
|
+
`;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const REM_OBJECT_FIELDS_CONTENT = "\n# RemObject \u5B57\u6BB5\u53C2\u8003\n\nRemObject \u662F\u672C\u9879\u76EE\u5BF9 RemNote Rem \u7684\u6807\u51C6\u5316\u8868\u793A\uFF0C\u5305\u542B 51 \u4E2A\u5B57\u6BB5\u3002\n\n---\n\n## \u5B57\u6BB5\u5206\u7C7B\n\n| \u6807\u8BB0 | \u542B\u4E49 | \u6570\u91CF | \u8F93\u51FA\u6761\u4EF6 |\n|:-----|:-----|:-----|:---------|\n| RW | \u53EF\u8BFB\u53EF\u5199 | 20 | \u9ED8\u8BA4\u8F93\u51FA |\n| R | \u53EA\u8BFB | 14 | \u9ED8\u8BA4\u8F93\u51FA |\n| R-F | \u53EA\u8BFB\u4F4E\u9891 | 17 | \u4EC5 \\`--full\\` \u8F93\u51FA |\n\n---\n\n## \u6838\u5FC3\u6807\u8BC6\n\n| \u5B57\u6BB5 | \u7C7B\u578B | \u6743\u9650 | \u8BF4\u660E |\n|------|------|:----:|------|\n| \\`id\\` | \\`string\\` | R | Rem \u552F\u4E00 ID |\n\n## \u5185\u5BB9\n\n| \u5B57\u6BB5 | \u7C7B\u578B | \u6743\u9650 | \u8BF4\u660E |\n|------|------|:----:|------|\n| \\`text\\` | \\`RichText\\` | RW | \u6B63\u9762\u6587\u672C\uFF08RichText \u6570\u7EC4\uFF09 |\n| \\`backText\\` | \\`RichText \\| null\\` | RW | \u80CC\u9762\u6587\u672C\u3002null=\u65E0\u80CC\u9762\uFF1B\u8BBE\u503C\u5373\u4EA7\u751F\u95EA\u5361\u6B63\u53CD\u9762\u7ED3\u6784 |\n\n## \u7C7B\u578B\u7CFB\u7EDF\n\n| \u5B57\u6BB5 | \u7C7B\u578B | \u6743\u9650 | \u8BF4\u660E |\n|------|------|:----:|------|\n| \\`type\\` | \\`RemTypeValue\\` | RW | \\`concept\\` / \\`descriptor\\` / \\`default\\` / \\`portal\\` |\n| \\`isDocument\\` | \\`boolean\\` | RW | \u662F\u5426\u4F5C\u4E3A\u72EC\u7ACB\u6587\u6863\u9875\u9762\u3002\u72EC\u7ACB\u4E8E type |\n\n## \u7ED3\u6784\n\n| \u5B57\u6BB5 | \u7C7B\u578B | \u6743\u9650 | \u8BF4\u660E |\n|------|------|:----:|------|\n| \\`parent\\` | \\`string \\| null\\` | RW | \u7236 Rem ID\u3002null=\u9876\u7EA7 |\n| \\`children\\` | \\`string[]\\` | R | \u5B50 Rem ID \u6709\u5E8F\u6570\u7EC4 |\n\n## \u683C\u5F0F / \u663E\u793A\n\n| \u5B57\u6BB5 | \u7C7B\u578B | \u6743\u9650 | \u8BF4\u660E |\n|------|------|:----:|------|\n| \\`fontSize\\` | \\`FontSize \\| null\\` | RW | \u6807\u9898\u5927\u5C0F\uFF1A\\`H1\\` / \\`H2\\` / \\`H3\\`\u3002null=\u666E\u901A |\n| \\`highlightColor\\` | \\`HighlightColor \\| null\\` | RW | \u9AD8\u4EAE\u989C\u8272\uFF089 \u79CD\uFF09\u3002null=\u65E0\u9AD8\u4EAE |\n\n## \u72B6\u6001\u6807\u8BB0\n\n| \u5B57\u6BB5 | \u7C7B\u578B | \u6743\u9650 | \u8BF4\u660E |\n|------|------|:----:|------|\n| \\`isTodo\\` | \\`boolean\\` | RW | \u662F\u5426\u5F85\u529E\u3002\u8BBE\u4E3A true \u65F6\u81EA\u52A8\u521D\u59CB\u5316 todoStatus |\n| \\`todoStatus\\` | \\`TodoStatus \\| null\\` | RW | \\`Finished\\` / \\`Unfinished\\`\u3002\u9700\u5148 isTodo=true |\n| \\`isCode\\` | \\`boolean\\` | RW | \u662F\u5426\u4EE3\u7801\u5757 |\n| \\`isQuote\\` | \\`boolean\\` | RW | \u662F\u5426\u5F15\u7528\u5757 |\n| \\`isListItem\\` | \\`boolean\\` | RW | \u662F\u5426\u5217\u8868\u9879\uFF08\u6709\u5E8F\u5217\u8868\u6837\u5F0F\uFF09 |\n| \\`isCardItem\\` | \\`boolean\\` | RW | \u662F\u5426\u5361\u7247\u9879\uFF08\u591A\u884C\u7B54\u6848\u884C\u6807\u8BB0\uFF09 |\n| \\`isTable\\` | \\`boolean\\` | R | \u662F\u5426\u8868\u683C\uFF08\u53EA\u8BFB\uFF09 |\n| \\`isSlot\\` | \\`boolean\\` | RW | \u662F\u5426 Powerup \u63D2\u69FD\u3002\u4E0E isProperty \u5E95\u5C42\u76F8\u540C |\n| \\`isProperty\\` | \\`boolean\\` | RW | \u662F\u5426 Tag \u5C5E\u6027\uFF08\u8868\u683C\u5217\uFF09\u3002\u4E0E isSlot \u5E95\u5C42\u76F8\u540C |\n\n## Powerup \u7CFB\u7EDF\u6807\u8BC6\n\n| \u5B57\u6BB5 | \u7C7B\u578B | \u6743\u9650 | \u8BF4\u660E |\n|------|------|:----:|------|\n| \\`isPowerup\\` | \\`boolean\\` | R-F | \u662F\u5426 Powerup |\n| \\`isPowerupEnum\\` | \\`boolean\\` | R-F | \u662F\u5426 Powerup \u679A\u4E3E |\n| \\`isPowerupProperty\\` | \\`boolean\\` | R-F | \u662F\u5426 Powerup \u5C5E\u6027 |\n| \\`isPowerupPropertyListItem\\` | \\`boolean\\` | R-F | \u662F\u5426 Powerup \u5C5E\u6027\u5217\u8868\u9879 |\n| \\`isPowerupSlot\\` | \\`boolean\\` | R-F | \u662F\u5426 Powerup \u63D2\u69FD |\n\n## Portal \u4E13\u7528\n\n| \u5B57\u6BB5 | \u7C7B\u578B | \u6743\u9650 | \u8BF4\u660E |\n|------|------|:----:|------|\n| \\`portalType\\` | \\`PortalType \\| null\\` | R | Portal \u5B50\u7C7B\u578B\u3002\u4EC5 type=portal \u65F6\u6709\u503C |\n| \\`portalDirectlyIncludedRem\\` | \\`string[]\\` | R | Portal \u76F4\u63A5\u5305\u542B\u7684 Rem ID |\n\n## \u5C5E\u6027\u7C7B\u578B\n\n| \u5B57\u6BB5 | \u7C7B\u578B | \u6743\u9650 | \u8BF4\u660E |\n|------|------|:----:|------|\n| \\`propertyType\\` | \\`PropertyTypeValue \\| null\\` | R | \u5C5E\u6027\u6570\u636E\u7C7B\u578B\uFF08\u5F53\u6B64 Rem \u662F Tag \u7684\u5C5E\u6027\u65F6\uFF09 |\n\n## \u7EC3\u4E60\u8BBE\u7F6E\n\n| \u5B57\u6BB5 | \u7C7B\u578B | \u6743\u9650 | \u8BF4\u660E |\n|------|------|:----:|------|\n| \\`enablePractice\\` | \\`boolean\\` | RW | \u662F\u5426\u542F\u7528\u95F4\u9694\u91CD\u590D\u7EC3\u4E60 |\n| \\`practiceDirection\\` | \\`PracticeDirection\\` | RW | \u7EC3\u4E60\u65B9\u5411\uFF1A\\`forward\\` / \\`backward\\` / \\`both\\` / \\`none\\` |\n\n## \u5173\u8054 \u2014 \u76F4\u63A5\u5173\u7CFB\n\n| \u5B57\u6BB5 | \u7C7B\u578B | \u6743\u9650 | \u8BF4\u660E |\n|------|------|:----:|------|\n| \\`tags\\` | \\`string[]\\` | RW | \u6807\u7B7E Rem ID \u6570\u7EC4\u3002\u5199\u5165\u65F6\u4F7F\u7528 diff \u673A\u5236\uFF08add/remove\uFF09 |\n| \\`sources\\` | \\`string[]\\` | RW | \u6765\u6E90 Rem ID \u6570\u7EC4\u3002\u5199\u5165\u65F6\u4F7F\u7528 diff \u673A\u5236 |\n| \\`aliases\\` | \\`string[]\\` | R | \u522B\u540D Rem ID \u6570\u7EC4 |\n\n## \u5173\u8054 \u2014 \u5F15\u7528\u5173\u7CFB\n\n| \u5B57\u6BB5 | \u7C7B\u578B | \u6743\u9650 | \u8BF4\u660E |\n|------|------|:----:|------|\n| \\`remsBeingReferenced\\` | \\`string[]\\` | R | \u672C Rem \u5F15\u7528\u7684\u5176\u4ED6 Rem |\n| \\`deepRemsBeingReferenced\\` | \\`string[]\\` | R-F | \u672C Rem \u6DF1\u5C42\u5F15\u7528\u7684 Rem |\n| \\`remsReferencingThis\\` | \\`string[]\\` | R | \u5F15\u7528\u672C Rem \u7684 Rem\uFF08\u53CD\u5411\u94FE\u63A5\uFF09 |\n\n## \u5173\u8054 \u2014 \u6807\u7B7E\u4F53\u7CFB\n\n| \u5B57\u6BB5 | \u7C7B\u578B | \u6743\u9650 | \u8BF4\u660E |\n|------|------|:----:|------|\n| \\`taggedRem\\` | \\`string[]\\` | R | \u88AB\u672C Rem \u6807\u8BB0\u7684 Rem\uFF08\u672C Rem \u4F5C\u4E3A tag \u65F6\uFF09 |\n| \\`ancestorTagRem\\` | \\`string[]\\` | R-F | \u7956\u5148\u6807\u7B7E Rem\uFF08\u6807\u7B7E\u7EE7\u627F\u94FE\uFF09 |\n| \\`descendantTagRem\\` | \\`string[]\\` | R-F | \u540E\u4EE3\u6807\u7B7E Rem\uFF08\u6807\u7B7E\u7EE7\u627F\u94FE\uFF09 |\n\n## \u5173\u8054 \u2014 \u5C42\u7EA7\u904D\u5386\n\n| \u5B57\u6BB5 | \u7C7B\u578B | \u6743\u9650 | \u8BF4\u660E |\n|------|------|:----:|------|\n| \\`descendants\\` | \\`string[]\\` | R | \u6240\u6709\u540E\u4EE3 Rem |\n| \\`siblingRem\\` | \\`string[]\\` | R | \u5144\u5F1F Rem |\n| \\`portalsAndDocumentsIn\\` | \\`string[]\\` | R-F | \u6240\u5728\u7684 Portal \u548C\u6587\u6863 |\n| \\`allRemInDocumentOrPortal\\` | \\`string[]\\` | R-F | \u6587\u6863/Portal \u4E2D\u7684\u6240\u6709 Rem |\n| \\`allRemInFolderQueue\\` | \\`string[]\\` | R-F | \u6587\u4EF6\u5939\u961F\u5217\u4E2D\u7684 Rem |\n\n## \u4F4D\u7F6E / \u7EDF\u8BA1\n\n| \u5B57\u6BB5 | \u7C7B\u578B | \u6743\u9650 | \u8BF4\u660E |\n|------|------|:----:|------|\n| \\`positionAmongstSiblings\\` | \\`number \\| null\\` | RW | \u5728\u5144\u5F1F\u95F4\u7684\u4F4D\u7F6E\uFF080 \u8D77\u59CB\uFF09 |\n| \\`timesSelectedInSearch\\` | \\`number\\` | R-F | \u641C\u7D22\u4E2D\u88AB\u9009\u6B21\u6570 |\n| \\`lastTimeMovedTo\\` | \\`number\\` | R-F | \u4E0A\u6B21\u79FB\u52A8\u65F6\u95F4\uFF08\u6BEB\u79D2\u65F6\u95F4\u6233\uFF09 |\n| \\`schemaVersion\\` | \\`number\\` | R-F | Schema \u7248\u672C\u53F7 |\n\n## \u961F\u5217\u89C6\u56FE\n\n| \u5B57\u6BB5 | \u7C7B\u578B | \u6743\u9650 | \u8BF4\u660E |\n|------|------|:----:|------|\n| \\`embeddedQueueViewMode\\` | \\`boolean\\` | R-F | \u5D4C\u5165\u5F0F\u961F\u5217\u89C6\u56FE\u6A21\u5F0F |\n\n## \u5143\u6570\u636E / \u65F6\u95F4\u6233\n\n| \u5B57\u6BB5 | \u7C7B\u578B | \u6743\u9650 | \u8BF4\u660E |\n|------|------|:----:|------|\n| \\`createdAt\\` | \\`number\\` | R | \u521B\u5EFA\u65F6\u95F4\uFF08\u6BEB\u79D2\u65F6\u95F4\u6233\uFF09 |\n| \\`updatedAt\\` | \\`number\\` | R | \u6700\u540E\u66F4\u65B0\u65F6\u95F4\uFF08\u6BEB\u79D2\u65F6\u95F4\u6233\uFF09 |\n| \\`localUpdatedAt\\` | \\`number\\` | R-F | \u672C\u5730\u6700\u540E\u66F4\u65B0\u65F6\u95F4 |\n| \\`lastPracticed\\` | \\`number\\` | R-F | \u4E0A\u6B21\u7EC3\u4E60\u65F6\u95F4 |\n\n---\n\n## \u53EF\u7F16\u8F91\u5B57\u6BB5\u7EA6\u675F\u8868\n\n\u4EE5\u4E0B\u4E3A 20 \u4E2A\u53EF\u7F16\u8F91\u5B57\u6BB5\uFF08RW\uFF09\u53CA\u5176\u5199\u5165\u7EA6\u675F\uFF1A\n\n| \u5B57\u6BB5 | SDK setter | \u503C\u7C7B\u578B | \u7EA6\u675F / \u7279\u6B8A\u5904\u7406 |\n|------|-----------|--------|-----------------|\n| \\`text\\` | \\`rem.setText()\\` | RichText | RichText \u6570\u7EC4 |\n| \\`backText\\` | \\`rem.setBackText()\\` | RichText \\| null | null \u2192 \\`setBackText([])\\`\uFF08\u6E05\u9664\u80CC\u9762\uFF09\uFF1B\u5B57\u7B26\u4E32 \u2192 \u5305\u88C5\u4E3A \\`[string]\\` |\n| \\`type\\` | \\`rem.setType()\\` | RemTypeValue | \\`portal\\` \u4E0D\u53EF\u8BBE\u7F6E\uFF08\u53EA\u80FD\u901A\u8FC7 \\`createPortal()\\` \u521B\u5EFA\uFF09 |\n| \\`isDocument\\` | \\`rem.setIsDocument()\\` | boolean | \u2014 |\n| \\`parent\\` | \\`rem.setParent(parentId, position?)\\` | string \\| null | \u4E0E \\`positionAmongstSiblings\\` \u8054\u52A8 |\n| \\`fontSize\\` | \\`rem.setFontSize()\\` | FontSize \\| null | null \u2192 \\`setFontSize(undefined)\\`\uFF08\u6062\u590D\u666E\u901A\u5927\u5C0F\uFF09 |\n| \\`highlightColor\\` | \\`rem.setHighlightColor()\\` / \\`rem.removePowerup('h')\\` | HighlightColor \\| null | null \u2192 \\`removePowerup('h')\\`\uFF08SDK \u4E0D\u63A5\u53D7 null\uFF09 |\n| \\`isTodo\\` | \\`rem.setIsTodo()\\` | boolean | \u8BBE\u4E3A true \u65F6\u81EA\u52A8\u521D\u59CB\u5316 todoStatus |\n| \\`todoStatus\\` | \\`rem.setTodoStatus()\\` | TodoStatus \\| null | null \u2192 \u8DF3\u8FC7\uFF08\u6E05\u9664 todo \u5E94\u901A\u8FC7 \\`isTodo=false\\`\uFF09 |\n| \\`isCode\\` | \\`rem.setIsCode()\\` | boolean | \u2014 |\n| \\`isQuote\\` | \\`rem.setIsQuote()\\` | boolean | \u2014 |\n| \\`isListItem\\` | \\`rem.setIsListItem()\\` | boolean | \u2014 |\n| \\`isCardItem\\` | \\`rem.setIsCardItem()\\` | boolean | \u2014 |\n| \\`isSlot\\` | \\`rem.setIsSlot()\\` | boolean | \u4E0E \\`isProperty\\` \u5E95\u5C42\u76F8\u540C |\n| \\`isProperty\\` | \\`rem.setIsProperty()\\` | boolean | \u4E0E \\`isSlot\\` \u5E95\u5C42\u76F8\u540C |\n| \\`enablePractice\\` | \\`rem.setEnablePractice()\\` | boolean | \u2014 |\n| \\`practiceDirection\\` | \\`rem.setPracticeDirection()\\` | PracticeDirection | \\`forward\\` / \\`backward\\` / \\`both\\` / \\`none\\` |\n| \\`tags\\` | \\`rem.addTag()\\` / \\`rem.removeTag()\\` | string[] | **Diff \u673A\u5236**\uFF1A\u5BF9\u6BD4\u5F53\u524D vs \u76EE\u6807\uFF0C\u589E\u5220\u5DEE\u5F02\u9879 |\n| \\`sources\\` | \\`rem.addSource()\\` / \\`rem.removeSource()\\` | string[] | **Diff \u673A\u5236**\uFF1A\u5BF9\u6BD4\u5F53\u524D vs \u76EE\u6807\uFF0C\u589E\u5220\u5DEE\u5F02\u9879 |\n| \\`positionAmongstSiblings\\` | \\`rem.setParent(parent, position)\\` | number \\| null | \u4E0E \\`parent\\` \u8054\u52A8 |\n\n### parent + positionAmongstSiblings \u8054\u52A8\n\n\u8FD9\u4E24\u4E2A\u5B57\u6BB5\u901A\u8FC7\u540C\u4E00\u4E2A SDK \u8C03\u7528 \\`rem.setParent(parentId, position)\\` \u5199\u5165\uFF1A\n\n| \u573A\u666F | \u884C\u4E3A |\n|------|------|\n| \u4E24\u4E2A\u5B57\u6BB5\u90FD\u53D8\u66F4 | \u5408\u5E76\u4E3A\u4E00\u6B21 \\`setParent(newParent, newPosition)\\` \u8C03\u7528 |\n| \u53EA\u6709 \\`parent\\` \u53D8\u66F4 | \\`setParent(newParent)\\` \u4E0D\u5E26 position\uFF08\u4FDD\u6301\u672B\u5C3E\uFF09 |\n| \u53EA\u6709 \\`positionAmongstSiblings\\` \u53D8\u66F4 | \u83B7\u53D6\u5F53\u524D parent \u2192 \\`setParent(currentParent, newPosition)\\` |\n\n### tags / sources Diff \u673A\u5236\n\n\u5199\u5165 \\`tags\\` \u6216 \\`sources\\` \u65F6\uFF0C\u4E0D\u662F\u6574\u4F53\u66FF\u6362\uFF0C\u800C\u662F\u8BA1\u7B97\u5DEE\u5F02\uFF1A\n\n\\`\\`\\`\ncurrentTags = await rem.getTagRems()\ntargetIds = payload \u4E2D\u7684 tags \u5B57\u6BB5\ncurrentSet = Set(currentTags.map(r => r._id))\ntargetSet = Set(targetIds)\n\n// \u589E\u52A0\u7F3A\u5C11\u7684\nfor id in targetIds:\n if id not in currentSet: await rem.addTag(id)\n\n// \u5220\u9664\u591A\u4F59\u7684\nfor id in currentSet:\n if id not in targetSet: await rem.removeTag(id)\n\\`\\`\\`\n\n---\n\n## \u53EA\u8BFB\u5B57\u6BB5\u5217\u8868\n\n\u4EE5\u4E0B 31 \u4E2A\u5B57\u6BB5\u5728 str_replace \u4E2D\u88AB\u4FEE\u6539\u65F6\uFF0C**\u53EA\u4EA7\u751F\u8B66\u544A\uFF0C\u4E0D\u6267\u884C\u5199\u5165**\uFF1A\n\n\\`\\`\\`\nid,\nchildren,\nisTable,\nportalType, portalDirectlyIncludedRem,\npropertyType,\naliases,\nremsBeingReferenced, deepRemsBeingReferenced, remsReferencingThis,\ntaggedRem, ancestorTagRem, descendantTagRem,\ndescendants, siblingRem,\nportalsAndDocumentsIn, allRemInDocumentOrPortal, allRemInFolderQueue,\ntimesSelectedInSearch, lastTimeMovedTo, schemaVersion,\nembeddedQueueViewMode,\ncreatedAt, updatedAt, localUpdatedAt, lastPracticed,\nisPowerup, isPowerupEnum, isPowerupProperty,\nisPowerupPropertyListItem, isPowerupSlot\n\\`\\`\\`\n\n\u8B66\u544A\u683C\u5F0F\uFF1A\\`\"Field '{fieldName}' is read-only and was ignored\"\\`\n\n---\n\n## \u679A\u4E3E\u7C7B\u578B\u901F\u67E5\u8868\n\n### RemTypeValue\n\n| \u503C | \u542B\u4E49 | UI \u8868\u73B0 |\n|----|------|---------|\n| \\`concept\\` | \u6982\u5FF5\uFF08\u53CC\u5411\u95EA\u5361\uFF09 | \u6587\u5B57\u52A0\u7C97 |\n| \\`descriptor\\` | \u63CF\u8FF0\uFF08\u5355\u5411\u95EA\u5361\uFF09 | \u6B63\u5E38\u5B57\u91CD |\n| \\`default\\` | \u666E\u901A Rem | \u6B63\u5E38\u5B57\u91CD |\n| \\`portal\\` | \u5D4C\u5165\u5F15\u7528\u5BB9\u5668 | \u7D2B\u8272\u5DE6\u8FB9\u6846\uFF08\u53EA\u8BFB\uFF0C\u4E0D\u53EF\u901A\u8FC7 setType \u8BBE\u7F6E\uFF09 |\n\n### FontSize\n\n| \u503C | UI \u8868\u73B0 |\n|----|---------|\n| \\`H1\\` | \u8D85\u5927\u7C97\u4F53 |\n| \\`H2\\` | \u5927\u7C97\u4F53 |\n| \\`H3\\` | \u4E2D\u7C97\u4F53 |\n\n### TodoStatus\n\n| \u503C | UI \u8868\u73B0 |\n|----|---------|\n| \\`Finished\\` | \u84DD\u8272\u5DF2\u52FE\u9009 + \u6587\u672C\u5220\u9664\u7EBF |\n| \\`Unfinished\\` | \u7A7A\u5FC3\u672A\u52FE\u9009 |\n\n### HighlightColor\n\n\\`\\`\\`\nRed | Orange | Yellow | Green | Blue | Purple | Gray | Brown | Pink\n\\`\\`\\`\n\n### PortalType\n\n| \u503C | \u542B\u4E49 |\n|----|------|\n| \\`portal\\` | \u6807\u51C6 Portal |\n| \\`embedded_queue\\` | \u5D4C\u5165\u5F0F\u961F\u5217\u89C6\u56FE |\n| \\`scaffold\\` | \u811A\u624B\u67B6\u6A21\u5F0F |\n| \\`search_portal\\` | \u641C\u7D22 Portal |\n\n### PracticeDirection\n\n| \u503C | \u542B\u4E49 |\n|----|------|\n| \\`forward\\` | \u6B63\u5411\uFF1A\u770B text \u56DE\u5FC6 backText |\n| \\`backward\\` | \u53CD\u5411\uFF1A\u770B backText \u56DE\u5FC6 text |\n| \\`both\\` | \u53CC\u5411\uFF1A\u6B63\u53CD\u4E24\u4E2A\u65B9\u5411\u90FD\u7EC3\u4E60 |\n| \\`none\\` | \u4E0D\u751F\u6210\u95EA\u5361 |\n\n### PropertyTypeValue\n\n\\`\\`\\`\ntext | number | date | checkbox | single_select | multi_select | url | image | title | definition | created_at | last_updated | 0\n\\`\\`\\`\n\n\\`0\\` \u8868\u793A\u9690\u5F0F\u6587\u672C\u7C7B\u578B\uFF08IMPLICIT_TEXT\uFF09\u3002\n\n---\n\n## RichText \u683C\u5F0F\n\nRemObject \u4E2D\u7684 \\`text\\` \u548C \\`backText\\` \u5B57\u6BB5\u4F7F\u7528 RichText \u683C\u5F0F\u2014\u2014\u4E00\u4E2A JSON \u6570\u7EC4\uFF0C\u6BCF\u4E2A\u5143\u7D20\u4E3A\u7EAF\u5B57\u7B26\u4E32\u6216\u5E26 \\`i\\` \u5B57\u6BB5\u7684\u683C\u5F0F\u5316\u5BF9\u8C61\u3002\n\n### \u5143\u7D20\u7C7B\u578B\n\n| \\`i\\` \u503C | \u542B\u4E49 | \u6838\u5FC3\u5B57\u6BB5 |\n|--------|------|----------|\n| \uFF08\u7EAF string\uFF09 | \u7EAF\u6587\u672C\u7247\u6BB5 | \u2014 |\n| \\`\"m\"\\` | \u5E26\u683C\u5F0F\u6587\u672C | \\`text\\` + \u683C\u5F0F\u6807\u8BB0 |\n| \\`\"q\"\\` | Rem \u5F15\u7528 | \\`_id\\`\uFF08\u88AB\u5F15\u7528 Rem ID\uFF09 |\n| \\`\"i\"\\` | \u56FE\u7247 | \\`url\\`, \\`width\\`, \\`height\\` |\n| \\`\"x\"\\` | LaTeX | \\`text\\` |\n| \\`\"a\"\\` | \u97F3\u9891 | \\`url\\` |\n\n### \u884C\u5185\u683C\u5F0F\u6807\u8BB0\uFF08\\`i:\"m\"\\` \u5143\u7D20\u5185\uFF09\n\n| \u5B57\u6BB5 | \u7C7B\u578B | \u542B\u4E49 |\n|------|------|------|\n| \\`b\\` | \\`true\\` | \u52A0\u7C97 |\n| \\`l\\` | \\`true\\` | \u659C\u4F53 |\n| \\`u\\` | \\`true\\` | \u4E0B\u5212\u7EBF |\n| \\`h\\` | \\`number\\` | \u9AD8\u4EAE\u989C\u8272\uFF081=\u7EA2, 2=\u6A59, 3=\u9EC4, 4=\u7EFF, 5=\u84DD, 6=\u7D2B\uFF09 |\n| \\`tc\\` | \\`number\\` | \u6587\u5B57\u989C\u8272 |\n| \\`code\\` | \\`true\\` | \u884C\u5185\u4EE3\u7801 |\n| \\`cId\\` | \\`string\\` | \u5B8C\u5F62\u586B\u7A7A ID |\n| \\`iUrl\\` | \\`string\\` | \u5916\u90E8\u94FE\u63A5 URL |\n\n### \u5E8F\u5217\u5316\u786E\u5B9A\u6027\n\nRichText \u5BF9\u8C61\u5143\u7D20\u5185\u90E8\u6309 **key \u5B57\u6BCD\u5E8F\u6392\u5217**\uFF08Plugin \u7AEF \\`sortRichTextKeys()\\` \u5904\u7406\uFF09\uFF0C\u786E\u4FDD\u540C\u4E00\u5185\u5BB9\u7684\u5E8F\u5217\u5316 JSON \u59CB\u7EC8\u4E00\u81F4\u3002\u8FD9\u5BF9 \\`edit_rem\\` \u7684 str_replace \u548C\u4E50\u89C2\u5E76\u53D1\u68C0\u6D4B\u81F3\u5173\u91CD\u8981\u3002\n";
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
export const REM_OBJECT_FIELDS_CONTENT = `
|
|
2
|
+
# RemObject 字段参考
|
|
3
|
+
|
|
4
|
+
RemObject 是本项目对 RemNote Rem 的标准化表示,包含 51 个字段。
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 字段分类
|
|
9
|
+
|
|
10
|
+
| 标记 | 含义 | 数量 | 输出条件 |
|
|
11
|
+
|:-----|:-----|:-----|:---------|
|
|
12
|
+
| RW | 可读可写 | 20 | 默认输出 |
|
|
13
|
+
| R | 只读 | 14 | 默认输出 |
|
|
14
|
+
| R-F | 只读低频 | 17 | 仅 \\\`--full\\\` 输出 |
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 核心标识
|
|
19
|
+
|
|
20
|
+
| 字段 | 类型 | 权限 | 说明 |
|
|
21
|
+
|------|------|:----:|------|
|
|
22
|
+
| \\\`id\\\` | \\\`string\\\` | R | Rem 唯一 ID |
|
|
23
|
+
|
|
24
|
+
## 内容
|
|
25
|
+
|
|
26
|
+
| 字段 | 类型 | 权限 | 说明 |
|
|
27
|
+
|------|------|:----:|------|
|
|
28
|
+
| \\\`text\\\` | \\\`RichText\\\` | RW | 正面文本(RichText 数组) |
|
|
29
|
+
| \\\`backText\\\` | \\\`RichText \\| null\\\` | RW | 背面文本。null=无背面;设值即产生闪卡正反面结构 |
|
|
30
|
+
|
|
31
|
+
## 类型系统
|
|
32
|
+
|
|
33
|
+
| 字段 | 类型 | 权限 | 说明 |
|
|
34
|
+
|------|------|:----:|------|
|
|
35
|
+
| \\\`type\\\` | \\\`RemTypeValue\\\` | RW | \\\`concept\\\` / \\\`descriptor\\\` / \\\`default\\\` / \\\`portal\\\` |
|
|
36
|
+
| \\\`isDocument\\\` | \\\`boolean\\\` | RW | 是否作为独立文档页面。独立于 type |
|
|
37
|
+
|
|
38
|
+
## 结构
|
|
39
|
+
|
|
40
|
+
| 字段 | 类型 | 权限 | 说明 |
|
|
41
|
+
|------|------|:----:|------|
|
|
42
|
+
| \\\`parent\\\` | \\\`string \\| null\\\` | RW | 父 Rem ID。null=顶级 |
|
|
43
|
+
| \\\`children\\\` | \\\`string[]\\\` | R | 子 Rem ID 有序数组 |
|
|
44
|
+
|
|
45
|
+
## 格式 / 显示
|
|
46
|
+
|
|
47
|
+
| 字段 | 类型 | 权限 | 说明 |
|
|
48
|
+
|------|------|:----:|------|
|
|
49
|
+
| \\\`fontSize\\\` | \\\`FontSize \\| null\\\` | RW | 标题大小:\\\`H1\\\` / \\\`H2\\\` / \\\`H3\\\`。null=普通 |
|
|
50
|
+
| \\\`highlightColor\\\` | \\\`HighlightColor \\| null\\\` | RW | 高亮颜色(9 种)。null=无高亮 |
|
|
51
|
+
|
|
52
|
+
## 状态标记
|
|
53
|
+
|
|
54
|
+
| 字段 | 类型 | 权限 | 说明 |
|
|
55
|
+
|------|------|:----:|------|
|
|
56
|
+
| \\\`isTodo\\\` | \\\`boolean\\\` | RW | 是否待办。设为 true 时自动初始化 todoStatus |
|
|
57
|
+
| \\\`todoStatus\\\` | \\\`TodoStatus \\| null\\\` | RW | \\\`Finished\\\` / \\\`Unfinished\\\`。需先 isTodo=true |
|
|
58
|
+
| \\\`isCode\\\` | \\\`boolean\\\` | RW | 是否代码块 |
|
|
59
|
+
| \\\`isQuote\\\` | \\\`boolean\\\` | RW | 是否引用块 |
|
|
60
|
+
| \\\`isListItem\\\` | \\\`boolean\\\` | RW | 是否列表项(有序列表样式) |
|
|
61
|
+
| \\\`isCardItem\\\` | \\\`boolean\\\` | RW | 是否卡片项(多行答案行标记) |
|
|
62
|
+
| \\\`isTable\\\` | \\\`boolean\\\` | R | 是否表格(只读) |
|
|
63
|
+
| \\\`isSlot\\\` | \\\`boolean\\\` | RW | 是否 Powerup 插槽。与 isProperty 底层相同 |
|
|
64
|
+
| \\\`isProperty\\\` | \\\`boolean\\\` | RW | 是否 Tag 属性(表格列)。与 isSlot 底层相同 |
|
|
65
|
+
|
|
66
|
+
## Powerup 系统标识
|
|
67
|
+
|
|
68
|
+
| 字段 | 类型 | 权限 | 说明 |
|
|
69
|
+
|------|------|:----:|------|
|
|
70
|
+
| \\\`isPowerup\\\` | \\\`boolean\\\` | R-F | 是否 Powerup |
|
|
71
|
+
| \\\`isPowerupEnum\\\` | \\\`boolean\\\` | R-F | 是否 Powerup 枚举 |
|
|
72
|
+
| \\\`isPowerupProperty\\\` | \\\`boolean\\\` | R-F | 是否 Powerup 属性 |
|
|
73
|
+
| \\\`isPowerupPropertyListItem\\\` | \\\`boolean\\\` | R-F | 是否 Powerup 属性列表项 |
|
|
74
|
+
| \\\`isPowerupSlot\\\` | \\\`boolean\\\` | R-F | 是否 Powerup 插槽 |
|
|
75
|
+
|
|
76
|
+
## Portal 专用
|
|
77
|
+
|
|
78
|
+
| 字段 | 类型 | 权限 | 说明 |
|
|
79
|
+
|------|------|:----:|------|
|
|
80
|
+
| \\\`portalType\\\` | \\\`PortalType \\| null\\\` | R | Portal 子类型。仅 type=portal 时有值 |
|
|
81
|
+
| \\\`portalDirectlyIncludedRem\\\` | \\\`string[]\\\` | R | Portal 直接包含的 Rem ID |
|
|
82
|
+
|
|
83
|
+
## 属性类型
|
|
84
|
+
|
|
85
|
+
| 字段 | 类型 | 权限 | 说明 |
|
|
86
|
+
|------|------|:----:|------|
|
|
87
|
+
| \\\`propertyType\\\` | \\\`PropertyTypeValue \\| null\\\` | R | 属性数据类型(当此 Rem 是 Tag 的属性时) |
|
|
88
|
+
|
|
89
|
+
## 练习设置
|
|
90
|
+
|
|
91
|
+
| 字段 | 类型 | 权限 | 说明 |
|
|
92
|
+
|------|------|:----:|------|
|
|
93
|
+
| \\\`enablePractice\\\` | \\\`boolean\\\` | RW | 是否启用间隔重复练习 |
|
|
94
|
+
| \\\`practiceDirection\\\` | \\\`PracticeDirection\\\` | RW | 练习方向:\\\`forward\\\` / \\\`backward\\\` / \\\`both\\\` / \\\`none\\\` |
|
|
95
|
+
|
|
96
|
+
## 关联 — 直接关系
|
|
97
|
+
|
|
98
|
+
| 字段 | 类型 | 权限 | 说明 |
|
|
99
|
+
|------|------|:----:|------|
|
|
100
|
+
| \\\`tags\\\` | \\\`string[]\\\` | RW | 标签 Rem ID 数组。写入时使用 diff 机制(add/remove) |
|
|
101
|
+
| \\\`sources\\\` | \\\`string[]\\\` | RW | 来源 Rem ID 数组。写入时使用 diff 机制 |
|
|
102
|
+
| \\\`aliases\\\` | \\\`string[]\\\` | R | 别名 Rem ID 数组 |
|
|
103
|
+
|
|
104
|
+
## 关联 — 引用关系
|
|
105
|
+
|
|
106
|
+
| 字段 | 类型 | 权限 | 说明 |
|
|
107
|
+
|------|------|:----:|------|
|
|
108
|
+
| \\\`remsBeingReferenced\\\` | \\\`string[]\\\` | R | 本 Rem 引用的其他 Rem |
|
|
109
|
+
| \\\`deepRemsBeingReferenced\\\` | \\\`string[]\\\` | R-F | 本 Rem 深层引用的 Rem |
|
|
110
|
+
| \\\`remsReferencingThis\\\` | \\\`string[]\\\` | R | 引用本 Rem 的 Rem(反向链接) |
|
|
111
|
+
|
|
112
|
+
## 关联 — 标签体系
|
|
113
|
+
|
|
114
|
+
| 字段 | 类型 | 权限 | 说明 |
|
|
115
|
+
|------|------|:----:|------|
|
|
116
|
+
| \\\`taggedRem\\\` | \\\`string[]\\\` | R | 被本 Rem 标记的 Rem(本 Rem 作为 tag 时) |
|
|
117
|
+
| \\\`ancestorTagRem\\\` | \\\`string[]\\\` | R-F | 祖先标签 Rem(标签继承链) |
|
|
118
|
+
| \\\`descendantTagRem\\\` | \\\`string[]\\\` | R-F | 后代标签 Rem(标签继承链) |
|
|
119
|
+
|
|
120
|
+
## 关联 — 层级遍历
|
|
121
|
+
|
|
122
|
+
| 字段 | 类型 | 权限 | 说明 |
|
|
123
|
+
|------|------|:----:|------|
|
|
124
|
+
| \\\`descendants\\\` | \\\`string[]\\\` | R | 所有后代 Rem |
|
|
125
|
+
| \\\`siblingRem\\\` | \\\`string[]\\\` | R | 兄弟 Rem |
|
|
126
|
+
| \\\`portalsAndDocumentsIn\\\` | \\\`string[]\\\` | R-F | 所在的 Portal 和文档 |
|
|
127
|
+
| \\\`allRemInDocumentOrPortal\\\` | \\\`string[]\\\` | R-F | 文档/Portal 中的所有 Rem |
|
|
128
|
+
| \\\`allRemInFolderQueue\\\` | \\\`string[]\\\` | R-F | 文件夹队列中的 Rem |
|
|
129
|
+
|
|
130
|
+
## 位置 / 统计
|
|
131
|
+
|
|
132
|
+
| 字段 | 类型 | 权限 | 说明 |
|
|
133
|
+
|------|------|:----:|------|
|
|
134
|
+
| \\\`positionAmongstSiblings\\\` | \\\`number \\| null\\\` | RW | 在兄弟间的位置(0 起始) |
|
|
135
|
+
| \\\`timesSelectedInSearch\\\` | \\\`number\\\` | R-F | 搜索中被选次数 |
|
|
136
|
+
| \\\`lastTimeMovedTo\\\` | \\\`number\\\` | R-F | 上次移动时间(毫秒时间戳) |
|
|
137
|
+
| \\\`schemaVersion\\\` | \\\`number\\\` | R-F | Schema 版本号 |
|
|
138
|
+
|
|
139
|
+
## 队列视图
|
|
140
|
+
|
|
141
|
+
| 字段 | 类型 | 权限 | 说明 |
|
|
142
|
+
|------|------|:----:|------|
|
|
143
|
+
| \\\`embeddedQueueViewMode\\\` | \\\`boolean\\\` | R-F | 嵌入式队列视图模式 |
|
|
144
|
+
|
|
145
|
+
## 元数据 / 时间戳
|
|
146
|
+
|
|
147
|
+
| 字段 | 类型 | 权限 | 说明 |
|
|
148
|
+
|------|------|:----:|------|
|
|
149
|
+
| \\\`createdAt\\\` | \\\`number\\\` | R | 创建时间(毫秒时间戳) |
|
|
150
|
+
| \\\`updatedAt\\\` | \\\`number\\\` | R | 最后更新时间(毫秒时间戳) |
|
|
151
|
+
| \\\`localUpdatedAt\\\` | \\\`number\\\` | R-F | 本地最后更新时间 |
|
|
152
|
+
| \\\`lastPracticed\\\` | \\\`number\\\` | R-F | 上次练习时间 |
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## 可编辑字段约束表
|
|
157
|
+
|
|
158
|
+
以下为 20 个可编辑字段(RW)及其写入约束:
|
|
159
|
+
|
|
160
|
+
| 字段 | SDK setter | 值类型 | 约束 / 特殊处理 |
|
|
161
|
+
|------|-----------|--------|-----------------|
|
|
162
|
+
| \\\`text\\\` | \\\`rem.setText()\\\` | RichText | RichText 数组 |
|
|
163
|
+
| \\\`backText\\\` | \\\`rem.setBackText()\\\` | RichText \\| null | null → \\\`setBackText([])\\\`(清除背面);字符串 → 包装为 \\\`[string]\\\` |
|
|
164
|
+
| \\\`type\\\` | \\\`rem.setType()\\\` | RemTypeValue | \\\`portal\\\` 不可设置(只能通过 \\\`createPortal()\\\` 创建) |
|
|
165
|
+
| \\\`isDocument\\\` | \\\`rem.setIsDocument()\\\` | boolean | — |
|
|
166
|
+
| \\\`parent\\\` | \\\`rem.setParent(parentId, position?)\\\` | string \\| null | 与 \\\`positionAmongstSiblings\\\` 联动 |
|
|
167
|
+
| \\\`fontSize\\\` | \\\`rem.setFontSize()\\\` | FontSize \\| null | null → \\\`setFontSize(undefined)\\\`(恢复普通大小) |
|
|
168
|
+
| \\\`highlightColor\\\` | \\\`rem.setHighlightColor()\\\` / \\\`rem.removePowerup('h')\\\` | HighlightColor \\| null | null → \\\`removePowerup('h')\\\`(SDK 不接受 null) |
|
|
169
|
+
| \\\`isTodo\\\` | \\\`rem.setIsTodo()\\\` | boolean | 设为 true 时自动初始化 todoStatus |
|
|
170
|
+
| \\\`todoStatus\\\` | \\\`rem.setTodoStatus()\\\` | TodoStatus \\| null | null → 跳过(清除 todo 应通过 \\\`isTodo=false\\\`) |
|
|
171
|
+
| \\\`isCode\\\` | \\\`rem.setIsCode()\\\` | boolean | — |
|
|
172
|
+
| \\\`isQuote\\\` | \\\`rem.setIsQuote()\\\` | boolean | — |
|
|
173
|
+
| \\\`isListItem\\\` | \\\`rem.setIsListItem()\\\` | boolean | — |
|
|
174
|
+
| \\\`isCardItem\\\` | \\\`rem.setIsCardItem()\\\` | boolean | — |
|
|
175
|
+
| \\\`isSlot\\\` | \\\`rem.setIsSlot()\\\` | boolean | 与 \\\`isProperty\\\` 底层相同 |
|
|
176
|
+
| \\\`isProperty\\\` | \\\`rem.setIsProperty()\\\` | boolean | 与 \\\`isSlot\\\` 底层相同 |
|
|
177
|
+
| \\\`enablePractice\\\` | \\\`rem.setEnablePractice()\\\` | boolean | — |
|
|
178
|
+
| \\\`practiceDirection\\\` | \\\`rem.setPracticeDirection()\\\` | PracticeDirection | \\\`forward\\\` / \\\`backward\\\` / \\\`both\\\` / \\\`none\\\` |
|
|
179
|
+
| \\\`tags\\\` | \\\`rem.addTag()\\\` / \\\`rem.removeTag()\\\` | string[] | **Diff 机制**:对比当前 vs 目标,增删差异项 |
|
|
180
|
+
| \\\`sources\\\` | \\\`rem.addSource()\\\` / \\\`rem.removeSource()\\\` | string[] | **Diff 机制**:对比当前 vs 目标,增删差异项 |
|
|
181
|
+
| \\\`positionAmongstSiblings\\\` | \\\`rem.setParent(parent, position)\\\` | number \\| null | 与 \\\`parent\\\` 联动 |
|
|
182
|
+
|
|
183
|
+
### parent + positionAmongstSiblings 联动
|
|
184
|
+
|
|
185
|
+
这两个字段通过同一个 SDK 调用 \\\`rem.setParent(parentId, position)\\\` 写入:
|
|
186
|
+
|
|
187
|
+
| 场景 | 行为 |
|
|
188
|
+
|------|------|
|
|
189
|
+
| 两个字段都变更 | 合并为一次 \\\`setParent(newParent, newPosition)\\\` 调用 |
|
|
190
|
+
| 只有 \\\`parent\\\` 变更 | \\\`setParent(newParent)\\\` 不带 position(保持末尾) |
|
|
191
|
+
| 只有 \\\`positionAmongstSiblings\\\` 变更 | 获取当前 parent → \\\`setParent(currentParent, newPosition)\\\` |
|
|
192
|
+
|
|
193
|
+
### tags / sources Diff 机制
|
|
194
|
+
|
|
195
|
+
写入 \\\`tags\\\` 或 \\\`sources\\\` 时,不是整体替换,而是计算差异:
|
|
196
|
+
|
|
197
|
+
\\\`\\\`\\\`
|
|
198
|
+
currentTags = await rem.getTagRems()
|
|
199
|
+
targetIds = payload 中的 tags 字段
|
|
200
|
+
currentSet = Set(currentTags.map(r => r._id))
|
|
201
|
+
targetSet = Set(targetIds)
|
|
202
|
+
|
|
203
|
+
// 增加缺少的
|
|
204
|
+
for id in targetIds:
|
|
205
|
+
if id not in currentSet: await rem.addTag(id)
|
|
206
|
+
|
|
207
|
+
// 删除多余的
|
|
208
|
+
for id in currentSet:
|
|
209
|
+
if id not in targetSet: await rem.removeTag(id)
|
|
210
|
+
\\\`\\\`\\\`
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## 只读字段列表
|
|
215
|
+
|
|
216
|
+
以下 31 个字段在 str_replace 中被修改时,**只产生警告,不执行写入**:
|
|
217
|
+
|
|
218
|
+
\\\`\\\`\\\`
|
|
219
|
+
id,
|
|
220
|
+
children,
|
|
221
|
+
isTable,
|
|
222
|
+
portalType, portalDirectlyIncludedRem,
|
|
223
|
+
propertyType,
|
|
224
|
+
aliases,
|
|
225
|
+
remsBeingReferenced, deepRemsBeingReferenced, remsReferencingThis,
|
|
226
|
+
taggedRem, ancestorTagRem, descendantTagRem,
|
|
227
|
+
descendants, siblingRem,
|
|
228
|
+
portalsAndDocumentsIn, allRemInDocumentOrPortal, allRemInFolderQueue,
|
|
229
|
+
timesSelectedInSearch, lastTimeMovedTo, schemaVersion,
|
|
230
|
+
embeddedQueueViewMode,
|
|
231
|
+
createdAt, updatedAt, localUpdatedAt, lastPracticed,
|
|
232
|
+
isPowerup, isPowerupEnum, isPowerupProperty,
|
|
233
|
+
isPowerupPropertyListItem, isPowerupSlot
|
|
234
|
+
\\\`\\\`\\\`
|
|
235
|
+
|
|
236
|
+
警告格式:\\\`"Field '{fieldName}' is read-only and was ignored"\\\`
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## 枚举类型速查表
|
|
241
|
+
|
|
242
|
+
### RemTypeValue
|
|
243
|
+
|
|
244
|
+
| 值 | 含义 | UI 表现 |
|
|
245
|
+
|----|------|---------|
|
|
246
|
+
| \\\`concept\\\` | 概念(双向闪卡) | 文字加粗 |
|
|
247
|
+
| \\\`descriptor\\\` | 描述(单向闪卡) | 正常字重 |
|
|
248
|
+
| \\\`default\\\` | 普通 Rem | 正常字重 |
|
|
249
|
+
| \\\`portal\\\` | 嵌入引用容器 | 紫色左边框(只读,不可通过 setType 设置) |
|
|
250
|
+
|
|
251
|
+
### FontSize
|
|
252
|
+
|
|
253
|
+
| 值 | UI 表现 |
|
|
254
|
+
|----|---------|
|
|
255
|
+
| \\\`H1\\\` | 超大粗体 |
|
|
256
|
+
| \\\`H2\\\` | 大粗体 |
|
|
257
|
+
| \\\`H3\\\` | 中粗体 |
|
|
258
|
+
|
|
259
|
+
### TodoStatus
|
|
260
|
+
|
|
261
|
+
| 值 | UI 表现 |
|
|
262
|
+
|----|---------|
|
|
263
|
+
| \\\`Finished\\\` | 蓝色已勾选 + 文本删除线 |
|
|
264
|
+
| \\\`Unfinished\\\` | 空心未勾选 |
|
|
265
|
+
|
|
266
|
+
### HighlightColor
|
|
267
|
+
|
|
268
|
+
\\\`\\\`\\\`
|
|
269
|
+
Red | Orange | Yellow | Green | Blue | Purple | Gray | Brown | Pink
|
|
270
|
+
\\\`\\\`\\\`
|
|
271
|
+
|
|
272
|
+
### PortalType
|
|
273
|
+
|
|
274
|
+
| 值 | 含义 |
|
|
275
|
+
|----|------|
|
|
276
|
+
| \\\`portal\\\` | 标准 Portal |
|
|
277
|
+
| \\\`embedded_queue\\\` | 嵌入式队列视图 |
|
|
278
|
+
| \\\`scaffold\\\` | 脚手架模式 |
|
|
279
|
+
| \\\`search_portal\\\` | 搜索 Portal |
|
|
280
|
+
|
|
281
|
+
### PracticeDirection
|
|
282
|
+
|
|
283
|
+
| 值 | 含义 |
|
|
284
|
+
|----|------|
|
|
285
|
+
| \\\`forward\\\` | 正向:看 text 回忆 backText |
|
|
286
|
+
| \\\`backward\\\` | 反向:看 backText 回忆 text |
|
|
287
|
+
| \\\`both\\\` | 双向:正反两个方向都练习 |
|
|
288
|
+
| \\\`none\\\` | 不生成闪卡 |
|
|
289
|
+
|
|
290
|
+
### PropertyTypeValue
|
|
291
|
+
|
|
292
|
+
\\\`\\\`\\\`
|
|
293
|
+
text | number | date | checkbox | single_select | multi_select | url | image | title | definition | created_at | last_updated | 0
|
|
294
|
+
\\\`\\\`\\\`
|
|
295
|
+
|
|
296
|
+
\\\`0\\\` 表示隐式文本类型(IMPLICIT_TEXT)。
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
## RichText 格式
|
|
301
|
+
|
|
302
|
+
RemObject 中的 \\\`text\\\` 和 \\\`backText\\\` 字段使用 RichText 格式——一个 JSON 数组,每个元素为纯字符串或带 \\\`i\\\` 字段的格式化对象。
|
|
303
|
+
|
|
304
|
+
### 元素类型
|
|
305
|
+
|
|
306
|
+
| \\\`i\\\` 值 | 含义 | 核心字段 |
|
|
307
|
+
|--------|------|----------|
|
|
308
|
+
| (纯 string) | 纯文本片段 | — |
|
|
309
|
+
| \\\`"m"\\\` | 带格式文本 | \\\`text\\\` + 格式标记 |
|
|
310
|
+
| \\\`"q"\\\` | Rem 引用 | \\\`_id\\\`(被引用 Rem ID) |
|
|
311
|
+
| \\\`"i"\\\` | 图片 | \\\`url\\\`, \\\`width\\\`, \\\`height\\\` |
|
|
312
|
+
| \\\`"x"\\\` | LaTeX | \\\`text\\\` |
|
|
313
|
+
| \\\`"a"\\\` | 音频 | \\\`url\\\` |
|
|
314
|
+
|
|
315
|
+
### 行内格式标记(\\\`i:"m"\\\` 元素内)
|
|
316
|
+
|
|
317
|
+
| 字段 | 类型 | 含义 |
|
|
318
|
+
|------|------|------|
|
|
319
|
+
| \\\`b\\\` | \\\`true\\\` | 加粗 |
|
|
320
|
+
| \\\`l\\\` | \\\`true\\\` | 斜体 |
|
|
321
|
+
| \\\`u\\\` | \\\`true\\\` | 下划线 |
|
|
322
|
+
| \\\`h\\\` | \\\`number\\\` | 高亮颜色(1=红, 2=橙, 3=黄, 4=绿, 5=蓝, 6=紫) |
|
|
323
|
+
| \\\`tc\\\` | \\\`number\\\` | 文字颜色 |
|
|
324
|
+
| \\\`code\\\` | \\\`true\\\` | 行内代码 |
|
|
325
|
+
| \\\`cId\\\` | \\\`string\\\` | 完形填空 ID |
|
|
326
|
+
| \\\`iUrl\\\` | \\\`string\\\` | 外部链接 URL |
|
|
327
|
+
|
|
328
|
+
### 序列化确定性
|
|
329
|
+
|
|
330
|
+
RichText 对象元素内部按 **key 字母序排列**(Plugin 端 \\\`sortRichTextKeys()\\\` 处理),确保同一内容的序列化 JSON 始终一致。这对 \\\`edit_rem\\\` 的 str_replace 和乐观并发检测至关重要。
|
|
331
|
+
`;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const SEPARATOR_FLASHCARD_CONTENT = "\n# Separator & Flashcard Reference\n\n\u7528\u6237\u5728 RemNote \u4E2D\u8F93\u5165\u7684\u5206\u9694\u7B26\u51B3\u5B9A\u4E86 Rem \u7684 type\u3001backText \u548C\u9ED8\u8BA4 practiceDirection\u3002\u7406\u89E3\u5206\u9694\u7B26\u662F\u7406\u89E3\u7528\u6237\u521B\u5EFA\u95EA\u5361\u610F\u56FE\u7684\u5173\u952E\u3002\n\n---\n\n## \u5206\u9694\u7B26\u5B8C\u6574\u6620\u5C04\u8868\n\n| \u5206\u9694\u7B26 | \u7528\u6237\u8F93\u5165\u793A\u4F8B | type | backText | \u9ED8\u8BA4 practiceDirection | \u7528\u9014 |\n|:-------|:-------------|:-----|:---------|:-----------------------|:-----|\n| \uFF08\u65E0\uFF09 | \\`\u666E\u901A\u6587\u672C\\` | \\`default\\` | \\`null\\` | \u2014 | \u65E0\u95EA\u5361\u884C\u4E3A |\n| \\`::\\` | \\`\u6982\u5FF5 :: \u5B9A\u4E49\\` | \\`concept\\` | \u540E\u534A\u90E8\u5206 | \\`both\\` | \u6982\u5FF5\u5B9A\u4E49\uFF08CDF \u6846\u67B6\uFF09 |\n| \\`;;\\` | \\`\u5C5E\u6027 ;; \u503C\\` | \\`descriptor\\` | \u540E\u534A\u90E8\u5206 | \\`forward\\` | \u63CF\u8FF0\u5C5E\u6027\uFF08CDF \u6846\u67B6\uFF09 |\n| \\`>>\\` | \\`\u95EE\u9898 >> \u7B54\u6848\\` | \\`default\\` | \u540E\u534A\u90E8\u5206 | \\`forward\\` | \u6B63\u5411\u95EE\u7B54 |\n| \\`<<\\` | \\`\u95EE\u9898 << \u7B54\u6848\\` | \\`default\\` | \u540E\u534A\u90E8\u5206 | \\`backward\\` | \u53CD\u5411\u95EE\u7B54 |\n| \\`<>\\` | \\`\u95EE\u9898 <> \u7B54\u6848\\` | \\`default\\` | \u540E\u534A\u90E8\u5206 | \\`both\\` | \u53CC\u5411\u95EE\u7B54 |\n| \\`>>>\\` | \\`\u95EE\u9898 >>>\\` | \\`default\\` | \\`null\\` | \\`forward\\` | \u591A\u884C\u7B54\u6848\uFF08\u5B50 Rem \u4E3A\u7B54\u6848\uFF09 |\n| \\`::>\\` | \\`\u6982\u5FF5 ::>\\` | \\`concept\\` | \\`null\\` | \\`both\\` | \u6982\u5FF5\u578B\u591A\u884C\u7B54\u6848 |\n| \\`;;>\\` | \\`\u5C5E\u6027 ;;>\\` | \\`descriptor\\` | \\`null\\` | \\`forward\\` | \u63CF\u8FF0\u578B\u591A\u884C\u7B54\u6848 |\n| \\`{{}}\\` | \\`The {{capital}} of France is Paris\\` | \\`default\\` | \\`null\\` | \\`forward\\` | \u5B8C\u5F62\u586B\u7A7A\uFF08Cloze\uFF09 |\n\n---\n\n## \u5927\u7EB2\u4E2D\u7684\u7BAD\u5934\u5206\u9694\u7B26\n\n\u5728 Markdown \u5927\u7EB2\uFF08read_tree / edit_tree\uFF09\u4E2D\uFF0C\u5206\u9694\u7B26\u88AB\u7F16\u7801\u4E3A Unicode \u7BAD\u5934\uFF1A\n\n### \u5355\u884C\u7BAD\u5934\uFF08\u6709 backText\uFF09\n\n| \u7BAD\u5934 | \u542B\u4E49 | practiceDirection | \u5BF9\u5E94\u5206\u9694\u7B26 |\n|:-----|:-----|:------------------|:-----------|\n| \\` \u2192 \\` | \u6B63\u5411 | \\`forward\\` | \\`>>\\` / \\`;;\\` |\n| \\` \u2190 \\` | \u53CD\u5411 | \\`backward\\` | \\`<<\\` |\n| \\` \u2194 \\` | \u53CC\u5411 | \\`both\\` | \\`<>\\` / \\`::\\` |\n\n### \u591A\u884C\u7BAD\u5934\uFF08\u5B50 Rem \u4E3A\u7B54\u6848\uFF09\n\n| \u7BAD\u5934 | \u542B\u4E49 | practiceDirection | \u5BF9\u5E94\u5206\u9694\u7B26 |\n|:-----|:-----|:------------------|:-----------|\n| \\` \u2193\\` | \u6B63\u5411\u591A\u884C | \\`forward\\` | \\`>>>\\` / \\`;;>\\` |\n| \\` \u2191\\` | \u53CD\u5411\u591A\u884C | \\`backward\\` | \u2014 |\n| \\` \u2195\\` | \u53CC\u5411\u591A\u884C | \\`both\\` | \\`::>\\` |\n\n**\u6CE8\u610F**\uFF1A\u7BAD\u5934\u7F16\u7801\u7684\u662F \\`practiceDirection\\`\uFF0C\u4E0D\u7F16\u7801 \\`type\\`\u3002type \u7531\u5143\u6570\u636E\u6807\u8BB0 \\`type:concept\\` / \\`type:descriptor\\` \u627F\u8F7D\u3002\n\n---\n\n## practiceDirection \u53D6\u503C\n\n| \u503C | \u542B\u4E49 | \u95EA\u5361\u751F\u6210 |\n|:---|:-----|:---------|\n| \\`forward\\` | \u6B63\u5411\uFF1A\u770B text \u56DE\u5FC6 backText | \u751F\u6210\u6B63\u5411\u5361 |\n| \\`backward\\` | \u53CD\u5411\uFF1A\u770B backText \u56DE\u5FC6 text | \u751F\u6210\u53CD\u5411\u5361 |\n| \\`both\\` | \u53CC\u5411\uFF1A\u6B63\u53CD\u4E24\u4E2A\u65B9\u5411\u90FD\u7EC3\u4E60 | \u751F\u6210\u6B63\u5411+\u53CD\u5411\u4E24\u5F20\u5361 |\n| \\`none\\` | \u4E0D\u751F\u6210\u95EA\u5361 | \u4E0D\u751F\u6210\u5361 |\n\n---\n\n## CDF\uFF08Concept-Descriptor Framework\uFF09\n\nRemNote \u63A8\u8350\u7684\u77E5\u8BC6\u7ED3\u6784\u5316\u65B9\u6CD5\uFF1A\n\n- **Concept**\uFF08\\`::\\`\uFF09\uFF1A\u9700\u8981\u7406\u89E3\u7684\u6838\u5FC3\u6982\u5FF5\u2014\u2014\"X \u662F\u4EC0\u4E48\uFF1F\"\n- **Descriptor**\uFF08\\`;;\\`\uFF09\uFF1A\u6982\u5FF5\u7684\u5C5E\u6027/\u63CF\u8FF0\u2014\u2014\"X \u7684 Y \u662F\u4EC0\u4E48\uFF1F\"\n\n\u5178\u578B\u7ED3\u6784\uFF1A\n\n\\`\\`\\`\n\u7EBF\u6027\u56DE\u5F52 :: \u6700\u57FA\u672C\u7684\u56DE\u5F52\u6A21\u578B \u2190 Concept (type:concept, both)\n \u5047\u8BBE ;; \u56E0\u53D8\u91CF\u4E0E\u81EA\u53D8\u91CF\u5448\u7EBF\u6027\u5173\u7CFB \u2190 Descriptor (type:descriptor, forward)\n \u635F\u5931\u51FD\u6570 ;; \u5747\u65B9\u8BEF\u5DEE (MSE) \u2190 Descriptor (type:descriptor, forward)\n\\`\\`\\`\n\n---\n\n## \u901A\u8FC7 CLI \u521B\u5EFA\u95EA\u5361\n\n### \u4F7F\u7528 edit_tree \u65B0\u589E\u884C\n\n\u901A\u8FC7\u7BAD\u5934\u5206\u9694\u7B26\u521B\u5EFA\uFF1A\n\n| \u8981\u521B\u5EFA\u7684\u95EA\u5361\u7C7B\u578B | edit_tree \u65B0\u589E\u884C\u683C\u5F0F | \u989D\u5916\u6B65\u9AA4 |\n|:-----------------|:--------------------|:---------|\n| \u6B63\u5411\u95EE\u7B54 | \\`\u95EE\u9898 \u2192 \u7B54\u6848\\` | \u2014 |\n| \u53CD\u5411\u95EE\u7B54 | \\`\u95EE\u9898 \u2190 \u7B54\u6848\\` | \u2014 |\n| \u53CC\u5411\u95EE\u7B54 | \\`\u95EE\u9898 \u2194 \u7B54\u6848\\` | \u2014 |\n| \u6982\u5FF5\u5B9A\u4E49 | \\`\u6982\u5FF5 \u2194 \u5B9A\u4E49\\` | \u7528 edit_rem \u5C06 type \u6539\u4E3A \\`concept\\` |\n| \u63CF\u8FF0\u5C5E\u6027 | \\`\u5C5E\u6027 \u2192 \u503C\\` | \u7528 edit_rem \u5C06 type \u6539\u4E3A \\`descriptor\\` |\n| \u591A\u884C\u6B63\u5411 | \\`\u95EE\u9898 \u2193\\`\uFF08\u5B50\u884C\u4E3A\u7B54\u6848\uFF09 | \u2014 |\n| \u591A\u884C\u53CC\u5411 | \\`\u95EE\u9898 \u2195\\`\uFF08\u5B50\u884C\u4E3A\u7B54\u6848\uFF09 | \u2014 |\n\n### \u4F7F\u7528 edit_rem \u4FEE\u6539\u73B0\u6709\u95EA\u5361\n\n\u4FEE\u6539\u95EA\u5361\u884C\u4E3A\u7684\u76F8\u5173\u5B57\u6BB5\uFF1A\n\n| \u5B57\u6BB5 | \u4F5C\u7528 | \u793A\u4F8B |\n|:-----|:-----|:-----|\n| \\`type\\` | \u6539\u53D8\u7C7B\u578B\u8BED\u4E49 | \\`\"default\"\\` \u2192 \\`\"concept\"\\` |\n| \\`backText\\` | \u8BBE\u7F6E/\u4FEE\u6539/\u6E05\u9664\u80CC\u9762 | \\`null\\` \u2192 \\`[\"\u7B54\u6848\u6587\u672C\"]\\` |\n| \\`practiceDirection\\` | \u6539\u53D8\u7EC3\u4E60\u65B9\u5411 | \\`\"forward\"\\` \u2192 \\`\"both\"\\` |\n| \\`enablePractice\\` | \u542F\u7528/\u7981\u7528\u95F4\u9694\u91CD\u590D | \\`false\\` \u2192 \\`true\\` |\n| \\`isCardItem\\` | \u6807\u8BB0\u4E3A\u591A\u884C\u7B54\u6848\u884C | \\`false\\` \u2192 \\`true\\` |\n\n---\n\n## \u5B8C\u5F62\u586B\u7A7A\uFF08Cloze\uFF09\n\n\u5B8C\u5F62\u586B\u7A7A\u901A\u8FC7 RichText \u4E2D\u7684 \\`cId\\` \u6807\u8BB0\u5B9E\u73B0\uFF1A\n\n\\`\\`\\`json\n[\n \"The \",\n { \"i\": \"m\", \"cId\": \"cloze1\", \"text\": \"capital\" },\n \" of France is Paris\"\n]\n\\`\\`\\`\n\n\\`cId\\` \u662F\u5B8C\u5F62\u586B\u7A7A\u6807\u8BB0\u2014\u2014\u88AB\u6807\u8BB0\u7684\u6587\u672C\u5728\u7EC3\u4E60\u65F6\u4F1A\u88AB\u906E\u76D6\u3002\u901A\u8FC7 edit_rem \u64CD\u4F5C RichText \u6765\u521B\u5EFA/\u4FEE\u6539\u5B8C\u5F62\u586B\u7A7A\u3002\n";
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
export const SEPARATOR_FLASHCARD_CONTENT = `
|
|
2
|
+
# Separator & Flashcard Reference
|
|
3
|
+
|
|
4
|
+
用户在 RemNote 中输入的分隔符决定了 Rem 的 type、backText 和默认 practiceDirection。理解分隔符是理解用户创建闪卡意图的关键。
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 分隔符完整映射表
|
|
9
|
+
|
|
10
|
+
| 分隔符 | 用户输入示例 | type | backText | 默认 practiceDirection | 用途 |
|
|
11
|
+
|:-------|:-------------|:-----|:---------|:-----------------------|:-----|
|
|
12
|
+
| (无) | \\\`普通文本\\\` | \\\`default\\\` | \\\`null\\\` | — | 无闪卡行为 |
|
|
13
|
+
| \\\`::\\\` | \\\`概念 :: 定义\\\` | \\\`concept\\\` | 后半部分 | \\\`both\\\` | 概念定义(CDF 框架) |
|
|
14
|
+
| \\\`;;\\\` | \\\`属性 ;; 值\\\` | \\\`descriptor\\\` | 后半部分 | \\\`forward\\\` | 描述属性(CDF 框架) |
|
|
15
|
+
| \\\`>>\\\` | \\\`问题 >> 答案\\\` | \\\`default\\\` | 后半部分 | \\\`forward\\\` | 正向问答 |
|
|
16
|
+
| \\\`<<\\\` | \\\`问题 << 答案\\\` | \\\`default\\\` | 后半部分 | \\\`backward\\\` | 反向问答 |
|
|
17
|
+
| \\\`<>\\\` | \\\`问题 <> 答案\\\` | \\\`default\\\` | 后半部分 | \\\`both\\\` | 双向问答 |
|
|
18
|
+
| \\\`>>>\\\` | \\\`问题 >>>\\\` | \\\`default\\\` | \\\`null\\\` | \\\`forward\\\` | 多行答案(子 Rem 为答案) |
|
|
19
|
+
| \\\`::>\\\` | \\\`概念 ::>\\\` | \\\`concept\\\` | \\\`null\\\` | \\\`both\\\` | 概念型多行答案 |
|
|
20
|
+
| \\\`;;>\\\` | \\\`属性 ;;>\\\` | \\\`descriptor\\\` | \\\`null\\\` | \\\`forward\\\` | 描述型多行答案 |
|
|
21
|
+
| \\\`{{}}\\\` | \\\`The {{capital}} of France is Paris\\\` | \\\`default\\\` | \\\`null\\\` | \\\`forward\\\` | 完形填空(Cloze) |
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 大纲中的箭头分隔符
|
|
26
|
+
|
|
27
|
+
在 Markdown 大纲(read_tree / edit_tree)中,分隔符被编码为 Unicode 箭头:
|
|
28
|
+
|
|
29
|
+
### 单行箭头(有 backText)
|
|
30
|
+
|
|
31
|
+
| 箭头 | 含义 | practiceDirection | 对应分隔符 |
|
|
32
|
+
|:-----|:-----|:------------------|:-----------|
|
|
33
|
+
| \\\` → \\\` | 正向 | \\\`forward\\\` | \\\`>>\\\` / \\\`;;\\\` |
|
|
34
|
+
| \\\` ← \\\` | 反向 | \\\`backward\\\` | \\\`<<\\\` |
|
|
35
|
+
| \\\` ↔ \\\` | 双向 | \\\`both\\\` | \\\`<>\\\` / \\\`::\\\` |
|
|
36
|
+
|
|
37
|
+
### 多行箭头(子 Rem 为答案)
|
|
38
|
+
|
|
39
|
+
| 箭头 | 含义 | practiceDirection | 对应分隔符 |
|
|
40
|
+
|:-----|:-----|:------------------|:-----------|
|
|
41
|
+
| \\\` ↓\\\` | 正向多行 | \\\`forward\\\` | \\\`>>>\\\` / \\\`;;>\\\` |
|
|
42
|
+
| \\\` ↑\\\` | 反向多行 | \\\`backward\\\` | — |
|
|
43
|
+
| \\\` ↕\\\` | 双向多行 | \\\`both\\\` | \\\`::>\\\` |
|
|
44
|
+
|
|
45
|
+
**注意**:箭头编码的是 \\\`practiceDirection\\\`,不编码 \\\`type\\\`。type 由元数据标记 \\\`type:concept\\\` / \\\`type:descriptor\\\` 承载。
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## practiceDirection 取值
|
|
50
|
+
|
|
51
|
+
| 值 | 含义 | 闪卡生成 |
|
|
52
|
+
|:---|:-----|:---------|
|
|
53
|
+
| \\\`forward\\\` | 正向:看 text 回忆 backText | 生成正向卡 |
|
|
54
|
+
| \\\`backward\\\` | 反向:看 backText 回忆 text | 生成反向卡 |
|
|
55
|
+
| \\\`both\\\` | 双向:正反两个方向都练习 | 生成正向+反向两张卡 |
|
|
56
|
+
| \\\`none\\\` | 不生成闪卡 | 不生成卡 |
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## CDF(Concept-Descriptor Framework)
|
|
61
|
+
|
|
62
|
+
RemNote 推荐的知识结构化方法:
|
|
63
|
+
|
|
64
|
+
- **Concept**(\\\`::\\\`):需要理解的核心概念——"X 是什么?"
|
|
65
|
+
- **Descriptor**(\\\`;;\\\`):概念的属性/描述——"X 的 Y 是什么?"
|
|
66
|
+
|
|
67
|
+
典型结构:
|
|
68
|
+
|
|
69
|
+
\\\`\\\`\\\`
|
|
70
|
+
线性回归 :: 最基本的回归模型 ← Concept (type:concept, both)
|
|
71
|
+
假设 ;; 因变量与自变量呈线性关系 ← Descriptor (type:descriptor, forward)
|
|
72
|
+
损失函数 ;; 均方误差 (MSE) ← Descriptor (type:descriptor, forward)
|
|
73
|
+
\\\`\\\`\\\`
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## 通过 CLI 创建闪卡
|
|
78
|
+
|
|
79
|
+
### 使用 edit_tree 新增行
|
|
80
|
+
|
|
81
|
+
通过箭头分隔符创建:
|
|
82
|
+
|
|
83
|
+
| 要创建的闪卡类型 | edit_tree 新增行格式 | 额外步骤 |
|
|
84
|
+
|:-----------------|:--------------------|:---------|
|
|
85
|
+
| 正向问答 | \\\`问题 → 答案\\\` | — |
|
|
86
|
+
| 反向问答 | \\\`问题 ← 答案\\\` | — |
|
|
87
|
+
| 双向问答 | \\\`问题 ↔ 答案\\\` | — |
|
|
88
|
+
| 概念定义 | \\\`概念 ↔ 定义\\\` | 用 edit_rem 将 type 改为 \\\`concept\\\` |
|
|
89
|
+
| 描述属性 | \\\`属性 → 值\\\` | 用 edit_rem 将 type 改为 \\\`descriptor\\\` |
|
|
90
|
+
| 多行正向 | \\\`问题 ↓\\\`(子行为答案) | — |
|
|
91
|
+
| 多行双向 | \\\`问题 ↕\\\`(子行为答案) | — |
|
|
92
|
+
|
|
93
|
+
### 使用 edit_rem 修改现有闪卡
|
|
94
|
+
|
|
95
|
+
修改闪卡行为的相关字段:
|
|
96
|
+
|
|
97
|
+
| 字段 | 作用 | 示例 |
|
|
98
|
+
|:-----|:-----|:-----|
|
|
99
|
+
| \\\`type\\\` | 改变类型语义 | \\\`"default"\\\` → \\\`"concept"\\\` |
|
|
100
|
+
| \\\`backText\\\` | 设置/修改/清除背面 | \\\`null\\\` → \\\`["答案文本"]\\\` |
|
|
101
|
+
| \\\`practiceDirection\\\` | 改变练习方向 | \\\`"forward"\\\` → \\\`"both"\\\` |
|
|
102
|
+
| \\\`enablePractice\\\` | 启用/禁用间隔重复 | \\\`false\\\` → \\\`true\\\` |
|
|
103
|
+
| \\\`isCardItem\\\` | 标记为多行答案行 | \\\`false\\\` → \\\`true\\\` |
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## 完形填空(Cloze)
|
|
108
|
+
|
|
109
|
+
完形填空通过 RichText 中的 \\\`cId\\\` 标记实现:
|
|
110
|
+
|
|
111
|
+
\\\`\\\`\\\`json
|
|
112
|
+
[
|
|
113
|
+
"The ",
|
|
114
|
+
{ "i": "m", "cId": "cloze1", "text": "capital" },
|
|
115
|
+
" of France is Paris"
|
|
116
|
+
]
|
|
117
|
+
\\\`\\\`\\\`
|
|
118
|
+
|
|
119
|
+
\\\`cId\\\` 是完形填空标记——被标记的文本在练习时会被遮盖。通过 edit_rem 操作 RichText 来创建/修改完形填空。
|
|
120
|
+
`;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 编辑类工具:edit_rem、edit_tree
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { callCli } from '../daemon-client.js';
|
|
6
|
+
export function registerEditTools(server) {
|
|
7
|
+
// -------------------------------------------------------------------------
|
|
8
|
+
// edit_rem
|
|
9
|
+
// -------------------------------------------------------------------------
|
|
10
|
+
server.addTool({
|
|
11
|
+
name: 'edit_rem',
|
|
12
|
+
description: '通过 str_replace 语义修改单个 Rem 的属性字段。\n\n操作对象是 Rem 序列化后的 JSON 文本(JSON.stringify 2 空格缩进),\n在其中将 oldStr 精确替换为 newStr,自动推导变更字段并写入。\n\n适用场景:修改文本、类型、标题级别、practiceDirection、高亮色、Todo 状态等属性;\n修改分隔符以改变闪卡类型。不适合修改子树结构(用 edit_tree)。\n\n前置条件:必须先 read_rem 建立缓存,否则被防线拒绝。\n工作流:read_rem → 查看 JSON → edit_rem 替换。\n\n三道防线:缓存存在 → 并发检测 → 精确匹配(恰好 1 次)。\nstr_replace 要点:oldStr 建议包含字段名避免歧义(如 "text": "旧值")。替换后须是合法 JSON。\n关联工具:read_rem(前置)、edit_tree(结构编辑)',
|
|
13
|
+
parameters: z.object({
|
|
14
|
+
remId: z.string().describe('目标 Rem 的 ID'),
|
|
15
|
+
oldStr: z.string().describe('要替换的原始文本(必须精确匹配缓存中的内容,且恰好匹配 1 次)'),
|
|
16
|
+
newStr: z.string().describe('替换后的新文本'),
|
|
17
|
+
}),
|
|
18
|
+
execute: async (args) => {
|
|
19
|
+
const response = await callCli('edit-rem', {
|
|
20
|
+
remId: args.remId,
|
|
21
|
+
oldStr: args.oldStr,
|
|
22
|
+
newStr: args.newStr,
|
|
23
|
+
});
|
|
24
|
+
return JSON.stringify(response, null, 2);
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
// -------------------------------------------------------------------------
|
|
28
|
+
// edit_tree
|
|
29
|
+
// -------------------------------------------------------------------------
|
|
30
|
+
server.addTool({
|
|
31
|
+
name: 'edit_tree',
|
|
32
|
+
description: '通过 str_replace 对 Markdown 大纲进行结构编辑(行级增/删/移/重排)。\n\n操作对象是 read_tree 返回的 Markdown 大纲文本,将 oldStr 替换为 newStr,\n自动解析差异并执行结构操作。\n\n适用场景:新增子节点、删除节点、移动节点、重排顺序。\n不适合修改行内容(用 edit_rem)。\n\n前置条件:必须先 read_tree 建立缓存,否则被防线拒绝。\n工作流:read_tree → 查看大纲 → edit_tree 替换。\n\n关键禁止:\n- 禁止修改已有行的文本内容(报 content_modified)\n- 禁止删除有隐藏子节点(children:N)的行\n- 禁止删除父节点但保留子节点\n\n新行支持 Markdown 前缀(# ## ### - [ ] 等)和箭头分隔符(→ ← ↔ ↓ ↑ ↕)。\n缩进决定父子关系(每级 2 空格)。\n详细操作指南见 resource://edit-tree-guide。\n关联工具:read_tree(前置)、edit_rem(内容修改)',
|
|
33
|
+
parameters: z.object({
|
|
34
|
+
remId: z.string().describe('根 Rem 的 ID(与 read_tree 时相同)'),
|
|
35
|
+
oldStr: z.string().describe('要替换的大纲片段(必须精确匹配缓存中的内容,且恰好匹配 1 次)'),
|
|
36
|
+
newStr: z.string().describe('替换后的大纲片段(可新增/删除/移动/重排行,但禁止修改已有行内容)'),
|
|
37
|
+
}),
|
|
38
|
+
execute: async (args) => {
|
|
39
|
+
const response = await callCli('edit-tree', {
|
|
40
|
+
remId: args.remId,
|
|
41
|
+
oldStr: args.oldStr,
|
|
42
|
+
newStr: args.newStr,
|
|
43
|
+
});
|
|
44
|
+
return JSON.stringify(response, null, 2);
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
}
|