obsidian-bases について
obsidian-bases は、Obsidian の `.base` ファイルの作成と検証を支援するスキルです。YAML のフィルターや数式、テーブル・カード・リスト・マップビューによるノート整理を扱います。
主な機能
- 01YAML ベースの `.base` ファイル作成
- 02タグ、フォルダー、プロパティ、日付によるノート絞り込み
- 03ノートやファイルのプロパティを使った数式定義
- 04テーブル、カード、リスト、マップビューの設定
- 05構文検証と数式の問題解決
活用シーン
- 01タグ付きノートを使ったタスク管理表の作成
- 02計算フィールドを含む読書リストの作成
- 03日付やフォルダー別のデイリーノート索引
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ kepano/ obsidian-skills --skill obsidian-basesインストール後、Claude Code で/obsidian-basesを入力して読み込まれたか確認します。
同梱ファイルreferences/FUNCTIONS_REFERENCE.md
詳細
Obsidian Bases スキル
ワークフロー
- ファイルを作成する: 有効な YAML コンテンツを含む
.baseファイルを Vault 内に作成します - スコープを定義する:
filtersを追加して、表示するノート(タグ、フォルダ、プロパティ、日付など)を選択します - 数式を追加する(任意):
formulasセクションで計算プロパティを定義します - ビューを構成する: 1 つ以上のビュー(
table、cards、list、map)を追加し、orderで表示するプロパティを指定します - 検証する: ファイルが構文エラーのない有効な YAML であることを確認します。参照されているすべてのプロパティと数式が存在することをチェックします。よくある問題: 特殊な YAML 文字を含む引用符で囲まれていない文字列、数式式内の引用符の不一致、
formulasでXを定義せずにformula.Xを参照している - Obsidian でテストする: Obsidian で
.baseファイルを開き、ビューが正しくレンダリングされることを確認します。YAML エラーが表示される場合は、以下の引用符のルールを確認してください
スキーマ
Base ファイルは .base 拡張子を使用し、有効な YAML を含みます。
# Global filters apply to ALL views in the base
filters:
# Can be a single filter string
# OR a recursive filter object with exactly ONE key: and, or, or not
and:
- 'status == "active"'
- not:
- 'file.hasTag("archived")'
# Define formula properties that can be used across all views
formulas:
formula_name: 'expression'
# Configure display names and settings for properties
properties:
property_name:
displayName: "Display Name"
formula.formula_name:
displayName: "Formula Display Name"
file.ext:
displayName: "Extension"
# Define custom summary formulas
summaries:
custom_summary_name: 'values.mean().round(3)'
# Define one or more views
views:
- type: table | cards | list | map
name: "View Name"
limit: 10 # Optional: limit results
groupBy: # Optional: group results
property: property_name
direction: ASC | DESC
filters: # View-specific filters follow the same rules
and:
- 'status == "active"'
order: # Properties to display in order
- file.name
- property_name
- formula.formula_name
summaries: # Map properties to summary formulas
property_name: Average
フィルター構文
フィルターは結果を絞り込みます。グローバルに適用することも、ビューごとに適用することもできます。
フィルター構造
# Single filter
filters: 'status == "done"'
# AND - all conditions must be true
filters:
and:
- 'status == "done"'
- 'priority > 3'
# OR - any condition can be true
filters:
or:
- 'file.hasTag("book")'
- 'file.hasTag("article")'
# NOT - exclude matching items
filters:
not:
- 'file.hasTag("archived")'
# Nested filters
filters:
or:
- file.hasTag("tag")
- and:
- file.hasTag("book")
- file.hasLink("Textbook")
- not:
- file.hasTag("book")
- file.inFolder("Required Reading")
フィルター演算子
| 演算子 | 説明 |
|---|---|
== | 等しい |
!= | 等しくない |
> | より大きい |
< | より小さい |
>= | 以上 |
<= | 以下 |
&& | 論理積 |
|| | 論理和 |
! | 論理否定 |
プロパティ
3 種類のプロパティ
- ノートプロパティ - フロントマターから:
note.authorまたは単にauthor - ファイルプロパティ - ファイルのメタデータ:
file.name、file.mtimeなど - 数式プロパティ - 計算値:
formula.my_formula
ファイルプロパティリファレンス
| プロパティ | 型 | 説明 |
|---|---|---|
file.name | 文字列 | ファイル名 |
file.basename | 文字列 | 拡張子を除いたファイル名 |
file.path | 文字列 | ファイルへの完全なパス |
file.folder | 文字列 | 親フォルダのパス |
file.ext | 文字列 | ファイル拡張子 |
file.size | 数値 | ファイルサイズ(バイト単位) |
file.ctime | 日付 | 作成日時 |
file.mtime | 日付 | 更新日時 |
file.tags | リスト | ファイル内のすべてのタグ |
file.links | リスト | ファイル内の内部リンク |
file.backlinks | リスト | このファイルにリンクしているファイル |
file.embeds | リスト | ノート内の埋め込み |
file.properties | オブジェクト | すべてのフロントマタープロパティ |
this キーワード
- メインコンテンツエリア内: base ファイル自体を参照します
- 埋め込まれている場合: 埋め込み元のファイルを参照します
- サイドバー内: メインコンテンツ内のアクティブなファイルを参照します
数式構文
数式はプロパティから値を計算します。formulas セクションで定義します。
formulas:
# Simple arithmetic
total: "price * quantity"
# Conditional logic
status_icon: 'if(done, "✅", "⏳")'
# String formatting
formatted_price: 'if(price, price.toFixed(2) + " dollars")'
# Date formatting
created: 'file.ctime.format("YYYY-MM-DD")'
# Calculate days since created (use .days for Duration)
days_old: '(now() - file.ctime).days'
# Calculate days until due date
days_until_due: 'if(due_date, (date(due_date) - today()).days, "")'
主要な関数
最もよく使用される関数です。すべての型(Date、String、Number、List、File、Link、Object、RegExp)の完全なリファレンスについては、FUNCTIONS_REFERENCE.md を参照してください。
| 関数 | シグネチャ | 説明 |
|---|---|---|
date() | date(string): date | 文字列を日付にパースします(YYYY-MM-DD HH:mm:ss) |
now() | now(): date | 現在の日時 |
today() | today(): date | 現在の日付(時刻 = 00:00:00) |
if() | if(condition, trueResult, falseResult?) | 条件分岐 |
duration() | duration(string): duration | 期間文字列をパースします |
file() | file(path): file | ファイルオブジェクトを取得します |
link() | link(path, display?): Link | リンクを作成します |
Duration 型
2 つの日付を減算すると、結果は Duration 型になります(数値ではありません)。
Duration のフィールド: duration.days、duration.hours、duration.minutes、duration.seconds、duration.milliseconds
重要: Duration は .round()、.floor()、.ceil() を直接サポートしていません。まず数値フィールド(.days など)にアクセスしてから、数値関数を適用してください。
# CORRECT: Calculate days between dates
"(date(due_date) - today()).days" # Returns number of days
"(now() - file.ctime).days" # Days since created
"(date(due_date) - today()).days.round(0)" # Rounded days
# WRONG - will cause error:
# "((date(due) - today()) / 86400000).round(0)" # Duration doesn't support division then round
日付の算術
# Duration units: y/year/years, M/month/months, d/day/days,
# w/week/weeks, h/hour/hours, m/minute/minutes, s/second/seconds
"now() + \"1 day\"" # Tomorrow
"today() + \"7d\"" # A week from today
"now() - file.ctime" # Returns Duration
"(now() - file.ctime).days" # Get days as number
ビューの種類
テーブルビュー
views:
- type: table
name: "My Table"
order:
- file.name
- status
- due_date
summaries:
price: Sum
count: Average
カードビュー
views:
- type: cards
name: "Gallery"
order:
- file.name
- cover_image
- description
リストビュー
views:
- type: list
name: "Simple List"
order:
- file.name
- status
マップビュー
緯度/経度のプロパティと Maps コミュニティプラグインが必要です。
views:
- type: map
name: "Locations"
# Map-specific settings for lat/lng properties
デフォルトの集計フォーミュラ
| 名前 | 入力タイプ | 説明 |
|---|---|---|
Average | 数値 | 算術平均 |
Min | 数値 | 最小の数値 |
Max | 数値 | 最大の数値 |
Sum | 数値 | すべての数値の合計 |
Range | 数値 | 最大 - 最小 |
Median | 数値 | 中央値 |
Stddev | 数値 | 標準偏差 |
Earliest | 日付 | 最も早い日付 |
Latest | 日付 | 最も遅い日付 |
Range | 日付 | 最新 - 最古 |
Checked | 真偽値 | true の値の数 |
Unchecked | 真偽値 | false の値の数 |
Empty | 任意 | 空の値の数 |
Filled | 任意 | 空でない値の数 |
Unique | 任意 | 一意の値の数 |
完全な例
タスクトラッカー Base
filters:
and:
- file.hasTag("task")
- 'file.ext == "md"'
formulas:
days_until_due: 'if(due, (date(due) - today()).days, "")'
is_overdue: 'if(due, date(due) < today() && status != "done", false)'
priority_label: 'if(priority == 1, "🔴 High", if(priority == 2, "🟡 Medium", "🟢 Low"))'
properties:
status:
displayName: Status
formula.days_until_due:
displayName: "Days Until Due"
formula.priority_label:
displayName: Priority
views:
- type: table
name: "Active Tasks"
filters:
and:
- 'status != "done"'
order:
- file.name
- status
- formula.priority_label
- due
- formula.days_until_due
groupBy:
property: status
direction: ASC
summaries:
formula.days_until_due: Average
- type: table
name: "Completed"
filters:
and:
- 'status == "done"'
order:
- file.name
- completed_date
リーディングリスト Base
filters:
or:
- file.hasTag("book")
- file.hasTag("article")
formulas:
reading_time: 'if(pages, (pages * 2).toString() + " min", "")'
status_icon: 'if(status == "reading", "📖", if(status == "done", "✅", "📚"))'
year_read: 'if(finished_date, date(finished_date).year, "")'
properties:
author:
displayName: Author
formula.status_icon:
displayName: ""
formula.reading_time:
displayName: "Est. Time"
views:
- type: cards
name: "Library"
order:
- cover
- file.name
- author
- formula.status_icon
filters:
not:
- 'status == "dropped"'
- type: table
name: "Reading List"
filters:
and:
- 'status == "to-read"'
order:
- file.name
- author
- pages
- formula.reading_time
デイリーノートインデックス
filters:
and:
- file.inFolder("Daily Notes")
- '/^\d{4}-\d{2}-\d{2}$/.matches(file.basename)'
formulas:
word_estimate: '(file.size / 5).round(0)'
day_of_week: 'date(file.basename).format("dddd")'
properties:
formula.day_of_week:
displayName: "Day"
formula.word_estimate:
displayName: "~Words"
views:
- type: table
name: "Recent Notes"
limit: 30
order:
- file.name
- formula.day_of_week
- formula.word_estimate
- file.mtime
Base の埋め込み
Markdown ファイルに埋め込みます:
![[MyBase.base]]
![[MyBase.base#View Name]]
YAML の引用符のルール
- 二重引用符を含むフォーミュラには一重引用符を使用します:
'if(done, "Yes", "No")' - 単純な文字列には二重引用符を使用します:
"My View Name" - 複雑な式ではネストされた引用符を適切にエスケープします
トラブルシューティング
YAML 構文エラー
引用符で囲まれていない特殊文字: :, {, }, [, ], ,, &, *, #, ?, |, -, <, >, =, !, %, @, ` を含む文字列は引用符で囲む必要があります。
# WRONG - colon in unquoted string
displayName: Status: Active
# CORRECT
displayName: "Status: Active"
フォーミュラ内の引用符の不一致: フォーミュラに二重引用符が含まれる場合は、フォーミュラ全体を一重引用符で囲みます。
# WRONG - double quotes inside double quotes
formulas:
label: "if(done, "Yes", "No")"
# CORRECT - single quotes wrapping double quotes
formulas:
label: 'if(done, "Yes", "No")'
よくあるフォーミュラのエラー
フィールドアクセスを伴わない期間の計算: 日付を減算すると、数値ではなく Duration が返されます。常に .days、.hours などにアクセスしてください。
# WRONG - Duration is not a number
"(now() - file.ctime).round(0)"
# CORRECT - access .days first, then round
"(now() - file.ctime).days.round(0)"
null チェックの欠如: プロパティがすべてのノートに存在するとは限りません。if() を使用してガードしてください。
# WRONG - crashes if due_date is empty
"(date(due_date) - today()).days"
# CORRECT - guard with if()
'if(due_date, (date(due_date) - today()).days, "")'
未定義のフォーミュラの参照: order または properties 内のすべての formula.X に対応するエントリが formulas にあることを確認してください。
# This will fail silently if 'total' is not defined in formulas
order:
- formula.total
# Fix: define it
formulas:
total: "price * quantity"