mcpField
W
wiki-dashboard

wiki-dashboard

github.com/ar9av生产力3.6k2.8k 次安装1 天前更新
代码仓库

关于 wiki-dashboard

wiki-dashboard 是为 Obsidian vault 创建动态视图的技能,面向需要浏览和整理笔记的人。它根据需求选择原生 Obsidian Bases 或 Dataview,并提供筛选、分组、公式及查询示例。

主要功能

  1. 01使用 Obsidian Bases 定义动态视图
  2. 02使用 Dataview 编写类 SQL 查询
  3. 03按文件夹、标签或条件筛选笔记
  4. 04配置分组、公式与表格列
  5. 05提供常见仪表板配方

适用场景

  1. 01按类别或标签浏览 vault 笔记
  2. 02查找长期未更新的页面
  3. 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 语法保持不变。

  1. 解析配置 — 遵循 llm-wiki/SKILL.md 中的 Config Resolution Protocol(内联 @name 覆盖 → 从当前工作目录逐级向上查找 .env → 全局配置 → 提示用户设置)。这将得到 OBSIDIAN_VAULT_PATH。
  2. 阅读 $OBSIDIAN_VAULT_PATH/index.md,了解已有的类别和页面。
  3. 如果用户未说明想查看什么,请询问 — 文件夹、标签、类别还是日期范围?
  4. 如果不确定要用哪种工具,请询问用户是否安装了 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.tagsfile.nameformula.<name>
order: 值tags(裸名称)file.nameformula.<name>
groupBy.property:tags(裸名称)file.name—
filters: 表达式file.hasTag(...) / note.tagsfile.nameformula.<name>
formulas: 表达式note.tags、note.updatedfile.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 日期排序的页面
过时内容Dataview30 天以上未更新的页面及其天数
项目概览任一带有上次同步日期的项目页面
研究跟踪器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 + verified
  • QMD refreshed: update only + verified
  • QMD skipped: QMD_WIKI_COLLECTION unset
  • QMD skipped: qmd CLI unavailable
  • QMD failed: <short error summary>

评论

支持 Markdown