* feat: add --provider to exp run and a standalone `orx instance create`
Two ways to spin up compute from any provider, not just RunPod:
- `orx exp run --provider <name>` provisions an experiment run on the
chosen provider (omit = server default, RunPod).
- `orx instance create <orgId> (--gpu ... | --cpu ...)` spins up a
standalone org-level instance via POST /sandboxes — the CLI equivalent
of the dashboard's "Spin up" panel (omit --provider = cheapest offer).
* chore: bump version to 0.1.29
The backend `GET /compute/catalog` wire format changed: each offer's flat
`diskPerGbHour` became a nested `disk` discriminated union, `region` became
optional, and new `bandwidth*` fields were added. The CLI decodes strictly, so
the missing `disk_per_gb_hour` field broke `orx compute` (and `--cpu`) at JSON
decode. This fixes the deserialization and broadens the command:
- Add a `Disk` struct mirroring the backend `zDisk` union (keyed on the
`sizable` bool, optional payloads), replacing `disk_per_gb_hour` on both
`GpuOffer` and `CpuOffer`. Round-trip tests pin both disk shapes, a missing
region, and the ignored `bandwidth*` fields.
- Remove the RunPod-only filter so the catalog shows every configured provider
and region; add a case-insensitive `--provider` filter.
- Add a DISK column to the GPU and CPU tables.
`orx exp run` new instances remain RunPod-only server-side; docs clarify that
`orx compute` now browses all providers regardless.
* Add Cursor to install-skills
Cursor discovers skills under ~/.cursor/skills/<name>/SKILL.md using the
same Agent Skills format as Claude Code, so it reuses the existing shim.
Detected via ~/.cursor like the other agents, so login auto-install now
covers Cursor-only machines (previously they relied on Cursor scanning
~/.claude/skills, which only helps if Claude Code is also installed).
* 0.1.20
* Make the post-login skill install consent-based
orx login no longer writes into agent config dirs unprompted. When run
interactively it lists exactly what would be installed — file count and
name -> path per detected agent — and asks [Y/n]; nothing is written
without a yes. Non-TTY (CI, agents, pipes) skips the offer entirely.
Explicit orx install-skills is unchanged.
* Remove orx diff; compute run diffs locally via the cache-dir clone
- Delete the diff command and its client plumbing (the server endpoint
stays for the web UI).
- orx exp status now prints the node's branch, the parent's branch, the
latest run's full commit SHA, and a ready-to-paste local git diff
recipe (owner/repo resolved via a new find_project client helper).
- SKILL.md/README: the clone in ~/.cache/openresearch/repos is the
standard way to read, diff, and edit experiment code.
- Bump version to 0.1.17.
* Add clone-if-missing guard to local diff recipes
The diff recipe (SKILL.md and the one orx exp status prints) started at
git fetch, which fails on a cold cache. Prepend the same idempotent
guard the editing recipe uses.
- `orx --version` (clap) and `orx version [--check] [--json]`: prints the
CLI version and compares it to the latest GitHub release. `--json` is
the agent-facing form (stable stdout object, exit 0 either way).
- `orx update [--dry-run] [--force]`: updates in place by re-running the
cargo-dist release installer pinned to the existing install prefix
(CARGO_DIST_FORCE_INSTALL_DIR), the same mechanism as axoupdater/uv but
without the native-tls dependency that conflicts with our musl builds.
Guarded by the cargo-dist install receipt (refuses cargo-install copies,
path/version mismatches, Nix/Homebrew paths, unwritable bin dirs), an
exclusive flock against concurrent updates, and run via `sh script` so
noexec /tmp mounts don't break it.
- Passive nudge: at most one background latest-version check per 24h
(cached in the config dir), printed to stderr only on interactive
terminals, never in CI/pipes, never altering exit codes. Opt out with
ORX_NO_UPDATE_CHECK, NO_UPDATE_NOTIFIER, or OPENRESEARCH_CLI_DISABLE_UPDATE=1.
Latest-version discovery uses the releases/latest/download/dist-manifest.json
permalink (CDN redirect, no GitHub API rate limit) instead of the REST API,
whose 60 req/h/IP unauthenticated cap is routinely exhausted on the
datacenter IPs agents run from.
Drop the --repo/--ref flags and the empty-baseline path. A project's repo is
now bound at project-creation time on the web, so create-experiment has two
shapes: a child off --parent, or a baseline materialized on the project's
already-bound repo. Replace CreateEmptyBaselineBody/import-from-repo wiring
with a simplified ImportBaselineBody (optional title/description plus
generateSuggestions).