Repository navigation
Releases
v3.10.1 — Privacy policy
Added
PRIVACY.mddocumenting the plugin's data-handling policy:- Local-first storage; vault contents stay on your machine
- No telemetry — the plugin contacts no maintainer-controlled servers
- Opt-in OpenAI usage, only when
VAULT_PKM_OPENAI_KEYis set (used byvault_semantic_searchand graph-contextvault_suggest_links) - Local SQLite stores under
.obsidian/(activity-log.db,semantic-index.db) with documented user controls for clearing them
Linked from the README. Provides the privacy policy URL needed for the plugin marketplace listing: https://github.com/AdrianV101/obsidian-pkm-plugin/blob/v3.10.1/PRIVACY.md
No code changes — docs-only patch release.
v3.10.0 — pkm-write / pkm-session-end / pkm-explore skill revisions
Highlights
The three non-task PKM skills (pkm-write, pkm-session-end, pkm-explore) were revised through the skill-creator iteration loop, fixing instruction-following gaps surfaced by eval runs against a real vault. All three changes share a root cause: the skills assumed an embedding-score scale (0.3 / 0.8 thresholds) that text-embedding-3-large doesn't actually produce — its cosine scores compress hard into ~0.40–0.65 even for tangential matches, so absolute thresholds at the extremes were dead code.
What changed
pkm-write
- Duplicate-check threshold
> 0.8→≥ 0.5with verify-by-read. The old threshold was unreachable, so every note routed to CREATE — including topics the vault already covered. - Step 3 callout for cleaning up template stubs in
## Related/## Links/## Referencesbefore Step 6 (vault_add_linksappends, doesn't replace placeholders). - Well-linked-existing-note carve-out (UPDATE path only) so the agent can skip Steps 5–7 when the existing graph already covers the connections, instead of forcing additional low-quality links.
pkm-session-end
- Same threshold tune.
- Bug fix: Step 3d's
vault_add_links({ target: "...devlog.md#heading" })example was broken — the tool resolvestargetby basename and silently drops#headingsuffixes. Replaced withvault_appendof an inline[[<project>/development/devlog#YYYY-MM-DD HH:mm]]body wikilink. The disambiguated path matters in vaults with per-project devlogs. - Step 2 clarification: parent agent's session-context message is the primary scope boundary;
vault_activityis a discovery aid for files-touched. Prevents re-capturing previously-documented work in long-lived MCP sessions.
pkm-explore
- Replaced the unreachable
< 0.3minimal-coverage threshold with a read-the-top-hit + judge-topical-relevance + corroborate-with-vault_searchrule. Numeric thresholds at the low end couldn't separate "tangential surface match" from "real seed" — the score distribution doesn't have enough resolution.
Validation
Each skill went through skill-creator iteration loops with three eval prompts each:
pkm-write: 80% → 100% (3 iterations)pkm-session-end: 95% → 100% (2 iterations)pkm-explore: 95% → 100% (2 iterations)
Comprehensive PR review (3 reviewer agents — code-reviewer, comment-analyzer, code-simplifier) found no critical issues; 5 important findings (basename-resolver collisions, placeholder convention drift, magic number cleanup, fabricated example text) all addressed in a follow-up commit.
Tests: 581/581 pass.
🤖 Generated with Claude Code
v3.9.0 — Clickable obsidian:// links in tool output
Added
- Clickable obsidian:// links in tool output. Vault paths in
vault_search,vault_list,vault_recent,vault_query,vault_links(incoming),vault_neighborhood,vault_semantic_search,vault_suggest_links,vault_link_health,vault_peek, thevault_readauto-redirect, and write-success messages now render as[path.md](obsidian://open?vault=<name>&file=<encoded-path>)markdown links. Cmd+click (macOS) / Ctrl+click in supported terminals opens the note directly in Obsidian. TheobsidianLink(filePath, vaultName)helper does the encoding (percent-encoded/→%2F, spaces →%20, trailing.mdstripped from the URL but kept in link text). VAULT_PKM_VAULT_NAMEenv var. Overrides the default vault name used inobsidian://links. Defaults topath.basename(VAULT_PATH). Set this when your on-disk vault folder name differs from the vault name registered in Obsidian.init-projectwrites a "Referring to vault files" directive into the project's CLAUDE.md so Claude uses the markdown-link format inline when narrating about vault files (not just when relaying tool output verbatim). The same directive ships insample-project/CLAUDE.md.
Changed
- All vault tool descriptions now include a
LINK_FORMAT_NOTEinstructing the model to (a) preserve the link form in user-facing replies and (b) extract only the bracket text (not the full markdown link) when feeding paths back aspatharguments. formatPeek,formatNeighborhood, andembeddings.search()accept an optionalformatPathcallback so handlers can inject the link formatter without those modules knowing about vault names.
Upgrading
After updating, restart your MCP server. If your on-disk vault folder name differs from your registered Obsidian vault name, set VAULT_PKM_VAULT_NAME in your env block.
v3.8.0 — Task management skill trio
What's new
Three new skills that close the full task lifecycle loop:
vault-pkm:add-task
Fast task capture from a title. Parses priority shorthands (h/high, u/urgent, l/low) and due dates, runs a semantic duplicate check before creating, and uses the task template for consistent frontmatter.
vault-pkm:triage-tasks
Surfaces pending/active tasks as a numbered list with [priority] labels and ⚡ git completion hints. Accepts shorthand batch updates in a single reply — e.g. 1,3 done | 2 active | 4 cancel. Defaults to the current project; pass all to triage across all projects.
vault-pkm:tackle-task
Works a task end-to-end: reads the task note, explores vault context (linked ADRs, recent activity, git log), classifies complexity into trivial / standard / significant, routes to the appropriate workflow, and closes the task (status: done + completion timestamp) when finished.
Why
Tasks were frequently left as pending after completion because there was no proactive workflow for reviewing and updating them. These three skills address the full lifecycle: capture → triage → execute and close.
Full changelog
See CHANGELOG.md for details.
v3.7.0 — Rename to vault-pkm + community marketplace install
Changed
- Plugin identity renamed from
obsidian-pkmtovault-pkm. The Claude Code plugin manifest, the MCP server registration, and the skill/command namespace (/vault-pkm:setup,/vault-pkm:pkm-write, etc.) all use the new name. MCP tools now appear undermcp__vault-pkm__vault_*. Rationale: the old name read as Obsidian-specific, but the server is a generic PKM layer that happens to follow Obsidian conventions. - Install from the official community marketplace. The documented install command is now:
The previous personal-marketplace install path is no longer documented, and
claude plugin marketplace add anthropics/claude-plugins-community claude plugin install vault-pkm@claude-community.claude-plugin/marketplace.jsonhas been removed. - Env var renamed to
VAULT_PKM_OPENAI_KEY(wasOBSIDIAN_PKM_OPENAI_KEY). A fallback chain keeps reading the old name andOPENAI_API_KEY, so existing configs continue to work; the doctor command prints a deprecation notice when only the old name is set.
Unchanged (deliberately)
- The npm package name stays
obsidian-pkm— the published version history andnpx obsidian-pkmbin are preserved. - The GitHub repo URL stays
AdrianV101/obsidian-pkm-plugin— the community marketplace entry pins installs to this repo, so renaming would break the install path.
Migration
Existing users installed from the personal marketplace:
- Uninstall the old plugin:
claude plugin uninstall obsidian-pkm@<your-current-marketplace>. - Install from the community marketplace (commands above).
- Rename your env var in
~/.claude/settings.jsonfromOBSIDIAN_PKM_OPENAI_KEYtoVAULT_PKM_OPENAI_KEY(old name still works, but is deprecated). - Permission entries (
mcp__plugin_vault-pkm_vault-pkm__*) will need re-granting on first tool use after the rename. - Vault data is untouched — the semantic index (
.obsidian/semantic-index.db) and activity log (.obsidian/activity-log.db) live inside$VAULT_PATH, not inside the plugin install.
v3.6.2
Bidirectional devlog–task wikilinks
PKM-capture now creates bidirectional links between devlog entries and task notes:
- Devlog → tasks: Session summary bullets include
[[wikilinks]]to tasks, ADRs, and notes completed or updated during the session - Tasks → devlog: Task notes get heading-linked backlinks to the specific devlog session (e.g.,
[[devlog#2026-04-01 14:30]]) when their status changes - Agent prompt broadened to cover notes "created or significantly updated" (previously only "created")
Full changelog: v3.6.1...v3.6.2
v3.6.1
Fix: SessionStart hook crash on marketplace installs
Bug: The v3.6.0 batch 4 DRY cleanup (6a4869f) replaced self-contained helper functions in hooks with imports from ../helpers.js and ../utils.js. Those modules depend on js-yaml, which isn't available when hooks run via raw node from the installed plugin directory (no node_modules).
Symptom: ERR_MODULE_NOT_FOUND: Cannot find package 'js-yaml' on every session start for marketplace-installed users.
Fix: Restored the original zero-dependency local implementations and added comment guards to prevent this regression in future refactors.
Changed
hooks/load-context.js— restored self-containedextractFrontmatter,parseHeadingLevel,extractTailSectionshooks/resolve-project.js— restored self-containedassertPathWithinVault- Both files now have comment guards explaining the no-external-dependency constraint
v3.6.0
Pre-Marketing Audit — 38 findings resolved
Comprehensive 11-agent audit followed by 8 fix batches. 530 → 573 tests, all passing.
Added
npx obsidian-pkm doctordiagnostic command — validates Node version, vault path, templates, API keys, and native dependencies- Stale VAULT_PATH detection in session-start hook — warns when settings.json differs from running server
tools.js— tool definitions extracted from index.js for clarity (index.js: 595 → 176 lines).nvmrcfile (Node 20)- Section separators in handlers.js for navigability
- 43 new tests across all modules
Changed
- README: defined MCP on first use, documented skills/commands/agents as features, clarified prebuild coverage, added test badge, video fallback, task enum docs
- CONTRIBUTING: added native prereqs, single-test examples, "add a tool" walkthrough, cli.js/init.js in architecture
- Replaced
@inquirer/promptsumbrella with 3 individual packages (10 unused subpackages removed) search()delegates tosearchRaw()(eliminated ~50 lines of duplicated pipeline)blendWithGraph()helper extracted (eliminated duplicated blending logic)- Hooks import from main modules instead of reimplementing utilities
Fixed
- 7 ENOENT handlers that leaked absolute vault paths in error messages
- Symlink following in
getAllMarkdownFiles(vault escape prevention) rewriteWikilinkscase-insensitive matching (matches Obsidian behavior)- Non-md embeds no longer reported as broken links in
vault_link_health - WAL checkpoint on shutdown (cleans up sidecar files for Obsidian Sync)
- OpenAI API error body truncated to 200 chars
DANGEROUS_KEYScheck invault_querycustom_fields- GitHub Actions pinned to SHA hashes
- Input validation:
vault_readlines param,vault_appendempty content,vault_editempty old_string note.mdtemplate default tag (was[], now[note])package-lock.jsonversion synced
Security
- Activity log data retention documented in SECURITY.md
- Symlink traversal prevention in file enumeration
- OpenAI error body truncation prevents sensitive data leakage
v3.5.1 — Create-or-update routing in PKM capture
Create-or-Update Routing
The PKM capture workflow now processes each item independently: search for existing coverage first, then route to update or create.
Fixed
- PKM capture workflow now routes each item to update-or-create independently — enriches existing notes (
vault_append/vault_edit) when a close match exists instead of always creating new ones pkm-writeStep 1 duplicate check now provides a concrete update workflow when similarity > 0.8 (was just "suggest editing")- Added task status update path (
vault_update_frontmatter) to capture workflow
Full Changelog: v3.5.0...v3.5.1
v3.5.0 — Consolidate PKM capture agents
Consolidate PKM Capture Agents
Merges devlog-updater and knowledge-sweeper into a single pkm-capture agent that handles devlog entries and knowledge capture in one pass. Removes the Stop hook that was causing UX friction during brainstorming.
Added
pkm-captureagent — single agent for devlog + knowledge capture (decisions, research, tasks, bugs), with quality checks and project memory- Quality check step in
pkm-session-endskill — reads back created notes and verifies no template placeholder text remains
Changed
- PreToolUse commit hook now references
pkm-capture(wasdevlog-updater) pkm-session-endskill updated to 6 steps (was 5) with quality check and conservatism guidance
Removed
devlog-updateragent (merged intopkm-capture)knowledge-sweeperagent (merged intopkm-capture)- Stop hook (
stop-knowledge-check.sh) — fired on every response including Q&A, causing UX friction during brainstorming sessions
Agent lineup: pkm-capture, vault-explorer, link-auditor (was 4, now 3)
Hook lineup: SessionStart, PreToolUse commit reminder (was 3, now 2)
Full Changelog: v3.4.0...v3.5.0