AgentStack
SKILL verified Apache-2.0 Self-run

Moc

skill-onebrain-ai-onebrain-moc · by onebrain-ai

Create or update the vault portal (MOC.md) at the vault root : a Map of Content with live Dataview queries, AI summary, and user Pinned section. Use when the user wants to regenerate or view the vault overview map. Do NOT use for: the task dashboard (use tasks), adding individual notes (use capture), or vault health checks (use doctor).

No reviews yet
0 installs
10 views
0.0% view→install

Install

$ agentstack add skill-onebrain-ai-onebrain-moc

✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • Prompt-injection patterns
  • Secret / credential exfiltration
  • Dangerous shell & filesystem operations
  • Untrusted network calls
  • Known-malicious package signatures

What it can access

  • Network access No
  • Filesystem access No
  • Shell / process execution No
  • Environment & secrets No
  • Dynamic code execution No

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

Are you the author of Moc? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

Vault Portal

Creates or updates MOC.md at the vault root : a hybrid Map of Content with:

  • AI zone: agent-written summary callout (note counts, focus note)
  • Dataview zone: live queries for Tasks, Recently Modified, Projects, Areas, Knowledge, Resources, Bookmarks
  • Static zone: user-maintained Pinned section (never overwritten by the agent)

Usage:

  • /moc : create or refresh MOC.md and open it in Obsidian

Step 1: Read vault configuration

Read onebrain.yml from the current working directory. If it cannot be read or parsed, stop immediately and tell the user: > "onebrain.yml exists but could not be parsed : aborting. Check onebrain.yml for syntax errors and try again. Error: [error]."

Store moc_path = {vault_root}/MOC.md.


Step 2: Scan vault for summary data

Collect the following using Glob to count .md files:

  • projects_count : .md files under [projects_folder]/ (recursive)
  • areas_count : .md files under [areas_folder]/ (recursive)
  • knowledge_count : .md files under [knowledge_folder]/ (recursive)
  • resources_count : .md files under [resources_folder]/ (recursive)
  • inbox_count : .md files directly in [inbox_folder]/ (non-recursive, direct children only)
  • focus_note : the single most recently modified .md file across projects, areas, knowledge, and resources folders. Store its display name (filename without .md extension) and its vault-relative path for use as a wikilink.

If a folder does not exist on disk, use count 0 for that folder : this is expected for new vaults.

If the Glob tool returns an error or cannot enumerate a folder that appears to exist, stop immediately and tell the user: > "Could not scan [folder] : MOC.md was not written. Error: [error]. Resolve the issue and try again."

Do not write MOC.md with potentially incorrect counts.


Step 3: Preserve existing Pinned section

If MOC.md exists:

  • Read the file. If the read fails, stop immediately and tell the user:

> "Could not read existing MOC.md at [moc_path] : aborting to protect your Pinned section. Error: [error]. Resolve the file access issue and try again."

  • Extract created: from the frontmatter : store as created_date (fall back to today if absent)
  • Set is_new_file = false
  • Find the line that starts with ## 📌 Pinned
  • Store everything from that line to the end of file as pinned_content
  • If ## 📌 Pinned is not found in the existing file, warn the user before continuing:

> "Warning: Pinned section (## 📌 Pinned) not found in existing MOC.md : the default placeholder will be used instead. Any content you added below the last recognized section header may not be preserved." Then use the default pinned block.

If MOC.md does not exist:

  • Set created_date to today
  • Set is_new_file = true
  • Use the default pinned block

Step 4: Write MOC.md

Write the complete file. Replace every placeholder in the template with actual values before writing.

Placeholder reference:

