Fast-follow for the two code-review findings on #555. Finding 1 — `all` mode dropped Pi's native skill roots. `mosaic` passes `--no-skills`, which suppresses Pi's own auto-discovery, so the `all` catalog must re-enumerate the native roots (`~/.pi/agent/skills/` and `<cwd>/.pi/skills/`) explicitly or skills living only there vanish. `discoverPiSkills` now scans those roots too. Also fixes a latent bug: the old enumerator skipped symlinked entries (`!isDirectory()`), but synced fleet skills land as symlinks — they were being dropped. Finding 2 — `discover` mode (which keeps native discovery ON) force-loaded fleet skills unconditionally, double-registering any skill Pi already finds natively. It now filters force-loads against the native-root realpath set. Implementation: realpath-based dedup throughout. New `skillRealPath`, `piNativeSkillRoots`, `enumerateSkillDirs` (accepts dirs + symlinks, dedup by realpath), `piNativeSkillRealPaths`. `mergeSkillArgs` dedups by realpath. `buildPiSkillArgs` gains an injectable 5th param for deterministic tests. Tests: discover-mode native-filter + intra-set dedup cases, plus real-FS coverage of `enumerateSkillDirs` (symlink acceptance, cross-root realpath dedup, SKILL.md gating). 308 pass; typecheck/lint/prettier green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QoYiBeKNh3BiYtAJS5Z587
9.7 KiB
9.7 KiB