Skip to content

Releases: hdresearch/vers-cli

v0.12.0

12 May 04:48
8010630

Choose a tag to compare

Minor release: three new agent-friendly features.

vers commit create --tag and --public (#203)

The create-then-tag-then-publish dance collapses to one command. --tag is repeatable and updates existing tags in place:

vers commit create vm-123 --tag my-app:v1.2 --tag my-app:latest --public

Behaviors:

  • Fail-fast validation: bad <repo>:<tag> shape errors with the enumerated message and creates no commit; missing repo errors with a vers repo create hint and creates no commit.
  • Tags create-or-update atomically per write. If a tag already exists, its tag_id is preserved and only commit_id advances.
  • --public calls commit publish on the new commit after tag writes succeed.
  • When --tag references a public repo but --public was not supplied, a stderr warning explains the visibility mismatch and emits the exact recovery command. The commit stays private (conservative default).

Unblocks #202 (a future vers publish top-level command that wraps this with even cleaner ergonomics).

vers run-commit --ref (#186)

Boot a VM directly from a <repo>:<tag> reference instead of resolving to a commit UUID first:

vers run-commit my-app:latest --ref --wait

With a friendly nudge when a repo:tag-shaped argument is passed without --ref:

Error: 'my-app:latest' looks like a repo:tag reference; did you mean '--ref'?
  vers run-commit my-app:latest --ref

Org identity persisted in ~/.versrc (#199)

The login/signup API response includes org_name and org_id. Previously the CLI printed them in the success banner and discarded them. Now they're persisted alongside the API key.

New helpers:

  • auth.SaveAuth(apiKey, orgName, orgID) — single-write helper used by login/signup. Empty values don't clobber persisted ones.
  • auth.GetOrgName() — mirrors GetAPIKey: VERS_ORG env wins, falls back to config.

Unblocks #200 (surface persisted identity via vers whoami, agent-context, and synthesized <org>/<repo>:<tag> references in repo get).

Backwards compatibility

Strictly additive. Existing ~/.versrc files without orgName/orgID continue to work; fields populate on next login/signup.

Full Changelog: v0.11.2...v0.12.0

v0.11.2

12 May 02:21
a5293c9

Choose a tag to compare

Patch release: fix for a stdout-contamination bug that broke vers <cmd> --json | jq pipelines, plus the rest of the agent-native repo/tag work from PR #197.

The bug (#198)

vers run --json was emitting the Warning: vers.toml not found, using default configuration line on stdout instead of stderr, contaminating JSON output and breaking the canonical pipe:

$ vers run --json | jq .vm_id
jq: parse error: Invalid numeric literal at line 1, column 8

Fix: route diagnostics to stderr across six call sites (the headline runconfig warning plus five siblings in presenters/ and handlers/). After this, stdout stays clean JSON for any agent piping output.

$ vers run --json | jq .vm_id
"a46c92a9-36b2-477a-a6f6-694b74945b09"

Addresses agent-native CLI principle 2 (data on stdout, diagnostics on stderr).

Other changes

--json on mutating repo/tag commands (#197)

Six commands gained machine-readable output so agents can grab IDs/references from stdout:

  • vers repo create{name, repo_id}
  • vers repo visibility{name, is_public}
  • vers repo tag create / repo tag update
  • vers tag create / tag update

vers repo visibility flag mutex (#197) — breaking

Replaced the awkward --public[=false] pattern with two mutually-exclusive flags:

vers repo visibility my-app --public     # was --public
vers repo visibility my-app --private    # was --public=false

Breaking change: --public=false no longer works. Cobra's mutex group rejects boolean values on these flags. Scripts using the old form will get a parse error; migrate to --private.

Backwards compatibility

  • The stderr fix may affect scripts that captured combined stdout+stderr and parsed the warning text. Unlikely, but if anyone was relying on Warning: vers.toml not found being on stdout, they'll need 2>&1 now.
  • --public=false no longer works (see above).
  • Everything else additive.

Full Changelog: v0.11.1...v0.11.2

v0.11.1

12 May 01:03
8bb4560

Choose a tag to compare

Patch release: CI flake fix + commit create metadata flags.

What changed

vers commit create --name/-n and --description/-d (#183)

Commits can now be given human-readable names instead of the auto-generated commit: of_vm=<uuid> timestamp=<ts> format.

vers commit create --name "golden-image-v3"
vers commit create --name "pre-deploy" --description "Before deploying auth changes"
vers commit create vm-123 --name "checkpoint" --json

Requires the matching API support (hdresearch/chelsea#1070). Older API servers will silently drop these fields.

Integration test timeout fix (#196)

Integration tests had been flaking on every recent PR because testutil.DefaultTimeout (60s) and the CLI's own APILong (60s) were equal, leaving zero margin when VM provisioning legitimately took ~60s. Two bumps:

  • APILong: 60s → 120s
  • testutil.DefaultTimeout: 60s → 180s

User-visible impact: vers run, vers branch, vers run-commit, and vers deploy now error after 120s on hung API calls instead of 60s. Users relying on fast-fail at 60s will wait up to twice as long for a real failure — but the increased budget prevents spurious failures on slow VM provisioning. Agents using --wait are unaffected.

Commits

Full Changelog: v0.11.0...v0.11.1

v0.11.0

08 May 04:47
78779c7

Choose a tag to compare

Two parallel rounds of agent-native CLI fixes, sourced from Trevin Chow's 10 Principles for Agent-Native CLIs and Cloudflare's Wrangler vocabulary rules. Implemented across PRs #190 and #191.

Highlights

New commands

  • vers agent-context — versioned JSON describing every command, subcommand, and flag for agent introspection. Schema version 1. Includes an annotation hook (vers:enum:*) for declaring enum constraints (#192 tracks the sweep to populate them).
  • vers feedback "..." — report friction back. Writes to ~/.vers/feedback.jsonl locally; opt-in upstream POST via VERS_FEEDBACK_ENDPOINT. vers feedback list reads the journal with pagination.
  • vers jobs list / get / prune — durable job ledger at ~/.vers/jobs.jsonl. Every --wait invocation across run, branch, deploy, resume, run-commit now writes start/completion entries. (Resumption is Phase 2, tracked in #194.)
  • vers get — replaces vers info (alias preserved). Aligns with the canonical get/list/create/update/delete vocabulary already used by repo get and tag get.

CLI surface improvements

  • --json everywhere. 19 commands that exposed --format json now have a dedicated --json boolean. The old --format flag is preserved as a hidden, deprecated alias and emits a stderr warning.
  • Pagination on every list command. status, commit list, repo list, repo tag list, tag list, env list, and alias now support --limit N (default 50; 0 = unbounded) and --offset N, with truncation hints in both JSON envelope and stderr text.
  • Centralized format/quiet precedence in presenters.ParseFormat: quiet > json > format > default. Invalid --format values now error with an enumerated message instead of silently falling through.

Behavior change worth flagging

List commands now default to --limit 50. If you have a script that depends on getting all results from vers status or vers commit list, add --limit 0 to opt back into unbounded output.

Backwards compatibility

  • vers info still works as an alias for vers get.
  • --format json still works on every command that previously accepted it (with a deprecation warning).
  • All other existing flags and behaviors unchanged.

What's next

Follow-up issues opened for the remaining audit findings:

  • #192 — Annotate bounded-input flags with vers:enum:* (uses the F11 hook)
  • #193 — Surface feedback + jobs paths in vers agent-context
  • #194 — F14 Phase 2: resumable --wait via the job ledger
  • #195 — F18 Phase B: server-side endpoint for vers feedback

Full Changelog: v0.10.1...v0.11.0

v0.10.1

07 May 00:17
dc90463

Choose a tag to compare

Bug fixes:
- update: 'update available' nag now actually prints. Previous code
  raced itself: a detached goroutine fetched from GitHub while the
  process was already exiting, and NextCheck got bumped *before* the
  fetch even started, suppressing the nag indefinitely. Now uses a
  synchronous, bounded (800ms) check with a disk-cached latest-tag,
  so subsequent runs print the banner with zero network I/O.
- update: pseudo-version builds (v0.0.0-...) and dirty/dev builds are
  now correctly recognized as dev versions and skip the check.
- update: VERS_NO_UPDATE_CHECK / NO_UPDATE_NOTIFIER env vars now
  silence the check (e.g. for CI / scripted use).
- update: banner now writes to stderr so it cannot contaminate
  stdout when piping CLI output through grep/jq/etc.

Cosmetic:
- Stripped emoji and decorative glyphs from CLI output. Status
  messages now use lowercase compiler-style prefixes
  (error: / warning: / note:) matching gcc/rustc/clippy/go.
- ASCII tree drawing for commit lineage display.

PRs: #188, #189

v0.10.0

14 Apr 19:42
9f212f2

Choose a tag to compare

v0.10.0: interactive stdin for vers exec

v0.9.0

09 Apr 22:43
c3f1b60

Choose a tag to compare

Merge pull request #174 from hdresearch/ty/exec-api

feat: switch execute to orchestrator API

v0.8.0

06 Apr 22:06

Choose a tag to compare

test: add integration test for repo lifecycle against production

Tests the full CRUD lifecycle:
  create repo → list → get → create VM → commit → create tag →
  list tags → get tag → update tag → delete tag → delete repo

Cleans up all resources (repo + VM) via t.Cleanup regardless of
test outcome. Uses unique repo names to avoid collisions.

v0.7.4

05 Apr 23:44
8a3fb09

Choose a tag to compare

v0.7.4: add --email flag to vers signup, persist email and SSH key pa…

v0.7.3

04 Apr 01:08
5f89c95

Choose a tag to compare

Merge pull request #170 from hdresearch/fix/signup-no-interactive-prompt

fix: remove interactive org prompt from signup, require --org flag