Generated banner for obsidian-mind
Generated logo for obsidian-mind

obsidian-mind

Vault template

First committed by breferrari

Published in breferrari/obsidian-mind. Publisher page

5,527 GitHub stars

What it is

A self-organizing Obsidian vault that gives AI coding agents persistent memory.
— the description by breferrari

AutoGineer overview, from the brain’s own files

Obsidian Mind transforms an Obsidian vault into a persistent, structured brain for AI coding agents like Claude Code, Codex, and Gemini CLI. It solves the problem of agent amnesia by maintaining a hybrid memory model that combines file-based storage with semantic search capabilities. The system uses a set of lifecycle hooks to manage agent context, including project status, meeting notes, decisions, and performance tracking. By leveraging a structured folder hierarchy and automated indexing, it ensures that agents can recall past decisions, track project progress, and maintain context across sessions. The vault is designed to be self-maintaining, with automated hygiene checks and routing logic that keeps the knowledge base organized as it grows.

How it works

Memory model: Hybrid

AutoGineer overview, from the brain’s own files

The system uses a combination of Obsidian markdown files for storage and procedural hooks for management. Lifecycle hooks handle tasks like session initialization, content classification, and vault hygiene. The vault is organized into specific folders for work, performance, organizational data, and agent-specific knowledge. Semantic search is provided via an optional QMD integration, which uses local models to index and retrieve information. Agents interact with the vault through commands and MCP tools, allowing them to read, write, and update notes while the underlying scripts ensure that the vault remains structured and linked.

Folders
FolderRoleFiles
.claudeagent-config230
.codexagent-config1
.geminiagent-config21
.githubagent-config11
.obsidianobsidian-config1
brainmemory6
templatestemplates5
.claude-pluginfolder2
.scriptsfolder3
.shardmindfolder6
basesfolder9
orgfolder3
perffolder4
referencefolder1
thinkingfolder1
workfolder6

The agent reads

The agent writes

Requirements

Apps: Obsidian

Databases: Redis, SQLite

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Google Antigravity, Kiro, OpenCode, Amp, Roo Code, Cline, JetBrains Junie, Devin (ex-Windsurf)

Set it up

  1. This brain runs code automatically: 14 hooks (claude-code, codex, gemini-cli). Review .claude/settings.json, .codex/hooks.json, .gemini/settings.json before opening the folder in Claude Code. No step below turns a hook on for you.

    • .claude/settings.json: node --disable-warning=ExperimentalWarning --experimental-strip-types "$(r="${CLAUDE_PROJECT_DIR:-.}"; d="$r"; while [ ! -f "$d/vault-manifest.json" ] && p="$(dirname "$d")" && [ "$d" != "$p" ]; do d="$p"; done; [ -f "$d/vault-manifest.json" ] || d="$r"; printf %s "$d")/.claude/scripts/ …[+17 chars]
    • .claude/settings.json: node --disable-warning=ExperimentalWarning --experimental-strip-types "$(r="${CLAUDE_PROJECT_DIR:-.}"; d="$r"; while [ ! -f "$d/vault-manifest.json" ] && p="$(dirname "$d")" && [ "$d" != "$p" ]; do d="$p"; done; [ -f "$d/vault-manifest.json" ] || d="$r"; printf %s "$d")/.claude/scripts/ …[+20 chars]
    • .claude/settings.json: node --disable-warning=ExperimentalWarning --experimental-strip-types "$(r="${CLAUDE_PROJECT_DIR:-.}"; d="$r"; while [ ! -f "$d/vault-manifest.json" ] && p="$(dirname "$d")" && [ "$d" != "$p" ]; do d="$p"; done; [ -f "$d/vault-manifest.json" ] || d="$r"; printf %s "$d")/.claude/scripts/ …[+18 chars]
    • .claude/settings.json: node --disable-warning=ExperimentalWarning --experimental-strip-types "$(r="${CLAUDE_PROJECT_DIR:-.}"; d="$r"; while [ ! -f "$d/vault-manifest.json" ] && p="$(dirname "$d")" && [ "$d" != "$p" ]; do d="$p"; done; [ -f "$d/vault-manifest.json" ] || d="$r"; printf %s "$d")/.claude/scripts/ …[+15 chars]
    • .claude/settings.json: node --disable-warning=ExperimentalWarning --experimental-strip-types "$(r="${CLAUDE_PROJECT_DIR:-.}"; d="$r"; while [ ! -f "$d/vault-manifest.json" ] && p="$(dirname "$d")" && [ "$d" != "$p" ]; do d="$p"; done; [ -f "$d/vault-manifest.json" ] || d="$r"; printf %s "$d")/.claude/scripts/ …[+18 chars]
    • .codex/hooks.json: node --disable-warning=ExperimentalWarning --experimental-strip-types "${CODEX_PROJECT_DIR:-.}/.claude/scripts/session-start.ts"
    • .codex/hooks.json: node --disable-warning=ExperimentalWarning --experimental-strip-types "${CODEX_PROJECT_DIR:-.}/.claude/scripts/classify-message.ts"
    • .codex/hooks.json: node --disable-warning=ExperimentalWarning --experimental-strip-types "${CODEX_PROJECT_DIR:-.}/.claude/scripts/validate-write.ts"
    • .codex/hooks.json: node --disable-warning=ExperimentalWarning --experimental-strip-types "${CODEX_PROJECT_DIR:-.}/.claude/scripts/stop-checklist.ts"
    • .gemini/settings.json: node --disable-warning=ExperimentalWarning --experimental-strip-types .claude/scripts/session-start.ts
    • .gemini/settings.json: node --disable-warning=ExperimentalWarning --experimental-strip-types .claude/scripts/classify-message.ts
    • .gemini/settings.json: node --disable-warning=ExperimentalWarning --experimental-strip-types .claude/scripts/validate-write.ts
    • .gemini/settings.json: node --disable-warning=ExperimentalWarning --experimental-strip-types .claude/scripts/pre-compact.ts
    • .gemini/settings.json: node --disable-warning=ExperimentalWarning --experimental-strip-types .claude/scripts/stop-checklist.ts
  2. Clone the repository at the commit AutoGineer scanned:

    git clone https://github.com/breferrari/obsidian-mind.git && cd obsidian-mind && git checkout fae7be467fc5e23bf9d51df7207d41f0c07e2754
  3. In Obsidian, choose “Open folder as vault” and pick the folder.

  4. Point Claude Code at .claude-plugin/marketplace.json: it does not read that file on its own.

  5. cd obsidian-mind && claude

  6. AutoGineer scanned these files at commit fae7be4.

  7. Not scanned by AutoGineerThe author’s MCP configuration (README.md) also starts it in a way AutoGineer does not offer. Read that file: AutoGineer did not scan that path; what it runs is listed under “This brain runs”. https://github.com/breferrari/obsidian-mind/blob/fae7be467fc5e23bf9d51df7207d41f0c07e2754/README.md
  8. Not scanned by AutoGineerThe author’s README also describes installing it from a clone of its repository. Read its install section: AutoGineer did not scan that path. https://github.com/breferrari/obsidian-mind/blob/fae7be467fc5e23bf9d51df7207d41f0c07e2754/README.md#-install-via-shardmind-recommended
  9. Not scanned by AutoGineerThe author also offers https://github.com/breferrari/obsidian-mind/tree/fae7be467fc5e23bf9d51df7207d41f0c07e2754. https://github.com/breferrari/obsidian-mind/tree/fae7be467fc5e23bf9d51df7207d41f0c07e2754
  10. First committed by breferrari. Published in breferrari/obsidian-mind. Licence: MIT License.

Usage

AutoGineer overview, from the brain’s own files

  • Start a new session to load project context and North Star goals.
  • Capture meeting takeaways and decisions using automated commands.
  • Query the vault for past decisions or project history using semantic search.
  • Perform end-of-day wrap-ups to index new notes and identify uncaptured wins.
  • Manage incident response and documentation within the vault structure.
  • Maintain performance records and brag documents for review cycles.
“/om-standup”
The agent loads the North Star goals, active projects, and recent tasks to provide a summary of current work status.
“/om-dump Just had a 1:1 with Sarah. She wants error monitoring added before release.”
The agent updates the person note for Sarah, creates a meeting record, and adds an error monitoring task to the active project note.
“What did we decide about caching?”
The agent uses semantic search to retrieve the specific decision record regarding the Redis migration.
“wrap up”
The agent verifies note links, updates indexes, and identifies uncaptured wins for the brag document.

Documentation by breferrari

🌐 English | 日本語 | 中文 | 한국어

<p align="center"> <img src="obsidian-mind-logo.png" alt="Obsidian Mind" width="120"> </p>

<h1 align="center">Obsidian Mind</h1>

Image: Claude Code Image: Codex CLI Image: Gemini CLI Image: Obsidian Image: Obsidian CLI Image: Obsidian Skills Image: QMD Image: Node Image: License

An Obsidian vault that gives AI coding agents persistent memory. Built for Claude Code, with working hooks for Codex CLI and Gemini CLI. Start a session, talk about your day, and the agent handles the rest — notes, links, indexes, performance tracking. Every conversation builds on the last.


🔴 The Problem

AI coding agents are powerful, but they forget. Every session starts from zero — no context on your goals, your team, your patterns, your wins. You re-explain the same things. You lose decisions made three conversations ago. The knowledge never compounds.

🟢 The Solution

Give your agent a brain.

You: "start session"
Agent: *reads North Star, checks active projects, scans recent memories*
Agent: "You're working on Project Alpha, blocked on the BE contract.
        Last session you decided to split the coordinator. Your 1:1
        with your manager is tomorrow — review brief is ready."

Works with Claude Code (full support), Codex CLI, and Gemini CLI — same hooks, same commands, same vault.

Install via shardmind install or git clone — same vault either way.


⚡ See It In Action

<p align="center"> <img src="obsidian-mind-demo.gif" alt="Obsidian Mind demo — standup and dump commands" width="800"> </p>

Morning kickoff:

/om-standup
# → loads North Star, active projects, open tasks, recent git changes
# → "You have 2 active projects. The auth refactor is blocked on API contract.
#    Your 1:1 with Sarah is at 2pm — last time she flagged observability."

Brain dump after a meeting:

/om-dump Just had a 1:1 with Sarah. She's happy with the auth work but wants
us to add error monitoring before release. Also, Tom mentioned the cache
migration is deferred to Q2 — we decided to focus on the API contract first.
Decision: defer Redis migration. Win: Sarah praised the auth architecture.
→ Updated org/people/Sarah Chen.md with meeting context
→ Created work/1-1/Sarah 2026-03-26.md with key takeaways
→ Created Decision Record: "Defer Redis migration to Q2"
→ Added to perf/Brag Doc.md: "Auth architecture praised by manager"
→ Updated work/active/Auth Refactor.md with error monitoring task

Incident response:

/om-incident-capture https://slack.com/archives/C0INCIDENT/p123456
# → slack-archaeologist reads every message, thread, and profile
# → people-profiler creates notes for new people involved
# → Full timeline, root cause analysis, brag doc entry

End of day:

You: "wrap up"
# → verifies all notes have links
# → updates indexes
# → brag-spotter finds uncaptured wins
# → suggests improvements

🚀 Quick Start

npm install -g shardmind
mkdir my-vault && cd my-vault
shardmind install github:breferrari/obsidian-mind

shardmind install writes into the current directory, so create and enter a fresh folder first. The wizard collects your name, organization, vault purpose, agents to include, and whether to enable QMD; ShardMind then initializes git, optionally bootstraps QMD, and personalizes brain/North Star.md with your answers. Then:

  1. Open the installed folder as an Obsidian vault

  2. Enable the Obsidian CLI in Settings → General (requires Obsidian 1.12+)

  3. Run your agent in the vault directory: claude, codex, or gemini. Codex runs the vault's hooks only once the folder is trusted and each hook approved: see Using with Other Agents.

  4. Start talking about work

