Files
sandrone-bot[bot] 95016dadd9 Add Claude/Cursor/Codex plugin manifests + skills validation CI
## What

1. Plugin manifests for the three official install channels:
   - .claude-plugin/plugin.json — repo-level plugin (auto-discovers all
     skills/*/SKILL.md)
   - .claude-plugin/marketplace.json — one entry per skill directory, each
     sharing source "./" with an exclusive "skills" path (the documented
     pattern that makes every skill directory independently installable)
   - .cursor-plugin/plugin.json — auto-discovery layout
   - .codex-plugin/plugin.json — explicit ./-prefixed skills list + interface
     metadata (schema verified against openai/codex manifest.rs)

2. scripts/validate_skills.py + .github/workflows/validate-skills.yml run
   five checks on every PR and on pushes to main:
   1. frontmatter: name == directory name, semver metadata.version,
      description carries a trigger phrase and a boundary note
   2. version sync across all manifests, every SKILL.md, and the top
      CHANGELOG.md entry
   3. marketplace entries + codex skills list cover exactly the skills/
      directory set
   4. reference bidirectionality: every relative link in SKILL.md exists;
      every non-SKILL markdown file is reachable from SKILL.md
   5. no ".." path segments, so skill dirs stay independently installable

## Baseline fixes required for a green CI (overlap with ENG-1575 scope)

- meshy-openclaw frontmatter: name was "meshy-3d-agent" while the directory
  is meshy-openclaw, and metadata.version was missing (CHANGELOG 0.4.0
  admits the drift). Aligned to name=meshy-openclaw, version="0.4.0".
  If "meshy-3d-agent" is the intended public name, the directory should be
  renamed instead of relaxing check 1.
- All three skill descriptions gained one boundary sentence (check 1
  requires the boundary note in the description; wording mirrors the
  routing rules already present in each skill body).
- .gitignore ignored .claude-plugin/ — removed; otherwise the manifests
  could never be committed.

No version bump: everything stays at 0.4.0. Releasing 0.5.0 is a
maintainer decision, and check 2 makes it a mechanical, CI-enforced edit.

## Validation

Local: all 5 checks green. Negative tests (mutate -> red -> restore):
version drift -> check 2 red; deleted referenced file -> check 4 red;
frontmatter name drift -> check 1 red; missing marketplace entry ->
check 3 red; "../" link -> check 5 red; orphan markdown -> check 4 red.
Every check fires in isolation.
2026-07-31 17:24:49 +08:00
..