ekso migrate follows the same exit-code convention as the rest of the CLI (Configuration) plus a few migration-specific patterns. This page covers what each code means in context, common per-source failures, and how to recover.
Exit codes in context
The CLI prints a structured error block on every non-zero exit identifying which row in the cache (and which field, when relevant) caused the failure.
Recovering from a partial apply
Apply is idempotent and resumable. If something fails halfway:- Read the error message — it tells you which row failed and why.
- Fix the underlying cause (a bad value in the cache, a missing field-map entry, a permissions issue on the destination).
- Re-run apply with
--resume. Already-applied rows are skipped via the IdMap; the run picks up at the failed row.
collect to rebuild the cache, then re-run apply.
Common per-source errors
Jira
Linear
Azure DevOps
Zendesk
Gemini
How to read the apply summary
Afterapply completes (success or failure), the CLI prints a per-entity summary:
- created — new rows written to Ekso.
- matched — existing Ekso rows reused (users, mostly).
- skipped — rows the IdMap said were already applied (typical on
--resume). - errors — non-fatal failures (e.g. attachment too big, comment with malformed HTML). Apply continues; exit code reflects whether any errors occurred.
errors, scroll up — every error has a structured log entry above the summary identifying the source-id that failed and the specific Ekso response.
When to re-collect vs re-apply
Getting help
- The CLI’s
--helpreflects the binary you have installed — treat it as the source of truth if these docs and your CLI ever drift. - Run with
--verboseto see request/response details. - Open an issue at github.com/EksoHQ/CLI/issues with the cache file (sanitised) and the verbose log.
Where to next
- Command reference — every command and flag.
- Identity resolution —
--user-strategydeep-dive. - Field mapping —
migration.fields.yamlformat.