Shipeasy

CLI reference

Auto-generated reference for the `shipeasy` CLI — every command, argument, and flag, straight from the command definitions.

Every command below is generated from the CLI's own command tree, so it always matches the installed binary. Run any command with --help for the same information in your terminal.

New to the CLI? Start with the CLI guide for installation, auth, and worked examples — this page is the exhaustive flag-by-flag reference.

shipeasy login

Authenticate via PKCE device flow (no-op if already logged in)

With no flags, login auto-detects the project: an explicit --project wins, otherwise the project bound via the nearest .shipeasy file (searched up from the cwd, like .git) — the browser flow then offers only that project. With neither, it opens the picker and writes .shipeasy on success.

In CI, set SHIPEASY_CLI_TOKEN + SHIPEASY_PROJECT_ID instead — they act as the session, so login short-circuits as already-authenticated (no browser).

shipeasy login [options]
OptionDescription
--forceoptionalRe-authenticate even if a valid session already exists
--project <id>optionalScope login to one project (defaults to the .shipeasy-bound project)

Examples:

# Use the .shipeasy-bound project, else open the picker
shipeasy login

# Re-authenticate over a live session
shipeasy login --force

# Scope to one project explicitly
shipeasy login --project proj_abc123

# CI: env credentials act as the session, so this is a no-op
SHIPEASY_CLI_TOKEN= SHIPEASY_PROJECT_ID= shipeasy login

shipeasy logout

Clear stored credentials

shipeasy logout [options]
OptionDescription
--forceoptionalLog out even from inside a coding agent (see the refusal text)

Examples:

shipeasy logout

# from inside a coding agent, when the user asked
shipeasy logout --force

shipeasy bind

Bind the current directory to a Shipeasy project (writes .shipeasy)

shipeasy bind [options] [project_id]
ArgumentDescription
project_idoptional
OptionDescription
--name <name>optionalOptional human-readable project name to record

Examples:

# bind to the active session's project
shipeasy bind

shipeasy bind proj_abc123

shipeasy bind proj_abc123 --name 'Acme Web'

shipeasy root

Print the project root — the nearest .shipeasy dir (walks up from cwd, like .git)

The project root is the folder that holds .shipeasy, found by walking up from the cwd (like git finds .git). The nearest file wins, so a subproject's own .shipeasy shadows any ancestor and the walk stops there — one .shipeasy per project. Use this instead of git rev-parse --show-toplevel when you need the Shipeasy project boundary: it respects a subproject root and never overshoots to the git root above it. Exits non-zero (with guidance) when nothing is bound.

shipeasy root [options]
OptionDescription
--jsonoptionalOutput the resolved root as JSON

Examples:

# print the nearest .shipeasy dir
shipeasy root

# root + project_id + sdk, machine-readable
shipeasy root --json

# cd to the project root
cd "$(shipeasy root)"

shipeasy metrics

Metrics: the event-backed queries that drive tracking dashboards and experiment success / guardrail measurement.

shipeasy metrics [options] [command]

shipeasy metrics events

Events: the catalog of event names (and their typed properties) that metric queries reference.

shipeasy metrics events [options] [command]

shipeasy metrics events list

List events

shipeasy metrics events list [options]
OptionDescription
--q <value>optionalCase-insensitive substring filter across the resource's human-readable text columns (e.g. name, title, description). OR-matched across those columns; omit to return everything.
--data <value>optionalRequest body as a JSON object.

shipeasy metrics events create

Register an event

shipeasy metrics events create [options] <name>
ArgumentDescription
namerequiredEvent name. Starts with a letter, digit, or _; letters, digits, _, -, .; max 128 chars. Immutable after create — this is the handle metric queries reference.
OptionDescription
--folder <value>optionalOptional folder name grouping items in the dashboard. Alphanumeric, _ or - (no /). Part of the SDK lookup key (<folder>/<name>).
--description <value>optionalOptional human-readable description of the event.
--properties <value>optionalTyped properties declared on the event. Defaults to an empty list.

shipeasy metrics events get

Get an event

shipeasy metrics events get [options] <id>
ArgumentDescription
idrequiredStable opaque event id (evt_…) or the event's name.
OptionDescription
--data <value>optionalRequest body as a JSON object.

shipeasy metrics events update

Update an event

shipeasy metrics events update [options] <id>
ArgumentDescription
idrequiredStable opaque event id (evt_…) or the event's name.
OptionDescription
--folder <value>optionalOptional folder name grouping items in the dashboard. Alphanumeric, _ or - (no /). Part of the SDK lookup key (<folder>/<name>).
--description <value>optionalNew description for the event.
--properties <value>optionalReplaces the full property set (no merge). Omit to leave properties unchanged.

shipeasy metrics events archive

Archive an event

shipeasy metrics events archive [options] <id>
ArgumentDescription
idrequiredStable opaque event id (evt_…) or the event's name.
OptionDescription
--data <value>optionalRequest body as a JSON object.

shipeasy metrics events approve

Approve a pending event

shipeasy metrics events approve [options] <id>
ArgumentDescription
idrequiredStable opaque event id (evt_…) or the event's name.
OptionDescription
--folder <value>optionalOptional folder name grouping items in the dashboard. Alphanumeric, _ or - (no /). Part of the SDK lookup key (<folder>/<name>).
--description <value>optionalNew description for the event.
--properties <value>optionalReplaces the full property set (no merge). Omit to leave properties unchanged.

shipeasy metrics list

List metrics

shipeasy metrics list [options]
OptionDescription
--q <value>optionalCase-insensitive substring filter across the resource's human-readable text columns (e.g. name, title, description). OR-matched across those columns; omit to return everything.
--data <value>optionalRequest body as a JSON object.

shipeasy metrics create

Create a metric

shipeasy metrics create [options] <name>
ArgumentDescription
namerequiredStable metric key. Single segment or folder.name; lowercase letters, digits, _/-; max 128 chars.
OptionDescription
--folder <value>optionalOptional folder name grouping items in the dashboard. Alphanumeric, _ or - (no /). Part of the SDK lookup key (<folder>/<name>).
--event-name <value>optionalSource event the query reads from.
--query <value>optionalMetric query DSL string, e.g. sum(purchase, amount). The alternative to query_ir. Every label the query references — in filters, the value position, by (…), or without (…) — must exist as a property on the tracked event's payload; a query over a label the event never carries validates fine but returns empty results.
--winsorize-pct <value>optionalWinsorise percentile (1–99) to clamp outliers. Defaults to 99.
--default-min-effect-of-interest <value>optionalDefault minimum effect of interest (relative, 0–1) — the smallest change in this metric worth acting on, used as the power-planning baseline. Intrinsic to the metric; an experiment overrides it per-attachment with min_effect_of_interest when a specific decision has a different cost/risk bar. null to omit.
--direction <value>optionalDesired direction of movement. higher_better (default), lower_better, or neutral (guardrail).
--unit <value>optionalDisplay unit (e.g. ms, %, $), or null when unitless.
--query-ir <value>optionalTyped query IR — the structured alternative to the query DSL string. Exactly one of query / query_ir is supplied per metric body.

shipeasy metrics show

Get a metric

shipeasy metrics show [options] <id>
ArgumentDescription
idrequiredStable opaque metric id (met_…) or the metric's name.
OptionDescription
--data <value>optionalRequest body as a JSON object.

shipeasy metrics update

Update a metric

shipeasy metrics update [options] <id>
ArgumentDescription
idrequiredStable opaque metric id (met_…) or the metric's name.
OptionDescription
--folder <value>optionalOptional folder name grouping items in the dashboard. Alphanumeric, _ or - (no /). Part of the SDK lookup key (<folder>/<name>).
--event-name <value>optionalSource event the query reads from.
--query <value>optionalMetric query DSL string, e.g. sum(purchase, amount). The alternative to query_ir. Every label the query references — in filters, the value position, by (…), or without (…) — must exist as a property on the tracked event's payload; a query over a label the event never carries validates fine but returns empty results.
--winsorize-pct <value>optionalWinsorise percentile (1–99) to clamp outliers. Defaults to 99.
--default-min-effect-of-interest <value>optionalDefault minimum effect of interest (relative, 0–1) — the smallest change in this metric worth acting on, used as the power-planning baseline. Intrinsic to the metric; an experiment overrides it per-attachment with min_effect_of_interest when a specific decision has a different cost/risk bar. null to omit.
--direction <value>optionalDesired direction of movement. higher_better (default), lower_better, or neutral (guardrail).
--unit <value>optionalDisplay unit (e.g. ms, %, $), or null when unitless.
--query-ir <value>optionalTyped query IR — the structured alternative to the query DSL string. Exactly one of query / query_ir is supplied per metric body.

shipeasy metrics archive

Archive a metric

shipeasy metrics archive [options] <id>
ArgumentDescription
idrequiredStable opaque metric id (met_…) or the metric's name.
OptionDescription
--data <value>optionalRequest body as a JSON object.

shipeasy metrics experiments

List experiments using a metric

shipeasy metrics experiments [options] <id>
ArgumentDescription
idrequiredStable opaque metric id (met_…) or the metric's name.
OptionDescription
--data <value>optionalRequest body as a JSON object.

shipeasy metrics unarchive

Unarchive a metric

shipeasy metrics unarchive [options] <id>
ArgumentDescription
idrequiredStable opaque metric id (met_…) or the metric's name.
OptionDescription
--data <value>optionalRequest body as a JSON object.

shipeasy metrics series

Get a metric's time series

shipeasy metrics series [options] <id>
ArgumentDescription
idrequiredStable opaque metric id (met_…).
OptionDescription
--from <value>optionalWindow start, epoch seconds (inclusive).
--to <value>optionalWindow end, epoch seconds (exclusive). Must be greater than from.
--bucket <value>optionalBucket width in seconds (60s–86400s/1d). Defaults to 3600 (hourly). Each returned point is floor-aligned to this width.

shipeasy metrics grammar

Print the metric query DSL grammar

shipeasy metrics grammar [options]

shipeasy ops

Operational queue: the unified table of bug reports, feature requests, and auto-filed error/alert tickets, all over /api/admin/ops.

shipeasy ops [options] [command]

shipeasy ops agents

Connected AI agents — one per authenticated trigger connector (Claude / Cursor / Copilot / Jules).

shipeasy ops agents [options] [command]

shipeasy ops agents list

List connected AI agents

shipeasy ops agents list [options]
OptionDescription
--data <value>optionalRequest body as a JSON object.

shipeasy ops alerts

Alert rules: the metric-threshold definitions the analysis cron evaluates each run.

shipeasy ops alerts [options] [command]

shipeasy ops alerts channels

List Slack channels

shipeasy ops alerts channels [options]
OptionDescription
--data <value>optionalRequest body as a JSON object.

shipeasy ops alerts list

List alert rules

shipeasy ops alerts list [options]
OptionDescription
--q <value>optionalCase-insensitive substring filter across the resource's human-readable text columns (e.g. name, title, description). OR-matched across those columns; omit to return everything.
--data <value>optionalRequest body as a JSON object.

shipeasy ops alerts create

Create an alert rule

shipeasy ops alerts create [options]
OptionDescription
--name <value>optionalHuman label for the rule, shown on the alert and the rules list.
--metric-id <value>optionalId of the metric to evaluate.
--comparator <value>optionalHow the metric value is compared to the threshold (gt/gte/lt/lte).
--threshold <value>optionalThreshold the metric value is compared against.
--window-hours <value>optionalLookback window (hours) the metric is aggregated over. 1–720.
--severity <value>optionalSeverity of the raised alert.
--enabled <value>optionalWhether the rule is evaluated by the cron.
--notify <value>optionalDelivery target for a notification; null = use the project default.

shipeasy ops alerts update

Update an alert rule

shipeasy ops alerts update [options] <id>
ArgumentDescription
idrequiredStable opaque alert-rule id (ar_…) or the rule's name.
OptionDescription
--name <value>optional
--comparator <value>optional
--threshold <value>optional
--window-hours <value>optional
--severity <value>optional
--enabled <value>optional
--notify <value>optionalDelivery target for a notification; null = use the project default.

