feat(install): add Mistral Vibe wiring target (parity with local-dev)
release / tag (push) Failing after 1s

Ports the Vibe wiring from local-dev's wire-skills.sh so this repo's installer
covers all four harnesses. Vibe uses a flat layout — ~/.vibe/skills/<name>.md
symlinked to the skill's SKILL.md file (not the directory, unlike Claude/Crush/
Antigravity). Added to both `task install` and install.sh, idempotent.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-04 00:13:42 +02:00
co-authored by Claude Opus 4.8
parent 1e29c6d1af
commit ef72982489
2 changed files with 47 additions and 1 deletions
+23 -1
View File
@@ -14,6 +14,7 @@ vars:
CLAUDE_GLOBAL_DIR: '{{.HOME}}/.claude/skills'
CRUSH_DIR: '{{.HOME}}/.config/crush/skills'
ANTIGRAVITY_DIR: '{{.HOME}}/.gemini/antigravity/skills'
VIBE_DIR: '{{.HOME}}/.vibe/skills'
# Anything at the repo root that is NOT a skill directory. Both
# Taskfile + install.sh share this exclusion regex.
NON_SKILL_ENTRIES: '^(Taskfile.yml|install.sh|README.md|SKILLS_INDEX.md|.gitea|.git$)$'
@@ -31,12 +32,13 @@ tasks:
silent: true
install:
desc: 'Wire skills into every supported harness (Claude Code, Crush, Antigravity).'
desc: 'Wire skills into every supported harness (Claude Code, Crush, Antigravity, Mistral Vibe).'
cmds:
- task: install:claude:global
- task: install:claude:repo
- task: install:crush
- task: install:antigravity
- task: install:vibe
install:claude:global:
desc: 'Per-skill symlinks under ~/.claude/skills/<name> — visible in every Claude Code project on this host.'
@@ -122,6 +124,26 @@ tasks:
echo "linked $link → $target"
done
install:vibe:
desc: 'Per-skill file symlinks under ~/.vibe/skills/<name>.md → <skill>/SKILL.md for Mistral Vibe (flat .md layout, not a directory).'
cmds:
- mkdir -p {{.VIBE_DIR}}
- |
for skill in $(ls -1 "{{.TASKFILE_DIR}}" | grep -Ev "{{.NON_SKILL_ENTRIES}}"); do
target="{{.TASKFILE_DIR}}/${skill}/SKILL.md"
[ -f "$target" ] || continue
link="{{.VIBE_DIR}}/${skill}.md"
if [ -L "$link" ] || [ -e "$link" ]; then
current=$(readlink "$link" 2>/dev/null || true)
if [ "$current" = "$target" ]; then
continue
fi
rm -rf "$link"
fi
ln -s "$target" "$link"
echo "linked $link → $target"
done
update:
desc: 'git pull the canonical checkout then re-run install.'
cmds:
+24
View File
@@ -19,6 +19,7 @@ CHECKOUT_DIR="${SKILLS_CHECKOUT_DIR:-$HOME/.local/share/skills}"
CLAUDE_GLOBAL_DIR="${CLAUDE_SKILLS_DIR:-$HOME/.claude/skills}"
CRUSH_DIR="${CRUSH_SKILLS_DIR:-$HOME/.config/crush/skills}"
ANTIGRAVITY_DIR="${ANTIGRAVITY_SKILLS_DIR:-$HOME/.gemini/antigravity/skills}"
VIBE_SKILLS_DIR="${VIBE_SKILLS_DIR:-$HOME/.vibe/skills}"
log() { printf '[skills] %s\n' "$*"; }
@@ -112,12 +113,35 @@ wire_claude_repo() {
done < <(list_skills)
}
wire_vibe() {
# Mistral Vibe reads a flat ~/.vibe/skills/<name>.md — link the SKILL.md
# file directly (not the skill directory, as the other harnesses do).
mkdir -p "$VIBE_SKILLS_DIR"
while IFS= read -r skill; do
[ -n "$skill" ] || continue
local target="$CHECKOUT_DIR/$skill/SKILL.md"
[ -f "$target" ] || continue
local link="$VIBE_SKILLS_DIR/$skill.md"
if [ -L "$link" ] || [ -e "$link" ]; then
local current
current=$(readlink "$link" 2>/dev/null || true)
if [ "$current" = "$target" ]; then
continue
fi
rm -rf "$link"
fi
ln -s "$target" "$link"
log "linked $link$target"
done < <(list_skills)
}
main() {
ensure_checkout
wire_claude_global
wire_claude_repo
wire_crush
wire_antigravity
wire_vibe
log "done — $(list_skills | wc -l | tr -d ' ') skill(s) wired at ref=$REF"
}