ZenNotes CLI 0.6.1
ZenNotes CLI 0.6.1
A fix release from a full QA sweep of every zn command against a local vault, a Docker-hosted ZenNotes server, and native managed servers under systemd, plus MCP over stdio and the TUI in a real terminal. Two of the fixes come from reports in Discord. Every fix carries a regression test.
Faster startup everywhere
Every zn command, zn --version included, waited five seconds on terminals that never answer a background-color query (the Linux console, some IDE and serial terminals): the terminal library asked for the background before main ran and timed out. Startup no longer queries the terminal. The TUI's automatic theme and zn read --pretty still ask, once and on purpose, when they need the real answer.
Vaults and servers you can actually forget
zn vault list now shows where each entry comes from: terminal for the vaults and servers zn saved, app for the ones the ZenNotes desktop app knows. The JSON output carries the same source field. zn vault remove, zn disconnect and zn use explain when a name belongs to the desktop app, suggest the saved name that contains what you typed (workspace finds workspace (notes.example.com)), and list zn's own names. An exact saved name wins over another entry's folder or host.
zn vault remove of a server also forgets its token, as zn disconnect does; it reports a token that could not be removed and restores the token if the list cannot be saved, so a failed removal is always retryable. It supports --json and completes names. zn use <desktop vault name> adopts that folder instead of failing.
Help that lines up
Rows whose name is wider than the command column (comment reply <path> <id> "<body>", --workspace-source <app|terminal>) ran straight into their descriptions. A wide name now takes a line of its own and every description starts at the column.
Your saved vaults survive a broken config file
A workspaces.toml or credentials.toml that failed to parse was treated as an empty list, so the next zn connect, zn init or zn vault add wrote that empty list back and lost every saved vault, server and token. zn now refuses to write over a file it could not read and says what to fix. zn connect refuses up front, zn doctor reports a saved vaults check and a credentials parse problem (showing only a line number, never a token), and zn status warns.
Databases
Record pages for rows with only a title were written with an empty frontmatter block that the frontmatter parser did not recognise, so every zn base set added another pair of --- fences. Empty blocks are recognised, pages without properties get no block, re-mirroring is idempotent, and pages from earlier builds shed their stray fences on the next edit.
Smaller fixes
- A body that starts with a frontmatter fence can follow
--body; any value starting with---or-xis a value, not the next flag. zn tag find --tag <tag>works as documented.- Typo suggestions count a swap of adjacent letters as one edit, so
zn lsitsuggestslist. zn delete <missing> --yesreportsNote not foundon a local vault instead of printingDeleted, matching a server's answer.- Ctrl-C on
zn server runno longer printscontext canceledtwice; it exits 0 after the server's own shutdown line. zn mcpexits quietly when the client closes the pipe, which is how MCP clients end a session. Genuine transport failures still surface.
Upgrade
zn updateStandalone macOS and Linux installations of 0.6.0 update in place and keep zn.previous as a backup. Homebrew users run brew update && brew upgrade zn. With Go:
go install github.com/ZenNotes/tui/cmd/zn@v0.6.1Or download an archive below. Desktop-managed installations receive the CLI pinned by their desktop release; publishing this CLI release does not change an existing app bundle.
Verification
Full Go race tests, vet, gofmt, Windows/macOS/Linux builds, both contributor sandboxes (local and real-server), and the release artifacts themselves: all seven archives verified against checksums.txt and GitHub's asset digests, zn --version and the desktop integration probe report 0.6.1, and a copied standalone 0.6.0 binary updated itself to the published 0.6.1, byte-identical to the archive, with its backup retained. The QA sweep ran about 1,400 scripted assertions across roughly 730 command invocations: local vault and data matrix, zn connect to a Docker server with the same matrix, the managed-server lifecycle (install, start, status, logs, restart, bind and base-path changes with rollback, update 2.55.0 to 2.56.0, rollback, pin, downgrade, stop, foreground run), diagnostics, configuration, completion, MCP, and the TUI driven in a pty including the first-run wizard.