Files
mesh-catalog/modules/mesh-cli
jochen 6f1c559d93
mesh/merge-gate pass: builds claude-code, route-adapter, new: modules/mesh-cli → ace, g14, novox, shanks; no bus step; every machine composes with the chan…
mesh/repo-check pass: its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)
mesh/delivery delivered
mesh-cli: say an outcome not known, and hold the module to placing one file (review of hq ADR 0272)
A line whose answer did not come in time is said as possibly run, with
its call, never as nothing having run. A test holds the module to one
archive resource unpacking one compiled Go bundle into /usr/local/bin.
The README says the MESH_VERB refusal is a courtesy and the controller is
the gate. SDK pinned at the go/cli branch's newest commit until go/v0.1.9.
2026-10-09 12:49:14 +02:00
..

mesh-cli

The operator's command on every node (novox/hq ADR 0272): mesh-cli <command line> asks the controller to run one of its command lines, from wherever the operator is. In interactive zsh it is also nox.

nox status
nox settings show zsh --node <node>
nox settings set zsh '{"execute":"withhold"}' --node <node>

What it places

What Where How
the program /usr/local/bin/mesh-cli the program bundle, unpacked by an archive resource: the node-engine moves the one file in, refuses to write over a file it did not place, and takes out only that file when the module goes
the alias nox the zsh module's mesh block in ~/.zshrc a shell contribution in the normal slot (ADR 0204)

No link and no second copy. /usr/local/bin is on every account's PATH already, so the module contributes no environment. The alias is interactive zsh only: a script, sudo, a cron line and any document meant to work everywhere say mesh-cli. In interactive zsh the alias hides any other nox (Arch's python-nox installs /usr/bin/nox); command nox still reaches it.

How it is answered

mesh-cli holds no credential and reads no file of the mesh. It writes one request to the node-engine's socket (the SDK's go/cli: the line, as words) and prints the one answer.

  1. The node-engine reads which account is asking from the kernel, never from the program, and asks the controller on its own node's subject.
  2. The controller judges (ADR 0272 §4):
    • the controller's terminal: the node's operator account, on the control-node. The line runs as the operator typed it there.
    • an ordinary call: the node's operator account on any other node, where agents may run as that account. It meets every refusal of the generic command verb, and a change made at the terminal alone is refused with the reason.
    • refused: any other account, root included. Run it as yourself, not under sudo.
  3. A line still running after ten seconds is followed by its call until it ends. mesh-cli prints standard output and standard error as the command wrote them, says why a line was not the terminal or was refused, says when the output was cut to fit one bus message, and exits with the command's status. When no answer comes in time it says the line may have run and names its call; "nothing ran" is said only of a line no controller took.

A process that runs for a verb (it carries MESH_VERB) is refused before anything is asked: a verb is never the operator.

What it does not do yet

  • No standard input. A command that reads one gets nothing, and fails saying so.
  • No local files. A path in a line names a file where the controller runs, read by the controller's account. Give settings inline: nox settings set <module> "$(cat settings.json)" --node <node>.
  • No streaming. The answer arrives when the command ends, within the controller's bound on a call (five minutes). Interrupting mesh-cli stops the wait, not the command.
  • The MESH_VERB refusal is a courtesy. A verb's process is refused before asking, but the gate is the controller: it judges the account the node-engine vouches for, whatever the program says.
  • No other node is the terminal. Phase 2 of ADR 0272 adds a node whose agents run under an account of their own (ADR 0266), judged unable to become root.

Tests

go test ./...: the module places exactly one file (one archive resource, one Go bundle compiled to the binary alone); the line is asked as given and the answer printed with its exit; a reason, a refusal, a cut and an outcome not known are said and a refusal never exits 0; a verb's process is refused before asking; an engine that does not answer is said.