LA

luongnv89/asm

Developer tools
960 stars Quality 80 Trend 42MIT

(asm) is a scriptable CLI built for AI agents and automation — install, search, audit, and organize skills across Claude Code, Codex, Cursor, and 18 more tools.

Overview

(asm) is a scriptable CLI built for AI agents and automation — install, search, audit, and organize skills across Claude Code, Codex, Cursor, and 18 more tools.

README

CLI to install and manage agent skills

agent-skill-manager (asm) is a scriptable CLI built for AI agents and automation — install, search, audit, and organize skills across Claude Code, Codex, Cursor, and 18 more tools. Every command supports --json and --yes for non-interactive use. An optional TUI (asm) is available for local browsing.

Get Started · Browse 6,000+ skills · Full docs

Problems asm solves

Pain Without asm With asm
Scattered installs Same skill copied into ~/.claude/skills/, ~/.codex/skills/, ~/.cursor/rules/ — different versions, no single view One asm list across all 21 providers and scopes
No inventory ls through hidden dirs; no idea what is installed, duplicated, or outdated asm search, asm inspect, asm stats, asm audit
Invisible context cost Every installed skill’s description is resident in the agent’s prompt on every message, whether or not it ever fires asm stats --tokens, asm audit residency
Install just to read once Installing is the only way to get a skill in front of an agent — and it stays resident forever afterwards asm get prints the body and installs nothing
Risky manual installs Clone repos, copy folders, hope SKILL.md is valid asm install validates frontmatter, scans security, pins registry commits
Agent-unfriendly output Human-only copy-paste workflows Structured JSON via --json; skip prompts with --yes
New agent, new chore Every tool adds another skill directory to track Add or disable providers in one config file

At a glance

Catalog 6,962 skills from 86 repos — browse online
Providers 21 providers (Agents, Claude Code, Pi, OpenCode, Codex, …)
Agent-ready CLI --json, --yes, --machine on list, search, install, audit, eval
Security Pre-install scan for shell exec, network access, credential exposure
License MIT — no accounts, no telemetry

How it works

graph LR
    A[AI agent / script] --> B["asm command --json"]
    B --> C[Discover skill dirs]
    B --> D[Install / audit / search]
    D --> E{Security scan}
    E --> F[Validate SKILL.md]
    F --> G[Agent provider paths]
    H[GitHub / Registry] --> D
  1. Install asm once (npm or curl).
  2. Run commands from your agent, shell, or CI — no prompts when you pass --yes.
  3. Parse JSON output to decide what to install, remove, or audit next.

Screenshots

The optional TUI (asm with no args) — filter, inspect, and audit skills across every provider from one dashboard.

Features

Feature What you get
Cross-provider inventory asm list --json — every skill, every agent, one response
Local skill tags asm tag add|remove; asm list --tag / asm search --tag (AND)
One-command install asm install github:user/repo or asm install skill-name
Agent-parseable output --json on list, search, inspect, install, audit
Duplicate audit asm audit --yes removes redundant skills non-interactively
Semantic overlap audit asm audit overlap finds different-name skills doing the same job
Attention budget asm stats --tokens shows resident vs body token cost per tool
Residency audit asm audit residency ranks skills to demote out of resident context
Reference tier asm get delivers a body once, at zero residency
Security scan asm audit security before install
Authoring pipeline asm init, asm link, asm eval, asm publish
Bundles asm bundle install — curated sets in one pass
Local library asm install --library — install once, asm activate per provider
Cross-tool linking Reinstall or symlink when a skill already exists in another tool

Getting started

Install (npm):

npm install -g agent-skill-manager

List installed skills (JSON for agents):

asm list --json

Install a skill:

asm install github:anthropics/skills --yes

Search installed and catalog skills:

asm search "code review" --json

Alternative install: curl -sSL https://raw.githubusercontent.com/luongnv89/asm/main/install.sh | bash

Node.js 22+ required. Optional TUI: run asm with no arguments.

Common tasks

Task Command
Machine-readable inventory asm list --json
Skill metadata for agents asm inspect my-skill --json
Non-interactive install asm install code-review -p claude --yes --json
Remove duplicates asm audit --yes
Find same-job near-duplicates asm audit overlap
See your context cost asm stats --tokens
Find skills to demote asm audit residency
Use a skill without residency asm get code-review
Scan before install asm audit security github:user/repo
Scaffold a new skill asm init my-skill -p claude
Live dev via symlink asm link ./my-skill -p claude
Publish to registry asm publish ./my-skill --yes
Install a bundle asm bundle install frontend-dev --yes
Tag an installed skill asm tag add code-review testing
Filter inventory by tags asm list --tag cli,testing

