Status and diff
Two views of a local tree: celigo status is offline and answers "what did I change since the last pull"; celigo diff fetches the live account and answers "how do my files differ from the server". Both are informational by default and become CI gates with --exit-code, like git diff --exit-code.
celigo status
Compare the tree against .celigo/manifest.json. No API call, no token, no profile check — it is instant and safe anywhere.
Signature
celigo status [flags]Flags
--dir <path>
string
.
Tree root directory.
--exit-code
boolean
false
Exit 1 when the tree is not clean. Without it, status exits 0 even when the tree is dirty — a pull-request branch normally is.
Output
Each list is in alphabetical path order:
modified: exports/Get Orders/export.json
missing: imports/Old Import/import.json
moved: exports/Orders/export.json → exports/Get Orders/export.json (folder names follow the resource's own name — `celigo pull` moves it back)
untracked: exports/New Orders/export.json (no _id — push will create)
unreadable: integrations/Shop/connections/Shopify.link.json unresolved git merge conflict (conflict markers at line 3)modified
A tracked file's content differs from the hash recorded at the last pull or push.
missing
A tracked file is gone. push --prune deletes the resource; celigo pull restores the file.
moved
A resource folder was renamed locally. One event, never a missing plus an untracked, so push --prune cannot delete a resource over a rename.
untracked
A file the manifest does not know. With no _id, push creates it.
unreadable
A pull-generated .link.json pointer or .external.json stub that no longer parses (git conflict markers, invalid JSON). Nothing is pushed from such a file and celigo pull rewrites it, but the tree is not clean.
A clean tree prints Clean — no local changes since <time of this machine's last pull>. With --format json the report is a JSON object with the same lists.
A CRLF checkout is not an edit: a .json, .js, or .md file that differs from its recorded hash only by \r\n line endings or a leading UTF-8 BOM is clean. Storage content files are compared byte for byte, because \r\n in them is data.
Example
celigo diff
Compare the tree against the live account. The CLI fetches fresh copies, ignores volatile fields, and prints field-level differences with JSON-pointer paths.
Required: read mode is enough.
Signature
Arguments
[refs...]
file path, type:id, or bare id
No
The resources to compare. With no refs, diff compares only the files the checkout modified.
Flags
--dir <path>
string
.
Tree root directory.
--exit-code
boolean
false
Exit 1 when any compared resource is changed, deleted on the server, or local only. Default: exit 0.
--concurrency <n>
integer
8
Requests in flight at once (1–16). CELIGO_CONCURRENCY sets the default.
--target <name>
string
—
Compare against a promote target instead of the tree's own account. See Diff against a promote target.
Output
Changed resources come first, then the rest in tree-path order. Each entry is a JSON pointer with the server's value on the left and yours on the right:
An edit to
script.jsshows up under the document's/content: the editable source and its document are two faces of one resource. Lookup cache data is reported per key under/data/<key>, a sync's datasets under/datasets/<name>, a tampered storage file under/content.A changed value longer than the line is shown as a window around the first differing character on both sides, tagged
(differs at line L, col C)— or(differs at char N)for a one-line value — so two script sources that share a long prefix are reviewable.--format jsoncarries the whole values.Secrets never print. A local value replacing the server's
******mask renders as(set), and so does a new secret-named field (password,token,secret,apiKey, …) on a connection, iClient, or MCP OAuth provider. The masking happens in the entries themselves, so--format jsoncarries no value either, and a diff posted as a CI comment is safe.A tracked file that is not a JSON object, or a
script.jsorinstructions.mdholding git conflict markers, is reported aschangedwith the problem in place of the local value and(not compared)on the remote side, rather than aborting the diff.
The no-ref form compares only what you changed. It cannot see the server drifting on a file nobody edited locally, and says so on stderr: note: only locally modified files were compared — pass refs … to check unmodified resources for server-side drift. To check specific resources for drift, name them:
A moved folder is compared where the file now sits; both the new path and the vacated one are accepted as refs. diff refuses a profile bound to a different account than the tree, with no override, and it never binds an unbound tree — it writes nothing.
Diff against a promote target
celigo diff --target <name> compares against a promote target instead of the tree's own account. For every source document mapped in .celigo/targets/<name>.json it renders what celigo promote --to <name> would send — references remapped, server fields stripped — against the target's live copy. Every mapped resource is compared, refs or not; an unmapped one is local only (promote will create), a vanished target copy deleted in target.
The comparison uses the target's profile — or CELIGO_TARGET_API_TOKEN and CELIGO_TARGET_BASE_URL on a machine with no such profile — never the selected one, in whatever mode that profile is in: it only reads, so a read-mode production profile on a reviewer's machine serves it, while promote itself needs full mode. It announces the target on stderr first: celigo: diff --target tree of profile 'prod' (…) → profile 'sandbox' → api.integrator.io.
Related
Pull a tree —
pull --force <path>takes the server copy of one resource.Push changes —
push --dry-runis the plan;diffis the content.Teams, git, and CI — the PR check that posts
diff --exit-codeandpush --dry-run.
Last updated
Was this helpful?