@fgbg/mdocs 0.8.9 → 0.8.12

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 (107) hide show
  1. package/agent-skills/changelog/SKILL.md +298 -0
  2. package/agent-skills/core-concepts-all-files/SKILL.md +53 -0
  3. package/agent-skills/core-concepts-domain/SKILL.md +106 -0
  4. package/agent-skills/core-concepts-invitation/SKILL.md +61 -0
  5. package/agent-skills/core-concepts-no-account/SKILL.md +84 -0
  6. package/agent-skills/deployment-config/SKILL.md +47 -0
  7. package/agent-skills/deployment-requirements/SKILL.md +50 -0
  8. package/agent-skills/deployment-reverse-proxy/SKILL.md +71 -0
  9. package/agent-skills/faq/SKILL.md +48 -0
  10. package/agent-skills/getting-started-first-kb/SKILL.md +40 -0
  11. package/agent-skills/getting-started-installation/SKILL.md +119 -0
  12. package/agent-skills/index/SKILL.md +52 -0
  13. package/agent-skills/index.json +191 -0
  14. package/agent-skills/usage-agent-dev-loop/SKILL.md +179 -0
  15. package/agent-skills/usage-bookmarks/SKILL.md +97 -0
  16. package/agent-skills/usage-cli-token/SKILL.md +132 -0
  17. package/agent-skills/usage-comments/SKILL.md +149 -0
  18. package/agent-skills/usage-domain-members/SKILL.md +102 -0
  19. package/agent-skills/usage-drafts/SKILL.md +123 -0
  20. package/agent-skills/usage-flowchart/SKILL.md +108 -0
  21. package/agent-skills/usage-markdown/SKILL.md +130 -0
  22. package/agent-skills/usage-merge-conflicts/SKILL.md +42 -0
  23. package/agent-skills/usage-my-documents/SKILL.md +108 -0
  24. package/agent-skills/usage-onboarding-ai/SKILL.md +65 -0
  25. package/agent-skills/usage-recovery-code/SKILL.md +87 -0
  26. package/agent-skills/usage-search/SKILL.md +34 -0
  27. package/agent-skills/usage-settings/SKILL.md +95 -0
  28. package/agent-skills/why-mdocs/SKILL.md +13 -0
  29. package/dist/server/agent/Agent/run.js +222 -0
  30. package/dist/server/agent/Agent/run.js.map +1 -0
  31. package/dist/server/agent/Agent/session-manager.js +147 -0
  32. package/dist/server/agent/Agent/session-manager.js.map +1 -0
  33. package/dist/server/agent/Agent/system-prompt.js +13 -0
  34. package/dist/server/agent/Agent/system-prompt.js.map +1 -0
  35. package/dist/server/agent/Agent/tools.js +37 -0
  36. package/dist/server/agent/Agent/tools.js.map +1 -0
  37. package/dist/server/agent/Config/config.js +113 -0
  38. package/dist/server/agent/Config/config.js.map +1 -0
  39. package/dist/server/agent/Skill/skill-loader.js +46 -0
  40. package/dist/server/agent/Skill/skill-loader.js.map +1 -0
  41. package/dist/server/app.js +2 -0
  42. package/dist/server/app.js.map +1 -1
  43. package/dist/server/db/repositories/agent-model-config.repo.js +17 -0
  44. package/dist/server/db/repositories/agent-model-config.repo.js.map +1 -0
  45. package/dist/server/db/schema.js +10 -0
  46. package/dist/server/db/schema.js.map +1 -1
  47. package/dist/server/routes/agent.routes.js +135 -0
  48. package/dist/server/routes/agent.routes.js.map +1 -0
  49. package/dist/web/assets/{MergeView-CTeS5Pgb.js → MergeView-Da6W6Mwd.js} +1 -1
  50. package/dist/web/assets/{_baseUniq-BEyyLo4a.js → _baseUniq-DIXaUG3P.js} +1 -1
  51. package/dist/web/assets/{arc-DRyJIB49.js → arc-BdrqKgEt.js} +1 -1
  52. package/dist/web/assets/{architectureDiagram-Q4EWVU46-C6FcFqys.js → architectureDiagram-Q4EWVU46-C7DbabmE.js} +1 -1
  53. package/dist/web/assets/{blockDiagram-DXYQGD6D-C5DamiPe.js → blockDiagram-DXYQGD6D-xpzHPtBf.js} +1 -1
  54. package/dist/web/assets/{c4Diagram-AHTNJAMY-BQf9874A.js → c4Diagram-AHTNJAMY-C55XB-0p.js} +1 -1
  55. package/dist/web/assets/channel-R2F1bwis.js +1 -0
  56. package/dist/web/assets/{chunk-4BX2VUAB-CvLXGWM9.js → chunk-4BX2VUAB-Cw9cGcvA.js} +1 -1
  57. package/dist/web/assets/{chunk-4TB4RGXK-C2B5cSFk.js → chunk-4TB4RGXK-Bb7TaNsp.js} +1 -1
  58. package/dist/web/assets/{chunk-55IACEB6-C-va7Y5a.js → chunk-55IACEB6-ClfU0bTR.js} +1 -1
  59. package/dist/web/assets/{chunk-EDXVE4YY-NG3zjl2t.js → chunk-EDXVE4YY-DEYQg7so.js} +1 -1
  60. package/dist/web/assets/{chunk-FMBD7UC4-A2P0ciLw.js → chunk-FMBD7UC4-l0uxylnu.js} +1 -1
  61. package/dist/web/assets/{chunk-OYMX7WX6-Cto0U3kG.js → chunk-OYMX7WX6-CTuAfYj2.js} +1 -1
  62. package/dist/web/assets/{chunk-QZHKN3VN-DNdWRP-4.js → chunk-QZHKN3VN-Cd5BdpCj.js} +1 -1
  63. package/dist/web/assets/{chunk-YZCP3GAM-B7BWetQd.js → chunk-YZCP3GAM-C4AFz6HK.js} +1 -1
  64. package/dist/web/assets/classDiagram-6PBFFD2Q-D8Aoi_kK.js +1 -0
  65. package/dist/web/assets/classDiagram-v2-HSJHXN6E-D8Aoi_kK.js +1 -0
  66. package/dist/web/assets/clone-D3UTWyOI.js +1 -0
  67. package/dist/web/assets/{cose-bilkent-S5V4N54A-DAp6XOTI.js → cose-bilkent-S5V4N54A-DPbGSIxQ.js} +1 -1
  68. package/dist/web/assets/{dagre-KV5264BT-bXw64vAF.js → dagre-KV5264BT-BAqCvioS.js} +1 -1
  69. package/dist/web/assets/{diagram-5BDNPKRD-BZyIxgPb.js → diagram-5BDNPKRD-BVhjoylL.js} +1 -1
  70. package/dist/web/assets/{diagram-G4DWMVQ6-B7DIbmE6.js → diagram-G4DWMVQ6-BgdBEUo2.js} +1 -1
  71. package/dist/web/assets/{diagram-MMDJMWI5-CYIS8pup.js → diagram-MMDJMWI5-v3XiVR4L.js} +1 -1
  72. package/dist/web/assets/{diagram-TYMM5635-iVE2rLmi.js → diagram-TYMM5635-Bnlc4JL7.js} +1 -1
  73. package/dist/web/assets/{erDiagram-SMLLAGMA-TYkyJdZq.js → erDiagram-SMLLAGMA-DZNfy5XO.js} +1 -1
  74. package/dist/web/assets/{flowDiagram-DWJPFMVM-DCq4RRIH.js → flowDiagram-DWJPFMVM-CyNHaoXD.js} +1 -1
  75. package/dist/web/assets/{ganttDiagram-T4ZO3ILL-BwOIx_Vs.js → ganttDiagram-T4ZO3ILL-D9XKVK6L.js} +1 -1
  76. package/dist/web/assets/{gitGraphDiagram-UUTBAWPF-CS9cfxUA.js → gitGraphDiagram-UUTBAWPF-BsoJR5By.js} +1 -1
  77. package/dist/web/assets/{graph-K8x8ab-D.js → graph-C6hZEMMA.js} +1 -1
  78. package/dist/web/assets/{index-DRsX6c0H.js → index-BiYwrQhS.js} +1220 -1186
  79. package/dist/web/assets/index-C4tGH1XB.css +1 -0
  80. package/dist/web/assets/{infoDiagram-42DDH7IO-DFs9J8cW.js → infoDiagram-42DDH7IO-EsbSvvwg.js} +1 -1
  81. package/dist/web/assets/{ishikawaDiagram-UXIWVN3A-ChYUj0ld.js → ishikawaDiagram-UXIWVN3A-opc9PUAq.js} +1 -1
  82. package/dist/web/assets/{journeyDiagram-VCZTEJTY-CysvVjkr.js → journeyDiagram-VCZTEJTY-CGoqXdQp.js} +1 -1
  83. package/dist/web/assets/{kanban-definition-6JOO6SKY-DlGvCOou.js → kanban-definition-6JOO6SKY-BsMSOTEO.js} +1 -1
  84. package/dist/web/assets/{layout-DDk1jHzS.js → layout-dka4PN3u.js} +1 -1
  85. package/dist/web/assets/{linear-CCo9IeHT.js → linear-C7358dWt.js} +1 -1
  86. package/dist/web/assets/{min-BTxfBtS6.js → min-CkhEOvqb.js} +1 -1
  87. package/dist/web/assets/{mindmap-definition-QFDTVHPH-D2Y8ZrN3.js → mindmap-definition-QFDTVHPH-Cw5Uw5sO.js} +1 -1
  88. package/dist/web/assets/{pieDiagram-DEJITSTG-DuaVu740.js → pieDiagram-DEJITSTG-D_2NhEs9.js} +1 -1
  89. package/dist/web/assets/{quadrantDiagram-34T5L4WZ-D9P6tcbK.js → quadrantDiagram-34T5L4WZ-CCoI5QqP.js} +1 -1
  90. package/dist/web/assets/{requirementDiagram-MS252O5E-B8v3RtvO.js → requirementDiagram-MS252O5E-DlRuHrpI.js} +1 -1
  91. package/dist/web/assets/{sankeyDiagram-XADWPNL6-CJIIvTEv.js → sankeyDiagram-XADWPNL6-CqeHUQiU.js} +1 -1
  92. package/dist/web/assets/{sequenceDiagram-FGHM5R23-WgQSy-Eh.js → sequenceDiagram-FGHM5R23-bAgSxA1M.js} +1 -1
  93. package/dist/web/assets/{stateDiagram-FHFEXIEX-Bg9XaNxo.js → stateDiagram-FHFEXIEX-BY710eMg.js} +1 -1
  94. package/dist/web/assets/stateDiagram-v2-QKLJ7IA2-BQw6J9EK.js +1 -0
  95. package/dist/web/assets/{timeline-definition-GMOUNBTQ-2h7ZeLc6.js → timeline-definition-GMOUNBTQ-Dm1cJJzA.js} +1 -1
  96. package/dist/web/assets/{vennDiagram-DHZGUBPP-Ab3_6Oe9.js → vennDiagram-DHZGUBPP-x15pVuxW.js} +1 -1
  97. package/dist/web/assets/{wardley-RL74JXVD-DVPCK5Ky.js → wardley-RL74JXVD-Baa2vTyp.js} +1 -1
  98. package/dist/web/assets/{wardleyDiagram-NUSXRM2D-rM9jo8v5.js → wardleyDiagram-NUSXRM2D-DD4pCNVv.js} +1 -1
  99. package/dist/web/assets/{xychartDiagram-5P7HB3ND-BnxoasRp.js → xychartDiagram-5P7HB3ND-Cj82t7kB.js} +1 -1
  100. package/dist/web/index.html +2 -2
  101. package/package.json +7 -1
  102. package/dist/web/assets/channel-CiCXcXC3.js +0 -1
  103. package/dist/web/assets/classDiagram-6PBFFD2Q-DLatDrXa.js +0 -1
  104. package/dist/web/assets/classDiagram-v2-HSJHXN6E-DLatDrXa.js +0 -1
  105. package/dist/web/assets/clone-CSlMEjIx.js +0 -1
  106. package/dist/web/assets/index-BUN3YDVd.css +0 -1
  107. package/dist/web/assets/stateDiagram-v2-QKLJ7IA2-BZf_Cq1t.js +0 -1