Full command reference, flags, and examples: CLI Commands. Catalog UI and bundles: luongnv.com/asm (use Tags / TagFilter, AND match, ?tag=).

Attention budget

Disk is cheap; context is not. Every installed skill’s frontmatter description sits in the agent’s system prompt on every message, whether or not the skill ever fires. The full SKILL.md body only costs anything when the skill actually fires.

asm reports the two separately — token counts are estimates and always render with a leading ~:

asm stats --tokens            # resident vs body tokens, per tool and per scope
asm stats --tokens --json     # same data for scripts and agents
  Attention Budget
  ----------------------------------------

  Resident = frontmatter descriptions, paid on every message.
  Bodies   = full SKILL.md, paid only when a skill fires.

  Tool         Skills      Resident  Bodies
  Claude Code      74    ~5k tokens  ~281k tokens
  Codex            10   ~736 tokens  ~76k tokens
  ---------------------------------------------
  Total            84  ~5.7k tokens  ~357k tokens

  By Scope
  global           71  ~4.9k tokens  ~300k tokens
  project          13   ~836 tokens  ~57k tokens

  Heaviest resident descriptions
    claude-api       ~1.2k tokens  (claude, global)
    docx              ~233 tokens  (claude, global)
    pptx              ~217 tokens  (claude, global)
    code-review       ~198 tokens  (claude, global)
    frontend-design   ~176 tokens  (claude, project)
    dataviz           ~164 tokens  (claude, global)
    skill-creator     ~151 tokens  (claude, global)
    xlsx              ~143 tokens  (claude, global)
    pdf               ~138 tokens  (claude, global)
    release-manager   ~129 tokens  (codex, global)

  Median resident cost: ~48 tokens
  Run asm audit residency for demotion advice

Residency audit

asm audit residency ranks the installed skills that are not earning their resident context and pairs each one with a command that works for how that skill is actually installed. It only reports — nothing is deactivated, disabled, or removed unless you run one of the suggested commands yourself.

asm audit residency
asm audit residency --json

The advice assumes this demotion ladder:

Tier asm mechanism Residency
Installed (auto-triggers) provider directory / asm activate description resident, always
Saved (adapt, no trigger) asm install --library, asm deactivate none until asm activate
Disabled (kept on disk) asm disable (reverse with asm enable) none
Reference (read on use) default asm get — no retained skill copy none

Which command a candidate gets depends on how it is installed. asm deactivate only works on a live symlink into the asm library, so it is suggested only there; everything else gets asm disable, which is universal and reversible. The asm deactivate path additionally gets asm get as a second destination: deactivating removes the provider symlink but leaves the library copy, so the body is still one command away. The asm disable path does not, because disabling renames the canonical SKILL.md — for a library-linked skill that is the library copy itself — leaving nothing for asm get to read. Skills provided by plugin marketplaces are counted in the totals but never listed as candidates — no asm command demotes them.

Two of the signals the report would like to use — trigger collision and last-used counts — have no data source in asm yet. They are listed as unavailable rather than silently dropped, so the report still works today.

No network calls, accounts, or telemetry are involved: both reports run entirely against your local filesystem.

Reference tier: use a skill without installing it

Demoting a skill does not mean losing it. asm get resolves a skill and writes its SKILL.md body to stdout — no provider directory, no library entry, no residency. Default get retains no skill copy. With --path, it instead borrows a full directory on disk until you explicitly clean it up.

asm get code-review                       # body to stdout
asm get code-review > /tmp/SKILL.md       # save it without installing
asm get github:owner/repo:skills/review   # any `asm install` shorthand
asm get code-review --json                # includes optional dependencies and exact content

That makes asm usable as delivery infrastructure, not only as an installer. An agent can pull a skill in for a single task and drop it again:

asm get code-review | your-agent --system-prompt-file -

`` walks a resolution ladder, and the rung that answered is reported as the tier so provenance is always visible:

Order Tier Resolves
1 installed a skill already installed in one of your agents
2 library a library skill, including deactivated ones
3 index an indexed catalog skill, matched by exact name
4 registry the ASM registry — same route as asm install

