Agent skills and knowledge installer for AI coding agents
A CLI that installs AI skills, agents, and hooks from git repos into projects,
with multi-agent support and manifest-based tracking.
Install · Quick Start · Commands · Plugin Types · Why agntc?
agntc is a standalone CLI for installing shareable AI capabilities (skills, agents, hooks) from git repositories into any project. It works with multiple AI coding agents (Claude, Codex, Cursor) through a driver architecture — same source repo, different target directories per agent.
Everything is tracked in a manifest file, so you can update, remove, and list installed plugins without manual bookkeeping.
Skills and agents are scattered across repos with no standard installation method. Current approaches have problems:
- Manual copy — tedious, no version tracking, easy to forget what came from where
- npm postinstall — tied to Node.js projects, couples plugin lifecycle to package manager
- git submodules — heavyweight, nested repo complexity, merge conflicts
- Vercel skills — skills only, no agents or hooks, telemetry
agntc sits in between: simple add command, manifest tracking, multi-agent routing, and support for all asset types.
| agntc | Vercel skills | Manual | npm postinstall | |
|---|---|---|---|---|
| Skills | Yes | Yes | Yes | Yes |
| Agents | Yes | No | Yes | Yes |
| Hooks | Yes | No | Yes | Yes |
| Multi-asset plugins | Yes | No | No | No |
| Collections | Yes | No | No | No |
| Version tracking | Manifest | Manifest | None | package.json |
| File-level tracking | Yes | No | No | No |
| Update command | Yes | Yes | No | Rebuild |
| Non-Node projects | Yes | Yes | Yes | No |
| Telemetry | No | Yes | No | No |
Run directly with npx (recommended)
npx agntc@latest <command>
npxcaches packages locally, so plainnpx agntcmay run a stale version. Using@latestensures you always get the newest release.
Or install globally
npm install -g agntcnpx agntc@latest init # scaffold a new plugin
npx agntc@latest add owner/repo # install latest, auto-constrain to ^major
npx agntc@latest add owner/repo@^1.0 # install with semver constraint
npx agntc@latest add owner/repo@v2.0.0 # pin to exact tag
npx agntc@latest list # see installed + update status
npx agntc@latest update # update all (respects constraints)
npx agntc@latest remove owner/repo # remove pluginScaffold a new agntc plugin for authoring. Interactive type and agent selection.
npx agntc@latest init| Type | Scaffolded Structure |
|---|---|
| Skill | agntc.json, SKILL.md |
| Plugin | agntc.json, skills/my-skill/SKILL.md, agents/, hooks/ |
| Collection | my-plugin/ subdirectory with full plugin structure |
If agntc.json already exists, offers to reconfigure (overwrites config) or cancel.
Install plugins from git repos or local paths. Interactive agent and plugin selection.
npx agntc@latest add <source>| Source Format | Example | Notes |
|---|---|---|
| GitHub shorthand | owner/repo |
Auto-resolves latest semver tag, applies ^ constraint |
| With constraint | owner/repo@^1.0, owner/repo@~2.1 |
Resolves best match within range |
| Exact tag | owner/repo@v2.0.0 |
Pin to specific version, no constraint |
| HTTPS URL | https://github.com/owner/repo |
Any git host |
| SSH URL | git@github.com:owner/repo.git |
For SSH auth |
| Local path | ./my-plugin, ~/dev/plugin |
Local development |
| Direct path | https://github.com/owner/repo/tree/main/plugin-name |
Collection shortcut |
npx agntc@latest add leeovery/agentic-workflows # auto-constrain ^latest
npx agntc@latest add leeovery/agentic-workflows@^1.0 # semver constraint
npx agntc@latest add leeovery/agentic-workflows@v1.0.0 # exact tag
npx agntc@latest add ./local-plugin
npx agntc@latest add https://gitlab.com/org/repoThe tool detects plugin type from the repo's directory structure (no agntc.json required), checks for conflicts, and copies assets to agent-specific directories. Agent selection:
- A unit that declares
agentsshows a multiselect filtered to those agents (detected ones pre-selected). When it declares a single agent that's detected locally, selection is auto-skipped. - A unit with no usable
agentsdeclaration (configless, empty, or malformed) offers all supported agents (claude,codex,cursor), with detected ones pre-ticked.
--plugin flag — forces a skills/-only source to install as a single bundled plugin instead of the default collection menu. It's a hard error against any non-bundleable structure (a bare skill, or a member-dirs collection).
npx agntc@latest add owner/bare-skill-repo # configless, no agntc.json needed
npx agntc@latest add owner/skills-repo --plugin # bundle a skills-only repo as one pluginVersion constraint behaviour:
- Bare
owner/repo— if the remote has semver tags, the latest is resolved and a^major.minor.patchconstraint is auto-applied @^1.0/@~2.1— explicit semver range; the best matching tag is installed@v2.0.0— exact tag pin, no constraint stored- If no semver tags exist on the remote, the default branch HEAD is used with no constraint
Remove installed plugins and their files.
npx agntc@latest remove [key]| Mode | Command | Behaviour |
|---|---|---|
| Interactive | npx agntc@latest remove |
Pick from installed plugins |
| Standalone | npx agntc@latest remove owner/repo |
Remove the plugin |
| Collection (all) | npx agntc@latest remove owner/repo |
Remove all from collection |
| Collection (one) | npx agntc@latest remove owner/repo/name |
Remove specific plugin |
npx agntc@latest remove # interactive picker
npx agntc@latest remove leeovery/claude-workflows
npx agntc@latest remove leeovery/agent-skills/goAlways confirms before deleting files.
Check remote state and re-install plugins when newer versions exist.
npx agntc@latest update [key]| Mode | Command | Behaviour |
|---|---|---|
| Update all | npx agntc@latest update |
Update all installed |
| Specific plugin | npx agntc@latest update owner/repo |
Update one (or all from collection) |
| Collection plugin | npx agntc@latest update owner/repo/name |
Update specific |
npx agntc@latest update # update all
npx agntc@latest update leeovery/claude-workflowsUses nuke-and-reinstall: deletes existing files, re-clones at same ref, re-copies for same agents. Constrained plugins update to the best match within their constraint range. Tag-pinned plugins show available newer tags but don't auto-upgrade.
Interactive management dashboard with update status and inline actions.
npx agntc@latest listShows all installed plugins with status indicators:
leeovery/claude-technical-workflows@v2.1.6 ✓ Up to date
leeovery/agent-skills/go ↑ Update available
leeovery/agent-skills/python@v1.0 ⚑ Newer tags available
leeovery/my-plugin@v1.2.0 (^1.0) ↑ Constrained update available
leeovery/other-plugin ✗ Check failed
Done
Select a plugin for detail view with actions: Update, Remove, Change version, Back.
The detail view shows constraint info when applicable and flags out-of-constraint versions. "Change version" lets you pick any available tag and strips the constraint (pins to exact tag).
agntc detects plugin type from directory structure, not from configuration fields
or the presence of agntc.json (which is optional — shown below as ← optional).
SKILL.md at root:
my-skill/
SKILL.md
references/
cheatsheet.md
agntc.json ← optional {"agents": ["claude"]}
A skills/ dir plus one or more of agents/ / hooks/:
my-plugin/
skills/
planning/SKILL.md
review/SKILL.md
agents/
executor.md
hooks/
pre-commit.sh
agntc.json ← optional {"agents": ["claude"]}
Multiple installable member units in one repo. Membership is structural — each child
dir that itself resolves to a unit (has SKILL.md, or its own asset dirs) is a member:
my-collection/
README.md
go/ ← bare-skill member
SKILL.md
agntc.json ← optional {"agents": ["claude", "codex", "cursor"]}
python/ ← bare-skill member
SKILL.md
complex-tool/ ← plugin member
skills/
agents/
A repo whose root holds only skills/ is treated as a collection menu of those inner
skills by default (Vercel-compatible); pass --plugin (or set type: "plugin") to
bundle it as a single plugin instead.
Installing from a collection presents a multiselect of available members. Config-bearing and configless members can coexist in the same collection.
agntc.json is optional. Type, identity, and installability are derived from
directory structure alone — so any skill, plugin, or collection installs straight
from a bare git repo with no config at all. When present, agntc.json lives inside
an installable unit (a bare skill, a plugin, or each collection member — never the
collection container) and carries only author intent that structure can't express:
{
"agents": ["claude", "codex", "cursor"],
"type": "plugin"
}| Field | Type | Required | Description |
|---|---|---|---|
agents |
string[] |
No | Restricts which agents this unit targets (a hard ceiling). Absent/empty/malformed → all agents offered. |
type |
"plugin" |
No | Bundle disambiguator for the one ambiguous shape (a skills/-only repo). Any other value is ignored. |
Valid agents: claude, codex, cursor. Unknown values are warned but ignored.
Config presence never signals type, and config reading is lenient — a missing,
malformed, or empty agntc.json is treated as "no usable config", never an error.
A well-formed type that contradicts an unambiguous structure (e.g. type: "plugin"
on a collection) is a hard error.
Installed units never carry agntc.json on disk — it's an install-time input, stripped from the destination.
| Agent | Skills | Agents | Hooks |
|---|---|---|---|
| Claude | .claude/skills/ |
.claude/agents/ |
.claude/hooks/ |
| Codex | .agents/skills/ |
— | — |
| Cursor | .cursor/skills/ |
— | — |
Adding new agents is config-only — implement a driver with detection and routing.
Tracks installations at .agntc/manifest.json:
{
"leeovery/claude-technical-workflows": {
"ref": "v2.1.6",
"commit": "abc123f",
"installedAt": "2026-02-09T14:30:00Z",
"agents": ["claude"],
"files": [
".claude/skills/technical-planning/",
".claude/agents/task-executor.md"
],
"type": "plugin",
"constraint": "^2.1.6"
}
}The files array enables clean removal and nuke-and-reinstall updates. The optional constraint field stores the semver range for constrained updates.
The optional type field ("skill" | "plugin") records the resolved type so update replays it (re-installing the same kind) instead of blindly re-detecting — update validates the re-cloned tree still supports that type before deleting anything (derive-before-delete), and aborts with the install left intact if it doesn't. Legacy manifests without type backfill it from the recorded files on the next read. A skills-only collection member may also carry an internal sourceSubpath recording where in the repo to re-copy it from.
MIT