Skip to main content

crewship skill

Skills are reusable instruction playbooks that get injected into an agent’s system prompt as a [SKILLS AVAILABLE] block and materialised on disk in each CLI’s discovery convention (.claude/skills/, .opencode/skills/, .factory/skills/, .agents/skills/, .cursor/rules/). The CLI is the canonical authoring + iteration path; the web UI is a surface over the same API.
crewship skill <subcommand> [flags]

Subcommands at a glance

CommandWhat it does
initGenerate a SKILL.md scaffold on disk (offline; no API call).
listList skills in the workspace, with optional filters.
getShow skill metadata.
exportRecover a previously-imported SKILL.md from the workspace registry.
importUpload a SKILL.md (single URL/file) or walk a whole git repo.
createLLM-author a SKILL.md via Anthropic Messages (requires API key).
deleteRemove a skill from the workspace registry.
assignAttach a skill to one agent, several agents, or a whole crew.
unassignDetach the same way.
proposed listList skills auto-promoted from memory awaiting operator approval.
proposed approveImport a staged proposal via the canonical importer.
proposed rejectDiscard a staged proposal (deletes the .proposed/ file).

The CLI authoring loop

The intended flow for a custom skill is:
# 1. Scaffold a starter SKILL.md
crewship skill init pdf-cleanup --category DEVOPS \
  --description "Use when the user asks to strip metadata from a PDF."

# 2. Edit the scaffold — fill in Steps, Output format, Guardrails
$EDITOR ./pdf-cleanup/SKILL.md

# 3. Upload it
crewship skill import --file ./pdf-cleanup/SKILL.md

# 4. Assign to one or more agents
crewship skill assign pdf-cleanup --to-crew engineering

# 5. Iterate: pull the current version back, edit, re-upload
crewship skill export pdf-cleanup --output ./
$EDITOR ./pdf-cleanup.md
crewship skill import --file ./pdf-cleanup.md
init is intentionally offline — it doesn’t talk to the server, so it works for users who only have a Claude Code OAuth token and cannot reach the Anthropic Messages API directly (the path crewship skill create needs).

crewship skill init

Write a SKILL.md scaffold to disk so you can edit it locally and upload.
crewship skill init <slug> [flags]
FlagDefaultNotes
--categoryCUSTOMOne of CODING DATA DEVOPS WRITING RESEARCH PM DESIGN SUPPORT SECURITY FINANCE OPS AUTOMATION SALES CUSTOM.
--description(empty)One-line trigger; should start with Use when..., Useful for..., or To <verb>.... When omitted, the scaffold writes a TODO: placeholder into the frontmatter description: field — fill it in before crewship skill import, which validates the SKILL.md server-side.
--licenseMITSPDX identifier — must be on the allowlist below for skill import to accept it later.
--output./<slug>/Output directory for <dir>/SKILL.md.
--forcefalseOverwrite an existing SKILL.md at the destination.
The scaffold writes the canonical body sections (When to use, Steps, Output format, Guardrails, optional Verification) and frontmatter fields the parser accepts.

crewship skill list

crewship skill list [flags]
FlagNotes
--categoryFilter by category.
--sourceOne of BUNDLED CUSTOM GENERATED MARKETPLACE MANAGED.
--vendorVendor namespace (e.g. anthropic, community).
--maturityOne of OFFICIAL CURATED COMMUNITY EXPERIMENTAL.
--runtimeOne of INSTRUCTIONS SCRIPT MCP HYBRID.
--searchSubstring match on name / display_name / description.
--installedOnly skills with at least one agent_skills row.
--installed-for=<agent>Only skills assigned to a specific agent.
Examples:
crewship skill list --maturity OFFICIAL
crewship skill list --vendor anthropic --category DESIGN
crewship skill list --installed-for viktor
crewship skill list --search pdf

crewship skill get

Show metadata for one skill — name, slug, category, version, source, author, tool count, created-at. The markdown description body renders below the metadata block via glamour for human formats; JSON / YAML / quiet outputs include it raw inside the serialized struct.
crewship skill get <slug-or-id>
crewship skill get pdf-cleanup --format json | jq '.tool_count'
Backed by GET /api/v1/skills/{id} after resolving <slug-or-id> to the skill’s id.

crewship skill export

Recover the SKILL.md body from the workspace and write it to disk or stdout.
crewship skill export <slug-or-id> [--output PATH]
Without --output, prints to stdout (pipe-friendly). With --output set to a directory, writes <slug>.md inside it.
# Print to stdout
crewship skill export pdf-cleanup

# Write to a directory
crewship skill export pdf-cleanup --output ./

crewship skill import

Import a single SKILL.md (URL or file) or walk a whole git repo.
# Single SKILL.md from a URL or local file
crewship skill import https://raw.githubusercontent.com/owner/repo/main/skills/my-skill/SKILL.md
crewship skill import --file ./SKILL.md

