CLI reference
Every airskills command, flag, and exit code
This reference is generated by hand from the airskills binary's --help
output. Run any command with --help for the canonical wording.
Two remotes, one rule
Every command talks to one of two remotes, and knowing which is the key to the whole CLI:
- Your own account's skillset — where your skills (and your edits to
sourced ones) live.
push,pull, andsyncwork this axis. - An origin namespace — the published skill of another user or org
that you sourced a skill from.
add,resolve, and the suggestion flow work this axis.
The rule: pull --force resolves a conflict against your account's
copy; airskills add <owner>/<skill> --force takes the origin's
current bytes, dropping your customisation. They are not
interchangeable — pull never fetches from an origin namespace. For
skills you own outright, the second remote doesn't exist and sync is
all you need.
Commands
airskills sync
Push local skill changes, then pull remote skills (running push then
pull in sequence). The fastest way to log in for the first time and
get everything in line.
airskills sync [--skillset <slug>] [-v|--verbose]
--skillset <slug>— personal skillset to sync against. Defaults to your last-used skillset (set viaairskills skillset use).-v,--verbose— show per-skill progress.
airskills push
Scan local skills, detect changes, and upload them to the server.
airskills push [--force] [--force-suggest] [--org <slug>] [-v|--verbose]
--force— skip the conflict check (use after resolving conflicts). Bypasses theX-Expected-Hashcontent-hash check. Mirror ofpull --force: both mean "I'm about to overwrite the other side, do it anyway", pointed in opposite directions. Also auto-confirms any detected file deletions (see below) instead of prompting.--force-suggest— submit the suggestion for edits to a non-owned skill without prompting, even when the upstream has advanced. In a terminal, push asks per skill whether to suggest your edits to the owner; headless (an agent, a cron job) it never auto-fires a suggestion — your edits are still backed up to your account, and the decision is deferred until an interactive push answers the prompt or a push with this flag submits it.--org <slug>— create new skills under this org (org admins only). Existing skills keep their current owner regardless of this flag.-v,--verbose— show per-skill progress.
If you hand-deleted a file from a skill, push (and sync) detects it by
comparing your agent copies against the server: a file still on the server
but missing from a local copy is surfaced before the mirror can resurrect
it. In a terminal you're asked whether to remove it for good; headless, it
keeps the file and prints a hint (use --force to remove without asking).
See Delete a skill.
airskills pull
Download skills from your account that aren't installed locally, and update changed ones. If both local and remote have changed, the remote version is saved to a temp dir for merge instead of overwriting your work.
airskills pull [--force | --keep-local <name>] [--skillset <slug>] [--version <commit>]
--force— overwrite local with remote for diverged skills (backs up your local copy first). Mirror ofpush --force: both mean "I'm about to overwrite the other side, do it anyway", pointed in opposite directions.--keep-local <name>— the opposite resolution: keep your local copy of a conflicting skill as-is and track it against the server version, so the conflict stops recurring. Your files are never touched. For a skill you don't own this becomes your fork on the next push; for an org skill it warns first, since keep-local forks rather than updating the org skill (admins should use--forceinstead — see below).--skillset <slug>— personal skillset to pull against. Defaults to your last-used skillset.--version <commit-hash> <skill>— pull a specific commit version of a single skill.
When a skill you have locally collides by name with a different server
skill that airskills has never tracked, pull does not pick a side for you
(same name doesn't mean same skill). It parks the server copy for review
and offers three resolutions: pull --keep-local <name> (keep yours),
pull --force <name> (take the server's), or mv <name> <new> to rename
your local aside and keep both.
airskills update
Fetch the latest versions of all skills (or a named skill) from your account and write them to each detected agent's directory. Reports which skills changed.
airskills update [name]
update does not push local changes — it's pull-only. Use sync for
the round-trip.
airskills resolve
Records that you've reviewed your customised copy of a sourced skill against the original's current version. Stops the modified-pending prompt on every sync until the original moves again.
airskills resolve <name>
What it does: writes the upstream skill's current content hash into
your local marker as ResolvedHash. No file changes, no push, no pull.
The CLI just remembers "user has seen the original at version V."
Three flows that all end in resolve:
- Took nothing from upstream, kept your customised copy as-is.
- Took some upstream ideas (manually or with AI), edited locally.
- Resolved a previous review and the upstream has moved again.
If you instead want to take the whole upstream, replacing your local
copy: airskills add <owner>/<slug> --force. That makes you synced;
resolve is unnecessary. (Not pull --force — pull talks to your own
account's copy and only resolves conflicts there; taking an upstream's
bytes always goes through add.)
For owned skills (your own namespace, no upstream) this is a no-op — there's no "original" to resolve against.
See Customise a sourced skill and Incorporate updates from the original for the full flow.
airskills add
Install a skill from airskills.ai or directly from a GitHub repo.
airskills add <username/skill> [--preview] [--force]
airskills add github.com/<owner>/<repo>[/<path>] [--all] [--skill <names>]
<username/skill>— install from airskills.ai (e.g.chrismdp/retro).github.com/<owner>/<repo>[/<path>]— install directly from a GitHub repo. Use<path>to pick a specific skill in a multi-skill repo.--all— install every skill found in the GitHub repo.--skill <names>— comma-separated names (orpath/to/name) for a subset.--preview— show the skill's content without installing it.--force— take upstream's current bytes, overwriting any local copy. Use when sync tells you upstream has advanced and you want to adopt it (drops any local edits). Previous local files are backed up to~/.airskills/undo/<timestamp>/. No-op when the skill isn't installed yet. If your local copy is a legacy visible fork of this skill (a shape from before forks became emergent-only), taking the upstream also retires the fork — the fork row is soft-deleted and your machine tracks the original directly from then on.
Adding a skill you don't own tracks the original directly — it stays
ONE skill on your machine. If you later edit it, your edits become a
local overlay: push backs them up to a hidden copy in your account and
offers to suggest them to the owner. There is no deliberate fork
command — forks only ever exist as those automatic backups (and as
personal skills promoted from them if you lose access to the
original). If you want an independent variant you own outright, copy
the skill's folder to a new name, update the name: field in its
SKILL.md, and push.
When you're logged in, adding a skill you don't own also
subscribes you to it — the install is recorded against your account,
so it follows you to your other machines on their next airskills sync
(it shows in list as "added from <owner>", not as one of your own
skills). This applies to --as and --force too. Anonymous adds stay
local to that machine; log in and sync and the CLI registers a
subscription for anything you added beforehand. If a subscribed skill's
upstream later disappears — the owner deletes it or makes it private —
your local copy is saved as your own skill so you keep it; if it's
transferred, your subscription follows it to its new home.
airskills once
Download a skill to a temp directory for one-time use, without
installing it permanently. Prints the SKILL.md path so you can
reference it with @ in your AI agent, plus @ paths for any other
files.
airskills once <username/skill>
Aliased as airskills show.
airskills publish
Make a private skill publicly visible so anyone can install it with
airskills add.
airskills publish <skill-name>
airskills share
Grant another user access to one of your skills by email. They are
notified and can install it with airskills add. Sharing does not
change ownership — you still own the skill. To change ownership, use
airskills transfer.
airskills share <username/skill> --with <email>
airskills mv
Rename a skill. Updates the local directory name across every detected
agent and the skill's display name on the server. The skill's owner
does not change — see airskills transfer
for that.
Consumers who installed the skill via airskills add are unaffected
by a rename — their CLI continues to fetch updates because it pins by
skill ID, not by name.
airskills mv <old-name> <new-name>
See Rename a skill for the full workflow.
airskills transfer
Change the ownership of a skill — between your personal account
and an organization you belong to. This is a deliberate,
consumer-visible move: the old skill is archived (not redirected),
the old slug starts returning 410 Gone, and anyone who previously
installed the skill sees an "upstream archived" warning on their next
pull.
airskills transfer <skill-name> --to-org <organization-slug> [--slug <new-slug>] [-y|--yes]
airskills transfer <skill-name> --to-user [--slug <new-slug>] [-y|--yes]
--to-org <slug>— target org slug (e.g.cherrypick). Mutually exclusive with--to-user.--to-user— transfer to your personal namespace (org → user). Org admins only.--slug <new-slug>— override the slug in the target namespace. Use on collision when the target already has a skill at that slug.-y,--yes— skip the confirmation prompt.
On --to-org, your local copy is removed (backed up first to
~/.airskills/undo/) — the skill is now delivered through skillsets, so
re-add it to a skillset you're assigned to in order to use it locally again.
On --to-user the skill becomes your personal skill and the local copy stays
linked.
See Transfer a skill for the full workflow, including what consumers see and how to restore.
airskills rm
Delete a skill — or a single file within a skill — from this machine and from your account.
airskills rm <name> [-f|--force] [--keep-local] [--keep-remote] [--pending]
airskills rm <name>/<path> [-f|--force] [--keep-remote]
-f,--force— skip the confirmation prompt.--keep-local— only delete the remote skill; leave local files alone. (Whole-skill form only.)--keep-remote— only delete locally; leave the remote skill alone. For a subscribed skill (one youadded but don't own), this keeps the subscription, so it reinstalls here on the nextairskills sync— the CLI warns you when that's the case. Plainrmunsubscribes instead, so the skill stops arriving on your other machines too.--pending— discard only a parked pending-conflict copy (left in temp by a collision duringaddorsync), without touching the installed skill or the server. Use this to clear an "N pending conflict" status warning when a real skill of the same name is installed — plainrm <name>would delete that skill, not the parked copy.
Without flags: deletes both local (across every detected agent) and remote, then drops the entry from sync state.
Use this instead of rm -rf ~/.claude/skills/<name>. Hand-deleting an
agent dir is silently restored by the next airskills sync — see
Delete a skill for why and what to do
about it.
Removing a single file. Pass a path inside a skill —
airskills rm triage/scripts/old.sh — to drop one file rather than the
whole skill. Hand-deleting the file and pushing does not work: the
sync mirror resurrects it from any sibling agent dir that still has a
copy. This command deletes the file from every detected agent copy
first (so the mirror has nothing to copy back), then pushes the skill so
the server and the marker drop it too. --keep-remote removes the file
locally without pushing. SKILL.md can't be removed this way — to delete
the whole skill, run airskills rm <skill>.
airskills restore
Restore a skill that was deleted with airskills rm.
airskills restore <skill-name> [--slug <new-slug>]
--slug <new-slug>— rename on restore if the original slug now conflicts with another skill in your namespace.
airskills export
Export skills from your account into a portable format you can hand to another tool.
airskills export [name] [-f|--format zip|dir] [-o|--output <path>] [--all]
-f,--format—zip(default) for a zip you drag into Claude.ai's Upload Skill dialog, ChatGPT's Skills page, or Cowork;dirfor a Claude Code plugin directory you copy into~/.claude/skills/or a project's.claude/skills/.-o,--output— output path. Defaults to./<name>.zipor./<name>/.--all— export every skill on your account as a zip.
airskills export code-review # → code-review.zip
airskills export code-review -f dir # → code-review/SKILL.md
airskills export code-review -o ~/Downloads/
airskills export --all # → one zip per skill
airskills log
Show a unified timeline of recent changes across all your skills.
airskills log [-n|--limit <N>]
-n,--limit— number of recent changes to show (default20).
airskills status
One-line sync status, designed for shell startup:
eval "$(airskills status)"
airskills status [-q|--quiet]
-q,--quiet— only output when updates are available.
status is a no-network call when run as part of eval; it does hit
the server otherwise.
airskills list
List the skills in your skillset (including the ones you added from other people), with description, version, and the per-skill sync state on this machine.
airskills list [--scope personal|org] [--deleted]
--scope personal|org— filter to one scope. Default ispersonal.--deleted— show soft-deleted skills instead of live ones.
The STATE column reports one of:
- synced — local matches the server.
- modified — local has diverged from the server. For owned skills:
unpublished changes (run
airskills push). For sourced skills: a customised copy you've already resolved against the original's current version. - modified* — sourced skill, customised, AND the original has moved since you last resolved. See customisation.
- local changes — a skill you don't own (org-distributed, or added from another user) with your standing edits on top. The edits are backed up to a hidden copy in your account; the row reads local changes (suggestion pending) while a suggestion to the owner is open. Still ONE row — the backup never lists separately.
- untracked — local exists but airskills has no record of installing
it. Next
airskills syncwill either silently link it (if bytes match) or surface it as a conflict. - — — not installed locally; available to install.
Sample:
NAME DESCRIPTION VERSION STATE
project Manage vault projects 1.0.8 synced
cherrypick Meal planning helper 2.1.0 untracked
coaching Coaching session helper 1.0.3 modified
review-board Review queue manager 1.3.0 modified*
brand-new-thing Just published this 1.0.0 —
For more detail on what each state means, run airskills doctor or
see How sync state works.
airskills doctor
Run health checks on your local skills. Reports two sections:
- Sync state — informational diagnostics about each skill's state relative to the server: untracked locals that next sync will link or surface as conflicts; sourced skills with new updates from the original; owned skills with unpublished changes. Doesn't affect exit code — these are healable on next sync.
- Refs — broken cross-skill references (a
SKILL.mdmentions/foobut/fooisn't installed). Exits non-zero (1) if any are found.
airskills doctor
Sample output:
Sync state:
! project — local exists, not tracked. Original v1.0.8 matches bytes — next sync will link.
! cherrypick — local exists, not tracked. Original v2.1.0 differs — next sync will surface conflict.
! coaching — local has unpublished changes. Run 'airskills push' to publish.
! review-board — customised copy of chrismdp/review-board. Original moved 1.2.0 → 1.3.0 since you resolved. Review and 'airskills resolve review-board', or 'airskills add chrismdp/review-board --force' to drop your customised copy.
! brand-new-thing — on server, not installed here ('airskills sync' or 'airskills add').
✓ 3 synced.
Refs:
✓ no broken refs found.
Every notable line shares the ! prefix; the rest of the line names
the cause and the action. Synced skills collapse into the trailing
count.
airskills login
Sign in to airskills.ai. Opens your browser to authenticate with Google or Microsoft. No account needed — one is created automatically.
airskills login
airskills logout
Sign out of airskills.
airskills logout
airskills whoami
Show the currently signed-in user.
airskills whoami
airskills self-update
Download the latest airskills binary from GitHub Releases, verify the checksum, and replace the current binary in place.
airskills self-update
Auto-update
The CLI auto-updates to the latest release before every command
runs (you'll see a brief stderr line: airskills: updating to v…),
provided all of the following hold:
- the install is in a user-writable path (curl-pipe-bash from
airskills.ai/install.sh, manual download, orgo install); - there's a newer GitHub release than the running binary;
- neither
--no-updatenorAIRSKILLS_NO_AUTO_UPDATE=1is set.
Installs in system-managed paths (/usr/, /opt/, /snap/,
/Applications/) are skipped — your package manager owns those
upgrades. You'll keep getting the older "new version available" hint
on those installs.
If the auto-update fails (network, checksum, write permission) the CLI prints a single stderr line explaining why and runs your command on the current binary. Auto-update is best-effort and never blocks.
Opt out
Two equivalent escape hatches:
--no-updateflag — per invocation, useful in CI:airskills sync --no-update.AIRSKILLS_NO_AUTO_UPDATE=1env var — per shell/profile.
Both leave airskills self-update working as a manual command.
airskills version
Print the version, commit, and build date.
airskills version
There is no --version flag — use the version subcommand.
airskills feedback
Send a message to the airskills team.
airskills feedback [-m|--message <text>] [--include-logs]
-m,--message— feedback message (otherwise read interactively).--include-logs— attach recent CLI log files.
airskills config
Manage CLI configuration.
airskills config get <key>
airskills config set <key> <value>
airskills config path
Valid keys for set:
api_url— API endpoint (defaulthttps://airskills.ai).
airskills config path prints the config directory (~/.config/airskills/
on macOS/Linux).
airskills skillset
Personal skillsets group skills for selective sync. Every account has
a default skillset auto-created on signup. Use these commands to add
more, switch between them, and delete the ones you no longer want.
airskills skillset list
airskills skillset create <slug> [--name <human-readable>] [--description <text>]
airskills skillset delete <slug> [--force]
airskills skillset use <slug>
list— the currently-selected skillset is marked with*.create—--namedefaults to the slug.delete— refuses to deletedefaultand the currently-selected skillset.--forceskips the confirmation prompt.use— switches the remembered default skillset. Subsequentairskills syncandairskills pulluse this skillset unless you override with--skillset.
airskills org list
List the organizations you're a member of, with your role and member count. Read-only — organization creation, deletion, and settings live in the dashboard.
airskills org list
Sample:
SLUG ROLE MEMBERS NAME
chrismdp-org admin 3 Chrismdp Org
instem member 12 Instem
If you don't belong to any organizations, you'll see a pointer to the dashboard:
(no organizations — visit https://airskills.ai/dashboard/organizations/new to create one)
airskills org member skillsets
Inspect or change which org skillsets are assigned to a member of an org you belong to.
airskills org member skillsets <user> # list current assignments
airskills org member skillsets <user> --set a,b,c # replace the full set
airskills org member skillsets <user> --add <slug> # add one
airskills org member skillsets <user> --remove <slug> # remove one
airskills org member skillsets <user> --org <slug> # disambiguate when in multiple orgs
<user>is a username. The org-members API does not support email lookup today.--set,--add, and--removeare mutually exclusive.--setwith an empty value means "just the default skillset".- The default skillset is always implicitly assigned and cannot be removed.
--org <slug>is required if you belong to multiple orgs.
airskills review
Review suggestions submitted by other users against your skills.
airskills review [skill] # list pending suggestions
airskills review download <suggestion-id> # download to a temp dir
airskills review accept <suggestion-id> # mark accepted (bookkeeping only)
airskills review decline <suggestion-id> [--message <text>] # mark declined with optional reason
airskills reviewwith no args lists all pending suggestions and prints the full agent-friendly workflow. Pass a skill's local directory name to narrow the list.acceptis bookkeeping only. Merge the changes into your local skill and runairskills pushyourself — nothing auto-pushes.decline --messageshows the reason to the contributor.
Shipping skills with runnable scripts
Skills can ship executable helpers (e.g. ralph.sh, generate.sh).
On install (airskills add, airskills once, airskills sync,
airskills pull), any file whose contents start with a #! shebang
is written with 0755 so it can be invoked directly:
~/.claude/skills/ralph/ralph.sh # works without bash prefix
Files without a shebang are written 0644 as before. Shebang detection
is purely content-based — the file extension doesn't matter.
If you want a script to be runnable directly, give it a shebang as the first line. Files marked executable on the source machine but lacking a shebang (rare) will round-trip as non-executable; add a shebang to preserve the bit.
Notes on undocumented commands
Two commands are present in the binary but intentionally not promoted in user-facing docs:
airskills bundle— bundles still exist in the API (bundle create | list | show | delete) but the user-facing primitive going forward is skillsets. New code should reach for skillsets.airskills completion— the cobra-generated shell completion helper. Runairskills completion --helpfor shell-specific instructions.
Was this page helpful?