#!/usr/bin/env bash set -euo pipefail MOSAIC_HOME="${MOSAIC_HOME:-$HOME/.config/mosaic}" APPLY=0 usage() { cat <&2 usage >&2 exit 1 ;; esac done skill_roots=( "$HOME/.claude/skills" "$HOME/.codex/skills" "$HOME/.config/opencode/skills" ) if [[ ! -d "$MOSAIC_HOME/skills-local" ]]; then echo "[mosaic-local-skills] Missing local skills dir: $MOSAIC_HOME/skills-local" >&2 exit 1 fi count=0 while IFS= read -r -d '' local_skill; do name="$(basename "$local_skill")" src="$MOSAIC_HOME/skills-local/$name" [[ -d "$src" ]] || continue for root in "${skill_roots[@]}"; do [[ -d "$root" ]] || continue target="$root/$name" # Already linked correctly. if [[ -L "$target" ]]; then target_real="$(readlink -f "$target" 2>/dev/null || true)" src_real="$(readlink -f "$src" 2>/dev/null || true)" if [[ -n "$target_real" && -n "$src_real" && "$target_real" == "$src_real" ]]; then continue fi fi # Only migrate local directories containing SKILL.md if [[ -d "$target" && -f "$target/SKILL.md" && ! -L "$target" ]]; then count=$((count + 1)) if [[ $APPLY -eq 1 ]]; then stamp="$(date +%Y%m%d%H%M%S)" mv "$target" "${target}.mosaic-bak-${stamp}" ln -s "$src" "$target" echo "[mosaic-local-skills] migrated: $target -> $src" else echo "[mosaic-local-skills] would migrate: $target -> $src" fi fi done done < <(find "$MOSAIC_HOME/skills-local" -mindepth 1 -maxdepth 1 -type d -print0) if [[ $APPLY -eq 1 ]]; then echo "[mosaic-local-skills] complete: migrated=$count" else echo "[mosaic-local-skills] dry-run: migratable=$count" echo "[mosaic-local-skills] re-run with --apply to migrate" fi