v2.16.4
View on GitHub[2.16.4] — 2026-09-25
Added
- User-level agents are indexed and routed. Agents in
~/.claude/agents/**join the agent registry with originuser, so the prompt hook,monomind pickand thepickMCP tool can choose them in every project; a project agent with the same slug or name wins and the hidden one is listed as shadowed. The registry builder is now one CommonJS helper (.claude/helpers/agent-registry.cjs) shared by the CLI and the hooks, and every session start rebuilds a stale registry, so a new user agent is routed from the next session without running the CLI.monomind initandinit upgradebuild both routing indexes and print their counts, for exampleIndexed 89 agents (1 from ~/.claude/agents) and 569 skills (1 from ~/.claude/skills).pick --jsonagent entries carryorigin, anddoctorshows user and shadowed counts. org_skill_showMCP tool. Input{ name }; returns one Org-library skill's description, tags, tools, origin and body, read locally (catalog skills only while active fororg). Picked Org skills now point at it, so they work without a globalmonomindinstall.- Agents & Skills guide.
doc/concepts/agents-and-skills.mdand a matching page on the docs site explain where agents, skills, slash commands and Org skills live, their frontmatter, how to add and verify each, and how picking works (with Routing as the mechanism deep-dive). The docs now carry auto-counted agent, skill, command and Org-skill totals checked bydocs:counts:check. pick-eval --logsmeasures picking on real use.node scripts/pick-eval.mjs --logs [dir]reads a project's hook logs and scores the current ranker (keyword, or--jev) against the agents actually spawned, with route statistics and the top disagreements (redacted previews only);--export FILEwrites the labelled prompts as atests/pick-evaldataset to review and curate.doctor -c pickadds a linereal use: N spawns, followed X%, current ranker agrees Y% (top-3)once 10 spawns are recorded.browse --session <name>now selects an isolated named session. (Fixes #318) The documented flag did nothing outsideopen, where it only restored saved state; every later--sessioncommand then silently acted on the newest session, so two "named" browsers were really one and one, or asnapshot/scrollcall using-sfor--selectoron a named session, could return the wrong tab. Session records now carry a name:open/connect --session Xstart the session namedXor re-open the live one, any other command with--session Xacts on it and fails withNo live browse session named "X"when there is none, and--sessionhas no-sshorthand onsnapshot/scroll(which use-sfor--selector). A command with no--sessionstill resolves the sole live session in the directory — named or not — and only refuses to guess when two or more are live.@monoes/monobrowse1.0.23.
Changed
- Picks ignore what a prompt rules out. The keyword ranker drops words in the scope of "rather than", "other than", "instead of", "except", "besides", "without", "not", "no" and similar cues, up to the next clause boundary, so "anything else pending rather than release" no longer picks
release-manager; problem descriptions such as "is not loading" keep their words. Status questions like "anything else pending?" now count as trivial and get no[PICK].
Fixed
init --target antigravitygives Antigravity a working status bar. That target turns the helper component off, so nostatusline.cjswas written anywhere and the status bar (.gemini/helpers/statusline.sh) printed nothing. Init now copies the helper tree into.gemini/helperswhen Antigravity is selected without the helper component. It still installs no.claude/helpersor hooks.initwrites.gemini/helpersonly when Antigravity is selected. Only Antigravity's status bar reads that copy of the helper tree, butinitwrote it for every Claude or Codex-with-hooks setup, e.g.--platform claudeor--target codex. Kimi's statusline reads.claude/helpersfirst, so it does not need it. An existing.gemini/helpersis not deleted, andinit upgradestill refreshes it where it exists.- The
orgcommand reference covers every subcommand and flag.org eventsandorg approvalswere undocumented, along with flags such asrun --resume/--budget-usd,create --goal/--schedule,questions --alland the--byresolver flags;serve --forward(which does not exist), theapprove/denyarguments and thesupervisor/test-looparguments were wrong. - The metrics-db hook tests run again. They skipped themselves unless
sql.jsresolved from the repo root, a dependency the helper dropped long ago, and one test always failed; they now check the helper runs with no packages installed, and its nine real tests run. monomind init --with-embeddingsactually prepares embeddings. It shelled out tonpx monomind@latest embeddings init, a command that does not exist, so it always printed "Embedding initialization skipped." It now runs in-process — theembeddings_initMCP tool writes.monomind/embeddings.jsonand downloadsgte-modernbert-basewith the same revision/dtype the memory bridge loads — and offline (or withMONOMIND_NO_LOCAL_EMBEDDINGS=1) it continues with a warning pointing atmonomind doc eval --provision-model.initanddoc ingest --embedderdefault to and describe the embedding model memory search actually uses. Init presets,init --embedding-model, the init wizard andhooks pretraindefaulted toXenova/all-MiniLM-L6-v2(384d) while the memory bridge always embeds withAlibaba-NLP/gte-modernbert-base(768d); the default is nowgte-modernbert-baseeverywhere (MiniLM and MPNet stay accepted choices, and existing.monomind/embeddings.jsonfiles are untouched).doc ingest --embedderhelp said it pickedminilm(384d) orbge-m3(1024d); the flag never worked that way — ingest always shares the 768d memory-bridge store — so it is now documented as deprecated and a no-op, and a non-minilmvalue warns that it is ignored.- A sandboxed Claude role's Bash shell stays pinned to its cwd. (Fixes #339) Claude Code's sandbox makes an existing
hooksorconfigentry read-only from the session cwd down to the shell's current directory, and the shell's directory persists between Bash calls — so a role thatcd'd into a package directory could get a sibling package bind-mounted read-only and fail its tests withEROFS. A sandboxed role now runs withCLAUDE_BASH_MAINTAIN_PROJECT_WORKING_DIR=1, so its shell returns to the cwd after every command. monograph watchno longer silently drops a rebuild. (Fixes #338) When the cross-process build lock was held by another monograph command, a queued watch rebuild was skipped and the change batch was dropped for good, while the watcher and the MCPmonograph_watchtool still printed a success message. A shared rebuild queue now serializes watch rebuilds, folds changes that arrive mid-build into the next one, and retries a lock-skipped batch until it builds; each rebuild logs its real outcome, for exampleGraph updated in 9.7s — nodes +2 (now 20653), …orRebuild deferred — another build is in progress; retrying ….@monoes/monograph1.6.10.mastermind-agents hirewrites role entriesorg runaccepts as current-format. It appended new roles with the retiredagent_typekey, so runorg's legacy check treated an otherwise current-format org as needing migration.hirenow writestype(defaultspecialist), requiresreports_toto name an existing role, and runsmonomind org validateafterward;listshowstype,inspectlists direct reports instead of reading the retiredcommunicationarray, andremoveno longer writes acommunicationkey.
npm: monomind@2.16.4, @monoes/monomindcli@2.16.4, @monoes/monograph@1.6.10, @monoes/monobrowse@1.0.24