From shelf
Scaffold a new project in Obsidian. Creates the full directory structure, dashboard with auto-detected tech stack tags, and about.md — all via MCP. Run this once per repo to initialize the Obsidian project.
How this skill is triggered — by the user, by Claude, or both
Slash command
/shelf:shelf-createThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Create a complete Obsidian project dashboard for the current repo. Detects tech stack, generates frontmatter tags, and scaffolds the full directory structure — all via MCP.
Create a complete Obsidian project dashboard for the current repo. Detects tech stack, generates frontmatter tags, and scaffolds the full directory structure — all via MCP.
$ARGUMENTS
Determine the project slug and base path. Priority order: explicit argument > .shelf-config > git remote defaults.
$SLUG and skip to substep 4.shelf-config exists in the repo root:
a. If it exists, parse it: skip lines starting with # (comments) and blank lines; split each remaining line on the first = to get key and value; trim whitespace from both
b. Extract base_path and slug values
c. If both base_path and slug are present and non-empty: use them as $BASE_PATH and $SLUG — do NOT derive from git remote (FR-006). Skip to substep 5
d. If either is missing or empty: warn ".shelf-config is malformed — missing {key}. Falling back to defaults." and continue to substep 3git remote get-url origin and extract the repo name (last path segment, strip .git suffix). Slugify: lowercase, replace spaces with hyphens. Store as $SLUG$BASE_PATH is not yet set: check if .shelf-config exists and has a base_path value. If so, use it. Otherwise default: $BASE_PATH = "projects"{$BASE_PATH}/{$SLUG}/...Before creating anything, check if the project already exists:
mcp__obsidian-projects__list_files({ path: "{base_path}/{slug}" })
Scan the repo for known config files and map them to namespaced tags:
| File | Tags |
|---|---|
package.json | Parse dependencies and devDependencies for: language/javascript or language/typescript (if typescript present), framework/react, framework/next, framework/vue, framework/express, framework/fastify, etc. |
tsconfig.json | language/typescript |
Cargo.toml | language/rust |
pyproject.toml or requirements.txt | language/python |
go.mod | language/go |
Gemfile | language/ruby |
.docker or Dockerfile | infra/docker |
.github/workflows/ | infra/github-actions |
Run bash commands to check for these files:
ls package.json tsconfig.json Cargo.toml pyproject.toml requirements.txt go.mod Gemfile Dockerfile docker-compose.yml 2>/dev/null
If package.json exists, read it to extract dependency names:
cat package.json
Parse the dependencies and map framework names to tags.
If the user passed --tags "tag1, tag2" as an argument:
Combine all tags into a YAML list for frontmatter.
Gather additional repo info:
git remote get-url origin
Extract the repo URL for the repo frontmatter field.
Read repo description if available (from package.json description field or similar).
Create the main project dashboard file using the dashboard template.
Template resolution (FR-004): Read the template file. First check if .shelf/templates/dashboard.md exists in the repo. If it does, use that. Otherwise, use plugin-shelf/templates/dashboard.md.
Replace placeholders in the template:
{slug} — the project slug{repo_url} — the git remote URL{tags_yaml} — YAML-formatted tag list from tech detection (e.g., - language/typescript\n - framework/react){date} — today's date YYYY-MM-DD{description} — from package.json description or emptyThe template includes project: "[[{slug}]]" as a backlink (FR-005).
mcp__obsidian-projects__create_file({
path: "{base_path}/{slug}/{slug}.md",
content: "{rendered dashboard template}"
})
If MCP fails: warn the user ("MCP server unavailable — cannot create project") and STOP. Do not attempt filesystem writes. (NFR-004)
Create the about doc. Include a project: "[[{slug}]]" backlink in frontmatter (FR-005).
mcp__obsidian-projects__create_file({
path: "{base_path}/{slug}/docs/about.md",
content: "---
project: \"[[{slug}]]\"
---
# About {slug}
## Description
{repo_description or 'TBD'}
## Tech Stack
{list of detected tags, formatted as bullet points}
## Architecture
TBD
"
})
If MCP fails: warn and continue to next step (partial completion). (NFR-004)
Create placeholder files to establish the directory structure. MCP file creation implicitly creates parent directories:
mcp__obsidian-projects__create_file({ path: "{base_path}/{slug}/progress/.gitkeep", content: "" })
mcp__obsidian-projects__create_file({ path: "{base_path}/{slug}/releases/.gitkeep", content: "" })
mcp__obsidian-projects__create_file({ path: "{base_path}/{slug}/issues/.gitkeep", content: "" })
mcp__obsidian-projects__create_file({ path: "{base_path}/{slug}/decisions/.gitkeep", content: "" })
If any MCP call fails: warn for that specific directory and continue with the rest. (NFR-004)
After the Obsidian project is successfully created, write the .shelf-config artifact to the repo root so all shelf skills can resolve the project path automatically.
$DASHBOARD_PATH = {$BASE_PATH}/{$SLUG}/{$SLUG}.mdThe following will be saved to .shelf-config:
base_path: {$BASE_PATH}
slug: {$SLUG}
dashboard_path: {$DASHBOARD_PATH}
Confirm? (Y/n)
.shelf-config to the repo root using the Write tool (this is a local repo file, NOT an Obsidian vault file — do NOT use MCP):# Shelf configuration — maps this repo to its Obsidian project
base_path = {$BASE_PATH}
slug = {$SLUG}
dashboard_path = {$DASHBOARD_PATH}
.shelf-config and note it in the Step 10 summaryImportant: The .shelf-config file lives in the repo root (local filesystem), NOT in the Obsidian vault. Use the Write tool, not MCP. This file should be committed to git (FR-008).
Print a confirmation summary:
Project '{slug}' created in Obsidian.
Dashboard: {base_path}/{slug}/{slug}.md
About: {base_path}/{slug}/docs/about.md
Tags: {comma-separated tag list}
Config: .shelf-config {written | skipped by user}
Directories created:
- progress/
- releases/
- issues/
- decisions/
Next: Run /shelf-update to record your first progress entry.
If .shelf-config was written, note: "Config saved — all shelf skills will now auto-resolve this project."
If .shelf-config was skipped, note: "Config skipped — you can create it manually or re-run /shelf-create."
If any steps had partial failures, include a warnings section listing what failed.
npx claudepluginhub yoshisada/ai-repo-template --plugin shelfSearches MemPalace before answering questions about past work, people, projects, or prior decisions. Returns verbatim stored content instead of guessing from model memory.
Guides Payload CMS config (payload.config.ts), collections, fields, hooks, access control, APIs. Debugs validation errors, security, relationships, queries, transactions, hook behavior.
Implements vector databases with Pinecone, Weaviate, Qdrant, Milvus, pgvector for semantic search, RAG, recommendations, and similarity systems. Optimizes embeddings, indexing, and hybrid search.