skills/mp-publish-obsidian-plugin/SKILL.md
Publish Obsidian plugin to community directory. Use when: "publish plugin", "submit to community", "add to obsidian plugins"
npx skillsauth add MartinoPolo/mpx-claude-code mp-publish-obsidian-pluginInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Full workflow to submit an Obsidian plugin to obsidianmd/obsidian-releases. $ARGUMENTS
manifest.json MUST end with . ? ! or ) — bot rejects otherwisecommunity-plugins.json must exactly match manifest.json descriptionid in community-plugins.json must exactly match id in manifest.jsonmanifest.json version exactly — no v prefixmain.js + manifest.json uploaded as individual assets (not just source archives)styles.css only if plugin uses styles.setName(), .setDesc(), .setPlaceholder()) must use sentence case — capitalize only the first word and proper nounsRead manifest.json. Verify:
id exists and is kebab-casename existsdescription ends with .?!) — if not, stop and fixversion existsauthor and authorUrl existminAppVersion is set.setName(), .setDesc(), .setPlaceholder() calls use sentence case — if not, stop and fixRead package.json. Verify version matches manifest.json version.
Display all values for user review.
gh repo view --json name,url,description,isPrivate
npm run build
Verify main.js exists after build. Check if styles.css exists (note for release assets).
Check if release for current version already exists:
gh release view <version> 2>/dev/null
If not, create it:
gh release create <version> main.js manifest.json --title "<version>" --notes "Release <version>"
Add styles.css if it exists:
gh release upload <version> styles.css
Important: Tag is just the version number (e.g., 1.0.0), NOT v1.0.0.
gh release view <version> --json assets --jq '.assets[].name'
Must include at minimum: main.js, manifest.json. Warn if missing.
gh repo fork obsidianmd/obsidian-releases --clone=false
If already forked, sync fork:
gh repo sync <user>/obsidian-releases
Fetch current community-plugins.json from the user's fork (main branch):
gh api repos/<user>/obsidian-releases/contents/community-plugins.json --jq '.content' | base64 -d > /tmp/community-plugins.json
Read the file. Find alphabetical insertion point by id. Add entry:
{
"id": "<manifest.id>",
"name": "<manifest.name>",
"author": "<manifest.author>",
"description": "<manifest.description>",
"repo": "<github-user>/<repo-name>"
}
Description must be copied character-for-character from manifest.json.
Push the change to a new branch on the fork:
gh api repos/<user>/obsidian-releases/contents/community-plugins.json \
-X PUT \
-f message="Add <plugin-name> plugin" \
-f content="$(base64 -w 0 /tmp/community-plugins.json)" \
-f sha="<current-sha>" \
-f branch="add-<plugin-id>"
Fetch the official PR template — PR validation checks compliance against this exact template:
https://raw.githubusercontent.com/obsidianmd/obsidian-releases/refs/heads/master/.github/PULL_REQUEST_TEMPLATE/plugin.md
Use WebFetch or:
gh api repos/obsidianmd/obsidian-releases/contents/.github/PULL_REQUEST_TEMPLATE/plugin.md --jq '.content' | base64 -d
Fill in the template fields. Keep all HTML comments and structure intact — the bot validates against this template. The template typically asks for:
[x])gh pr create \
--repo obsidianmd/obsidian-releases \
--head <user>:add-<plugin-id> \
--base master \
--title "Add <plugin-name> plugin" \
--body "$(cat <<'EOF'
<filled template here>
EOF
)"
Check PR for bot comments (wait ~30s then check):
gh pr view <pr-number> --repo obsidianmd/obsidian-releases --json comments --jq '.comments[].body'
Common bot rejection reasons:
.setName(), .setDesc(), .setPlaceholder())Display:
development
Audit all active skills for consistency, convention drift, and common issues. Auto-fixes where possible, reports remaining issues. Use when: "audit skills", "skill audit", "check skills", "lint skills"
testing
Ship finished work: sync base, commit, push, PR, wait for CI green, merge. Use when: "ship it", "ship and merge", "ship this"
development
Scan recent Claude Code sessions for grilling/design discussions, extract decisions, and update CONTEXT.md + DECISIONS.md. Use when: "harvest decisions", "extract decisions from sessions", "update docs from sessions", "sync decisions"
tools
Consolidate CONTEXT.md: remove duplicates, outdated items, tighten language. Use when: "consolidate context", "clean up context", "simplify context", "consolidate requirements"