Skip to main content

crewship agent

Create, configure, and inspect the AI agents that do the work inside a crew. Reach for these commands to provision a new agent, tweak its adapter or model, browse its runs and chats, or peek inside its container (files, logs, git history, peer inbox).

Subcommands


crewship agent list

List all agents in the workspace.
Output columns: SLUG, ROLE, CREW, STATUS, ADAPTER, MEMORY

crewship agent get

Show detailed information about an agent.
Output fields: Name, Slug, ID, Role, Role Title (only when set), Crew, Status, CLI Adapter, Tool Profile, Memory, Timeout, Created, Skills count, Credentials count. When a cron schedule is configured, additional rows appear: Schedule (<cron> (enabled|disabled)), Schedule Prompt, Next Run, and Last Run. When --webhook-require-timestamp is set on the agent, a Webhook Auth: timestamped signature required row appears.

crewship agent create

Create a new agent.
Use @file.txt syntax with --system-prompt to load the prompt from a file:

crewship agent update

Update an existing agent. Only changed flags are sent.
--self-learning is applied via its own audited endpoint and cannot be mixed with other field updates in the same invocation — run it on its own: crewship agent update <id> --self-learning[=false] --learning-reason "…".
Suggested prompts are what the agent offers as buttons under an empty conversation — the questions someone would otherwise type every morning. They are per agent, so two agents in one workspace can offer different ones, and an agent without any keeps showing the built-in defaults. The list is normalised on write (blank lines dropped, each line trimmed), and a rejection names the line: prompt 3 exceeds 120 characters (it has 154).

Ask forms

A suggested question is one line of text. An ask form is the same idea for the questions that need answers first: a chip that opens a short questionnaire, whose answers are rendered into an ordinary message and sent. There is no separate endpoint — forms ride the same agent PATCH — so they are written with --ask-forms, and in practice from a file, because a form with five fields and a template is not something anyone types on a command line.
forms.json
Field types: text, textarea, number, money, date, month, select, multiselect, checkbox, file, photo. An unrecognised type is accepted and renders as a text input, so a newer server can offer a type this console does not know yet — except one whose name says the value is a secret (password, api_key, client_secret, otp…), which is refused here and renders no input in the chat. A form submit is an ordinary chat message that is stored, searchable and read by the agent; there is no field type that makes that safe. Put the credential in the vault and reference it by name. select and multiselect need options. Options are trimmed on save, exactly as an answer is on its way into the message — "Travel " is stored as "Travel", because an option spelled differently from the answer it produces is a choice the form renders and then refuses. Two options that differ only by whitespace are therefore the same option, and are refused as a duplicate rather than silently merged. A money field named amount answers to two placeholders: {{amount}} and {{amount_currency}}. A field may also carry min, max, pattern and multiple, all of which are checked when a user submits — min/max are a value on number/money, a length on text, and a count on multiselect/file/photo; pattern is an anchored full match on the text-ish types; multiple: false caps an upload field at one file. A constraint that would not be checked for its field type (a pattern on a checkbox, a bound on a date) is refused on save rather than stored and ignored, and so are min above max and a pattern that does not compile. Optional version is the author’s revision number, carried into every submission’s metadata. Full reference: Ask forms. Three rules decide what is sent:
  1. Every {{placeholder}} must name a field on the same form, and that is checked when you save, not when a user clicks the chip. A typo comes back as form "receipt": template names {{suplier}}, which is not a field on that form and nothing is written.
  2. An unanswered optional field takes its whole line with it, label included — the receipt above with no category sends no Category: line rather than a dangling one. This is the only rule you cannot read off the template.
  3. Values go in verbatim (it is a user message), but control characters are stripped, each value caps at 2000 characters and the message at 32000. file and photo fields render as attachments/<chat-id>/<name>, one per line for several files.
Caps: 4 forms per agent, 6 fields per form, 48 characters per label, 2000 per template — all counted in characters, not bytes. schemas/ask-form.v1.json is the JSON Schema, for editor completion while writing forms.json.

crewship agent ask-preview

Render one of an agent’s ask forms and print the message it would send. This is how a template is tested without opening a browser, and it uses the same renderer the chat does — the two are pinned to one golden fixture (testdata/ask-templates.json), so what you see here is what gets sent. It also applies the same constraints the chat applies at submit, and prints the same sentences, so a preview cannot show a message the sheet would have refused:
No --var month= and no --var category= were given, so both of those lines are gone — that is rule 2 above, seen from the outside. Output is plain text on stdout with no framing, so it pipes into a file, a diff or a review comment.

crewship agent rotate-webhook-secret

Mint a new webhook signing secret for an agent. The new secret is printed only once; the previous secret stops validating immediately.
Backed by POST /api/v1/agents/{id}/webhook-secret/rotate. Table output shows the secret once; --format json or --format yaml returns webhook_secret and rotated_at.

