Note · a capture in time
The Focus AI Standards
Research note: NOTE-002
Status: Current
W. Schenk
The Focus AI
2026-06-25
Verified 2026-06-25

skills CLI: Technical Implementation Guide for Agent Skill Management

Status of this research note

This is a research note: what was found, when it was checked, and against what. It binds nothing and is not maintained (STD-006 §3.2). No standard has been written for this area yet, so nothing here binds anything.

Read the verified date before acting on it. A note that has not been rechecked is evidence about the past, not a claim about now.

Summary

The skills CLI (npm package skills) is the package manager for the open agent skills ecosystem, built by Vercel Labs. It functions as a package manager for AI agent capabilities—analogous to npm for JavaScript packages or pip for Python libraries, but for teaching coding agents how to perform specialized tasks. With approximately 14.2 million weekly downloads (up from ~863K at v1.5.6 in May 2026) and support for 55+ AI coding agents, it has become the de facto standard tool for distributing and managing agent skills across the industry.[1]

The tool installs skill packages from GitHub repositories into agent-specific configuration directories (.agents/skills/, .claude/skills/, .pi/skills/, etc.). Each skill is a directory containing a SKILL.md file with YAML frontmatter that provides an agent with procedural knowledge, workflows, and optionally executable scripts. At v1.5.13, the tool supports the full lifecycle: add, list, find, update, remove, and initialize skills.[2]

The core architecture follows a progressive disclosure model: only the skill's name and description metadata are loaded into the agent's system prompt at startup (~100 tokens per skill); the full SKILL.md body is loaded on-demand when the agent detects a relevant task; and bundled reference files, scripts, and data are accessed only as needed. This design enables projects to have dozens of skills installed without meaningful context-window penalties.[3]

Our convention: TheFocus.AI pins the CLI in mise.toml ("npm:skills" = "1.5.13") and invokes it as skills ... rather than npx skills .... This avoids npx version drift. All commands below are shown as skills ...; substitute npx skills ... if running outside a mise-managed shell.

Philosophy & Mental Model

Core Concepts

The mental model maps cleanly to familiar package managers:[4]

Conceptnpmskills CLI
Package entry pointindex.js / package.jsonSKILL.md
Lock file (project)package-lock.jsonskills-lock.json (committed; restored by experimental_install)
Lock file (global)n/a.skill-lock.json (in ~/.agents/ or $XDG_STATE_HOME/skills/)
Install directorynode_modules/.agents/skills/ (+ .claude/skills/, .pi/skills/, etc.)
Registrynpmjs.comGitHub (any public repo)
Install commandnpm installskills add
CI restorenpm ciskills experimental_install
Discover packagesnpmjs.com searchskills find / skills.sh

Correction from the v1.5.6 report: There is no .skills.json manifest file. The earlier report claimed SKILL.md = index.js, .skills.json = package.json. This was inaccurate. The skills CLI v1.5.13 has exactly two lock files, both verified in source (dist/cli.mjs): LOCAL_LOCK_FILE = "skills-lock.json" (project scope, written by writeLocalLock) and LOCK_FILE = ".skill-lock.json" (global scope, written by writeSkillLock into ~/.agents/ or $XDG_STATE_HOME/skills/). There is no package.json-equivalent manifest; skills-lock.json is the single source of truth for project skills.

Key Abstractions

Skill Repository: Any GitHub (or GitLab, or local) directory structure containing a SKILL.md file. Repositories can contain multiple skills—the CLI discovers them in standard locations like skills/, .agents/skills/, and agent-specific directories. A root-level SKILL.md makes the repository itself a single-skill package.[2]

SKILL.md: The unit of distribution. A markdown file with YAML frontmatter (required: name, description; optional: license, compatibility, metadata, allowed-tools, disable-model-invocation). The body provides instructions the agent follows when the skill is activated. The description field is the most critical piece—it determines when the agent triggers the skill.[3]

Lock file entry shape (v1.5.13): Each skill in skills-lock.json has:

