obsidian-dev-rules について
obsidian-dev-rulesは、Obsidianのプラグイン、テーマ、スニペットの開発とレビューを支援するスキルです。公式開発ドキュメントの要点を分野別にまとめ、API、リソース解放、安全なDOM操作、公開要件を扱います。
主な機能
- 01プラグインのライフサイクルとリソース解放
- 02Vault、Editor、イベントAPIの解説
- 03コマンド、設定、ビュー、UIの整理
- 04テーマとスニペット開発の案内
- 05コミュニティディレクトリへの提出要件
活用シーン
- 01Obsidianプラグインの開発やデバッグ
- 02ノート操作やエディター連携のレビュー
- 03テーマやCSSスニペットの作成と公開準備
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ agents365-ai/ 365-skills --skill obsidian-dev-rulesインストール後、Claude Code で/obsidian-dev-rulesを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/plugin-basics.mdthemes-and-release.mdui.mdvault-and-editor.md詳細
Obsidian 開発ルール
Obsidian は プラグイン(Obsidian API を使用する TypeScript)と テーマ/スニペット
(CSS)の 2 つの方法で拡張できます。このスキルは https://docs.obsidian.md の公式開発ドキュメントに沿っており、ドキュメントを再取得せずに Obsidian のプラグイン/テーマを開発・レビューできます。API は obsidian npm パッケージとして提供されており、標準的な出発点は obsidian-sample-plugin です。
このスキルを使う場面
- Obsidian プラグインの開発、デバッグ、レビュー(ライフサイクル、コマンド、設定、UI、ビュー)。
- Vault API でノートを読み書きする場合や、Editor API でアクティブなノートを操作する場合。
- イベントの購読、Markdown ポストプロセッサー/コードブロックプロセッサーの登録、または CodeMirror 6 エディター拡張機能の開発。
- テーマ(CSS 変数、
theme.css、マニフェスト)やスニペットの開発。 - コミュニティディレクトリへのプラグインまたはテーマのリリース/申請。
リファレンス一覧 — 必要なファイルを読み込む
| ファイル | 内容 |
|---|---|
references/plugin-basics.md | プロジェクトのセットアップ、manifest.json、プラグインのライフサイクル(onload/onunload)、リソースの登録とクリーンアップ、イベント、開発ワークフロー/ホットリロード、デバッグ |
references/vault-and-editor.md | Vault API(read/cachedRead/create/modify/process/delete、TFile/TFolder、アダプター、normalizePath)、Editor API、Markdown のポストプロセスとコードブロックプロセッサー、CodeMirror 6 エディター拡張機能 |
references/ui.md | コマンド(コールバックのバリエーション、ホットキー)、設定(PluginSettingTab、load/saveData、Setting コントロール)、モーダル(Modal/SuggestModal/FuzzySuggestModal)、ビュー(ItemView、registerView、ワークスペースのリーフ)、リボン/ステータスバー |
references/themes-and-release.md | テーマ(CSS 変数、theme.css/マニフェスト、body クラス、スニペット)、プラグインとテーマの申請、開発者ポリシーとガイドライン |
チートシート
import { Plugin, Notice, MarkdownView, TFile, normalizePath } from 'obsidian';
export default class MyPlugin extends Plugin {
async onload() {
await this.loadSettings();
this.addRibbonIcon('dice', 'Greet', () => new Notice('Hello!'));
this.addCommand({ id: 'do-x', name: 'Do X', callback: () => {/* ... */} });
this.addSettingTab(new MySettingTab(this.app, this));
// Auto-cleaned on unload — always register through these:
this.registerEvent(this.app.vault.on('modify', (f) => {/* ... */}));
this.registerInterval(window.setInterval(() => {/* ... */}, 1000));
this.registerDomEvent(document, 'click', () => {/* ... */});
}
onunload() { /* release anything NOT registered via register*/ }
}
// Vault: prefer process() over read()+modify(); use cachedRead() for display only.
const file = this.app.vault.getFileByPath('Notes/x.md');
await this.app.vault.process(file, (data) => data.replace('foo', 'bar'));
// Editor of the active note (preserves cursor/selection):
const view = this.app.workspace.getActiveViewOfType(MarkdownView);
view?.editor.replaceSelection(view.editor.getSelection().toUpperCase());
プラグインファイル:manifest.json + main.js(+ 任意の styles.css)を <vault>/.obsidian/plugins/<id>/ に配置します。
テーマファイル:manifest.json + theme.css を <vault>/.obsidian/themes/<name>/ に配置します。
厳守事項
- グローバルの
appではなく、必ずthis.appを使ってください(グローバルはデバッグ用にのみ存在し、削除される可能性があります)。 - 後処理が必要なものはすべて
registerEvent/registerInterval/registerDomEvent/addCommand/registerView/registerMarkdownPostProcessorで登録してください。Obsidian はプラグインのアンロード時にこれらを自動でクリーンアップします。それ以外はonunload()で手動解放してください。リスナーやインターバルのリークは、プラグインを無効化した後に Obsidian の動作を低下させます。 - 動的なコンテンツに対して
innerHTML/outerHTML/insertAdjacentHTMLを決して使わないでください。createEl()/createDiv()/createSpan()で DOM を構築してください。 - Adapter API より Vault API を優先してください。全件を反復せず
getFileByPath()を使い、ユーザーが指定したパスは必ずnormalizePath()で正規化してください。データ損失を防ぐため、read()とmodify()を順番に呼び出す代わりにprocess()(アトミック)を使ってください。cachedRead()は読み取った内容を書き戻さない場合に限り使ってください。 - アクティブなノートは Editor インターフェース経由で編集してください。
Vault.modifyではカーソルと選択範囲が保持されません。 - ビューインスタンスへの参照を保持しないでください。Obsidian がビューを再作成する場合があるため、
getLeavesOfType()/getActiveViewOfType()で取得してください。 - 配布するプラグインには デフォルトのホットキーを設定しないでください(OS に依存し、競合しやすいため)。UI テキストは センテンスケースにしてください。ハードコードしたインラインスタイルではなく、CSS クラスと Obsidian の CSS 変数を使ってください。
manifest.jsonの必須フィールド:id、name、version(semverx.y.z)、minAppVersion、description、author、isDesktopOnly。idに「obsidian」を含めてはいけません。nameは Basic-Latin 文字を使い、ハイフン以外の絵文字や句読点を含めてはいけません。- リリース:タグがマニフェストの
versionと一致する GitHub リリースを作成し、main.js、manifest.json、任意のstyles.cssを、ZIP にまとめず 個別のバイナリーアセットとして添付してください。 - Promise チェーンではなく
async/awaitを使ってください。varではなくconst/letを使ってください。
コメント
Markdown 対応