init
Create a newskills.json in the current directory.
Description
Interactively creates a newskills.json manifest for a skill package. Prompts for:
- Skill name (lowercase, alphanumeric + hyphens, optionally scoped
@org/name) - Version (semver format, default
0.1.0) - Description
- Visibility (public/private)
- Author (default from
~/.tank/config.json)
Options
No options (interactive prompts).Examples
Generated File
Validation Rules
- Name: Max 214 characters, must match
/^(@[a-z0-9-]+\/)?[a-z0-9][a-z0-9-]*$/ - Version: Must be valid semver (e.g.,
1.0.0,1.0.0-beta.1) - Visibility: Defaults to
privatefor scoped packages (@org/name)
install
Install a skill from the Tank registry, or all skills from lockfile.Arguments
Skill name (e.g.,
@org/skill-name). Omit to install all skills from skills.lock.Semver range (e.g.,
^1.0.0, ~2.1.0, >=1.0.0 <2.0.0). Default: * (latest).Options
Install skill globally to
~/.tank/skills/ (available to all projects).Examples
Flow
- Reads or creates
skills.json(local mode) or readsskills.lock(global mode) - Fetches available versions from
GET /api/v1/skills/{name}/versions - Resolves best version using semver (from
@tank/sharedresolver) - Checks if already installed (skips if same version in lockfile)
- Fetches version metadata from
GET /api/v1/skills/{name}/{version} - Validates permissions against project budget (local mode)
- Validates audit score against minimum threshold (if configured)
- Downloads tarball from signed URL
- Verifies SHA-512 integrity (computed vs. registry signature)
- Extracts tarball with security filters
- Updates
skills.json(local) andskills.lock - Links skill to detected AI agents (failures are warnings)
Security Filters
During extraction, Tank rejects:- Absolute paths
- Path traversal attempts (
../) - Symlinks and hardlinks
- Files exceeding 100MB total uncompressed size
Permission Budget Enforcement
Ifskills.json defines a permission budget, install fails if skill requests permissions outside budget:
Audit Score Threshold
Ifskills.json defines audit.min_score, install fails if skill’s audit score is below threshold:
Exit Codes
0- Skill installed successfully1- Install failed (network error, permission denied, integrity mismatch, etc.)
update
Update skills to latest versions within their semver ranges.Arguments
Skill name to update. Omit to update all skills.
Options
Update globally installed skills.
Examples
Flow
- Reads version range from
skills.json(local) or determines>=current(global) - Fetches available versions from registry
- Resolves latest version within range using semver
- Checks current installed version from
skills.lock - If resolved version is newer, calls
installCommandto upgrade - Prints summary of updated skills
Exit Codes
0- Update completed (may have updated 0 skills if all up-to-date)1- Update failed
remove
Remove an installed skill.Arguments
Skill name to remove (e.g.,
@org/skill-name).Options
Remove a globally installed skill.
Examples
Flow
- Removes skill from
skills.json(local mode) - Removes all matching entries from
skills.lock(supports multiple versions) - Unlinks skill from all AI agents (failures are warnings)
- Deletes agent-skills wrapper directory
- Deletes
.tank/skills/{name}/directory
Exit Codes
0- Skill removed successfully1- Skill not found or removal failed
publish
Pack and publish a skill to the Tank registry.Options
Validate and pack without uploading. Verifies auth with server.
Publish skill as private (sets
visibility: "private").Explicitly set visibility (
public or private). Overrides --private.Examples
Flow
- Checks authentication (requires valid token)
- Reads
skills.jsonfrom current directory - Packs directory into tarball with security filters
- If
--dry-run, prints summary and verifies token, then exits - POST
/api/v1/skillswith manifest → receivesuploadUrlandversionId - PUT tarball to signed
uploadUrl - POST
/api/v1/skills/confirmwith integrity data - Prints success message
Packing Behavior
Always Ignored (security filters):.git/node_modules/.env*.DS_Store*.logdist/build/
- Max 1,000 files per tarball
- Max 50MB total (enforced in packer)
Dry Run Output
Exit Codes
0- Publish succeeded1- Publish failed (auth error, validation error, version conflict, network error)
Error Messages
"Not logged in. Run: tank login"- No auth token in config"Version already exists. Bump the version in skills.json"- HTTP 409 conflict"Authentication failed. Your token may be expired or invalid."- HTTP 401"Publish failed: <error>"- HTTP 403/404 or validation error
search
Search for skills in the Tank registry.Arguments
Search query (full-text search across name and description).
Examples
Output Format
Columns:- NAME - Skill name (bold)
- VERSION - Latest published version
- SCORE - Audit score (color-coded: green ≥7, yellow 4-6.9, red <4)
- DESCRIPTION - Truncated to 60 characters
Limit
Returns max 20 results per query.info
Show detailed information about a skill.Arguments
Skill name (e.g.,
@org/skill-name).Examples
Exit Codes
0- Skill info displayed1- Skill not found or network error
upgrade
Upgrade Tank CLI to the latest version.Options
Specific version to upgrade to (default: latest)
Show what would be upgraded without making changes
Force upgrade even if already on target version
Examples
Upgrade to latest version:Flow
- Detects installation method (Homebrew vs. binary)
- Fetches latest release from GitHub API (or uses
--version) - Downloads binary for current platform (darwin/linux) and architecture (arm64/x64)
- Verifies SHA-256 checksum from
SHA256SUMSfile - Replaces current binary with new version
- Reports success with release notes link
Installation Method Detection
- Homebrew: If binary path contains
/Cellar/or/homebrew/, redirects tobrew upgrade tank - Binary: Self-upgrades by replacing binary in place
Security
- All binaries are verified with SHA-256 checksums before installation
- Download aborts if checksum mismatch detected
- Downloads from official GitHub releases only
Exit Codes
0- Successfully upgraded (or already on target version)1- Upgrade failed (network error, checksum mismatch, etc.)
link
Link current skill directory to AI agent directories (for development).Description
Creates symlinks from detected AI agent skill directories to the current skill directory. Used during skill development to test changes without publishing.Examples
Flow
- Reads
skills.jsonfrom current directory (requiresnamefield) - Detects installed AI agents (OpenCode, etc.)
- If
SKILL.mdexists and has frontmatter, uses current directory as source - Otherwise, prepares agent-skills wrapper directory in
~/.tank/agent-skills/ - Creates symlinks in each agent’s skills directory
- Writes entry to
~/.tank/links.jsonwithsource: "dev"
Detected Agents
- OpenCode (
~/.config/opencode/skills/) - More agents coming soon
Exit Codes
0- Skill linked successfully (or already linked)1- Noskills.jsonfound or linking failed
unlink
Remove skill symlinks from AI agent directories.Description
Removes symlinks created bytank link.
Examples
Flow
- Reads
skills.jsonfrom current directory - Removes symlinks from all agent skill directories
- Removes entry from
~/.tank/links.json - Deletes agent-skills wrapper directory from
~/.tank/agent-skills/
Exit Codes
0- Skill unlinked successfully (or not linked)1- Noskills.jsonfound or unlinking failed