Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.crewship.ai/llms.txt

Use this file to discover all available pages before exploring further.

Manifest Schema

Flat reference for every field accepted under apiVersion: crewship/v1. For the narrative + examples, see Guides → Workspace Manifests. For CLI flags, see CLI → apply and CLI → export. The Go type definitions live at internal/manifest/schema.go; this page mirrors them.

Top level

Every manifest must start with these three keys:
apiVersion: crewship/v1
kind: Crew | Workspace
metadata: {  }
spec: {  }
FieldTypeRequiredNotes
apiVersionstringAlways crewship/v1 for v1 manifests. Server accepts every past version it has shipped.
kind"Crew" | "Workspace"Discriminates the spec: shape.
metadataobjectIdentity + descriptive header.
specobjectThe actual declaration. Shape depends on kind:.
Multi-document YAML is supported via --- separators — each document is independently typed by its own apiVersion + kind.

metadata

Shared between both kinds. Only slug is load-bearing for apply (it’s the idempotency key); the rest is descriptive.
FieldTypeNotes
namestringHuman-readable name.
slugstring[a-z0-9][a-z0-9_-]{0,49} — workspace-unique identity key.
descriptionstringFree text.
iconstringCrewship icon set (git-pull-request, list-checks, …).
colorstringTailwind palette name.
authorstringDisplay only — useful for shared manifests.
versionstringSemver, display only.
licensestringSPDX, display only.
preferred_languagestringWorkspace-only. Language hint (cs, en).
labelsmap<string,string>Free tags. Not yet used by the server.

kind: Crew

spec: is a single CrewSpec (described below).

kind: Workspace

spec: wraps workspace-scope state and a list of nested crews:
FieldTypeNotes
credentials[]CredentialWorkspace-scope slots shared by every nested crew.
skills[]SkillWorkspace-scope skills available to every nested crew.
crews[]CrewSpecOne entry per crew in the bundle.

CrewSpec

FieldTypeNotes
slugstringOverride for nested crews. Standalone kind: Crew ignores this and uses metadata.slug.
namestringOverride (nested only).
descriptionstring
iconstring
colorstring
devcontainerDevcontainerContainer runtime. Nil → no container, agents run on the host.
credentials[]CredentialCrew-scope credential slots. Merged with workspace-scope.
mcp_servers[]MCPServerCrew-scoped MCP integrations.
skills[]SkillCrew-scope skills. Merged with workspace-scope.
services[]ServiceSidecar containers (Redis, Postgres, …).
agents[]Agent(required) At least one agent.

Devcontainer

Subset of devcontainer.json. Hand-written JSON can be passed through under raw: for fields not modelled here. Structured fields take precedence on conflict.
FieldTypeNotes
imagestringBase runtime image. Glibc Linux only.
featuresmap<string, object>Devcontainer features map. Same shape as the spec.
envmap<string,string>Becomes containerEnv in the generated config.
misestring[tools] config block fed to mise at provision time.
runtime_imagestringAlternative to image:; falls back to image when empty.
memory_mbintContainer memory cap.
cpusfloatCPU cores.
ttl_hoursintAuto-stop after idle period. 0 = no TTL.
network_mode"free" | "restricted"When restricted, only allowed_domains are reachable.
allowed_domains[]stringDomain allowlist for restricted mode.
rawmap<string,any>Free-form devcontainer.json keys passed through.
See Configuration → Devcontainers for the full devcontainer field reference.

Credential