{
  "source": "owner/repo",
  "sourceType": "github",
  "skillPath": "skills/<folder>/SKILL.md",
  "computedHash": "<sha256 of the skill folder contents>"
}

The computedHash field (verified in our committed skills-lock.json and in dist/cli.mjs addSkillToLocalLock) is the pinning mechanism. On experimental_install, the CLI reads skills-lock.json, groups skills by source, and re-runs add for each group.[5]

Installation Scope: Skills install at two levels:

Installation Method: By default, the CLI symlinks skills from a canonical copy to each agent directory. The --copy flag creates independent copies instead—useful when symlinks aren't supported (e.g., certain CI environments or Windows configurations).[2]

Progressive Disclosure Architecture

Skills employ a three-level loading model that is fundamental to understanding their efficiency:[3]

  1. Level 1 — Metadata (always loaded): At startup, only name and description (~100 tokens each) enter the system prompt. This means 50+ skills can be installed with negligible context cost.
  1. Level 2 — Instructions (loaded on trigger): When a user task matches a skill's description, the agent reads SKILL.md from the filesystem. Only then does the full instruction set consume context tokens.
  1. Level 3 — Resources (loaded as needed): Bundled scripts execute without loading their code into context. Reference files are read only when referenced. This enables skills to ship comprehensive documentation, large datasets, and complex scripts without a token penalty unless actually used.

Setup

Prerequisites

# mise.toml
[tools]
"npm:skills" = "1.5.13"   # pin the version; avoids npx drift

Then mise install makes skills available on PATH and [tasks.install] can call it directly:

[tasks.install]
run = "skills experimental_install"

Basic Installation

# Install a skill repository (interactive—select agents and skills)
skills add vercel-labs/agent-skills

# Non-interactive: install a specific skill to detected agents
skills add vercel-labs/agent-skills -y

# List available skills in a repo before installing
skills add vercel-labs/agent-skills --list

# Install specific skills to specific agents
skills add vercel-labs/agent-skills --skill find-skills -a claude-code -a pi

# Install all skills to all agents (CI/CD friendly)
skills add vercel-labs/agent-skills --all

CI/CD Integration

# In CI pipeline, restore skills from lock file (equivalent to npm ci)
skills experimental_install

Local Skill Installation

# Install from a local directory (useful during development)
skills add ./my-local-skills

# Initialize a new skill
skills init my-custom-skill

Core Usage Patterns

Pattern 1: Adding Skills (The Primary Workflow)

Use add to fetch skills from any git source. This is the central command and covers the 80% case.[1]

# GitHub shorthand (most common)
skills add vercel-labs/agent-skills

# Full GitHub URL
skills add https://github.com/vercel-labs/agent-skills

# Direct path to a specific skill in a multi-skill repo
skills add https://github.com/vercel-labs/agent-skills/tree/main/skills/web-design-guidelines

# GitLab URL
skills add https://gitlab.com/org/repo

# Any git URL (including private repos with SSH)
skills add git@github.com:vercel-labs/agent-skills.git

When to use: Any time you need to install a new skill. Run it once per new skill repository, and commit the resulting skills-lock.json file. (No .skills.json is written—see the correction above.)

Pattern 2: Listing and Discovering Skills

View installed skills and find new ones from the community ecosystem.[1], [2]

# List project-installed skills
skills list

# List global skills
skills ls -g

# Filter by specific agent
skills ls -a claude-code

# JSON output (machine-readable, useful for scripts)
skills ls --json

# Interactive search (fzf-style browser)
skills find

# Search by keyword
skills find typescript

# Browse community registry at skills.sh
# (No CLI needed—visit https://skills.sh/ in browser)

When to use: list to audit what's installed; find to discover new skills for your workflow.

Pattern 3: Updating Skills

Keep installed skills synchronized with their upstream repositories.[1]

# Update all installed skills (interactive: asks project or global)
skills update

# Update a single skill by name
skills update find-skills

# Update multiple specific skills
skills update firecrawl focus-ai-brand

# Update only project skills
skills update -p

# Update only global skills
skills update -g

# Non-interactive CI/CD update
skills update -y

