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 mode가 포함되어 있어도 더 이상 Git mode 100755를 요구하지 않습니다. 업그레이드 후 실패한 작업에 대해 checkpoint를 다시 실행하세요. git config --get core.filemode로 리포지토리 설정을 확인하세요. 네이티브 Windows Git으로 생성하거나 클론한 리포지토리에서는 false가 예상되는 값입니다. changed-paths.json을 편집하거나 git update-index --chmod=+x를 사용하지 마세요. 이는 출처를 위조하거나 checkpoint가 거부하는 staged 상태를 생성하기 때문입니다.

원본 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를 실행해도 아무 작업도 수행되지 않습니다.

원본 Issue #164
문제 해결
claude-obsidian에서 `.raw/` 아카이브로 인해 발생하는 ambiguous-target 린트 오탐은 어떻게 수정하나요?

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 탐지 결과도 함께 제거합니다. Provenance 검증은 _walk_files()를 사용하는 대신 원장(ledger)을 직접 읽기 때문에 영향을 받지 않습니다.

더 광범위한 대안으로는 모든 점으로 시작하는 디렉터리를 건너뛰어 모든 숨김 폴더에 대해 Obsidian의 동작과 일치시키는 방법이 있지만, 이는 더 넓은 범위의 동작 변경입니다. 이 문제는 claude-obsidian 2.1.0과 engine 1.1.1에서 보고되었습니다.

원본 Issue #163
문제 해결
Claude Code hook 오류 "NameError: name 'false' is not defined"는 어떻게 수정하나요?

Claude Code 2.1.49에서는 command 훅이 hooks/hooks.json의 별도 args 필드를 지원하지 않습니다. "command": "python3"에 args를 함께 지정해 정의한 훅은 python3만 실행되며, 이로 인해 Python이 stdin에서 훅의 JSON 페이로드를 읽고 소문자 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으로 종료됩니다. traceback은 non-blocking이지만, 이 변경을 적용하기 전까지는 라이프사이클 훅이 실행되지 않습니다.

원본 Issue #162
문제 해결
claude-obsidian lint가 파일명에 %23(인코딩된 #)이 포함된 경로에 대해 잘못된 dead link를 보고하는 이유는 무엇인가요?

이 오탐지는 3.0.0 이전 버전의 lint 엔진 버그였습니다: _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에 따른 percent-encoding은 이미 올바랐습니다.

원본 Issue #193