Unified TUI manager for agent skills across Codex, Claude, and Global (~/.agents/skills).
- Multi-platform scanning — discovers skills from Codex, Codex plugins, Claude, and Global provider locations automatically, with symlink support
- Project Skills — scans read-only project skill directories (
.codex/skills,.claude/skills,.agents/skills) in a separate view - Provider-native availability — reads provider config when available and uses
.disabled-renaming only as a fallback - Skill Inventory — groups provider instances by Skill Identity and surfaces deterministic Health Signals
- skills.sh installs — installs, updates, and removes Global Skills through the skills.sh CLI
- Manual updates — checks updates only when requested
- Fuzzy search — filter skills by name or description
- Keyboard-driven — full TUI navigation without a mouse
npm i -g skillpack-tui
skillpackOr run without installing:
npx skillpack-tuigit clone https://github.com/WTW0313/skillpack.git && cd skillpack
pnpm install
pnpm build
node packages/tui/dist/skillpack.jsLaunch skillpack to see discovered skills grouped into Skill Groups with provider status and Health Signals. Use ↑↓ arrow keys to navigate, Tab / Shift+Tab to filter by provider (All, Codex, Claude, Global), and / to search.
Press Enter to inspect a Skill Group, then use left/right to choose a provider instance before taking instance-level actions. Press p to inspect read-only Project Skills, s to inspect Settings and Scan Roots, i to install a skills.sh Global Skill, or u to open manual updates. Plugin-owned skills require confirmation because the action toggles the owning plugin and affects sibling skills from the same plugin.
| Key | Action | Description |
|---|---|---|
↑ / ↓ |
Navigate | Move selection up / down |
Enter |
Detail | Open Skill Group detail view |
Tab / Shift+Tab |
Switch tab | Cycle through All / Codex / Claude / Global |
/ |
Search | Fuzzy match on name + description |
Esc |
Clear search | Clear the active search filter |
p |
Project Skills | Open read-only Project Skills view |
s |
Settings | Open read-only Settings and Scan Roots view |
i |
Install | Install a Global Skill through skills.sh |
u |
Updates | Open manual skills.sh updates |
q |
Quit | Exit skillpack |
| Key | Action | Description |
|---|---|---|
Esc |
Back | Return to list view |
← / → |
Provider instance | Switch the selected provider instance inside the Skill Group |
Space |
Toggle | Enable or disable a Codex or Claude skill; plugin-owned skills ask for confirmation |
o / O |
Open folder | Open skill directory in system file manager |
d |
Delete | Remove a skills.sh-managed Global Skill with confirmation |
↑ / ↓ |
Scroll | Scroll the description when it overflows |
Skillpack stores its configuration at ~/.config/skillpack/config.json. On first run it auto-detects which provider directories exist and enables them.
{
"editor": "vi",
"autoCheckUpdates": false,
"projectSkillsDirs": [
".codex/skills",
".claude/skills",
".agents/skills"
],
"providers": {
"codex": { "enabled": true, "paths": ["~/.codex/skills", "~/.codex/plugins/cache"] },
"claude": { "enabled": true, "paths": ["~/.claude/plugins/cache", "~/.claude/skills"] },
"global": { "enabled": true, "paths": ["~/.agents/skills"] }
},
"sources": {
"skillssh": { "enabled": true }
}
}Extend the BaseProvider class from @skillpack/core (which implements ISkillProvider with default scanning and a fallback .disabled- prefix rename strategy). Providers with native availability config should override scan, setEnabled, and getDisableStrategy so Skillpack reflects the provider's own loading rules.
import { BaseProvider, type ProviderCapabilities } from '@skillpack/core';
class MyProvider extends BaseProvider {
readonly id = 'my-platform';
readonly displayName = 'My Platform';
readonly basePaths = ['/path/to/skills'];
readonly capabilities: ProviderCapabilities = {
canToggle: true,
};
override async scan() { /* return provider-native Skill instances */ }
override async setEnabled(skill, enabled) { /* update provider-native availability */ }
override getDisableStrategy(skill) { /* describe the availability mechanism */ }
}Register it in the manager:
manager.registerProvider(new MyProvider());skillpack/
├── packages/
│ ├── core/ # @skillpack/core — platform-agnostic library
│ │ ├── src/
│ │ │ ├── models/ # Skill, DuplicateInfo, RemoteSkill, etc.
│ │ │ ├── providers/ # Codex, Claude, Global providers + BaseProvider
│ │ │ ├── sources/ # skills.sh install source
│ │ │ ├── config.ts # Configuration manager
│ │ │ ├── duplicates.ts # Duplicate detection logic
│ │ │ ├── lockfile.ts # Lock file manager
│ │ │ ├── manager.ts # SkillManager — central orchestrator
│ │ │ └── parser.ts # SKILL.md frontmatter parser (YAML)
│ │ └── tests/
│ └── tui/ # @skillpack/tui — Ink-based terminal UI
│ └── src/
│ ├── views/ # ListView, DetailView, InstallView, ProjectSkillsView, SettingsView, UpdatesView
│ ├── components/ # StatusBar, ConfirmDialog, SearchInput, SkillRow, TabBar
│ ├── context/ # React context for app state
│ ├── hooks/ # useSkillManager, useSkills, useSearch, useTerminalSize
│ └── app.tsx # App shell and router
├── docs/ # Design specs and implementation plans
├── package.json # Workspace root
└── pnpm-workspace.yaml # pnpm workspace config
MIT