CLI + TUI to manage skills and MCP servers across:
| Harness | Skills (live) | MCP |
|---|---|---|
| Cursor | ~/.cursor/skills |
~/.cursor/mcp.json |
| Claude Code | ~/.claude/skills |
~/.claude.json |
| Codex | ~/.codex/skills |
~/.codex/config.toml |
| pi | ~/.pi/agent/skills |
~/.pi/agent/mcp.json |
| OMP | ~/.omp/agent/skills |
~/.omp/agent/mcp.json |
A profile is an active workspace. Switching profile changes which skills (and MCP flags) harnesses actually see.
~/.agent-hub/
library/skills/ # all skill packages (SoT contents)
workspaces/<profile>/skills/ # subset for this profile (symlinks → library)
profiles/<profile>.yaml # per-harness enable matrix
catalog/mcp.yaml
state.json # active profile
- Workspace — profile-private skills (
workspaces/<profile>/skills/) and MCP (workspaces/<profile>/mcp.yaml). - Library — migrate leftovers / orphans only (not where new installs go).
- Apply — parks shared
~/.agents/skills(empty), syncs workspace, projects into harness dirs, then prunes harness skills/MCP that are not enabled in the profile (empty profile → clear hub-managed projections). - Install / remove — only the active profile. Same name in another profile or library → conflict.
- Adopt — claim an orphan library skill / global MCP into the active profile.
- Sync / watch — external installs in
~/.agents/skillsand harness dirs (~/.cursor/skills,~/.codex/skills,~/.pi/agent/skills, …) move into the active profile. Hub symlinks are ignored. Switching profile keeps those skills only on the previous profile.
~/.agents/skills is parked empty on purpose: pi/Cursor/Codex also auto-load that path, so a shared pool would leak skills across profiles. Live skills live only in harness-private dirs.
Inspired by agent-toggle’s TUI — but the SoT is a workspace + per-harness matrix, not park-in-place only.
No GUI. Config + CLI + TUI.
Bundled skill for coding agents: skills/agent-hub/SKILL.md
(also linked at .agents/skills/agent-hub and .cursor/skills/agent-hub for project discovery).
Install into an agent-hub profile:
# from any directory — relative paths also fall back to the agent-hub package root
agent-hub skill install ./skills/agent-hub --apply
agent-hub skill install agent-hub --applygit clone git@github.com:servertdot/agent-hub.git
cd agent-hub
bun install
bun link # puts `agent-hub` / `ahub` on PATH via bun
# or: bun run src/cli.ts …Requires Node 22+ or Bun.
agent-hub init # ~/.agent-hub + example profiles
agent-hub migrate # absorb ~/.agents/skills → library; park shared empty
agent-hub status
agent-hub discover # matrix + token estimates
agent-hub cost # biggest startup costs first
agent-hub import-mcp # fill catalog/mcp.yaml from Cursor/Claude/OMP JSON
agent-hub scrub-catalog # replace pasted secrets with $ENV refs
agent-hub scrub-harnesses --write
agent-hub profile save stable # capture current discovery into a profile
agent-hub profile seed-lab # clone stable → lab + omp extras
agent-hub diff lab # dry-run (hides noops; -v for full)
agent-hub apply lab # activate workspace + project to harnesses
agent-hub skill install ./my-skill --apply
agent-hub skill remove my-skill --apply
agent-hub skill adopt orphan-name --apply
agent-hub skill copy pdf-reader --from stable --to lab --apply
agent-hub skill copy --all --from stable --to lab --apply
agent-hub sync # ~/.agents/skills → active profile (after npx skills add)
agent-hub sync --apply
agent-hub watch # auto-sync ~/.agents/skills into active profile
agent-hub mcp install ./server.yaml --name fff --apply
agent-hub mcp remove fff --apply
agent-hub tui # Ink matrix on a TTY
agent-hub tui --menu # numbered fallback (also used without TTY)
agent-hub tui --dry-run~/.agent-hub/
config.yaml
catalog/mcp.yaml
library/skills/
workspaces/
lab/skills/
stable/skills/
profiles/
stable.yaml
lab.yaml
state.json
Profile shape:
name: lab
description: Experimental
skills:
tdd:
cursor: true
claude: false
codex: false
pi: false
omp: false
mcp:
fff:
cursor: true
claude: false
codex: false
pi: true
omp: falseOnly keys you set are applied. Omitted harness cells are left alone.
Skill with all harnesses false → removed from workspace and from harness dirs on apply.
●live /○off /-unknown+/-before glyph = staged change- Tab toggles focused cell; ←→ moves harness column; ↑↓ rows
- Top tabs: Skills | MCP | Harnesses (
t/1/2/3) - Selecting a profile in the sidebar loads it for editing — it does not apply
- Enter applies (save profile + workspace sync + harness projection); Esc cancels
wsaves profile YAML onlyccopy focused skill /Ccopy all visible skills → pick target profile in sidebar (Enter)
- Disabling a skill removes harness symlinks; real dirs are moved into the library (never deleted blindly)
- Shared
~/.agents/skillsis emptied/parked on migrate/apply so profiles cannot leak - MCP edits merge into existing JSON; Codex TOML flips
enabledand keeps subtables - Prefer
$ENV_NAMEin MCP configs — do not commit secrets - Always
diff/tui --dry-runbefore the first real apply
- workspace library + per-profile skills
- migrate / apply parks shared Agent Skills pool
skill install→ active workspace- discover / profiles / Ink TUI (stage → apply)
- cost estimates, MCP import/scrub
MIT