Skip to main content
pull fetches every definition the manifest lists and writes it to that entry’s source file, exactly as the platform returned it. It is the command that starts a project from a revision someone else built in the browser, and the command that brings a visual-editor change onto disk where you can read it. It is a read: it never creates a definition, never modifies the manifest, and needs only a revision it can read.

Synopsis

What it does

  1. Loads and validates the manifest, then resolves its blob and revision. Reading allows phase draft, commit or managed — a committed revision is pullable even though it is not deployable.
  2. Lists the revision’s workflow and playground definitions and matches them against the manifest by the (category, alias) pair.
  3. For each manifest entry, downloads the definition document and writes it to source, creating any missing parent directories. An entry with no matching definition on the revision is reported, not created.
  4. Prints drift first, then one line per definition:
Under --json the payload carries pulled, missing, planned, dry_run and drift, alongside the envelope’s schema_version. planned is populated only under --dry-run, and pulled only without it.

Verbatim, and code-unaware

The document is written as it arrived. pull does not know that a code port holds Python, does not compile anything, and does not consult the manifest’s components[] bindings at all — a definition entry with no bindings pulls exactly like one with three. The file is written in its own format, decided by the source extension: .json gets two-space indent and a trailing newline, .yaml/.yml gets block style with key order preserved. A playground’s layout round-trips byte-for-byte, which matters more than it looks: the platform canonicalizes layout at creation and rejects an upload whose layout differs, so a pull that reshaped it would break the next push. pull overwrites the local file unconditionally. There is no --force, because there is nothing to guard: the definition file is an output. If you have local edits you care about, run diff or --dry-run first.

It never rewrites the manifest

Even when revision: latest resolved to a concrete UUID, the manifest is left as written. Rewriting a file you hand-wrote is a side effect nobody asked for — and if you deliberately pinned a UUID that happens to equal today’s latest revision, rewriting it to latest would silently change what the manifest means tomorrow.

The first pull of a playground

Category is normally inferred from the local document’s own type. On a first pull there is no local document to read, so an entry that declares no category: defaults to workflow — and a playground definition pulled that way simply reports as missing on the revision. Declare category: playground in the manifest entry for anything you are pulling for the first time.

--dry-run

Resolves the blob, the revision and the definition set, then reports what it would write without downloading or touching a file:

Errors

A local file that does not parse still fails the command: pull reads each source before writing it, to decide the entry’s category. Delete an unparseable file rather than pulling over it. Every code above, with its remediation, is in Error codes.

See also