shipeasy ops alerts archive

Delete an alert rule

shipeasy ops alerts archive [options] <id>
ArgumentDescription
idrequiredStable opaque alert-rule id (ar_…) or the rule's name.
OptionDescription
--data <value>optionalRequest body as a JSON object.

shipeasy ops comments

Comments on a queue item — the discussion thread that hangs off any bug, feature request, or auto-filed error/alert ticket.

shipeasy ops comments [options] [command]

shipeasy ops comments list

List an item's comments

shipeasy ops comments list [options] <handle>
ArgumentDescription
handlerequiredPer-project item number (e.g. 7) or the full ops item id.
OptionDescription
--data <value>optionalRequest body as a JSON object.

shipeasy ops comments create

Comment on an item

shipeasy ops comments create [options] <handle>
ArgumentDescription
handlerequiredPer-project item number (e.g. 7) or the full ops item id.
OptionDescription
--body <value>optionalThe comment body as markdown. Mentions (@teammate, @shipeasy) are parsed from it.
--parent-id <value>optionalReply under this top-level comment. Omit / null for a top-level comment. Replying to a reply attaches to the same top-level parent (threading is one level deep).

shipeasy ops fired-alerts

Fired alerts: the conditions the platform has actually raised — metric-rule crossings, armed kill switches, experiment SRM/peek guards, and guardrail breaches.

shipeasy ops fired-alerts [options] [command]

shipeasy ops fired-alerts list

List fired alerts

shipeasy ops fired-alerts list [options]
OptionDescription
--status <value>optionalFilter by lifecycle state. Defaults to active (currently firing); all returns every status.
--data <value>optionalRequest body as a JSON object.

shipeasy ops fired-alerts update

Update a fired alert

shipeasy ops fired-alerts update [options] <id>
ArgumentDescription
idrequiredStable opaque alert id (al_…).
OptionDescription
--status <value>optionalNew lifecycle state. resolved / dismissed stamp their timestamp; active re-opens and clears both.
--assignee-id <value>optionalPERSON owner — a users.id, or null to clear the assignment.
--agent <value>optionalAGENT owner — a connected trigger connector's id (connectors.id), the built-in "jarvis" (Enterprise plan only — rejected with 403 otherwise), or null to clear. Stored in assigneeConnectorId or assigneeAgent depending on the value; the two are mutually exclusive.

shipeasy ops investigations

Investigation records on a queue item — the structured, read-only write-ups an AI agent produces while working it (findings / a blocking question / QA notes), plus the working run rows an ack or an AI hand-off opens.

shipeasy ops investigations [options] [command]

shipeasy ops investigations list

List an item's investigation records

shipeasy ops investigations list [options] <handle>
ArgumentDescription
handlerequiredPer-project item number (e.g. 7) or the full ops item id.
OptionDescription
--data <value>optionalRequest body as a JSON object.

shipeasy ops investigations create

Record an investigation

shipeasy ops investigations create [options] <handle>
ArgumentDescription
handlerequiredPer-project item number (e.g. 7) or the full ops item id.
OptionDescription
--kind <value>optionalWhich lifecycle stage the record documents.
--summary <value>optionalOne-line summary of the record.
--findings <value>optionalThe full findings write-up (markdown).
--question <value>optionalA blocking question for the team (markdown).
--qa-notes <value>optionalHow to verify the fix — QA notes (markdown).
--agent <value>optionalThe agent type producing the record — pass your own type when you are a coding agent.
--model <value>optionalThe model the agent ran on.
--connector-id <value>optionalThe trigger-connector row id the agent ran through.
--pr-number <value>optionalA PR the record references.
--pr-url <value>optionalHTML URL of that PR.
--sources <value>optionalThe files/links inspected.
--confidence <value>optionalSelf-reported confidence in the record.
--tokens-used <value>optionalTokens the run consumed.
--duration-ms <value>optionalRun duration in milliseconds.
--visibility <value>optionalRecord visibility. Defaults to published; draft keeps it out of the panel.
--started-at <value>optionalISO-8601 timestamp the work started.
--completed-at <value>optionalISO-8601 timestamp the work finished.
--session-id <value>optionalThe agent-run session id, so the dashboard can deep-link to the run.

shipeasy ops investigations update

Update an investigation record

shipeasy ops investigations update [options] <handle> <investigationId>
ArgumentDescription
handlerequiredPer-project item number (e.g. 7) or the full ops item id.
investigationIdrequiredThe investigation record id (from POST/GET .../investigation or the runId an ack/launch returned).
OptionDescription
--kind <value>optionalReclassify the record's lifecycle stage (e.g. flip a working run into investigated once findings land).
--summary <value>optionalOne-line summary of the record.
--findings <value>optionalThe full findings write-up (markdown).
--question <value>optionalA blocking question for the team (markdown).
--qa-notes <value>optionalHow to verify the fix — QA notes (markdown).
--model <value>optionalThe model the agent ran on.
--pr-number <value>optionalA PR the record references.
--pr-url <value>optionalHTML URL of that PR.
--sources <value>optionalThe files/links inspected.
--confidence <value>optionalSelf-reported confidence in the record.
--tokens-used <value>optionalTokens the run consumed.
--duration-ms <value>optionalRun duration in milliseconds.
--visibility <value>optionalRecord visibility. draft keeps it out of the panel; published surfaces it.
--completed-at <value>optionalISO-8601 timestamp the work finished. Set it (or flip kind off working) to mark a run record done.
--session-id <value>optionalThe agent-run session id, so the dashboard can deep-link to the run.

shipeasy ops trigger

Recurring coding-agent triggers: the scheduled, unattended runs that burn down the ops queue in --pr mode (one PR per fixed item; nothing auto-merges).

shipeasy ops trigger [options] [command]

shipeasy ops trigger create

Create a recurring coding-agent trigger

shipeasy ops trigger create [options] [command] [provider]
ArgumentDescription
provideroptionalOne of the subcommands below.
shipeasy ops trigger create claude

Register a Claude Code scheduled routine as the trigger connector

shipeasy ops trigger create claude [options]
OptionDescription
--name <value>optionalHuman-readable connector label.
--events <value>optionalEvents that auto-fire the routine. Defaults to empty so the trigger does not auto-fire paid runs until events are subscribed.
--config <value>optionalNon-secret config for a Claude trigger.
--token <value>optionalThe routine's fire bearer token (secret). Optional — a tokenless trigger is recorded but not fireable until a token is added later. Encrypted into the credentials cipher; never persisted in config or returned.
--enabled <value>optionalWhether the trigger is active on create.
shipeasy ops trigger create cursor

Register a Cursor cloud-agent trigger (cold-fire; Shipeasy launches the run)

shipeasy ops trigger create cursor [options]
OptionDescription
--name <value>optionalHuman-readable connector label.
--events <value>optionalEvents that auto-fire a cold cloud-agent run. Defaults to empty.
--config <value>optionalNon-secret config for a Cursor trigger.
--api-key <value>optionalCursor API key that launches the run (secret). Encrypted into the credentials cipher; never returned.
--ops-key <value>optionalRestricted Shipeasy ops key, injected into the run as SHIPEASY_CLI_TOKEN via the launch envVars (secret). Encrypted; never returned.
--enabled <value>optionalWhether the trigger is active on create.
shipeasy ops trigger create copilot

Register a GitHub Copilot cloud-agent trigger

shipeasy ops trigger create copilot [options]
OptionDescription
--name <value>optionalHuman-readable connector label.
--events <value>optionalEvents that auto-fire a Copilot agent task. Defaults to empty.
--config <value>optionalNon-secret config for a Copilot trigger.
--token <value>optionalCopilot-licensed user PAT (secret). The ops key lives in the repo's GitHub "Agents" secret store and is never sent through Shipeasy. Encrypted; never returned.
--enabled <value>optionalWhether the trigger is active on create.
shipeasy ops trigger create jules

Register a Google Jules (Gemini) trigger

shipeasy ops trigger create jules [options]
OptionDescription
--name <value>optionalHuman-readable connector label.
--events <value>optionalEvents that auto-fire a Jules session. Defaults to empty.
--config <value>optionalNon-secret config for a Jules trigger.
--api-key <value>optionalJules API key that launches the session (secret). Encrypted into the credentials cipher; never returned.
--ops-key <value>optionalRestricted Shipeasy ops key, embedded in the prompt (Jules exposes no env channel) (secret). Encrypted; never returned.
--enabled <value>optionalWhether the trigger is active on create.

shipeasy ops trigger prep

Mint the ops key + emit the RemoteTrigger create body for the agent to run

Does the Shipeasy-side prep for a recurring trigger and emits the exact RemoteTrigger create body. It mints a restricted ops key (embedded in the routine prompt — the only hands-off channel, since routine env vars are UI-only), resolves the repo (origin remote) and cron (--frequency), and writes the body to a 0600 temp file (the key is never printed). It does NOT create the routine — the agent does, via the in-process RemoteTrigger tool, because the routines API token is not exposed to a standalone CLI.

shipeasy ops trigger prep [options]
OptionDescription
--frequency <v>optionalSchedule: 4h | 6h | daily | weekdays | weekly | <raw 5-field cron> (default: "4h")
--repo <url>optionalGitHub repo the routine checks out (default: origin remote)
--model <id>optionalModel for the cloud session (default: "claude-sonnet-4-6")
--name <name>optionalRoutine name (default: "Shipeasy ops:work")
--dry-runoptionalDon't mint the ops key or write files — just print the plan
--jsonoptionalPrint the RemoteTrigger create body as JSON to stdout (contains the key)
--project <id>optionalProject ID override

Examples:

# Every 4h against the origin repo
shipeasy ops trigger prep

# Daily, explicit repo
shipeasy ops trigger prep --frequency daily --repo https://github.com/acme/web

# Preview without minting
shipeasy ops trigger prep --dry-run

# Emit body as JSON (for scripting)
shipeasy ops trigger prep --json

shipeasy ops list

List the operational queue

shipeasy ops list [options]
OptionDescription
--type <value>optionalFilter by item type, or all (the default). Every type a returned item can carry is filterable, including the auto-filed ones.
--status <value>optionalFilter by lifecycle status, or all (the default). The human-gated holding state (pending_approval) is excluded from all/default and returned only when requested as the exact status.
--limit <value>optionalMax items to return (1–500). Defaults to 200.
--owner <value>optionalNarrow to items owned by one person OR one agent. Matches a person by users.id, email, or display name, and an agent by connector id, display name, or kebab-case handle — e.g. owner=Claude or owner=alice@acme.dev. Case-insensitive exact match, applied over the returned page.
--data <value>optionalRequest body as a JSON object.

shipeasy ops create

File a queue item (bug or feature request) — pass --type.

shipeasy ops create [options] <title>
ArgumentDescription
titlerequiredOne-line bug title (no leading/trailing whitespace).
OptionDescription
--type <value>optionalDiscriminator — files a bug.
--steps-to-reproduce <value>optionalHow to reproduce the bug.
--actual-result <value>optionalWhat actually happened.
--expected-result <value>optionalWhat was expected instead.
--priority <value>optionalInitial triage priority, or null.
--status <value>optionalInitial lifecycle status; defaults to open when omitted.
--assignee-id <value>optionalThe users.id of the person to assign as owner at creation, or null.
--subscribers <value>optionalEmails of teammates to subscribe to this item's Slack pings at creation.
--tags <value>optionalTag names to attach at creation (get-or-created by name, deduped case-insensitively).
--reporter-email <value>optionalEmail of the reporter, or null.
--page-url <value>optionalURL of the page the bug relates to, or null.
--user-agent <value>optionalReporter's user-agent string, or null.
--viewport <value>optionalReporter's viewport (e.g. 1280x720), or null.
--context <value>optionalArbitrary capture context, or null.
--notify <value>optionalWhere this bug's completion notification lands.
--description <value>optionalWhat the feature is.
--use-case <value>optionalWhy it's needed / the use case.

shipeasy ops bug

File a bug report.

