关于 wiki-dashboard
wiki-dashboard 是为 Obsidian vault 创建动态视图的技能,面向需要浏览和整理笔记的人。它根据需求选择原生 Obsidian Bases 或 Dataview,并提供筛选、分组、公式及查询示例。
主要功能
- 01使用 Obsidian Bases 定义动态视图
- 02使用 Dataview 编写类 SQL 查询
- 03按文件夹、标签或条件筛选笔记
- 04配置分组、公式与表格列
- 05提供常见仪表板配方
适用场景
- 01按类别或标签浏览 vault 笔记
- 02查找长期未更新的页面
- 03汇总多个文件夹中的项目页面
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ ar9av/ obsidian-wiki --skill wiki-dashboard安装后在 Claude Code 中输入/wiki-dashboard确认已加载。
详细介绍
Wiki 仪表板 — 动态 Vault 视图
有两种工具可用:Obsidian Bases(原生、由 GUI 驱动,无需插件)和 Dataview(社区插件,类似 SQL,功能更强大)。确认用户安装了哪一种;除非用户指定 Dataview 或需要 GROUP BY/计算列,否则优先使用 Bases。
开始之前
写作规范: 起草或改写自然语言 Markdown 之前,请阅读并应用 llm-wiki/SKILL.md 中的 Writing Profile Resolution 部分。框架架构、来源信息、安全规范和特定操作要求优先。
仅将 WRITING.md 中的偏好应用于可选的 Markdown 仪表板文案;.base 语法保持不变。
- 解析配置 — 遵循
llm-wiki/SKILL.md中的 Config Resolution Protocol(内联@name覆盖 → 从当前工作目录逐级向上查找.env→ 全局配置 → 提示用户设置)。这将得到OBSIDIAN_VAULT_PATH。 - 阅读
$OBSIDIAN_VAULT_PATH/index.md,了解已有的类别和页面。 - 如果用户未说明想查看什么,请询问 — 文件夹、标签、类别还是日期范围?
- 如果不确定要用哪种工具,请询问用户是否安装了 Dataview。
选项 A — Obsidian Bases(.base 文件)
Bases 是用于定义知识库笔记实时视图的 YAML 文件。它是 Obsidian 1.8+ 的原生功能,无需插件。
官方规范架构
顶层键:
filters: # Global filter applied to all views (expression strings under and/or/not)
formulas: # Named computed properties — referenced as formula.<name>
properties: # Display config per property — sets displayName for column headers
summaries: # Aggregation formulas (e.g. mean, sum)
views: # Array of view definitions (required)
views: 中的每个条目:
views:
- type: table # table | list | cards | map
name: "View Name" # display label
limit: 50 # optional max rows
order: # column display order (list of property/formula names)
- file.name
- note.updated
groupBy: # grouping — goes INSIDE the view, NOT at top level
property: note.tags
direction: ASC # ASC | DESC
filters: # view-specific filter (merges with global filters)
and:
- 'note.status != "done"'
summaries:
formula.myFormula: Average
筛选语法 — 至关重要
筛选条件使用表达式字符串,而不是类型化对象。 始终使用 and:、or: 或 not: 包裹;直接使用列表会导致“may only have one of and/or/not keys”解析错误。
# CORRECT
filters:
and:
- file.inFolder("concepts")
# WRONG — typed objects (parse error)
filters:
- type: folder
folder: concepts
筛选条件支持嵌套:
filters:
or:
- file.hasTag("book")
- and:
- file.inFolder("concepts")
- file.hasTag("research")
- not:
- file.hasTag("archived")
属性名称惯例
不同上下文使用不同的命名方式 — 已通过 Obsidian 的自动重排行为确认:
| 上下文 | Frontmatter 字段 tags | 文件名 | 公式 |
|---|---|---|---|
properties: 键 | note.tags | file.name | formula.<name> |
order: 值 | tags(裸名称) | file.name | formula.<name> |
groupBy.property: | tags(裸名称) | file.name | — |
filters: 表达式 | file.hasTag(...) / note.tags | file.name | formula.<name> |
formulas: 表达式 | note.tags、note.updated | file.name | — |
基本表格 — 文件夹筛选
filters:
and:
- file.inFolder("concepts")
properties:
file.name:
displayName: Page
note.tags:
displayName: Tags
note.summary:
displayName: Summary
note.updated:
displayName: Updated
views:
- type: table
name: Table
order:
- file.name
- tags
- summary
- updated
卡片视图 — 文件夹筛选
filters:
and:
- file.inFolder("entities")
properties:
file.name:
displayName: Entity
note.title:
displayName: Full Name
note.tags:
displayName: Tags
note.summary:
displayName: Summary
views:
- type: cards
name: Cards
order:
- file.name
- title
- tags
- summary
按属性分组 — groupBy 放在视图内部
设置 groupBy 时,从 order: 中省略该属性 — 它会成为分组标题行;同时将其添加为列也会导致重复。
filters:
and:
- file.inFolder("concepts")
properties:
file.name:
displayName: Concept
note.summary:
displayName: Summary
note.updated:
displayName: Updated
views:
- type: table
name: By Domain
groupBy:
property: tags # bare property name, no note. prefix
direction: ASC
order:
- file.name # do NOT include tags here — already the group header
- summary
- updated
标签筛选
filters:
and:
- file.hasTag("machine-learning")
properties:
file.name:
displayName: Page
note.category:
displayName: Category
note.summary:
displayName: Summary
views:
- type: table
name: Table
order:
- file.name
- category
- summary
多重筛选(文件夹 AND 标签)
filters:
and:
- file.inFolder("projects")
- file.hasTag("active")
properties:
file.name:
displayName: Project
note.summary:
displayName: Summary
note.updated:
displayName: Last Updated
views:
- type: cards
name: Cards
order:
- file.name
- summary
- updated
OR 筛选(两个文件夹)
filters:
or:
- file.inFolder("concepts")
- file.inFolder("entities")
properties:
file.name:
displayName: Page
note.category:
displayName: Category
note.updated:
displayName: Updated
views:
- type: table
name: Table
order:
- file.name
- category
- updated
通过公式添加计算列
filters:
and:
- file.inFolder("concepts")
formulas:
days_stale: "floor((now() - note.updated) / 86400000)"
properties:
file.name:
displayName: Page
note.updated:
displayName: Updated
formula.days_stale:
displayName: Days Stale
views:
- type: table
name: Stale
order:
- file.name
- updated
- formula.days_stale
筛选表达式参考
| 表达式 | 作用 |
|---|---|
file.inFolder("path") | 筛选该文件夹中的页面 |
file.hasTag("tag") | 筛选带有该标签的页面(不带 # 前缀) |
file.hasLink("Note Name") | 筛选链接到某个笔记的页面 |
file.name == "note-name" | 精确匹配文件名 |
file.ext == "md" | 按扩展名筛选 |
note.propertyName | 任意 Frontmatter 属性 |
formula.formulaName | 命名公式的结果 |
now() | 当前时间戳,单位为毫秒 |
关于 Obsidian UI 生成的格式: Obsidian 的 GUI 写入或重排
.base文件时,可能会输出一种简化的简写格式,使用顶层columns:、sort:和view:键,而不是规范架构。这种格式同样有效 — Obsidian 两种格式都接受。手动编写的文件应使用上述规范架构。
选项 B — Dataview(社区插件)
Dataview 在任意笔记的 ```dataview ``` 代码块中使用类似 SQL 的查询语言。对于计算列、GROUP BY 和跨文件夹查询,它比 Bases 更强大。
基本表格 — 文件夹
```dataview
TABLE
tags AS "Tags",
summary AS "Summary",
file.mtime AS "Last Modified"
FROM "concepts"
SORT file.mtime DESC
```
带可点击链接的表格(TABLE WITHOUT ID)
```dataview
TABLE WITHOUT ID
file.link AS "Entity",
tags AS "Tags",
summary AS "Summary"
FROM "entities"
SORT file.name ASC
```
GROUP BY — 分组后使用 rows. 前缀
GROUP BY 之后,单个文件属性必须加上 rows. 前缀 — 否则该列会为空或报错。
```dataview
TABLE WITHOUT ID
rows.file.link AS "Concept",
rows.summary AS "Summary"
FROM "concepts"
GROUP BY tags[0] AS "Domain"
```
过时页面 — 使用 file.mtime 进行日期计算
避免使用 choice(updated, date(updated), file.mtime) —— updated 前置元数据中的日期格式不一致会导致算术错误。file.mtime 始终是有效的 DateTime。
```dataview
TABLE WITHOUT ID
file.link AS "Page",
category AS "Type",
file.mtime AS "Last Modified",
(date(today) - file.mtime).days + " days" AS "Age"
FROM "concepts" OR "entities" OR "projects"
WHERE file.name != file.folder
WHERE (date(today) - file.mtime).days > 30
SORT (date(today) - file.mtime).days DESC
```
多文件夹查询
```dataview
TABLE
summary AS "Summary",
file.mtime AS "Last Modified"
FROM "projects"
WHERE file.name != file.folder
SORT file.mtime DESC
```
Dataview 参考
| 子句 | 用法 |
|---|---|
FROM "folder" | 文件夹中的所有笔记 |
FROM #tag | 带有该标签的所有笔记 |
FROM "a" OR "b" | 两个文件夹的并集 |
WHERE file.name != file.folder | 排除文件夹索引页面 |
GROUP BY field AS "Label" | 对行分组——之后访问属性时使用 rows. |
SORT field DESC | 排序方向 |
file.link | 可点击的维基链接 |
file.mtime | 上次修改时间(始终是有效的 DateTime) |
(date(today) - file.mtime).days | 距上次修改的天数 |
第 3 步:编写文件
**Bases:**目标路径 $OBSIDIAN_VAULT_PATH/_meta/<dashboard-name>.base
**Dataview:**将查询直接写入任意 .md 笔记。使用 $OBSIDIAN_VAULT_PATH/_meta/dashboard.md 作为专用仪表板笔记,可方便地呈现多个分区的视图。
Slug 示例:
- “所有概念” →
_meta/concepts-index.base - “最近导入” →
_meta/recent-ingests.base - “项目概览” →
_meta/projects-overview.base - “过时页面” →
_meta/stale-pages.base - “完整仪表板” →
_meta/dashboard.md
如果 _meta/ 尚不存在,请创建它。
第 4 步:嵌入 Bases(可选)
若要在笔记中嵌入 .base:
## Entities
![[_meta/entities-tracker.base]]
修改现有笔记前请先征求同意。
第 5 步:更新跟踪记录
在 $OBSIDIAN_VAULT_PATH/log.md 末尾追加:
- [TIMESTAMP] WIKI_DASHBOARD name="<slug>" tool=bases|dataview view=<type> filter="<description>"
无需更新清单或索引——仪表板是实时查询,而非静态页面。
常见仪表板方案
| 仪表板 | 最佳工具 | 显示内容 |
|---|---|---|
| 内容索引 | Bases 或 Dataview | 按类别分组并按 updated 排序的所有页面 |
| 实体跟踪器 | Bases(卡片) | 以可视化卡片画廊展示实体页面 |
| 按领域划分的概念 | Dataview | 使用 GROUP BY 按首个标签对概念分组 |
| 导入日志 | 任一 | 按 created 日期排序的页面 |
| 过时内容 | Dataview | 30 天以上未更新的页面及其天数 |
| 项目概览 | 任一 | 带有上次同步日期的项目页面 |
| 研究跟踪器 | Dataview | 标记为 research 的综合页面 |
质量检查清单
- Bases:筛选器在
and:/or:/not:下使用表达式字符串,绝不使用类型化对象 - Bases:
groupBy放在视图定义内,而不是顶层键 - Bases:通过
properties: <name>: displayName: "..."设置列标题,不使用columns: [{title}] - Bases:使用
formulas:添加计算列,并在 order/properties 中以formula.<name>引用 - Dataview:GROUP BY 查询使用
rows.property,而不是裸写property - Dataview:日期运算使用
file.mtime,而不是choice(updated, ...) - 文件已写入
_meta/,且使用了描述性 slug - 已更新
log.md - 已告知用户如何嵌入 Bases(
![[_meta/<name>.base]])或打开仪表板笔记
写入 Vault 后刷新 QMD
QMD 是搜索索引,而非事实来源。如果 $QMD_WIKI_COLLECTION 为空或未设置,请跳过此步骤。仅在此技能写入或重写 Vault Markdown 后运行。如果 QMD 刷新失败,不要回滚 Vault 更改;应单独报告 QMD 状态。
如果已设置 $QMD_CLI,则使用它;否则使用 qmd。
${QMD_CLI:-qmd} update
如果输出提示需要向量或嵌入可能已过时,请运行:
${QMD_CLI:-qmd} embed
使用以下任一方式验证集合:
${QMD_CLI:-qmd} ls "$QMD_WIKI_COLLECTION"
或者,在已知特定页面路径时:
${QMD_CLI:-qmd} get "qmd://$QMD_WIKI_COLLECTION/<page>.md" -l 5
记录以下其中一项:
QMD refreshed: update + embed + verifiedQMD refreshed: update only + verifiedQMD skipped: QMD_WIKI_COLLECTION unsetQMD skipped: qmd CLI unavailableQMD failed: <short error summary>