wiki-dashboard について
wiki-dashboardは、Obsidian vaultの動的ビューを作成するスキルです。用途に応じて標準機能のObsidian BasesとDataviewを選び、フィルター、グループ化、数式、クエリの例を示します。
主な機能
- 01Obsidian Basesによるライブビュー定義
- 02SQL風のDataviewクエリ作成
- 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 ビュー
利用できるツールは 2 つあります。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による上書き → CWD から上位へ.envを検索 → グローバル設定 → セットアップを促す)。これによりOBSIDIAN_VAULT_PATHがわかります。 $OBSIDIAN_VAULT_PATH/index.mdを読み、存在するカテゴリとページを把握します。- 表示する対象が指定されていない場合は、何を表示したいかユーザーに尋ねます。フォルダー、タグ、カテゴリ、日付範囲などです。
- どちらのツールを使うか不明な場合は、Dataview がインストールされているかユーザーに尋ねます。
オプション A — Obsidian Bases(.base ファイル)
Bases は、Vault 内のノートに対するライブビューを定義する 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: で囲んでください。リストをそのまま指定すると、「and/or/not キーは 1 つだけ指定できます」という解析エラーが発生します。
# 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 の自動整形の動作から確認されています:
| コンテキスト | フロントマターのフィールド 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 フィルター(2 つのフォルダー)
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 | 任意のフロントマターのプロパティ |
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" | 2 つのフォルダーの和集合 |
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 が適しています。
スラッグの例:
- 「すべての概念」→
_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 | すべてのページをカテゴリ別にグループ化し、更新日順に並べ替え |
| エンティティトラッカー | Bases(カード) | エンティティページを視覚的なカードギャラリーとして表示 |
| ドメイン別の概念 | Dataview | GROUP BY を使って、最初のタグごとに概念をグループ化 |
| 取り込みログ | どちらでも可 | created 日付順にページを並べ替え |
| 古いコンテンツ | Dataview | 30 日以上更新されていないページと経過日数 |
| プロジェクト概要 | どちらでも可 | 最終同期日を含むプロジェクトページ |
| 調査トラッカー | Dataview | research タグが付いた統合ページ |
品質チェックリスト
- Bases:フィルターには
and:/or:/not:の下で式文字列を使用し、型付きオブジェクトは使用しない - Bases:
groupByはビュー定義の内部に配置し、トップレベルのキーにはしない - Bases:列ヘッダーは
columns: [{title}]ではなく、properties: <name>: displayName: "..."で設定する - Bases:計算列には
formulas:を使用し、order/propertiesではformula.<name>として参照する - Dataview:GROUP BY クエリでは、プロパティ名だけでなく
rows.propertyを使用する - Dataview:日付計算には
choice(updated, ...)ではなくfile.mtimeを使用する - ファイルが説明的なスラッグを付けて
_meta/に保存されている -
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>