feat(skills): declare which surfaces each skill ships to
The repo distributes three ways — the Claude Code plugin, the symlinked library for Crush/Pi/OpenCode, and claude.ai, which has no fetch path at all — and treated every skill as belonging to all of them. claude.ai is not a fourth host to mirror: gitea-ci, playwright and web-shot have no shell and no cluster there, so a flat mirror installs skills that can never fire and degrades selection for the ones that can. Every SKILL.md now carries `surfaces:`, defaulting to [claude-code, library]; dream, own-the-task and grill-me add `chat`, matching what is actually installed on claude.ai today. Claude Code accepts the extra key — `claude plugin validate` passes and the skills still load. bin/check-surfaces validates values, not just presence, because the failure mode here is silent: a wrong surface removes a skill from a harness rather than erroring. install.sh links only skills whose surfaces include `library`, and a source that declares nothing at all is treated as foreign and linked as-is — Anthropic's official set has no reason to know this convention. doctor's missing-link check skips non-library skills for the same reason. Refs #29 Bump-Type: minor
This commit is contained in:
+11
@@ -131,6 +131,17 @@ wire_skills() {
|
||||
name="$(basename "$dir")"
|
||||
target="${dir%/}"
|
||||
|
||||
# A skill declares its surfaces; this installer serves exactly one of
|
||||
# them. A chat-only skill linked into Crush can never fire and competes
|
||||
# for selection with ones that can (#29). A source with no declaration
|
||||
# is foreign — Anthropic's official set has no reason to know this
|
||||
# convention — so silence means "link it".
|
||||
surfaces="$(sed -n 's/^surfaces:[[:space:]]*//p' "$dir/SKILL.md" | head -1)"
|
||||
if [ -n "$surfaces" ] && ! printf '%s' "$surfaces" | tr -d '[]' | tr ',' ' ' | grep -qw library; then
|
||||
log "skipping $name — surfaces: $surfaces does not include the library"
|
||||
continue
|
||||
fi
|
||||
|
||||
if printf '%s' "$desired" | grep -qx -- "$name"; then
|
||||
log "COLLISION: $name is offered by $target too; keeping $AGENTS_DIR/$name -> $(readlink "$AGENTS_DIR/$name" 2>/dev/null || echo '?')"
|
||||
continue
|
||||
|
||||
Reference in New Issue
Block a user