# 9 [reference] SiYuan 参考边界与可借鉴能力 v1

> 更新时间：2026-05-11
>
> 当前状态：`reference`。本文只保留思源参考边界与可借鉴能力，不覆盖 `CURRENT_ARCHITECTURE.md` / `1-8` 当前口径，也不作为当前执行 checklist。
>
> 上位依据：
> - `/mnt/Data1T/mnote/ARCHITECTURE.md`
> - `/mnt/Data1T/mnote/design/01-05-current-priority-overview.md`
> - `/mnt/Data1T/mnote/design/01-tree-first-graph-kernel/reference/1-tree-first-graph-kernel-v1.md`
> - `/mnt/Data1T/mnote/design/03-rust-web/reference/3-rust-web-long-term-architecture-v1.md`
> - `/mnt/Data1T/mnote/design/03-rust-web/process/3-3-rust-web-tree-realtime-event-stream-v1.md`
> - `/mnt/Data1T/mnote/design/05-editor-mainline/reference/5-5-page-aggregate-single-truth-alignment-v1.md`
> - `/mnt/Data1T/mnote/design/06-mindmap/reference/6-mindmap-kernel-phase6-projection-editor-v1.md`
>
> 外部参考：
> - `https://github.com/siyuan-note/siyuan`
> - `https://raw.githubusercontent.com/siyuan-note/siyuan/master/README_zh_CN.md`
> - `https://raw.githubusercontent.com/siyuan-note/siyuan/master/API_zh_CN.md`
>
> 本稿定位：
> - 本稿是 `mnote` 的参考与借鉴边界稿。
> - 本稿不是新的上位架构来源。
> - 本稿不覆盖 `01-05` 当前主线优先级。

## 1. 文档目的

这份稿只回答一个问题：

> **思源笔记对当前 `mnote` 主线，哪些地方值得参考，哪些地方不应照搬。**

当前结论固定为：

> **思源更适合作为产品能力与交互参考，不适合作为 `mnote` 长期架构模板。**

原因不是思源做得不成熟，而是两边长期目标不同：

- 思源更接近 `本地优先工作空间 + 块文档 + Go kernel + TS/Electron 产品壳`
- `mnote` 当前主线是 `tree-first graph kernel + Rust 持有语义 + Page Aggregate / Tree Realtime / Tree Command 收口`

因此，后续引用思源时必须先区分：

1. 是在参考产品层能力
2. 还是在引入架构层真相

只有第一类默认允许，第二类默认不允许。

---

## 2. 先给结论

### 2.1 思源值得参考的层级

思源当前最值得参考的是：

- 块级引用、双向链接、反链、图谱、大纲这一整套产品能力的配套闭环
- 属性 / 数据库视图的用户心智、操作颗粒度和投影形态
- 本地优先工作区的数据组织、导入导出、资源目录和恢复路径
- 大体量单机笔记产品的交互密度、功能面排布和“一个能力带一圈配套能力”的产品完成度
- 编辑器相关的局部交互细节，以及导图插件这一类挂件的集成方式

### 2.2 思源不应成为 `mnote` 的长期架构模板

思源当前不应被拿来直接替代或覆盖：

- `tree-first graph kernel`
- `Rust kernel` 的语义主导权
- `mnote-web` 作为 `3000` 主执行面
- `Page Aggregate` 作为页面域单一真相收口方向
- `tree.*` 正式命令面与 `tree events` realtime 主链

一句话收口：

> **思源可以提供“功能长什么样”的答案，但不能替代 `mnote` 对“系统真相由谁持有”的既定答案。**

---

## 3. 为什么会觉得像思源

用户会感觉当前实现和思源接近，并不是错觉，主要有下面这些原因：

- 都是块式文档体验，而不是传统线性文档页
- 都强调页面树、块引用、双向链接、嵌入、导图或挂件类能力
- 都不是纯 Markdown 文件列表产品，而是更接近“知识对象 + 多视图”的产品
- 都会同时出现页面、块、资源、搜索、反链、图谱、数据库视图这些能力面

但相似主要停留在产品表层，不等于底层事实源一致。

当前两边关键差异是：

- 思源偏 `workspace/data + .sy + API + 本地工作区`
- `mnote` 偏 `kernel truth + projection + command + realtime stream`

这条差异决定了：

> **参考思源时，应优先借它的产品形态，不要把它的数据真相层和 API 哲学直接搬进来。**

---

## 4. 思源当前可见的能力面

从公开仓库、README 和 API 可见，思源不是“只有一个块编辑器”，而是已经形成下面这些稳定能力面：

