Skip to content

Releases

v3.10.1 — Privacy policy

Choose a tag to compare

@AdrianV101 AdrianV101 released this 03 May 15:51

Added

  • PRIVACY.md documenting 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_KEY is set (used by vault_semantic_search and graph-context vault_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

Choose a tag to compare

@AdrianV101 AdrianV101 released this 03 May 14:46

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.5 with 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 / ## References before Step 6 (vault_add_links appends, 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 resolves target by basename and silently drops #heading suffixes. Replaced with vault_append of 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_activity is a discovery aid for files-touched. Prevents re-capturing previously-documented work in long-lived MCP sessions.

pkm-explore

  • Replaced the unreachable < 0.3 minimal-coverage threshold with a read-the-top-hit + judge-topical-relevance + corroborate-with-vault_search rule. 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

Choose a tag to compare

@AdrianV101 AdrianV101 released this 30 Apr 23:24

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, the vault_read auto-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. The obsidianLink(filePath, vaultName) helper does the encoding (percent-encoded / → %2F, spaces → %20, trailing .md stripped from the URL but kept in link text).
  • VAULT_PKM_VAULT_NAME env var. Overrides the default vault name used in obsidian:// links. Defaults to path.basename(VAULT_PATH). Set this when your on-disk vault folder name differs from the vault name registered in Obsidian.
  • init-project writes 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 in sample-project/CLAUDE.md.

Changed

  • All vault tool descriptions now include a LINK_FORMAT_NOTE instructing 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 as path arguments.
  • formatPeek, formatNeighborhood, and embeddings.search() accept an optional formatPath callback 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

Choose a tag to compare

@AdrianV101 AdrianV101 released this 28 Apr 00:37

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

Choose a tag to compare

@AdrianV101 AdrianV101 released this 21 Apr 14:36

Changed

  • Plugin identity renamed from obsidian-pkm to vault-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 under mcp__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:
    claude plugin marketplace add anthropics/claude-plugins-community
    claude plugin install vault-pkm@claude-community
    
    The previous personal-marketplace install path is no longer documented, and .claude-plugin/marketplace.json has been removed.
  • Env var renamed to VAULT_PKM_OPENAI_KEY (was OBSIDIAN_PKM_OPENAI_KEY). A fallback chain keeps reading the old name and OPENAI_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 and npx obsidian-pkm bin 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:

  1. Uninstall the old plugin: claude plugin uninstall obsidian-pkm@<your-current-marketplace>.
  2. Install from the community marketplace (commands above).
  3. Rename your env var in ~/.claude/settings.json from OBSIDIAN_PKM_OPENAI_KEY to VAULT_PKM_OPENAI_KEY (old name still works, but is deprecated).
  4. Permission entries (mcp__plugin_vault-pkm_vault-pkm__*) will need re-granting on first tool use after the rename.
  5. 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

Choose a tag to compare

@AdrianV101 AdrianV101 released this 01 Apr 10:53

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

Choose a tag to compare

@AdrianV101 AdrianV101 released this 31 Mar 16:22

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-contained extractFrontmatter, parseHeadingLevel, extractTailSections
  • hooks/resolve-project.js — restored self-contained assertPathWithinVault
  • Both files now have comment guards explaining the no-external-dependency constraint

v3.6.0

Choose a tag to compare

@AdrianV101 AdrianV101 released this 31 Mar 14:36

Pre-Marketing Audit — 38 findings resolved

Comprehensive 11-agent audit followed by 8 fix batches. 530 → 573 tests, all passing.

Added

  • npx obsidian-pkm doctor diagnostic 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)
  • .nvmrc file (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/prompts umbrella with 3 individual packages (10 unused subpackages removed)
  • search() delegates to searchRaw() (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)
  • rewriteWikilinks case-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_KEYS check in vault_query custom_fields
  • GitHub Actions pinned to SHA hashes
  • Input validation: vault_read lines param, vault_append empty content, vault_edit empty old_string
  • note.md template default tag (was [], now [note])
  • package-lock.json version 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

Choose a tag to compare

@AdrianV101 AdrianV101 released this 30 Mar 15:15

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-write Step 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

Choose a tag to compare

@AdrianV101 AdrianV101 released this 30 Mar 14:58

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-capture agent — single agent for devlog + knowledge capture (decisions, research, tasks, bugs), with quality checks and project memory
  • Quality check step in pkm-session-end skill — reads back created notes and verifies no template placeholder text remains

Changed

  • PreToolUse commit hook now references pkm-capture (was devlog-updater)
  • pkm-session-end skill updated to 6 steps (was 5) with quality check and conservatism guidance

Removed

  • devlog-updater agent (merged into pkm-capture)
  • knowledge-sweeper agent (merged into pkm-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