From shelf
Record a release in Obsidian. Creates a release note with auto-generated changelog from git history, and appends a progress entry marking the release event.
How this skill is triggered — by the user, by Claude, or both
Slash command
/shelf:shelf-releaseThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Create a release note in Obsidian with an auto-generated changelog from git history. Also appends a progress entry documenting the release event.
Create a release note in Obsidian with an auto-generated changelog from git history. Also appends a progress entry documenting the release event.
$ARGUMENTS
Parse these optional flags from the arguments:
--version "1.2.0" — version override--summary "text" — human-readable one-liner for the releaseDetermine the project slug and base path. Priority order: explicit argument > .shelf-config > git remote defaults.
.shelf-config exists in the repo root:
a. 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 are present and non-empty: use them as $BASE_PATH and $SLUG — do NOT derive from git remote or prompt the user (FR-006). Skip to substep 4
d. If either is missing or empty: warn ".shelf-config is malformed — missing {key}. Falling back to defaults." and continue to substep 2.shelf-config:
a. If the user provided a project name as an argument: use it as $SLUG
b. Otherwise: run git remote get-url origin and extract the repo name (last path segment, strip .git suffix) as $SLUG
c. Set $BASE_PATH = "projects" (default){$BASE_PATH}/{$SLUG}/...If --version was provided, use it. Otherwise, auto-detect in order:
VERSION file: cat VERSIONpackage.json: node -p "require('./package.json').version" (if package.json exists)git describe --tags --abbrev=0If none found, ask the user: "Could not detect version. What version is this release?"
Store as $VERSION.
mcp__obsidian-projects__read_file({ path: "{base_path}/{slug}/releases/v{version}.md" })
If MCP fails for other reasons: warn "MCP server unavailable — cannot create release note" and STOP (NFR-004)
Find the previous release tag:
git tag --sort=-version:refname | head -5
If a previous tag exists, generate changelog between that tag and HEAD:
git log {previous_tag}..HEAD --oneline --no-decorate
Also find merged PRs:
git log {previous_tag}..HEAD --merges --oneline
If no previous tag exists, use the last 20 commits:
git log -20 --oneline --no-decorate
Format the changelog as a markdown list:
- {commit_hash} {commit_message}
- {commit_hash} {commit_message} (PR #{number})
If --summary was provided, use it.
If not, ask the user: "One-liner summary for this release?" and wait for a response.
Template resolution (FR-004): Read the release template. First check if .shelf/templates/release.md exists in the repo. If it does, use that. Otherwise, use plugin-shelf/templates/release.md.
Replace placeholders in the template:
{version} — the release version{date} — today YYYY-MM-DD{summary} — one-liner release summary{changelog} — formatted changelog entries{slug} — project slug (for project: "[[{slug}]]" backlink, FR-005)The template includes tags: status/implemented (FR-008).
mcp__obsidian-projects__create_file({
path: "{base_path}/{slug}/releases/v{version}.md",
content: "{rendered release template}"
})
If MCP fails: warn "Could not create release note" and STOP (NFR-004)
Follow the same pattern as shelf-update for appending a progress entry:
Determine current month: YYYY-MM
Read or create the monthly progress file:
mcp__obsidian-projects__read_file({ path: "{base_path}/{slug}/progress/{YYYY-MM}.md" })
If not found, create it with a header.
Append a release progress entry:
mcp__obsidian-projects__update_file({
path: "{base_path}/{slug}/progress/{YYYY-MM}.md",
content: "{existing_content}\n\n## {YYYY-MM-DD}\n\n**Summary**: Released v{version} — {summary}\n\n**Links**: [Release note](../releases/v{version}.md)\n"
})
If MCP fails: warn "Could not append progress entry" and continue (NFR-004)
Release v{version} recorded in Obsidian.
Release note: {base_path}/{slug}/releases/v{version}.md
Progress: Appended to progress/{YYYY-MM}.md
Changelog: {N} commits since {previous_tag or 'initial'}
Summary: {summary}
Searches 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.
npx claudepluginhub yoshisada/ai-repo-template --plugin shelf