Under the hood: The update mechanism fetches GitHub tree SHAs via the GitHub API and compares them against the stored hash in skills-lock.json. If the hash differs, the skill is reinstalled by invoking the current CLI entrypoint directly (not via npx, to avoid nesting issues).[5] Note: skills update uses the GitHub API and will hit rate limits when unauthenticated. The CLI falls back to gh auth token automatically; exporting GH_TOKEN (or GITHUB_TOKEN) makes this reliable in CI (verified in getGitHubToken in dist/cli.mjs). Without a token you may see "Failed to check for deleted skills from …" warnings even when the skill files update successfully.

When to use: Run skills update -y periodically (e.g., weekly) or as part of a CI check to ensure skills are current. Firebase's agent skills documentation specifically recommends this.[9]

Pattern 4: Removing Skills

Remove unwanted skills from agent directories.[1]

# Remove interactively (select from installed list)
skills remove

# Remove by name
skills remove web-design-guidelines

# Remove multiple skills
skills remove frontend-design web-design-guidelines

# Remove from global scope
skills remove --global web-design-guidelines

# Remove from specific agents only
skills remove --agent claude-code cursor my-skill

# Remove all skills (dangerous—use with caution)
skills remove --all

# Alias
skills rm my-skill

Pattern 5: Creating Custom Skills

Author your own skills for team or community distribution.[1]

# Create SKILL.md in current directory
skills init

# Create a structured skill in a subdirectory
skills init my-custom-skill

This scaffolds:

my-custom-skill/
└── SKILL.md    # Template with YAML frontmatter

The resulting SKILL.md template:

---
name: my-custom-skill
description: What this skill does and when to use it
---

# My Custom Skill

Instructions for the agent to follow when this skill is activated.

## When to Use

Describe the scenarios where this skill should be used.

## Steps

1. First, do this
2. Then, do that

Push to GitHub and anyone can install it with skills add yourusername/my-custom-skill.

Pattern 6: Team Workflow (Install → Commit → CI Restore)

The recommended team workflow mirrors npm dependency management:[4]

# Developer A: Install skills
skills add vercel-labs/agent-skills --skill find-skills

# Commit the lock file
git add skills-lock.json
git commit -m "feat: add find-skills agent skill"

# Developer B: Restore from lock (equivalent to npm ci)
git pull
skills experimental_install

# CI pipeline:
# steps:
#   - run: skills experimental_install

Anti-Patterns & Pitfalls

Don't: Assume remove Cleans the Lock File

# This removes skill files but leaves the entry in skills-lock.json
skills rm my-skill --all

Why it's wrong: The next person who runs experimental_install will get the skill reinstalled. The remove command only deletes files from agent directories—it does not update skills-lock.json.[4]

Instead: Manual Lock File Cleanup After Remove

# 1. Remove the skill files
skills rm my-skill --all

# 2. Manually edit skills-lock.json to remove the skill entry

# 3. Regenerate a clean lock file (optional, if you deleted it)
skills update -y

Don't: Use npx Without Pin in CI

# In CI—version may drift between runs
npx skills experimental_install

Why it's wrong: npx may run a cached older version or fetch a newer version with breaking changes. Between the v1.5.6 report and this update (May → June 2026), the CLI moved from 1.5.6 to 1.5.13.[4]

Instead: Pin the Version (mise convention)

# mise.toml
[tools]
"npm:skills" = "1.5.13"

Then use directly (not via npx):

skills experimental_install

Or force latest explicitly outside mise:

npx skills@latest experimental_install

Don't: Use experimental_sync Instead of experimental_install

# This crawls node_modules, not the lock file
skills experimental_sync

Why it's wrong: experimental_sync crawls node_modules/ for skills (those shipped inside npm packages) rather than restoring from skills-lock.json. It serves a different purpose—synchronizing from npm-installed packages into agent directories, not from the skills ecosystem.[4]

Instead: Use the Right Command for the Right Purpose

Don't: Install All Skills Blindly Without Review

skills add unknown-repo/skills --all

