ds — CLI for the remote Xcode service
ds xcode build . # compile; default destination generic/platform=iOS Simulator
ds xcode test . # run XCTest; default destination iPhone 16 simulator
ds xcode archive . # Release .xcarchive
Common flags: --scheme, --workspace X.xcworkspace / --project X.xcodeproj, --configuration,
--destination '<xcode destination>', --xcode 16, --env KEY=value (repeatable), --timeout <s>,
--only-testing T / --skip-testing T / --test-plan P, --collect-app, --no-follow, --json.
ds xcode run . builds for a simulator on a worker and prints a browser link where you can use the
app live (tap, swipe, type). --device 'iPhone 16 Pro', --idle 600 (end after N idle seconds),
--timeout caps the session; Ctrl-C or ds xcode stop <job> ends it.
Other commands: ds xcode status <job>, ds xcode logs <job> [--after N], ds xcode cancel <job>,
ds xcode artifacts <job> [--download <artifact_id> --out file], ds xcode jobs [--status queued].
Config: DS_API_URL (e.g. https://<host>/v1/xcode), DS_API_KEY (dsx_…, minted by an operator via
POST /v1/xcode/admin/keys). Exit code 0 on succeeded, 1 otherwise; --json prints one JSON line per
event and a final job object.
How a run works
- Walk the directory (
git ls-files when it is a git repo, so .gitignore applies) plus .dsignore
and built-in excludes (DerivedData, build, .build, node_modules, *.xcresult, *.xcarchive, .git).
Symlinks are skipped with a warning.
- Hash every file (sha256) and
POST /sources with the manifest. The API answers with the hashes it
does not have for your tenant plus a signed upload URL for each.
- Upload only those blobs directly to storage (8 in parallel), then
POST /sources/{id}/complete.
Editing one file and re-running uploads exactly one blob.
POST /jobs → 202 {id, status: "queued"}.
- Follow
GET /jobs/{id}/events as SSE; the server caps a connection at ~55 s and the CLI reconnects
with Last-Event-ID, so nothing is missed.
GET /jobs/{id} for the final structured result (diagnostics, test counts, artifacts, timings).
Install
npm install -g @doublespeed/ds