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 50 characters. The cap is the Analytics Engine index budget — 96 bytes total, less a 36-byte project UUID and a separator — and the API has always enforced 50 while this spec advertised 128. The charset is ASCII, so characters and bytes are the same count. 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
--display-name <value>optionalWhat a human calls the metric — "Checkout revenue" beside the checkout.revenue that identifies it. Unlike name it is free text, it is editable, and nothing addresses the metric by it: the dashboard leads with it and falls back to name when it is absent, so a metric nobody named simply reads as its key. Send null to clear it.
--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.
--display <value>optionalHow the metric's series is DRAWN, as opposed to what it measures. Both parts used to be DSL functions (expected(q, seasonal), forecast(q, …)), which meant turning a band on minted a different metric; they are properties now, so every chart of the metric picks them up and nothing that JUDGES the metric — an alert rule, the experiment analyzer — reads them at all.
--query-ir <value>optionalA metric definition as a typed expression tree — the structured alternative to the query DSL string, and what the API stores. Exactly one of query / query_ir is supplied per metric body; query is the same definition written as text, and is the spelling to prefer.

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
--display-name <value>optionalWhat a human calls the metric — "Checkout revenue" beside the checkout.revenue that identifies it. Unlike name it is free text, it is editable, and nothing addresses the metric by it: the dashboard leads with it and falls back to name when it is absent, so a metric nobody named simply reads as its key. Send null to clear it.
--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.
--display <value>optionalHow the metric's series is DRAWN, as opposed to what it measures. Both parts used to be DSL functions (expected(q, seasonal), forecast(q, …)), which meant turning a band on minted a different metric; they are properties now, so every chart of the metric picks them up and nothing that JUDGES the metric — an alert rule, the experiment analyzer — reads them at all.
--query-ir <value>optionalA metric definition as a typed expression tree — the structured alternative to the query DSL string, and what the API stores. Exactly one of query / query_ir is supplied per metric body; query is the same definition written as text, and is the spelling to prefer.

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 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.
--kind <value>optionalWhat the rule watches for. normal compares the metric's own value — against threshold via comparator, or against the [rangeMin, rangeMax] corridor it must stay inside. anomaly compares it against its own seasonal baseline in sigmas: the same fit a chart draws as the band, so a point outside the drawn band is exactly a breaching bucket, and one metric can back rules at several sigmas. outliers compares each by() group against its peers in the same bucket and is refused on a metric with no grouping.
--comparator <value>optionalHow the metric value is compared to the threshold. Read only by a normal rule with no range set.
--threshold <value>optionalThreshold the metric value is compared against. Required for a normal rule unless a range is given; ignored by every other kind.
--range-min <value>optionalLower edge of the corridor the metric must stay inside. Setting either bound switches a normal rule off comparator/threshold and onto the range, which breaches on LEAVING it in either direction. One bound alone is a one-sided range.
--range-max <value>optionalUpper edge of the corridor the metric must stay inside.
--sigma <value>optionalHow far from normal is too far, for anomaly and outliers, in sigma-equivalents. Omit (or null) for 3, which is also the half-width of the band a chart draws — so an unconfigured rule fires exactly where the picture says it would.
--direction <value>optionalWhich side of the baseline an anomaly or outliers rule watches. Omit (or null) for either, which is what "is this unusual" means; name a side for a metric that is only bad in one direction.
--sustained <value>optionalJudge the window by ACCUMULATED departure instead of bucket by bucket. The ordinary check asks every bucket to be past sigma, which a slow regression never manages: a metric running 1.5σ worse than normal since Tuesday puts no single bucket past 3σ and pages nobody. A sustained rule adds up each bucket's excess over half a sigma and fires once the total passes twice sigma — four buckets at 2σ do it, a lone 3σ spike does not. anomaly and outliers only, and refused alongside requiredBuckets: the accumulated bar IS the evidence bar, and a second one counted in buckets would silently override it.
--window-hours <value>optionalLookback window (hours) the metric is aggregated over. 1–720.
--bucket-minutes <value>optionalWidth of the buckets the window is split into, in minutes. Omit (or null) to divide the window into 12 equal buckets. The rule is judged per bucket, so this is the resolution at which "sustained" is measured — a short bucket asks the condition to hold through finer detail.
--required-buckets <value>optionalHow many buckets must breach before the rule fires. Omit (or null) to require every bucket that had data. Buckets with nothing in them are excluded before this is counted, so on a sparse metric null can mean a single bucket — set this to 2 or more where one lone sample must never page.
--warn-threshold <value>optionalThe milder bound — a second level, in the same unit the kind judges in, that raises a quieter alert before the firing level is reached. Must be strictly milder than the level the rule fires at, or it could never fire on its own. Refused on a range rule and on a sustained one: neither condition is a single number, so there is nothing to substitute.
--recovery-threshold <value>optionalWhat the metric must get back to before a live alert closes. Without it a metric sitting on its threshold pages and clears once per tick. Must be on the safe side of the firing level, or equal to it. Omit (or null) for no hysteresis.
--group-alerts <value>optionalFire one alert per by() group instead of one for the whole metric. The firing key becomes (rule, group), so each group raises, dedupes and recovers on its own. Refused on a metric with no by(), and on no_data — a group that went silent has no rows left to be missing from.
--max-groups <value>optionalHow many groups this rule may alert on at once. Omit (or null) for 10. Past the cap the worst groups fire and the count of the rest is stated on each ticket — a group set is customer data, and an uncapped rule on by(user_id) would file a ticket per user.
--no-data-minutes <value>optionalFor a no_data rule: how long the silence must last. Omit (or null) for 15 minutes. Five is the floor — below it, ordinary ingest lag empties the trailing bucket and reads as an outage.
--delay-minutes <value>optionalHold the evaluated window back this far behind live, on top of the reader's own settle grace. For a metric assembled from a source that lands in batches, whose trailing buckets are legitimately incomplete for longer than the grace covers.
--auto-resolve-minutes <value>optionalClose a live instance that has gone this long without a fresh verdict. A rule that cannot reach a verdict deliberately leaves its alert alone, which is right for a tick and wrong for a week. Never closes an instance that is currently breaching. Omit (or null) to never auto-resolve.
--composite <value>optionalWhat a composite rule is a boolean over. rules are sibling alert-rule ids in the same project and op is how their states combine. A child's state is what the current pass concluded about it, falling back to whether it has an open instance — so a composite still means something on a tick where a child could not be evaluated, which is exactly the tick a "two of these are broken at once" rule is for. One level deep: a child may not itself be composite.
--severity <value>optionalSeverity of the raised alert. A warnThreshold breach opens one step quieter than this.
--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
--kind <value>optional
--comparator <value>optional
--threshold <value>optional
--range-min <value>optionalLower edge of the corridor; null drops it, returning the rule to comparator and threshold when both bounds are gone.
--range-max <value>optionalUpper edge of the corridor; null drops it.
--sigma <value>optionalSigmas an anomaly or outliers rule fires at; null restores the default of 3.
--direction <value>optionalWhich side an anomaly or outliers rule watches; null restores either.
--sustained <value>optionalJudge the window by accumulated departure rather than bucket by bucket. anomaly and outliers only; refused alongside requiredBuckets.
--warn-threshold <value>optionalThe milder bound; null drops the warning level, leaving the rule with one.
--recovery-threshold <value>optionalWhat the metric must get back to before a live alert closes; null drops the hysteresis.
--group-alerts <value>optionalFire one alert per by() group. Refused on a metric with no grouping.
--max-groups <value>optionalHow many groups may alert at once; null restores the default of 10.
--no-data-minutes <value>optionalHow long a no_data rule's silence must last; null restores 15 minutes.
--delay-minutes <value>optionalHow far behind live the window is held; null drops the delay.
--auto-resolve-minutes <value>optionalClose a stale live instance after this long; null never auto-resolves.
--composite <value>optionalWhat a composite rule is a boolean over. rules are sibling alert-rule ids in the same project and op is how their states combine. A child's state is what the current pass concluded about it, falling back to whether it has an open instance — so a composite still means something on a tick where a child could not be evaluated, which is exactly the tick a "two of these are broken at once" rule is for. One level deep: a child may not itself be composite.
--window-hours <value>optional
--bucket-minutes <value>optionalBucket width in minutes; null restores the default 12 buckets per window.
--required-buckets <value>optionalBuckets that must breach to fire; null restores "every bucket that had data".
--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 instance id — the same id as the alert ops item this instance is.
OptionDescription
--status <value>optionalNew lifecycle state, written through to the queue item (resolved / wont_fix / open). 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 (secret). Sent as the Bearer for the Shipeasy MCP server handed to each run inline — never in the prompt text or the run env. 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 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. The WHOLE catalogue is installed — skills added to the library since your last setup land here, not just newer bytes for what you already have (--only-installed keeps it to what's on disk).
  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
--only-installedoptionalRefresh only the skills already on disk — don't add missing ones
--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
--only-installedoptionalRefresh only the skills already on disk — don't add missing ones
--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
--no-skillsoptionalEnable the module only — don't install its how-to skills

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
Was this page helpful?
Updated August 8, 2026

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 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 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 revoke