feat(registry): community skills registry (schema, index, validate, site, CI)#751
feat(registry): community skills registry (schema, index, validate, site, CI)#751alirezarezvani wants to merge 2 commits into
Conversation
…e, site, CI) Adds a gitagent-style registry under registry/ that catalogs this repo's own plugins (seeded from .claude-plugin/marketplace.json) alongside community-submitted skills hosted in external repos. GitHub is the source of truth — no backend. - schema/metadata.schema.json: draft-07 submission schema - scripts/build_index.py: stdlib index builder (deterministic; --github, --check) - scripts/validate.py: stdlib schema + structural validator with optional repo clone - skills/: community submissions; includes a working template example - site/: vanilla HTML/CSS/JS browse + search (no build step) - .github/workflows/registry.yml: validate PRs + keep index.json in sync (no Pages deploy — that stays owned by the MkDocs docs site) https://claude.ai/code/session_01CYgAb1quXh3XQhYScBZRca
PR Review — feat(registry): community skills registryGreat concept and solid execution overall. The stdlib-only constraint is respected, the schema is well-structured, and the two-source (internal + community) design is clean. A few issues need attention before this merges, ranging from a security fix to schema gaps. 🔴 Critical — CI Command InjectionFile: - name: Validate changed submissions
if: steps.changed.outputs.folders != ''
run: |
RESULT=0
for folder in ${{ steps.changed.outputs.folders }}; do # ← injection here
echo "::group::Validating $folder"
python registry/scripts/validate.py --clone "$folder" || RESULT=1
done
exit $RESULT
Fix: pass the output as an environment variable, which is not subject to template injection: - name: Validate changed submissions
if: steps.changed.outputs.folders != ''
env:
FOLDERS: ${{ steps.changed.outputs.folders }}
run: |
RESULT=0
for folder in $FOLDERS; do
echo "::group::Validating $folder"
python registry/scripts/validate.py --clone "$folder" || RESULT=1
echo "::endgroup::"
done
exit $RESULT🟠 Medium — Path Traversal via
|
| Severity | Issue | File |
|---|---|---|
| 🔴 Critical | CI expression injection in shell for loop |
registry.yml:38 |
| 🟠 Medium | Path traversal via startswith instead of is_relative_to |
validate.py:202 |
| 🟠 Medium | Missing path field pattern allows ../ traversal in schema |
metadata.schema.json:36 |
| 🟡 Low | agents variable name should be skills |
build_index.py:163 |
| 🟡 Low | Community entries sort before internal | build_index.py:164 |
| 🟡 Low | No push trigger on dev/main for index sync check | registry.yml |
Fix the 🔴 and 🟠 issues before merging; the 🟡 items are advisory. The CI injection is the blocker — it exposes the runner to arbitrary code execution from PR authors.
Closed — this registry was built in the wrong repository. The intended target is
alirezarezvani/agent-registery. Branchclaude/registry-repo-7lRivis preserved if any of this code is ever wanted, but it does not belong in claude-skills.