From 673980639b613ba98c8b5539a5bfb6fe355640b3 Mon Sep 17 00:00:00 2001 From: daymade Date: Mon, 6 Apr 2026 09:00:58 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20add=20SKILL.md=20edit=20hook=20?= =?UTF-8?q?=E2=80=94=20warns=20to=20bump=20version=20in=20marketplace.json?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two hooks now active for marketplace-dev users: 1. Edit marketplace.json → auto-validate schema 2. Edit any SKILL.md → warn if version bump needed or skill unregistered Co-Authored-By: Claude Opus 4.6 (1M context) --- .claude-plugin/marketplace.json | 9 +++ .../scripts/post_edit_sync_check.sh | 64 +++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100755 marketplace-dev/scripts/post_edit_sync_check.sh diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index bb7b461..d99168c 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -971,6 +971,15 @@ "command": "${CLAUDE_PLUGIN_ROOT}/scripts/post_edit_validate.sh" } ] + }, + { + "matcher": "Write|Edit", + "hooks": [ + { + "type": "command", + "command": "${CLAUDE_PLUGIN_ROOT}/scripts/post_edit_sync_check.sh" + } + ] } ] } diff --git a/marketplace-dev/scripts/post_edit_sync_check.sh b/marketplace-dev/scripts/post_edit_sync_check.sh new file mode 100755 index 0000000..872289e --- /dev/null +++ b/marketplace-dev/scripts/post_edit_sync_check.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +# PostToolUse hook: warn when SKILL.md is edited but marketplace.json version not bumped +# Detects skill content changes that need a corresponding version bump in marketplace.json + +set -euo pipefail + +INPUT=$(cat) + +FILE_PATH=$(echo "$INPUT" | python3 -c " +import json, sys +try: + data = json.load(sys.stdin) + print(data.get('tool_input', {}).get('file_path', '')) +except: + print('') +" 2>/dev/null) + +# Only care about SKILL.md edits +[[ "$FILE_PATH" != *"SKILL.md"* ]] && exit 0 + +# Find the skill name from path (e.g., /repo/skills/dbs-hook/SKILL.md → dbs-hook) +SKILL_DIR=$(dirname "$FILE_PATH") +SKILL_NAME=$(basename "$SKILL_DIR") + +# Search for marketplace.json upward from the edited file +SEARCH_DIR="$SKILL_DIR" +MARKETPLACE_JSON="" +while [[ "$SEARCH_DIR" != "/" ]]; do + if [[ -f "$SEARCH_DIR/.claude-plugin/marketplace.json" ]]; then + MARKETPLACE_JSON="$SEARCH_DIR/.claude-plugin/marketplace.json" + break + fi + SEARCH_DIR=$(dirname "$SEARCH_DIR") +done + +[[ -z "$MARKETPLACE_JSON" ]] && exit 0 + +# Check if this skill is registered and if version needs bumping +python3 -c " +import json, sys + +with open('$MARKETPLACE_JSON') as f: + data = json.load(f) + +skill_name = '$SKILL_NAME' +found = False +for p in data.get('plugins', []): + skills = p.get('skills', []) + for s in skills: + if s.rstrip('/').split('/')[-1] == skill_name: + found = True + version = p.get('version', 'unknown') + print(json.dumps({ + 'result': f'SKILL.md for \"{skill_name}\" was modified. Remember to bump its version in marketplace.json (currently {version}). Users on the old version won\\'t receive this update otherwise.' + })) + break + if found: + break + +if not found: + print(json.dumps({ + 'result': f'SKILL.md for \"{skill_name}\" was modified but this skill is NOT registered in marketplace.json. Add it if you want it installable via plugin marketplace.' + })) +" 2>/dev/null