Skip to content

PR 验证脚本

市场仓库的 .github/workflows/validate-pr.yml 在每次 PR 时自动跑 scripts/validate.py,检查插件格式是否合法。CI 不过 PR 合不进去。

PR 改动以下任一路径时触发:

  • friend/**
  • application/**
  • packs/**
  • scripts/validate.py
  • .github/workflows/validate-pr.yml

对三个目录里的每个插件条目(一组同名 .meta.json + .mood* + .png):

  • 是合法 JSON
  • 是 JSON 对象
  • 有所有必填字段:id / type / name / description / version / author / platforms
  • 每个字段类型正确(platforms 是数组等)
  • type 是 friend / application / pack 之一
  • platforms 数组里每个值是合法平台 id
  • .meta.json 的 id 必须和文件名主干一致
    • moodpet.friend.default_smiley.meta.json → id 必须是 moodpet.friend.default_smiley
  • 同目录下有对应的 .moodfriend / .moodapp / .moodpack 文件
  • 同目录下有对应的 .png 预览图
  • .png 是合法 PNG(文件头检查)
  • .mood* 是合法 ZIP
  • ZIP 根目录有 manifest.json
  • manifest 的 id 和 .meta.json 的 id 一致
  • manifest 的 type 和 .meta.json 的 type 一致

Friend:

  • manifest 有 interfaces.personality(string)
  • interfaces.personality 指向的文件在 ZIP 内存在

Application:

  • manifest 有 entry(string)
  • entry 指向的文件在 ZIP 内存在
  • entry 文件做基础安全扫描(见下)

Pack:

  • manifest 有 plugins 对象

扫描 entry 文件内容,匹配可疑模式:

  • os.system(...)
  • subprocess.run/Popen/call(... shell=True)
  • eval(open/urllib/requests...)
  • exec(open/urllib/requests...)
  • curl ... | sh/bash/python
  • wget ... | sh/bash/python
  • null-terminated URL(http://...\x00)

命中任一报 suspicious pattern,CI 红叉。这是基础扫描——挡低级错误,不替代人工 review。

同目录下不能有两个插件的 id 重复。

Terminal window
cd moodpet-plugin-market
python scripts/validate.py

需要 Python 3.8+,无第三方依赖(只用标准库 json / zipfile / re / pathlib)。

期望输出:

friend/: 1 plugin(s) OK
application/: 0 plugin(s) OK
packs/: 0 plugin(s) OK
Validated 1 plugin(s).
✅ All plugins valid.

有违规时:

friend/: 0 plugin(s) OK
❌ 1 violation(s):
- friend/bad.meta.json: meta.id (bad) must match filename stem (wrong)

.github/workflows/validate-pr.yml:

name: Validate PR
on:
pull_request:
branches: [main]
paths:
- 'friend/**'
- 'application/**'
- 'packs/**'
- 'scripts/validate.py'
- '.github/workflows/validate-pr.yml'
permissions:
contents: read
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- run: python scripts/validate.py
错误信息 原因 修法
invalid JSON meta.json 语法错 用 JSON linter 检查
missing required field 少写字段 补齐必填字段
meta.id must match filename stem id 和文件名不一致 改文件名或改 id
missing plugin package 少了 .mood* 文件 把包放进去
not a valid zip 包不是 ZIP 重新打包
manifest.json not found in package ZIP 里没 manifest ZIP 根目录放 manifest
manifest id does not match 包内 manifest id 和 meta id 不一致 统一 id
preview file is not a valid PNG 预览图不是 PNG 存成 PNG
suspicious pattern Application entry 有危险代码 改用安全 API
duplicate plugin id 同目录两个插件 id 重复 改其中一个的 id