Slot declaration. Never carries values — those arrive at apply-time through --from-env or --secrets-file.
FieldTypeRequiredNotes
envstringEnv var name the agent binds against. Also the workspace-unique credential name.
providerstringANTHROPIC, OPENAI, GITHUB, NONE, …
typestringAPI_KEY, OAUTH2, CLI_TOKEN, AI_CLI_TOKEN, SECRET, USERPASS, SSH_KEY, CERTIFICATE, GENERIC_SECRET
labelstringUI label shown in the “Set value” wizard.
help_urlstringLink to provider’s “where do I find this?” docs.
descriptionstring
requiredboolReserved for a future “soft requirement” mode. Treated as required today.
Apply behaviour when a value is not supplied:
  • status set to PENDING on the server.
  • UI shows “Needs value” with a CTA.
  • Agent runs needing the credential fail with credential not configured.
  • Placeholder is never injected into the agent environment — the LLM can’t read or leak it.

Skill

Pick exactly one of path:, source:, or inline:.
FieldTypeNotes
slugstring(required) Workspace-unique identity key.
pathstringRelative path to a SKILL.md file beside the manifest. Recommended for skills longer than a paragraph.
sourcestringHTTPS URL to a SKILL.md. Fetched at apply time.
refstringGit ref/tag/sha for URL sources (optional).
digeststringsha256:… digest for URL sources (optional).
inlinestringSKILL.md body in the manifest itself. Hard cap 8 KB.
allow_unsafe_licenseboolBypass the SPDX allowlist gate (license-allow-list applies otherwise).
Path resolution uses the manifest’s directory as the root. .. escapes and absolute paths are rejected; symlinks are evaluated and their targets must also stay inside the manifest directory.

MCPServer

Crew-scoped MCP integration. Mirrors what POST /api/v1/crews/{id}/integrations accepts.
FieldTypeRequiredNotes
namestringCrew-unique.
display_namestringFalls back to name.
transport"stdio" | "streamable-http"
commandstringconditionalRequired for stdio.
args[]string
endpointstringconditionalRequired for streamable-http.
env_mappingmap<string,string>{server_env_var: credential_env_name}. Resolved against the merged workspace + crew credential scope at apply time.
iconstringBrand logo hint.
enabledboolDefault true.

Agent

FieldTypeRequiredNotes
slugstringWorkspace-unique.
namestringDisplay name.
descriptionstring
role_titlestringFree text job title.
agent_role"AGENT" | "LEAD"Default AGENT. Max one LEAD per crew.
lead_mode"active" | "passive"Only meaningful when agent_role: LEAD.
cli_adapterenumCLAUDE_CODE (default), OPENCODE, CODEX_CLI, GEMINI_CLI, CURSOR_CLI, FACTORY_DROID.
llm.providerstringANTHROPIC, OPENAI, GOOGLE, CURSOR, FACTORY, OLLAMA.
llm.modelstringFree string; CLI adapter enforces the right shape.
tool_profile"FULL" | "CODING" | "MINIMAL"Default CODING.
timeout_secondsintDefault 1800.
memory_enabledboolEnables the file-first agent memory.
promptstringInline system prompt. Hard cap 64 KB.
prompt_filestringRelative path. Mutually exclusive with prompt:.
skills[]stringSlug references; must resolve in the merged workspace + crew scope.
env_refs[]stringEnv var name references; must resolve in the merged credential scope.

Service

Sidecar container that runs alongside the agent on the crew’s bridge network. Agents reach services by name (redis:6379, postgres:5432) on a private network — sidecars are never published to the host.
FieldTypeRequiredNotes
namestringDNS label (RFC 1035, 1–63 chars): [a-z](?:[a-z0-9-]{0,61}[a-z0-9])?. Becomes the bridge-network alias.
imagestringAnything docker pull can fetch. Pinning a digest is encouraged.
command[]stringOverrides image ENTRYPOINT + CMD.
envmap<string,string>Literal env vars (no secrets — use env_refs:).
env_refs[]stringCredential env names to inject from the vault. PENDING credentials are silently omitted.
ports[]string"5432" or "5432/tcp". Container-internal only.
volumes[]ServiceVolumeNamed volumes only. Bind mounts to host paths are rejected for portability.
healthcheckServiceHealthcheckProvisioner waits for HEALTHY before starting the agent.

ServiceVolume

