When a skill directory is a symlink (e.g., created via npx skills or ln -s), the skill is not loaded by loadSkillsFromDir() because entry.isDirectory() returns false for symlinks under lstat semantics. This breaks hot-reload for symlinked skills.
Root cause: In skill-load.ts, the code only checks entry.isDirectory(), which does not follow symlinks.
Fix: Also check entry.isSymbolicLink() and use fs.stat() to verify if the symlink target is a directory.
Impact: Affects skills installed via npx skills (symlinks are the recommended method for this installation approach).
When a skill directory is a symlink (e.g., created via npx skills or ln -s), the skill is not loaded by loadSkillsFromDir() because entry.isDirectory() returns false for symlinks under lstat semantics. This breaks hot-reload for symlinked skills.
Root cause: In skill-load.ts, the code only checks entry.isDirectory(), which does not follow symlinks.
Fix: Also check entry.isSymbolicLink() and use fs.stat() to verify if the symlink target is a directory.
Impact: Affects skills installed via npx skills (symlinks are the recommended method for this installation approach).