An explicit github:owner/repo[#ref][:path] shorthand, a GitHub URL, or a local path skips the ladder. A name that matches more than one indexed repo or registry author is never guessed: asm get exits non-zero and lists the qualified candidates.

The catalog stores metadata, not bodies, so an index, registry or remote asm get costs a shallow clone into a temp directory, which is deleted before the command returns. Those fetches run the same pre-install security scan asm install runs; the verdict goes to stderr and into --json under security. It reports rather than blocks — asm get never installs or executes the skill — and --audit prints the full asm audit security report for the fetched skill.

Output discipline: stdout carries the body (or, with --json, a single JSON object) and nothing else, so piping and redirecting are safe. Provenance, progress, and the security verdict go to stderr.

Borrow the full skill directory

When a skill needs supporting scripts, templates, references or binary assets:

borrowed_path="$(asm get --path code-review)"  # also: asm get code-review --path
# Read "$borrowed_path/SKILL.md" and its supporting files after get exits.
asm cleanup "$borrowed_path"                 # caller cleans up when finished

Every source tier is copied, including local paths, installed skills and library entries. The original is never changed or deleted. The copy lives under ASM’s config directory in get-borrows/, independently of dependency sessions; the remote staging clone is still deleted before get returns. There is no exit-triggered borrow deletion and no --keep requirement. asm install remains the permanent installation workflow.

Plain --path stdout is one absolute directory path plus a newline; provenance, security and cleanup guidance stay on stderr. --path --json (or --machine) returns path, sorted relative files, existing provenance/security fields, and cleanup: {command: "asm", args: ["cleanup", path]} instead of content. Git internals and ASM ownership metadata are omitted from the file list; .git is not copied. Executable modes and binary files are preserved. Installed root symlinks are resolved before copying; nested symlinks are refused.

asm cleanup accepts only an exact registered borrow root, not an original source, parent, child, or symlink alias. Unknown and repeated cleanup are safe no-ops. Missing or mismatched ownership proof refuses deletion and may quarantine suspicious replacement content for inspection. Cleanup also supports --json and --machine.

Just-in-time optional dependencies

A skill can declare optional skill dependencies without installing them:

dependencies:
  - code-review
  - github:owner/repo:skills/helper

Installing the parent does not install this list. The calling agent owns the run lifecycle: discover the list, acquire only a dependency that the current branch actually reaches, use the returned skillMdPath immediately, and release the caller-supplied session in its own finally or shutdown handler.

asm deps discover parent-skill --json
asm deps acquire code-review --session run-123 --json
# Read the returned skillMdPath now; no provider catalog rescan is required.
asm deps release --session run-123 --json

Acquisition records whether the resolved target existed before the run. Remote temporary copies live under ASM’s config directory and are lease-owned; installed, library, and explicit local targets are recorded as pre-existing. Release is idempotent, removes only artifacts with matching ASM ownership proof, and preserves every pre-existing target.

ASM is a support tool, not a process supervisor: it does not launch the agent, run its task, or detect arbitrary caller failure. Normal cleanup therefore belongs in the caller’s finally/shutdown handling. An uncatchable termination (for example, power loss or SIGKILL) can leave persistent lease state. On a later invocation, the caller may classify and recover leases older than an explicit, conservatively chosen cutoff:

asm deps cleanup --stale-before 2026-09-08T00:00:00Z --dry-run --json
asm deps cleanup --stale-before 2026-09-08T00:00:00Z --json

Age is a caller-selected recovery policy, not proof that an agent failed. Pick a cutoff older than the longest expected live run and inspect --dry-run output first. ASM returns a neutral canonical path and does not promise that a foreign provider will rescan its skill catalog in the middle of a session.

FAQ

Is it free? MIT licensed. No accounts or paywalls.

Is this built for AI agents? Yes. Commands return structured JSON (--json), accept non-interactive flags (--yes, --machine), and map to discrete actions an agent can chain — list inventory, search catalog, install, audit, uninstall.

Which agents are supported? 21 providers: a generic Agents provider (supported by most harnesses except Claude Code), Claude Code, Pi, OpenCode, Codex, Oh My Pi, Grok CLI, Hermes, OpenClaw, Cursor, GitHub Copilot, Windsurf, Google Antigravity, Gemini CLI, Cline, Roo Code, Continue, Aider, Zed, Augment, and Amp. Disable any via asm config edit.

What about the TUI? Run asm with no args for an optional local browser. The CLI is the primary interface for scripts, CI, and agent tool calls.

Private repos? asm install github:user/repo --transport ssh --yes

SKILL.md format? A directory with SKILL.md (YAML frontmatter + markdown body). Run asm init my-skill to scaffold one.

Get started

npm install -g agent-skill-manager
asm list --json

Browse catalog · Documentation · Contributing · MIT Licensed



Acknowledgements

Contributors

Dependencies

Library Description
ink React renderer for the TUI
@inkjs/ui Prebuilt ink components
react UI for TUI and web catalog
react-dom DOM renderer for catalog
react-window List virtualization for catalog
yaml SKILL.md frontmatter parser

Roadmap

Project kanban

Contributing

See CONTRIBUTING.md.

License

MIT

View the full README on GitHub

Recommended Tools

Try a different keyword or remove a filter.

Install

npx skillfish add luongnv89/asm
New to MCP? Start with the mcpskill.org guide →