shipeasy ops bug [options] <title>
ArgumentDescription
titlerequiredOne-line bug title (no leading/trailing whitespace).
OptionDescription
--steps-to-reproduce <value>optionalHow to reproduce the bug.
--actual-result <value>optionalWhat actually happened.
--expected-result <value>optionalWhat was expected instead.
--priority <value>optionalInitial triage priority, or null.
--status <value>optionalInitial lifecycle status; defaults to open when omitted.
--assignee-id <value>optionalThe users.id of the person to assign as owner at creation, or null.
--subscribers <value>optionalEmails of teammates to subscribe to this item's Slack pings at creation.
--tags <value>optionalTag names to attach at creation (get-or-created by name, deduped case-insensitively).
--reporter-email <value>optionalEmail of the reporter, or null.
--page-url <value>optionalURL of the page the bug relates to, or null.
--user-agent <value>optionalReporter's user-agent string, or null.
--viewport <value>optionalReporter's viewport (e.g. 1280x720), or null.
--context <value>optionalArbitrary capture context, or null.
--notify <value>optionalWhere this bug's completion notification lands.

shipeasy ops feature

File a feature request.

shipeasy ops feature [options] <title>
ArgumentDescription
titlerequiredOne-line feature-request title (no leading/trailing whitespace).
OptionDescription
--description <value>optionalWhat the feature is.
--use-case <value>optionalWhy it's needed / the use case.
--priority <value>optionalInitial triage priority, or null.
--status <value>optionalInitial lifecycle status; defaults to open when omitted.
--assignee-id <value>optionalThe users.id of the person to assign as owner at creation, or null.
--subscribers <value>optionalEmails of teammates to subscribe to this item's Slack pings at creation.
--tags <value>optionalTag names to attach at creation (get-or-created by name, deduped case-insensitively).
--reporter-email <value>optionalEmail of the reporter, or null.
--page-url <value>optionalURL of the page the request relates to, or null.
--user-agent <value>optionalReporter's user-agent string, or null.
--context <value>optionalArbitrary capture context, or null.
--notify <value>optionalWhere this request's completion notification lands.

shipeasy ops get

Get one queue item

shipeasy ops get [options] <handle>
ArgumentDescription
handlerequiredPer-project item number (e.g. 7) or the full ops item id.
OptionDescription
--data <value>optionalRequest body as a JSON object.

shipeasy ops update

Update a queue item

shipeasy ops update [options] <handle>
ArgumentDescription
handlerequiredPer-project item number (e.g. 7) or the full ops item id.
OptionDescription
--title <value>optionalNew bug title (no leading/trailing whitespace).
--steps-to-reproduce <value>optionalUpdated reproduction steps.
--actual-result <value>optionalUpdated actual result.
--expected-result <value>optionalUpdated expected result.
--status <value>optionalLifecycle status of a queue item. The working flow is openin_progressready_for_qaresolved (or wont_fix, terminal from any earlier stage). blocked marks an item that can't progress until an external dependency clears — a working state a human sets and clears. ready_for_qa is what a developer sets once a fix lands; resolved is the QA sign-off, normally flipped in the dashboard after verification — set it directly from code only when the fix has been verified end-to-end. investigating_by_ai is a system-owned display state — set when the AI agent (Jarvis) picks an item up to investigate, never chosen by a human — so it is shown but not offered as a manual choice. pending_approval is the one human-gated holding state: it parks an item OUT of the work queue until a human promotes it to open in the dashboard, so GET /api/admin/ops excludes it under status=all/default and returns it only when requested as an exact status. It covers untriaged inbound that must never be auto-implemented — connector requests filed from a customer's connectors panel, and questions funnelled in from the "Stuck in onboarding?" assistant — where approving means flipping the status to open. Two earlier values were removed in favour of this single gate: triage (the onboarding-help bucket, now pending_approval) and triaged (a redundant "looked at but not started" step, now plain open).
--priority <value>optionalTriage priority, or null when not set (in an update, null clears it).
--github-pr-number <value>optionalLink (or, when null, unlink) a GitHub pull request to this bug.
--notify <value>optionalWhere this item's completion notification lands, or null.
--description <value>optionalUpdated description.
--use-case <value>optionalUpdated use case.

Link a fixing PR

shipeasy ops link-pr [options] <handle>
ArgumentDescription
handlerequiredPer-project item number (e.g. 7) or the full ops item id.
OptionDescription
--pr-number <value>optionalPR number to record on the item. null unlinks the PR.
--pr-url <value>optionalExplicit PR URL. Required for error/alert tickets (no GitHub issue to derive the URL from).

shipeasy ops ack

Ack an item (start a run)

