协议——frontmatter 字段来源契约

更新于 · 在 sijie.xyz 查看原条目 ↗

对每一个字段,都问两个问题:它的值到底从哪里来,以及谁会读它——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 键

publish 有意沿用 Obsidian 的原生键

publish 是 Obsidian 原生识别的属性键之一(也就是 Obsidian Publish 读取的那个)。所以 StandMeet 的导入闸门和 Obsidian 共用一个标志、一个含义——publish: true 表示"公开这篇"——而不是另造一个自定义字段。带来的好处是:它在属性面板里会渲染为一个真正的复选框;而且如果你以后也用起 Obsidian Publish,同一个 publish: true 会同时触发两边(这是有意为之——两者都表示公开;只有当你想让二者分道扬镳时,才需要拆成两个键)。

两个违反直觉的陷阱

  1. cross_refs什么也不做:你可能以为在 frontmatter 里列出相关文章就能建立关系——但导入器把它硬编码为空。关系只来自正文中的 [[wikilinks]]。
  2. 一个键,两个受众: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,以及导入器。

相关笔记