| Placeholder | Value | |------------|-------| | CREATED_DATE | preserved created: date or today | | TODAY | today's date (YYYY-MM-DD) | | PROJECTS_FOLDER | [projects_folder] | | AREAS_FOLDER | [areas_folder] | | KNOWLEDGE_FOLDER | [knowledge_folder] | | RESOURCES_FOLDER | [resources_folder] | | AGENT_FOLDER | [agent_folder] | | LOGS_FOLDER | [logs_folder] | | ARCHIVE_FOLDER | [archive_folder] | | PROJECTS_COUNT | projectscount | | AREAS_COUNT | areascount | | KNOWLEDGE_COUNT | knowledgecount | | RESOURCES_COUNT | resourcescount | | INBOX_COUNT | inboxcount | | FOCUS_LINK | [[vault-relative-path\|display-name]] of focusnote : e.g. [[01-projects/alpha/Project Alpha\|Project Alpha]]. Use : if no notes found. | | FIRST_RUN_LINE | If is_new_file is true: > 💡 Install the [Dataview plugin](https://github.com/blacksmithgu/obsidian-dataview) to activate live query sections. : otherwise remove this line entirely from the output; do not insert a blank line where it was. | | PINNED_CONTENT | preserved pinned section (or default below) |

Template:

`````markdown --- tags: [dashboard, moc] created: CREATED_DATE updated: TODAY ---

🧠 Vault Portal

> [!info] Agent Summary : updated TODAY > PROJECTSCOUNT projects : AREASCOUNT areas : KNOWLEDGECOUNT knowledge notes : RESOURCESCOUNT resources : INBOXCOUNT inbox items > 🔺 Focus: FOCUSLINK FIRSTRUNLINE

⚡ Tasks

not done
path does not include LOGS_FOLDER
path does not include ARCHIVE_FOLDER
due before in 8 days
sort by priority
sort by due

🕐 Recently Modified

TABLE file.mtime AS "Modified"
FROM ""
WHERE !startswith(file.folder, "LOGS_FOLDER") AND !startswith(file.folder, "AGENT_FOLDER") AND !startswith(file.folder, "ARCHIVE_FOLDER") AND file.name != "MOC" AND file.name != "TASKS"
SORT file.mtime DESC
LIMIT 10

🚀 Projects

LIST
FROM "PROJECTS_FOLDER"
SORT file.mtime DESC

🗂 Areas

LIST
FROM "AREAS_FOLDER"
SORT file.name ASC

🧠 Knowledge

TABLE length(rows) AS "Notes"
FROM "KNOWLEDGE_FOLDER"
GROUP BY file.folder
SORT key ASC

📚 Resources

LIST
FROM "RESOURCES_FOLDER"
SORT file.mtime DESC

🔖 Bookmarks

[[Bookmarks]] : saved URLs and references.

PINNED_CONTENT

`````

Default PINNED_CONTENT (used when no existing Pinned section is found):

## 📌 Pinned

If the write fails, stop immediately and tell the user: > "Could not write MOC.md at [mocpath]. Error: [error]. Vault root used: [vaultroot]"


Step 5: Open in Obsidian and confirm

The shipped helper detects platform and emits the right URI (cygpath, percent-encoding, etc.). On macOS/Linux/MSYS just run it via Bash:

bash ".claude/plugins/onebrain/startup/scripts/open-in-obsidian.sh" "MOC.md"

In a PowerShell-only environment where bash is not on PATH, the helper still runs because Git for Windows / WSL ships bash.exe on PATH alongside Obsidian on Windows; if it genuinely is not present, skip the open step (the file is already saved) rather than constructing a URI by hand — manual URI assembly is exactly the pattern the helper exists to replace.

Then say: 🗺️ MOC.md updated. → Opening in Obsidian...


Known Gotchas

  • MOC.md is overwritten on every /moc run. The user-editable ## Pinned section is preserved by reading it first and re-inserting it. If the Pinned section is missing from the existing file, it will not appear in the new version — warn the user if no Pinned section is found during the read.
  • Dataview must be installed in Obsidian for the query blocks to render. If the user reports that MOC.md shows raw code blocks instead of data, they need to install the Dataview community plugin.

Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet — be the first.

Versions

  • v0.1.0 Imported from the upstream source.