# Whole git repo (--depth 1, walks for **/SKILL.md, license-gated)
crewship skill import --repo https://github.com/anthropics/skills
crewship skill import --repo https://github.com/owner/skills --paths 'skills/*' --dry-run
crewship skill import --repo https://github.com/owner/skills --unsafe-license
FlagNotes
--filePath to a local SKILL.md (single skill).
--repoGit URL — switches to bulk mode.
--refGit ref (branch/tag); only with --repo.
--pathsGlob filters relative to repo root, e.g. skills/*.
--vendorOverride vendor namespace (defaults to community).
--unsafe-licenseSkip the SPDX license allowlist (use with caution).
--dry-runWalk + parse, don’t write.

What runs on every import

  1. SSRF check — URL/host must be public; private IPs blocked (single + bulk).
  2. License gate — frontmatter license: is matched against the SPDX allowlist below.
  3. Prompt-injection scanner — body scanned for “ignore previous instructions”, role hijack, large base64 blobs, etc. Status stored in scan_status (CLEAN / FLAGGED).
  4. Size cap — single fetch ≤ 512 KB; bulk per-file same; bulk total ≤ 500 SKILL.md files.
  5. BUNDLED protection — re-importing a slug already owned by a BUNDLED skill is refused.

SPDX allowlist

MIT, Apache-2.0, BSD-2-Clause, BSD-3-Clause, ISC, CC0-1.0, MPL-2.0, Unlicense, 0BSD. Pass --unsafe-license to bypass for one batch (audited via the license column).

crewship skill create

LLM-authored SKILL.md via Anthropic Messages.
crewship skill create --slug pdf-cleanup \
  --prompt "Help users sanitise PDFs: strip metadata, remove embedded JS, flatten forms"
Requires an active Anthropic credential of type API_KEY in the workspace (Settings → Credentials). An OAuth token from claude /login is not sufficient (it’s a Bearer for claude.ai, not the Messages API). Users without an API key should reach for skill init instead.
FlagDefaultNotes
--slugrequiredKebab-case identifier.
--promptrequiredFree-form description of the skill’s behaviour.
--modelclaude-sonnet-4-6LLM model override.
--printfalsePrint generated SKILL.md to stdout instead of summary.

crewship skill delete

Remove a skill from the workspace registry. Cascades to agent_skills.
crewship skill delete <slug-or-id>          # interactive confirm
crewship skill delete <slug-or-id> --yes    # skip confirm (--force also accepted)
crewship skill rm <slug-or-id>              # alias
Cascades to agent_skills — every agent loses the skill. BUNDLED skills cannot be deleted (they re-seed on every server start).

crewship skill assign

# One agent (positional)
crewship skill assign my-skill viktor

# Multiple agents
crewship skill assign my-skill --to-agents viktor,nela,martin

# Whole crew
crewship skill assign my-skill --to-crew engineering
The fan-out variant is idempotent: agents that already have the skill are treated as success, and per-agent failures are reported but don’t abort the rest.

crewship skill unassign

Same target shapes as assign:
crewship skill unassign my-skill viktor
crewship skill unassign my-skill --to-agents viktor,nela
crewship skill unassign my-skill --to-crew engineering
After unassign, the next time the agent runs, the orchestrator prunes the skill folder from the agent’s container (.claude/skills/<slug>/, .cursor/rules/<slug>.mdc, etc.) so a CLI auto-discovery walker can no longer pick it up.

crewship skill proposed

Operator-side HITL surface for the memory→Skills bridge. When the consolidator sees a learned rule with sustained recall (default ≥ 10 recall events, composite score ≥ 0.85) it stages an Anthropic-format SKILL.md under .memory/{crew-slug}/topics/.proposed/skill-<slug>.md. These three verbs let an operator inspect and decide.
Each proposed verb requires OWNER, ADMIN, or MANAGER role.

crewship skill proposed list

crewship skill proposed list --crew <crew-id>
crewship skill proposed list --crew <crew-id> --format json
FlagRequiredDescription
--crewyesCrew id whose .proposed/ dir to scan. The CLI URL-encodes this value so any future id-scheme change with special chars stays safe.
--formatnotext (default) or json.
Output columns: FILE, NAME, CATEGORY, DESCRIPTION (truncated to 60 chars), QUALITY (ok when the server didn’t flag it). Backed by GET /api/v1/skills/proposed?crew_id=<id>.

crewship skill proposed approve

Run the staged file through the canonical skill importer — same path as URL-based imports, so the SPDX license check and prompt-injection scan apply. On success the staging file is deleted and an EntryMemorySkillApproved journal entry fires.
crewship skill proposed approve --crew <crew-id> --file skill-deploy-friday.md
FlagRequiredDescription
--crewyesCrew id.
--fileyesStaged file name as listed (e.g. skill-deploy-friday.md).
Backed by POST /api/v1/skills/proposed/approve. Output: approved <file> -> skill <id> (<slug>, created|updated).

crewship skill proposed reject

Discard the staging file without importing. Idempotent — rejecting an already-deleted file returns success, and an EntryMemorySkillRejected journal entry fires either way.
crewship skill proposed reject --crew <crew-id> --file skill-noise.md
FlagRequiredDescription
--crewyesCrew id.
--fileyesStaged file name.
Backed by POST /api/v1/skills/proposed/reject.

Per-CLI filesystem materialisation

When a skill is assigned, the orchestrator writes its SKILL.md into the discovery convention each adapter knows. This way the same skill works for whatever CLI the agent is configured with:
CLIPath inside container
Claude Code.claude/skills/<slug>/SKILL.md
OpenAI Codex CLI.agents/skills/<slug>/SKILL.md
OpenCode.opencode/skills/<slug>/SKILL.md
Factory Droid.factory/skills/<slug>/SKILL.md
Cursor.cursor/rules/<slug>.mdc (flat .mdc)
Gemini CLI / other adapters[SKILLS AVAILABLE] block only (no FS)
The system-prompt block is the authoritative surface — filesystem layout is the bonus discovery path for adapters that walk it natively.