mirror of
https://github.com/openprose/prose.git
synced 2026-09-19 05:55:05 +08:00
100 lines
3.7 KiB
YAML
100 lines
3.7 KiB
YAML
name: Plugin Manifest
|
|
|
|
on:
|
|
pull_request:
|
|
paths:
|
|
- ".claude-plugin/**"
|
|
- ".codex-plugin/**"
|
|
- ".agents/plugins/**"
|
|
- "skills/open-prose/SKILL.md"
|
|
- "scripts/bump-version.sh"
|
|
- "scripts/release-preflight.sh"
|
|
- "scripts/sync-copy.sh"
|
|
- ".version-bump.json"
|
|
- ".plugin-meta.json"
|
|
- "assets/plugin/**"
|
|
- "CHANGELOG.md"
|
|
- ".github/workflows/plugin-manifest.yml"
|
|
push:
|
|
branches:
|
|
- main
|
|
paths:
|
|
- ".claude-plugin/**"
|
|
- ".codex-plugin/**"
|
|
- ".agents/plugins/**"
|
|
- "skills/open-prose/SKILL.md"
|
|
- "scripts/bump-version.sh"
|
|
- "scripts/release-preflight.sh"
|
|
- "scripts/sync-copy.sh"
|
|
- ".version-bump.json"
|
|
- ".plugin-meta.json"
|
|
- "assets/plugin/**"
|
|
- "CHANGELOG.md"
|
|
- ".github/workflows/plugin-manifest.yml"
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
concurrency:
|
|
group: plugin-manifest-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
validate:
|
|
name: Validate plugin manifests
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 2
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Validate Claude plugin manifest
|
|
run: |
|
|
node -e '
|
|
const fs = require("fs");
|
|
const m = JSON.parse(fs.readFileSync(".claude-plugin/plugin.json","utf8"));
|
|
if (!m.name || !m.version) { console.error("missing name/version"); process.exit(1); }
|
|
const skillsField = String(m.skills || "./skills").replace(/^\.\//,"").replace(/\/$/,"");
|
|
const target = skillsField + "/open-prose/SKILL.md";
|
|
if (!fs.existsSync(target)) { console.error("skills path not found: " + target); process.exit(1); }
|
|
console.log("ok: claude plugin manifest");
|
|
'
|
|
|
|
- name: Validate Codex plugin manifest
|
|
run: |
|
|
node -e '
|
|
const fs = require("fs");
|
|
const m = JSON.parse(fs.readFileSync(".codex-plugin/plugin.json","utf8"));
|
|
if (!m.name || !m.version) { console.error("missing name/version"); process.exit(1); }
|
|
if (!m.interface || !m.interface.displayName) { console.error("missing interface.displayName"); process.exit(1); }
|
|
const skillsField = String(m.skills || "./skills").replace(/^\.\//,"").replace(/\/$/,"");
|
|
const target = skillsField + "/open-prose/SKILL.md";
|
|
if (!fs.existsSync(target)) { console.error("skills path not found: " + target); process.exit(1); }
|
|
const mp = JSON.parse(fs.readFileSync(".agents/plugins/marketplace.json","utf8"));
|
|
if (!Array.isArray(mp.plugins) || mp.plugins[0].name !== "open-prose") { console.error("agents/plugins/marketplace.json mismatch"); process.exit(1); }
|
|
console.log("ok: codex plugin manifest");
|
|
'
|
|
|
|
- name: OpenProse versions in sync
|
|
run: ./scripts/bump-version.sh --check
|
|
|
|
- name: Plugin copy in sync
|
|
run: ./scripts/sync-copy.sh --check
|
|
|
|
- name: Plugin assets exist
|
|
run: |
|
|
test -f assets/plugin/logo.png
|
|
test -f assets/plugin/composer-icon.png
|
|
file assets/plugin/logo.png | grep -q 'PNG image data, 512 x 512'
|
|
file assets/plugin/composer-icon.png | grep -q 'PNG image data, 64 x 64'
|
|
|
|
- name: Codex interface has visual assets
|
|
run: |
|
|
jq -e '.interface.logo and .interface.composerIcon and .interface.brandColor and .interface.websiteURL' .codex-plugin/plugin.json
|
|
jq -re '.interface.brandColor' .codex-plugin/plugin.json | grep -E '^#[0-9A-Fa-f]{6}$'
|
|
|
|
- name: Registry names unified to openprose
|
|
run: |
|
|
jq -e '.name == "openprose"' .claude-plugin/marketplace.json
|
|
jq -e '.name == "openprose"' .agents/plugins/marketplace.json
|