crewship agent delete

Delete an agent. Prompts for confirmation unless --yes is passed.
Deletion is permanent. --yes skips the prompt — reserve it for scripts where you already know the slug is correct.

crewship agent runs

List runs for an agent.
Output columns: ID, STATUS, TRIGGER, CREATED, FINISHED

crewship agent stop

Stop a running agent.

crewship agent logs

Show agent container logs.

crewship agent debug

Show agent debug info including container state, environment variables, and crewshipd status. Output defaults to JSON (there is no table form); --format yaml and --format ndjson are honoured too.

crewship agent skills

List skills assigned to an agent.
Output columns: SKILL ID, NAME, CATEGORY, ENABLED

crewship agent credentials

List every credential this agent receives — both the ones assigned to it directly and the ones it gets by belonging to a crew.
Output columns: ID, NAME, PROVIDER, TYPE, ENV VAR, GRANT, LEASE, SOURCE GRANT says where the credential comes from, which decides how you take it away: A crew row shows - for ID because no assignment row exists behind it. SOURCE is a different question: it names the approval that put a lease on the grant (manual, keeper_allow, escalation_approve), and is - for a standing grant.

crewship agent avatar

Inspect, set, or clear an agent’s stored avatar. Normally an agent’s face is drawn on the fly from its avatar_seed and avatar_style, which means it depends on the installed generator version — upgrading the avatar library repaints every agent. Once a render is stored, that exact image is served instead and the face stops moving. An agent with no stored render is in the normal, pre-persistence state, not a broken one.

crewship agent avatar show

Write the stored avatar SVG to stdout, or to a file with -o. Errors if the agent has no stored render.

crewship agent avatar set

Store an SVG as the agent’s avatar.
The server validates the SVG against an allowlist of inert drawing elements; anything that could load or execute something (scripts, event handlers, external references) is refused. Maximum 64 KiB. Storing is write-once — an agent that already has a stored avatar fails with a conflict. Run avatar clear first to replace one.

crewship agent avatar clear

Drop the stored render, returning the agent to generate-from-seed.
You rarely need clear by hand: changing an agent’s --avatar-seed or --avatar-style, or applying a crew-wide style with crewship crew apply-avatar-style, drops the stale render automatically.

crewship agent mcp

Show or set MCP server configuration for an agent.
The JSON must contain a "mcpServers" object at the top level. --set and --set-file are mutually exclusive. --resolved cannot be combined with set operations.

MCP bindings subcommands

Beyond the bare config form above, agent mcp has CRUD subcommands over per-agent MCP server bindings (backed by /api/v1/agents/{id}/integrations):
add — binds a workspace or crew integration to the agent. update — patch an existing binding (at least one flag required). List output columns: ID, SERVER, SCOPE, ENABLED, CREDENTIAL.

crewship agent chats

List the agent’s recent chat sessions — id, title, status, message count, and start/end timestamps. Mirrors the SessionsSidebar panel in the web UI. Alias: sessions.
Output columns: CHAT ID, TITLE, STATUS, MSGS, STARTED, ENDED. Backed by GET /api/v1/agents/{id}/chats.

crewship agent channels

List the notification channels an agent is allowed to post to. An empty list is normal because channel access is default-deny.
Output columns: CHANNEL, TYPE, PROVIDER, ENABLED Backed by GET /api/v1/agents/{id}/notification-channels.

crewship agent files

List the agent’s /output/<slug>/ working-directory artefacts, or download a single file. Same view the web Files panel renders.
Downloads stream into a tempfile next to the target and rename(2) only on success — Ctrl-C or transport errors mid-copy do not clobber an existing good file with a truncated one. Backed by GET /api/v1/agents/{id}/files and GET /api/v1/agents/{id}/files/download?path=….

crewship agent file-write

Upload bytes to the agent’s working directory. Source comes from --from (local file), --content (inline string), or stdin when neither flag is given. --content and --from are mutually exclusive.
Backed by PUT /api/v1/agents/{id}/files/save?path=<path>. The handler reads r.Body raw — no JSON envelope — so binary uploads round-trip byte-for-byte.

crewship agent inbox

List peer-to-peer messages addressed to this agent. Useful for debugging cross-agent collaboration: did the message arrive? was it read?
Output columns: WHEN, FROM (truncated to 15 chars), MESSAGE (truncated to 60 chars, newlines flattened). Backed by GET /api/v1/agents/{id}/inbox.

crewship agent git-log

Show the git commit log from inside the agent’s container — useful for inspecting what code-writing agents have committed locally before any push.
Default rendering prints short hash + relative date + truncated subject line. The handler tolerates both [...] and {"commits":[...]} shapes from the server side. Backed by GET /api/v1/agents/{id}/git-log.