@@ -0,0 +1,123 @@
1
+ ---
2
+ id: usage-drafts
3
+ name: "草稿与同步"
4
+ description: "编辑环境中存在一个天然矛盾:用户希望内容「随时保存,永不丢失」,但网络可能不稳定,服务器可能暂时不可用。mdocs 用**本地优先 + 按需发布**的草稿机制来解决这个问题。"
5
+ keywords: []
6
+ source: usage/drafts.md
7
+ ---
8
+
9
+ # 草稿与同步
10
+
11
+ ## 设计意图
12
+
13
+ 编辑环境中存在一个天然矛盾:用户希望内容「随时保存,永不丢失」,但网络可能不稳定,服务器可能暂时不可用。mdocs 用**本地优先 + 按需发布**的草稿机制来解决这个问题。
14
+
15
+ ## 架构
16
+
17
+ ```
18
+ 用户编辑
19
+
20
+
21
+ Lexical 编辑器(富文本)
22
+
23
+ ├── 自动保存(1000ms 防抖)──────────────────┐
24
+ │ │ │
25
+ │ ▼ │
26
+ │ IndexedDB(浏览器本地数据库) │
27
+ │ 存储:正文 + 开编 commit(localBaseCommitId)│
28
+ │ │
29
+ ├── 自动发布(空闲 30 秒后)───────────────────┤
30
+ │ │ (每 10 秒扫描一次) │
31
+ │ ▼ │
32
+ │ 后端 API(更新正文 + 提交图) │
33
+ │ │
34
+ ├── 手动「发布」──────────────────────────────┤
35
+ │ │
36
+ └── 失焦 / 切换标签页 ────────────────────────┘
37
+ 立即保存当前内容
38
+ ```
39
+
40
+ ## 本地数据分工(v0.7.9+)
41
+
42
+ | 数据 | 作用 |
43
+ |------|------|
44
+ | **IndexedDB 草稿** | 未发布正文、标题、开编时的 `localBaseCommitId` |
45
+ | **activeDocMeta**(内存) | 当前打开这篇的**服务端元信息**(权限、路径、owner、当前 head 等),供界面共用;**不含正文** |
46
+ | **编辑器** | 显示与编辑正文;有草稿时以草稿为准,无草稿时以服务器 GET 为准 |
47
+
48
+ 打开文档时:**一定会请求服务器**更新 meta;正文则 **有草稿读草稿、无草稿读服务器**,二者互斥,不会把两套正文混在一个对象里。
49
+
50
+ ## 三层保存策略
51
+
52
+ | 触发时机 | 保存目标 | 说明 |
53
+ |---------|---------|------|
54
+ | 编辑后 1 秒无操作 | IndexedDB | 防抖,避免频繁写入 |
55
+ | 编辑器失焦(blur) | IndexedDB | 切换到其他元素时立即保存 |
56
+ | 标签页隐藏(visibilitychange) | IndexedDB | 用户切走或关闭标签时保底 |
57
+
58
+ 补充说明:
59
+
60
+ - **首次编辑**时才创建草稿(不是打开文档就创建)。
61
+ - 首次落盘会记录 **`localBaseCommitId`**(开编时服务端 head)。
62
+ - 后续自动保存只更新正文和标题,**不**重置开编基准。
63
+
64
+ ## 发布流程
65
+
66
+ ### 设置里的开关
67
+
68
+ 打开 **设置 → 保存与发布**:
69
+
70
+ ![设置 → 保存与发布](./drafts/save-publish-settings.png)
71
+
72
+ | 项 | 说明 |
73
+ |----|------|
74
+ | **自动保存(本地快照)** | 内容持续写入浏览器本地快照,避免编辑丢失(界面展示为始终可用) |
75
+ | **自动同步至云端** | 空闲后把草稿推到服务器;网络不稳或多端冲突时可能暂停同步以保护数据 |
76
+ | **查看未发布草稿** | 列出尚未成功发布到服务端的本地草稿,可点进对应文档继续编辑或手动发布 |
77
+
78
+ ### 自动发布(可选)
79
+
80
+ 在设置中开启「自动同步至云端」后:
81
+
82
+ - **每 10 秒**扫描 IndexedDB;
83
+ - 某篇草稿 **超过 30 秒** 没有新的自动保存 → 尝试发布。
84
+
85
+ ### 手动发布
86
+
87
+ 1. 点击「发布」
88
+ 2. 编辑器内容序列化后 `PUT` 到服务器(带开编 commit 做版本校验)
89
+ 3. **成功后**:删除本地草稿 → 再 GET 拉取最新 meta;正文与刚发布内容一致时**不重载编辑器 DOM**(避免视口跳动),仅在服务端正文不一致时才整棵刷新编辑器
90
+
91
+ ### 无草稿也能发布
92
+
93
+ 若打开后尚未触发自动保存(尚无 IndexedDB 草稿),仍可直接发布:内容以编辑器为准,版本号以当前 meta 中的 head 为准。
94
+
95
+ ## 发布失败
96
+
97
+ 无论自动还是手动,失败时草稿一般仍保留在本地。
98
+
99
+ | 情况 | 行为 |
100
+ |------|------|
101
+ | **任意自动发布失败**(v0.8.5+) | 草稿标记 `publishError`,**停止自动重试**;设置页「未发布草稿」显示失败原因;手动点「发布」会先清除标记再重试 |
102
+ | **缺少版本基准** | 多见于旧版创建的目录描述(`___desc___.md`);升级到 **0.8.5+** 并重启服务后重新打开该目录可恢复;或删除本地草稿 |
103
+ | **自动发布 404** | 服务端文档已删、本地仍有草稿;可 **另存为新文档** |
104
+ | **409 版本冲突** | 进入 [版本冲突与合并](./merge-conflicts.md) 流程 |
105
+
106
+ 重新打开文档且服务端已有 `headCommitId` 时,会自动补写草稿的 `localBaseCommitId` 并清除「缺版本基准」类失败标记。
107
+
108
+ ## 断网场景
109
+
110
+ - **断网时**:继续编辑,草稿在 IndexedDB
111
+ - **重新打开**:有草稿则恢复草稿正文;meta 仍会从服务器 GET(需联网)
112
+
113
+ ## 拉取更新(Pull)
114
+
115
+ - **无未发布草稿**:可拉取远端最新正文与 meta。
116
+ - **有未发布草稿**:不覆盖式 pull,避免误盖本地副本。
117
+
118
+ ## 设计取舍
119
+
120
+ - **本地优先**:编辑不依赖网络;恢复后自动或手动发布
121
+ - **发布后强制对齐**:删草稿 + GET,减少「单用户自动发布后又冲突」的困惑
122
+ - **IndexedDB**:容量大、异步,不阻塞 UI
123
+
@@ -0,0 +1,108 @@
1
+ ---
2
+ id: usage-flowchart
3
+ name: "流程图生成"
4
+ description: "mdocs 的流程图基于 **Meta2d** 绘图引擎,设计目标是让用户像使用 Visio 或 draw.io 一样拖拽绘制,同时将图表数据嵌入文档内容。"
5
+ keywords: []
6
+ source: usage/flowchart.md
7
+ ---
8
+
9
+ # 流程图生成
10
+
11
+ ## 设计思路
12
+
13
+ mdocs 的流程图基于 **Meta2d** 绘图引擎,设计目标是让用户像使用 Visio 或 draw.io 一样拖拽绘制,同时将图表数据嵌入文档内容。
14
+
15
+ ## 插入方式
16
+
17
+ ### 斜杠菜单(推荐)
18
+
19
+ 不必手写 Markdown / 围栏语法。在编辑器中:
20
+
21
+ 1. 新起一行(或光标在段落里)输入 `/`
22
+ 2. 选择 **Meta2d**,或继续输入 `meta2d` 过滤后回车
23
+ 3. 插入后会打开 Meta2d 画布,拖拽绘制即可
24
+
25
+ ![输入 / 打开菜单并选择 Meta2d](./markdown/slash-menu.png)
26
+
27
+ 完整菜单项说明见 [编辑体验 · 斜杠菜单](./markdown.md#斜杠菜单推荐快捷入口)。
28
+
29
+ ### 其他方式(可选)
30
+
31
+ 仍支持在新行输入围栏后回车打开画布(适合熟悉旧习惯的用户):
32
+
33
+ ```
34
+ ---meta2d---
35
+ ```
36
+
37
+ 日常插入请优先用 `/`。
38
+
39
+ ## 数据格式
40
+
41
+ 图表在文档中以内嵌块保存(存储形态,**插入时不必手写**):
42
+
43
+ ```
44
+ ---meta2d---
45
+ { "pens": [ … ] }
46
+ ---/meta2d---
47
+ ```
48
+
49
+ 编辑器渲染时:
50
+ - 识别到该块 → 调用 canvas2svg 渲染为 SVG 预览
51
+ - 双击块 → 打开 Meta2d 画布编辑器,可拖拽编辑
52
+ - 保存 → 将 JSON 写回文档内容
53
+
54
+ ## 编辑器界面
55
+
56
+ ![](./flowchart/flowchart.png)
57
+
58
+ ## 支持的图形
59
+
60
+ 矩形、圆角矩形、圆形、菱形、三角形、五边形、文本、线条、数据节点、数据库、文档、显示、手动输入、并行、注释、子流程、队列、内部/外部存储等。
61
+
62
+ ## 设计取舍
63
+
64
+ - **为什么用 Meta2d 而非 Mermaid**:Mermaid 适合由文本生成图表,但交互式编辑体验不够直观。Meta2d 提供了拖拽式 GUI 编辑器,更接近白板体验
65
+ - **数据内嵌在文档内容中**:图表以 JSON 格式内嵌在文档内容里,随文档一起存储,复制、备份都很方便
66
+
67
+ ## Markmap 思维导图
68
+
69
+ ### 使用方式
70
+
71
+ #### 斜杠菜单(推荐)
72
+
73
+ 输入 `/` → 选 **Markmap**(或过滤 `markmap`)插入,无需先背代码块语法。
74
+
75
+ #### 代码块(可选)
76
+
77
+ 也可手写 `markmap` 围栏,用 Markdown 标题层级描述树:
78
+
79
+ ````markdown
80
+ ```markmap
81
+ # 根节点
82
+ ## 分支 1
83
+ ### 子节点 1.1
84
+ ### 子节点 1.2
85
+ ## 分支 2
86
+ ```
87
+ ````
88
+
89
+ ### 特性
90
+
91
+ - **Markdown 语法**:使用标准 Markdown 标题层级(`#`)定义树形结构
92
+ - **实时渲染**:编辑 Markdown 时下方实时预览思维导图
93
+ - **交互一致**:与 Mermaid 代码块交互方式完全相同
94
+ - 点击内部显示源码编辑器
95
+ - 点击外部隐藏源码,只显示思维导图
96
+ - 点击图表进入全屏预览模式
97
+ - **全屏预览**:支持缩放、拖拽,查看复杂导图更方便
98
+ - **错误提示**:Markdown 语法有误时显示红色错误框
99
+
100
+ ### 与 Mermaid 的区别
101
+
102
+ | 特性 | Markmap | Mermaid |
103
+ |------|----------|---------|
104
+ | 语法 | Markdown 标题层级 | Mermaid 专有语法 |
105
+ | 用途 | 思维导图、知识树 | 流程图、时序图、类图等 |
106
+ | 交互 | 点击折叠/展开节点 | 静态渲染 |
107
+ | 适合场景 | 头脑风暴、知识梳理 | 技术架构、业务流程 |
108
+
@@ -0,0 +1,130 @@
1
+ ---
2
+ id: usage-markdown
3
+ name: "编辑体验"
4
+ description: "mdocs 的编辑器基于 Lexical(Meta 开源的富文本引擎),配合 `@lobehub/editor` 插件体系。核心思路是:**用富文本编辑,以 JSON 存储**。"
5
+ keywords: []
6
+ source: usage/markdown.md
7
+ ---
8
+
9
+ # 编辑体验
10
+
11
+ ## 设计思路
12
+
13
+ mdocs 的编辑器基于 Lexical(Meta 开源的富文本引擎),配合 `@lobehub/editor` 插件体系。核心思路是:**用富文本编辑,以 JSON 存储**。
14
+
15
+ ```
16
+ 编辑时
17
+ 用户操作 → Lexical JSON(保留全部格式信息)
18
+ 自动保存 → IndexedDB(Lexical JSON)
19
+
20
+ 发布时
21
+ 内容写入 → 文件系统(Lexical JSON 文件)
22
+ ```
23
+
24
+ 这意味着:
25
+
26
+ - 编辑时享受完整的富文本体验(标题、加粗、表格、代码块等)
27
+ - 文档以 Lexical JSON 格式持久化,保留全部语义信息,重新打开时精确恢复
28
+ - 由于是自有格式,文档**只能由 mdocs 加载**(未来会提供导出 Markdown 功能)
29
+
30
+ ## Markdown 导入
31
+
32
+ mdocs 支持直接粘贴或通过 API 传入 Markdown 文本,后端会自动转换为 Lexical JSON 存储。
33
+
34
+ ### 粘贴 Markdown
35
+
36
+ 在编辑器中直接粘贴(`Ctrl+V`)Markdown 文本,内容会按富文本格式渲染,保留标题、粗体、列表、表格、代码块等结构。
37
+
38
+ ### API / CLI 传入 Markdown
39
+
40
+ 通过 API 或命令行客户端创建/更新文档时,传入的 Markdown 内容会自动转换:
41
+
42
+ ```bash
43
+ # CLI 创建文档,直接传 Markdown
44
+ node ~/.mdocs-cli/mdocs.mjs create \
45
+ --name "笔记.md" \
46
+ --content "# 标题\n\n这是**粗体**和*斜体*"
47
+ ```
48
+
49
+ 转换能力包括:
50
+ - 标题 h1-h6、段落、换行
51
+ - 粗体/斜体/删除线/行内代码/超链接
52
+ - 有序/无序列表(支持嵌套)
53
+ - 代码块(保留语言标识)
54
+ - 引用块、分隔线
55
+ - 表格(含表头、合并单元格)
56
+
57
+ ## 编辑器功能
58
+
59
+ 编辑时有两条常用入口:**顶部工具栏**(点选)和 **斜杠菜单**(键盘快速插入)。多数插入项两边都能找到。
60
+
61
+ ### 斜杠菜单(推荐快捷入口)
62
+
63
+ 在编辑器**空行或段落中**输入 `/`,弹出可搜索的插入菜单;继续打关键字(如 `table`、`meta2d`)可过滤,回车或点击插入。
64
+
65
+ ![输入 / 打开斜杠菜单](./markdown/slash-menu.png)
66
+
67
+ 常见项(右侧为过滤关键字,以当前版本界面为准):
68
+
69
+ | 菜单项 | 关键字示例 | 作用 |
70
+ |--------|------------|------|
71
+ | Heading 3 | `h3` | 三级标题 |
72
+ | Hr | `hr` | 水平分割线 |
73
+ | Table | `table` | 表格 |
74
+ | TeX | `tex` | 数学公式 |
75
+ | File | `file` | 上传并插入附件 |
76
+ | Insert Link | `insert-link` | 超链接 |
77
+ | Inline Code | `insert-codeInline` | 行内代码 |
78
+ | Code Block | `insert-codeBlock` | 代码块(语法高亮) |
79
+ | Meta2d | `meta2d` | 流程图画布,详见 [流程图生成](./flowchart.md) |
80
+ | Markmap | `markmap` | 思维导图,详见 [流程图生成 · Markmap](./flowchart.md#markmap-思维导图) |
81
+
82
+ 插入 Meta2d 后一般会自动打开画布。日常请用 `/` 插入;围栏写法仅作可选兼容,见 [流程图生成](./flowchart.md)。
83
+
84
+ ### 富文本工具栏
85
+
86
+ 编辑器顶部工具栏覆盖格式与插入(与斜杠菜单互补):
87
+
88
+ - **撤销 / 重做**
89
+ - **文档首尾插行**:在全文最上方或最后一行之后插入空段落
90
+ - **标题**:H1 ~ H3
91
+ - **文本格式**:加粗、斜体、下划线、删除线、字色 / 高亮
92
+ - **列表与引用**:无序 / 有序 / 待办、引用
93
+ - **插入**:链接、图片、表格、代码、TeX、附件等
94
+ - **大纲**:可一键展开 / 折叠右侧大纲面板
95
+
96
+ 适合鼠标点选改格式;批量插入块级内容时优先用 `/`。
97
+
98
+ ### 大纲面板
99
+
100
+ 编辑器右侧自动提取文档标题层级,生成可点击的导航大纲,方便在长文档中快速跳转。
101
+
102
+ ![](./markdown/outline.png)
103
+
104
+ ### 文档信息菜单
105
+
106
+ 编辑器工具栏右侧提供文档信息入口(三条线图标),点击可查看:
107
+
108
+ **元信息区**
109
+ - **创建者**:显示访客昵称,未设置昵称时显示 visitorId 前 8 位
110
+ - **创建时间**:文档创建的本地化日期格式
111
+ - **大小**:文件体积(KB/MB 自动适配)
112
+ - **上次编辑**:最后修改的本地化时间
113
+
114
+ **操作区**
115
+ - **收藏/取消收藏**:一键切换当前文档的收藏状态
116
+ - **修改文章权限**:后续版本开放完整的权限修改对话框
117
+
118
+ > 💡 点击菜单外部区域可自动关闭下拉菜单。收藏按钮 hover 时有缩放动画效果。
119
+
120
+ ### 流程图
121
+
122
+ 支持 **Meta2d** 流程图。优先在编辑器输入 `/`,选 **Meta2d** 插入并打开画布;不必手写围栏语法。
123
+
124
+ 详见 [流程图生成](./flowchart.md)。
125
+
126
+ ## 设计取舍
127
+
128
+ - **选择 Lexical 而非 Prosemirror/Slate**:Lexical 对 React 生态更友好,插件系统清晰,且 `@lobehub/editor` 提供了开箱即用的工具栏和斜杠菜单。只需在lobehub项目基础上进行额外开发,避免重复造轮子
129
+ - **JSON 存储**:保留完整的富文本结构,重新打开时精确还原编辑状态。代价是数据不能直接用文本编辑器阅读——未来会提供 Markdown 导出
130
+
@@ -0,0 +1,42 @@
1
+ ---
2
+ id: usage-merge-conflicts
3
+ name: "版本冲突与合并"
4
+ description: "当发布时服务端 head 已前进(例如他端编辑、或本机自动发布后又改稿),`PUT` 可能返回 **409 版本冲突**。mdocs 会引导你进入 **合并** 界面,而不是直接覆盖远端。"
5
+ keywords: []
6
+ source: usage/merge-conflicts.md
7
+ ---
8
+
9
+ # 版本冲突与合并
10
+
11
+ 当发布时服务端 head 已前进(例如他端编辑、或本机自动发布后又改稿),`PUT` 可能返回 **409 版本冲突**。mdocs 会引导你进入 **合并** 界面,而不是直接覆盖远端。
12
+
13
+ ## 三栏分别是什么
14
+
15
+ | 位置 | 含义 |
16
+ |------|------|
17
+ | **左(本地)** | 发生冲突时,你本地草稿的正文快照(冻结,不是已提交的 commit 节点) |
18
+ | **右(远端)** | 打开合并时,服务器上当前这篇的正文 |
19
+ | **中(结果)** | 基于共同祖先做的行级对比;每个差异块需点选「采用本地 / 远端 / 保留双方」等,全部处理完才能发布 |
20
+
21
+ 共同祖先正文由服务端根据提交图计算(`merge-context` API),用于判断「相对祖先,哪边改了什么」。
22
+
23
+ ## 与草稿、发布的关系
24
+
25
+ - 平时编辑:正文在 **IndexedDB 草稿**;元信息(权限、路径等)在内存中的 **activeDocMeta**(来自 GET)。
26
+ - **发布成功**(手动或自动):删除本地草稿 → 再拉取服务器最新内容 → 编辑器与 meta 对齐,避免「自己跟自己冲突」的误报。
27
+ - **有未发布草稿时**:不会用后台轮询去提示「落后」,以免和本地副本语义打架;以本地草稿为准,通过 **发布 / 合并** 与服务器对齐。
28
+
29
+ ## 自动发布与冲突
30
+
31
+ 开启「自动同步至云端」后:
32
+
33
+ - 每 **10 秒** 扫描一次本地草稿;
34
+ - 某篇草稿 **超过 30 秒** 没有新的自动保存,才会尝试自动发布。
35
+
36
+ 若自动发布已成功而本地仍显示冲突,多为旧版本行为;请升级到最新版并重新发布一次。
37
+
38
+ ## 相关阅读
39
+
40
+ - [草稿与同步](./drafts.md)
41
+ - [设置](./settings.md) — 开启自动同步、管理未发布草稿
42
+
@@ -0,0 +1,108 @@
1
+ ---
2
+ id: usage-my-documents
3
+ name: "我的文章"
4
+ description: "「我的文章」功能聚合展示你创建的所有文档,集中管理跨域内容,并提供快捷的文档操作入口。"
5
+ keywords: []
6
+ source: usage/my-documents.md
7
+ ---
8
+
9
+ # 我的文章
10
+
11
+ ## 功能概述
12
+
13
+ 「我的文章」功能聚合展示你创建的所有文档,集中管理跨域内容,并提供快捷的文档操作入口。
14
+
15
+ ## 查看我的文章
16
+
17
+ ### 入口:设置页面
18
+
19
+ 1. 点击左侧边栏**底部的访客信息区**(头像 + 昵称)进入 [设置页面](./settings.md)
20
+ 2. 在左侧导航中点击 **我的文章**
21
+
22
+ ![设置 → 我的文章](./my-documents/settings-list.png)
23
+
24
+ 列表以表格形式展示:
25
+
26
+ | 列名 | 说明 |
27
+ |-----|------|
28
+ | 标题 | 文档显示名称 |
29
+ | 域 | 文档所在的域 |
30
+ | 更新时间 | 文档最后编辑日期 |
31
+ | 创建时间 | 文档创建日期 |
32
+ | 邀请成员 | 快捷管理文档邀请(仅自己创建的文档可见) |
33
+ | 打开 | 跳转打开文档 |
34
+
35
+ ### 搜索筛选
36
+
37
+ 在列表顶部搜索框输入关键词,可按以下维度筛选:
38
+
39
+ - 文档标题/文件名
40
+ - 域名
41
+
42
+ 搜索支持中英文,无需区分大小写。
43
+
44
+ ---
45
+
46
+ ## 文档邀请管理
47
+
48
+ ### 邀请成员
49
+
50
+ 在「我的文章」列表中,点击任意文档右侧的 **邀请成员** 按钮:
51
+
52
+ 1. 在弹出的访客选择器中,左侧勾选要邀请的成员
53
+ 2. 在右侧已选列表中,为每个成员设置权限:
54
+ - **只读**:只能查看文档内容,不能编辑
55
+ - **可编辑**:可以查看和编辑文档内容
56
+ 3. 点击右下角 **确认** 完成邀请
57
+
58
+ ### 修改或移除邀请
59
+
60
+ 再次点击同一文档的「邀请成员」按钮:
61
+
62
+ - **修改权限**:在右侧已选列表中重新选择权限
63
+ - **移除邀请**:点击成员右侧的 ✕ 按钮取消勾选,确认后即移除邀请
64
+
65
+ ### 权限生效范围
66
+
67
+ 文档邀请是**文档级别**的权限叠加:
68
+
69
+ - 即使访客不是域成员,只要被邀请即可访问该文档
70
+ - 邀请权限独立于域权限,两者同时满足时取较高权限
71
+ - 文档所有者始终拥有完全权限,不受邀请机制影响
72
+
73
+ ---
74
+
75
+ ## 使用场景
76
+
77
+ ### 场景 1:快速找到自己创建的文档
78
+
79
+ 当你在多个域中都有创建的文档时,不需要逐个域切换查找。直接打开「我的文章」即可看到所有内容。
80
+
81
+ ### 场景 2:批量管理文档邀请
82
+
83
+ 需要给多篇文档配置相同的访客名单时,可以在「我的文章」中逐篇操作,无需逐个打开文档。
84
+
85
+ ### 场景 3:追溯文档历史
86
+
87
+ 通过「创建时间」和「更新时间」两列,可以快速了解自己的编辑历史和最近活跃的文档。
88
+
89
+ ---
90
+
91
+ ## 常见问题
92
+
93
+ ### 为什么有些文档不显示「邀请成员」按钮?
94
+
95
+ 只有**你作为创建者**的文档才会显示该按钮。被你邀请编辑的文档、你有域权限编辑的文档等都不显示此按钮。
96
+
97
+ ### 被邀请的成员能看到这篇文档在哪里吗?
98
+
99
+ 可以。被邀请者的「我的收藏」和「最近文档」中会出现这篇文档,他们也可以通过搜索找到。
100
+
101
+ ### 如何查看谁被邀请了?
102
+
103
+ 点击「邀请成员」按钮,右侧已选列表即为当前被邀请的成员及其权限。
104
+
105
+ ### 邀请后可以取消吗?
106
+
107
+ 可以。再次打开邀请弹窗,点击成员右侧的 ✕ 取消勾选,确认后该成员即失去对该文档的访问权限。
108
+
@@ -0,0 +1,65 @@
1
+ ---
2
+ id: usage-onboarding-ai
3
+ name: "上手助手(AI)"
4
+ description: "mdocs 内置了一个**产品上手向导**,只解答「怎么用 mdocs」(域、草稿、发布、权限等),**不会**帮你写正文或改文档。"
5
+ keywords: []
6
+ source: usage/onboarding-ai.md
7
+ ---
8
+
9
+ # 上手助手(AI)
10
+
11
+ mdocs 内置了一个**产品上手向导**,只解答「怎么用 mdocs」(域、草稿、发布、权限等),**不会**帮你写正文或改文档。
12
+
13
+ 若你要用 Cursor / Claude 等**外部 Agent** 读写知识库、落开发契约,见 [Agent 开发闭环](./agent-dev-loop.md)。
14
+
15
+ ## 入口
16
+
17
+ 左下角有圆形 **上手助手** 悬浮按钮(不占用正文区)。点击后打开浮层 **「mdocs 智能助手」**,主编辑区仍保持打开,可边问边写。可**按住拖动**入口到任意位置(本地记住);挪过之后会出现「重置位置」。
18
+
19
+ ![上手助手入口与聊天浮层](./onboarding-ai/entry.png)
20
+
21
+ 浮层内:
22
+
23
+ - 顶部:**+** 新建会话、历史列表、关闭
24
+ - 中间:对话与指引内容(可含步骤、表格等)
25
+ - 底部输入框:占位「把你的问题告诉我…」
26
+ - 页脚提示:内容由 AI 生成,仅供参考
27
+
28
+ ## 开始使用前:配置模型
29
+
30
+ 1. 打开 **设置 → AI**(侧栏底部访客信息进入设置)
31
+ 2. 选择模型:`deepseek-v4-flash` 或 `deepseek-v4-pro`
32
+ 3. 填写你的 DeepSeek API Key 并保存
33
+
34
+ ![设置 → AI:上手助手模型配置](./onboarding-ai/ai-settings.png)
35
+
36
+ 未配置 Key 时,入口可用但无法发送消息,浮层会提示去设置页配置。
37
+
38
+ 每人一份配置,仅本人可用;Key 在服务端按访客隔离存储,不会出现在别的访客界面上。配置页可查看配置名称、模型、脱敏后的 Key 与配置 ID;需要改时可点 **编辑**。
39
+
40
+ ## 怎么问
41
+
42
+ 可以直接问,例如:
43
+
44
+ - 如何发布文档?
45
+ - 草稿是什么?
46
+ - 如何创建域?
47
+ - 权限怎么设置?
48
+
49
+ 助手会按需阅读 [mdocs 用户手册](https://xuhuafeifei.github.io/mdocs-site/) 相关章节再回答,并在回复里展示「已阅读 N 个页面」与手册链接。答完后通常会附带一两个可继续追问的示例。
50
+
51
+ ## 会话
52
+
53
+ - 同一访客的对话会保存在数据目录 `tenant/<访客ID>/agent/session/` 下,刷新或重开浮层仍可续聊。
54
+ - 浮层标题栏 **「+」**:新建空会话并切换过去。
55
+ - **历史图标**:按最近更新列出会话;点击即可切换并回放该会话。
56
+ - 会话标题取自**第一条用户消息**(过长会截断),不是模型摘要。
57
+ - 删除、重命名、按天数自动清理尚未提供。
58
+
59
+ ## 明确不会做
60
+
61
+ - 代写、润色、按选区改文档
62
+ - 替你点击发布或改权限(只会告诉你怎么操作)
63
+
64
+ 若你要求写作,助手会拒绝并引导你在编辑器里自行操作。
65
+
@@ -0,0 +1,87 @@
1
+ ---
2
+ id: usage-recovery-code
3
+ name: "恢复码与身份找回"
4
+ description: "> **现状**:跨设备找回身份,优先用 **用户名 + 密码**。恢复码是早期「纯 Cookie 身份」时代的自助方案,现仍可用,但属于兼容能力,新用户不必依赖它。"
5
+ keywords: []
6
+ source: usage/recovery-code.md
7
+ ---
8
+
9
+ # 恢复码与身份找回
10
+
11
+ > **现状**:跨设备找回身份,优先用 **用户名 + 密码**。恢复码是早期「纯 Cookie 身份」时代的自助方案,现仍可用,但属于兼容能力,新用户不必依赖它。
12
+
13
+ ## 为什么会有恢复码
14
+
15
+ mdocs 初期刻意不做传统登录系统:不想要注册邮箱、账号密码那一套,希望打开就能写。
16
+
17
+ 底层做法是:浏览器里通过 **HttpOnly Cookie** 下发一串随机高熵令牌,服务端只存其哈希,用这份 Cookie 标识「你是谁」。没有单独的账号表登录流程。
18
+
19
+ 代价也很直接——**Cookie / 本机身份数据一旦丢了**(清站点数据、换浏览器、换设备),浏览器再也带不上原来的令牌,系统就认不出你还是以前那个人,文档所有权也接不上。
20
+
21
+ 恢复码就是为这个问题准备的:**一份由用户自己保存的一次性凭证**,在 Cookie 丢失后,仍能凭码换回同一访客身份和新的 Cookie。
22
+
23
+ ## 后来发生了什么
24
+
25
+ 后续迭代引入了 **登录密码**(访客名 + 密码,可多设备会话):
26
+
27
+ - 跨浏览器 / 跨设备:用密码登录即可,不必再找恢复码
28
+ - 注册时可设密码;设置页可管理「登录密码」
29
+ - 登录弹窗默认是「用户名 + 密码」;恢复码仍作为次要入口保留
30
+
31
+ 因此恢复码的核心场景被密码覆盖,**功能逐渐被边缘化**,保留是为了兼容早期只靠 Cookie、已发过恢复码的用户。
32
+
33
+ | 方式 | 适用 |
34
+ |------|------|
35
+ | **用户名 + 密码(推荐)** | 换设备、清 Cookie、日常跨端 |
36
+ | 恢复码 | 从未设密码、或只有早期恢复码可用的情况 |
37
+ | 管理员 `visitor migrate` | 以上都不可用时的运维兜底 |
38
+
39
+ ## 机制摘要(仍可用时)
40
+
41
+ 格式形如:
42
+
43
+ ```
44
+ ABCD-EFGH-IJKL-MNOP
45
+ ```
46
+
47
+ - 注册成功时可能弹出展示(**只此一次**);也可在设置页「通用 → 恢复码」重新生成(旧码立即失效)
48
+ - 服务端只存 SHA-256 哈希,不能再把明文码「查出来」给你看
49
+ - 在登录弹窗切到「恢复码」,输入后换发新的身份 Cookie;**验证成功后该码作废**(一次性)
50
+
51
+ ## 怎么用(兼容流程)
52
+
53
+ ### 生成 / 再生成
54
+
55
+ 1. 打开 **设置 → 通用 → 恢复码**
56
+ 2. 点击生成,**立刻复制保存**
57
+ 3. 再生成会使旧码失效
58
+
59
+ ### 用恢复码找回
60
+
61
+ 1. 无有效 Cookie 时打开站点,进入注册 / 登录弹窗
62
+ 2. 切到登录 → **恢复码**
63
+ 3. 输入保存的码 → 找回身份
64
+
65
+ ## 常见问题
66
+
67
+ ### 还需要保存恢复码吗?
68
+
69
+ 若已设置登录密码,**日常以密码为准**即可。恢复码可选:仅当你希望多一条不依赖密码的兜底时再保存。
70
+
71
+ ### 恢复码丢了怎么办?
72
+
73
+ - 仍能进当前浏览器会话:去设置页改/设密码,或再生成恢复码
74
+ - 已进不去:有密码就用密码登录;都没有则联系管理员做 `visitor migrate`
75
+
76
+ ### 恢复码和 Cookie 令牌有什么区别?
77
+
78
+ | | Cookie 身份令牌 | 恢复码 |
79
+ |--|-----------------|--------|
80
+ | 角色 | 日常请求鉴权(浏览器自动带) | Cookie 丢了之后的自助换发 |
81
+ | 存放 | HttpOnly Cookie | 用户自己抄走 |
82
+ | 推荐替代 | — | **登录密码**(跨设备主路径) |
83
+
84
+ ### 和「无账户」设计还一致吗?
85
+
86
+ 早期「无账户」指的是不做邮箱注册那套,用 Cookie 访客身份。现在的「访客名 + 可选密码」仍是轻量访客模型,不是完整的企业账号体系;密码解决的是 **同一访客跨端续上身份**,并不否定当初降低门槛的目标。身份模型细节见 [无账户身份识别](../core-concepts/no-account.md)。
87
+