shipeasy ops ack [options] <handle>
ArgumentDescription
handlerequiredPer-project item number (e.g. 7) or the full ops item id.
OptionDescription
--agent <value>optionalThe AI agent type acking on the item's behalf — pass your own type when you are a coding agent (Claude Code passes claude, Cursor cursor, Copilot copilot, Jules/Gemini jules). Omit entirely for a human ack by the authenticated caller.
--session-id <value>optionalThe agent-run session id (e.g. Claude's session_01…), so the dashboard can deep-link to the exact run page. Omit when the harness has no session id.

shipeasy ops notify

Raise an attention notification

shipeasy ops notify [options]
OptionDescription
--title <value>optionalOne-line headline of what's blocked.
--summary <value>optionalOne sentence: why it can't be fixed in code. Renders markdown.
--steps <value>optionalOrdered steps the human should take to unblock — self-contained (the human reads only this card, not the agent's transcript), 3–6 steps, each naming the exact file, command, env var, or dashboard page. Renders markdown.
--href <value>optionalDashboard-relative deep link to the related item. null is accepted and treated as "no link".
--dedupe-key <value>optionalStable per-escalation key (e.g. feedback:7) so re-runs dedupe to one row.

shipeasy projects

Projects: the account-level container every other resource is scoped to.

shipeasy projects [options] [command]

shipeasy projects current

Show the current project

shipeasy projects current [options]
OptionDescription
--data <value>optionalRequest body as a JSON object.

shipeasy projects upsert

Find-or-create a project by domain

shipeasy projects upsert [options]
OptionDescription
--domain <value>optionalLowercase bare hostname (e.g. acme.com, app.acme.com, *.acme.com), or * to allow any origin. Full URLs with https:// are not accepted. The project is keyed by (owner_email, domain), so a second call with the same domain returns the existing project.
--name <value>optionalHuman-readable project name. Defaults to the domain on first create.

shipeasy projects update

Update the current project

shipeasy projects update [options] <id>
ArgumentDescription
idrequiredStable opaque project id. Must match the caller's own project.
OptionDescription
--name <value>optionalNew project name.
--domain <value>optionalLowercase bare hostname (e.g. acme.com, app.acme.com, *.acme.com), or * to allow any origin. Full URLs with https:// are not accepted. The project is keyed by (owner_email, domain), so a second call with the same domain returns the existing project.
--slug <value>optionalURL-safe identifier used in app URLs and SDK config. Lowercase letters, numbers, and hyphens; 2–48 chars; cannot start or end with a hyphen. The caller lowercases the raw slug before sending.
--default-env <value>optionalDefault environment new resources are scoped to.
--timezone <value>optionalIANA timezone the project's daily analysis runs in.
--stat-method <value>optionalStatistical method the experiment analyzer uses.
--sig-threshold <value>optionalSignificance threshold (alpha) for experiment analysis.
--auto-rollback <value>optionalWhether a failing guardrail auto-rolls back the experiment.
--min-sample-days <value>optionalMinimum number of days an experiment must run before it can be called.
--module-translations <value>optionalEnable/disable the i18n/translations module.
--module-configs <value>optionalEnable/disable the dynamic-configs module.
--module-gates <value>optionalEnable/disable the feature-gates module.
--module-experiments <value>optionalEnable/disable the experiments module.
--module-feedback <value>optionalEnable/disable the feedback/ops module.
--module-user <value>optionalEnable/disable the user-management module.
--module-events <value>optionalEnable/disable the events module.
--min-sample-size <value>optionalVerdict power guard — minimum users per arm before a ship/hold verdict.
--min-runtime-days <value>optionalMinimum days an experiment must run before a verdict (peeking guard).
--default-power <value>optionalTarget statistical power (1−β) feeding the realized-MDE calculation.
--ci-confidence <value>optionalConfidence level for the interval surfaced on results (any value in [0.5, 0.999], e.g. 0.90, 0.95, 0.975, 0.99).
--default-allocation-pct <value>optionalDefault traffic allocation (basis points, 1000 = 10%) new experiments start with; overridable per experiment.
--default-holdout <value>optionalDefault holdout carve-out (basis points) that seeds each new universe's holdout (0 = none).
--default-winsorize-pct <value>optionalDefault winsorization percentile new metrics start with; overridable per metric.
--default-mei <value>optionalDefault minimum effect of interest (relative, 0–1) new metrics start with; overridable per metric and per experiment. Null clears it.
--cuped-baseline-days <value>optionalCUPED baseline window — days of pre-experiment history, frozen at start.
--cuped-min-overlap <value>optionalCUPED selection-bias guard — min share of users with a baseline, else skip.
--cuped-min-baseline-users <value>optionalCUPED — minimum users with a baseline before it runs at all.
--msprt-tau-mei-factor <value>optionalmSPRT prior width — τ = minimum effect of interest × this factor.
--msprt-tau-sd-factor <value>optionalmSPRT fallback prior width — τ = this × control SD when no MEI is set.
--srm-threshold <value>optionalSRM chi-square p-value below which the run is called invalid.
--error-autoclose-days <value>optionalDays an open tracked error may go unseen before the nightly sweep auto-resolves it. 0 disables auto-close for this project.
--error-ticket-min-occurrences <value>optionalOccurrence count a tracked error must cross before an error ticket is auto-filed into the ops queue. Requires a paid plan — the request is rejected with 403 on a plan without the ops_auto_error_issues entitlement.

shipeasy release

Feature delivery — flags, kill switches, dynamic configs, A/B experiments, and the universes they bucket in.

shipeasy release [options] [command]

shipeasy release configs

Dynamic configs: JSON-Schema-validated structured values delivered to SDKs and editable per environment with a draft/publish workflow.

shipeasy release configs [options] [command]

shipeasy release configs list

List dynamic configs

shipeasy release configs list [options]
OptionDescription
--limit <value>optionalPage size (1–500). Defaults to 100.
--cursor <value>optionalOpaque cursor returned in the previous page's next_cursor. Omit for the first page.
--q <value>optionalCase-insensitive substring filter across the resource's human-readable text columns (e.g. name, title, description). OR-matched across those columns; omit to return everything.
--data <value>optionalRequest body as a JSON object.

shipeasy release configs create

Create a dynamic config

shipeasy release configs create [options] <name>
ArgumentDescription
namerequiredStable config/killswitch key in folder.name form (two lowercase segments separated by a dot, e.g. pricing.tiers). Immutable after create.
OptionDescription
--description <value>optionalOptional free-form description shown in the dashboard. Max 512 chars.
--folder <value>optionalOptional folder name grouping items in the dashboard. Alphanumeric, _ or - (no /). Part of the SDK lookup key (<folder>/<name>).
--schema <value>optionalJSON Schema (draft 2020-12) describing the shape of the config value. Top-level type must be 'object'; every published value is validated against this schema.
--value <value>optionalInitial config value. Either a single JSON object applied to every env, or a { env: value } map seeding per-env values. Must match schema. Defaults to {} on every env when omitted.
--dev <value>optionalSeed the dev env's initial value (version 1), overriding value for dev. Published immediately. Must match schema.
--staging <value>optionalSeed the staging env's initial value (version 1), overriding value for staging. Published immediately. Must match schema.
--prod <value>optionalSeed the prod env's initial value (version 1), overriding value for prod. Published immediately. Must match schema.

shipeasy release configs get

Get one config

shipeasy release configs get [options] <id>
ArgumentDescription
idrequiredStable opaque config id (cfg_…) or the config's name.
OptionDescription
--data <value>optionalRequest body as a JSON object.

shipeasy release configs update

Update a dynamic config

shipeasy release configs update [options] <id>
ArgumentDescription
idrequiredStable opaque config id (cfg_…) or the config's name.
OptionDescription
--schema <value>optionalReplacement schema. When supplied, the new schema is validated against every published value before it lands.
--value <value>optionalFlat value applied to every env. Publishes a new version per env. To publish one env only, pass that env's key (dev/staging/prod) instead.
--dev <value>optionalPublish a new version to the dev env only, immediately (no draft). Overrides value for dev. Must match the effective schema.
--staging <value>optionalPublish a new version to the staging env only, immediately (no draft). Overrides value for staging. Must match the effective schema.
--prod <value>optionalPublish a new version to the prod env only, immediately (no draft). Overrides value for prod. Must match the effective schema.
--folder <value>optionalOptional folder name grouping items in the dashboard. Alphanumeric, _ or - (no /). Part of the SDK lookup key (<folder>/<name>).

shipeasy release configs archive

Delete a dynamic config

shipeasy release configs archive [options] <id>
ArgumentDescription
idrequiredStable opaque config id (cfg_…) or the config's name.
OptionDescription
--data <value>optionalRequest body as a JSON object.

shipeasy release configs update-schema

Update a config schema

shipeasy release configs update-schema [options] <id>
ArgumentDescription
idrequiredStable opaque config id (cfg_…) or the config's name.
OptionDescription
--schema <value>optionalReplacement JSON Schema (draft 2020-12). Validated against every published value before it lands.

shipeasy release experiments

A/B/n experiments: randomised group assignment plus the analysis pipeline (t-test, sequential testing, SRM detection) on top of a universe.

shipeasy release experiments [options] [command]

shipeasy release experiments universes

Universes: the shared bucketing space all experiments draw from.

shipeasy release experiments universes [options] [command]
shipeasy release experiments universes list

List universes

shipeasy release experiments universes list [options]
OptionDescription
--limit <value>optionalPage size (1–500). Defaults to 100.
--cursor <value>optionalOpaque cursor returned in the previous page's next_cursor. Omit for the first page.
--q <value>optionalCase-insensitive substring filter across the resource's human-readable text columns (e.g. name, title, description). OR-matched across those columns; omit to return everything.
--data <value>optionalRequest body as a JSON object.
shipeasy release experiments universes create

Create a universe

shipeasy release experiments universes create [options] <name>
ArgumentDescription
namerequiredStable universe key. Single segment or folder.name. Lowercase letters, digits, _ or -; max 128 chars. Immutable after create.
OptionDescription
--folder <value>optionalOptional folder name grouping items in the dashboard. Alphanumeric, _ or - (no /). Part of the SDK lookup key (<folder>/<name>).
--description <value>optionalHuman-readable blurb shown in the universe picker/hovercard.
--unit-type <value>optionalUnit of randomisation. Typically user_id. Use account_id to keep whole accounts in the same group across an experiment.
--holdout-range <value>optionalInclusive [lo, hi] bucket range (0–9999) reserved as the holdout — callers hashed into this slice are excluded from every experiment in the universe. null disables the holdout. Pro plan or higher required.
--recommended-headroom <value>optionalBasis points of reserved headroom seeded into each new experiment created in this universe (0 = none). Lets variants be appended into a running experiment without reshuffling.
--param-schema <value>optionalThe universe-owned config schema — an ordered { name, type, default }[]. Experiments may only override values per variant, never add fields. null starts an empty schema.
shipeasy release experiments universes update

Update a universe

shipeasy release experiments universes update [options] <id>
ArgumentDescription
idrequiredStable opaque universe id (uni_…) or the universe's name.
OptionDescription
--folder <value>optionalOptional folder name grouping items in the dashboard. Alphanumeric, _ or - (no /). Part of the SDK lookup key (<folder>/<name>).
--description <value>optionalHuman-readable blurb shown in the universe picker/hovercard.
--holdout-range <value>optionalInclusive [lo, hi] bucket range (0–9999) reserved as the holdout — callers hashed into this slice are excluded from every experiment in the universe. null disables the holdout. Pro plan or higher required.
--recommended-headroom <value>optionalBasis points of reserved headroom seeded into new experiments in this universe.
--param-schema <value>optionalReplace the universe config schema. Additive changes + default edits are always allowed; removing a param a running experiment overrides is rejected (deprecate-only).
shipeasy release experiments universes archive

Delete a universe

shipeasy release experiments universes archive [options] <id>
ArgumentDescription
idrequiredStable opaque universe id (uni_…) or the universe's name.
OptionDescription
--data <value>optionalRequest body as a JSON object.

shipeasy release experiments list

List experiments

shipeasy release experiments list [options]
OptionDescription
--limit <value>optionalPage size (1–500). Defaults to 100.
--cursor <value>optionalOpaque cursor returned in the previous page's next_cursor. Omit for the first page.
--status <value>optionalFilter by lifecycle status. Pass archived to return the archive tab; any other value (or omitting it) returns the non-archived experiments.
--q <value>optionalCase-insensitive substring filter across the resource's human-readable text columns (e.g. name, title, description). OR-matched across those columns; omit to return everything.
--data <value>optionalRequest body as a JSON object.

shipeasy release experiments create

Create an experiment

shipeasy release experiments create [options] <name>
ArgumentDescription
namerequiredStable experiment key. Single segment or folder.name (a-z, 0-9, _/-; max 128 chars). Used by SDKs as Shipeasy.getExperiment(user, '<name>'). Immutable after create.
OptionDescription
--description <value>optionalFree-form description. Max 2000 chars, markdown rendered in the dashboard.
--hypothesis <value>optionalHypothesis statement shown in the editor. Display-only.
--tag <value>optionalShort tag chip rendered next to the name. Display-only.
--owner-email <value>optionalOwner email. Display-only.
--audience <value>optionalAudience label shown in the editor. Display-only.
--bucket-by <value>optional
--folder <value>optionalOptional folder name grouping items in the dashboard. Alphanumeric, _ or - (no /). Part of the SDK lookup key (<folder>/<name>).
--universe <value>optionalName of an existing universe in the project. Returns 422 if the universe doesn't exist.
--targeting-gate <value>optionalOptional gate name (a targeting-type flag). Only callers that pass the gate are enrolled in the experiment.
--holdout-gate <value>optionalOptional per-experiment holdout gate — the name of a holdout-type flag (public % + whitelist). A caller the flag passes is held out (never assigned, sees the universe defaults). Distinct from the universe-level holdout.
--allocation-pct <value>optionalShare of the (gated) audience allocated to the experiment, in basis points (0–10000 = 0%–100%). 0 = unallocated. Under pooled assignment this is the size of the universe-pool slice claimed. Use allocation_percent (0–100) below to think in percent. Immutable while the experiment is running.
--allocation-percent <value>optionalAllocation as a percentage (0–100, fractional ok). Friendlier alias for allocation_pct; converted to basis points server-side (e.g. 50 = 5000 bp). If both are set, allocation_percent wins.
--reserved-headroom <value>optionalBasis points of this experiment's split kept empty (0–10000) so a new variant can be appended into it while running without reshuffling. Group weights must sum to 10000 − reserved_headroom. Defaults to the universe's recommended_headroom when omitted.
--salt <value>optionalHash salt for bucketing. Auto-generated if omitted. Immutable while running.
--params <value>optionalDeprecated — the universe now owns the config schema (param_schema). Retained for back-compat; new experiments should leave this empty and declare params on the universe. Map of param-name → scalar type.
--groups <value>optionalTwo or more variants. Weights must sum to 10000 − reserved_headroom. Existing weights are immutable while running, but a new variant may be appended into the reserved tail.
--significance-threshold <value>optionalp-value cutoff used by the analysis pass. Defaults to 0.05. Values other than 0.05 require Pro plan or higher.
--min-runtime-days <value>optionalMinimum days the experiment must run before results are considered conclusive.
--min-sample-size <value>optionalMinimum exposures per group before results are considered conclusive.
--sequential-testing <value>optionalEnable sequential testing (always-valid p-values). Requires Premium plan or higher.
--goal-metric <value>optionalInline metric — a DSL query, or an event (+ aggregation/value) the server compiles into one.
--guardrail-metrics <value>optionalUp to 10 guardrail metrics defined inline. Each is upserted (event + metric) and attached with role=guardrail.

shipeasy release experiments get

Get one experiment

shipeasy release experiments get [options] <id>
ArgumentDescription
idrequiredStable opaque experiment id (exp_…) or the experiment's name.
OptionDescription
--data <value>optionalRequest body as a JSON object.

shipeasy release experiments update

Update an experiment

shipeasy release experiments update [options] <id>
ArgumentDescription
idrequiredStable opaque experiment id (exp_…) or the experiment's name.
OptionDescription
--name <value>optionalStable experiment key. Single segment or folder.name (a-z, 0-9, _/-; max 128 chars). Used by SDKs as Shipeasy.getExperiment(user, '<name>'). Immutable after create.
--description <value>optional
--hypothesis <value>optional
--tag <value>optional
--owner-email <value>optional
--audience <value>optional
--bucket-by <value>optional
--folder <value>optionalOptional folder name grouping items in the dashboard. Alphanumeric, _ or - (no /). Part of the SDK lookup key (<folder>/<name>).
--targeting-gate <value>optional
--holdout-gate <value>optionalPer-experiment holdout gate — the name of a holdout-type flag, or null to clear. A caller the flag passes is held out.
--allocation-pct <value>optionalBasis-points allocation (0–10000). Use allocation_percent (0–100) for percent. Immutable while the experiment is running.
--reserved-headroom <value>optionalBasis points of the split kept empty for appended variants. Group weights must sum to 10000 − reserved_headroom. May be shrunk (never grown into existing weights) while running when appending a variant.
--allocation-percent <value>optionalAllocation as a percentage (0–100). Friendlier alias for allocation_pct; converted to basis points server-side. Wins over allocation_pct if both are supplied. Immutable while running.
--salt <value>optionalHash salt. Immutable while running.
--universe <value>optionalNew universe name. Immutable while running. Returns 422 if the universe doesn't exist.
--params <value>optionalDeprecated — the universe owns the config schema (param_schema). Retained for back-compat. Map of param-name → scalar type.
--groups <value>optionalReplacement groups. Weights must sum to 10000 − reserved_headroom. Existing weights/values are immutable while running; a new variant may be appended into the reserved tail.
--significance-threshold <value>optional
--min-runtime-days <value>optional
--min-sample-size <value>optional
--sequential-testing <value>optional
--goal-metric <value>optionalInline metric — a DSL query, or an event (+ aggregation/value) the server compiles into one.
--guardrail-metrics <value>optionalReplaces the guardrail set wholesale (event auto-upserted per entry).

shipeasy release experiments archive

Delete an experiment

shipeasy release experiments archive [options] <id>
ArgumentDescription
idrequiredStable opaque experiment id (exp_…) or the experiment's name.
OptionDescription
--data <value>optionalRequest body as a JSON object.

shipeasy release experiments start

Start an experiment (draft → running)

shipeasy release experiments start [options] <id>
ArgumentDescription
idrequiredStable opaque experiment id (exp_…) or the experiment's name.

shipeasy release experiments stop

Stop a running experiment

shipeasy release experiments stop [options] <id>
ArgumentDescription
idrequiredStable opaque experiment id (exp_…) or the experiment's name.

shipeasy release experiments restore

Restore an archived experiment (→ draft)

shipeasy release experiments restore [options] <id>
ArgumentDescription
idrequiredStable opaque experiment id (exp_…) or the experiment's name.

shipeasy release experiments set-metrics

Attach metrics

shipeasy release experiments set-metrics [options] <id>
ArgumentDescription
idrequiredStable opaque experiment id (exp_…) or the experiment's name.
OptionDescription
--metrics <value>optionalReplacement metrics list — replaces the current attachments wholesale.

shipeasy release experiments results

Get analysis results

shipeasy release experiments results [options] <id>
ArgumentDescription
idrequiredStable opaque experiment id (exp_…) or the experiment's name.
OptionDescription
--data <value>optionalRequest body as a JSON object.

shipeasy release experiments timeseries

Get analysis timeseries

shipeasy release experiments timeseries [options] <id>
ArgumentDescription
idrequiredStable opaque experiment id (exp_…) or the experiment's name.
OptionDescription
--metric <value>optionalOptional metric name to filter the series.
--data <value>optionalRequest body as a JSON object.

shipeasy release experiments reanalyze

Re-queue analysis

shipeasy release experiments reanalyze [options] <id>
ArgumentDescription
idrequiredStable opaque experiment id (exp_…) or the experiment's name.
OptionDescription
--data <value>optionalRequest body as a JSON object.

shipeasy release experiments readout-create

Mint a readout snapshot

shipeasy release experiments readout-create [options] <id>
ArgumentDescription
idrequiredStable opaque experiment id (exp_…) or the experiment's name.
OptionDescription
--kind <value>optionalWhy the snapshot is being minted — manual ("Share readout"), or automatically on ship / stop.
--acknowledged-caveat-ids <value>optionalIds of the open caveats the caller ticked (decision-gating acknowledgment). Unlisted caveats are stored as unacknowledged.
--require-all-acknowledged <value>optionalWhen true, refuse (422) to mint while any open caveat is not listed in acknowledgedCaveatIds — server-side ship gating.

shipeasy release experiments readout-get

Get a readout snapshot

shipeasy release experiments readout-get [options] <id> <readoutId>
ArgumentDescription
idrequiredStable opaque experiment id (exp_…) or the experiment's name.
readoutIdrequiredReadout snapshot id, as returned by createExperimentReadout.
OptionDescription
--data <value>optionalRequest body as a JSON object.

shipeasy release flags

Feature gates: boolean flags evaluated at runtime against project rules + a percentage rollout.

shipeasy release flags [options] [command]

shipeasy release flags attributes

Targeting attributes: the auto-inferred schema of user-context keys the platform has observed in evaluation calls.

shipeasy release flags attributes [options] [command]
shipeasy release flags attributes list

List targeting attributes

shipeasy release flags attributes list [options]
OptionDescription
--q <value>optionalCase-insensitive substring filter across the resource's human-readable text columns (e.g. name, title, description). OR-matched across those columns; omit to return everything.
--data <value>optionalRequest body as a JSON object.
shipeasy release flags attributes create

Declare a targeting attribute

shipeasy release flags attributes create [options] <name>
ArgumentDescription
namerequiredAttribute key (lowercase alphanumeric start, then letters/digits/_/-; max 64 chars). Immutable after create.
OptionDescription
--type <value>optionalDeclared value type of a targeting attribute.
--enum-values <value>optionalAllowed values when type is enum (required in that case — 422 otherwise); null for non-enum types.
--required <value>optionalWhether the attribute must be present on the evaluation context.
--description <value>optionalOptional human note shown in the dashboard.
--sdk-path <value>optionalOptional dotted path the SDK reads the value from.
shipeasy release flags attributes get

Get a targeting attribute

shipeasy release flags attributes get [options] <id>
ArgumentDescription
idrequiredThe attribute id.
OptionDescription
--data <value>optionalRequest body as a JSON object.
shipeasy release flags attributes update

Update a targeting attribute

shipeasy release flags attributes update [options] <id>
ArgumentDescription
idrequiredThe attribute id.
OptionDescription
--type <value>optionalDeclared value type of a targeting attribute.
--enum-values <value>optionalReplacement allowed values (for enum), or null to clear.
--required <value>optionalWhether the attribute must be present on the evaluation context.
--description <value>optionalOptional human note shown in the dashboard.
--sdk-path <value>optionalOptional dotted path the SDK reads the value from.
shipeasy release flags attributes archive

Archive a targeting attribute

shipeasy release flags attributes archive [options] <id>
ArgumentDescription
idrequiredThe attribute id.
OptionDescription
--data <value>optionalRequest body as a JSON object.

shipeasy release flags templates

Targeting-rule templates: reusable { attr, op, value } rule definitions (country, email-domain, region presets, …).

shipeasy release flags templates [options] [command]
shipeasy release flags templates list

List gate templates

shipeasy release flags templates list [options]
OptionDescription
--q <value>optionalCase-insensitive substring filter across the resource's human-readable text columns (e.g. name, title, description). OR-matched across those columns; omit to return everything.
--query <value>optionalDeprecated alias for q, kept working for one release. Prefer q.
--data <value>optionalRequest body as a JSON object.
shipeasy release flags templates create

Create a gate template

shipeasy release flags templates create [options] <name>
ArgumentDescription
namerequiredHuman label. Unique per project.
OptionDescription
--description <value>optionalOne-liner shown in pickers and matched by the list query filter.
--category <value>optional
--icon-key <value>optionalDisplay-only icon hint.
--auto <value>optionalMark the attribute as request-derived (resolved at the SDK edge).
--rules <value>optionalThe rule definition captured by the template.
shipeasy release flags templates get

Get one gate template

shipeasy release flags templates get [options] <id>
ArgumentDescription
idrequiredBuilt-in slug (country) or customer template id (gtpl_…).
OptionDescription
--data <value>optionalRequest body as a JSON object.
shipeasy release flags templates update

Update a gate template

shipeasy release flags templates update [options] <id>
ArgumentDescription
idrequiredCustomer template id (gtpl_…) or its name.
OptionDescription
--name <value>optional
--description <value>optional
--category <value>optional
--icon-key <value>optional
--auto <value>optional
--rules <value>optional
shipeasy release flags templates archive

Delete a gate template

shipeasy release flags templates archive [options] <id>
ArgumentDescription
idrequiredCustomer template id (gtpl_…) or its name.
OptionDescription
--data <value>optionalRequest body as a JSON object.

shipeasy release flags list

List feature gates

shipeasy release flags list [options]
OptionDescription
--limit <value>optionalPage size (1–500). Defaults to 100.
--cursor <value>optionalOpaque cursor returned in the previous page's next_cursor. Omit for the first page.
--q <value>optionalCase-insensitive substring filter across the resource's human-readable text columns (e.g. name, title, description). OR-matched across those columns; omit to return everything.
--data <value>optionalRequest body as a JSON object.

shipeasy release flags create

Create a feature gate

shipeasy release flags create [options] <name>
ArgumentDescription
namerequiredStable gate key used by SDKs (Shipeasy.checkGate(user, '<name>')). Single segment or folder.name. Lowercase letters, digits, _ or -; max 128 chars. Immutable after create — rename = delete + recreate.
OptionDescription
--type <value>optionalGate kind. targeting (default) is a normal flag with the full builder. holdout is a restricted flag — only a public rollout % and a whitelist are allowed; attribute rules and a gatekeeper stack are rejected. Used as an experiment's holdout_gate.
--enabled <value>optionalMaster switch. Defaults to true. Set false to create the gate disabled (evaluates to false regardless of rules/rollout); flip on via POST /{id}/enable or PATCH.
--rollout-pct <value>optionalInitial rollout in basis points (0–10000 = 0%–100%) — 100 here means 1%, not 100%. Use rollout_percent (0–100) below if you'd rather think in percent. Use 0 to create the gate dark and ramp via PATCH after deploy validation.
--rollout-percent <value>optionalInitial rollout as a percentage (0–100, fractional ok). Friendlier alias for rollout_pct; converted internally to basis points (e.g. 100 here = 10000 bp = 100%). If both rollout_pct and rollout_percent are set, rollout_percent wins.
--rules <value>optionalTargeting predicates. AND-combined. If non-empty, the gate returns true only for callers that satisfy every rule and fall under rollout_pct.
--salt <value>optionalHash salt for percentage bucketing. Auto-generated if omitted. Provide explicitly to keep a gate's buckets stable across delete/recreate. Immutable after create — there is no PATCH for salt because changing it would re-bucket every caller.
--stack <value>optionalOptional gatekeeper stack. When provided, takes precedence over rules + rollout_pct at evaluation time. Omit (or pass null) for a flat gate.
--title <value>optionalHuman-readable title shown in the dashboard. Free-form, no key format constraint.
--description <value>optionalLong-form description / runbook. Markdown is rendered in the dashboard.
--folder <value>optionalOptional folder name grouping items in the dashboard. Alphanumeric, _ or - (no /). Part of the SDK lookup key (<folder>/<name>).
--group <value>optionalGroup label for dashboard organisation (e.g. team or product area).
--owner-email <value>optionalOwner contact. Displayed verbatim; not used for auth.

shipeasy release flags get

Get one gate

shipeasy release flags get [options] <id>
ArgumentDescription
idrequiredStable opaque gate id (gat_…) or the gate's name.
OptionDescription
--data <value>optionalRequest body as a JSON object.

shipeasy release flags update

Update a feature gate

shipeasy release flags update [options] <id>
ArgumentDescription
idrequiredStable opaque gate id (gat_…) or the gate's name.
OptionDescription
--type <value>optionalGate kind. Switching to holdout requires the gate carry only a public rollout % + whitelist (attribute rules / stack are rejected).
--rollout-pct <value>optionalNew rollout in basis points (0–10000 = 0%–100%) — 100 here means 1%. Use rollout_percent (0–100) below for percent. Omit both to leave unchanged.
--rollout-percent <value>optionalNew rollout as a percentage (0–100). Friendlier alias for rollout_pct; converted internally. Wins over rollout_pct if both are supplied. Omit both to leave unchanged.
--rules <value>optionalReplaces the rule list wholesale. To add a value to an in rule, send the full new rules array with the augmented value (e.g. previous ['US','CA']['US','CA','GB']).
--enabled <value>optionalMaster switch. false makes the gate evaluate to false for every caller regardless of rollout_pct, rules, or stack — use as kill switch.
--stack <value>optionalReplaces the gatekeeper stack wholesale. Send null to revert to flat rules + rollout_pct evaluation.
--title <value>optionalHuman-readable title shown in the dashboard. Free-form, no key format constraint.
--description <value>optionalLong-form description / runbook. Markdown is rendered in the dashboard.
--folder <value>optionalOptional folder name grouping items in the dashboard. Alphanumeric, _ or - (no /). Part of the SDK lookup key (<folder>/<name>).
--group <value>optionalGroup label for dashboard organisation (e.g. team or product area).
--owner-email <value>optionalOwner contact. Displayed verbatim; not used for auth.

shipeasy release flags archive

Delete a feature gate

shipeasy release flags archive [options] <id>
ArgumentDescription
idrequiredStable opaque gate id (gat_…) or the gate's name.
OptionDescription
--data <value>optionalRequest body as a JSON object.

shipeasy release flags enable

Enable a gate

shipeasy release flags enable [options] <id>
ArgumentDescription
idrequiredStable opaque gate id (gat_…) or the gate's name.
OptionDescription
--data <value>optionalRequest body as a JSON object.

shipeasy release flags disable

Disable a gate

shipeasy release flags disable [options] <id>
ArgumentDescription
idrequiredStable opaque gate id (gat_…) or the gate's name.
OptionDescription
--data <value>optionalRequest body as a JSON object.

shipeasy release flags activity

List gate activity

shipeasy release flags activity [options] <id>
ArgumentDescription
idrequiredStable opaque gate id (gat_…) or the gate's name.
OptionDescription
--limit <value>optionalMax rows to return (1–100). Defaults to 20.
--data <value>optionalRequest body as a JSON object.

shipeasy release flags whitelist

Read a gate's whitelist

shipeasy release flags whitelist [options] <id>
ArgumentDescription
idrequiredStable opaque gate id (gate_…) or the gate's name.
OptionDescription
--data <value>optionalRequest body as a JSON object.

shipeasy release flags whitelist-add

Add entries to a gate's whitelist

shipeasy release flags whitelist-add [options] <id>
ArgumentDescription
idrequiredStable opaque gate id (gate_…) or the gate's name.
OptionDescription
--attr <value>optionalIdentity attribute to match on. Only honoured when the gate has no whitelist yet (this call creates it); passing an attribute that disagrees with an existing whitelist is a 409 rather than a silent re-key of the entries already there.
--entries <value>optionalIdentities to admit. Already-listed entries are skipped, so the call is idempotent.

shipeasy release flags whitelist-set

Replace a gate's whitelist

shipeasy release flags whitelist-set [options] <id>
ArgumentDescription
idrequiredStable opaque gate id (gate_…) or the gate's name.
OptionDescription
--attr <value>optionalIdentity attribute to match on. Defaults to the whitelist's current attribute, or email when the gate has no whitelist yet.
--entries <value>optionalThe complete whitelist after the call. Pass [] to remove the whitelist from the gate entirely.

shipeasy release flags whitelist-remove

Remove entries from a gate's whitelist

shipeasy release flags whitelist-remove [options] <id>
ArgumentDescription
idrequiredStable opaque gate id (gate_…) or the gate's name.
OptionDescription
--entries <value>optionalIdentities to stop admitting. Entries that aren't listed are skipped, so the call is idempotent.

shipeasy release killswitch

Killswitches: per-env boolean overrides for kill-style operational toggles.

shipeasy release killswitch [options] [command]

shipeasy release killswitch list

List killswitches

shipeasy release killswitch list [options]
OptionDescription
--limit <value>optionalPage size (1–500). Defaults to 100.
--cursor <value>optionalOpaque cursor returned in the previous page's next_cursor. Omit for the first page.
--q <value>optionalCase-insensitive substring filter across the resource's human-readable text columns (e.g. name, title, description). OR-matched across those columns; omit to return everything.
--data <value>optionalRequest body as a JSON object.

shipeasy release killswitch create

Create a killswitch

shipeasy release killswitch create [options] <name>
ArgumentDescription
namerequiredStable config/killswitch key in folder.name form (two lowercase segments separated by a dot, e.g. pricing.tiers). Immutable after create.
OptionDescription
--description <value>optionalOptional free-form description shown in the dashboard. Max 512 chars.
--folder <value>optionalOptional folder name grouping items in the dashboard. Alphanumeric, _ or - (no /). Part of the SDK lookup key (<folder>/<name>).
--value <value>optionalDefault value applied to every env at creation. Defaults to false. Use true to ship the killswitch pre-tripped.
--switches <value>optionalInitial per-switch overrides applied to every env. Empty/omitted leaves the killswitch with only the flat value.

shipeasy release killswitch get

Get one killswitch

shipeasy release killswitch get [options] <id>
ArgumentDescription
idrequiredStable opaque killswitch id (ksw_…) or the killswitch's name.
OptionDescription
--data <value>optionalRequest body as a JSON object.

shipeasy release killswitch update

Update a killswitch

shipeasy release killswitch update [options] <id>
ArgumentDescription
idrequiredStable opaque killswitch id (ksw_…) or the killswitch's name.
OptionDescription
--description <value>optionalNew description, or null to clear it. Max 512 chars.
--folder <value>optionalOptional folder name grouping items in the dashboard. Alphanumeric, _ or - (no /). Part of the SDK lookup key (<folder>/<name>).
--value <value>optionalFlat value applied to every env. Publishes a new version per env when set. Omit to leave values unchanged.
--switches <value>optionalReplace the switches map wholesale on every env. To edit a single entry on a single env use PUT /{id}/switch instead.

shipeasy release killswitch archive

Delete a killswitch

shipeasy release killswitch archive [options] <id>
ArgumentDescription
idrequiredStable opaque killswitch id (ksw_…) or the killswitch's name.
OptionDescription
--data <value>optionalRequest body as a JSON object.

shipeasy release killswitch set

Set one switch entry

shipeasy release killswitch set [options] <id>
ArgumentDescription
idrequiredStable opaque killswitch id (ksw_…) or the killswitch's name.
OptionDescription
--env <value>optionalTarget environment. One of the project's configured envs (dev, staging, prod).
--switch-key <value>optionalSwitch key to set.
--value <value>optionalNew boolean value for this switchKey on this env.

shipeasy release killswitch unset

Remove one switch entry

shipeasy release killswitch unset [options] <id>
ArgumentDescription
idrequiredStable opaque killswitch id (ksw_…) or the killswitch's name.
OptionDescription
--env <value>optionalTarget environment. One of the project's configured envs (dev, staging, prod).
--switch-key <value>optionalSwitch key to remove.

shipeasy release killswitch set-value

Set the flat value on one env

shipeasy release killswitch set-value [options] <id>
ArgumentDescription
idrequiredStable opaque killswitch id (ksw_…) or the killswitch's name.
OptionDescription
--env <value>optionalTarget environment. One of the project's configured envs (dev, staging, prod).
--value <value>optionalFlat boolean to publish on env. Publishes a new version on that env only.

shipeasy release killswitch toggle

Toggle a killswitch or one of its switches

shipeasy release killswitch toggle [options] <id>
ArgumentDescription
idrequiredStable opaque killswitch id (ksw_…) or the killswitch's name.
OptionDescription
--switch-key <value>optionalWhich target to flip. Omit (or null) to flip the killswitch's own flat value; name a switch key to flip that nested sub-switch instead, creating the entry if it doesn't exist yet.
--value <value>optionalThe value to publish. Omit (or null) to flip whatever is stored now — read-modify-write in one call. Pass an explicit true/false to make the call idempotent, so a retry can't undo the first attempt.
--env <value>optionalEnvironment to publish on. Defaults to prod — the environment an incident response means when it says "kill it".

shipeasy whoami

Show the current project

shipeasy whoami [options]
OptionDescription
--data <value>optionalRequest body as a JSON object.

shipeasy setup

One-command onboarding for this repo. Logs you in and binds a project, detects and wires your coding agents (Claude Code plugin, or MCP + instruction files for Cursor/Codex/Copilot/Antigravity/Gemini), mints SDK keys, installs @shipeasy/sdk, and offers the devtools overlay + feature modules — then writes self-contained SDK-wiring steps to shipeasy-wiring.md for your agent to finish. Monorepo-aware and idempotent (safe to re-run). Run shipeasy setup --help for every flag; shipeasy setup triggers sets up the scheduled queue-fixing automation on its own.

setup now runs the whole deterministic half of onboarding itself, without needing an AI to drive it:

  1. Preconditions (Node >= 20, git repo — offers git init).
  2. detect-powered monorepo scan; every target gets its own .shipeasy.
  3. Browser login, then binds the repo root AND each install target.
  4. Wires your coding agents — each through its own mcp add --transport http command where one exists (Claude, Copilot, Codex), else a merged config file — plus instruction files + universal AGENTS.md, installed in-repo by default (confirms interactively; offers user-global). At project scope even Claude stays in-repo (.mcp.json + ./.claude/skills); user scope takes the native Claude plugin. Base workflow skills go to every non-plugin agent via npx skills add.
  5. Mints env-locked server/client SDK keys.
  6. Runs the SDK package install per target and persists the keys to each target's gitignored env file. 6-7. Offers devtools — the browser <script> overlay, or, for a React Native/Expo target, installs @shipeasy/react-native-devtools (+ its Expo peers) for the shake-to-open on-device panel; the surface comes from step 1's detection, not a question. Then the feature module enables (flags/i18n/ops).
  7. Verification gate — session, keys, and every target's binding.
  8. Trusts the folder in Claude when its .mcp.json server is still pending — opens one interactive session prefilled with /exit, so it closes itself the moment you accept the prompt.
  9. Authorizes the hosted MCP connection: entries written to a config that is private to your machine carry an Authorization: Bearer header (your CLI session key) and need no sign-in at all — which is why Copilot's entries go to its CLI config and VS Code's user profile, not the repo. Committable ones (.mcp.json, .cursor/mcp.json) never hold a credential, so those take the OAuth browser flow via each agent's own mcp login.
  10. Everything that needs codebase judgement (entry-point configure(...) wiring, idiomatic secret stores, overlay script injection) is written to shipeasy-wiring.md — complete, self-contained instructions any coding agent (Claude, Codex, Cursor, Copilot, or a human) can execute. Key values never appear in that file. Alongside it, the SDK doc pages for exactly what you enabled — installation always, plus the overlay, head-tag, flag, experiment, metrics, error and i18n pages you turned on — are pulled from each SDK's live docs into shipeasy-wiring-docs/ and linked from the step that needs them, so the wiring an agent writes tracks the SDK as it ships today rather than whatever this CLI version remembers. Both are temporary — once every gate passes the agent asks whether to delete them and commit the wiring, and does neither unless you say yes.
  11. Offers to bootstrap the instrumentation a module enable can't produce on its own: with ops on, a session that finds this app's real failure paths and reports them through see(); with the release module on, one that names the product's critical moments and builds the event → metric → alert chain over them. Runs on your own harness with a written brief (skills, gates, and a stop-before-commit rule); --no-bootstrap skips it.
  12. Offers the automation trigger (scheduled queue burn-down as PRs).
  13. Opens the browser on the plan step — the two things setup will not decide for you: which plan you're on, and the Terms/Privacy agreements. Free needs no card; Pro/Business start a 14-day trial through Stripe. Completing that screen is what marks onboarding done for the account (an account that already finished it lands on Settings → Billing instead); --no-plan skips it.

Idempotent — safe to re-run. In CI (non-TTY) it runs non-interactively with SHIPEASY_CLI_TOKEN + SHIPEASY_PROJECT_ID.

shipeasy setup [options] [command]
OptionDescription
--yesoptionalNon-interactive: accept defaults everywhere (bind, prod keys, run installs)
--agents <list>optionalComma list to wire (claude,cursor,codex,copilot,antigravity,gemini)
--domain <domain>optionalProduction domain (used when creating a new project at login)
--scope <scope>optionalMCP + skills scope: project (in-repo, default) | user (global). Omit to be asked.
--env <env>optionalEnvironment the minted SDK keys read: dev | staging | prod
--devtoolsoptionalEnable devtools without asking (browser <script> and/or the React Native overlay, per detection)
--no-devtoolsoptionalSkip devtools without asking
--features <list>optionalModule groups to enable non-interactively (flags,i18n,ops)
--skip-installoptionalDon't run SDK package installs (they go into the wiring steps)
--no-agent-runoptionalDon't offer to launch a coding agent on the wiring steps
--no-bootstrapoptionalSkip the instrumentation session (see() error tracking + events/metrics/alerts)
--no-claude-runoptional(deprecated) alias of --no-agent-run
--triggersoptionalSet up the automation trigger without asking (skips the yes/no gate)
--no-triggersoptionalSkip the automation trigger step
--trigger-platform <id>optionalPreselect the trigger platform (claude|codex|cursor|copilot|gemini|jules)
--planoptionalOpen the plan step without asking (skips the yes/no gate)
--no-planoptionalSkip the plan step (onboarding stays unfinished until it's done)
--dry-runoptionalShow what would change without writing files or calling the API

Examples:

# interactive: full onboarding, prompts as it goes
shipeasy setup

# non-interactive
shipeasy setup --yes --env prod --features flags

# preview without writing
shipeasy setup --dry-run --no-agent-run

# subset, skip overlay
shipeasy setup --agents claude,cursor --no-devtools

shipeasy setup triggers

Set up an automation trigger — a scheduled agent that fixes queue items as PRs, unattended. Opens the hosted, guided setup for your platform.

A trigger is a scheduled agent run that burns down your feedback queue (bugs, feature requests, auto-filed error/alert tickets) and opens one pull request per fixed item — nothing merges without you. This command explains it, has you pick the platform you code with (Claude Code, Codex, Cursor, Copilot, or Gemini/Jules), then opens the hosted, guided setup wizard preselected to that platform, which walks you through the platform-specific fields and secrets. shipeasy setup offers this same step inline.

shipeasy setup triggers [options]
OptionDescription
--platform <id>optionalPreselect the platform (claude|codex|cursor|copilot|gemini|jules)
--dry-runoptionalPrint the URL without opening a browser

Examples:

# interactive: pick a platform, open the wizard
shipeasy setup triggers

# preselect Claude Code
shipeasy setup triggers --platform claude

# just print the URL
shipeasy setup triggers --dry-run

shipeasy report-issue

File a setup/onboarding bug to Shipeasy (filed as pending-approval). Meant for the setup agent when a step fails: it collects OS/Node/CLI version, your project id, language and frameworks, plus the failing step + error. REQUIRES the user's consent — pass --consent (agent, after asking) or answer the interactive prompt. Prints the exact payload first.

shipeasy report-issue [options]
OptionDescription
--title <title>requiredOne-line summary, e.g. "Setup failed at Feature installs"
--step <step>optionalWhich setup step failed
--error <error>optionalThe error message / actual result
--description <text>optionalFreeform description of the problem
--reporter-email <email>optionalOptional contact email
--project <id>optionalShipeasy project id the issue relates to (defaults to the bound one)
--language <lang>optionalDetected language (typescript, python, …)
--frameworks <list>optionalComma list of detected frameworks
--consentoptionalConfirm the USER agreed to send system/env info to Shipeasy. Required to send unattended.
--jsonoptionalPrint the exact payload and exit WITHOUT sending (dry preview)

Examples:

# agent files a report after the user agreed
shipeasy report-issue --consent --title "Setup failed at Feature installs" --step "Feature installs" --error "enableModuleGroup(ops) 500"

# preview the exact payload without sending
shipeasy report-issue --title "Setup broke" --error "..." --json

shipeasy upgrade

Bring your Shipeasy install up to date: self-updates the CLI, refreshes the coding-agent wiring (Claude plugin / MCP registration) and the how-to skills from the marketplace, and offers to bump the @shipeasy/sdk dependency in each onboarded target. Idempotent and best-effort. Use shipeasy upgrade skills for the CLI + skills only.

upgrade refreshes everything a Shipeasy install accumulates, in order:

  1. CLI — installs @shipeasy/cli@latest globally (npm by default; --pm for pnpm/yarn/bun). The new version applies to your NEXT command, not the running one.
  2. Skills — re-fetches the marketplace how-to skills from the repo and reinstalls them into your wired agents. Claude at user scope refreshes the native plugin (MCP + skills + slash commands in one); every other agent (and Claude in-repo) reinstalls via skills add. Only the skills you actually have are refreshed — discovery falls back to the full catalogue when it finds none.
  3. MCP — re-asserts the hosted MCP registration (mcp.shipeasy.ai is a static remote, so there's nothing to bump — this just repairs a stale/local entry).
  4. SDK — detects each onboarded target and OFFERS to bump @shipeasy/sdk to its latest release (prompted; --yes accepts, --skip-sdk skips).

Scope and agents auto-detect from the repo; override with --scope / --agents. shipeasy upgrade skills runs only steps 1–2.

shipeasy upgrade [options] [command]
OptionDescription
--agents <list>optionalRestrict to these agents (claude,cursor,codex,copilot,antigravity,gemini)
--scope <scope>optionalWhere skills/MCP live: project | user (default: auto-detected)
--pm <pm>optionalPackage manager for the global CLI update (npm|pnpm|yarn|bun)
--skip-clioptionalDon't self-update the CLI
--skip-sdkoptionalDon't offer the SDK dependency update
--yesoptionalNon-interactive: accept the SDK update without prompting
--dry-runoptionalShow what would change without installing anything

Examples:

# CLI + agents + skills, then offer the SDK bump
shipeasy upgrade

# non-interactive: also accept the SDK update
shipeasy upgrade --yes

# global install, pnpm-managed CLI
shipeasy upgrade --scope user --pm pnpm

# preview without installing
shipeasy upgrade --dry-run

shipeasy upgrade skills

Update the CLI itself and refresh your Shipeasy skills to the latest marketplace revision (re-fetched from the repo). Skips the MCP re-registration and the SDK bump that the full shipeasy upgrade also does.

shipeasy upgrade skills [options]
OptionDescription
--agents <list>optionalRestrict to these agents (claude,cursor,codex,copilot,antigravity,gemini)
--scope <scope>optionalWhere skills live: project | user (default: auto-detected)
--pm <pm>optionalPackage manager for the global CLI update (npm|pnpm|yarn|bun)
--skip-clioptionalRefresh skills only — don't self-update the CLI
--dry-runoptionalShow what would change without installing anything

Examples:

# refresh the CLI + skills only
shipeasy upgrade skills

# skills only, leave the CLI as-is
shipeasy upgrade skills --skip-cli

# one agent, in-repo
shipeasy upgrade skills --agents claude --scope project

shipeasy install

Enable a platform module group (flags | i18n | ops) and verify it

Turns on a coherent group of project modules in one call, then verifies the admin read paths are reachable and prints next steps. Module groups:

• flags — gates + configs + events + experiments (kill switches ride the same KV blob; no separate flag). • i18n — translations; also ensures the primary profile (--profile, default en:prod) exists, since the server does not auto-create one. • ops — feedback + events (the queue + production-error tickets). The code wiring (devtools overlay, see() reporting) is language-specific and lives in the shipeasy-ops + shipeasy-see skills.

Requires an admin session (shipeasy login) and a bound project; an ops key cannot toggle modules.

shipeasy install [options] <module>
ArgumentDescription
modulerequired
OptionDescription
--profile <name>optionali18n only: primary profile to ensure exists (default: "en:prod")
--jsonoptionalOutput as JSON
--project <id>optionalProject ID override

Examples:

# Enable the whole flags + experimentation platform
shipeasy install flags

# Enable translations + ensure en:prod exists
shipeasy install i18n

# Use a different primary profile
shipeasy install i18n --profile en:staging

# Enable the feedback / ops queue
shipeasy install ops

shipeasy docs

SDK docs: fetch a language SDK's published docs — its page tree, feature pages, code snippets, and installable agent skill.

shipeasy docs [options] [command]

shipeasy docs list

List an SDK's documentation tree

shipeasy docs list [options]
OptionDescription
--sdk <value>optionalSDK language. Defaults to the sdk recorded in the nearest .shipeasy when omitted.

shipeasy docs get

Fetch one SDK doc page or snippet

shipeasy docs get [options] <path>
ArgumentDescription
pathrequiredPage key or snippet 'group/resource'.
OptionDescription
--sdk <value>optionalSDK language. Defaults to the sdk recorded in the nearest .shipeasy when omitted.
--framework <value>optionalFramework hint (substitutes {{FRAMEWORK}}).
--name <value>optionalResource name (substitutes {{RESOURCE_NAME}}).

shipeasy docs skill

Fetch an SDK's installable LLM skill

shipeasy docs skill [options]
OptionDescription
--sdk <value>optionalSDK language. Defaults to the sdk recorded in the nearest .shipeasy when omitted.
--installoptionalCLI only: write the skill to the local agent skills dir.
--agent <name>optionalInstall into one agent (skips the picker, e.g. claude-code, codex)
--globaloptionalInstall into the user-global skills dir
--dir <path>optionalWrite this exact skills dir instead of delegating to the skills CLI

shipeasy detect

Scan the repo for install targets and print a per-folder onboarding recommendation (language, install command, keys, secret store, docs handle, next skills).

detect is the engine behind the setup skill's 'detect subprojects' step. With no args it walks the tree under the cwd (depth 4, pruning node_modules/vendor/build/etc.) and finds every project manifest (package.json, pyproject.toml, Gemfile, go.mod, pom.xml, build.gradle[.kts], composer.json, Package.swift). Pass explicit paths to scan only those folders.

For each folder it reports the detected language + frameworks and a recommendation: the SDK install command, which keys to mint (server, plus client for browser frameworks), the idiomatic secret store, the shipeasy docs get line that pulls the version-correct install + configure() wiring for that language, and the feature-install skills to run next. Already-onboarded folders and JS workspace roots are flagged so they're skipped. Use --json to drive it programmatically.

It also writes what it detected — the language, sdk, and frameworks — into each real target's own .shipeasy (non-destructively; project_id is never touched), recording one file per project and seeding the sdk that shipeasy docs defaults to. --json echoes the written paths under recorded.

shipeasy detect [options] [paths...]
ArgumentDescription
paths...optional
OptionDescription
--jsonoptionalOutput the structured recommendation set as JSON

Examples:

# recommendations for every target under the cwd
shipeasy detect

# machine-readable, for the setup skill
shipeasy detect --json

# scan only these folders
shipeasy detect apps/web apps/api

Returns (with --json):

{
  "status": "ok",
  "root": "/repo",
  "targets": [
    {
      "path": "/repo/apps/web",
      "language": "typescript",
      "frameworks": [
        "nextjs",
        "react"
      ],
      "package_manager": "pnpm",
      "entry_points": [
        "src/app/layout.tsx"
      ],
      "recommendation": {
        "sdk": "typescript",
        "action": "install",
        "reason": "No Shipeasy SDK installed — install it, mint keys, wire the entry point.",
        "install": "pnpm add @shipeasy/sdk",
        "keys": [
          "server",
          "client"
        ],
        "secret_store": "<dir>/.env.local (gitignored)",
        "docs": "shipeasy docs get --sdk typescript installation",
        "next_skills": [
          "shipeasy-flags",
          "shipeasy-ops",
          "shipeasy-i18n"
        ]
      }
    }
  ],
  "recorded": [
    "/repo/apps/web/.shipeasy"
  ]
}

shipeasy mcp

Manage the Shipeasy MCP server in AI-assistant configs

shipeasy mcp [options] [command]

shipeasy mcp install

Register the hosted Shipeasy MCP server (https://mcp.shipeasy.ai/mcp) with installed AI assistants

shipeasy mcp install [options]
OptionDescription
--client <name>optionalRestrict to one agent (claude | cursor | codex | copilot | antigravity | gemini | all) (default: "all")
--scope <scope>optionaluser | project (default: "user")
--forceoptionalReplace an existing 'shipeasy' MCP entry without prompting
--dry-runoptionalPrint what would change without writing files

Examples:

shipeasy mcp install

# only Claude, project config
shipeasy mcp install --client claude --scope project

# shells out to `codex mcp add`
shipeasy mcp install --client codex

# preview a forced replace
shipeasy mcp install --force --dry-run

shipeasy mcp status

Show which AI-assistant configs have a Shipeasy MCP entry

shipeasy mcp status [options]

Examples:

shipeasy mcp status

shipeasy mcp uninstall

Remove the 'shipeasy' MCP entry from AI-assistant configs

shipeasy mcp uninstall [options]
OptionDescription
--client <name>optionalRestrict to one agent (default: "all")
--scope <scope>optionaluser | project | both (default: "both")

Examples:

shipeasy mcp uninstall

shipeasy mcp uninstall --client cursor --scope user

shipeasy sdk

Manage SDK keys (server, client, admin, ops)

shipeasy sdk [options] [command]

shipeasy sdk keys

Manage SDK keys (server, client, admin, ops)

shipeasy sdk keys [options] [command]

shipeasy sdk keys list

List SDK keys for the current project

shipeasy sdk keys list [options]
OptionDescription
--jsonoptionalOutput as JSON
--project <id>optionalProject ID override

Examples:

shipeasy sdk keys list

# Machine-readable output
shipeasy sdk keys list --json

shipeasy sdk keys create

Create a new SDK key. The raw token is shown ONCE — store it now.

shipeasy sdk keys create [options]
OptionDescription
--type <type>requiredKey type: server | client | admin | ops
--env <env>optionalEnvironment the key is bound to: dev | staging | prod (required for server/client keys)
--name <name>optionalHuman label for the key (shown in the dashboard + audit logs)
--scopes <list>optionalComma list of permission scopes: experiments:read, gates:evaluate, events:write, configs:write, experiments:write, tickets:public_create
--jsonoptionalOutput as JSON
--project <id>optionalProject ID override

Examples:

# Server key for production (private, server-only)
shipeasy sdk keys create --type server --env prod

# Public client key for staging
shipeasy sdk keys create --type client --env staging

# Named client key scoped to file public bug reports (CLI /cli/report)
shipeasy sdk keys create --type client --env prod --name "CLI main key" --scopes tickets:public_create

# Restricted ops key for the trigger
shipeasy sdk keys create --type ops

shipeasy sdk keys revoke

Revoke a key by id (or id prefix; first match wins)

shipeasy sdk keys revoke [options] <id>
ArgumentDescription
idrequired
OptionDescription
--jsonoptionalOutput as JSON
--project <id>optionalProject ID override

Examples:

# Revoke by full id
shipeasy sdk keys revoke 7f3a9c10-2b4d-4e6f-8a1b-0c2d3e4f5a6b

# Revoke by id prefix (first match)
shipeasy sdk keys revoke 7f3a9c10

shipeasy i18n

String Manager (i18n): extract UI copy into managed keys, push/publish translations to the CDN, and keep code in sync.

shipeasy i18n [options] [command]

shipeasy i18n install-loader

Inject the ShipEasy i18n loader script into your project

shipeasy i18n install-loader [options]
OptionDescription
--data-key <key>optionalClient SDK key (created automatically if omitted)
--profile <profile>optionalLocale profile name (default: "default")
--path <file>optionalOverride target file path (auto-detected by default)
--project <id>optionalProject ID override
--printoptionalPrint the script tag only, do not write files

Examples:

# Auto-detect the layout and inject
shipeasy i18n install-loader --profile en:prod

# Print the tag only, do not write
shipeasy i18n install-loader --print

# Target a specific file
shipeasy i18n install-loader --path ./src/app/layout.tsx

shipeasy i18n scan

Find translatable strings in source files. Reports both already-wrapped t('key') calls and unwrapped JSX text / string props that look translatable.

shipeasy i18n scan [options] [paths...]
ArgumentDescription
paths...optional
OptionDescription
--keys-onlyoptionalOnly report existing t('key') call sites — skip discovery
--jsonoptionalOutput as JSON

Examples:

# Discover translatable strings under src/
shipeasy i18n scan ./src

# Only report existing t('key') calls
shipeasy i18n scan ./src --keys-only

shipeasy i18n push

Add NEW keys from a JSON file to the i18n profile. The file is a flat { "<key>": "<value>" } map. This only ADDS keys that do not already exist — existing keys are never overwritten. To change a value, update one key at a time with shipeasy i18n update <key> <value>, or re-push the file with --force to overwrite every colliding key at once.

shipeasy i18n push [options] <file>
ArgumentDescription
filerequired
OptionDescription
--profile <name>requiredProfile name (e.g. 'default')
--forceoptionalOverwrite keys that already exist with the values in the file, instead of skipping them
--jsonoptionalOutput as JSON
--project <id>optionalProject ID override

Examples:

# Add new keys from a flat JSON map
shipeasy i18n push ./locales/en.json --profile en:prod

# Re-push the file over existing keys (overwrites values)
shipeasy i18n push ./locales/en.json --profile en:prod --force

shipeasy i18n update

Update the value of a single existing key. push only adds new keys; use this to change a value (one key per call).

shipeasy i18n update [options] <key> <value>
ArgumentDescription
keyrequired
valuerequired
OptionDescription
--profile <name>requiredProfile name (e.g. 'en:prod')
--description <text>optionalOptional description to store with the key
--jsonoptionalOutput as JSON
--project <id>optionalProject ID override

Examples:

# Change one key's value
shipeasy i18n update home.cta 'Get started' --profile en:prod

# Value containing double quotes
shipeasy i18n update home.title 'Welcome to "ShipEasy"' --profile en:prod

shipeasy i18n publish

Publish a profile to the CDN (rebuilds KV manifest, purges cache)

shipeasy i18n publish [options]
OptionDescription
--profile <name>requiredProfile name (e.g. 'default')
--jsonoptionalOutput as JSON
--project <id>optionalProject ID override

Examples:

# Publish a profile
shipeasy i18n publish --profile en:prod

shipeasy i18n validate

Check that all t('key', …) references in code exist on the server

shipeasy i18n validate [options] [paths...]
ArgumentDescription
paths...optional
OptionDescription
--profile <name>optionalRestrict the check to a single profile
--jsonoptionalOutput as JSON
--project <id>optionalProject ID override

Examples:

# Check all t('key') refs exist server-side
shipeasy i18n validate ./src

# Restrict the check to one profile
shipeasy i18n validate ./src --profile en:prod

shipeasy i18n profiles

Manage i18n locale profiles

shipeasy i18n profiles [options] [command]

shipeasy i18n profiles list

List i18n profiles for the current project

shipeasy i18n profiles list [options]
OptionDescription
--jsonoptionalOutput as JSON
--project <id>optionalProject ID override

Examples:

shipeasy i18n profiles list

shipeasy i18n profiles create

Create an i18n profile (e.g. 'default', 'en:prod')

shipeasy i18n profiles create [options] <name>
ArgumentDescription
namerequired
OptionDescription
--locales <locales>optionalComma-separated locale list (defaults to 'en') (default: ["en"])
--default-locale <locale>optionalDefault locale (defaults to first --locales entry)
--jsonoptionalOutput as JSON
--project <id>optionalProject ID override

Examples:

# Create a profile with one locale
shipeasy i18n profiles create en:prod

# Multiple locales with a default
shipeasy i18n profiles create fr:prod --locales fr,fr-CA --default-locale fr

shipeasy i18n codemod

Source-code codemods (i18n extraction, framework migrations)

shipeasy i18n codemod [options] [command]

shipeasy i18n codemod i18n

Extract translatable strings and wrap them with i18n.t() from @shipeasy/sdk/client. Reads .i18n-codemod.json from the current directory if present.

shipeasy i18n codemod i18n [options] [target]
ArgumentDescription
targetoptional
OptionDescription
--config <path>optionalPath to a JSON config file
--dry-runoptionalPreview without writing files
--verbose, -voptionalDetailed per-file output
--type <name>optionalRun only one extraction type (jsx-text, jsx-attr, template-literal, ...)
--migrate <name>optionalRun a migration plugin (react-i18next, react-intl, lingui, next-intl, raw-i18next)

Examples:

# Preview extraction over app/
shipeasy i18n codemod i18n app --dry-run

# Run only JSX text extraction
shipeasy i18n codemod i18n ./src --type jsx-text

# Migrate from react-i18next
shipeasy i18n codemod i18n --migrate react-i18next

shipeasy i18n extract

Extract hardcoded strings → wrap with i18n.t() → push + publish keys (JS/TS)

Runs the whole extraction pipeline as one command: the AST codemod wraps translatable strings with i18n.t() and writes a flat keys file, then those keys are pushed (insert-only) and published. It first verifies this project's language/framework (from .shipeasy) has a codemod; for any other language it prints that language's i18n doc so you can wrap strings by hand, then push with shipeasy i18n push.

shipeasy i18n extract [options] [target]
ArgumentDescription
targetoptional
OptionDescription
--profile <name>optionalProfile to push keys to (default: "en:prod")
--dry-runoptionalPreview the codemod without writing or pushing
--no-publishoptionalPush keys but don't publish to the CDN
--project <id>optionalProject ID override

Examples:

# Extract under auto-detected dirs, push + publish
shipeasy i18n extract

# Target one dir
shipeasy i18n extract ./src

# Preview only
shipeasy i18n extract --dry-run

# Push but don't publish
shipeasy i18n extract --no-publish

shipeasy i18n migrate

Migrate an existing i18n library to Shipeasy (react-i18next, react-intl, lingui, next-intl, raw-i18next)

shipeasy i18n migrate [options] <library>
ArgumentDescription
libraryrequired
OptionDescription
--profile <name>optionalProfile to push existing translations to (default: "en:prod")
--dry-runoptionalPreview the migration without writing or pushing
--no-publishoptionalPush keys but don't publish to the CDN
--project <id>optionalProject ID override

Examples:

# Migrate from react-i18next
shipeasy i18n migrate react-i18next

# Preview the migration
shipeasy i18n migrate next-intl --dry-run
Was this page helpful?
✎ Edit this page

On this page

shipeasy loginshipeasy logoutshipeasy bindshipeasy rootshipeasy metricsshipeasy metrics eventsshipeasy metrics events listshipeasy metrics events createshipeasy metrics events getshipeasy metrics events updateshipeasy metrics events archiveshipeasy metrics events approveshipeasy metrics listshipeasy metrics createshipeasy metrics showshipeasy metrics updateshipeasy metrics archiveshipeasy metrics experimentsshipeasy metrics unarchiveshipeasy metrics seriesshipeasy metrics grammarshipeasy opsshipeasy ops agentsshipeasy ops agents listshipeasy ops alertsshipeasy ops alerts channelsshipeasy ops alerts listshipeasy ops alerts createshipeasy ops alerts updateshipeasy ops alerts archiveshipeasy ops commentsshipeasy ops comments listshipeasy ops comments createshipeasy ops fired-alertsshipeasy ops fired-alerts listshipeasy ops fired-alerts updateshipeasy ops investigationsshipeasy ops investigations listshipeasy ops investigations createshipeasy ops investigations updateshipeasy ops triggershipeasy ops trigger createshipeasy ops trigger create claudeshipeasy ops trigger create cursorshipeasy ops trigger create copilotshipeasy ops trigger create julesshipeasy ops trigger prepshipeasy ops listshipeasy ops createshipeasy ops bugshipeasy ops featureshipeasy ops getshipeasy ops updateshipeasy ops link-prshipeasy ops ackshipeasy ops notifyshipeasy projectsshipeasy projects currentshipeasy projects upsertshipeasy projects updateshipeasy releaseshipeasy release configsshipeasy release configs listshipeasy release configs createshipeasy release configs getshipeasy release configs updateshipeasy release configs archiveshipeasy release configs update-schemashipeasy release experimentsshipeasy release experiments universesshipeasy release experiments universes listshipeasy release experiments universes createshipeasy release experiments universes updateshipeasy release experiments universes archiveshipeasy release experiments listshipeasy release experiments createshipeasy release experiments getshipeasy release experiments updateshipeasy release experiments archiveshipeasy release experiments startshipeasy release experiments stopshipeasy release experiments restoreshipeasy release experiments set-metricsshipeasy release experiments resultsshipeasy release experiments timeseriesshipeasy release experiments reanalyzeshipeasy release experiments readout-createshipeasy release experiments readout-getshipeasy release flagsshipeasy release flags attributesshipeasy release flags attributes listshipeasy release flags attributes createshipeasy release flags attributes getshipeasy release flags attributes updateshipeasy release flags attributes archiveshipeasy release flags templatesshipeasy release flags templates listshipeasy release flags templates createshipeasy release flags templates getshipeasy release flags templates updateshipeasy release flags templates archiveshipeasy release flags listshipeasy release flags createshipeasy release flags getshipeasy release flags updateshipeasy release flags archiveshipeasy release flags enableshipeasy release flags disableshipeasy release flags activityshipeasy release flags whitelistshipeasy release flags whitelist-addshipeasy release flags whitelist-setshipeasy release flags whitelist-removeshipeasy release killswitchshipeasy release killswitch listshipeasy release killswitch createshipeasy release killswitch getshipeasy release killswitch updateshipeasy release killswitch archiveshipeasy release killswitch setshipeasy release killswitch unsetshipeasy release killswitch set-valueshipeasy release killswitch toggleshipeasy whoamishipeasy setupshipeasy setup triggersshipeasy report-issueshipeasy upgradeshipeasy upgrade skillsshipeasy installshipeasy docsshipeasy docs listshipeasy docs getshipeasy docs skillshipeasy detectshipeasy mcpshipeasy mcp installshipeasy mcp statusshipeasy mcp uninstallshipeasy sdkshipeasy sdk keysshipeasy sdk keys listshipeasy sdk keys createshipeasy sdk keys revokeshipeasy i18nshipeasy i18n install-loadershipeasy i18n scanshipeasy i18n pushshipeasy i18n updateshipeasy i18n publishshipeasy i18n validateshipeasy i18n profilesshipeasy i18n profiles listshipeasy i18n profiles createshipeasy i18n codemodshipeasy i18n codemod i18nshipeasy i18n extractshipeasy i18n migrate