Skip to content

v2.16.4

Choose a tag to compare

@nokhodian nokhodian released this 25 Sep 11:25
· 441 commits to main since this release

[2.16.4] — 2026-09-25

Added

  • User-level agents are indexed and routed. Agents in ~/.claude/agents/** join the agent registry with origin user, so the prompt hook, monomind pick and the pick MCP 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 init and init upgrade build both routing indexes and print their counts, for example Indexed 89 agents (1 from ~/.claude/agents) and 569 skills (1 from ~/.claude/skills). pick --json agent entries carry origin, and doctor shows user and shadowed counts.
  • org_skill_show MCP tool. Input { name }; returns one Org-library skill's description, tags, tools, origin and body, read locally (catalog skills only while active for org). Picked Org skills now point at it, so they work without a global monomind install.
  • Agents & Skills guide. doc/concepts/agents-and-skills.md and 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 by docs:counts:check.
  • pick-eval --logs measures 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 FILE writes the labelled prompts as a tests/pick-eval dataset to review and curate. doctor -c pick adds a line real 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 outside open, where it only restored saved state; every later --session command then silently acted on the newest session, so two "named" browsers were really one and one, or a snapshot/scroll call using -s for --selector on a named session, could return the wrong tab. Session records now carry a name: open/connect --session X start the session named X or re-open the live one, any other command with --session X acts on it and fails with No live browse session named "X" when there is none, and --session has no -s shorthand on snapshot/scroll (which use -s for --selector). A command with no --session still resolves the sole live session in the directory — named or not — and only refuses to guess when two or more are live. @monoes/monobrowse 1.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 antigravity gives Antigravity a working status bar. That target turns the helper component off, so no statusline.cjs was written anywhere and the status bar (.gemini/helpers/statusline.sh) printed nothing. Init now copies the helper tree into .gemini/helpers when Antigravity is selected without the helper component. It still installs no .claude/helpers or hooks.
  • init writes .gemini/helpers only when Antigravity is selected. Only Antigravity's status bar reads that copy of the helper tree, but init wrote it for every Claude or Codex-with-hooks setup, e.g. --platform claude or --target codex. Kimi's statusline reads .claude/helpers first, so it does not need it. An existing .gemini/helpers is not deleted, and init upgrade still refreshes it where it exists.
  • The org command reference covers every subcommand and flag. org events and org approvals were undocumented, along with flags such as run --resume/--budget-usd, create --goal/--schedule, questions --all and the --by resolver flags; serve --forward (which does not exist), the approve/deny arguments and the supervisor/test-loop arguments were wrong.
  • The metrics-db hook tests run again. They skipped themselves unless sql.js resolved 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-embeddings actually prepares embeddings. It shelled out to npx monomind@latest embeddings init, a command that does not exist, so it always printed "Embedding initialization skipped." It now runs in-process — the embeddings_init MCP tool writes .monomind/embeddings.json and downloads gte-modernbert-base with the same revision/dtype the memory bridge loads — and offline (or with MONOMIND_NO_LOCAL_EMBEDDINGS=1) it continues with a warning pointing at monomind doc eval --provision-model.
  • init and doc ingest --embedder default to and describe the embedding model memory search actually uses. Init presets, init --embedding-model, the init wizard and hooks pretrain defaulted to Xenova/all-MiniLM-L6-v2 (384d) while the memory bridge always embeds with Alibaba-NLP/gte-modernbert-base (768d); the default is now gte-modernbert-base everywhere (MiniLM and MPNet stay accepted choices, and existing .monomind/embeddings.json files are untouched). doc ingest --embedder help said it picked minilm (384d) or bge-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-minilm value 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 hooks or config entry 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 that cd'd into a package directory could get a sibling package bind-mounted read-only and fail its tests with EROFS. A sandboxed role now runs with CLAUDE_BASH_MAINTAIN_PROJECT_WORKING_DIR=1, so its shell returns to the cwd after every command.
  • monograph watch no 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 MCP monograph_watch tool 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 example Graph updated in 9.7s — nodes +2 (now 20653), … or Rebuild deferred — another build is in progress; retrying …. @monoes/monograph 1.6.10.
  • mastermind-agents hire writes role entries org run accepts as current-format. It appended new roles with the retired agent_type key, so runorg's legacy check treated an otherwise current-format org as needing migration. hire now writes type (default specialist), requires reports_to to name an existing role, and runs monomind org validate afterward; list shows type, inspect lists direct reports instead of reading the retired communication array, and remove no longer writes a communication key.

npm: monomind@2.16.4, @monoes/monomindcli@2.16.4, @monoes/monograph@1.6.10, @monoes/monobrowse@1.0.24