by gapmiss
Agent SKILL for Obsidian.md plugin development
# Add to your Claude Code skills
git clone https://github.com/gapmiss/obsidian-plugin-skillA comprehensive agent skill for developing high-quality Obsidian plugins that follow best practices, pass code review, and adhere to official submission guidelines.
This skill provides your coding agent with deep knowledge of Obsidian plugin development standards, including:
eslint-plugin-obsidianmd v0.2.8npx skills add https://github.com/gapmiss/obsidian-plugin-skill --skill obsidian
Clone this repository:
git clone https://github.com/gapmiss/obsidian-plugin-skill.git
cd obsidian-plugin-skill
Run the installer:
./install-skill.sh
Select your provider(s):
.agents/skills/ and No comments yet. Be the first to share your thoughts!
.claude/skills/.claude/skills/ with slash commands.agents/skills/.agents/skills/Choose installation target (current directory or custom path)
git clone https://github.com/gapmiss/obsidian-plugin-skill.git
cd obsidian-plugin-skill
# Copy skill
mkdir -p your-project/.claude/skills/obsidian
cp -r .agents/skills/obsidian/* your-project/.claude/skills/obsidian/
# Copy slash commands
mkdir -p your-project/.claude/commands
cp .claude/commands/obsidian.md your-project/.claude/commands/
cp .claude/commands/create-plugin.md your-project/.claude/commands/
git clone https://github.com/gapmiss/obsidian-plugin-skill.git
cd obsidian-plugin-skill
# Copy skill
mkdir -p your-project/.agents/skills/obsidian
cp -r .agents/skills/obsidian/* your-project/.agents/skills/obsidian/
Just open this directory with your coding agent — no installation needed!
The skill uses progressive disclosure for optimal performance:
.agents/skills/obsidian/
├── SKILL.md # Main overview (285 lines)
└── reference/ # Detailed documentation
├── memory-management.md # Lifecycle & cleanup patterns
├── type-safety.md # Type narrowing & safety
├── ui-ux.md # UI standards & commands
├── file-operations.md # Vault & file API
├── css-styling.md # Theming & styling
├── accessibility.md # A11y requirements (MANDATORY)
├── code-quality.md # Best practices & security
├── submission.md # Publishing guidelines
└── eslint-setup.md # Complete ESLint config guide
SKILL.md provides a concise overview with all 36 rules, while reference files contain comprehensive details on specific topics.
The fastest way to start a new Obsidian plugin with all best practices built-in:
node /path/to/obsidian-plugin-skill/tools/create-plugin.js
Features:
src/ directory structure with main.ts and settings.tsWhat it creates:
your-plugin/
├── src/
│ ├── main.ts # Plugin class with settings integration
│ └── settings.ts # Settings interface, defaults, and tab
├── manifest.json # Validated plugin metadata
├── styles.css # CSS with Obsidian variables
├── tsconfig.json # TypeScript configuration
├── package.json # Dependencies
├── esbuild.config.mjs # Build configuration
├── eslint.config.mjs # ESLint configuration
├── version-bump.mjs # Version management script
├── versions.json # Version tracking
├── .gitignore # Git ignore rules
└── LICENSE # MIT license
Interactive prompts:
Real-time validation catches common mistakes:
❌ Validation Errors:
• Plugin ID cannot contain "obsidian"
• Plugin name cannot end with "Plugin"
• Description must end with punctuation: . ? ! or )
| Provider | Load skill | Create plugin |
|----------|-----------|---------------|
| Claude Code | /obsidian | /create-plugin |
| Codex (OpenAI) | $obsidian | — |
| Windsurf | @obsidian | — |
Skills are automatically discovered by your agent when present in the project directory. You can also invoke them explicitly using the commands above.
Just ask your agent naturally:
Help me implement a new command for my Obsidian plugin
Your agent will automatically use the Obsidian skill guidelines while helping you write code.
data-tooltip-positionThe main SKILL.md file highlights the most important rules organized by category:
Submission & Naming:
.?!) punctuationMemory & Lifecycle:
6. Use registerEvent() for automatic cleanup
7. Don't store view references in plugin
8. Don't call detachLeavesOfType() in onunload
Type Safety:
9. Use instanceof instead of type casting for TFile/TFolder
10. Use .instanceOf(T) for cross-window DOM checks
UI/UX:
11. Use sentence case for all UI text
12. Sentence case in locale JSON files
13. Sentence case in TS/JS locale modules
14. No "command" in command names/IDs
15. No plugin ID/name in command IDs/names
16. No default hotkeys
17. Use .setHeading() for settings headings
API Best Practices:
18. Use Editor API for active file edits
19. Use Vault.process() for background file mods
20. Use FileManager.trashFile() for file deletion
21. Use Vault.getAbstractFileByPath() instead of iterating files
22. Use normalizePath() for user paths
23. Use Platform API for OS detection
24. Use requestUrl() instead of fetch()
25. No console.log in onload/onunload in production
26. Use built-in AbstractInputSuggest
27. Check minAppVersion for API compatibility
Popout Window Compatibility:
28. Use activeDocument/activeWindow instead of globals
29. Use activeWindow.setTimeout() for timers
Event Handling:
30. Check evt.defaultPrevented in editor-drop/paste handlers
Styling:
31. Use Obsidian CSS variables
32. Scope CSS to plugin containers
33. Don't create <link> or <style> elements
Accessibility (MANDATORY): 34. Make all interactive elements keyboard accessible 35. Provide ARIA labels for icon buttons 36. Define clear focus indicators
Security & Compatibility:
innerHTML/outerHTMLCode Quality:
Object.assignregisterEvent(), addCommand(), registerDomEvent(), registerInterval()instanceof instead of type castingany typeconst and let over var