OpenSource-Hub

claude-obsidian

CLI ツール

AgriciDaniel/claude-obsidian

Obsidian と Claude Code 向けの AI 自動整理ナレッジベース。

概要

ローカルファーストのナレッジシステム。生の資料を相互にリンクされ出典が明記された Obsidian ノートに変換します。キャプチャ、クエリ、メンテナンス、リサーチ、可視化をカバーする15のエージェントスキルを提供します。すべてのコンテンツはプレーンな Markdown ファイルとして保持され、ユーザーが完全に管理できます。

README プレビュー

\n  \n\n\nclaude-obsidian\n\n\n  Build an Obsidian knowledge base that becomes more useful every time you use it.\n  Capture sources, create connected notes, retrieve grounded answers, and keep the vault healthy—without giving up ownership of your files.\n\n\n\n  \n  \n  \n  \n\n\n\n  See the workflow ·\n  Quick start ·\n  Explore the skills ·\n  Installation guide ·\n  Windows & WSL\n\n\nclaude-obsidian is a local-first knowledge system for Claude Code and compatible\n[Agent Skills](https://agentskills.io) hosts. It turns source material into\nlinked, source-cited Obsidian pages; answers from the evidence already in the\nvault; and provides explicit workflows for research, retrieval, maintenance,\nand visual mapping.\n\nYour vault remains a normal directory of Markdown, JSON, and source files. It is\nnot hidden in a plugin cache, locked in a cloud database, or silently uploaded\nto a model.\n\n## From source to living knowledge\n\nMost AI note workflows stop after saving text. claude-obsidian is organized\naround a repeatable loop: retain the source, ground the claims, connect the\nknowledge, then put it back to work.\n\n\n\n- **Capture with context.** Bring local sources through a visible inbox and\n  preserve immutable, content-addressed copies before synthesis.\n- **Ground every important claim.** Source and claim ledgers retain authority,\n  freshness, support, contradiction, confidence, and review state.\n- **Connect what you learn.** Build linked pages, indexes, Maps of Content,\n  methodology-aware structures, and Obsidian Canvas views.\n- **Use the vault again.** Query, research, retrieve, lint, and fold what is\n  already known instead of starting every conversation from zero.\n\n## See the vault\n\nThe output is meant to remain useful with or without an agent: plain Markdown\nfor portability, Obsidian for navigation and visual exploration.\n\n\n  \n  \n\n\n\n  Linked knowledge in Graph view · A visual knowledge map in Obsidian Canvas\n\n\n## Why it fe

FAQ (5)

トラブル対応
WSLから使用しているWindowsで作成したGitリポジトリで、checkpoint COMMITTED_MODE_MISMATCHを修正するにはどうすればよいですか?

claude-obsidian v2.2.0 以降にアップグレードしてください。PR #177 により、checkpoint が core.filemode=false を尊重するようになり、永続化されたトランザクション結果に実行可能な POSIX モードが含まれている場合でも、Git モード 100755 を必要としなくなりました。アップグレード後、失敗した操作に対して checkpoint を再実行してください。git config --get core.filemode でリポジトリ設定を確認してください。ネイティブの Windows Git で作成またはクローンされたリポジトリでは false が期待値です。changed-paths.json を編集したり、git update-index --chmod=+x を使用したりしないでください。これらは来歴を偽装するか、checkpoint が拒否するステージ済み状態を作成してしまいます。

参照 Issue #166
トラブル対応
stop_statusが64 KiBを超える完了済みのトランザクションジャーナルを読み取り不能として報告するのはなぜですか?また、`transaction recover`を実行しても警告が解除されないのはなぜですか?

これは stop_status の 64 KiB の読み取り上限が原因で発生する誤検出です。この上限を超えるジャーナルは JSON パースの前に切り詰められていたため、"state": "complete" を含む有効なジャーナルが読み取り不能としてカウントされていました。推奨されている claude-obsidian transaction recover ではこれらをクリアできません。このコマンドは prepared、applying、rollback-failed のジャーナルのみを処理し、完了済みのジャーナルは意図的にスキップされるためです。

修正方法: claude-obsidian v2.2.0 以降にアップグレードしてください。PR #177 でジャーナルの読み取り上限が 8 MiB に引き上げられました。

旧バージョンでの一時的な確認方法:

import json
raw = open(journal_path, "rb").read()
print(len(raw), json.loads(raw)["state"])

出力が complete で終わる場合、その警告はアップグレードまで無視して構いません。これらのジャーナルに対して transaction recover を実行しても何も行われません(no-op)。

参照 Issue #164
トラブル対応
claude-obsidian の `.raw/` アーカイブが原因で発生する ambiguous-target lint の誤検出を修正するにはどうすればよいですか?

claude_obsidian/lint_engine.py で、_IGNORED_WALK_DIRS に .raw を追加してください:

_IGNORED_WALK_DIRS = {
    ".git",
    ".obsidian",
    ".vault-meta",
    ".cache",
    ".pytest_cache",
    "__pycache__",
    "node_modules",
    ".raw",
}

その後、再実行してください:

python scripts/claude-obsidian.py lint --vault "$VAULT" --format markdown

これにより、アーカイブされたキャプチャが Obsidian のリンク解決候補として扱われるのを防ぎます。Obsidian はドットで始まるフォルダを無視するため、.raw/ 配下のファイルは wiki/sources/ 配下のページと競合すべきではありません。この限定的な修正により、関連する誤った stale_index_entries および orphans の検出も解消されます。プロベナンスの検証は _walk_files() を使用せずにレジャーを直接読み取るため、影響を受けません。

より広範な代替案としては、すべての隠しフォルダに対する Obsidian の動作に合わせて、ドットで始まるすべてのディレクトリをスキップする方法がありますが、それはより広い動作変更になります。claude-obsidian 2.1.0(engine 1.1.1)で報告されました。

参照 Issue #163
トラブル対応
Claude Code のフックで発生するエラー "NameError: name 'false' is not defined" を修正するにはどうすればよいですか?

Claude Code 2.1.49 では、コマンドフックは hooks/hooks.json 内の独立した args フィールドをサポートしていません。"command": "python3" に args を組み合わせて定義したフックは python3 のみが実行されるため、Python がフックの JSON ペイロードを stdin から読み込み、小文字の false で失敗します。

hooks/hooks.json を編集し、args 配列を削除して、単一の command 文字列を使用してください:

SessionStart:
"command": "python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/claude-obsidian.py\" hook session-start"

Stop:
"command": "python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/claude-obsidian.py\" hook stop"

"type": "command" と "timeout" の値はそのまま維持し、Claude Code を再起動するかプラグインを再読み込みしてください。これにより、アダプターは JSON ペイロードを受け取り、ステータス 0 で終了するはずです。トレースバックは処理をブロックしませんが、この変更を行わないとライフサイクルフックは実行されません。

参照 Issue #162
トラブル対応
なぜ claude-obsidian lint は、ファイル名に %23(エンコードされた #)を含むパスに対して誤ったデッドリンクを報告するのですか?

この誤検出は、lint エンジンの 3.0.0 より前のバージョンに存在したバグでした: _parse_links() が # フラグメントを切り離す前にリンク先を URL デコードしていたため、ファイル名内のエンコードされた %23 がフラグメントの区切り文字として誤認され、切り詰められたパスの検索が失敗していました。修正方法: claude-obsidian v3.0.0 以降にアップグレードしてください(https://github.com/AgriciDaniel/claude-obsidian/releases/tag/v3.0.0)。この修正では、まだエンコードされた状態のリンク先からフラグメントを切り離し、パスのデコードを一度だけ行うため、[doc](../some%20folder%20%231/file.md) のようなリンクは実際のファイルに正しく解決され、デッドリンクとして報告されなくなります。Markdown を変更する必要はありません — RFC 3986 に準拠したパーセントエンコーディングはすでに正しいものでした。

参照 Issue #193