- 块：插入、更新、删除、移动、折叠、展开、块引用
- 属性：块属性读写
- SQL：查询与事务刷新
- 属性视图 / 数据库视图：表格、看板、画廊等
- 大纲、反链、图谱、搜索
- 工作空间、文件树、资源文件、模板、插件、代码片段
- 历史、同步、导出、剪藏、闪卡、OCR、AI、移动端与 Docker

这说明思源真正有参考价值的不是某个单点组件，而是：

> **当一个系统把“块”作为核心对象后，周边需要跟着长出来的整圈配套能力。**

---

## 5. 可直接借鉴的部分

## 5.1 块级引用不是单点功能，而是一整圈产品能力

思源把块级引用、双向链接、反链、搜索、图谱、大纲做成了互相咬合的一组能力。

对 `mnote` 的启发不是“做一个 `((block))` 就够了”，而是：

- 一旦有块引用，就应该有稳定的引用目标解析
- 一旦有引用目标解析，就应该有反链和搜索投影
- 一旦有反链和搜索投影，就应该考虑页面页头、阅读态、导图、AI 上下文如何共享这一组对象语义

这与当前 `mnote` 主线是相容的，因为这些都应该继续落到 Rust projection family，而不是前端各自维护一份块真相。

## 5.2 属性视图 / 数据库视图值得作为单独对象域评估

思源已经证明：

- 属性不是补充字段
- 数据库视图也不是“在文档里画个表格”就结束

它更接近：

- 对象属性定义
- 多视图投影
- 排序 / 分组 / 过滤 / relation / rollup 一组相关语义

对 `mnote` 的启发是：

> **如果后续做属性视图，不应只把它当成编辑器里的一个特殊块，而应评估它是否需要独立的 kernel object / projection / command family。**

这里可以借思源的产品心智，但不要直接借它的存储组织。

## 5.3 本地工作区组织与导入导出心智值得参考

思源 README 明确公开了工作空间 `data/` 下的目录组织，例如：

- `assets`
- `templates`
- `snippets`
- `plugins`
- `public`
- 文档与笔记本目录

这对 `mnote` 的参考价值主要在用户体验层：

- 本地导出时，哪些内容算“工作区资产”
- 用户如何理解模板、资源、插件与公开文件
- 发生故障时，用户该如何备份与迁移

这里适合作为：

- 本地文件夹体验
- 导入导出 UX
- 恢复与备份说明

的参考，不适合作为新的 canonical source。

## 5.4 导图与插件化挂件有参考意义

当前 `mnote` 已经在 `design/05-editor-mainline/reference-code/` 下保留了 `siyuan-kmind-plugin` 参考代码，这个方向是合理的。

对导图线的正确借法是：

- 参考思源插件 / KMind 的 UI、行为、挂件边界
- 参考其与文档块、引用预览、搜索、资源插入的交互方式
- 不复制它的思源宿主耦合

这与当前 `Phase 6` 已经明确的口径一致：

> **可以参考 KMind 的 UI 与行为，但不要复制它的思源插件耦合。**

## 5.5 “成熟单机笔记产品的密度”本身值得参考

思源的一个重要价值，不是某个 API，而是它已经证明：

- 用户愿意接受高密度功能面
- 页面 / 树 / 搜索 / 反链 / 数据库 / 插件 / 导出 / 历史可以共存
- 关键不在于功能少，而在于对象边界和入口是否清晰

这对 `mnote` 的启发是：

> **后续不需要因为主线在收口，就把能力面理解成必须长期极简；真正要避免的是语义散乱，而不是能力丰富。**

---

## 6. 不建议照搬的部分

## 6.1 不照搬 `.sy + 工作空间文件` 作为系统对象真相层

思源的数据组织很适合它自己的本地优先单机模型，但 `mnote` 当前已经明确：

- `tree-first graph kernel` 是长期对象语义真相层
- local-first workspace 与本地 `.md` 是早期产品默认数据面和正文真相
- Rust SQLite control-plane 承接鉴权、分享、同步、协作和 AI policy 默认控制面；`Convex` / 服务端仅保留历史迁移源、显式 cloud source、compat 和 sync replica 边界
- `mnote-web` 与 Rust kernel 持有主执行语义

因此后续不能照搬思源 `.sy` 对象格式，也不能把：

- 任意工作空间目录结构
- 导出文件形状
- 调试缓存

误提升为新的系统对象真相层。正确边界是：Markdown 文件持有正文真相，Rust kernel 持有树 / 资源 / 权限 / projection 语义，控制面只负责授权和同步边界。

## 6.2 不把 SQL 暴露成长期核心产品契约

思源公开提供 SQL 查询接口，这很适合本地单机高级用户，但对 `mnote` 有明显风险：

- 会绕开 `projection` 与 `command` 边界
- 会破坏页面域和树域单一真源收口
- 会让 AI、CLI、前端和脚本各自形成第二套数据读取口径

