mcpField
O
obsidian-bases

obsidian-bases

github.com/galaxy-dawn生産性5.9k47 回インストール1 週間前に更新
リポジトリ

obsidian-bases について

obsidian-basesは、Obsidian Basesファイルの作成と設定を支援するスキルです。ノートの絞り込みや複数のビュー表示に使え、YAML、数式、設定ミスの確認方法も扱います。

主な機能

  1. 01.baseのYAMLファイル作成と検証
  2. 02タグ・フォルダー・プロパティ・日付で絞り込み
  3. 03ノートのプロパティを使った数式定義
  4. 04テーブル・カード・リスト・マップビューの設定
  5. 05YAMLと数式のエラー確認

活用シーン

  1. 01ステータスで絞り込むタスクリストの作成
  2. 02指定タグの読書ノートの一覧化
  3. 03期限やノートの経過日数の計算
  4. 04MarkdownノートへのBasesビュー埋め込み

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/galaxy-dawn/claude-scholar --skill obsidian-bases

インストール後、Claude Code で/obsidian-basesを入力して読み込まれたか確認します。

同梱ファイルreferences/FUNCTIONS_REFERENCE.md

詳細

Obsidian Bases スキル

ワークフロー

  1. ファイルを作成する: 有効な YAML コンテンツを含む .base ファイルを Vault 内に作成します
  2. スコープを定義する: filters を追加して、表示するノート(タグ、フォルダ、プロパティ、日付など)を選択します
  3. 数式を追加する(任意): formulas セクションで計算プロパティを定義します
  4. ビューを構成する: 1 つ以上のビュー(table、cards、list、map)を追加し、order で表示するプロパティを指定します
  5. 検証する: ファイルが構文エラーのない有効な YAML であることを確認します。参照されているすべてのプロパティと数式が存在することをチェックします。よくある問題: 特殊な YAML 文字を含む引用符で囲まれていない文字列、数式式内の引用符の不一致、formulas で X を定義せずに formula.X を参照している
  6. 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 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 種類のプロパティ
  1. ノートプロパティ - フロントマターから: note.author または単に author
  2. ファイルプロパティ - ファイルのメタデータ: file.name、file.mtime など
  3. 数式プロパティ - 計算値: 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"

参考資料

コメント