Releases: hdresearch/vers-cli
v0.12.0
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 --publicBehaviors:
- Fail-fast validation: bad
<repo>:<tag>shape errors with the enumerated message and creates no commit; missing repo errors with avers repo createhint and creates no commit. - Tags create-or-update atomically per write. If a tag already exists, its
tag_idis preserved and onlycommit_idadvances. --publiccallscommit publishon the new commit after tag writes succeed.- When
--tagreferences a public repo but--publicwas 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 --waitWith 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()— mirrorsGetAPIKey:VERS_ORGenv 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
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 updatevers 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 foundbeing on stdout, they'll need2>&1now. --public=falseno longer works (see above).- Everything else additive.
Full Changelog: v0.11.1...v0.11.2
v0.11.1
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" --jsonRequires 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 → 120stestutil.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
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 version1. 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.jsonllocally; opt-in upstream POST viaVERS_FEEDBACK_ENDPOINT.vers feedback listreads the journal with pagination.vers jobs list / get / prune— durable job ledger at~/.vers/jobs.jsonl. Every--waitinvocation acrossrun,branch,deploy,resume,run-commitnow writes start/completion entries. (Resumption is Phase 2, tracked in #194.)vers get— replacesvers info(alias preserved). Aligns with the canonicalget/list/create/update/deletevocabulary already used byrepo getandtag get.
CLI surface improvements
--jsoneverywhere. 19 commands that exposed--format jsonnow have a dedicated--jsonboolean. The old--formatflag 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, andaliasnow 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--formatvalues 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 infostill works as an alias forvers get.--format jsonstill 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
--waitvia the job ledger - #195 — F18 Phase B: server-side endpoint for
vers feedback
Full Changelog: v0.10.1...v0.11.0
v0.10.1
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
v0.10.0: interactive stdin for vers exec
v0.9.0
Merge pull request #174 from hdresearch/ty/exec-api feat: switch execute to orchestrator API
v0.8.0
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
v0.7.4: add --email flag to vers signup, persist email and SSH key pa…
v0.7.3
Merge pull request #170 from hdresearch/fix/signup-no-interactive-prompt fix: remove interactive org prompt from signup, require --org flag