所以对 `mnote` 来说，正确借法是：

- 借“高级查询能力”这个需求
- 不借“把底层 SQL 直接暴露为长期主接口”这个做法

若未来需要高级查询，应优先考虑：

- kernel query family
- projection query endpoint
- 受控 DSL

而不是直接给业务面开放底层 SQL。

## 6.3 不把前端运行时做成第二语义中心

思源前端 `protyle` 与周边 TS runtime 很大，说明它有相当一部分产品组织与交互复杂度留在前端。

这对当前 `mnote` 不是该追的方向，因为你们当前最重要的事是：

- 继续收口 `Page Aggregate`
- 继续收口 `tree command`
- 继续收口 `tree realtime`

因此不应因为参考思源，就重新把：

- 标题语义
- 页面设置语义
- 引用解析语义
- 数据库视图真相

重新扩散到前端壳层或 compat 层。

## 6.4 不默认接受它的单用户 / 本地优先假设

思源大量设计天然偏：

- 单机优先
- 工作空间文件优先
- 用户直接接触本地数据目录

而 `mnote` 当前仍保留：

- Convex 历史迁移 / 显式 cloud source / compat / sync replica 边界
- realtime 协作链
- Rust Web `3000` 主入口

因此参考思源时必须先问：

> **这个能力是在单用户前提下成立，还是在当前 `mnote` 的协作 / realtime 前提下也能成立。**

只在前者成立的方案，默认不能直接进入主线。

---

## 7. 对 `mnote` 的建议落点

| 参考主题 | 是否建议借鉴 | 推荐落点 |
| --- | --- | --- |
| 块级引用 / 双向链接 / 反链 | 建议 | Rust query / projection family，统一到 page/tree 相关投影 |
| 属性视图 / 数据库视图 | 建议 | 先做对象域评估，再决定 command / projection 边界 |
| 图谱 / 大纲 / 搜索 | 建议 | 作为引用体系的配套视图，而不是孤立功能 |
| 工作区导出 / 资源目录 / 模板心智 | 建议 | 本地文件夹、导出导入、恢复与帮助文档 |
| 导图插件交互 | 建议 | 继续作为 `leptos-mindmap` 的参考行为层 |
| `.sy` 文档真相层 | 不建议 | 不进入 `mnote` 主线 |
| SQL 直接开放给产品层 | 不建议 | 改用 kernel query / projection / DSL |
| 前端重语义运行时 | 不建议 | 继续把长期语义收口到 Rust kernel |
| 单机假设下的 API 组织 | 谨慎 | 只借需求，不借真相层与执行面 |

---

## 8. 当前优先级下的使用方式

考虑到当前 `mnote` 的第一优先级仍然是：

1. `Page Aggregate`
2. `Tree Command Cutover`
3. `Tree Realtime Event Stream`

所以本稿的执行口径应固定为：

### 8.1 允许用思源来校准需求

例如：

- 块引用之后，用户预期还需要什么
- 反链页、图谱页、搜索页应该有哪些最小能力
- 属性视图第一版做成什么形态才不失真
- 导出与本地资源管理要不要显式工作区概念

### 8.2 不允许用思源来打断当前收口顺序

例如不能因为思源已有某个能力，就跳过：

- `Page Aggregate` 的主链闭环
- `tree.*` 命令统一
- `/api/tree/events` live cache 收口

否则会把参考稿误用成新的需求插队入口。

### 8.3 参考思源时优先写成“能力映射”，不要写成“照搬实现”

后续如果再新增思源相关设计稿，优先采用：

- “思源某能力对 `mnote` 的需求映射”
- “思源某交互对 `mnote` 的行为对照”

而不是：

- “把思源 API / 数据格式搬进来”
- “按思源目录结构重建 `mnote`”

---

## 9. 当前建议的后续拆分

如果后续继续使用思源作为参考，建议只沿下面几个方向继续出稿：

1. `块引用 / 反链 / 图谱 / 搜索` 的能力映射稿
2. `属性视图 / 数据库视图` 的对象域评估稿
3. `本地工作区 / 导入导出 / 资源目录` 的 UX 参考稿
4. `导图插件 / 挂件 / 引用预览` 的行为对照稿

不建议出的稿：

1. “按思源重写 `mnote` 数据层”
2. “引入思源式 SQL 主接口”
3. “以思源前端 runtime 替代当前 Rust 主线”

---

## 10. 一句话收口

当前 `mnote` 对思源的正确态度应固定为：

> **把思源当成成熟块知识产品的参考样本库，重点吸收它的能力面、交互完成度和配套闭环；但 `mnote` 的长期事实源、命令面、projection 与 realtime 主链，继续严格沿 `tree-first graph kernel` 推进。**