FieldTypeNotes
namestringPer-crew namespaced internally as crewship-svc-{crew-slug}-vol-{name}. Two crews can both declare pg-data and get isolated stores.
mountstringAbsolute path inside the sidecar (e.g. /var/lib/postgresql/data).

ServiceHealthcheck

Mirrors docker-compose’s healthcheck shape.
FieldTypeDefaultNotes
test[]string(required)["CMD", …] or ["CMD-SHELL", "..."].
intervalduration string5sGo duration syntax (5s, 30s, 1m).
timeoutduration string3s
retriesint
start_periodduration string0sGrace period before failures count.

Cross-reference rules

The validator runs the following cross-checks at validate time (no network, no DB). Every failure is collected into a single ValidationError so the author can fix all of them in one pass.
RuleFailing message
Every agent.skills[] slug must be declared in the merged workspace + crew skill scopecrew "X" agent "Y" references unknown skill "Z"
Every agent.env_refs[] env name must be declared in the merged credential scopecrew "X" agent "Y" references unknown credential env "Z"
Every mcp.env_mapping[] value must be declared in the merged credential scopecrew "X" mcp "Y": env_mapping[KEY] -> "Z" references unknown credential
Every service.env_refs[] env name must be declared in the merged credential scopecrew "X" service "Y": env_refs[Z] references unknown credential

Shape rules

RuleFailing message
Slugs must match ^[a-z0-9][a-z0-9_-]{0,49}$<scope>: invalid slug "X" (lowercase letters, digits, '-', '_'; max 50 chars; must start with letter or digit)
Each skill must have exactly one sourcezero: <scope> skill "X": must have one of path, source, or inline ; more than one: <scope> skill "X": only one of path, source, or inline may be set
At most one agent per crew may have agent_role: LEADcrew "X" crew has more than one LEAD
agent_role must be AGENT or LEAD<agent>: agent_role "X" invalid (want AGENT or LEAD)
cli_adapter must be one of the 6 supported enum values<agent>: cli_adapter "X" invalid
tool_profile must be FULL, CODING, or MINIMAL<agent>: tool_profile "X" invalid (want FULL, CODING, MINIMAL)
Each crew needs at least one agentcrew "X": at least one agent is required
Slugs / names unique within scope<scope>: duplicate <thing> "X" (skill / credential / agent / mcp / service / crew)
Service name must be a DNS label<scope> service "X": name must be a DNS label (lowercase letters/digits/'-', start with letter, end with letter or digit)
Service volumes must be named (no bind mounts)<scope> service "X": volume "Y" looks like a bind mount; manifests only support named volumes for portability
Service volumes need both name: and mount:, and mount: is unique within the service<scope> service "X": volumes[N] needs both name and mount / duplicate mount "Y"
healthcheck: requires a test: command when set<scope> service "X": healthcheck declared without a test command
MCP transport must be set and knowntransport is required / unknown transport "X"
stdio MCP transport requires command:<scope> mcp "X": stdio transport requires command
streamable-http / http / sse MCP transport requires endpoint:<scope> mcp "X": <transport> transport requires endpoint

Size caps

The parser refuses oversized inputs to bound apply-time memory and prevent half-applied state from a malformed file.
SubjectCapNotes
Manifest file itself4 MB
Skill body via path:512 KBMirrors the existing internal/skills cap.
Skill body via inline:8 KBUse path: for larger skills.
Agent prompt (inline or via prompt_file)64 KB
services_json on the server64 KBAcross all sidecars in one crew.

Apply / sync semantics

For the full apply-mode matrix (default sync vs --strict vs --replace), see CLI → apply. In short: by default the manifest is the source of truth. Crews / agents / agent_skills / agent_credentials / mcp_servers that exist in the workspace but aren’t in the manifest get deleted with a confirmation prompt. Skills and credentials themselves are additive-only — delete those via UI or dedicated CLI commands.

See also