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.
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.
| Folder | Role | Files |
|---|---|---|
| .claude | agent-config | 230 |
| .codex | agent-config | 1 |
| .gemini | agent-config | 21 |
| .github | agent-config | 11 |
| .obsidian | obsidian-config | 1 |
| brain | memory | 6 |
| templates | templates | 5 |
| .claude-plugin | folder | 2 |
| .scripts | folder | 3 |
| .shardmind | folder | 6 |
| bases | folder | 9 |
| org | folder | 3 |
| perf | folder | 4 |
| reference | folder | 1 |
| thinking | folder | 1 |
| work | folder | 6 |
The agent reads
- .claude/rules/thinking.md evidence: AGENTS.md
- work/active/ evidence: AGENTS.md
- .claude/rules/brain-topics.md evidence: AGENTS.md
- .claude/rules/vault-from-another-repo.md evidence: AGENTS.md
- perf/evidence/ evidence: AGENTS.md
- perf/ evidence: AGENTS.md
- work/ evidence: AGENTS.md
- brain/ evidence: README.md
- AGENTS.md evidence: README.md
- .gemini/commands/ evidence: README.md
- .gemini/settings.json evidence: README.md
The agent writes
- work/ evidence: AGENTS.md
- work/Index.md evidence: AGENTS.md
- perf/Brag Doc.md evidence: AGENTS.md
- brain/ evidence: AGENTS.md
- brain/Memories.md evidence: AGENTS.md
- .shardmind/ evidence: README.md
- vault-manifest.json evidence: README.md
- AGENTS.md evidence: README.md
- record_work evidence: README.md
- perf/evidence/ evidence: README.md
- .claude/agents/ evidence: README.md
- .claude/scripts/ evidence: README.md
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
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
Clone the repository at the commit AutoGineer scanned:
git clone https://github.com/breferrari/obsidian-mind.git && cd obsidian-mind && git checkout fae7be467fc5e23bf9d51df7207d41f0c07e2754In Obsidian, choose “Open folder as vault” and pick the folder.
Point Claude Code at .claude-plugin/marketplace.json: it does not read that file on its own.
cd obsidian-mind && claude
AutoGineer scanned these files at commit fae7be4.
- 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
- 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
- Not scanned by AutoGineerThe author also offers https://github.com/breferrari/obsidian-mind/tree/fae7be467fc5e23bf9d51df7207d41f0c07e2754. https://github.com/breferrari/obsidian-mind/tree/fae7be467fc5e23bf9d51df7207d41f0c07e2754
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
<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 taskIncident 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 entryEnd of day:
You: "wrap up"
# → verifies all notes have links
# → updates indexes
# → brag-spotter finds uncaptured wins
# → suggests improvements🚀 Quick Start
📦 Install via ShardMind (recommended)
npm install -g shardmind
mkdir my-vault && cd my-vault
shardmind install github:breferrari/obsidian-mindshardmind 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:
Open the installed folder as an Obsidian vault
Enable the Obsidian CLI in Settings → General (requires Obsidian 1.12+)
Run your agent in the vault directory:
claude,codex, orgemini. Codex runs the vault's hooks only once the folder is trusted and each hook approved: see Using with Other Agents.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.gitOr 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).
🔍 Recommended: QMD Semantic Search
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 consultbrain/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, andmcp__qmd__multi_getappear 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.tsThe 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 notesHow 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:
| model | size | job |
|---|---|---|
embeddinggemma-300M | ~328MB | turns notes and queries into vectors |
qmd-query-expansion-1.7B | ~1.28GB | rewrites your query into better search terms |
Qwen3-Reranker-0.6B | ~640MB | reorders 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
recallwith a query takes a couple of seconds whilerecallwithout one is near-instant.searchover 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-typesflag, 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.jsonneed 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:
| Hook | When | What |
|---|---|---|
| 🚀 SessionStart | On startup/resume | QMD 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 |
| 💬 UserPromptSubmit | Every message | Classifies 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 |
| ✍️ PostToolUse | After writing .md | Validates frontmatter + wikilinks, blocks misplaced memory files, flags oversized notes (split, don't trim) and write-time topic clusters |
| 💾 PreCompact | Before context compaction | Backs up session transcript to thinking/session-logs/ |
| 🏁 Stop | After every response | Checklist + 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.mddoes. 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 iseager_layer_instruction_budget_bytesinvault-manifest.json; sections that never shrink, such as open tasks, can still take it past that./memorylists 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 readsobsidian-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:
| Tier | What | When | Cost |
|---|---|---|---|
| Always | AGENTS.md (plus .claude/rules/ on Claude Code) + SessionStart context (North Star excerpt, git summary, tasks, vault file listing) | Session start | capped 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-demand | QMD semantic search results | When the agent needs specific context | Targeted |
| Triggered | Classification routing hints | Every message | ~100 tokens |
| Triggered | PostToolUse validation | After .md writes | ~200 tokens |
| Rare | Full file reads | Only when explicitly needed | Variable |
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.
| Agent | Reads AGENTS.md | From a vault subfolder | Also loads | Known gaps |
|---|---|---|---|---|
| Claude Code | Natively, when no CLAUDE.md is present | Yes, but @ imports are dropped (upstream) | .claude/rules/*.md | A CLAUDE.md beside or above AGENTS.md is read instead, silently: see Troubleshooting |
| Codex CLI | Natively | Yes (walks up to the git root) | — | Stops reading past ~32 KiB, silently |
| Gemini CLI | Through .gemini/settings.json (context.fileName) | No: see Troubleshooting | — | What a live session does with it is not yet observed (TBC) |
| Antigravity | Natively | Yes | — (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) |
| Grok | Once the folder is trusted | Yes, once trusted | .claude/rules/*.md and CLAUDE.md, plus project .claude/settings.json hooks and user-level ~/.claude skills, permissions and hooks | An 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.tomlunder[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_hashunder[hooks.state]. Approving them in an interactivecodexsession 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 theobsidian-mindmod are Claude Code-specific..claude/rules/hooks-per-agent.mdmaps 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 withrecall. It returns memories, and the store is empty on a project's first session by construction:rememberrefuses 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 promisesrecallwill 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
instructionsfield 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
instructionsreaches 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.
| Command | What It Does |
|---|---|
/om-standup | Morning kickoff — loads context, reviews yesterday, surfaces tasks, suggests priorities |
/om-dump | Freeform capture — talk naturally about anything, routes it all to the right notes |
/om-wrap-up | Full session review — verify notes, indexes, links, suggest improvements |
/om-humanize | Voice-calibrated editing — makes Claude-drafted text sound like you wrote it |
/om-weekly | Weekly synthesis — cross-session patterns, North Star alignment, uncaptured wins |
/om-capture-1on1 | Capture a 1:1 meeting transcript into a structured vault note |
/om-incident-capture | Capture an incident from Slack/channels into structured notes |
/om-slack-scan | Deep scan Slack channels/DMs for evidence |
/om-peer-scan | Deep scan a peer's GitHub PRs for review prep |
/om-review-brief | Generate a review brief (manager or peer version) |
/om-self-review | Write your self-assessment for review season — projects, competencies, principles |
/om-review-peer | Write a peer review — projects, principles, performance summary |
/om-tidy | Self-maintenance — acts on every hygiene flag: archive, group, split. Never deletes, never commits |
/om-correct | Sweep a corrected fact — applies it at the single source, links restatements, preserves dated records |
/om-vault-audit | Audit indexes, links, orphans, stale context |
/om-vault-upgrade | Upgrade this vault through ShardMind (keeps your local improvements), or import content from an existing vault — version detection, classification, migration |
/om-prep-1on1 | Prep for an upcoming 1:1 — load person context, open items, suggested agenda |
/om-meeting | Prep for any meeting by topic — subject-forward briefing with open items and considerations |
/om-intake | Process meeting notes inbox — classify and route to the right vault notes |
/om-project-archive | Move 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.
| Agent | Purpose | Invoked by |
|---|---|---|
brag-spotter | Finds uncaptured wins and competency gaps | /om-wrap-up, /om-weekly |
context-loader | Loads all vault context about a person, project, or concept | Direct |
cross-linker | Finds missing wikilinks, orphans, broken backlinks | /om-vault-audit |
people-profiler | Bulk creates/updates person notes from Slack profiles | /om-incident-capture |
review-prep | Aggregates all performance evidence for a review period | /om-review-brief |
slack-archaeologist | Full Slack reconstruction — every message, thread, profile | /om-incident-capture |
vault-librarian | Deep vault maintenance — orphans, broken links, stale notes | /om-vault-audit |
review-fact-checker | Verify every claim in a review draft against vault sources | /om-self-review, /om-review-peer |
vault-migrator | Classify, 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:
Competency notes in
perf/competencies/define your org's competency framework — one note per competencyWork notes link to competencies in their
## Relatedsection, annotated with what was demonstratedBacklinks accumulate automatically — review prep becomes reading the backlinks panel on each competency note
Brag Doc aggregates wins per quarter with links to evidence notes
/om-peer-scandeep-scans a colleague's GitHub PRs and writes structured evidence toperf/evidence//om-review-briefgenerates 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.
| Base | Shows |
|---|---|
| Work Dashboard | Active projects filtered by quarter, grouped by status — plus a Stale Actives view (active but untouched 14+ days) |
| Recently Touched | Every note by real modified time — the correct answer to "what did I work on recently" (filename dates lie for living notes) |
| Incidents | All incidents sorted by severity and date |
| People Directory | Everyone in org/people/ with role, team |
| 1:1 History | All 1:1 notes sortable by person and date |
| Review Evidence | PR scans and evidence grouped by person and cycle |
| Competency Map | Competencies with evidence counts from backlinks |
| Templates | Quick 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-updateNOTE
.shardmind/is additive, not load-bearing. A clone-and-open vault never reads it; only theshardmindCLI 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
.basefilesjson-canvas — Visual
.canvasfile creationdefuddle — 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:
| What | Where |
|---|---|
| Your goals | brain/North Star.md — grounds every session |
| Your org | org/ — add your manager, team, key collaborators |
| Your competencies | perf/competencies/ — match your org's framework |
| Your tools | .claude/commands/ — edit for your GitHub org, Slack workspace |
| Your conventions | AGENTS.md — the operating manual, evolve it as you go (.claude/rules/ for Claude Code-only additions) |
| Your domain | Add folders, subagents in .claude/agents/, or classification rules in .claude/scripts/ |
IMPORTANT
AGENTS.mdis 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-mindThe 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 mainNew 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/mainResolve 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-mindThe 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-vaultThe agent will:
Detect your vault version (v1–v3.x, or identify it as a non-obsidian-mind vault)
Inventory every file — classify as user content, scaffold, infrastructure, or uncategorized
Present a migration plan — you see exactly what will be copied, transformed, and skipped
Execute after your approval — transforms frontmatter, fixes wikilinks, rebuilds indexes
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.mdin the vault. An update keeps aCLAUDE.mdyou edited. The session hygiene flags sayCLAUDE.md present beside AGENTS.md, and/om-vault-upgradelists it under Move out. Move what you added to.claude/rules/local.md(or intoAGENTS.mdif every agent needs it, keepingAGENTS.mdunder 23 KB, where the hygiene flags start: Antigravity stops reading it at ~24,000 bytes), then deleteCLAUDE.md. Nothing is merged automatically.A
CLAUDE.mdin a folder above the vault. Claude Code reads that one too, andAGENTS.mdis 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
kepano/obsidian-skills — Official Obsidian agent skills
James Bedford — Vault structure philosophy, separation of AI-generated content
arscontexta — Progressive disclosure via description fields, session hooks
👤 Author
Created by Brenno Ferrari — Senior iOS Engineer in Berlin, building developer tools with Claude Code.
📄 License
MIT
README.ko.md
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는 강력하지만 기억하지 못합니다. 매 세션이 제로에서 시작됩니다 — 당신의 목표, 팀, 패턴, 성과에 대한 컨텍스트가 없습니다. 같은 내용을 반복해서 설명해야 합니다. 세 번의 대화 전에 내린 결정이 사라집니다. 지식이 축적되지 않습니다.
🟢 해결책
에이전트에게 뇌를 주세요.
You: "start session"
에이전트: *reads North Star, checks active projects, scans recent memories*
에이전트: "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."shardmind install 또는 git clone으로 설치 — 어느 쪽이든 동일한 볼트입니다.
⚡ 실제 동작 예시
<p align="center"> <img src="obsidian-mind-demo.gif" alt="Obsidian Mind 데모 — standup 및 dump 명령어" width="800"> </p>
아침 킥오프:
/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."회의 후 브레인 덤프:
/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인시던트 대응:
/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하루 마무리:
You: "wrap up"
# → verifies all notes have links
# → updates indexes
# → brag-spotter finds uncaptured wins
# → suggests improvements🚀 빠른 시작
📦 ShardMind로 설치 (권장)
npm install -g shardmind
mkdir my-vault && cd my-vault
shardmind install github:breferrari/obsidian-mindshardmind install은 현재 디렉토리에 기록하므로, 먼저 새 폴더를 만들고 그 안으로 이동하세요. 마법사가 이름, 조직, 볼트 목적, 포함할 에이전트, QMD 활성화 여부를 수집합니다. 이어서 ShardMind가 git을 초기화하고, 필요 시 QMD를 부트스트랩하며, 답변에 따라 brain/North Star.md를 개인화합니다. 그런 다음:
설치된 폴더를 Obsidian 볼트로 엽니다
설정 → 일반에서 Obsidian CLI를 활성화합니다 (Obsidian 1.12+ 필요)
볼트 디렉토리에서 에이전트를 실행합니다:
claude,codex, 또는gemini. Codex는 폴더가 신뢰되고 각 훅이 승인되기 전까지 볼트의 훅을 실행하지 않습니다: 다른 에이전트와 사용하기 참고.업무에 대해 이야기를 시작하세요
ShardMind는 Obsidian 볼트 템플릿의 패키지 매니저입니다. 설치 시 .shardmind/ 사이드카가 추가되어 마법사, 선택적 모듈 (사용하지 않는 것은 건너뛰기), 3-way 머지 업그레이드를 제공합니다. 모든 값이 기본값일 때 설치 결과는 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 가 설정되어 있으면 그 값, 설정되어 있지 않으면 볼트 폴더 이름을 슬러그화한 값). SessionStart 훅, .mcp.json 래퍼, CLI 명령은 모두 동일한 매니페스트 필드를 참조하므로, 같은 머신의 다른 볼트와 QMD 데이터가 섞이지 않습니다. CLI 명령에는 항상 --index <이름> 을 전달하세요:
qmd --index obsidian-mind query "캐싱에 대해 뭘 결정했지?"
qmd --index obsidian-mind update # 일괄 편집 후
qmd --index obsidian-mind embed # 많은 신규 노트 후MCP를 통한 네이티브 에이전트 도구. .mcp.json에 Model Context Protocol 서버로 등록되어 있습니다 — QMD가 설치되어 있으면 mcp__qmd__query, mcp__qmd__get, mcp__qmd__multi_get가 Read와 Edit 옆에 에이전트의 도구 메뉴에 나타납니다. 서브에이전트, 슬래시 명령, 메인 대화 모두 동일한 타입 지정 계약을 호출합니다. 나중에 다른 MCP 호환 도구(데이터베이스, 티켓팅 시스템, 캘린더)를 추가하면 같은 방식으로 플러그인됩니다.
내부 동작 방식
QMD는 세 개의 작은 모델을 로컬에서 실행하므로, 설정할 API 키도 없고 쿼리당 비용도 없으며 오프라인에서도 동작합니다:
| 모델 | 크기 | 역할 |
|---|---|---|
embeddinggemma-300M | ~328MB | 노트와 쿼리를 벡터로 변환 |
qmd-query-expansion-1.7B | ~1.28GB | 쿼리를 더 나은 검색어로 재작성 |
Qwen3-Reranker-0.6B | ~640MB | 후보를 실제 관련성으로 재정렬 |
첫 사용 시 다운로드되어 캐시됩니다. GPU를 찾으면 오프로드하며(외장 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 지원)
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의 훅 명령어를 한 줄만 수정하면 됩니다.
⚙️ 작동 원리
절차적 코드는 환경을 소유하고, 에이전트는 콘텐츠를 소유합니다. .claude/scripts/의 훅이 분류, 검증, 인덱싱, 라이프사이클 주입을 처리합니다 — 결정론적이고, 테스트 가능하며, 모든 에이전트에서 동일하게 실행됩니다. 노트를 작성하고, 분류하고, 링크하고, 브리프를 작성하는 것 — 이는 판단이며 에이전트의 몫으로 남겨집니다. 양쪽은 작은 핸드오프에서 만납니다(훅이 컨텍스트를 주입하고 에이전트가 볼트를 읽음) — 서로의 일을 할 필요가 없습니다.
폴더는 용도별로 그룹화하고, 링크는 의미별로 그룹화합니다. 노트는 하나의 폴더(본거지)에 있지만 여러 노트(컨텍스트)에 링크됩니다. 에이전트는 이 그래프를 유지 관리합니다 — 작업 노트를 사람, 의사결정, 역량에 자동으로 연결합니다. 리뷰 시즌이 오면 각 역량 노트의 백링크가 이미 증거 자료가 됩니다. 링크가 없는 노트는 버그입니다.
볼트 우선 메모리는 세션과 기기 간에 컨텍스트를 유지합니다. 모든 지속 지식은 brain/ 토픽 노트에 있습니다(git 추적, Obsidian 브라우저 가능, 링크됨). Claude Code의 MEMORY.md(~/.claude/)는 볼트 위치를 가리키는 자동 로드 인덱스일 뿐 — 저장소 자체가 아닙니다. 즉, 메모리가 기기 변경에도 유지되며 그래프의 일부가 됩니다.
세션은 설계된 생명주기를 따릅니다. SessionStart 훅이 North Star 목표, 활성 프로젝트, 최근 변경사항, 미완료 작업, 전체 볼트 파일 목록, 볼트 위생 플래그를 자동 주입합니다 — Claude는 빈 상태가 아니라 컨텍스트가 있는 상태로 모든 세션을 시작합니다. 마무리할 때 "wrap up"이라고 말하면 Claude가 /om-wrap-up을 실행합니다 — 노트 검증, 인덱스 업데이트, 누락된 성과 발견. CLAUDE.md가 그 사이의 모든 것을 관리합니다: 파일 배치 위치, 링크 방법, 노트를 분할해야 할 때, 의사결정과 인시던트 처리 방법.
🔗 훅
다섯 개의 생명주기 훅이 라우팅을 자동으로 처리합니다:
| 훅 | 시점 | 동작 |
|---|---|---|
| 🚀 SessionStart | 시작/재개 시 | QMD 재인덱싱+셀프힐, North Star 포커스·활성 작업·최근 변경사항·작업·파일 목록·볼트 위생 플래그 주입 — 전체는 Claude Code의 훅 출력 상한에 맞는 바이트 예산으로 제한되고, 마지막 줄은 주입 크기 미터 |
| 💬 UserPromptSubmit | 매 메시지마다 | 콘텐츠 분류(의사결정, 인시던트, 성과, 1:1, 아키텍처, 인물, 프로젝트 업데이트) 및 라우팅 힌트 주입. 이전 턴의 Stop 보고서도 에이전트에게 전달 |
| ✍️ PostToolUse | .md 작성 후 | 프론트매터+위키링크 검증, 잘못 배치된 메모리 파일 차단, 비대 노트(줄이지 말고 분할)와 작성 시점 토픽 클러스터 플래그 |
| 💾 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), 신뢰하지 않은 폴더입니다. mod는 볼트에 대한 Claude Code의 신뢰 확인을 수락한 뒤에만 로드됩니다.
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 -->
⚡ 토큰 효율성
obsidian-mind는 전체 볼트를 컨텍스트에 로드하지 않습니다. 계층형 로딩으로 토큰 비용을 최소화합니다:
| 계층 | 내용 | 시점 | 비용 |
|---|---|---|---|
| 항상 | CLAUDE.md + SessionStart 컨텍스트 (North Star 발췌, git 요약, 작업, 볼트 파일 목록) | 세션 시작 시 | 매니페스트 예산이 상한 (예산 자체도 Claude Code의 10,000자 훅 출력 상한 안으로 제한됨). 실제 크기는 매 세션 마지막 줄의 미터가 보고 |
| 온디맨드 | QMD 시맨틱 검색 결과 | 에이전트가 특정 컨텍스트 필요 시 | 대상만 |
| 트리거 | 분류 라우팅 힌트 | 매 메시지 | ~100 토큰 |
| 트리거 | PostToolUse 검증 | .md 작성 후 | ~200 토큰 |
| 드물게 | 전체 파일 읽기 | 명시적으로 필요한 경우만 | 가변 |
SessionStart는 가벼운 컨텍스트를 로드합니다 — 주요 파일의 짧은 발췌, 파일명, git 요약만 로드하며 전체 노트 내용은 읽지 않습니다. 에이전트는 QMD를 통해 의미 기반 검색 후 파일을 읽으므로 관련 정보만 가져옵니다. 분류 훅은 메시지당 가벼운 Node 호출 1회입니다. 검증 훅은 마크다운 쓰기 시에만 실행되며 제외된 경로는 건너뜁니다. 볼트가 커져도 주입 계층을 정직하게 유지하는 다섯 가지 메커니즘: 소스 인식 주입 (resume/compact 시 휘발성 섹션만 재주입 — 정적인 대부분은 이미 대화에 있음), 모든 주입의 마지막 줄에 붙는 주입 크기 미터, 미터가 측정한 값을 실제로 강제하는 주입 예산 (상한을 넘으면 잃어도 되는 섹션부터 포인터로 축소되고, 축소된 섹션 이름은 미터에 반드시 표시됨 — 조용한 손실이 비대화보다 나쁘기 때문), 쓰기당 훅 프로세스 1회 (QMD 리프레시가 검증 훅에 동승), 목록 접기 (노트 수 임계값을 넘는 폴더는 한 줄 카운트로 접히므로, 아무도 설정하지 않은 폴더를 통해 볼트가 상한을 넘어 자랄 수 없음). 예산과 임계값 모두 vault-manifest.json 에서 조정할 수 있으며, 예산은 설정값과 관계없이 Claude Code의 10,000자 훅 출력 상한 안으로 제한됩니다. 상한을 넘으면 세션에는 2,000자 미리보기만 전달되기 때문입니다.
🌐 다른 에이전트와 사용하기
obsidian-mind는 Claude Code, Codex CLI, Gemini CLI에서 작동합니다. CLAUDE.md의 볼트 규약, .claude/scripts/의 훅 스크립트, .claude/commands/의 커맨드는 모두 에이전트 비의존적입니다 — 순수 Markdown, TypeScript, 셸이며 SDK 의존성이 없습니다.
Claude Code — 완전 지원. 훅, 커맨드, 서브에이전트, 메모리 시스템이 모두 기본으로 작동합니다.
Codex CLI — AGENTS.md를 네이티브로 읽습니다. .codex/hooks.json의 훅 설정이 Claude Code와 동일한 훅 스크립트를 연결합니다 — 세션 컨텍스트, 메시지 분류, 쓰기 검증이 자동으로 작동합니다.
Codex가 프로젝트의 훅을 실행하려면 두 가지 신뢰가 필요합니다(Codex CLI 0.160.0으로 확인, 2026-10-13 기준, #345).
볼트 폴더가 신뢰되어 있어야 합니다. Codex는 이를
~/.codex/config.toml의[projects.'<path>']에 기록합니다. Windows에서는 키가\\?\접두사가 붙은 경로입니다(예:[projects.'\\?\C:\path\to\vault']).각 훅이 승인되어 있어야 합니다. Codex는 각 승인을
[hooks.state]아래trusted_hash로 저장합니다. 대화형codex세션에서 승인하면 이것이 기록될 것으로 예상됩니다(추정: #345의 확인에서는 한 번의 비대화형 실행용 플래그--dangerously-bypass-hook-trust로 대신했습니다).
둘 다 갖춰지기 전에는 Codex가 어떤 훅도 실행하지 않으며, 세션에 볼트 컨텍스트가 전달되지 않습니다.
Gemini CLI — GEMINI.md를 네이티브로 읽습니다. .gemini/settings.json의 훅 설정이 Gemini의 이벤트 이름을 공유 훅 스크립트에 매핑합니다.
기타 에이전트 (Cursor, Windsurf, GitHub Copilot, JetBrains AI) — AGENTS.md로 볼트 규약을 읽습니다. 훅 지원은 에이전트마다 다릅니다.
NOTE
훅, 커맨드, 서브에이전트 프롬프트, 볼트 메모리(brain/)는 모두 에이전트 비의존적입니다.~/.claude/자동 메모리 로더만 Claude Code 전용입니다. 자세한 내용은AGENTS.md를 참조하세요.
🧠 어떤 저장소에서든 볼트에 접근하기
볼트는 보통 그 안에서 작업할 때만 도움이 됩니다. om MCP 서버가 이를 바꿉니다. 다른 어떤 저장소의 코딩 세션이든 노트를 검색하고, 읽고, 그래프를 따라가고, 배운 것을 볼트에 다시 기록할 수 있습니다.
{
"mcpServers": {
"om": {
"command": "node",
"args": ["/path/to/your-vault/.claude/scripts/om-mcp.mjs"]
}
}
}이것은 사용하는 프로젝트의 .mcp.json에 들어갑니다. 그런 다음 해당 프로젝트 자체의 CLAUDE.md에 볼트를 가리키는 짧은 섹션을 추가하세요.
IMPORTANT
두 단계 모두 필수이며, 두 번째는 형식적인 절차가 아닙니다. 측정 결과: 서버가 연결되어 있어도 저장소 측 지침이 없으면 세션은 볼트를 한 번도 호출하지 않았고, 볼트가 명시적으로 거부했다고 기록한 설계를 그대로 구현했습니다. 지침이 있을 때는 구현을 거부하고 해당 노트를 인용했습니다.MCP
instructions필드의 금지 사항은 호출하는 세션으로 확실히 전파됩니다. 반면"볼트를 참조하라"는 긍정형 지시는 권고적이며, 더 가까운 정보원이 있으면 건너뜁니다. 서버는 세션을 멈출 수는 있지만, 세션이 찾아보게 만드는 것은 그 프로젝트 자체의 규약뿐입니다.
세션이 얻는 것: search(시맨틱 + 키워드), expand(노트의 링크와 백링크), recall(해당 저장소로 스코프된 지속적 교훈), remember(교훈 기록), record_work(작업 내용 기록), reason(여러 노트에 걸친 판단), health(배선이 정상인지). 여기에 노트를 읽을 수 있는 리소스로 제공합니다.
생각하는 것은 reason 하나입니다. 나머지가 검색이라면, 이것은 두 번째 Claude 세션으로 볼트를 읽고 노트를 가로지르는 판단이 필요한 질문에 답합니다 — 지금 하려는 일이 이 여섯 개의 노트가 결정한 바와 일치하는가? 스스로 먼저 검색을 수행하므로 먼저 검색할 필요가 없습니다. 당신 본인의 CLI 기본 모델로 동작하므로, 볼트는 지금 작업 중인 수준과 같은 수준으로 답합니다. 그리고 어떤 상한도 없습니다 — 당신의 기기에서, 당신의 인증으로 돌아가는 Claude이기 때문입니다. 호출마다 비용·턴 수·모델·실제 소요 시간이 기록됩니다. 답변에는 confidence: inferred가 붙고 그 자체로 메모리에 기록되지 않습니다 — 남길 가치가 있는지는 당신의 세션이 정합니다.
저장소는 폴더 이름으로 식별됩니다. 대개는 맞지만 가끔 틀립니다: api라는 이름의 저장소가 둘이면 하나의 정체성을 공유해 서로의 메모리를 받게 됩니다. 저장소 루트에 .om-project 파일을 두고 다른 이름을 적으면 분리됩니다. health가 어느 저장소로 인식하는지, 그 이름이 어디서 왔는지 알려줍니다.
인식론적 계약이 있는 저장소 간 메모리. 한 저장소에서 배운 교훈은 스코프가 지정된 저장소에만 도달합니다. 도달 범위는 읽을 때 추측되는 것이 아니라 쓸 때 선언되므로, 형제 프로젝트가 다른 프로젝트의 제약을 물려받지 않습니다. 기록되는 모든 것에는 confidence: verified | inferred | unverified, 변동성 있는 사실의 날짜, 그리고 서버 측에서 도출된 출처가 함께 담깁니다 — 세션이 자신이 아닌 프로젝트를 사칭할 수 없습니다. 수정은 덮어쓰기가 아니라 대체로 기록되므로, 저장소는 모순을 쌓아가는 대신 커질수록 더 신뢰할 수 있게 됩니다.
무엇을 제공하는가. 당신의 볼트, 당신의 노트, 당신의 세션입니다. 기본값은 볼트가 이미 자신의 콘텐츠로 선언한 것(user_content_roots)을, 작성한 그대로의 단위로 사용합니다(work/ 전체가 아니라 work/active/). vault-manifest.json의 mcp_exposed_roots를 설정하는 것은 이 볼트가 당신이 공유할 권한이 없는 자료 — 고용주의 기밀 정보나 고객의 데이터 — 를 담고 있을 때뿐입니다. private 태그가 붙은 노트는 제공되지 않으며, 메모리는 자체 스코프를 갖기 때문에 일반 노트로 제공되지 않습니다. 둘 사이를 가로지르는 경우가 하나 있습니다. 캡처의 promoted: 마커가 앵커를 담고 있으면 recall이 brain/의 해당 블록을 제공하므로, 다른 저장소는 처음 작성된 캡처가 아니라 수정된 판을 받습니다. 이 역시 같은 정책의 제약을 받으므로 private이거나 비공개인 노트는 여기서도 거부됩니다. 모든 읽기는 호출한 저장소와 함께 기록됩니다.
NOTE
볼트 자료가 공개 PR에 들어가지 않게 하는 것은 공개 목록이 아니라 계약의 일입니다. 세션은 어차피 볼트를 직접 읽을 수 있습니다. 호출하는 세션에 주입되는 금지 사항이 실측으로 효과가 있는 부분입니다.
📅 일일 워크플로우
아침: /om-standup을 실행합니다. 에이전트가 North Star, 활성 프로젝트, 미완료 작업, 최근 변경사항을 로드합니다. 구조화된 요약과 추천 우선순위를 받습니다.
하루 중: 자연스럽게 이야기하세요. 내린 결정, 발생한 인시던트, 방금 마친 1:1, 기억하고 싶은 성과를 언급하세요. 분류 훅이 에이전트가 각 항목을 올바르게 기록하도록 안내합니다. 더 큰 브레인 덤프를 하려면 /om-dump을 사용하고 한 번에 모든 것을 이야기하세요.
하루 끝: "wrap up"이라고 말하면 에이전트가 /om-wrap-up을 호출합니다 — 노트 검증, 인덱스 업데이트, 링크 확인, 누락된 성과 발견.
주간: /om-weekly를 실행하여 세션 간 종합 분석 — North Star 정렬, 패턴, 누락된 성과, 다음 주 우선순위. /om-vault-audit를 실행하여 고아 노트, 깨진 링크, 오래된 콘텐츠를 점검합니다.
리뷰 시즌: /om-review-brief manager를 실행하면 모든 증거가 이미 링크된 구조화된 리뷰 준비 문서를 받습니다.
🛠️ 명령어
.claude/commands/에 정의되어 있습니다. 모든 Claude Code 세션에서 실행할 수 있습니다.
| 명령어 | 기능 |
|---|---|
/om-standup | 아침 킥오프 — 컨텍스트 로드, 어제 리뷰, 작업 표면화, 우선순위 제안 |
/om-dump | 자유 형식 캡처 — 무엇이든 자연스럽게 이야기하면 올바른 노트로 라우팅 |
/om-wrap-up | 전체 세션 리뷰 — 노트, 인덱스, 링크 검증, 개선사항 제안 |
/om-humanize | 목소리 보정 편집 — Claude가 작성한 텍스트를 본인이 쓴 것처럼 수정 |
/om-weekly | 주간 종합 — 세션 간 패턴, North Star 정렬, 누락된 성과 |
/om-prep-1on1 | 1:1 준비 — 상대방 컨텍스트, 미해결 항목, 제안 안건 로드 |
/om-meeting | 주제별 미팅 준비 — 미해결 항목, 차단 요소, 고려사항 브리핑 |
/om-intake | 미팅 노트 수신함 처리 — work/meetings/의 파일을 분류하고 적절한 노트로 라우팅 |
/om-capture-1on1 | 1:1 미팅 트랜스크립트를 구조화된 볼트 노트로 캡처 |
/om-incident-capture | Slack/채널의 인시던트를 구조화된 노트로 캡처 |
/om-slack-scan | Slack 채널/DM을 깊이 스캔하여 증거 수집 |
/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 | 누락된 위키링크, 고아 노트, 깨진 백링크 발견 | /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/에 정의되어 있습니다. 도메인별 워크플로우를 위해 직접 추가할 수 있습니다.
📊 성과 그래프
볼트는 성과 추적 시스템으로도 활용됩니다:
역량 노트(
perf/competencies/)가 조직의 역량 프레임워크를 정의합니다 — 역량별로 하나의 노트작업 노트가
## Related섹션에서 역량에 링크하며, 어떤 역량이 발휘되었는지 주석을 답니다백링크가 자동으로 축적됩니다 — 리뷰 준비는 각 역량 노트의 백링크 패널을 읽는 것으로 충분합니다
Brag Doc가 분기별 성과를 증거 노트 링크와 함께 집계합니다
**
/om-peer-scan**이 동료의 GitHub PR을 깊이 스캔하고 구조화된 증거를perf/evidence/에 작성합니다**
/om-review-brief**가 모든 것을 집계하여 전체 리뷰 브리프를 생성합니다: Brag 항목, 의사결정, 인시던트, 역량 증거, 1:1 피드백
TIP
시작하려면: 템플릿에서 역량 노트를 만들고, 작업하면서 작업 노트에 역량을 링크하세요. 그래프가 나머지를 처리합니다.
📋 Bases
bases/ 폴더에는 노트의 프론트매터 속성을 쿼리하는 데이터베이스 뷰가 있습니다. 노트가 변경되면 자동으로 업데이트됩니다.
| Base | 표시 내용 |
|---|---|
| Work Dashboard | 분기별 필터링, 상태별 그룹화된 활성 프로젝트 — 14일 이상 손대지 않은 활성 노트를 보여주는 Stale Actives 뷰 포함 |
| Recently Touched | 실제 수정 시각 순의 모든 노트 — "최근 무엇을 작업했나"에 대한 정확한 답 (살아있는 노트에서 파일명 날짜는 믿을 수 없음) |
| Incidents | 심각도와 날짜순으로 정렬된 모든 인시던트 |
| People Directory | org/people/의 모든 인물과 역할, 팀 정보 |
| 1:1 History | 인물과 날짜로 정렬 가능한 모든 1:1 노트 |
| Review Evidence | 인물과 주기별로 그룹화된 PR 스캔 및 증거 |
| Competency Map | 백링크 기반 증거 수를 포함한 역량 목록 |
| Templates | 모든 템플릿에 대한 빠른 접근 |
Home.md가 이 뷰들을 임베드하여 볼트의 대시보드 역할을 합니다.
📁 볼트 구조
Home.md 볼트 진입점 — 임베드된 Base 뷰, 바로가기 링크
CLAUDE.md 운영 매뉴얼 — 에이전트가 매 세션마다 읽음
AGENTS.md 멀티에이전트 가이드 — Codex, Cursor, Windsurf 등
GEMINI.md 멀티에이전트 가이드 — Gemini CLI
vault-manifest.json 템플릿 메타데이터 — 버전, 구조, 스키마
.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 모든 작업의 Map of Content
org/
people/ 인물별 노트 — 역할, 팀, 관계, 주요 순간
teams/ 팀별 노트 — 구성원, 범위, 상호작용
People & Context.md 조직 지식의 MOC
perf/
Brag Doc.md 증거에 링크된 성과 기록
brag/ 분기별 Brag 노트 (분기당 하나)
competencies/ 역량별 노트 (링크 대상)
evidence/ PR 심층 스캔, 리뷰용 데이터 추출
<cycle>/ 리뷰 주기별 브리프 및 산출물
brain/
North Star.md 목표와 집중 영역 — 매 세션마다 읽음
Memories.md 메모리 토픽 인덱스
Key Decisions.md 중요한 의사결정과 근거
Patterns.md 작업 전반에서 관찰된 반복 패턴
Gotchas.md 잘못된 것들과 그 이유
Skills.md 커스텀 워크플로우와 슬래시 명령어
reference/ 코드베이스 지식, 아키텍처 맵, 플로우 문서
thinking/ 초안을 위한 스크래치패드 — 결과 정리 후 삭제
templates/ YAML 프론트매터가 포함된 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-updateNOTE
.shardmind/는 추가 기능이며, 필수 요소가 아닙니다. 클론하여 열기만 하는 볼트는 이 파일을 읽지 않으며,shardmindCLI만 사용합니다. 삭제해도 볼트는 계속 작동합니다. v6 레이아웃 계약은 shardmind/docs/SHARD-LAYOUT.md를 참조하세요.
📝 템플릿
YAML 프론트매터가 포함된 템플릿으로, 각각 점진적 공개를 위한 description 필드를 포함합니다:
Work Note — 날짜, 설명, 프로젝트, 상태, 분기, 태그
Decision Record — 날짜, 설명, 상태 (proposed/accepted/deprecated), 담당자, 맥락
Thinking Note — 날짜, 설명, 맥락, 태그 (스크래치패드 — 정리 후 삭제)
Competency Note — 날짜, 설명, 현재 레벨, 목표 레벨, 숙련도 표
1:1 Note — 날짜, 상대방, 핵심 요점, 액션 아이템, 인용, 주시 사항
Incident Note — 날짜, 티켓, 심각도, 역할, 타임라인, 근본 원인, 영향
🔧 포함 항목
🧩 Obsidian 스킬
kepano/obsidian-skills가 .claude/skills/에 사전 설치되어 있습니다:
obsidian-markdown — Obsidian 특화 마크다운 (위키링크, 임베드, 콜아웃, 속성)
obsidian-cli — 볼트 운영을 위한 CLI 명령어
obsidian-bases — 데이터베이스 스타일
.base파일json-canvas — 시각적
.canvas파일 생성defuddle — 웹 페이지를 마크다운으로 추출
🔍 QMD 스킬
.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는 운영 매뉴얼입니다. 규칙을 변경하면 이 파일을 업데이트하세요 — 에이전트가 매 세션마다 읽습니다.
🔄 업그레이드
에이전트에게 요청하기
가장 간단한 방법 — 에이전트에게 말하세요:
이 볼트를 최신 obsidian-mind로 업데이트해줘 https://github.com/breferrari/obsidian-mind에이전트가 최신 변경사항을 가져오고, 충돌을 해결하고, 인프라 파일을 업데이트합니다. Claude Code, Codex CLI, Gemini CLI 모두에서 작동합니다.
기존 클론 업데이트
리포지토리를 직접 클론한 경우:
cd your-vault
git pull origin main새 파일(AGENTS.md, GEMINI.md, .codex/, .gemini/)이 자동으로 추가되고 훅 스크립트도 업데이트됩니다.
포크 업데이트
리포지토리를 포크한 경우:
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를 클론했고 커스터마이징을 잃지 않고 마법사, 선택적 모듈, 3-way 머지 업그레이드를 원하시나요? shardmind adopt가 기존 볼트를 관리되는 v6 설치로 조정해줍니다 — 편집한 모든 바이트를 유지하면서 .shardmind/ 사이드카와 shard-values.yaml만 추가합니다:
npm install -g shardmind
shardmind adopt github:breferrari/obsidian-mind2-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. 에이전트로 열기
cd ~/new-vault && claude # 또는 codex, gemini
# 3. 이전 볼트를 지정하여 업그레이드 실행
/om-vault-upgrade ~/my-old-vault에이전트가 수행하는 작업:
감지 — 볼트 버전 확인 (v1–v3.x, 또는 obsidian-mind가 아닌 볼트 식별)
인벤토리 — 모든 파일을 사용자 콘텐츠, 스캐폴드, 인프라, 미분류로 분류
마이그레이션 계획 제시 — 복사, 변환, 건너뛸 항목을 정확히 보여줌
승인 후 실행 — 프론트매터 변환, 위키링크 수정, 인덱스 재구축
검증 — 고아 노트, 깨진 링크, 누락된 프론트매터 확인
기존 볼트는 절대 수정되지 않습니다. --dry-run을 사용하면 실행 없이 계획만 미리 볼 수 있습니다.
NOTE
obsidian-mind뿐만 아니라 모든 Obsidian 볼트에서 작동합니다. obsidian-mind가 아닌 볼트의 경우, 에이전트가 각 노트를 읽고 의미적으로 분류합니다 — 작업 노트, 인물, 인시던트, 1:1, 의사결정을 올바른 폴더로 라우팅합니다.
🗺️ 로드맵
이슈와 버그 보고를 환영합니다. 코드 기여는 할당제로 진행됩니다. 이슈에 댓글로 작업 의사를 밝히고, 할당된 뒤에 PR을 열어 주세요. 본인에게 할당되지 않은 이슈에 대한 PR은 리뷰 없이 닫힙니다. 자세한 내용은 CONTRIBUTING.md를 참고하세요.
🙏 디자인 영향
kepano/obsidian-skills — 공식 Obsidian 에이전트 스킬
James Bedford — 볼트 구조 철학, AI 생성 콘텐츠 분리
arscontexta — description 필드를 통한 점진적 공개, 세션 훅
👤 저자
Brenno Ferrari 제작 — 베를린의 시니어 iOS 엔지니어, Claude Code로 개발자 도구를 구축하고 있습니다.
📄 라이선스
MIT
329 files · 3 not served here
- .claude-plugin/marketplace.json
- .claude-plugin/plugin.json
- .claude/agents/brag-spotter.md
- .claude/agents/context-loader.md
- .claude/agents/correction-sweep.md
- .claude/agents/cross-linker.md
- .claude/agents/people-profiler.md
- .claude/agents/review-fact-checker.md
- .claude/agents/review-prep.md
- .claude/agents/slack-archaeologist.md
- .claude/agents/vault-librarian.md
- .claude/agents/vault-migrator.md
- .claude/commands/om-capture-1on1.md
- .claude/commands/om-correct.md
- .claude/commands/om-dump.md
- .claude/commands/om-humanize.md
- .claude/commands/om-incident-capture.md
- .claude/commands/om-intake.md
- .claude/commands/om-meeting.md
- .claude/commands/om-peer-scan.md
- .claude/commands/om-prep-1on1.md
- .claude/commands/om-project-archive.md
- .claude/commands/om-review-brief.md
- .claude/commands/om-review-peer.md
- .claude/commands/om-self-review.md
- .claude/commands/om-slack-scan.md
- .claude/commands/om-standup.md
- .claude/commands/om-tidy.md
- .claude/commands/om-vault-audit.md
- .claude/commands/om-vault-upgrade.md
- .claude/commands/om-weekly.md
- .claude/commands/om-wrap-up.md
- .claude/memory-template.md
- .claude/rules/brain-topics.md
- .claude/rules/hooks-and-mod.md
- .claude/rules/hooks-per-agent.md
- .claude/rules/memory.md
- .claude/rules/obsidian-cli.md
- .claude/rules/session-workflow.md
- .claude/rules/skills.md
- .claude/rules/subagents.md
- .claude/rules/thinking.md
- .claude/rules/vault-from-another-repo.md
- .claude/scripts/.gitignore
- .claude/scripts/charcount.ts
- .claude/scripts/classify-message.ts
- .claude/scripts/generate-memory-index.ts
- .claude/scripts/lib/active-hygiene.ts
- .claude/scripts/lib/atomic-write.ts
- .claude/scripts/lib/automemory-index.ts
- .claude/scripts/lib/charcount.ts
- .claude/scripts/lib/correction-sweep.ts
- .claude/scripts/lib/env-path.ts
- .claude/scripts/lib/frontmatter.ts
- .claude/scripts/lib/hint-state.ts
- .claude/scripts/lib/hook-io.ts
- .claude/scripts/lib/instruction-files.ts
- .claude/scripts/lib/main-guard.ts
- .claude/scripts/lib/matcher.ts
- .claude/scripts/lib/mcp-caller.ts
- .claude/scripts/lib/mcp-capture.ts
- .claude/scripts/lib/mcp-context.ts
- .claude/scripts/lib/mcp-exposure.ts
- .claude/scripts/lib/mcp-graph.ts
- .claude/scripts/lib/mcp-memory-bridge.ts
- .claude/scripts/lib/mcp-protocol.ts
- .claude/scripts/lib/mcp-qmd-client.ts
- .claude/scripts/lib/mcp-reason.ts
- .claude/scripts/lib/mcp-server.ts
- .claude/scripts/lib/mcp-tools.ts
- .claude/scripts/lib/memory-discover.ts
- .claude/scripts/lib/memory-index.ts
- .claude/scripts/lib/memory-promoted.ts
- .claude/scripts/lib/memory-recall.ts
- .claude/scripts/lib/memory-similarity.ts
- .claude/scripts/lib/memory-supersede.ts
- .claude/scripts/lib/memory-write.ts
- .claude/scripts/lib/om-mod.ts
- .claude/scripts/lib/project-dir.ts
- .claude/scripts/lib/promoted-gate.ts
- .claude/scripts/lib/prose-width.ts
- .claude/scripts/lib/qmd-bootstrap.ts
- .claude/scripts/lib/qmd-cwd.ts
- .claude/scripts/lib/qmd-ignore.ts
- .claude/scripts/lib/qmd-models.ts (not served here)
- .claude/scripts/lib/qmd-refresh.ts
- .claude/scripts/lib/qmd.ts
- .claude/scripts/lib/read-field.ts
- .claude/scripts/lib/read-head.ts
- .claude/scripts/lib/regex.ts
- .claude/scripts/lib/reinject.ts
- .claude/scripts/lib/report-key.ts
- .claude/scripts/lib/session-start-run.ts
- .claude/scripts/lib/session-start.ts
- .claude/scripts/lib/signals.ts
- .claude/scripts/lib/stop-handoff.ts
- .claude/scripts/lib/stop-report.ts
- .claude/scripts/lib/upgrade-plan.ts
- .claude/scripts/lib/wikilinks.ts
- .claude/scripts/lib/write-targets.ts
- .claude/scripts/om-mcp.mjs
- .claude/scripts/om-mcp.ts
- .claude/scripts/package.json
- .claude/scripts/pre-compact.ts
- .claude/scripts/qmd-mcp.d.mts
- .claude/scripts/qmd-mcp.mjs
- .claude/scripts/qmd-refresh-run.ts
- .claude/scripts/session-start.ts
- .claude/scripts/stop-checklist.ts
- .claude/scripts/tests/_helpers.test.ts
- .claude/scripts/tests/_helpers.ts
- .claude/scripts/tests/_proc.ts
- .claude/scripts/tests/_qmd-cache-guard.ts
- .claude/scripts/tests/_race-child.ts
- .claude/scripts/tests/_run-tests.ts
- .claude/scripts/tests/active-hygiene.test.ts
- .claude/scripts/tests/agent-docs-sync.test.ts
- .claude/scripts/tests/atomic-write.test.ts
- .claude/scripts/tests/automemory-index.test.ts
- .claude/scripts/tests/bootstrap-hook.test.ts
- .claude/scripts/tests/budget-ladder.test.ts
- .claude/scripts/tests/capture-markup-guard.test.ts
- .claude/scripts/tests/charcount.test.ts
- .claude/scripts/tests/classify-message.test.ts
- .claude/scripts/tests/correction-sweep-docs-sync.test.ts
- .claude/scripts/tests/correction-sweep.test.ts
- .claude/scripts/tests/delivery-gate.test.ts
- .claude/scripts/tests/frontmatter.test.ts
- .claude/scripts/tests/gemini-commands.test.ts
- .claude/scripts/tests/generate-changelog.test.ts
- .claude/scripts/tests/hint-state.test.ts
- .claude/scripts/tests/hook-config.test.ts
- .claude/scripts/tests/hook-io.test.ts
- .claude/scripts/tests/main-guard.test.ts
- .claude/scripts/tests/manifest-check.test.ts
- .claude/scripts/tests/matcher.test.ts
- .claude/scripts/tests/mcp-caller.test.ts
- .claude/scripts/tests/mcp-capture.test.ts
- .claude/scripts/tests/mcp-context.test.ts
- .claude/scripts/tests/mcp-exposure.test.ts
- .claude/scripts/tests/mcp-graph.test.ts
- .claude/scripts/tests/mcp-memory-bridge.test.ts
- .claude/scripts/tests/mcp-protocol.test.ts
- .claude/scripts/tests/mcp-qmd-client.test.ts
- .claude/scripts/tests/mcp-reason.concurrency.test.ts
- .claude/scripts/tests/mcp-reason.test.ts
- .claude/scripts/tests/mcp-refusal-audit.test.ts
- .claude/scripts/tests/mcp-reindex.test.ts
- .claude/scripts/tests/mcp-required.test.ts
- .claude/scripts/tests/memory-discover.test.ts
- .claude/scripts/tests/memory-index.test.ts
- .claude/scripts/tests/memory-promoted.test.ts
- .claude/scripts/tests/memory-recall.test.ts
- .claude/scripts/tests/memory-similarity.test.ts
- .claude/scripts/tests/memory-supersede-race.test.ts
- .claude/scripts/tests/memory-supersede-same-title.test.ts
- .claude/scripts/tests/memory-supersede.test.ts
- .claude/scripts/tests/memory-write.concurrency.test.ts
- .claude/scripts/tests/memory-write.test.ts
- .claude/scripts/tests/mod-timeouts.test.ts
- .claude/scripts/tests/om-mcp.integration.test.ts
- .claude/scripts/tests/om-mod.test.ts
- .claude/scripts/tests/personalize-hook.test.ts
- .claude/scripts/tests/pre-compact.test.ts
- .claude/scripts/tests/proc.test.ts
- .claude/scripts/tests/project-dir.test.ts
- .claude/scripts/tests/prose-width.test.ts
- .claude/scripts/tests/qmd-bootstrap.test.ts
- .claude/scripts/tests/qmd-cwd.test.ts
- .claude/scripts/tests/qmd-ignore.test.ts
- .claude/scripts/tests/qmd-mcp.test.ts
- .claude/scripts/tests/qmd-models.test.ts
- .claude/scripts/tests/qmd-refresh.integration.test.ts
- .claude/scripts/tests/qmd-refresh.test.ts
- .claude/scripts/tests/qmd.test.ts
- .claude/scripts/tests/read-head.test.ts
- .claude/scripts/tests/record-work-required.test.ts
- .claude/scripts/tests/refresh-in-vault.test.ts
- .claude/scripts/tests/refresh-switch.test.ts
- .claude/scripts/tests/regex.test.ts
- .claude/scripts/tests/reinject.test.ts
- .claude/scripts/tests/report-key.test.ts
- .claude/scripts/tests/sentinel-path.test.ts
- .claude/scripts/tests/session-start.integration.test.ts
- .claude/scripts/tests/session-start.test.ts
- .claude/scripts/tests/shard-contract.test.ts
- .claude/scripts/tests/shardmindignore.test.ts
- .claude/scripts/tests/signals.test.ts
- .claude/scripts/tests/spawn-windows-hide.test.ts
- .claude/scripts/tests/stop-checklist.test.ts
- .claude/scripts/tests/stop-handoff.test.ts
- .claude/scripts/tests/stop-report.test.ts
- .claude/scripts/tests/tidy-fix.test.ts
- .claude/scripts/tests/upgrade-plan.test.ts
- .claude/scripts/tests/validate-write.memory.test.ts
- .claude/scripts/tests/validate-write.test.ts
- .claude/scripts/tests/vault-promoted.test.ts
- .claude/scripts/tests/vault-prose-width.test.ts
- .claude/scripts/tests/vault-wikilinks.test.ts
- .claude/scripts/tests/wikilink-baseline.json
- .claude/scripts/tests/wikilinks.test.ts
- .claude/scripts/tests/write-targets.test.ts
- .claude/scripts/tidy-fix.ts
- .claude/scripts/tsconfig.json
- .claude/scripts/upgrade-plan.ts
- .claude/scripts/validate-write.ts
- .claude/settings.json
- .claude/skills/defuddle/SKILL.md
- .claude/skills/excalidraw-diagram/SKILL.md
- .claude/skills/excalidraw-diagram/references/excalidraw-schema.md
- .claude/skills/json-canvas/SKILL.md
- .claude/skills/json-canvas/references/EXAMPLES.md
- .claude/skills/mermaid-visualizer/SKILL.md
- .claude/skills/mermaid-visualizer/references/syntax-rules.md
- .claude/skills/obsidian-bases/SKILL.md
- .claude/skills/obsidian-bases/references/FUNCTIONS_REFERENCE.md
- .claude/skills/obsidian-cli/SKILL.md
- .claude/skills/obsidian-markdown/SKILL.md
- .claude/skills/obsidian-markdown/references/CALLOUTS.md
- .claude/skills/obsidian-markdown/references/EMBEDS.md
- .claude/skills/obsidian-markdown/references/PROPERTIES.md
- .claude/skills/obsidian-mind/.claude-plugin/plugin.json
- .claude/skills/obsidian-mind/hooks/context.ts
- .claude/skills/obsidian-mind/hooks/hooks.json
- .claude/skills/obsidian-mind/hooks/register.test.ts
- .claude/skills/obsidian-mind/hooks/register.ts
- .claude/skills/obsidian-mind/hooks/stop.test.ts
- .claude/skills/obsidian-mind/hooks/stop.ts
- .claude/skills/obsidian-mind/hooks/world.ts
- .claude/skills/obsidian-mind/types/index.d.ts
- .claude/skills/qmd/SKILL.md
- .claude/update-skills.ts
- .codex/hooks.json
- .gemini/commands/om-capture-1on1.toml
- .gemini/commands/om-correct.toml
- .gemini/commands/om-dump.toml
- .gemini/commands/om-humanize.toml
- .gemini/commands/om-incident-capture.toml
- .gemini/commands/om-intake.toml
- .gemini/commands/om-meeting.toml
- .gemini/commands/om-peer-scan.toml
- .gemini/commands/om-prep-1on1.toml
- .gemini/commands/om-project-archive.toml
- .gemini/commands/om-review-brief.toml
- .gemini/commands/om-review-peer.toml
- .gemini/commands/om-self-review.toml
- .gemini/commands/om-slack-scan.toml
- .gemini/commands/om-standup.toml
- .gemini/commands/om-tidy.toml
- .gemini/commands/om-vault-audit.toml
- .gemini/commands/om-vault-upgrade.toml
- .gemini/commands/om-weekly.toml
- .gemini/commands/om-wrap-up.toml
- .gemini/settings.json
- .gitattributes
- .github/FUNDING.yml
- .github/pull_request_template.md
- .github/scripts/delivery-gate.ts
- .github/scripts/generate-changelog.ts
- .github/scripts/manifest-check.ts
- .github/scripts/package.json
- .github/workflows/manifest-check.yml
- .github/workflows/mod.yml
- .github/workflows/pr-title.yml
- .github/workflows/release.yml
- .github/workflows/test.yml
- .gitignore
- .mcp.json
- .obsidian/app.json
- .scripts/gemini-commands.ts
- .scripts/package.json
- .scripts/qmd-bootstrap.ts
- .shardmind/hooks/bootstrap.ts
- .shardmind/hooks/package.json
- .shardmind/hooks/personalize.ts
- .shardmind/hooks/post-update.ts
- .shardmind/shard-schema.yaml
- .shardmind/shard.yaml
- .shardmindignore
- AGENTS.md
- ARCHITECTURE.md
- ATTRIBUTION.md
- AUTOGINEER-RUNS.md
- CHANGELOG.md
- CONTRIBUTING.md
- Home.md
- LICENSE
- README.ja.md
- README.ko.md
- README.md
- README.zh-CN.md
- bases/1-1 History.base
- bases/Competency Map.base
- bases/Incidents.base
- bases/Memories.base
- bases/People Directory.base
- bases/Recently Touched.base
- bases/Review Evidence.base
- bases/Templates.base
- bases/Work Dashboard.base
- brain/Gotchas.md
- brain/Key Decisions.md
- brain/Memories.md
- brain/North Star.md
- brain/Patterns.md
- brain/Skills.md
- obsidian-mind-demo.gif (not served here)
- obsidian-mind-logo.png (not served here)
- org/People & Context.md
- org/people/.gitkeep
- org/teams/.gitkeep
- perf/Brag Doc.md
- perf/brag/.gitkeep
- perf/competencies/README.md
- perf/evidence/.gitkeep
- reference/.gitkeep
- templates/Competency Note.md
- templates/Decision Record.md
- templates/Review Template.md
- templates/Thinking Note.md
- templates/Work Note.md
- thinking/README.md
- vault-manifest.json
- work/1-1/.gitkeep
- work/Index.md
- work/active/.gitkeep
- work/archive/.gitkeep
- work/incidents/.gitkeep
- work/meetings/README.md
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.mjsREADME.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
breferrari
- 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