publish-moviepilot-plugin について
GitHub 経由で MoviePilot のローカルプラグインリポジトリを公開・管理するスキルです。差分を確認してプラグインファイルと package エントリーを同期し、無関係なプラグインやローカルの機密ファイルを保護します。
主な機能
- 01ローカルとリモートの差分確認
- 02プラグインファイルと package エントリーの push
- 03リモートのプラグインファイルをローカルへ取得
- 04V3、V2、旧形式のレイアウトに対応
- 05機密ファイルと無関係なファイルの除外
活用シーン
- 01ローカルプラグインの GitHub 公開
- 02更新 push 前の差分確認
- 03リモートプラグインのローカルソースへの取得
MCP 対応
GitHub 操作を通じてプラグインファイルと package エントリーを公開・取得します。MCP サーバーまたはクライアントであるとは記載されていません。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ jxxghp/ moviepilot --skill publish-moviepilot-pluginインストール後、Claude Code で/publish-moviepilot-pluginを入力して読み込まれたか確認します。
同梱ファイルscripts/publish_plugin.py
詳細
MoviePilot プラグインの公開
このスキルを使って、ローカルのシークレットや無関係なプラグインを保護しながら、GitHub 経由で MoviePilot のローカルプラグインリポジトリを公開、管理します。
対象範囲
- ローカルプラグインのうち、
plugins.v3/<plugin_id_lower>/、plugins.v2/<plugin_id_lower>/、またはplugins/<plugin_id_lower>/にあるものを 1 つ、GitHub リポジトリに公開します。 - そのプラグインのエントリだけを
package.v3.json、package.v2.json、またはpackage.jsonにマージします。 - 書き込み前に、ローカルとリモートの差分をプレビューします。
- リモートのプラグインファイルをローカルのプラグインソースに取り込みます。
- ユーザーが自動作成を明示的に選択した場合に、対象の GitHub リポジトリを作成します。ユーザーが非公開を希望しない限り、リポジトリはデフォルトで公開されます。
- 利用可能な場合は、MoviePilot の設定
GITHUB_TOKEN、REPO_GITHUB_TOKEN、PLUGIN_LOCAL_REPO_PATHSを再利用します。
正しい情報源
- ローカルプラグインの開発ルール:
skills/create-moviepilot-plugin/SKILL.md。 - ローカルプラグインソースの特定:
app/adapters/external/market.py、PluginHelper.get_local_repo_paths()。 - GitHub トークンの設定:
app/runtime/config.py、特にGITHUB_TOKENとREPO_GITHUB_TOKEN。 - プラグインパッケージの構成:
- V3:
package.v3.jsonとplugins.v3/<plugin_id_lower>/ - V2:
package.v2.jsonとplugins.v2/<plugin_id_lower>/ - レガシー:
package.jsonとplugins/<plugin_id_lower>/
- V3:
事前確認
- 対象のプラグイン ID とローカルソースリポジトリを特定します。
- ユーザーがパスを指定した場合は、それを使用します。
- それ以外の場合は
PLUGIN_LOCAL_REPO_PATHSを確認し、設定済みリポジトリのうちプラグインを含むものが 1 つだけなら、それを使用します。 - プラグインを含む設定済みリポジトリが複数ある場合は、どれを使うか確認します。
- GitHub リポジトリを
owner/repo形式で特定します。- ユーザーが明示したリポジトリを最優先で使用します。
- 指定がない場合は、ローカルソースに明確な Git リモートがあるときに限り、それを推定します。
- どちらも利用できない場合は、既存のリポジトリを使うか、新しい公開リポジトリを自動作成するかを確認します。
- ユーザーが既存のリポジトリを選択した場合は、
owner/repoを確認します。 - ユーザーが自動作成を選択した場合は、対象の
owner/repoを確認し、リポジトリはデフォルトで公開されることを伝えます。 - ユーザーが明示的に希望しない限り、非公開リポジトリは作成しません。
- パッケージのバージョン構成を選択します。
- プラグインが
plugins.v3/<plugin_id_lower>/にある場合、またはリポジトリにpackage.v3.jsonが含まれる場合(現在の MoviePilot V3 ホスト)は、v3を優先します。 package.v2.jsonまたはplugins.v2/<plugin_id_lower>/が存在する場合は、v2を優先します。- ローカルプラグインが
plugins/にある場合に限り、レガシーを使用します。
- プラグインが
- トークンが利用可能か確認します。
- 設定されている場合は、対象リポジトリに
REPO_GITHUB_TOKENを優先して使用します。 - それがない場合は
GITHUB_TOKENを使用します。 - トークンが設定されていない場合は、プッシュする前に設定をユーザーに依頼します。公開リポジトリであれば、読み取り専用のプレビューはトークンなしでも実行できます。
- 設定されている場合は、対象リポジトリに
スクリプト
決定的な GitHub 操作には scripts/publish_plugin.py を使用します。
python skills/publish-moviepilot-plugin/scripts/publish_plugin.py preview \
--repo owner/repo \
--plugin-id MyPlugin \
--local-repo /path/to/MoviePilot-Plugins \
--package-version v2
python skills/publish-moviepilot-plugin/scripts/publish_plugin.py push \
--repo owner/repo \
--plugin-id MyPlugin \
--local-repo /path/to/MoviePilot-Plugins \
--package-version v2 \
--message "Publish MyPlugin v1.0.0"
python skills/publish-moviepilot-plugin/scripts/publish_plugin.py pull \
--repo owner/repo \
--plugin-id MyPlugin \
--local-repo /path/to/MoviePilot-Plugins \
--package-version v2
# V3 插件仓库(package.v3.json + plugins.v3/)
python skills/publish-moviepilot-plugin/scripts/publish_plugin.py push \
--repo owner/repo \
--plugin-id MyPlugin \
--local-repo /path/to/MoviePilot-Plugins \
--package-version v3 \
--message "Publish MyPlugin v1.0.0"
python skills/publish-moviepilot-plugin/scripts/publish_plugin.py create-repo \
--repo owner/repo
オプション:
--package-version v3|v2|legacy|auto:レイアウトの選択子です。autoは、プラグインディレクトリが実際に存在する場所(plugins.v3→plugins.v2→plugins)からレイアウトを特定し、その後マニフェストファイルを確認します。両方のマニフェストが残っているリポジトリでも、正しいレイアウトが選ばれます。現在の MoviePilot V3 プラグインリポジトリでは、明示的にv3を指定してください。create-repo:対象の GitHub リポジトリを作成します。デフォルトの公開範囲は public です。--privateは、ユーザーが明示的に非公開を指定した場合にのみ使用してください。preview:ローカルのフィルタリング済みファイルとリモートファイルを比較し、JSON を出力します。push:変更されたファイルをアップロードし、プラグインパッケージのエントリーをマージします。pull:リモートのプラグインファイルとパッケージエントリーをローカルソースに書き込みます。--create-repo-if-missing:push 時に、GitHub からリポジトリが存在しないと報告された場合、対象の公開リポジトリを作成します。--delete-remote:push 時に、除外処理の後、ローカルに存在しないリモートのプラグインファイルを削除します。--force:pull 時に、リモートと異なるローカルファイルの上書きを許可します。--include PATTERN:デフォルトで除外されるファイルを追加します。--exclude PATTERN:追加の無視パターンを指定します。--dry-run:書き込みを行わず、予定されている変更を出力します。--proxy URL:GitHub API リクエストに明示的な HTTP/HTTPS プロキシを使用します。
push は Git Data API(blob → tree → commit → ブランチ参照の移動)を通じてコミットします。変更ファイル数にかかわらず、コミットは 1 つだけ生成されます。CI の実行は 1 回だけになり、diff は完全な状態となり、package のバージョンとソースのバージョンに中間状態は発生しません。返される JSON には commit_sha が含まれます。空のリポジトリでは、ルートコミットとブランチが自動的に作成されます。
GitHub Release と README
push はプラグインのソースと package エントリーのみを同期します。GitHub Release の作成や README の変更は行いません。対象のリポジトリで GitHub Actions を使ってパッケージをビルドする場合(例:.github/workflows/plugins-release.yml。成果物は Plugin_vX.Y.Z タグと zip/tar.gz + sha256 アセット):
- package エントリーには
"release": trueを明示的に記述する必要があります。そうしないと、ワークフローが実行されてもリリースされません。 - 自動トリガーは、同じ push 内で package ファイルの version が変更されることを条件とします。ファイルごとにコミットする場合、
package.v3.jsonの変更が別のコミットに含まれ、diff で確認できないため、リリースが通知なくスキップされることがあります。この場合はworkflow_dispatch(source_directory+plugin_id)を使って手動でトリガーしてください。 - README のプラグイン表と説明は、個別に編集してプッシュする必要があります(Contents API または git)。これらは
pushの対象範囲外です。
安全ルール
- ユーザーが直接 push を明示的に依頼し、すでに diff を確認している場合を除き、
pushの前に必ずpreviewを実行してください。 - リポジトリが不明な場合は、ユーザーに次のいずれかを選んでもらってください:
既存の GitHub リポジトリを使用またはGitHub リポジトリを自動作成(デフォルトは public)。 - ユーザーが自動作成を明示的に選んだ後にのみ、
create-repoまたはpush --create-repo-if-missingを実行してください。 - 明示的に含める指定がない限り、次のファイルはアップロードしないでください:
.env、.env.*、config/、data/、cache/、logs/、tmp/、__pycache__/、.pytest_cache/、.mypy_cache/、.ruff_cache/、.DS_Store、*.pyc、*.pyo、*.db、*.sqlite、*.sqlite3、*.log、*.bak、*.tmp、*.secret、*.key、*.pem、*.crt、*.p12、*.pfx、node_modules/。 - Vue federation プラグインでは、ビルド済みのランタイムアセットが存在する場合は
dist/assets/に含めて公開してください。生成ファイルとして除外してはいけません。 - 他のプラグインの package エントリーを上書きしたり削除したりしないでください。
- package またはプラグインファイルを読み取る前に、リモートのコミットを固定してください。その同じツリーと親を使って、公開用の単一コミットを作成します。その間に対象ブランチが進んだ場合は、non-fast-forward の競合として処理を停止し、新しいスナップショットに対して再度 preview を実行してください。force-push を行ったり、古いマージ済みコンテンツを再利用したりしてはいけません。
- GitHub トークンの値をログに記録したり、出力したりしないでください。
- push 操作では、作成、更新、削除、スキップ、拒否されたファイルをそれぞれ分けて報告してください。
- pull 操作では、
--forceを指定していても、除外対象のローカルファイルを保持してください。ローカルの package JSON が無効な場合は、--forceモードでも、ローカルファイルを書き込む前に pull を停止してください。ローカルのプラグインファイルまたは package メタデータがリモートと異なる場合は、--forceが指定されていない限り、pull 全体を停止してください。他のプラグインの package エントリーは変更しないでください。 autoレイアウトでは、設定された各ローカルリポジトリを個別に調べてください。作業ディレクトリから他のリポジトリのレイアウトを判断してはいけません。
例
ユーザーの依頼:把本地 MyPlugin 发布到我的 GitHub 插件仓库
- 設定済みの
PLUGIN_LOCAL_REPO_PATHSの下からMyPluginを探します。 owner/repoを推測できない場合は、既存のリポジトリを使うか、新しい公開リポジトリを作成するかを尋ねます。previewを実行し、差分を要約します。- ユーザーが確認するか、すぐに公開するよう依頼した場合に限り、
pushを実行します。
ユーザーの依頼:发布插件,没有 GitHub 仓库
- 対象の
owner/repoを尋ね、自動作成を確認します。 create-repoを実行するか、push --create-repo-if-missingを使用します。- リポジトリの作成が成功した後、
previewとpushを続けて実行します。
ユーザーの依頼:同步 GitHub 上 MyPlugin 的最新代码到本地
--forceを付けずにpullを実行します。- ローカルの競合が報告された場合は、競合するパスを示し、強制的に上書きするか手動で解決するかを尋ねます。
最終チェックリスト
- プラグイン ID がパッケージオブジェクトのキーと一致している。
- パッケージファイルとプラグインディレクトリの構成が、選択したバージョンと一致している。
- 機密ファイルおよび実行時にローカルで使用するファイルが拒否またはスキップされている。
- 明示的に省略するよう指示された場合を除き、プッシュ前にプレビューが表示されている。
- 最終応答では、この組み込みスキル自体が変更された場合に限り、ローカルエージェントの再起動が必要かどうかを伝えている。