v0.25.0
·
20 commits
to main
since this release
Minor Changes
- CLI and platform fixes ported from the reviews branch on their own. Behavior a script may notice:
secrets configs deletenow asks for confirmation (new — there was none) and--jsonrequires--yes;app create --jsonrefusesinvalid_flags(it used to die on the scaffolder's own option parser with no envelope);secrets get --plain --jsonandsecrets download --jsonrefuseinvalid_flags;workspace droprequires--abandon-unseenwhenever this seat does not hold the workspace's published tip (no checkout, or the branch was never materialised locally) and reportsdiscardedTip; a-a <other-app>from a checkout that declares a different app refusesapp_checkout_mismatchinstead of re-aiming thespaceremote;push --forceis refused for a tip this checkout did not publish withdeepspace push(the push record is written only when a push actually lands, no longer onup_to_date); apushrefused for a committed secret no longer hands back agit rm --cachedaction and lists thefiles; a push transport failure carriesgitError; every escaped refusal can now exit 2 with anaction(status,logs,secretsincluded);pushandpullconfigure a repo-local git identity when the checkout has none (they hand back committing recoveries);logsbounded output'smetaframe gainsappId/retentionDays;workspace list --jsongainstruncated;workspace land --jsongainslocalTrunkBehindand its pull action names the branch and app;workspace syncon a finished workspace hands back a drop action;secretsvalidation refusals carry codes (invalid_config_name,invalid_secret_name,reserved_secret_name,secret_too_large,invalid_format). Fixes:secretsrefusals render through the one CLI renderer (configs deleteconfirms and takes--yes;get --plain --jsonanddownload --jsonrefuseinvalid_flags; piped stdin reads asynchronously; upload file errors carryfile_not_found/file_unreadable);pushno longer records a fast-forwarded peer commit as your own last push (which let a later--forcedrop it), distinguishes strictly-behind from diverged, offers--forceonly for a rewrite of your own line, scans the whole push range for secret files (and stops handing back agit rm --cachedaction that never resolved the refusal), and codespush_too_large/repo_full;statusreportsloggedInfrom either credential and asessionErrorinstead of asserting an identity off an expired token;workspace status/list/drop/land/syncclassify sync by ancestry (a strictly-behind checkout is no longer "healthy"), fetch the published tip when it is absent, mark truncated lists, prune phantom worktrees, refuse to drop unseen commits (workspace_behind,--abandon-unseen), and name the checkout that should pull after a land;logs --follow --jsonopens with areadyrecord; every refusal envelope carries its code and action from one renderer; a vanished cwd isworktree_missing; command suggestions understand transpositions and aliases and never carry flag values intoaction.argv;deepspacerefuses to re-aim thespaceremote at a different app than the checkout declares, and configures a repo-local git identity in that one place; peer-authored text (refs, tasks, log lines) is neutralised at the constructors that render it. Platform: annotated tags resolve in the code browser and history, the activity cursor can no longer park past the tail,isAncestorwalks first parents first, workspace tasks are validated by code point, andlistWorkspacesreports truncation. - Push refusals are structured end to end. The cloud repo now prefixes every
ng <ref> <reason>line with a machine code (<code>: <sentence>[ — <detail>]) from one table —push_too_large,repo_full,secret_committed,stale_ref,missing_objects,thin_pack,not_attempted,bad_tip,funny_refname,internal_ref,workspace_creator,unpacker_error,push_failed— a busy repo is still an HTTP 503 withRetry-After, not anngline — sodeepspace push,workspace sync, andworkspace landclassify a refusal by its code instead of matching the server's prose. Every prose regex in the CLI is gone; an atomic push'snot_attemptedsiblings no longer mask the real refusal; the CLI names the committed secret files the server reports; new--jsonslugsmissing_objects,thin_pack,funny_refname,internal_ref,bad_tip,unpacker_error,workspace_creator. Rollout: a new CLI against an older worker sees untagged reasons and reports them asrejectedwith the server's own sentence; an OLDER CLI against the new worker loses its automatic--no-thinretry and its oversized-blob naming until upgraded — the refusal sentence itself still says what to do (git push --no-thin, remove or LFS the object). Plaingit pushstill receives its refusals in-band on thengline; the sentences are reworded (stale ref, fetch first;not attempted, the push is atomic and another ref was refused; the size figures move into the detail) and now carry the leading code.
Patch Changes
- Raise the hono floor to ^4.12.34, the minimum release carrying the fixes for the 2026 hono security advisories (CORS credential reflection, bodyLimit bypass, cookie-name validation, and related middleware issues), in the SDK's dependencies and the scaffold template.