A native macOS app for managing AI agent skills without living in dotfiles and symlinks.
Browse installed skills, search skills.sh, inspect rendered SKILL.md, and send the same package to Codex, Claude Code, Cursor, Windsurf, and the rest of your local agent setup.
What It Does • Getting Started • Architecture • Supported Agents • 中文文档
- Shows every installed skill from the shared
~/.agents/skillsstore, grouped by source repo. - Renders
SKILL.mdcontent so you can inspect a package before wiring it into another agent. - Searches the skills.sh marketplace inside the app and installs packages with one click.
- Detects per-agent links across 20 supported agent directories, so you can see where each skill is actually available.
- Gives you the day-to-day actions you need: reveal in Finder, open the source, remove a skill, or refresh the index.
- Checks Node.js and the
skillsCLI on launch, then points you to the missing piece when your environment is incomplete.
- macOS 26 (Tahoe) or later
- Xcode 26+ (or an equivalent Swift 6.2 toolchain with full macOS UI macro support)
- Node.js — SkillsUI will guide you through installation on first launch if it's missing
Tip: You don't need to install the skills CLI manually. SkillsUI detects whether it's present and offers installation guidance in the onboarding sheet and in Settings → Environment.
Why Node at all? The app itself is native SwiftUI, but install/remove/update operations call
npx skillsunder the hood, so Node.js is a runtime dependency for those actions rather than for building the macOS app.
# Clone
git clone https://github.com/IchenDEV/skills-ui.git
cd skills-ui
# Build
swift build
# Run
swift run SkillsUI./scripts/package-dmg.sh
open distThis creates:
dist/SkillsUI.appdist/SkillsUI.dmg
Install it like a normal Mac app: open the DMG and drag SkillsUI.app into Applications.
The current packaging flow is for local distribution and testing. It uses an ad-hoc signature by default, and it does not include Developer ID signing or notarization yet.
If xcode-select -p still points at Command Line Tools, the packaging script automatically switches builds to /Applications/Xcode.app/Contents/Developer when that Xcode install exists.
Note: Locally built app bundles are still unsigned for public distribution. If macOS blocks a local build, run
xattr -cr dist/SkillsUI.apponce to clear the quarantine flag.
Pre-built arm64 binaries are attached to every GitHub Release. Each release includes a .sha256 checksum file for verification.
# Verify checksum after download
shasum -a 256 -c SkillsUI-*.tar.gz.sha256Sources/
├── SkillsUIApp.swift # @main entry, window config, app icon, Settings scene
├── ContentView.swift # TabView (Installed / Marketplace) + onboarding trigger
├── SkillsSidebar.swift # Sidebar list, grouped by source, version footer
├── SkillDetailView.swift # Detail pane — metadata grid + SKILL.md
├── SkillMarkdownView.swift # Native Textual renderer + local markdown styling
├── AddSkillSheet.swift # Sheet for adding skills from GitHub
├── MarketplaceView.swift # Marketplace search UI
├── MarketplaceService.swift # skills.sh API client (actor)
├── MarketplaceSkill.swift # Marketplace data model
├── SkillsManager.swift # Core state — scanning, install, remove, env check
├── Skill.swift # Installed skill model
├── Skill+UI.swift # SwiftUI extension: skillColor
├── SkillParser.swift # SKILL.md YAML frontmatter parser
├── SkillLock.swift # .skill-lock.json Codable types
├── DependencyChecker.swift # DependencyStatus model + EnvironmentChecker
├── OnboardingView.swift # Setup sheet shown when Node/skills CLI is missing
├── SettingsView.swift # Settings window (About + Environment tabs)
└── AppVersion.swift # Version string — overwritten by CI on release builds
Packaging/
├── AppIcon.iconset/ # Source PNGs for the bundled app icon
├── AppIcon.icns # Bundled app icon used by Finder/Dock
└── Info.plist.template # App bundle metadata template
scripts/
├── package-dmg.sh # Builds SkillsUI.app and SkillsUI.dmg
└── render-app-icon.swift # Regenerates the tracked iconset PNGs
- SwiftPM executable — no Xcode project required; builds with
swift build @Observable+ actors — Swift 6 strict concurrency throughout- No third-party UI deps — pure SwiftUI with native macOS look & feel
Textual— direct rendering dependency for native, block-level Markdown previews- Version baked at build time — CI overwrites
AppVersion.swiftwith the Release tag beforeswift build -c release
| Agent | Skills Path |
|---|---|
| Amp | ~/.agents/skills |
| Claude Code | ~/.claude/skills |
| Codex | ~/.codex/skills |
| Cursor | ~/.cursor/skills |
| Windsurf | ~/.codeium/windsurf/skills |
| Gemini CLI | ~/.gemini/skills |
| GitHub Copilot | ~/.copilot/skills |
| Roo Code | ~/.roo/skills |
| Cline | ~/.cline/skills |
| OpenCode | ~/.config/opencode/skills |
| Trae | ~/.trae/skills |
| Augment | ~/.augment/skills |
| Droid | ~/.factory/skills |
| Kiro | ~/.kiro/skills |
| Warp | ~/.warp/skills |
| Deep Agents | ~/.deepagents/agent/skills |
| Antigravity | ~/.gemini/antigravity/skills |
| OpenHands | ~/.openhands/skills |
| Qwen Code | ~/.qwen/skills |
| Trae CN | ~/.trae-cn/skills |
┌──────────────┐ npx skills add ┌──────────────────┐
│ skills.sh │ ◄──────────────────── │ SkillsUI │
│ Marketplace │ │ (this app) │
└──────┬───────┘ └────────┬─────────┘
│ │
│ download scan & parse
▼ ▼
┌──────────────┐ symlink ┌──────────────────┐
│ ~/.agents/ │ ────────────────────► │ ~/.cursor/skills │
│ skills/ │ │ ~/.claude/skills │
│ │ │ ~/.codex/skills │
│ SKILL.md │ │ ... │
│ lock.json │ └──────────────────┘
└──────────────┘
Push a tag matching v* and the CI workflow builds the binary and attaches it to the GitHub Release automatically:
git tag v1.2.3
git push origin v1.2.3The workflow injects the tag version into AppVersion.swift before building, so Settings → About always shows the correct release version.
- Fork the repository
- Create a feature branch (
git checkout -b feature/awesome) - Commit your changes (
git commit -m 'Add awesome feature') - Push the branch (
git push origin feature/awesome) - Open a Pull Request