feat: add SKILL.md edit hook — warns to bump version in marketplace.json

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) <noreply@anthropic.com>
This commit is contained in:
daymade
2026-04-06 09:00:58 +08:00
parent c120cd415e
commit 673980639b
2 changed files with 73 additions and 0 deletions

View File

@@ -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