feat: expand hello-world into a complete cross-compat plugin scaffold

Adds every cross-compatible component between Claude Code and Copilot CLI:
skills (shared), agents (per-tool .md vs .agent.md), hooks (per-tool
paths), and .mcp.json (shared). Both plugin.json manifests now carry all
shared identity fields (name, description, author, license, keywords)
with Copilot-specific component paths only in the root manifest.

Updates validate.sh sync check to verify shared identity fields rather
than demanding content equality, since component path declarations
legitimately diverge between tools.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-20 13:41:00 +00:00
parent 41f98f6efd
commit 5ab7054976
9 changed files with 142 additions and 16 deletions

View File

@@ -147,10 +147,25 @@ validate_plugin_dir() {
validate_plugin_json "$claude_manifest" "$marketplace_json"
validate_plugin_json "$root_manifest" "$marketplace_json"
# Sync check
# Sync check — shared identity fields must match; component path fields legitimately diverge
if [[ -f "$claude_manifest" && -f "$root_manifest" ]]; then
if ! diff <(jq -S . "$claude_manifest") <(jq -S . "$root_manifest") >/dev/null 2>&1; then
warn "$pd: .claude-plugin/plugin.json and plugin.json differ — keep them in sync"
local field cv rv
for field in name description version license; do
cv=$(jq -r ".$field // empty" "$claude_manifest")
rv=$(jq -r ".$field // empty" "$root_manifest")
if [[ ( -n "$cv" || -n "$rv" ) && "$cv" != "$rv" ]]; then
error "$pd: '$field' differs between .claude-plugin/plugin.json ('$cv') and plugin.json ('$rv')"
fi
done
cv=$(jq -r '.author.name // empty' "$claude_manifest")
rv=$(jq -r '.author.name // empty' "$root_manifest")
if [[ ( -n "$cv" || -n "$rv" ) && "$cv" != "$rv" ]]; then
error "$pd: 'author.name' differs between .claude-plugin/plugin.json ('$cv') and plugin.json ('$rv')"
fi
cv=$(jq -r '.keywords // [] | sort | join(",")' "$claude_manifest")
rv=$(jq -r '.keywords // [] | sort | join(",")' "$root_manifest")
if [[ "$cv" != "$rv" ]]; then
error "$pd: 'keywords' differs between .claude-plugin/plugin.json and plugin.json"
fi
fi
fi