Enable App.JSON and add -json on golang-cli v1.4.0, mirroring evpnc so
the two CLIs' JSON contract is identical: show/query -> data, set/action
-> {}, failure -> {"error": "..."}.
- show/query commands branch on cli.IsJSON() -> emit the protobuf via
cli.EmitJSON; text keeps the tabwriter painters (which robot tests
parse via show, not via setter output).
- action commands (pause/resume/enable/disable, set weight, sync,
config reload) are now silent on success in text too — "we did what
you asked" needs no confirmation — and print "{}" in JSON via wrapJSON.
- config check stays informative (it is a query): text "config ok" /
error, JSON the CheckConfig report.
- errors: formatError returns {"error": "..."} in JSON mode.
- watch streams its own JSON events (no trailing {}).
Robot tests assert backend state via `show`, not setter stdout, so the
dropped confirmations don't affect them. Builds on linux and openbsd.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replace maglevc's hand-rolled command-tree CLI with
git.ipng.ch/ipng/golang-cli v1.3.0, mirroring the evpnc refactor. The
tree (commands.go) and the gRPC-status error unwrap (color.go) stay
app-specific; the generic parts — parse tree, completion, '?'-help, the
readline shell, one-shot dispatch, color helpers, and the watch keypress
handler — now come from the library.
- main.go: a single cli.App[grpcapi.MaglevClient] with a Connect
callback; drops the flag/color-default/dispatch boilerplate.
- commands.go: `type node = cli.Node[grpcapi.MaglevClient]`; label() ->
cli.Label(); dyn* gain the captured-args parameter the library's
Dynamic signature carries; runQuit returns cli.ErrQuit.
- watch.go: keypress.WaitForKey replaces the inline cbreak helper.
- color.go: only formatError remains, reading cli.ColorEnabled().
- delete tree.go, complete.go, shell.go.
- tests use the library API; add TestTreeValid (cli.Validate).
Behavior is unchanged except labels/errors now use the library's bright
ANSI palette (was dark); escape lengths are identical so tabwriter
alignment is unaffected. maglevc additionally gains the OpenBSD readline
fix and BSD-correct watch keypress it previously lacked. Builds on linux
and openbsd.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- cmd/frontend/web: honour ?instance=<hostname> query parameter on the
initial scope hydration so /view/?instance=lb-ams opens the dashboard
scoped to that maglevd. The cookie is updated on consumption; an
unknown name still falls back to the first server via App.tsx.
- cmd/client, cmd/frontend: --server now accepts bare hostnames. A new
internal/netutil.EnsurePort canonicalises addresses by appending
:9090 when no port is given, with bracketing for bare IPv6 literals.
Unit test covers the IPv4/IPv6/bracketed/already-ported permutations.
- Makefile: new self-documenting `help` target as the default rule;
every user-facing target now carries a `## ` description that the
awk-based help auto-extracts. fixstyle-web skips with a friendly
message when prettier isn't installed instead of failing on npx.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Bump VERSION to 1.0.0 and cut the first tagged release of vpp-maglev.
Also in this commit:
- maglevc: MAGLEV_SERVER env var as an alternative to the --server
flag, matching the MAGLEV_CONFIG / MAGLEV_GRPC_ADDR convention on
the other binaries. The flag takes precedence when both are set.
- Rename cmd/maglevd -> cmd/server and cmd/maglevc -> cmd/client so
the source directory names are decoupled from binary names (the
frontend and tester commands already followed this convention).
Build outputs and the Debian packages are unchanged.