executing-plans
executing-plans
Use when executing an implementation plan in the current session as the implementer yourself — your human partner chose inline execution, or no subagent tool is available
obsidianRead, search, and create Markdown notes inside an Obsidian vault on disk.
Independent GitHub snapshot · Automated classification · Original documentation governs
name: obsidian description: Read, search, and create Markdown notes inside an Obsidian vault on disk. version: 1.2.1 requires_tools:
Operate on the user's Obsidian vault as plain Markdown files. Obsidian itself does not need to be running — the vault is just a directory tree of .md files.
The vault path resolves as $OBSIDIAN_VAULT_PATH env var → fallback
~/Documents/Obsidian Vault. Resolve it once when you first need it
this conversation; do not re-probe printenv on every turn. Operate on the
resolved path directly and map failures:
os.fs.list / read errors with ENOENT / "no such file or directory" → Setup playbook → "Vault path does not exist"..md files → Setup playbook → "Resolved path is not a real vault".Vault paths often contain spaces — pass them through os.fs.* tools verbatim, no quoting needed.
When a check fails, the agent's job is to OFFER concrete help and EXECUTE the fix itself — not to dump setup instructions on the user. Use this dialogue shape:
Reply:
"I couldn't find an Obsidian vault in either
$OBSIDIAN_VAULT_PATHor~/Documents/Obsidian Vault. Send me the absolute path to your vault — I'll verify it and save it to~/.atomic-agent/.envso I can find it automatically in the future."
When the user replies with a path, verify it exists:
[{ "tool": "os.fs.list", "args": { "path": "<user-supplied-path>" } }]
If it lists .md files, persist the choice:
[{ "tool": "os.fs.write", "args": {
"path": "~/.atomic-agent/.env",
"mode": "append",
"content": "\nOBSIDIAN_VAULT_PATH=<user-supplied-path>\n"
} }]
Then reply: "Vault found and saved. Restart the agent so the env variable is picked up — I'll continue after the restart. (I'm already using the path for the current session.)" Continue using the path in-memory for the current session — no need to wait for restart to serve the user's request.
If the path does NOT contain .md files, ask once more before persisting: "There are no markdown files at this path. Is the vault really there, or is it a different path?"
Same playbook as above, but skip the "not found" framing — just say: "The default folder (~/Documents/Obsidian Vault) exists, but it doesn't look like an Obsidian vault — there are no markdown files. Send me the correct path."
[[wikilinks]] between notes.apple-notes skill instead.memory.notes.store tool.All Markdown files in the vault:
os.fs.glob { patterns: ["**/*.md"], cwd: "<vault>" }
Notes in a specific subfolder:
os.fs.glob { patterns: ["Daily/**/*.md"], cwd: "<vault>" }
os.fs.read { path: "<vault>/Note Name.md" }
For very long notes, use offset / limit to page through.
os.fs.glob { patterns: ["**/*keyword*.md"], cwd: "<vault>" }
os.fs.grep { pattern: "keyword", path: "<vault>", glob: ["*.md"] }
Use outputMode: "files_with_matches" to get just the file list.
os.fs.write { path: "<vault>/New Note.md", content: "# Title\n\nBody here.\n" }
os.fs.write { path: "<vault>/Existing Note.md", content: "\nAppended line.\n", mode: "append" }
[[Note Name]] syntax (no .md extension). Use them when creating notes that should link to other notes — Obsidian will render them as clickable links and surface backlinks automatically.Daily/YYYY-MM-DD.md — confirm the user's pattern before assuming..obsidian/ config files unless the user explicitly asks; they hold the vault's plugin and theme settings.