obsidian-bases について
obsidian-basesは、Claude CodeでObsidian Basesファイルを作成・編集するスキルです。YAMLでノートのビュー、フィルター、数式、プロパティ、集計を設定できます。
主な機能
- 01.baseファイルの作成と編集
- 02テーブル、カード、リスト、マップビューの設定
- 03全体およびビュー別フィルターの定義
- 04数式プロパティと集計の計算
活用シーン
- 01タスクトラッカーやプロジェクトダッシュボードの作成
- 02プロパティやタグによるノート整理
- 03ノートの計算フィールド作成
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ davepoon/ buildwithclaude --skill obsidian-basesインストール後、Claude Code で/obsidian-basesを入力して読み込まれたか確認します。
詳細
Obsidian Bases
このスキルを使うと、Claude Code でビュー、フィルター、数式、および関連するすべての設定を含む、有効な Obsidian Bases(.base ファイル)を作成・編集できます。
概要
Obsidian Bases は、Obsidian の保管庫内のノートを動的に表示するための、YAML ベースのファイルです。Base ファイルには、複数のビュー、グローバルフィルター、数式、プロパティ設定、カスタムサマリーを含めることができます。
このスキルを使用する場面
- Obsidian でノートのデータベース風ビューを作成する
- タスクトラッカー、読書リスト、プロジェクトダッシュボードを作成する
- プロパティやタグを使ってノートをフィルタリング、整理する
- 計算フィールドや数式フィールドを作成する
- テーブル、カード、リスト、マップビューを設定する
- Obsidian の保管庫内で .base ファイルを扱う
ファイル形式
Base ファイルは .base 拡張子を使用し、有効な YAML を含みます。Markdown のコードブロックに埋め込むこともできます。
完全なスキーマ
# Global filters apply to ALL views in the base
filters:
# Can be a single filter string
# OR a recursive filter object with and/or/not
and: []
or: []
not: []
# 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
and: []
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 | String | ファイル名 |
file.basename | String | 拡張子を除いたファイル名 |
file.path | String | ファイルのフルパス |
file.folder | String | 親フォルダーのパス |
file.ext | String | ファイル拡張子 |
file.size | Number | ファイルサイズ(バイト) |
file.ctime | Date | 作成日時 |
file.mtime | Date | 更新日時 |
file.tags | List | ファイル内のすべてのタグ |
file.links | List | ファイル内の内部リンク |
file.backlinks | List | このファイルにリンクしているファイル |
file.embeds | List | ノート内の埋め込み |
file.properties | Object | すべてのフロントマタープロパティ |
this キーワード
- メインコンテンツ領域では、Base ファイル自体を指します
- 埋め込まれている場合は、埋め込み元のファイルを指します
- サイドバーでは、メインコンテンツ内でアクティブなファイルを指します
数式構文
数式はプロパティから値を計算します。formulas セクションで定義します。
formulas:
# Simple arithmetic
total: "price * quantity"
# Conditional logic
status_icon: 'if(done, "check", "pending")'
# String formatting
formatted_price: 'if(price, price.toFixed(2) + " dollars")'
# Date formatting
created: 'file.ctime.format("YYYY-MM-DD")'
# Complex expressions
days_old: '((now() - file.ctime) / 86400000).round(0)'
関数リファレンス
グローバル関数
| 関数 | シグネチャ | 説明 |
|---|---|---|
date() | date(string): date | 文字列を日付に変換します |
duration() | duration(string): duration | 期間文字列を解析します |
now() | now(): date | 現在の日付と時刻を返します |
today() | today(): date | 現在の日付を返します(時刻は 00:00:00) |
if() | if(condition, trueResult, falseResult?) | 条件分岐します |
min() | min(n1, n2, ...): number | 最小の数値を返します |
max() | max(n1, n2, ...): number | 最大の数値を返します |
number() | number(any): number | 数値に変換します |
link() | link(path, display?): Link | リンクを作成します |
list() | list(element): List | すでにリストでない場合、リストでラップします |
file() | file(path): file | ファイルオブジェクトを取得します |
image() | image(path): image | レンダリング用の画像を作成します |
icon() | icon(name): icon | 名前で Lucide アイコンを指定します |
html() | html(string): html | HTML としてレンダリングします |
escapeHTML() | escapeHTML(string): string | HTML 文字をエスケープします |
日付関数とフィールド
フィールド: date.year、date.month、date.day、date.hour、date.minute、date.second、date.millisecond
| 関数 | シグネチャ | 説明 |
|---|---|---|
date() | date.date(): date | 時刻部分を削除します |
format() | date.format(string): string | Moment.js のパターンで書式設定します |
time() | date.time(): string | 時刻を文字列として取得します |
relative() | date.relative(): string | 人が読みやすい相対時間を取得します |
isEmpty() | date.isEmpty(): boolean | 日付の場合は常に false です |
日付の演算
# Duration units: y/year/years, M/month/months, d/day/days,
# w/week/weeks, h/hour/hours, m/minute/minutes, s/second/seconds
# Add/subtract durations
"date + \"1M\"" # Add 1 month
"date - \"2h\"" # Subtract 2 hours
"now() + \"1 day\"" # Tomorrow
"today() + \"7d\"" # A week from today
# Subtract dates for millisecond difference
"now() - file.ctime"
# Complex duration arithmetic
"now() + (duration('1d') * 2)"
文字列関数
フィールド: string.length
| 関数 | 説明 |
|---|---|
contains(value) | 部分文字列が含まれているか確認します |
containsAll(...values) | すべての部分文字列が含まれているか確認します |
containsAny(...values) | いずれかの部分文字列が含まれているか確認します |
startsWith(query) | クエリで始まるか確認します |
endsWith(query) | クエリで終わるか確認します |
isEmpty() | 空か、値が存在しないか確認します |
lower() | 小文字に変換します |
title() | タイトルケースに変換します |
trim() | 空白を削除します |
replace(pattern, replacement) | パターンを置換します |
repeat(count) | 文字列を繰り返します |
reverse() | 文字列を逆順にします |
slice(start, end?) | 部分文字列を取得します |
split(separator, n?) | リストに分割します |
数値関数
| 関数 | 説明 |
|---|---|
abs() | 絶対値 |
ceil() | 切り上げ |
floor() | 切り下げ |
round(digits?) | 桁数を指定して丸めます |
toFixed(precision) | 固定小数点表記に変換します |
isEmpty() | 値が存在しません |
リスト関数
フィールド: list.length
| 関数 | 説明 |
|---|---|
contains(value) | 要素が存在するか確認します |
containsAll(...values) | すべての要素が存在するか確認します |
containsAny(...values) | いずれかの要素が存在するか確認します |
filter(expression) | 条件で絞り込みます(value、index を使用) |
map(expression) | 要素を変換します(value、index を使用) |
reduce(expression, initial) | 単一の値に集約します(value、index、acc を使用) |
flat() | 入れ子のリストを平坦化します |
join(separator) | 文字列に結合します |
reverse() | 順序を逆にします |
slice(start, end?) | サブリストを取得します |
sort() | 昇順に並べ替えます |
unique() | 重複を削除します |
isEmpty() | 要素がありません |
ファイル関数
| 関数 | 説明 |
|---|---|
asLink(display?) | リンクに変換します |
hasLink(otherFile) | ファイルへのリンクがあるか確認します |
hasTag(...tags) | いずれかのタグがあるか確認します |
hasProperty(name) | プロパティがあるか確認します |
inFolder(folder) | フォルダーまたはサブフォルダー内にあるか確認します |
ビューの種類
テーブルビュー
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"
デフォルトの集計数式
| 名前 | 入力型 | 説明 |
|---|---|---|
Average | Number | 算術平均 |
Min | Number | 最小値 |
Max | Number | 最大値 |
Sum | Number | すべての数値の合計 |
Range | Number | 最大値 - 最小値 |
Median | Number | 数学的な中央値 |
Stddev | Number | 標準偏差 |
Earliest | Date | 最も古い日付 |
Latest | Date | 最も新しい日付 |
Checked | Boolean | true の値の数 |
Unchecked | Boolean | false の値の数 |
Empty | Any | 空の値の数 |
Filled | Any | 空でない値の数 |
Unique | Any | 一意な値の数 |
完全な例
タスクトラッカーベース
filters:
and:
- file.hasTag("task")
- 'file.ext == "md"'
formulas:
days_until_due: 'if(due, ((date(due) - today()) / 86400000).round(0), "")'
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
読書リストベース
filters:
or:
- file.hasTag("book")
- file.hasTag("article")
formulas:
reading_time: 'if(pages, (pages * 2).toString() + " min", "")'
status_icon: 'if(status == "reading", "reading", if(status == "done", "done", "to-read"))'
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("Projects")
- 'file.ext == "md"'
formulas:
last_updated: 'file.mtime.relative()'
link_count: 'file.links.length'
summaries:
avgLinks: 'values.filter(value.isType("number")).mean().round(1)'
properties:
formula.last_updated:
displayName: "Updated"
formula.link_count:
displayName: "Links"
views:
- type: table
name: "All Projects"
order:
- file.name
- status
- formula.last_updated
- formula.link_count
summaries:
formula.link_count: avgLinks
groupBy:
property: status
direction: ASC
- type: list
name: "Quick List"
order:
- file.name
- status
デイリーノートインデックス
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
ベースの埋め込み
Markdown ファイルに埋め込みます:
![[MyBase.base]]
![[MyBase.base#View Name]]
YAML の引用符のルール
- 数式に二重引用符が含まれる場合は、単一引用符を使います:
'if(done, "Yes", "No")' - 単純な文字列には二重引用符を使います:
"My View Name" - 複雑な式に引用符を入れ子にする場合は、適切にエスケープします
よく使われるパターン
タグで絞り込む
filters:
and:
- file.hasTag("project")
フォルダーで絞り込む
filters:
and:
- file.inFolder("Notes")
日付範囲で絞り込む
filters:
and:
- 'file.mtime > now() - "7d"'
プロパティ値で絞り込む
filters:
and:
- 'status == "active"'
- 'priority >= 3'
Combine Multiple Conditions
filters:
or:
- and:
- file.hasTag("important")
- 'status != "done"'
- and:
- 'priority == 1'
- 'due != ""'
References
コメント
Markdown 対応