skillshare v0.13.1 Release Notes
Release date: 2026-02-16
TL;DR
After data migration (XDG or Windows path relocation), sync left orphan symlinks in target directories because they pointed to old paths. Users had to manually delete them from every target. This release fixes it automatically.
The Problem
v0.13.0 introduced XDG Base Directory support and Windows path migration. After migration:
- Target symlinks still pointed to the old source path (e.g.
~/.config/skillshare/skills/my-skill) PruneOrphanLinks()classified these as "external symlinks" (not under the new source directory)- External symlinks were always preserved with a warning — even with
--force --forcewas never passed toPruneOrphanLinks()in the first place
Users had to manually visit each target directory and delete stale symlinks.
The Fix
PruneOrphanLinks() now uses a three-tier decision for external symlinks:
| Condition | Action | Rationale |
|---|---|---|
| Broken (target doesn't exist) | Auto-remove | Safe — nothing points to a valid location |
Valid + --force
| Remove | User explicitly requested cleanup |
| Valid + no force | Preserve + warn | Backward compatible — may be intentional |
Additional fixes:
--forceflag is now passed through toPruneOrphanLinks()from CLI, Web UI sync, and git pull handlers- Path prefix comparison uses
utils.PathHasPrefix()for Windows case-insensitive matching (wasstrings.HasPrefix)
Upgrade Path
# After upgrading, just run sync — broken external symlinks are cleaned up automatically
skillshare sync
# To also remove valid external symlinks (if any)
skillshare sync --forceNo manual cleanup is needed.
Verification
Covered by:
TestSync_Pruning_RemovesBrokenExternalSymlinks— simulates post-migration broken symlink, verifies auto-removalTestSync_Pruning_ForceRemovesExternalSymlinks— verifies valid external symlinks preserved without force, removed with--force- Full suite (
make test) passing