- Add isUniversalForScope(agent, isGlobal) and getAgentTargetDir(agent, isGlobal) to agent-detector.ts
- An agent is 'universal' when its target install dir equals the canonical .agents/skills directory
- This fixes incorrect symlink skipping for agents like Codex/Cursor whose globalSkillsDir
differs from .agents/skills (e.g. .codex/skills, .cursor/skills)
- Update installer.ts to use dynamic check via optional AgentInfo parameter
- Update install.ts to use getAgentTargetDir and pass agent info to installSkill
- Update uninstall.ts to use isUniversalForScope for correct path resolution
- Clean up unused isUniversalAgent import in list.ts
- Stop spinner before runInteractiveSearch to prevent terminal UI conflict
(same issue as version selection p.select)
- Make spinner messages more specific: include skill name, version, path
instead of generic "Fetching"/"Downloading"/"Extracting"
The ora spinner was still running during p.select() interactive prompt,
causing the spinner to continuously overwrite the terminal and block
the version selection UI. The user would see "Fetching..." stuck until
pressing Enter.
Stop spinner before p.select() and restart after selection completes.
- install: use actualSlug instead of raw slug in addToLock to prevent
namespace doubling (vision2group/vision2group/slug)
- update: remove hardcoded 'node dist/cli.mjs' fallback, rely on
process.argv[1] which is always reliable
- download: use finished() to ensure stream write completes before
proceeding
- undici does not auto-follow HTTP redirects, manually follow 302/307/308
to MinIO presigned URL before piping response body
- Commander.js parses --skill-version as skillVersion (camelCase), not
skill-version (kebab-case), fix option access in install and download
commands
- Use /api/v1/skills (compat API) when query is empty to get full stats
- Map sort options: hot=rating, newest=newest, downloads=downloads
- Remove vim-style k/j navigation to fix 'k' key input issue
- Show '(default)' suffix when namespace is global (user didn't specify --namespace)
- Display 'Status: Published' on success instead of 'undefined'
- Keep output clean and informative for user feedback