v0.65.0 — cli-tools joins the roster
profullstack/cli-tools went public today, so moshcode can install it like anything else:
moshcode install cli-tools
That is one step for seven commands — blog-post, domainfree, domainjson, gh-prs, gh-prs-merge, gh-prs-fix-all and tcfeed — plus the cli-tools dispatcher that fronts them. Afterwards /cli-tools list, /cli-tools update and the rest pass straight through from the pit.
Why this entry is not shaped like its neighbours
Every other tool in the roster is one product with one binary. UGig installs ugig; Spinifex installs spx. This one installs a set, and three fields had to change because of it.
bin probes the dispatcher, not the commands. The obvious thing would be to check for gh-prs and call it a day. That answer is wrong on exactly the machines where it matters: anyone who has been using these tools already has gh-prs and tcfeed on PATH from a hand-rolled checkout, so probing either would report the set installed when six of the seven are missing. cli-tools is the one name that only exists if the whole thing landed.
binDirs covers ~/.local/bin. The installer symlinks there and appends nothing to PATH, so the shell that ran the install cannot see the result and would report the tool missing the moment it finished installing it. Same gap turso, gradient and kimi already needed covering.
upgrade is the tool's own updater, not a re-run of the installer. Re-running an installer is the right upgrade path for a self-contained binary, and the wrong one here. cli-tools update pulls and relinks the checkout that actually owns the commands — which for a contributor is somewhere under ~/src, not the path a fresh install would have picked — and it refuses to move a dirty or diverged tree rather than quietly discarding work. Pointing upgrade at the installer would have cloned a second copy beside the first and left the original still on PATH.
What you get on the other side
The commands are real executables rather than shell functions, so they work from an interactive shell, from zsh -c, from a systemd unit and from a CI step alike, with nothing having been sourced first.
cli-tools aliases --install will merge a thin set of pit aliases — /blog, /free, /merge, /prs, /whois — into ~/.moshcode/aliases.json. It merges rather than replaces: a name you bound yourself is kept and the collision is reported, never silently repointed. None of them shares a name with a command, because a shell function beats PATH and an alias named after the file it wraps would shadow it.