协议——frontmatter 字段来源契约
上级:obsidian-sync-mechanism · 已对照
backend/internal/corpus/obsidian/import.go逐项核实(该包在 2026-07-29 从usecases/搬出,9f1ffcf13;2026-09-07 复核)
对每一个字段,都问两个问题:它的值到底从哪里来,以及谁会读它——Obsidian、StandMeet、两者都读,还是都不读。凡是来源比"你手动敲进去"更可信的字段(文件名、系统时间、正文本身、导入器),就不该出现在模板里。已逐字段对照 buildSaveInputFromVault(import.go:286)核实过——这是 writings 分支;wiki/subjectivity 分支解析的是自己那套更小的字段(corpFM,sync_note.go:15),有差异的行会逐行注明。
全景矩阵
✅ = 被使用/被读取 · ✕ = 没有原生行为——Obsidian 依然会存储并显示每一个属性(excerpt/status/……之所以会出现在属性选择器里,只是因为你自己的笔记用过它们,不是因为 Obsidian 会拿它们做什么)。
| 字段 | 来源 | Obsidian | StandMeet | 说明 |
|---|---|---|---|---|
publish | 你(这道闸门) | ✅ Obsidian Publish | ✅ 导入闸门(writings)· 可见性闸门(wiki/subjectivity) | writings:true → 导入;corp 笔记:一律落库,publish 只设 published,没写这个键就保留现值(F-L-8 / F-L-22);渲染为一个复选框 |
tags | 你 | ✅ 标签面板 / 搜索 | ✅ | 双方共用的原生键 |
excerpt | 你 | ✕ | ✅ | 摘要 |
cover_headline / cover_sub | 你 | ✕ | ✅ | 封面文案 |
cover_hue | 你 | ✕ | ✅ | amber(默认)/ violet / acid |
cover_image | 你 / 正文中的一张图片 | ✕ | ✅ | 会被解析为一个资源 |
visibility | 你 | ✕ | ✅ | public(默认)/ private |
locked_body | 特殊字段 | ✕ | ✅ | 不属于常规撰写流程 |
title | 文件名 | ✅ 文件名就是标题——与 Obsidian 一致 | ✅ 仅用于覆盖(pickTitle) | 只在需要覆盖显示名时才设置 |
slug | 文件名 | ✅ 文件名 = 笔记的身份标识——与 Obsidian 一致 | ✅ 读取 fm.slug,否则用文件名(pickSlug) | 不要手动设置;⚠️ 目前还没有折叠 folder-note 的逻辑 |
aliases | 你 | ✅ 备用名 / [[alias]] / 搜索 | ✕ writings:会被解析但被忽略 · ✅ wiki/subjectivity:存进 corpus_notes.aliases,用来解析 [[别名]] 链接(463411b48,2026-08-05) | corp 笔记两边共用的键 |
cssclasses | 你 | ✅ 逐笔记 CSS | ✕ writings · ✅ wiki/subjectivity:存为 css_classes,渲染时加到笔记容器上(f147b1e8f,2026-07-06) | corp 笔记两边共用的键 |
lang / lang-labels | 你 | ✕ | ✅ 仅 wiki/subjectivity:> [!lang] 笔记的身份语言 + 切换器上的字(corpus_notes.lang、lang_labels) | writings 分支不读 |
created | 系统 | ✕(文件系统时间是独立的) | ✕ 以数据库 created_at 为准 | 两边都不需要手动填写 |
cross_refs | 正文中的 [[links]] | ✕ | ✕ 硬编码为空 | 关系全部来自正文中的 wikilink |
path / parent_id | vault 路径 / 文件夹树 | (文件所在的位置) | ✅ 自动 | 不是一个 frontmatter 键 |
read_minutes | 根据正文计算 | ✕ | ✅ 计算得出 | 不是一个 frontmatter 键 |
published_at · obsidian_source_path · obsidian_imported_at · updated_at | 导入器 / 数据库 | ✕ | ✅ 自动 | 不是 frontmatter 键 |
Note
publish有意沿用 Obsidian 的原生键publish是 Obsidian 原生识别的属性键之一(也就是 Obsidian Publish 读取的那个)。所以 StandMeet 的导入闸门和 Obsidian 共用一个标志、一个含义——publish: true表示"公开这篇"——而不是另造一个自定义字段。带来的好处是:它在属性面板里会渲染为一个真正的复选框;而且如果你以后也用起 Obsidian Publish,同一个publish: true会同时触发两边(这是有意为之——两者都表示公开;只有当你想让二者分道扬镳时,才需要拆成两个键)。
两个违反直觉的陷阱
cross_refs什么也不做:你可能以为在 frontmatter 里列出相关文章就能建立关系——但导入器把它硬编码为空。关系只来自正文中的[[wikilinks]]。- 一个键,两个受众:
created/aliases对 StandMeet 的导入毫无用处,但aliases对 Obsidian 有用,而created已经由文件系统时间覆盖。两者都不需要手动填写。
精简版模板(也就是 standmeet-article 模板)
---
publish: false
excerpt:
tags: []
# add visibility / cover_hue / cover_headline / cover_sub when needed
---
title、slug、created、cross_refs、path 全部缺席——分别交给文件名、系统时间、正文中的 wikilink,以及导入器。