Why it's wrong: Skills can instruct agents to run arbitrary commands, access files, or execute code. A malicious skill could direct an agent to perform harmful operations. Anthropic's documentation explicitly warns: "Treat like installing software. Only use Skills from trusted sources."[3]

Instead: Review Before Installing

# 1. List available skills first
skills add unknown-repo/skills --list

# 2. Review SKILL.md content on GitHub before installing
# 3. Install individually and review
skills add unknown-repo/skills --skill specific-skill -y

Why This Choice

Decision Criteria

CriterionWeightHow the skills CLI Scored
Agent support breadthHigh55+ agents supported including all major players (Claude Code, Codex, Cursor, Copilot, Pi, Windsurf)
Ecosystem maturityHigh~14.2M weekly downloads (up from ~863K at v1.5.6), active development, MIT license, Vercel-backed
Progressive disclosureHighThree-level loading model minimizes token consumption; 50+ skills possible without context penalty
Lock file / reproducibilityHighskills-lock.json enables CI/CD deterministic restores; mental model matches npm
Zero-install via miseMediumPinned in mise.toml as npm:skills; no global npm install -g needed
Cross-agent portabilityMediumBased on the open Agent Skills specification; skills work across agents
DiscoverabilityMediumskills find, skills.sh directory, and --list flag provide multiple discovery paths
Skill authoring toolingLowskills init scaffolds templates; full authoring best practices available from Anthropic docs

Key Factors

Alternatives Considered

PromptScript @use Directives

OpenSkills CLI

Manual SKILL.md Creation

Claude Code Plugin Marketplace

Caveats & Limitations

Changes since the v1.5.6 report

References

[1] vercel-labs/skills — GitHub Repository — Primary source: official README, architecture, command reference, supported agents list (55+), and skill discovery locations. README and AGENTS.md were read in full via cloned repository.

[2] skills CLI --help output — CLI command reference: all commands (add, list, find, update, remove, init, experimental_install, experimental_sync), flags, options, and usage examples. Verified locally with skills --help (v1.5.13).

[3] Claude API Docs — Agent Skills Overview & Best Practices and Best Practices — Authoritative documentation on progressive disclosure architecture, SKILL.md structure, YAML frontmatter requirements, naming conventions, authoring best practices, evaluation methodology, and security considerations. Anthropic/Claude.

[4] Managing AI Agent Skills with npx skills: A Practical Guide — DEV Community article by Hiroshi Toyama. Documents the npm-to-skills mental model mapping, the remove/lock file footgun with workaround, experimental_ prefix caveat, npx cache behavior, and CI/CD integration patterns.

[5] vercel-labs/skills — AGENTS.md and source — Internal development documentation and verified dist/cli.mjs source. Documents the update checking system architecture: GitHub Trees API hash comparison, lock file format, computedHash field, readLocalLock/writeLocalLock (project, skills-lock.json) vs readSkillLock/writeSkillLock (global, .skill-lock.json), and direct CLI entrypoint invocation for reinstallation during updates.

[6] Using npx skills with PromptScript — PromptScript documentation. Documents @use alternative, --dir flag for custom install paths, .promptscript/skills/ directory convention, skill metadata override in .prs files, parameterized skills, and OpenSkills as an alternative installer.

[7] skills.sh — The Agent Skills Directory — Community skill registry maintained by Vercel. Provides browsing by topic, agent, and trending. Documents install counts and popular repositories. The find-skills skill from vercel-labs/skills has 1.4M total installs.

[8] Pi Skills Documentation — Pi coding agent's skill support documentation. Documents /skill:name command invocation, skill locations (.pi/skills/, .agents/skills/, ~/.pi/agent/skills/), frontmatter validation rules, and the Agent Skills specification compliance.

[9] Firebase Agent Skills Documentation — Practical example of major platform adopting the skills CLI for distributing agent capabilities. Documents skill structure, update recommendations, and manual invocation patterns.

[10] npmjs.com — skills package page — Package metadata: MIT license, ESM module, published 2026-06-23 (v1.5.13), ~14.2M weekly downloads (verified via api.npmjs.org/downloads).