Use this skill when the user asks to publish, upload, sync, pull, push, diff, or maintain a MoviePilot local plugin in a GitHub repository. Covers using the configured MoviePilot GitHub token, PLUGIN_LOCAL_REPO_PATHS local plugin repositories, package.json/package.v2.json/package.v3.json metadata, plugins/plugins.v2/plugins.v3 layouts, safe file exclusion, diff preview before publishing, incremental GitHub Contents API updates, and syncing local plugin changes back from GitHub. Includes asking whether to use an existing repository or create a new public repository when no target repository is available. Also use for Chinese requests mentioning 插件发布, 插件维护, 推送插件到 GitHub, 从 GitHub 拉取插件, 同步本地插件仓库, 增量发布插件, 插件仓库维护.
77
97%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Low
Low-risk findings worth noting
Use this skill to publish and maintain a MoviePilot local plugin repository through GitHub while protecting local secrets and unrelated plugins.
plugins.v3/<plugin_id_lower>/,
plugins.v2/<plugin_id_lower>/ or plugins/<plugin_id_lower>/ to a GitHub
repository.package.v3.json, package.v2.json or
package.json.GITHUB_TOKEN, REPO_GITHUB_TOKEN,
and PLUGIN_LOCAL_REPO_PATHS when available.skills/create-moviepilot-plugin/SKILL.md.app/adapters/external/market.py,
PluginHelper.get_local_repo_paths().app/runtime/config.py, especially GITHUB_TOKEN and
REPO_GITHUB_TOKEN.package.v3.json and plugins.v3/<plugin_id_lower>/package.v2.json and plugins.v2/<plugin_id_lower>/package.json and plugins/<plugin_id_lower>/PLUGIN_LOCAL_REPO_PATHS; if exactly one configured
repository contains the plugin, use it.owner/repo.
owner/repo.owner/repo
and state that the repository will be public by default.v3 when the plugin lives under plugins.v3/<plugin_id_lower>/
or the repository ships package.v3.json (current MoviePilot V3 hosts).v2 when package.v2.json or plugins.v2/<plugin_id_lower>/
exists.plugins/.REPO_GITHUB_TOKEN for the target repo when configured.GITHUB_TOKEN.Use scripts/publish_plugin.py for deterministic GitHub operations.
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/repoOptions:
--package-version v3|v2|legacy|auto: layout selector. auto resolves the
layout from where the plugin directory actually lives
(plugins.v3 → plugins.v2 → plugins), then falls back to the manifest
files, so repositories that still keep both manifests stay correct. Pass
v3 explicitly for current MoviePilot V3 plugin repositories.create-repo: create the target GitHub repository. Default visibility is
public; use --private only when the user explicitly asked for private.preview: compare local filtered files with remote files and print JSON.push: upload changed files and merge the plugin package entry.pull: write remote plugin files and package entry into local source.--create-repo-if-missing: on push, create the target public repository when
GitHub reports that it does not exist.--delete-remote: on push, delete remote plugin files that no longer exist
locally after exclusions.--force: on pull, allow overwriting local files that differ from remote.--include PATTERN: add files otherwise excluded by default.--exclude PATTERN: add an extra ignore pattern.--dry-run: print planned changes without writing.--proxy URL: use an explicit HTTP/HTTPS proxy for GitHub API requests.push 通过 Git Data API(blob → tree → commit → 移动分支引用)提交:无论一次改动
多少文件都只产生一个 commit,CI 只会触发一次、diff 完整,package 版本与源码
版本不会出现中间态;返回 JSON 中带 commit_sha。空仓库会自动创建根提交并建立分支。
push 只同步插件源码与 package 条目,不会创建 GitHub Release,也不会修改
README。目标仓库若用 GitHub Actions 打包(例如
.github/workflows/plugins-release.yml,产物为 Plugin_vX.Y.Z tag 与
zip/tar.gz + sha256 资产):
"release": true,否则工作流即使运行也不会发版。package.v3.json 的变更可能落在另一个提交,diff 里看不到它,于是静默跳过;
这种情况改用 workflow_dispatch(source_directory + plugin_id)手动触发。push 的职责范围内。preview before push unless the user explicitly asks for a
direct push and already reviewed the diff.使用已有 GitHub 仓库 or 自动创建 GitHub 仓库(默认 public).create-repo or push --create-repo-if-missing after the user has
explicitly chosen automatic creation..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/.dist/assets/
when they are present; do not exclude them as generated files.--force.
Invalid local package JSON stops the pull before any local file is written,
including in --force mode.
Differing local plugin files or package metadata stop the entire pull unless
--force is used. Package entries for other plugins remain untouched.auto layout, inspect each configured local repository separately;
the working directory does not determine the layout of other repositories.User asks: 把本地 MyPlugin 发布到我的 GitHub 插件仓库
MyPlugin under configured PLUGIN_LOCAL_REPO_PATHS.owner/repo cannot be inferred.preview and summarize the diff.push only after the user confirms or requested immediate publish.User asks: 发布插件,没有 GitHub 仓库
owner/repo and confirm automatic creation.create-repo or use push --create-repo-if-missing.preview and push after repository creation succeeds.User asks: 同步 GitHub 上 MyPlugin 的最新代码到本地
pull without --force.jxxghp/MoviePilot
d62e9ba
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.