ShardMind is the package manager for Obsidian vault templates. The install adds a .shardmind/ sidecar that powers the wizard, optional modules (skip what you don't use), and three-way-merge upgrades. With every value at its default the install is byte-equivalent to git clone — clone-UX is preserved exactly. Delete .shardmind/ and shard-values.yaml from the installed vault and it keeps working: ShardMind is additive, not load-bearing.

Or clone directly
git clone https://github.com/breferrari/obsidian-mind.git

Or use it as a GitHub template. Skip the wizard, get the bare template. Then run through the same 4 steps above, plus fill in brain/North Star.md with your goals (the ShardMind wizard does this for you).

QMD is where most of the agent's retrieval intelligence comes from. Optional in the strict sense — the vault falls back to grep + the Obsidian CLI — but the experience is meaningfully better with it:

  • Semantic recall. Find "what did we decide about caching" even when the note is titled "Redis Migration ADR."

  • Brain topics available on demand. Your agent is instructed (via AGENTS.md, which points to .claude/rules/brain-topics.md) to consult brain/ guidance through QMD when the conversation touches a listed topic.

  • Subagents get sharper context. context-loader, review-prep, brag-spotter, and friends consult QMD first, then fall back to grep.

  • Native agent tools via MCP. Registered as a Model Context Protocol server in .mcp.json — when QMD is installed, mcp__qmd__query, mcp__qmd__get, and mcp__qmd__multi_get appear in the agent's tool menu alongside Read and Edit. Subagents, slash commands, and the main conversation all call the same typed contract. Add another MCP-aware tool later (a database, a ticketing system, a calendar) and it plugs in the same way.

npm install -g @tobilu/qmd
node --experimental-strip-types .scripts/qmd-bootstrap.ts

The bootstrap is idempotent — safe to re-run. It resolves this vault's index name — the qmd_index field from vault-manifest.json when set, otherwise the vault folder name slugified — reads qmd_context, registers the collection, attaches the context, and builds the index + embeddings. The SessionStart hook and .mcp.json wrapper both read the same manifest field, so CLI queries, the MCP server, and the re-index all scope to the same named SQLite store. This isolates the vault from any other QMD-using vault on the same machine.

If you want to use a different index name (for example, one vault per engineer on a shared workstation), edit qmd_index in vault-manifest.json before running the bootstrap. Once the store is populated, always pass --index <name> to the CLI:

qmd --index obsidian-mind query "what did we decide about caching"
qmd --index obsidian-mind update   # after bulk edits
qmd --index obsidian-mind embed    # after many new notes
How it works under the hood

QMD runs three small models locally, so there is no API key to set up, no per-query cost, and it works offline:

modelsizejob
embeddinggemma-300M~328MBturns notes and queries into vectors
qmd-query-expansion-1.7B~1.28GBrewrites your query into better search terms
Qwen3-Reranker-0.6B~640MBreorders the shortlist by actual relevance

They download on first use and are cached. QMD offloads to the GPU when it finds one — CUDA on a discrete card, Metal on Apple Silicon — and falls back to CPU otherwise. Check what yours is doing with qmd doctor.

Use qmd 2.5.1 or later. In 2.1, qmd status probes the GPU, and on a machine without one that can take several seconds (4 to 37 s on CI runners, measured 2026-10-13, #349). SessionStart's self-heal reads qmd status under a 5-second limit, so a status that times out leaves it unable to see a broken install.

The three CLI verbs map onto that stack, cheapest first: qmd search is BM25 keywords with no model at all, qmd vsearch is vector-only, and qmd query is the full hybrid. If you want to avoid the larger downloads, search alone is genuinely useful.

What that means for the MCP server

The om server sends a lexical and a vector sub-query, so retrieval finds the note that answers your question even when it shares no keywords with it. Practical consequences worth knowing:

  • Reads are the expensive side, not writes. A query embeds locally before it can search, so recall with a query takes a couple of seconds while recall without one is near-instant. search over notes is fast — it is the vector step that costs.

  • Writing a memory does not wait for the model. The index update is synchronous, so a new memory is immediately retrievable; generating its vector happens in the background, because that only affects where it ranks, not whether it is found.

  • No index, no problem. Without QMD the server falls back to lexical matching. Ordering gets worse; nothing disappears.

NOTE
If QMD isn't installed, everything still works — the agent falls back to grep and the Obsidian CLI, and the MCP server entry is skipped with a harmless warning.


📋 Requirements

  • Obsidian 1.12+ (for CLI support)

  • An AI coding agent: Claude Code (full support), Codex CLI, or Gemini CLI

  • Node 22+ LTS (for hook scripts — typically already installed alongside Claude Code / Codex / Gemini CLI)

  • Git (for version history)

  • QMD (optional, for semantic search)

Note on the Node flag. Hook scripts execute TypeScript directly via Node's --experimental-strip-types flag, stable in Node 22.6+ (Aug 2024) and the default behaviour in Node 23.6+. The flag is marked experimental but has been unchanged across 22 LTS and 24 LTS; if a future Node release retires or renames it, hook commands in .claude/settings.json, .codex/hooks.json, and .gemini/settings.json need a one-line update.


⚙️ How It Works

Procedural code owns the environment. The agent owns content. The hooks in .claude/scripts/ handle classification, validation, indexing, and lifecycle injection — deterministic, testable, runs the same for every agent. Writing notes, filing them, linking them, drafting briefs — those are judgments, and they stay with the agent. The two halves meet at small handoffs (hooks inject context, agent reads the vault) so neither has to do the other's job.

Folders group by purpose. Links group by meaning. A note lives in one folder (its home) but links to many notes (its context). Your agent maintains this graph — linking work notes to people, decisions, and competencies automatically. When review season arrives, the backlinks on each competency note are already the evidence trail. A note without links is a bug.

Vault-first memory keeps context across sessions and machines. All durable knowledge lives in brain/ topic notes (git-tracked, Obsidian-browsable, linked). Claude Code's MEMORY.md (~/.claude/) is an auto-loaded index that points to vault locations — never the storage itself. This means memories survive machine changes and are part of the graph.

Sessions have a designed lifecycle. The SessionStart hook auto-injects your North Star goals, active projects, recent changes, open tasks, and the full vault file listing — your agent starts every session with context, not a blank slate. At the end, say "wrap up" and the agent runs /om-wrap-up — verifying notes, updating indexes, and spotting uncaptured wins. The AGENTS.md operating manual governs everything in between: where to file things, how to link, when to split a note, what to do with decisions and incidents.

🔗 Hooks

The lifecycle hooks handle routing automatically:

HookWhenWhat
🚀 SessionStartOn startup/resumeQMD re-index + self-heal, inject North Star focus, active work, recent changes, tasks, file listing, vault-hygiene drift flags — held under a byte budget that fits Claude Code's hook output cap, ending with an injection-size meter
💬 UserPromptSubmitEvery messageClassifies content (decision, incident, win, 1:1, architecture, person, project update) and injects routing hints; also hands the agent the Stop report from the previous turn
✍️ PostToolUseAfter writing .mdValidates frontmatter + wikilinks, blocks misplaced memory files, flags oversized notes (split, don't trim) and write-time topic clusters
💾 PreCompactBefore context compactionBacks up session transcript to thinking/session-logs/
🏁 StopAfter every responseChecklist + concrete drift findings (same hygiene scan as SessionStart), shown once per session and again only when they change: you see a short summary, one line per section, and the agent gets the full report with your next message and decides whether to act; hands drift to om-tidy

TIP
You just talk. The hooks handle the routing.

🧩 The Claude Code mod

On Claude Code 2.1.287 or later, the vault also ships a mod: .claude/skills/obsidian-mind/, a plugin whose code runs inside Claude Code. It runs the vault's own hook scripts and changes only how their output reaches the session:

  • Session context arrives as an instruction file, the way AGENTS.md does. It is re-read whole after compaction and /clear (as hook output it shrinks to a pointer), it reaches general-purpose subagents (hook output never does), and it is not cut at Claude Code's 10,000-character hook limit. Its budget is eager_layer_instruction_budget_bytes in vault-manifest.json; sections that never shrink, such as open tasks, can still take it past that. /memory lists it as .claude/session-context.md.

  • The Stop report becomes one line under the answer. When the findings change you see a line beneath Claude's reply, starting with the mod's name — obsidian-mind: vault check: …. Claude Code joins the names of the plugins that answered on Stop with +, so when another plugin also answers, the label reads obsidian-mind+<plugin>: vault check: …. Claude gets the full report with your next message, unseen. A finding marked urgent gets Claude's attention at once instead, once per message you send (a second one waits inside the report); the template's own report has none.

For each event it handles, the mod tells the matching hook to stand down. Wherever the mod does not load, the hooks run exactly as before: Codex and Gemini, older Claude Code, a session started in a vault subfolder (launch from the vault root, or /cd there and /clear), or a folder you have not trusted. It loads only after you accept Claude Code's trust prompt for the vault.

A mod is unsandboxed code that runs with your permissions, so check what it does before trusting the folder: claude plugin validate .claude/skills/obsidian-mind lists every event it hooks and every call it makes (it runs the vault's own scripts, writes the context file, remembers in its own store which report each session was shown, and can submit a prompt for an urgent finding, nothing else). To turn it off, add "enabledPlugins": { "obsidian-mind@skills-dir": false } to .claude/settings.local.json.

<!-- mod-validate:start -->

The two lines that matter in its output, for this version of the mod:

  ❯ ./register.ts hooks: classic.SessionStart, prompt.context, classic.Stop, turn.complete, prompt.submit, turn.start
  ❯ ./register.ts calls: $.fs.write, $.process.run (via runScript), $.prompt.submit, $.session.root, $.state.get, $.state.set, $.store.get (via setShown, shownFor), $.store.set (via setShown), $.ui.invalidate

<!-- mod-validate:end -->

⚡ Token Efficiency

obsidian-mind does not dump your entire vault into context. It uses tiered loading to keep token costs low:

TierWhatWhenCost
AlwaysAGENTS.md (plus .claude/rules/ on Claude Code) + SessionStart context (North Star excerpt, git summary, tasks, vault file listing)Session startcapped by the manifest budget, itself held under Claude Code's 10,000-character hook output cap; the meter reports the real size every session
On-demandQMD semantic search resultsWhen the agent needs specific contextTargeted
TriggeredClassification routing hintsEvery message~100 tokens
TriggeredPostToolUse validationAfter .md writes~200 tokens
RareFull file readsOnly when explicitly neededVariable

SessionStart loads lightweight context — small excerpts from key files, filenames, and git summary — not full note contents. Five mechanisms keep the eager layer honest as the vault grows: source-aware injection (resume/compact re-inject only volatile sections — the static bulk is already in-conversation), an injection-size meter as the last line of every injection (you always see what context costs), an injection budget that enforces what the meter measures (over the ceiling, the cheapest-to-lose sections degrade to pointers — and the meter names every one it dropped, because a silent loss is worse than the bloat), a single hook spawn per write (the QMD refresh rides the validation hook), and listing collapse (any folder past a note-count threshold folds to one count line, so a vault can't outgrow the ceiling through whichever folder nobody thought to configure). Both the budget and the threshold are tunable in vault-manifest.json, and the budget is held under Claude Code's 10,000-character hook output cap whatever it is set to, because past the cap a session receives only a 2,000-character preview. The agent queries by meaning via QMD before reading files, so it pulls only what's relevant. The classification hook is one lightweight Node call per message. The validation hook only fires on markdown writes and skips excluded paths.

🌐 Using with Other Agents

obsidian-mind works with Claude Code, Codex CLI, Gemini CLI, Antigravity and Grok. Every agent reads one instruction file, AGENTS.md. The hook scripts in .claude/scripts/ and the commands in .claude/commands/ are agent-agnostic — pure Markdown, TypeScript, and shell with no SDK dependencies. .claude/rules/ holds guidance only Claude Code can use (its skills, subagents, auto-memory index, hooks and mod), and the sections AGENTS.md moved out to stay under its size cap. Claude Code and Grok load every file there at session start, so Claude keeps the whole manual; the other agents read a moved section when AGENTS.md points them to it.

AgentReads AGENTS.mdFrom a vault subfolderAlso loadsKnown gaps
Claude CodeNatively, when no CLAUDE.md is presentYes, but @ imports are dropped (upstream).claude/rules/*.mdA CLAUDE.md beside or above AGENTS.md is read instead, silently: see Troubleshooting
Codex CLINativelyYes (walks up to the git root)—Stops reading past ~32 KiB, silently
Gemini CLIThrough .gemini/settings.json (context.fileName)No: see Troubleshooting—What a live session does with it is not yet observed (TBC)
AntigravityNativelyYes— (not .claude/rules/, not CLAUDE.md)Stops reading past ~24,000 bytes, silently. Has a workspace-trust dialog; whether it gates AGENTS.md is TBC (a headless -p run loaded it in a never-opened folder). Its .agents/ manifests are not exercised here (TBC)
GrokOnce the folder is trustedYes, once trusted.claude/rules/*.md and CLAUDE.md, plus project .claude/settings.json hooks and user-level ~/.claude skills, permissions and hooksAn untrusted folder gets no project instructions at all: see Troubleshooting

Observed with scratch vaults as of 2026-10-06 (Claude Code 2.1.291, Codex CLI 0.160.0, Gemini CLI 0.37.1 discovery log, Antigravity 1.3.0, Grok 1.0.46); the measurements are in #321. A test keeps AGENTS.md under 22,000 bytes, so no agent cuts it off.

Claude Code — full support. Hooks, commands, subagents, and the memory system all work out of the box.

Codex CLI — hook config at .codex/hooks.json wires the same hook scripts Claude Code uses — session context, message classification, and write validation work automatically. Commands work as regular prompts (e.g. type om-standup without the / prefix).

Codex runs a project's hooks only once two kinds of trust are in place (observed with Codex CLI 0.160.0 as of 2026-10-13, #345):

  • The vault folder is trusted. Codex records this in ~/.codex/config.toml under [projects.'<path>']. On Windows the key is the \\?\-prefixed path, e.g. [projects.'\\?\C:\path\to\vault'].

  • Each hook is approved. Codex stores each approval as a trusted_hash under [hooks.state]. Approving them in an interactive codex session is expected to write these (inferred: the #345 check stood in for them with --dangerously-bypass-hook-trust, a flag for one non-interactive run).

Until both are in place, Codex runs no hook, and the session gets no vault context.

Gemini CLI — hook config at .gemini/settings.json maps Gemini's event names to the shared hook scripts, and its context.fileName setting points Gemini at AGENTS.md. Gemini reads custom commands only as TOML, so .gemini/commands/ holds a generated wrapper per command that injects the command's .md (node --experimental-strip-types .scripts/gemini-commands.ts regenerates them).

Antigravity and Grok — read AGENTS.md for vault conventions. Their hook, skill and command layers are tracked in #322 and #323.

Other agents (Cursor, Windsurf, GitHub Copilot, JetBrains AI) — read AGENTS.md for vault conventions. Hook support varies by agent.

NOTE
Hooks, commands, subagent prompts, and vault memory (brain/) are all agent-agnostic. Only the ~/.claude/ auto-memory loader and the obsidian-mind mod are Claude Code-specific. .claude/rules/hooks-per-agent.md maps each hook to each agent's event.


🧠 Reach Your Vault From Any Repo

Your vault normally only helps while you are sitting in it. The om MCP server changes that: a coding session in any other repository can search your notes, read them, follow the graph, and record what it learned back into the vault.

Step 1 — register the server once, for every repo
claude mcp add --scope user om node "/absolute/path/to/your-vault/.claude/scripts/om-mcp.mjs"

User scope is the right default here: it registers in your own config, so the server is available in every directory on the machine with nothing added to any repository. No env var is needed either, because the launcher resolves the vault from its own location.

<details> <summary>Per-repo alternative, and one trap to avoid</summary>

If you would rather a specific repo carry the wiring (so a teammate gets it on clone), put it in that project's .mcp.json:

{
  "mcpServers": {
    "om": {
      "command": "node",
      "args": ["/absolute/path/to/your-vault/.claude/scripts/om-mcp.mjs"]
    }
  }
}

Note the cost: that path is absolute and machine-specific, so committing it breaks every collaborator and every other machine of yours.

Use an absolute path, and do not copy the relative one. This vault's own .mcp.json registers qmd with a relative path (.claude/scripts/qmd-mcp.mjs). That is correct there, because a relative path resolves against the current working directory and a session in the vault is already in it. Reused for om in a consuming project, the same shape silently resolves against that project instead, and the server never starts.

</details>

Step 2 — point the consuming project at the vault

Add this to that project's own instruction file (CLAUDE.md or AGENTS.md), filling in the triggers:

## Where design decisions live

Design rationale for this project is recorded outside this repo, reachable
through the `om` MCP server.

- **`search`** reaches the written record: why a choice was made, what was
  rejected, what a constraint was set against. **Start here.**
- **`expand`** shows a known note's links and backlinks, which is cheaper than
  searching again for its neighbourhood.
- **`recall`** returns short durable lessons scoped to this project. It is empty
  until sessions put things in it, so early on it returns nothing, and that is
  *not* evidence the record is missing.
- **`health`** when something that should be there cannot be found. Every failure
  in this layer looks identical from outside (no results), and this tells them
  apart.

Consult the record before changing:

- <the storage format or schema>
- <the ID or key semantics>
- <the public surface: CLI flags, API shape, exported names>

If that record and this repo disagree, the record holds the *why*. Reconcile
before changing behaviour.

**Say what came back, in whatever you write before implementing:** a plan, a
design note, an issue comment. Name the recorded decisions the work rests on,
anything you found that argues *against* the approach, and an explicit "nothing
recorded on this" when the record is empty, which is a finding rather than a
blank to skip. Consulting once at the start of a task is consulting at the
moment you know least about what you will need; writing the result down moves it
to the moment you commit, while a contradiction is still free to fix.

## Recording what you learn

Two tools, and picking the wrong one is the common mistake. The test is whether
it would help someone working on a **different** project.

- **`remember`** stores a durable lesson: a constraint you discovered, a gotcha
  that cost time, a rule that generalises. Set `confidence`
  (`verified` / `inferred` / `unverified`) honestly and supply `verification`
  when you claim `verified`. For something specific to this project use
  `scope: "project"` with `projects: ["<this-repo>"]`. Reach for
  `scope: "platform"` before `"general"`: a dependency's quirk or a language's
  rule is platform-level however hard-won, and `general` claims it would help
  someone whose stack shares nothing with yours. When you do claim `general`,
  supply `generality` saying why, the same way `verification` backs `verified`.
- **`record_work`** files what happened *here*: changes, decisions and the
  alternatives rejected, what was learned, what is still open, how it was
  verified.

A dependency limitation that would bite any project is a `remember`. "Landed the
watch engine and here is what it cost" is a `record_work`. Do both when both are
true.

Three to five triggers, and name specific nouns. Consult it before changing the storage format, ID semantics, or the CLI surface works. Check the vault for context is exactly the advisory phrasing that gets skipped, because it gives the model nothing to match against the task in front of it.

Anchor the consultation to an artifact, not to a moment. "Consult before changing X" fires once, at the start of a task, which is when the session knows least about what it will need. Requiring the result to appear in whatever the project writes before implementing turns consultation from something a session intends to do into something an artifact is incomplete without. Measured across a day of real use: captures ran roughly four times heavier than consultations, because remember fires on an event (you just learned something) while consulting fires on intention. Event-triggered behaviour happens; intention-triggered behaviour decays.

TIP
Do not lead with recall. It returns memories, and the store is empty on a project's first session by construction: remember refuses when called from inside the vault, since a memory written there would be scoped to the vault and reach nobody. So memories only ever arrive from outside. A snippet that promises recall will return this project's decisions therefore returns nothing on the first run, and fails silently as "no results" rather than as an error.

IMPORTANT
Both steps are required, and the second is not paperwork. Measured: with the server wired and no repo-side instruction, a session made zero vault calls and implemented a design the vault had recorded as explicitly rejected. With the instruction present, it refused and cited the note.

A prohibition in the MCP instructions field propagates into the calling session reliably. A positive "go consult the vault" is advisory and gets skipped whenever a nearer source exists. The server can stop a session doing something; only the project's own law makes one go looking.

That asymmetry decides which side a rule belongs on, and it matters most for anything you would rather not advertise. Writing "this repo deliberately excludes X" into a public repo announces the withholding and points at exactly what is being withheld. The same rule as a prohibition in instructions reaches every session invisibly, and the repo says nothing at all. Routing belongs repo-side because it has to; constraints belong server-side because they can.

What the session gets: search (semantic + keyword), expand (a note's links and backlinks), recall (durable lessons scoped to that repo), remember (record a lesson), record_work (file what happened), reason (judgement across several notes), and health (is the wiring intact?). Plus your notes as readable resources.

reason is the one that thinks. The others retrieve; this one reads the vault with a second Claude session and answers questions that need judgement across notes — is what I am about to do consistent with what these six notes decided? It seeds itself from search, so you never have to search first. It runs on your own CLI default model, so the vault answers at the level you are already working at, and nothing about it is capped: it is Claude, on your machine, under your auth. Every call is logged with its cost, turns, model and wall time. Its answers are marked confidence: inferred and are never recorded as memories on their own — your session decides whether any of it is worth keeping.

Repos are identified by folder name, which is right until it isn't — two repos both called api share one identity and therefore each other's memories. Drop a .om-project file with a distinct name at the repo root to separate them; health tells you which repo it thinks is calling and where that name came from.

Cross-repo memory with an epistemic contract. A lesson learned in one repo reaches the repos it was scoped to and no others. Reach is declared at write time, never guessed at read time, so a sibling project does not inherit another's constraints. Everything recorded carries confidence: verified | inferred | unverified, dated volatile facts, and provenance derived server-side — a session cannot claim to be a project it is not. Corrections supersede rather than overwrite, so the store gets more trustworthy as it grows instead of accumulating contradictions.

Which notes it serves. Your vault, your notes, your session — the default is simply what your vault already declares as your content (user_content_roots), at the granularity you wrote it (work/active/, not all of work/). Set mcp_exposed_roots in vault-manifest.json only if this vault holds material that is not yours to share — employer-confidential notes, a client's data. A note tagged private is never served, and memories are never served as ordinary notes, since they carry their own scope. One case reads across the two: when a capture's promoted: marker carries an anchor, recall serves that block out of brain/ so a foreign repo gets the corrected version rather than the capture as first written — bounded by this same policy, so a private or withheld note is refused there too.

Every read is logged with the calling repo, so "what did that session actually see" is answerable afterwards.

NOTE
Keeping vault material out of a public PR is the contract's job, not the exposure list's — a session can read your vault directly regardless. The prohibition injected into the calling session is the part that measurably holds.

Want the mechanics? ARCHITECTURE.md → Reaching the Vault From Another Repo walks the whole layer with diagrams: the four MCP surfaces and why the non-tool ones matter, the identity handshake, a search call traced end to end, how each memory's reach is evaluated, the write path, and every failure mode against the signal that reveals it.


📅 Daily Workflow

Morning: Run /om-standup. Your agent loads your North Star, active projects, open tasks, and recent changes. You get a structured summary and suggested priorities.

Throughout the day: Talk naturally. Mention a decision you made, an incident that happened, a 1:1 you just had, a win you want to remember. The classification hook nudges the agent to file each piece correctly. For bigger brain dumps, use /om-dump and narrate everything at once.

End of day: Say "wrap up" and the agent invokes /om-wrap-up — verifies notes, updates indexes, checks links, spots uncaptured wins.

Weekly: Run /om-weekly for cross-session synthesis — North Star alignment, patterns, uncaptured wins, and next-week priorities. Run /om-vault-audit to catch orphan notes, broken links, and stale content.

Review season: Run /om-review-brief manager and get a structured review prep document with all the evidence already linked.


🛠️ Commands

Defined in .claude/commands/. Run them in Claude Code, Codex CLI, or Gemini CLI.

CommandWhat It Does
/om-standupMorning kickoff — loads context, reviews yesterday, surfaces tasks, suggests priorities
/om-dumpFreeform capture — talk naturally about anything, routes it all to the right notes
/om-wrap-upFull session review — verify notes, indexes, links, suggest improvements
/om-humanizeVoice-calibrated editing — makes Claude-drafted text sound like you wrote it
/om-weeklyWeekly synthesis — cross-session patterns, North Star alignment, uncaptured wins
/om-capture-1on1Capture a 1:1 meeting transcript into a structured vault note
/om-incident-captureCapture an incident from Slack/channels into structured notes
/om-slack-scanDeep scan Slack channels/DMs for evidence
/om-peer-scanDeep scan a peer's GitHub PRs for review prep
/om-review-briefGenerate a review brief (manager or peer version)
/om-self-reviewWrite your self-assessment for review season — projects, competencies, principles
/om-review-peerWrite a peer review — projects, principles, performance summary
/om-tidySelf-maintenance — acts on every hygiene flag: archive, group, split. Never deletes, never commits
/om-correctSweep a corrected fact — applies it at the single source, links restatements, preserves dated records
/om-vault-auditAudit indexes, links, orphans, stale context
/om-vault-upgradeUpgrade this vault through ShardMind (keeps your local improvements), or import content from an existing vault — version detection, classification, migration
/om-prep-1on1Prep for an upcoming 1:1 — load person context, open items, suggested agenda
/om-meetingPrep for any meeting by topic — subject-forward briefing with open items and considerations
/om-intakeProcess meeting notes inbox — classify and route to the right vault notes
/om-project-archiveMove a completed project from active/ to archive/, update indexes

🤖 Subagents

Specialized agents that run in isolated context windows. They handle heavy operations without polluting your main conversation.

AgentPurposeInvoked by
brag-spotterFinds uncaptured wins and competency gaps/om-wrap-up, /om-weekly
context-loaderLoads all vault context about a person, project, or conceptDirect
cross-linkerFinds missing wikilinks, orphans, broken backlinks/om-vault-audit
people-profilerBulk creates/updates person notes from Slack profiles/om-incident-capture
review-prepAggregates all performance evidence for a review period/om-review-brief
slack-archaeologistFull Slack reconstruction — every message, thread, profile/om-incident-capture
vault-librarianDeep vault maintenance — orphans, broken links, stale notes/om-vault-audit
review-fact-checkerVerify every claim in a review draft against vault sources/om-self-review, /om-review-peer
vault-migratorClassify, transform, and migrate content from a source vault/om-vault-upgrade

NOTE
Subagents are defined in .claude/agents/. You can add your own for domain-specific workflows.


📊 Performance Graph

The vault doubles as a performance tracking system:

  1. Competency notes in perf/competencies/ define your org's competency framework — one note per competency

  2. Work notes link to competencies in their ## Related section, annotated with what was demonstrated

  3. Backlinks accumulate automatically — review prep becomes reading the backlinks panel on each competency note

  4. Brag Doc aggregates wins per quarter with links to evidence notes

  5. /om-peer-scan deep-scans a colleague's GitHub PRs and writes structured evidence to perf/evidence/

  6. /om-review-brief generates a full review brief by aggregating everything: brag entries, decisions, incidents, competency evidence, and 1:1 feedback

TIP
To get started: create competency notes from the template, then link your work notes to them as you go. The graph does the rest.


📋 Bases

The bases/ folder contains database views that query your notes' frontmatter properties. They update automatically as notes change.

BaseShows
Work DashboardActive projects filtered by quarter, grouped by status — plus a Stale Actives view (active but untouched 14+ days)
Recently TouchedEvery note by real modified time — the correct answer to "what did I work on recently" (filename dates lie for living notes)
IncidentsAll incidents sorted by severity and date
People DirectoryEveryone in org/people/ with role, team
1:1 HistoryAll 1:1 notes sortable by person and date
Review EvidencePR scans and evidence grouped by person and cycle
Competency MapCompetencies with evidence counts from backlinks
TemplatesQuick access to all templates

Home.md embeds these views, making it the vault's dashboard.


📁 Vault Structure

Home.md                 Vault entry point — embedded Base views, quick links
AGENTS.md               Operating manual — read by every agent, every session
vault-manifest.json     Template metadata — version, structure, schemas
.shardmindignore        Files excluded from `shardmind install` (CONTRIBUTING, translations, marketing media)
CHANGELOG.md            Version history
CONTRIBUTING.md         Template development checklist
README.md               Product documentation
LICENSE                 MIT license

bases/                  Dynamic database views (Work Dashboard, Incidents, People, etc.)

work/
  active/               Current projects (1–3 files at a time)
  archive/YYYY/         Completed work, organized by year
  incidents/            Incident docs (main note + RCA + deep dive)
  1-1/                  1:1 meeting notes — named <Person> YYYY-MM-DD.md
  Index.md              Map of Content for all work

org/
  people/               One note per person — role, team, relationship, key moments
  teams/                One note per team — members, scope, interactions
  People & Context.md   MOC for organizational knowledge

perf/
  Brag Doc.md           Running log of wins, linked to evidence
  brag/                 Quarterly brag notes (one per quarter)
  competencies/         One note per competency (link targets)
  evidence/             PR deep scans, data extracts for reviews
  <cycle>/              Review cycle briefs and artifacts

brain/
  North Star.md         Goals and focus areas — read every session
  Memories.md           Index of memory topics
  Key Decisions.md      Significant decisions and their reasoning
  Patterns.md           Recurring patterns observed across work
  Gotchas.md            Things that have gone wrong and why
  Skills.md             Custom workflows and slash commands

reference/              Codebase knowledge, architecture maps, flow docs
thinking/               Scratchpad for drafts — promote findings, then delete
templates/              Obsidian templates with YAML frontmatter

.claude/
  rules/                Claude Code-only guidance, loaded beside AGENTS.md
  commands/             20 slash commands
  agents/               10 subagents
  scripts/              Hook scripts + charcount.ts utility
  skills/               Obsidian + QMD skills, and the obsidian-mind mod
  settings.json         5 hooks configuration

.scripts/                Vault-level tooling — QMD bootstrap (run once on a fresh clone)

.shardmind/             ShardMind sidecar — only used if installed via `shardmind install`
  shard.yaml            Manifest (name, version, modules, hooks)
  shard-schema.yaml     Wizard values + module gating
  hooks/                bootstrap (git init + QMD), personalize (North Star), post-update

NOTE
.shardmind/ is additive, not load-bearing. A clone-and-open vault never reads it; only the shardmind CLI does. Delete it and the vault keeps working. See the v6 layout contract in shardmind/docs/SHARD-LAYOUT.md.


📝 Templates

Templates with YAML frontmatter, each including a description field for progressive disclosure:

  • Work Note — date, description, project, status, quarter, tags

  • Decision Record — date, description, status (proposed/accepted/deprecated), owner, context

  • Thinking Note — date, description, context, tags (scratchpad — delete after promoting)

  • Competency Note — date, description, current-level, target-level, proficiency table

  • 1:1 Note — date, person, key takeaways, action items, quotes

  • Incident Note — date, ticket, severity, role, timeline, root cause, impact


🔧 What's Included

🧩 Obsidian Skills

kepano/obsidian-skills pre-installed in .claude/skills/:

  • obsidian-markdown — Obsidian-flavored markdown (wikilinks, embeds, callouts, properties)

  • obsidian-cli — CLI commands for vault operations

  • obsidian-bases — Database-style .base files

  • json-canvas — Visual .canvas file creation

  • defuddle — Web page to markdown extraction

🔍 QMD Skill

A custom skill in .claude/skills/qmd/ that teaches the agent to use QMD semantic search proactively — before reading files, before creating notes (to check for duplicates), and after creating notes (to find related content that should link to it).


🎨 Customize It

This is a starting point. Adapt it to how you work:

WhatWhere
Your goalsbrain/North Star.md — grounds every session
Your orgorg/ — add your manager, team, key collaborators
Your competenciesperf/competencies/ — match your org's framework
Your tools.claude/commands/ — edit for your GitHub org, Slack workspace
Your conventionsAGENTS.md — the operating manual, evolve it as you go (.claude/rules/ for Claude Code-only additions)
Your domainAdd folders, subagents in .claude/agents/, or classification rules in .claude/scripts/

IMPORTANT
AGENTS.md is the operating manual. When you change conventions, update it — your agent reads it every session.


🔄 Upgrading

Ask your agent

The easiest way — just tell your agent:

Update this vault to the latest obsidian-mind from https://github.com/breferrari/obsidian-mind

The agent will pull the latest changes, resolve conflicts, and update infrastructure files. Works with Claude Code, Codex CLI, or Gemini CLI.

Updating an existing clone

If you cloned the repo directly:

cd your-vault
git pull origin main

New files appear automatically and hook scripts are updated in place. If you edited CLAUDE.md, the pull stops on it, because you changed a file the template deleted: move your additions out as Troubleshooting describes, then delete it.

Updating a fork

If you forked the repo:

git remote add upstream https://github.com/breferrari/obsidian-mind.git
git fetch upstream
git merge upstream/main

Resolve any conflicts in files you customized (typically AGENTS.md, brain/ notes; a CLAUDE.md you edited conflicts with its deletion, see Troubleshooting). Infrastructure files (.claude/scripts/, .codex/, .gemini/) should merge cleanly.

Adopting an existing clone into ShardMind (v5.x → v6)

Already cloned obsidian-mind and want the wizard, optional modules, and three-way-merge upgrades without losing your customizations? shardmind adopt reconciles your existing vault into a managed v6 install — keeping every byte of your edits and only adding the .shardmind/ sidecar + shard-values.yaml:

npm install -g shardmind
shardmind adopt github:breferrari/obsidian-mind

The 2-way diff UI walks you through any local changes, asks per-file what to keep, then writes the engine metadata. Result: a v6-managed vault with your existing content intact, ready for shardmind update from there forward. No re-cloning.

Migrating from an older vault (or any other vault)

Using a pre-v5 obsidian-mind, or migrating from a totally different Obsidian vault? The /om-vault-upgrade command migrates your content into the latest template:

# 1. Clone the latest obsidian-mind
git clone https://github.com/breferrari/obsidian-mind.git ~/new-vault

# 2. Open it in your agent
cd ~/new-vault && claude   # or codex, or gemini

# 3. Run the upgrade pointing to your old vault
/om-vault-upgrade ~/my-old-vault

The agent will:

  1. Detect your vault version (v1–v3.x, or identify it as a non-obsidian-mind vault)

  2. Inventory every file — classify as user content, scaffold, infrastructure, or uncategorized

  3. Present a migration plan — you see exactly what will be copied, transformed, and skipped

  4. Execute after your approval — transforms frontmatter, fixes wikilinks, rebuilds indexes

  5. Validate — checks for orphans, broken links, missing frontmatter

Your old vault is never modified. Use --dry-run to preview the plan without executing.

NOTE
Works with any Obsidian vault, not just obsidian-mind. For non-obsidian-mind vaults, the agent reads each note and classifies it semantically — routing work notes, people, incidents, 1:1s, and decisions to the right folders.


🩺 Troubleshooting

Claude Code ignores the vault's conventions. Claude Code reads a CLAUDE.md in place of AGENTS.md and skips AGENTS.md without saying so. Two ways that happens:

  • A leftover CLAUDE.md in the vault. An update keeps a CLAUDE.md you edited. The session hygiene flags say CLAUDE.md present beside AGENTS.md, and /om-vault-upgrade lists it under Move out. Move what you added to .claude/rules/local.md (or into AGENTS.md if every agent needs it, keeping AGENTS.md under 23 KB, where the hygiene flags start: Antigravity stops reading it at ~24,000 bytes), then delete CLAUDE.md. Nothing is merged automatically.

  • A CLAUDE.md in a folder above the vault. Claude Code reads that one too, and AGENTS.md is skipped. The hygiene flag cannot see it, because it checks the vault root only. Move the vault out from under that folder, or move that file's content somewhere it applies only where you want it.

Gemini CLI loads no instructions when started in a vault subfolder. Gemini's context search walks up the folders, but its settings lookup does not, so a session started in a subfolder never reads the vault's .gemini/settings.json and never learns to look for AGENTS.md. Start Gemini from the vault root.

Gemini ignores what you added to GEMINI.md. Gemini now reads AGENTS.md (through .gemini/settings.json), so a leftover GEMINI.md is never loaded. The hygiene flags say GEMINI.md present beside AGENTS.md, and /om-vault-upgrade lists it under Move out. Move your additions to AGENTS.md, then delete it.

Grok reads nothing from the vault. Grok loads project instructions only from a trusted folder. Trust the vault once: run /hooks-trust in a Grok session, or launch with --trust. One grant covers MCP, LSP, hooks, project instructions and project skills.


🗺️ Roadmap

Issues and bug reports welcome. Code contributions go through assignment: comment on an issue to ask for it, and open a PR once it's assigned to you. A PR for an issue not assigned to you is closed without review. See CONTRIBUTING.md.


🙏 Design Influences


👤 Author

Created by Brenno Ferrari — Senior iOS Engineer in Berlin, building developer tools with Claude Code.


📄 License

MIT

README.zh-CN.md

🌐 English | 日本語 | 中文 | 한국어

NOTE
本翻译在AI辅助下完成。如果您发现不自然的表达或翻译错误,欢迎通过Issue或Pull Request告知我们。我们非常欢迎社区的修正和贡献。

<p align="center"> <img src="obsidian-mind-logo.png" alt="Obsidian Mind" width="120"> </p>

<h1 align="center">Obsidian Mind</h1>

Image: Claude Code Image: Codex CLI Image: Gemini CLI Image: Obsidian Image: Obsidian CLI Image: Obsidian Skills Image: QMD Image: Node Image: License

一个让 Claude Code 记住一切的 Obsidian 仓库。 开始一次会话,聊聊你的一天,Claude 会处理剩下的一切——笔记、链接、索引、绩效追踪。每一次对话都建立在上一次的基础之上。


🔴 问题

Claude Code 功能强大,但它会遗忘。每次会话都从零开始——不了解你的目标、你的团队、你的工作模式、你的成就。你不得不反复解释相同的事情。三次对话前做出的决策就丢失了。知识永远无法积累。

🟢 解决方案

给你的 Agent 一个大脑。

你: "开始会话"
Agent: *读取北极星目标,检查活跃项目,扫描最近的记忆*
Agent: "你正在做 Project Alpha,被后端契约阻塞了。
         上次会话你决定拆分协调器。你明天和经理有个
         1:1——Review 简报已经准备好了。"

通过 shardmind install 或 git clone 安装 —— 两种方式得到相同的仓库。


⚡ 实际效果

<p align="center"> <img src="obsidian-mind-demo.gif" alt="Obsidian Mind 演示 — standup 和 dump 命令" width="800"> </p>

早间启动:

/om-standup
# → 加载北极星目标、活跃项目、待办任务、最近的 git 变更
# → "你有 2 个活跃项目。auth 重构被 API 契约阻塞了。
#    你下午2点和 Sarah 有 1:1——上次她提到了可观测性的问题。"

会后头脑转储:

/om-dump Just had a 1:1 with Sarah. She's happy with the auth work but wants
us to add error monitoring before release. Also, Tom mentioned the cache
migration is deferred to Q2 — we decided to focus on the API contract first.
Decision: defer Redis migration. Win: Sarah praised the auth architecture.
→ 更新了 org/people/Sarah Chen.md,添加了会议上下文
→ 创建了 work/1-1/Sarah 2026-03-26.md,记录关键要点
→ 创建了决策记录:"将 Redis 迁移推迟到 Q2"
→ 添加到 perf/Brag Doc.md:"Auth 架构获得经理好评"
→ 更新了 work/active/Auth Refactor.md,添加错误监控任务

事件响应:

/om-incident-capture https://slack.com/archives/C0INCIDENT/p123456
# → slack-archaeologist 读取每一条消息、线程和个人资料
# → people-profiler 为新涉及的人员创建笔记
# → 完整的时间线、根因分析、成就记录

收工:

你: "wrap up"
# → 验证所有笔记都有链接
# → 更新索引
# → brag-spotter 发现未记录的成就
# → 提出改进建议

🚀 快速开始

📦 通过 ShardMind 安装(推荐)
npm install -g shardmind
mkdir my-vault && cd my-vault
shardmind install github:breferrari/obsidian-mind

shardmind install 会写入当前目录,因此请先创建并进入一个新文件夹。向导会收集你的姓名、组织、仓库用途、要包含的 Agent,以及是否启用 QMD。随后 ShardMind 会初始化 git、按需引导 QMD,并根据你的答案个性化 brain/North Star.md。然后:

  1. 将已安装的文件夹作为 Obsidian 仓库 打开

  2. 在 设置 → 通用 中启用 Obsidian CLI(需要 Obsidian 1.12+)

  3. 在仓库目录中运行你的 Agent:claude、codex 或 gemini。Codex 只有在文件夹被信任、且每个钩子都被批准后才会运行 vault 的钩子:见与其他 Agent 配合使用。

  4. 开始谈论工作

ShardMind 是 Obsidian 仓库模板的包管理器。安装时会添加 .shardmind/ 旁挂目录,提供向导、可选模块(不需要的可以跳过)和三方合并升级。所有值采用默认值时,安装结果与 git clone 字节等价——克隆体验完全保留。从已安装的仓库中删除 .shardmind/ 和 shard-values.yaml,仓库仍可正常工作:ShardMind 是附加功能,并非必需。

或直接克隆
git clone https://github.com/breferrari/obsidian-mind.git

或将其作为 GitHub 模板 使用。跳过向导,获取裸模板。然后按上面的 4 个步骤操作,并在 brain/North Star.md 中填写你的目标(ShardMind 向导会自动完成此项)。

🔍 推荐:QMD 语义搜索

用于在仓库中进行语义搜索(即使笔记标题是 "Redis Migration ADR",也能找到 "我们关于缓存做了什么决策"):

npm install -g @tobilu/qmd
node --experimental-strip-types .scripts/qmd-bootstrap.ts

引导脚本是幂等的,可以安全地重复运行。它读取 vault-manifest.json 中的 qmd_index 和 qmd_context 字段,注册命名索引并生成嵌入向量(索引名为 qmd_index 的值;未设置时取 vault 文件夹名的 slug)。SessionStart 钩子、.mcp.json 封装脚本和 CLI 命令都读取同一个清单字段,因此同一台机器上的其他 vault 不会与本 vault 的 QMD 数据混淆。CLI 命令始终需要传递 --index <名称>:

qmd --index obsidian-mind query "我们关于缓存做了什么决策"
qmd --index obsidian-mind update   # 批量编辑后
qmd --index obsidian-mind embed    # 大量新笔记后

通过 MCP 原生集成为 Agent 工具。 在 .mcp.json 中注册为 Model Context Protocol 服务器——当 QMD 已安装时,mcp__qmd__query、mcp__qmd__get、mcp__qmd__multi_get 会与 Read、Edit 一起出现在 Agent 的工具菜单中。子代理、斜杠命令和主对话都通过同一个带类型的契约进行调用。之后再接入其他 MCP 兼容工具(数据库、工单系统、日历),接入方式完全一致。

底层是怎么工作的

QMD 在本地运行三个小模型,因此不需要配置 API 密钥,没有按次查询的费用,离线也能用:

模型大小作用
embeddinggemma-300M~328MB把笔记和查询转成向量
qmd-query-expansion-1.7B~1.28GB把你的查询改写成更好的检索词
Qwen3-Reranker-0.6B~640MB按真实相关性重排候选结果

它们在首次使用时下载并缓存。QMD 在发现 GPU 时会做卸载计算(独立显卡走 CUDA,Apple Silicon 走 Metal),否则回退到 CPU。用 qmd doctor 可以查看你这边的实际情况。

三个 CLI 命令按开销从低到高对应这套栈:qmd search 是 BM25 关键词检索、完全不用模型,qmd vsearch 只用向量,qmd query 是完整的混合检索。如果想避免较大的下载,单用 search 也已经很有用。

这对 MCP 服务器意味着什么

om 服务器会同时发送词法查询和向量查询,因此即使笔记与你的问题没有共同关键词,也能被找到。几点实际影响:

  • 贵的是读取,不是写入。 查询在检索前需要先在本地做嵌入,所以带查询的 recall 要几秒,而不带查询的 recall 几乎是瞬时的。对笔记的 search 很快,真正花时间的是向量那一步。

  • 写入记忆不会等待模型。 索引更新是同步的,所以新记忆立刻可被检索;生成向量在后台进行,因为它只影响排序,不影响能否被找到。

  • 没有索引也能用。 没有 QMD 时服务器回退到词法匹配。排序会变差,但不会丢东西。


📋 环境要求

  • Obsidian 1.12+(支持 CLI)

  • Claude Code

  • Node 22+ LTS(用于钩子脚本 — 通常与 Claude Code / Codex / Gemini CLI 一起已安装)

  • Git(用于版本历史)

  • QMD(可选,用于语义搜索)

关于 Node 标志。 钩子脚本通过 Node 的 --experimental-strip-types 标志直接执行 TypeScript。该标志自 Node 22.6+(2024 年 8 月)起稳定,并在 Node 23.6+ 中成为默认行为。虽然被标记为实验性(experimental),但在 22 LTS 和 24 LTS 中行为均未改变。如果未来的 Node 版本废弃或重命名该标志,只需在 .claude/settings.json、.codex/hooks.json 和 .gemini/settings.json 中对钩子命令做一行修改即可。


⚙️ 工作原理

过程化代码负责环境,Agent 负责内容。 .claude/scripts/ 中的钩子处理分类、验证、索引和生命周期注入——可复现、可测试,对每个 Agent 都以相同方式运行。撰写笔记、归类、链接、起草简报——这些属于判断范畴,交由 Agent 处理。两侧通过小而清晰的交接相遇(钩子注入上下文,Agent 读取仓库),因此双方都不需要越界做对方的工作。

文件夹按用途组织,链接按含义组织。 一个笔记存放在一个文件夹中(它的归属),但链接到许多笔记(它的上下文)。Agent 维护这个图谱——自动将工作笔记链接到人员、决策和能力项。当绩效评估季到来时,每个能力项笔记上的反向链接就是现成的证据链。一个没有链接的笔记就是一个 bug。

仓库优先的记忆 使上下文能跨会话和设备持续存在。所有持久知识存储在 brain/ 主题笔记中(git 跟踪、Obsidian 可浏览、相互链接)。Claude Code 的 MEMORY.md(~/.claude/)是一个自动加载的索引,指向仓库中的位置——本身不存储内容。这意味着记忆可以在更换设备后保留,并且是知识图谱的一部分。

会话有设计好的生命周期。 SessionStart 钩子自动注入你的北极星目标、活跃项目、最近变更、待办任务、完整的仓库文件列表和仓库卫生标志——Claude 每次会话都带着上下文启动,而不是从空白开始。结束时,说 "wrap up",Claude 就会运行 /om-wrap-up——验证笔记、更新索引、发现未记录的成就。CLAUDE.md 规范了中间的一切:文件归档位置、链接方式、何时拆分笔记、如何处理决策和事件。

🔗 钩子

五个生命周期钩子自动处理路由:

钩子触发时机功能
🚀 SessionStart启动/恢复时QMD 重新索引+自愈,注入北极星焦点、活跃工作、最近变更、任务、文件列表、仓库卫生标志 — 整体受字节预算约束(预算本身限制在 Claude Code 的钩子输出上限之内),末行为注入大小计量
💬 UserPromptSubmit每条消息对内容分类(决策、事件、成就、1:1、架构、人员、项目更新)并注入路由提示;同时把上一轮的 Stop 报告交给智能体
✍️ PostToolUse写入 .md 后验证 frontmatter+wikilinks,拦截误放的记忆文件,标记过大笔记(拆分而非删减)与写入时的主题集群
💾 PreCompact上下文压缩前将会话记录备份到 thinking/session-logs/
🏁 Stop每次响应结束后检查清单+具体漂移发现(与 SessionStart 相同的卫生扫描),每个会话显示一次,仅在内容变化时再次显示;你只看到简短摘要(每个部分一行),完整报告随你的下一条消息交给智能体,由其判断是否处理;处理交给 om-tidy

TIP
你只需要正常对话。钩子会处理路由。

🧩 Claude Code mod

在 Claude Code 2.1.287 及以上版本中,仓库还附带一个 mod:.claude/skills/obsidian-mind/,一个在 Claude Code 内部运行的插件。它运行仓库自身的钩子脚本,只改变其输出到达会话的方式:

  • 会话上下文像 CLAUDE.md 一样以 instruction 文件的形式送达。 压缩和 /clear 之后会被完整地重新读取(作为钩子输出时会缩减为一个指针),能送达通用子代理(钩子输出送达不了),也不会被 Claude Code 钩子输出的 10,000 字符上限截断。其预算是 vault-manifest.json 中的 eager_layer_instruction_budget_bytes;像未完成任务这样不会缩减的部分仍可能超出它。/memory 中显示为 .claude/session-context.md。

  • Stop 报告变成回答下方的一行。 发现项变化时,你会在 Claude 的回复下方看到以该 mod 名称开头的一行 obsidian-mind: vault check: …。Claude Code 会把在 Stop 上作出应答的插件名称用 + 连接起来,因此当其他插件也作出应答时,该标签会显示为 obsidian-mind+<插件>: vault check: …。Claude 会随你的下一条消息收到完整报告,对你不可见。标记为紧急的发现项则会立即送达 Claude(你每发送一条消息最多一次,第二个会在报告中等待);模板自身的报告中没有这类发现项。

对于它处理的每个事件,mod 会通知对应的钩子让出。在 mod 未加载的地方,钩子与以前完全一样地运行:Codex 和 Gemini、旧版 Claude Code、在仓库子文件夹中启动的会话(请在仓库根目录启动,或 /cd 到根目录后执行 /clear)、以及未信任的文件夹。只有在你接受了 Claude Code 对该仓库的信任提示之后,mod 才会加载。

mod 是没有沙箱、以你的权限运行的代码,因此在信任该文件夹之前请先检查它的行为:claude plugin validate .claude/skills/obsidian-mind 会列出它挂钩的每个事件和发出的每个调用(它只运行仓库自身的脚本、写入上下文文件、在自己的存储中记录每个会话看过哪份报告,并在有紧急发现项时提交一条提示)。要关闭它,在 .claude/settings.local.json 中加入 "enabledPlugins": { "obsidian-mind@skills-dir": false }。

<!-- mod-validate:start -->

对于这一版本的 mod,其输出中值得确认的两行如下:

  ❯ ./register.ts hooks: classic.SessionStart, prompt.context, classic.Stop, turn.complete, prompt.submit, turn.start
  ❯ ./register.ts calls: $.fs.write, $.process.run (via runScript), $.prompt.submit, $.session.root, $.state.get, $.state.set, $.store.get (via setShown, shownFor), $.store.set (via setShown), $.ui.invalidate

<!-- mod-validate:end -->

⚡ Token 效率

obsidian-mind 不会将整个 vault 加载到上下文中。它使用分层加载来控制 token 成本:

层级内容时机成本
始终CLAUDE.md + SessionStart 上下文(北极星摘要、git 摘要、任务、vault 文件列表)会话启动时以清单中的预算为上限(预算本身限制在 Claude Code 10,000 字符的钩子输出上限之内);每次会话末尾的计量器报告实际大小
按需QMD 语义搜索结果Agent 需要特定上下文时精准定向
触发分类路由提示每条消息~100 tokens
触发PostToolUse 验证.md 写入后~200 tokens
罕见完整文件读取仅在明确需要时可变

SessionStart 加载轻量级上下文 — 关键文件的简短摘要、文件名和 git 摘要,而非完整笔记内容。Agent 通过 QMD 进行语义搜索后再读取文件,因此只获取相关内容。分类钩子每条消息仅执行一次轻量级 Node 调用。验证钩子仅在 markdown 写入时触发,跳过排除的路径。 五个机制让注入层随仓库增长仍保持诚实:来源感知注入(resume/compact 时只重新注入易变部分——静态大块已在会话中)、每次注入末行的注入大小计量、真正强制执行计量结果的注入预算(超出上限时,最容易舍弃的部分降级为指针,且计量行会逐一列出被降级的部分——因为悄无声息的丢失比膨胀更糟)、每次写入仅一次钩子进程(QMD 刷新搭载在验证钩子上)、列表折叠(笔记数超过阈值的文件夹折叠为一行计数,因此仓库不会通过某个没人想到要配置的文件夹突破上限)。预算与阈值均可在 vault-manifest.json 中调整,但无论如何设置,预算都会被限制在 Claude Code 10,000 字符的钩子输出上限之内——超过上限时,会话只能收到 2,000 字符的预览。

🌐 与其他 Agent 配合使用

obsidian-mind 支持 Claude Code、Codex CLI 和 Gemini CLI。CLAUDE.md 中的 vault 规约、.claude/scripts/ 中的钩子脚本、.claude/commands/ 中的命令都是 Agent 无关的 — 纯 Markdown、TypeScript 和 Shell,无 SDK 依赖。

Claude Code — 完整支持。钩子、命令、子代理和记忆系统全部开箱即用。

Codex CLI — 原生读取 AGENTS.md。.codex/hooks.json 中的钩子配置连接了与 Claude Code 相同的钩子脚本 — 会话上下文、消息分类和写入验证自动工作。

Codex 只有在两种信任都具备时才会运行项目的钩子(使用 Codex CLI 0.160.0 观察,截至 2026-10-13,#345):

  • vault 文件夹已被信任。 Codex 将其记录在 ~/.codex/config.toml 的 [projects.'<path>'] 下。在 Windows 上,键是带 \\?\ 前缀的路径,例如 [projects.'\\?\C:\path\to\vault']。

  • 每个钩子已被批准。 Codex 将每次批准作为 trusted_hash 存储在 [hooks.state] 下。在交互式 codex 会话中批准预计会写入这些条目(推断:#345 的检查用仅适用于单次非交互运行的标志 --dangerously-bypass-hook-trust 代替了它们)。

两者都具备之前,Codex 不会运行任何钩子,会话也得不到 vault 上下文。

Gemini CLI — 原生读取 GEMINI.md。.gemini/settings.json 中的钩子配置将 Gemini 的事件名称映射到共享钩子脚本。

其他 Agent(Cursor、Windsurf、GitHub Copilot、JetBrains AI)— 通过 AGENTS.md 读取 vault 规约。钩子支持因 Agent 而异。

NOTE
钩子、命令、子代理提示和 vault 记忆(brain/)都是 Agent 无关的。只有 ~/.claude/ 自动记忆加载器是 Claude Code 专属功能。详见 AGENTS.md。


🧠 从任意仓库访问你的 vault

vault 通常只在你身处其中时才有用。om MCP 服务器改变了这一点:任何其他仓库中的编码会话都可以搜索你的笔记、阅读它们、沿图谱跳转,并把学到的东西记录回 vault。

{
  "mcpServers": {
    "om": {
      "command": "node",
      "args": ["/path/to/your-vault/.claude/scripts/om-mcp.mjs"]
    }
  }
}

这段配置放在使用方项目的 .mcp.json 中。然后在该项目自己的 CLAUDE.md 里加上一小节,指向这个 vault。

IMPORTANT
两步缺一不可,第二步不是走过场。 实测:服务器已接好但没有仓库侧说明时,会话一次都没有调用 vault,并径直实现了一个 vault 明确记录为已否决的设计。有说明时,它拒绝实现并引用了那条笔记。

MCP instructions 字段中的禁止性规则会可靠地传播到调用方会话;而“去查阅 vault”这类肯定式指令只是建议性的,只要存在更近的信息源就会被跳过。服务器能阻止会话做某件事,但只有项目自身的规约能让它主动去查。

会话得到的能力: search(语义 + 关键词)、expand(笔记的出链与反链)、recall(限定到该仓库的持久经验)、remember(记录一条经验)、record_work(归档所做的工作)、reason(跨多条笔记的判断)、health(接线是否完好)。此外还把笔记作为可读资源暴露出来。

真正会思考的是 reason。 其余的都是检索,而它会用第二个 Claude 会话读你的 vault,回答那些需要跨笔记做判断的问题 — 我接下来要做的事,和这六条笔记当初的决定一致吗? 它会先自行检索一遍作为起点,所以你不需要先搜。它跑在你自己的 CLI 默认模型上,因此 vault 会以你当前工作的水准回答;并且没有任何上限 — 这就是 Claude,在你的机器上、用你的凭证运行。每次调用都会记录费用、轮数、模型和实际耗时。答案标记为 confidence: inferred,不会自行写入记忆 — 值不值得留下由你的会话决定。

仓库按文件夹名识别。 这在大多数情况下是对的,偶尔不是:两个都叫 api 的仓库会共享同一个身份,于是彼此收到对方的记忆。在仓库根目录放一个 .om-project 文件并写入不同的名字即可分开;health 会告诉你它认为是哪个仓库在调用,以及这个名字从哪里来。

带认知契约的跨仓库记忆。 在一个仓库学到的经验只会到达它被限定的那些仓库。触及范围是在写入时声明的,而非读取时猜测,因此同类项目不会继承彼此的约束。所有记录都带有 confidence: verified | inferred | unverified、易变事实的日期,以及服务端推导的来源 — 会话无法冒充自己以外的项目。更正以取代而非覆盖的方式记录,因此这个存储不会累积矛盾,反而会随着增长变得更可信。

它提供哪些笔记。 你的 vault、你的笔记、你的会话。默认就是 vault 已经声明为你自己内容的部分(user_content_roots),并保持你书写时的粒度(是 work/active/,而不是整个 work/)。只有当这个 vault 存放着并非你有权分享的材料 —— 雇主的机密信息、客户的数据 —— 时,才需要在 vault-manifest.json 里设置 mcp_exposed_roots。标记为 private 的笔记不会被提供;记忆有自己的作用域,因此也不会作为普通笔记提供。有一种情况会跨越两者:当一条捕获的 promoted: 标记带有锚点时,recall 会提供 brain/ 中的那个片段,让其他仓库拿到修正后的版本,而不是最初写下的捕获。它同样受这条策略约束,因此 private 或被withheld的笔记在这里也会被拒绝。每次读取都会连同调用方仓库一起记入日志。

NOTE
让 vault 内容不出现在公开 PR 里,是契约的职责,而不是这份开放清单的职责 —— 会话本来就能直接读取你的 vault。真正被实测证明有效的,是注入到调用方会话中的禁止性规则。


📅 日常工作流

早晨:运行 /om-standup。Agent 加载你的北极星目标、活跃项目、待办任务和最近变更。你会得到一份结构化的摘要和优先事项建议。

全天:自然地交谈。提到你做的决策、发生的事件、刚结束的 1:1、想记住的成就。分类钩子会引导 Agent 将每条信息归档到正确位置。对于更大量的信息转储,使用 /om-dump 一次性叙述所有内容。

收工:说 "wrap up",Agent 就会调用 /om-wrap-up——验证笔记、更新索引、检查链接、发现未记录的成就。

每周:运行 /om-weekly 进行跨会话综合——北极星对齐、模式识别、未记录的成就和下周优先事项。运行 /om-vault-audit 捕获孤立笔记、断开的链接和过时的内容。

绩效评估季:运行 /om-review-brief manager,获得一份结构化的评估准备文档,所有证据都已链接就绪。


🛠️ 命令

定义在 .claude/commands/ 中。可在任何 Claude Code 会话中运行。

命令功能
/om-standup早间启动——加载上下文,回顾昨天,浮现任务,建议优先事项
/om-dump自由捕获——随意交谈,将所有内容路由到正确的笔记
/om-wrap-up完整的会话回顾——验证笔记、索引、链接,提出改进建议
/om-humanize语气校准编辑——让 Claude 起草的文字听起来像是你自己写的
/om-weekly每周综合——跨会话模式、北极星对齐、未记录的成就
/om-prep-1on11:1 准备——加载对方上下文、未解决事项、建议议程
/om-meeting按主题准备会议——未解决事项、障碍、需要考虑的要点
/om-intake处理会议笔记收件箱——分类 work/meetings/ 中的文件并路由到正确的笔记
/om-capture-1on1将 1:1 会议记录捕获为结构化的仓库笔记
/om-incident-capture从 Slack/频道中捕获事件,生成结构化笔记
/om-slack-scan深度扫描 Slack 频道/私信以获取证据
/om-peer-scan深度扫描同事的 GitHub PR,用于评估准备
/om-review-brief生成评估简报(经理版或同事版)
/om-self-review撰写绩效评估自评——项目、能力、原则
/om-review-peer撰写同事评审——项目、原则、绩效总结
/om-correct扫除已更正的事实——在单一来源处应用更正,将重述替换为链接,保留带日期的历史记录
/om-vault-audit审计索引、链接、孤立笔记、过时内容
/om-vault-upgrade从现有仓库导入内容——版本检测、分类、迁移
/om-project-archive将已完成的项目从 active/ 移至 archive/,更新索引
/om-tidy自维护 — 依据卫生标志归档已完成笔记、归组松散集群、拆分过大笔记。从不删除、从不提交

🤖 子代理

在隔离的上下文窗口中运行的专业代理。它们处理繁重的操作,不会污染你的主对话。

代理用途调用方式
brag-spotter发现未记录的成就和能力差距/om-wrap-up, /om-weekly
context-loader加载仓库中关于某人、项目或概念的所有上下文直接调用
cross-linker查找缺失的 wikilinks、孤立笔记、断开的反向链接/om-vault-audit
people-profiler从 Slack 个人资料批量创建/更新人员笔记/om-incident-capture
review-prep汇总某个评估周期的所有绩效证据/om-review-brief
slack-archaeologist完整的 Slack 重建——每条消息、线程、个人资料/om-incident-capture
vault-librarian深度仓库维护——孤立笔记、断开链接、过时笔记/om-vault-audit
review-fact-checker对照仓库来源验证评审草稿中的每一项声明/om-self-review, /om-review-peer
vault-migrator分类、转换和迁移源仓库中的内容/om-vault-upgrade

NOTE
子代理定义在 .claude/agents/ 中。你可以添加自己的代理以适应特定领域的工作流。


📊 绩效图谱

这个仓库同时也是一个绩效追踪系统:

  1. 能力项笔记 在 perf/competencies/ 中定义你所在组织的能力框架——每个能力项一个笔记

  2. 工作笔记 在其 ## Related 部分链接到能力项,并标注所展示的能力

  3. 反向链接自动积累——绩效评估准备变成了查看每个能力项笔记上的反向链接面板

  4. Brag Doc 按季度汇总成就,并链接到证据笔记

  5. /om-peer-scan 深度扫描同事的 GitHub PR,并将结构化证据写入 perf/evidence/

  6. /om-review-brief 通过汇总所有内容生成完整的评估简报:成就记录、决策、事件、能力证据和 1:1 反馈

TIP
入门方法:使用模板创建能力项笔记,然后在日常工作中将工作笔记链接到它们。图谱会处理剩下的一切。


📋 Bases

bases/ 文件夹包含查询笔记 frontmatter 属性的数据库视图。它们会随着笔记的变化自动更新。

Base显示内容
Work Dashboard按季度筛选、按状态分组的活跃项目 — 附 Stale Actives 视图(14 天以上未动的活跃笔记)
Recently Touched按真实修改时间排序的全部笔记 — 「最近在做什么」的正确答案(活笔记的文件名日期不可信)
Incidents按严重程度和日期排序的所有事件
People Directoryorg/people/ 中所有人员的角色和团队
1:1 History可按人员和日期排序的所有 1:1 笔记
Review Evidence按人员和周期分组的 PR 扫描和证据
Competency Map带有反向链接证据计数的能力项
Templates快速访问所有模板

Home.md 嵌入这些视图,使其成为仓库的仪表板。


📁 仓库结构

Home.md                 仓库入口——嵌入的 Base 视图、快捷链接
CLAUDE.md               操作手册——Agent 每次会话都会读取
AGENTS.md               多 Agent 指南——Codex、Cursor、Windsurf 等
GEMINI.md               多 Agent 指南——Gemini CLI
vault-manifest.json     模板元数据——版本、结构、schema
.shardmindignore        从 `shardmind install` 中排除的文件(CONTRIBUTING、翻译、营销素材)
CHANGELOG.md            版本历史
CONTRIBUTING.md         模板开发清单
README.md               产品文档
LICENSE                 MIT 许可证

bases/                  动态数据库视图(Work Dashboard、Incidents、People 等)

work/
  active/               当前项目(同时 1-3 个文件)
  archive/YYYY/         已完成的工作,按年份组织
  incidents/            事件文档(主笔记 + RCA + 深度分析)
  1-1/                  1:1 会议笔记——命名格式 <Person> YYYY-MM-DD.md
  Index.md              所有工作的内容地图

org/
  people/               每人一个笔记——角色、团队、关系、关键时刻
  teams/                每个团队一个笔记——成员、职责范围、互动
  People & Context.md   组织知识的内容地图

perf/
  Brag Doc.md           成就持续记录,链接到证据
  brag/                 季度成就笔记(每季度一个)
  competencies/         每个能力项一个笔记(链接目标)
  evidence/             PR 深度扫描、用于评审的数据摘录
  <cycle>/              评审周期简报和产出物

brain/
  North Star.md         目标和关注领域——每次会话读取
  Memories.md           记忆主题索引
  Key Decisions.md      重要决策及其推理过程
  Patterns.md           工作中观察到的重复模式
  Gotchas.md            出过问题的事情及其原因
  Skills.md             自定义工作流和斜杠命令

reference/              代码库知识、架构图、流程文档
thinking/               草稿用暂存区——提炼成果后删除
templates/              带有 YAML frontmatter 的 Obsidian 模板

.claude/
  commands/             18 个斜杠命令
  agents/               9 个子代理
  scripts/              钩子脚本 + charcount.ts 工具
  skills/               Obsidian + QMD 技能,obsidian-mind mod
  settings.json         5 个钩子配置

.scripts/                仓库级工具 — QMD 引导脚本(新克隆时运行一次)

.shardmind/             ShardMind 旁挂目录——仅在通过 `shardmind install` 安装时使用
  shard.yaml            清单文件(名称、版本、模块、钩子)
  shard-schema.yaml     向导值 + 模块门控
  hooks/                bootstrap(git 初始化 + QMD)、personalize(North Star)、post-update

NOTE
.shardmind/ 是附加功能,并非必需。 克隆并打开的仓库从不读取它;只有 shardmind CLI 使用它。删除它,仓库仍可正常工作。v6 布局契约见 shardmind/docs/SHARD-LAYOUT.md。


📝 模板

带有 YAML frontmatter 的模板,每个都包含用于渐进式展示的 description 字段:

  • Work Note(工作笔记) — date、description、project、status、quarter、tags

  • Decision Record(决策记录) — date、description、status(proposed/accepted/deprecated)、owner、context

  • Thinking Note(思考笔记) — date、description、context、tags(暂存区——提炼后删除)

  • Competency Note(能力项笔记) — date、description、current-level、target-level、熟练度表格

  • 1:1 Note(1:1 笔记) — date、person、关键要点、行动项、引用

  • Incident Note(事件笔记) — date、ticket、severity、role、时间线、根因、影响


🔧 包含内容

🧩 Obsidian Skills

kepano/obsidian-skills 预装在 .claude/skills/ 中:

  • obsidian-markdown — Obsidian 风格的 Markdown(wikilinks、嵌入、callout、属性)

  • obsidian-cli — 仓库操作的 CLI 命令

  • obsidian-bases — 数据库风格的 .base 文件

  • json-canvas — 可视化 .canvas 文件创建

  • defuddle — 网页到 Markdown 的提取

🔍 QMD Skill

.claude/skills/qmd/ 中的自定义技能,教会 Claude 主动使用 QMD 语义搜索——在读取文件之前、在创建笔记之前(检查重复)以及在创建笔记之后(查找应该链接到它的相关内容)。


🎨 自定义

这是一个起点。根据你的工作方式来调整它:

内容位置
你的目标brain/North Star.md — 为每次会话定下基调
你的组织org/ — 添加你的经理、团队、重要协作者
你的能力框架perf/competencies/ — 匹配你所在组织的能力框架
你的工具.claude/commands/ — 根据你的 GitHub 组织、Slack 工作区进行编辑
你的规范CLAUDE.md — 操作手册,随着使用不断完善
你的领域添加文件夹、在 .claude/agents/ 中添加子代理,或在 .claude/scripts/ 中添加分类规则

IMPORTANT
CLAUDE.md 是操作手册。当你改变规范时,请同步更新它——Agent 每次会话都会读取它。


🔄 升级

让 Agent 帮你更新

最简单的方法 — 直接告诉你的 Agent:

把这个 vault 更新到最新的 obsidian-mind https://github.com/breferrari/obsidian-mind

Agent 会拉取最新更改、解决冲突并更新基础设施文件。Claude Code、Codex CLI 和 Gemini CLI 均可使用。

更新已有克隆

如果你直接克隆了仓库:

cd your-vault
git pull origin main

新文件(AGENTS.md、GEMINI.md、.codex/、.gemini/)会自动出现,钩子脚本也会就地更新。

更新 Fork

如果你 Fork 了仓库:

git remote add upstream https://github.com/breferrari/obsidian-mind.git
git fetch upstream
git merge upstream/main

解决你自定义过的文件的冲突(通常是 CLAUDE.md、brain/ 笔记)。基础设施文件(.claude/scripts/、.codex/、.gemini/)应该可以干净合并。

将已有克隆收编到 ShardMind(v5.x → v6)

已经克隆了 obsidian-mind,又想要向导、可选模块和三方合并升级,且不希望丢失自定义内容?shardmind adopt 会将你已有的仓库整合为受管的 v6 安装——保留你的每一字节编辑,仅添加 .shardmind/ 旁挂目录和 shard-values.yaml:

npm install -g shardmind
shardmind adopt github:breferrari/obsidian-mind

2-way diff UI 会引导你查看本地变更,按文件确认要保留的内容,然后写入引擎元数据。结果:你已有的内容完好保留的 v6 受管仓库,从此可以使用 shardmind update。无需重新克隆。

从旧仓库(或任何其他仓库)迁移

使用 v5 之前的 obsidian-mind,或要从完全不同的 Obsidian 仓库迁移?/om-vault-upgrade 命令可以将你的内容迁移到最新模板:

# 1. 克隆最新版 obsidian-mind
git clone https://github.com/breferrari/obsidian-mind.git ~/new-vault

# 2. 用你的 Agent 打开
cd ~/new-vault && claude   # 或 codex、gemini

# 3. 运行升级命令,指向你的旧仓库
/om-vault-upgrade ~/my-old-vault

Agent 将会:

  1. 检测 你的仓库版本(v1–v3.x,或识别为非 obsidian-mind 仓库)

  2. 盘点 每个文件——分类为用户内容、脚手架、基础设施或未分类

  3. 展示迁移计划——你可以确切看到哪些内容将被复制、转换和跳过

  4. 经你批准后执行——转换 frontmatter、修复 wikilinks、重建索引

  5. 验证——检查孤立笔记、断开链接、缺失的 frontmatter

你的旧仓库永远不会被修改。使用 --dry-run 可以预览计划而不执行。

NOTE
适用于任何 Obsidian 仓库,不仅限于 obsidian-mind。对于非 obsidian-mind 仓库,Agent 会读取每个笔记并进行语义分类——将工作笔记、人员、事件、1:1 和决策路由到正确的文件夹。


🗺️ 路线图

欢迎提交 Issue 和 Bug 报告。 代码贡献采用指派制:在 Issue 下留言申请,被指派后再提交 PR。针对未指派给你的 Issue 的 PR 会不经审查直接关闭。详见 CONTRIBUTING.md。


🙏 设计灵感


👤 作者

由 Brenno Ferrari 创建 — 柏林高级 iOS 工程师,使用 Claude Code 构建开发者工具。


📄 许可证

MIT

329 files · 3 not served here

Advantages

  • Provides persistent memory across sessions, preventing agents from starting from zero. evidence: README.md
  • Uses local semantic search for efficient, offline retrieval of information. evidence: README.md
  • Automates vault hygiene and organization through lifecycle hooks. evidence: README.md

Limitations

  • Requires manual setup of hooks and optional dependencies like QMD for full functionality. evidence: README.md
  • Semantic search indexing can be resource-intensive on machines without a dedicated GPU. evidence: README.md
  • Hook scripts rely on experimental Node.js flags that may change in future versions. evidence: README.md

Security

Risk level: High risk

This brain runs

Agent instructions that run or fetch something (82)

  • .claude/agents/brag-spotter.md: `git log --since="<quarter start>" --oneline` on the vault itself
  • .claude/agents/correction-sweep.md: Run both.
  • .claude/agents/review-prep.md: **Git History** (optional): `git log --since="<start>" --until="<end>" --oneline` for volume of vault activity during the period.
  • .claude/agents/vault-librarian.md: Run a full health check and produce a maintenance report.
  • .claude/agents/vault-librarian.md: **Orphan Detection**: Run `obsidian orphans` (or `grep -rL '\[\[' work/ org/ perf/ brain/ reference/` as fallback).
  • .claude/agents/vault-librarian.md: **Broken Wikilinks**: Run `obsidian unresolved` (or grep for `\[\[.*\]\]` patterns and check if targets exist).
  • .claude/agents/vault-migrator.md: **Task**: Execute the migration plan — read from source, transform, write to target.
  • .claude/commands/om-correct.md: Run it **at the moment of correction**, not on a schedule.
  • .claude/commands/om-humanize.md: The user can run `git diff` for the full picture.
  • .claude/commands/om-humanize.md: If charcount matters (review content in `perf/`), verify limits after editing with `node --experimental-strip-types .claude/scripts/charcount.ts`.
  • .claude/commands/om-incident-capture.md: "Should I run `/om-vault-audit` to verify everything links properly?"
  • .claude/commands/om-intake.md: No arguments needed — just drop files and run.
  • .claude/commands/om-intake.md: Run this command after.
  • .claude/commands/om-intake.md: Before routing, run `qmd query "<meeting topic or person name>"` to find existing notes the content should attach to.
  • .claude/commands/om-meeting.md: **Search the vault** — run `qmd query "$ARGUMENTS"` and `qmd vsearch "$ARGUMENTS"` to find everything related to the topic, including semantically related content
  • .claude/commands/om-prep-1on1.md: **Check open tasks** — run `obsidian tasks daily todo`;
  • .claude/commands/om-prep-1on1.md: Run `/om-capture-1on1 $ARGUMENTS` to file the notes into `work/1-1/` and update the person note.
  • .claude/commands/om-project-archive.md: git mv "work/active/<Note>.md" "work/archive/YYYY/"
  • .claude/commands/om-project-archive.md: git mv "work/active/<Topic>" "work/archive/YYYY/<Topic>"
  • .claude/commands/om-project-archive.md: Run a quick check that no wikilinks are broken (Obsidian resolves by name, so moves shouldn't break links)
  • .claude/commands/om-review-peer.md: PR evidence from `perf/evidence/<Name> PRs - <cycle>.md` (run `/om-peer-scan` if missing)
  • .claude/commands/om-review-peer.md: Use `node --experimental-strip-types .claude/scripts/charcount.ts <file> "<section>" "" <limit>` to verify.
  • .claude/commands/om-review-peer.md: Run these before presenting the draft:
  • .claude/commands/om-review-peer.md: [ ] All sections within your tool's character limit (use `node --experimental-strip-types .claude/scripts/charcount.ts <file> "<section>" "" <limit>`)
  • .claude/commands/om-self-review.md: [ ] All sections within your tool's character limit (use `node --experimental-strip-types .claude/scripts/charcount.ts <file> "<section>" "" <limit>`)
  • .claude/commands/om-standup.md: Run the morning standup.
  • .claude/commands/om-standup.md: Re-reading `Home.md`, `brain/North Star.md`, or re-running `git log` doubles the token cost for zero new information.
  • .claude/commands/om-tidy.md: Run on demand, during wrap-up when flags are present, or when the flag list has visibly piled up.
  • .claude/commands/om-tidy.md: **Completed-not-archived** — `git mv` from `work/active/` to `work/archive/YYYY/`;
  • .claude/commands/om-tidy.md: `node --experimental-strip-types .claude/scripts/tidy-fix.ts [--apply]` runs the DETERMINISTIC subset from cron with no agent: archives completed work, migrates misplaced memory files (copy → regenerate index → verify → remove), and refuses every judgment class with a pointer back here.
  • .claude/commands/om-tidy.md: Dry-run by default.
  • .claude/commands/om-vault-audit.md: If a note is in the wrong folder, move it with `git mv`
  • .claude/commands/om-vault-upgrade.md: /om-vault-upgrade --dry-run # show the upgrade plan only
  • .claude/commands/om-vault-upgrade.md: /om-vault-upgrade <path-to-source-vault> --dry-run
  • .claude/commands/om-vault-upgrade.md: /om-vault-upgrade --source <path-to-source-vault> [--dry-run]
  • .claude/commands/om-vault-upgrade.md: `--dry-run` — produce the plan without changing anything
  • .claude/commands/om-vault-upgrade.md: upgrade with `npm i -g shardmind@latest`).
  • .claude/commands/om-vault-upgrade.md: node --experimental-strip-types .claude/scripts/upgrade-plan.ts
  • .claude/commands/om-vault-upgrade.md: **Managed** (`.shardmind/state.json` exists): it reads `shardmind --json` and `shardmind update --dry-run --json`.
  • .claude/commands/om-vault-upgrade.md: It reads `shardmind adopt … --from-version <v> --dry-run --yes --json` and hashes each differing file against that release.
  • .claude/commands/om-vault-upgrade.md: With `--dry-run`, stop here.
  • .claude/commands/om-vault-upgrade.md: ShardMind executes only through its terminal UI (`--json` works with `--dry-run` only), so run it non-interactively: `CI=true … --yes < /dev/null`.
  • .claude/commands/om-vault-upgrade.md: **Conflicts:** ask the user to run `!
  • .claude/commands/om-vault-upgrade.md: A managed update deletes an untouched `CLAUDE.md` or `GEMINI.md` in that same run;
  • .claude/commands/om-vault-upgrade.md: node --experimental-strip-types .claude/scripts/upgrade-plan.ts --apply-behind
  • .claude/commands/om-vault-upgrade.md: **Conflicts:** have the user run `!
  • .claude/commands/om-vault-upgrade.md: The hooks run: `echo '{}' | node --experimental-strip-types .claude/scripts/session-start.ts` exits 0 and prints the session context, as one JSON object whose `hookSpecificOutput.additionalContext` carries it.
  • .claude/commands/om-vault-upgrade.md: **Not found**: run version fingerprint detection from the target's `vault-manifest.json`:
  • .claude/commands/om-vault-upgrade.md: Run Tier 0 (vault shape detection) to understand the organizational pattern
  • .claude/commands/om-vault-upgrade.md: On re-run, compute the **source hash** for each source file and compare against the logged source hash:
  • .claude/commands/om-vault-upgrade.md: Say 'go' to execute."
  • .claude/commands/om-vault-upgrade.md: **For `--dry-run`**: write the plan to `thinking/vault-upgrade-plan-YYYY-MM-DD.md` and stop.
  • .claude/commands/om-vault-upgrade.md: ⚠ 3 orphan notes (no inbound links) — run /om-vault-audit to fix
  • .claude/commands/om-vault-upgrade.md: "Run `/om-vault-audit` for a full structural check"
  • .claude/commands/om-weekly.md: **`brag-spotter`** — run with weekly scope to find uncaptured wins and competency gaps
  • .claude/commands/om-weekly.md: `git log --since="7 days ago" --oneline --no-merges` — all vault changes
  • .claude/commands/om-weekly.md: Run the `brag-spotter` subagent with its standard (quarterly) scope, then filter its findings down to wins that clearly occurred in the past 7 days.
  • .claude/commands/om-wrap-up.md: **`brag-spotter`** — run at the end to find uncaptured wins and competency gaps from the session
  • .claude/commands/om-wrap-up.md: Auto-memory index — if brain/ notes were added or their descriptions changed, REGENERATE the index instead of hand-editing it: `node --experimental-strip-types .claude/scripts/generate-memory-index.ts > <your ~/.claude/projects/<slug>/memory/MEMORY.md path>`.
  • .claude/skills/defuddle/SKILL.md: If not installed: `npm install -g defuddle`
  • .claude/skills/excalidraw-diagram/SKILL.md: When generating an Excalidraw diagram, **automatically execute these steps:**
  • .claude/skills/excalidraw-diagram/SKILL.md: 1. Open https://excalidraw.com · uses the network
  • .claude/skills/excalidraw-diagram/SKILL.md: 1. Open https://dai-shi.github.io/excalidraw-animate/ · uses the network
  • .claude/skills/obsidian-bases/SKILL.md: | Function | Signature | Description | |----------|-----------|-------------| | `date()` | `date(string): date` | Parse string to date (`YYYY-MM-DD HH:mm:ss`) | | `now()` | `now(): date` | Current date and time | | `today()` | `today(): date` | Current date (time = 00:00:00) | | `if()` …[+244 chars] · uses the network
  • .claude/skills/obsidian-cli/SKILL.md: Run `obsidian help` to see all available commands.
  • .claude/skills/obsidian-cli/SKILL.md: Run JavaScript in the app context:
  • .claude/skills/obsidian-cli/SKILL.md: Run `obsidian help` to see additional developer commands including CDP and debugger controls.
  • .claude/skills/qmd/SKILL.md: Use when the MCP server isn't registered (older vault clones, Windows install drift, disabled in `.mcp.json`), or for one-off shell checks outside a session.
  • .claude/skills/qmd/SKILL.md: The template ships `qmd_index` empty so every install gets its own store without being asked a question.
  • .claude/skills/qmd/SKILL.md: The SessionStart hook and the PostToolUse debounced refresh both run this automatically;
  • .claude/skills/qmd/SKILL.md: `qmd --index <name> embed` — Regenerate vector embeddings (slower, run after bulk changes).
  • .claude/skills/qmd/SKILL.md: Run the bootstrap once:
  • .claude/skills/qmd/SKILL.md: node --experimental-strip-types .scripts/qmd-bootstrap.ts
  • .claude/skills/qmd/SKILL.md: Idempotent — safe to re-run.
  • .claude/skills/qmd/SKILL.md: Run `qmd --index <name> update && qmd --index <name> embed` in the shell.
  • .claude/skills/qmd/SKILL.md: The SessionStart hook and the PostToolUse debounced refresh run `update` automatically, but `embed` should be run explicitly after sessions that create many notes.
  • AGENTS.md: Stale Actives), `Recently Touched` (recency by real mtime — the answer to "what's most recent", not filename dates), `Incidents`, `People Directory`, `1-1 History`, `Review Evidence`, `Competency Map`, `Templates` | | `work/` | Work notes index | `Index.md` (detailed MOC) | | `work/ac …[+1219 chars]
  • AGENTS.md: See `.claude/rules/obsidian-cli.md`, or run `obsidian help`.
  • AGENTS.md: Codex will find and execute the command file.
  • AGENTS.md: On a fresh clone, run `node --experimental-strip-types .scripts/qmd-bootstrap.ts` once to build the index.
  • AGENTS.md: Run `/om-standup`.
  • AGENTS.md: **Zero data loss**: when reorganizing, always use `git mv`.

Hooks (14)

  • .claude/settings.json (SessionStart): node --disable-warning=ExperimentalWarning --experimental-strip-types "$(r="${CLAUDE_PROJECT_DIR:-.}"; d="$r"; while [ ! -f "$d/vault-manifest.json" ] && p="$(dirname "$d")" && [ "$d" != "$p" ]; do d="$p"; done; [ -f "$d/vault-manifest.json" ] || d="$r"; printf %s "$d")/.claude/scripts/ …[+17 chars]
  • .claude/settings.json (UserPromptSubmit): node --disable-warning=ExperimentalWarning --experimental-strip-types "$(r="${CLAUDE_PROJECT_DIR:-.}"; d="$r"; while [ ! -f "$d/vault-manifest.json" ] && p="$(dirname "$d")" && [ "$d" != "$p" ]; do d="$p"; done; [ -f "$d/vault-manifest.json" ] || d="$r"; printf %s "$d")/.claude/scripts/ …[+20 chars]
  • .claude/settings.json (PostToolUse): node --disable-warning=ExperimentalWarning --experimental-strip-types "$(r="${CLAUDE_PROJECT_DIR:-.}"; d="$r"; while [ ! -f "$d/vault-manifest.json" ] && p="$(dirname "$d")" && [ "$d" != "$p" ]; do d="$p"; done; [ -f "$d/vault-manifest.json" ] || d="$r"; printf %s "$d")/.claude/scripts/ …[+18 chars]
  • .claude/settings.json (PreCompact): node --disable-warning=ExperimentalWarning --experimental-strip-types "$(r="${CLAUDE_PROJECT_DIR:-.}"; d="$r"; while [ ! -f "$d/vault-manifest.json" ] && p="$(dirname "$d")" && [ "$d" != "$p" ]; do d="$p"; done; [ -f "$d/vault-manifest.json" ] || d="$r"; printf %s "$d")/.claude/scripts/ …[+15 chars]
  • .claude/settings.json (Stop): node --disable-warning=ExperimentalWarning --experimental-strip-types "$(r="${CLAUDE_PROJECT_DIR:-.}"; d="$r"; while [ ! -f "$d/vault-manifest.json" ] && p="$(dirname "$d")" && [ "$d" != "$p" ]; do d="$p"; done; [ -f "$d/vault-manifest.json" ] || d="$r"; printf %s "$d")/.claude/scripts/ …[+18 chars]
  • .codex/hooks.json (SessionStart): node --disable-warning=ExperimentalWarning --experimental-strip-types "${CODEX_PROJECT_DIR:-.}/.claude/scripts/session-start.ts"
  • .codex/hooks.json (UserPromptSubmit): node --disable-warning=ExperimentalWarning --experimental-strip-types "${CODEX_PROJECT_DIR:-.}/.claude/scripts/classify-message.ts"
  • .codex/hooks.json (PostToolUse): node --disable-warning=ExperimentalWarning --experimental-strip-types "${CODEX_PROJECT_DIR:-.}/.claude/scripts/validate-write.ts"
  • .codex/hooks.json (Stop): node --disable-warning=ExperimentalWarning --experimental-strip-types "${CODEX_PROJECT_DIR:-.}/.claude/scripts/stop-checklist.ts"
  • .gemini/settings.json (SessionStart): node --disable-warning=ExperimentalWarning --experimental-strip-types .claude/scripts/session-start.ts
  • .gemini/settings.json (BeforeAgent): node --disable-warning=ExperimentalWarning --experimental-strip-types .claude/scripts/classify-message.ts
  • .gemini/settings.json (AfterTool): node --disable-warning=ExperimentalWarning --experimental-strip-types .claude/scripts/validate-write.ts
  • .gemini/settings.json (PreCompress): node --disable-warning=ExperimentalWarning --experimental-strip-types .claude/scripts/pre-compact.ts
  • .gemini/settings.json (SessionEnd): node --disable-warning=ExperimentalWarning --experimental-strip-types .claude/scripts/stop-checklist.ts

MCP servers (2)

  • .mcp.json (qmd): node .claude/scripts/qmd-mcp.mjs
  • README.md (om): node /absolute/path/to/your-vault/.claude/scripts/om-mcp.mjs
  • Medium risk: runs-instruction-instruction-network (.claude/skills/excalidraw-diagram/SKILL.md:456)
  • Medium risk: runs-instruction-instruction-network (.claude/skills/excalidraw-diagram/SKILL.md:470)
  • Medium risk: runs-instruction-instruction-network (.claude/skills/obsidian-bases/SKILL.md:181)
  • Low risk: network-instructions (.claude/commands/om-vault-upgrade.md:30)
  • Low risk: scripts-present (.claude/scripts/classify-message.ts)
  • Low risk: scripts-present (.claude/scripts/lib/active-hygiene.ts)
  • Low risk: scripts-present (.claude/scripts/lib/atomic-write.ts)
  • Low risk: scripts-present (.claude/scripts/lib/correction-sweep.ts)
  • Low risk: scripts-present (.claude/scripts/lib/env-path.ts)
  • Low risk: scripts-present (.claude/scripts/lib/frontmatter.ts)
  • Low risk: scripts-present (.claude/scripts/lib/hint-state.ts)
  • Low risk: scripts-present (.claude/scripts/lib/hook-io.ts)
  • Low risk: scripts-present (.claude/scripts/lib/instruction-files.ts)
  • Low risk: scripts-present (.claude/scripts/lib/main-guard.ts)
  • Low risk: scripts-present (.claude/scripts/lib/matcher.ts)
  • Low risk: scripts-present (.claude/scripts/lib/mcp-exposure.ts)
  • Low risk: scripts-present (.claude/scripts/lib/mcp-qmd-client.ts)
  • Low risk: scripts-present (.claude/scripts/lib/memory-promoted.ts)
  • Low risk: scripts-present (.claude/scripts/lib/memory-recall.ts)
  • Low risk: scripts-present (.claude/scripts/lib/memory-supersede.ts)
  • Low risk: scripts-present (.claude/scripts/lib/memory-write.ts)
  • Low risk: scripts-present (.claude/scripts/lib/om-mod.ts)
  • Low risk: scripts-present (.claude/scripts/lib/project-dir.ts)
  • Low risk: scripts-present (.claude/scripts/lib/prose-width.ts)
  • Low risk: scripts-present (.claude/scripts/lib/qmd-cwd.ts)
  • Low risk: scripts-present (.claude/scripts/lib/qmd-refresh.ts)
  • Low risk: scripts-present (.claude/scripts/lib/qmd.ts)
  • Low risk: scripts-present (.claude/scripts/lib/read-head.ts)
  • Low risk: scripts-present (.claude/scripts/lib/regex.ts)
  • Low risk: scripts-present (.claude/scripts/lib/reinject.ts)
  • Low risk: scripts-present (.claude/scripts/lib/report-key.ts)
  • Low risk: scripts-present (.claude/scripts/lib/session-start-run.ts)
  • Low risk: scripts-present (.claude/scripts/lib/session-start.ts)
  • Low risk: scripts-present (.claude/scripts/lib/signals.ts)
  • Low risk: scripts-present (.claude/scripts/lib/stop-handoff.ts)
  • Low risk: scripts-present (.claude/scripts/lib/stop-report.ts)
  • Low risk: scripts-present (.claude/scripts/lib/write-targets.ts)
  • Low risk: scripts-present (.claude/scripts/pre-compact.ts)
  • Low risk: scripts-present (.claude/scripts/qmd-mcp.mjs)
  • Low risk: scripts-present (.claude/scripts/session-start.ts)
  • Low risk: scripts-present (.claude/scripts/stop-checklist.ts)
  • Low risk: scripts-present (.claude/scripts/validate-write.ts)
  • Low risk: network-instructions (.claude/skills/defuddle/SKILL.md:10)

AutoGineer scanned breferrari/obsidian-mind@fae7be4 (fae7be4).

Attribution and licence

First committed by
GitHub avatar of breferraribreferrari
Declared authors
  • Steph Ango (declared in .claude-plugin/plugin.json)
Publisher
Brenno Ferrari (Community)
Source
breferrari/obsidian-mind · commit fae7be4
Licence
MIT License (files served here)
  • ATTRIBUTION.md (written by AutoGineer)
Synced
Contributors
breferrari, Yi-111-a, sedetweiler, A220man, HoangThai18

AutoGineer is not affiliated with or endorsed by breferrari.

Install from source

3 of its files are not served here, so there is no ZIP. breferrari/obsidian-mind at fae7be4