Changelog

Release notes for every Monoes open-source product, straight from GitHub Releases.

v2.24.5

View on GitHub

[2.24.5] — 2026-10-09

Fixed

  • browse defaults the CDP port to 9422 and falls back across bridge endpoints, instead of failing when the previous default port was unavailable (Fixes #666).
  • init no longer claims Agent Teams was configured when it was not opted into (Fixes #665).
  • browse redirects Chrome's TMPDIR when the default singleton socket path would overflow Chrome's 108-byte limit, which previously crashed Chrome with SIGABRT (Fixes #663).

Security

  • Pinned @modelcontextprotocol/sdk to >=1.31.0 (GHSA-6qxp-vccf-f47h); the braces DoS this advisory also covers remains unpatched upstream with no fix available yet (Refs #664).

Changed

  • @monoes/monobrowse bumped to 2.24.1 (internal) — ships the CDP port default/fallback and TMPDIR redirect fixes above.

npm: monomind@2.24.5, @monoes/monomindcli@2.24.5, @monoes/monobrowse@2.24.1

v2.24.4

View on GitHub

[2.24.4] — 2026-10-08

Changed

  • Claude Code Agent Teams is opt-in. init and upgrade no longer write CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1 or the monomind.agentTeams settings block — nothing in Monomind reads either; pass --agent-teams to write them. Existing settings are left as they are, and doctor reports a leftover flag or block (#655).
  • upgrade --settings retires an Agent Teams flag an earlier init wrote. It removes CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS and the monomind.agentTeams block only when Monomind's own marker (coordination.sharedMemoryNamespace: agent-teams) proves an earlier init wrote them, keeps a settings.json.bak-agent-teams backup, and leaves a flag the user set themselves. doctor points at the command to run. A follow-up fix quotes the upgrade command in doctor's cost-settings notes (#655).
  • doctor and orgrt report served models, effort and context size, and warn on costly token settings. Result events now carry model_usage, effort, peak_context_tokens, context_warning and unexpected_models; doctor gains a read-only Token Cost Settings check (effort env overriding effortLevel, a huge compaction window, tool search off, output cap, duplicate hooks) (#655).
  • Hooks are deduped by helper identity and coder delegation is capped. init --force now retires an older command form of a hook it regenerates, doctor flags the same helper+argument pair registered twice, and coder mode refuses further Agent launches past MONOMIND_CODER_MAX_AGENTS / MONOMIND_CODER_MAX_REVIEW_AGENTS, reporting agent_launches (#655).
  • Org skills now include a bundle imported from anthropics/knowledge-work-plugins. monomind org skills import pulled in the Apache-2.0/MIT-licensed set (licence, source repo, path and commit recorded on each skill; .md files only); the partner-built zoom-plugin set was left out because its SDK docs carry example credentials that trip the secret scan. Five names clash with already-bundled skills and take the imported version: content-strategy, customer-research, design-system, seo-audit, statistical-analysis. Doc counts were regenerated, and the Jev shortlist cap was lifted so the bundled skills cannot crowd out the seeded ones.

Fixed

  • A sections org's scheduled audit tick could be skipped for an unsigned definition or a failed precheck (Fixes #656).
  • monobrowse's browse-concurrency test could abort with SIGABRT instead of skipping on a low-memory host (Fixes #651). Chrome is aborted at launch when the host is out of memory, which showed up as a flaky-looking test failure rather than a code defect. The test now computes the memory it needs (max 3 concurrent Chromes × 512 MiB) and skips with a logged reason when MemAvailable is below that; assertions are unchanged when memory is sufficient.

Dependencies

  • Bumped sharp 0.35.4 → 0.35.5 and the npm_and_yarn group (proxy-addr 2.0.7 → 2.0.8, source-map-js 1.2.1 → 1.2.2).

npm: https://www.npmjs.com/package/monomind/v/2.24.4

v2.24.3

View on GitHub

Fixed

  • A role in a sections org can read the full text of a long message digested for it. A message over the inline limit reaches the recipient cut at 1 KB with a pointer to <org dir>/mail/<recipient>/<id>.md, but a role with a narrow fileRead scope was refused that read ("outside read scope"), so the sender had to resend a compact version (seen in the growth-org test run). A role's own digest directory is now readable by the file tools, and nothing else is: another role's directory, a write, a shared-prefix sibling and a link out of the directory are still refused.
  • The stub exclude block is only written into a real repository's info/exclude. A directory named .git that is not a repository (an empty one, or one holding only a runtime's config.worktree stub, as in the growth workspace) got an info/exclude created inside it. It is now skipped, as git itself skips it.

npm: monomind@2.24.3, @monoes/monomindcli@2.24.3

v2.24.2

View on GitHub

[2.24.2] — 2026-10-05

Fixed

  • monomind security defend no longer crashes when a threat is detected (#641). The per-severity colour was chosen by extracting output.error/warning/info/dim as bare function references, which dropped the this binding and made the first detected threat throw "Cannot read properties of undefined (reading 'color')". The formatter is now invoked on output.
  • Test-suite temp dirs no longer leak into /tmp; a leaking test file now fails (#644). Tests that created temp directories outside the suite's managed temp root left litter in the real /tmp; the suite now keeps temp dirs under its own root and fails the file that leaks one.
  • An org run's sandbox stubs no longer show up in git status (#649). A role in a repo checkout holds empty stub files in the repo root for the whole run (.bashrc, .gitconfig, .claude/hooks, …); they read as debris and tripped "git status is clean" checks. While they exist the runtime now lists them in a marked block of the repo's info/exclude (linked worktrees included), recomputed from what exists on disk, and removes the block when they are gone, on release, on a signal or exit, and on reclaim after a SIGKILL. A real file of the same name with content is never named.
  • monomind security defend no longer crashes when a threat is detected (#641). The per-severity colour was picked by pulling output.error/warning/info/dim out as bare function references, which lost the this binding, so the first detected threat threw TypeError: Cannot read properties of undefined (reading 'color'). The formatter is now invoked on output.
  • The full-mode MCP tool count in the docs is derived from the registry, not typed (#642). doc/concepts/mcp-server.md, opencode.md and antigravity.md said MONOMIND_MCP_FULL=1 advertises 219 tools; tools/list over stdio returns 198 (the default roster is 20). The two counts are now doc-count markers (mcp-tools-full, mcp-tools-default) that scripts/generate-doc-counts.mjs reads from the built CLI's registry, so --check fails when a doc states another number.
  • org sign from an org role now refuses plainly instead of appearing to write to the operator directory (#643). The operator-credential directory (~/.monomind/orgrt-operator) is hidden from every role sandbox on purpose, so a role never signs or reads the key. Where the sandbox mounts an empty tmpfs over it, org sign seemed to succeed and the signature vanished, so org run then failed. org sign now checks first and refuses before writing, saying the directory is protected from org roles and only the operator signs, and org run explains a missing signature the same way. Documented in doc/commands/org.md. The protection is unchanged.
  • The test run's teardown removes read-only temp directories (#650). A test that leaves a chmod 0500 directory under its temp dir made the run's teardown fail with EACCES ("error during close"); it now makes the tree writable first.

npm: monomind@2.24.2, @monoes/monomindcli@2.24.2

v2.24.1

View on GitHub

[2.24.1] — 2026-10-05

Fixed

  • docs: corrected MCP tool counts in the antigravity and opencode docs (Fixes #634) (#640).
  • The monofence-ai first-use pin follows the published 2.24.0 package (#638). The 2.24.0 release bumped the workspace monofence-ai to 2.24.0 but left the first-use install pinned at 1.0.7 (lock entry and per-file code hashes included), so main's CI failed the "pin equals workspace version" and fail-closed scanner tests, and the 2.24.0 CLI installs the older monofence from the registry. The pin, lock entry (URL and integrity, verified against the registry tarball) and version now match 2.24.0; the 16 dist/*.js hashes are unchanged because 2.24.0 differs from 1.0.7 only in its version number.
  • monomind deps install run from a checkout now writes the deps cache (#637). When the checkout's own node_modules held the pinned Claude SDK, the command found it, printed "installed and verified" and wrote nothing, so org roles (whose sandbox can only use ~/.monomind/deps) still lacked the SDK and a release's live Claude trials failed with EROFS. The command now always installs into the cache and says where.

Changed

  • The version gate blocks a forced major bump of a sub-package, and the release rules say who takes the release number (#636, #639). scripts/check-package-bumps.mjs now fails when a sub-package's major version rose since the last release tag without a breaking commit (type(scope)!: or a BREAKING CHANGE: footer) touching it; it skips when no release tag is reachable, and MONOMIND_ALLOW_MAJOR_BUMP=1 is the escape hatch. Run against the 2.24.0 release commit it reports all eight mis-bumped packages. The release rules skill now states that only monomind and @monoes/monomindcli take the release number and that a package with a first-use pin moves its pin, lock and hashes in the same commit. The release org's instruction digest changed with the skill, so the operator re-signs release before the next run.

Notes

  • Sub-package versions jumped to 2.24.0 (#636). The 2.24.0 release published @monoes/monobrowse (was 1.0.30), @monoes/monodesign (1.2.25), @monoes/hooks (1.0.13), @monoes/mcp (1.0.7), @monoes/memory (1.0.23), @monoes/monograph (1.6.15), @monoes/routing (1.1.1) and monofence-ai (1.0.7) at 2.24.0 instead of on their own semver lines. None of them has a breaking change in this release: the number is a version bump only, it cannot be unpublished, and their lines continue from 2.24.0. Only monomind and @monoes/monomindcli track the release number.

npm: https://www.npmjs.com/package/monomind/v/2.24.1 and https://www.npmjs.com/package/@monoes/monomindcli/v/2.24.1

v2.24.0

View on GitHub

[2.24.0] — 2026-10-05

Added

  • Every runtime is usable in a sections org, through the isolation registry. Each runtime declares whether it can run inside a sections org's isolation; kilo and freebuff are refused with a stated reason (Kilo is full-access only and a sections org refuses full access; Freebuff's CLI has no headless transport), every other runtime is accepted. agent scan and doctor -c agent-runtimes report execution_supported and the reason.
  • A verified Kilo runtime and a Freebuff discovery stub (#600, #601). kilo (CLI 7.8.3, explicit full access only, resume, reported cost, native tool activity) runs through agent exec and the Org Runtime; freebuff is discovered but refuses before spawning (its CLI has no headless transport).
  • Operator Claude selection (#596). --claude-path <absolute-file|bundled>, MONOMIND_CLAUDE_PATH or monomind config set claude.path; an untrusted home or config directory that names no claude.path is no choice (one warning), not a failure.
  • Sections run as isolated sub-orgs, with docs as the only cross-section channel. Each section is its own sub-org with its own roles, budget and lifecycle; the only path for one section to affect another is through the shared document store — no direct messaging or task routing crosses a section boundary.

Fixed

  • Claude SDK pinned to 0.3.289, with a reviewed weekly refresh (#594). The refresh workflow computes the new pins in a read-only job (the downloaded binary runs there) and opens the PR from a second job; actions are pinned to commits. The publish-time freshness check only warns when the registry is unreachable. The org_* tool schemas the SDK emits changed with the bump (the sections-off fixtures were regenerated for it).
  • Trusted runner inputs no longer sit in a writable temp root (#599). The hermes, cline and kimi prompt files live under <monomind home>/runner-inputs, in one directory per org role that the sections role protection hides from every other role.
  • A dead session no longer leaves a stale runtime.json behind (Fixes #611). Session teardown now clears the run's runtime.json so a crashed or killed role is never reported as still running.
  • A role's tool output is readable again (Fixes #622). A formatting regression had made some tool output unreadable in the role's own transcript; tool output now renders as intended.
  • Bash's own timeout no longer races the task deadline (Fixes #623). A Bash call's timeout is now capped against the task's remaining deadline, so a long-running command is stopped by whichever limit is shorter instead of the task deadline firing first and leaving the process behind.
  • Issue queue from #633: Kilo runtime execution, Claude binary selection and reporting, assistant response usage (token) de-duplication, MCP status reporting from server runtime state, trusted runner-input protection, a release SDK preflight check, a Cline ACP test fix (ambient provider keys cleared in cline-runner.test.ts), and an init config refresh (#632).
  • Also in this batch: #591, #592, #593, #595, #597, #610.

Changed

  • Org sections are generally available. A sections org no longer needs run_config.experimental: "eval", and org run, org serve, resume and role restarts start it like any org. An org that still declares experimental: "eval" keeps the eval-harness-only start and the no-restart rule. The release build behind this: an OS-held single-daemon lock per org root (a network filesystem is refused), per-recipient mail digests that are immutable, hash-journalled and unreadable to other roles, authenticated task-routing envelopes, per-role private copies of Claude's native transcripts, a host preflight (authority mask, SDK sandbox, copy inventory) on every start, resume and role replacement, and an adversarial probe suite with a mutation check. Only Claude roles have a copy-inventory entry; other runtimes are refused in a non-eval sections org until they get one.
  • A sections org may run on a schedule. org validate no longer refuses schedule for a sections org (an eval-mode org, run_config.experimental: "eval", still cannot be scheduled: only the eval harness starts it). No carry-forward is needed: every scheduled start is a fresh run with its own run id and document store, through the same start path as a manual one, so the host preflight, the eval gate and the daemon lock apply. A tick that cannot start (preflight refusal), lands on a run that is already live, or lands mid-run now leaves a line in <org dir>/schedule-audit.jsonl, and a boss auto-restart during a scheduled run no longer leaves the restarted run outside the tick's max_run bound.

npm: monomind@2.24.0, @monoes/monomindcli@2.24.0, @monoes/monobrowse@2.24.0, @monoes/monodesign@2.24.0, @monoes/hooks@2.24.0, @monoes/mcp@2.24.0, @monoes/memory@2.24.0, @monoes/monograph@2.24.0, @monoes/routing@2.24.0, monofence-ai@2.24.0 — all published to the registry.

v2.23.0

View on GitHub

[2.23.0] — 2026-10-04

Added

  • Session cap with rotation digests. With run_config.context.session_cap set to {tasks, tokens}, a role's SDK session ends between turns once it has been given that many distinct tasks or has used that many tokens (a native child's responses are not counted; a response split across messages counts once). The turn that crosses the cap finishes; the next message starts a fresh generation, and the loop checks on every path: a tagged task session, the role session, an untagged message, and at session start (a resumed session at the cap starts fresh, its resume dropped). The new generation's first message opens with a rotation digest: what the last generation did, the role's open tasks, the budget used, and a warning after two rotations in a row without a finished task; the digest is within 4,000 characters, and what is dropped is named, never cut. Counters persist in the run's session-counters.json, a session-rotated audit event records each rotation with its overshoot, and session-cap-usage-missing flags a runner that reports no usage. packets.jsonl generation records carry the rotation generation and the digest hash. An org with no session_cap is unchanged and writes no counters.

  • Role notes: org_note_append and injection into a fresh session. With run_config.context.notes: true, a role gets org_note_append, which appends an entry to its own <org dir>/notes/<role>.md. The file is append-only: to curate, a role appends an entry with current_state: true that restates what still matters. Each fresh SDK session of that role starts with its last current state and the entries after it, ahead of the task, within 4,000 characters and without pushing the first message past 12,000; an entry is included whole or not at all, and an entry over 4,000 characters is rejected, never cut. A resumed session is left alone. The run's packets.jsonl records how many entries were included and left out and the hash of the injected block, and its first-message hash covers the notes. A bare require_brief or session_cap adds no notes tool, and an org without notes: true is unchanged. Notes are not yet protected from other roles' direct file access; that protection belongs to the sections design.

  • Summary-only returns. In an org on the run_config.context surface, org_task_done's result is a summary of at most 1,000 characters plus the ids and file paths of what the role produced. A longer result is rejected with a remedy and the task stays open; it is never truncated. The tool's description says so only for such an org. An org with no context key accepts any result length, as before.

  • Context packets with a record of what was injected. In an org that adopted the run_config.context surface, org_task and org_plan_graph tasks take references (files, memory_keys, task_ids), listed after the brief in the task's dispatch. A packet over 256 distinct references, or whose title, brief and references together pass 12,000 characters, is rejected with a remedy; nothing is truncated. The runtime records what it injected in the run's packets.jsonl: each dispatched packet with the hash of every part, and the first message of each fresh SDK session (a generation) with its hash and the packet it carries. A resumed session adds no record; a new generation appends one. References are not snapshots: a path or key is listed, not captured.

  • An opt-in run_config.context surface, starting with typed brief fields. An org that sets a context key (require_brief, notes: true or session_cap) now gets objective, output, tools, boundaries and acceptance arguments on org_task and on each org_plan_graph task. They are rendered with the existing free-text brief into the one brief the assignee receives, under the same 4,000-character limit; a longer brief is rejected, not truncated. With require_brief: true a task missing objective or acceptance is rejected (for org_plan_graph, the whole graph, so no half-built plan is left), and other missing fields come back as warnings. Without it, a missing objective or acceptance is only a warning. An org with no context key keeps its tool list and prompt byte for byte. org validate no longer reports run_config.context as unsupported.

  • Per-call context logging. Every model call a role makes now appends one record to the run's context.jsonl: the size of its context (uncached input plus cache reads plus cache writes), how old its session is, its cache read and write tokens, and whether it was the first call of a session, a resumed session or a subagent's call. A response split across several messages is one record. The first call of a session shows the prefix cache read vs write at session start. monomind org report <org> --context prints, per role, the calls, sessions, mean and max context, cache hit ratio and the session-start cache split (--json gives the same figures). A run's other files are unchanged.

  • A shared checklist of org caveats, run wherever an org is saved or started. org validate, org run/org serve start, org reload, org create, and the dashboard's config patch, import and create now run the same checks (orgrt/validate-checklist.ts). Errors stop the save or start; advice is a warning that never blocks, and a start records its warnings on the run's bus as checklist-warning.

    • Errors: a deferred feature in the definition (sections, documents, loops, requires, and run_config.context, budget_usd, budget_mode, experimental) used to be ignored silently and now fails with "not yet supported".
    • Warnings: an unknown top-level or run_config key, which the runtime would ignore; file scopes that do not cover the paths a role's duties name; shell duties with Bash denied; max_concurrent_agents below the role count (a finished worker keeps its slot, so roles past the cap wait); no budget_usd on any priced role; budget_usd on a codex or antigravity role, which reports no USD and is never closed by it; tools (Bash, WebFetch, WebSearch) that wait for a human approval nobody answers, and the same in a scheduled org; role text that tells a role to use SendMessage; a dated detail in a role prompt, which breaks the cached prefix; a boss prompt that does not require self-contained briefs; a role with no explicit model.
  • Org sections: an eval-only opt-in surface for sub-team structure within an org (sections). A definition can now partition roles into sections with their own budgets, a single-writer policy per document, lead rights, loop/rework rounds, and spend-based soft closure with 80% budget notices to lead and root. This ships eval-only: a sections org must set run_config.experimental: "eval", and org run/org serve refuse to start ANY org that uses sections from the CLI regardless of that flag — only the internal eval harness (which passes evalGate: true to startOrg) can start one (packages/@monomind/cli/src/orgrt/documents/eval-gate.ts, definition.ts). It is not yet available for general org use.

  • policy.sandbox.denyExec masks programs from a role's whole process tree. Opt-in; a role's Bash tool and everything its process tree starts (a nested SDK sandbox included) run inside a bubblewrap layer where every matching binary is replaced and fails closed. A role without denyExec set is unchanged.

  • policy.sandbox.denyRead hides files and directories from a role's shell, in the same sandbox layer as denyWrite. Opt-in; a role without it set is unchanged.

  • policy.sandbox.homeWriteAllow keeps a role's process tree from changing the real $HOME. Opt-in: bubblewrap mounts a tmpfs overlay over the home (reads fall through, writes land in a throwaway upper layer) and binds only the allowlisted subpaths back read-write.

  • run_config.verify_writes (default on) refuses a completion over a demonstrably failed write. A WriteLedger watches the bus for Write/Edit/MultiEdit/NotebookEdit calls, policy denials and tool_result ok:false. org_task_done is refused, naming the path, when that role has a failed write with no later success and the file is still missing or empty on disk; an achieved org_complete is refused for any role's unwritten deliverable. A report that names the path and says it is blocked is accepted; each (scope, path) is refused at most twice.

  • run_config.lead_watch (default on) nudges a lead when a role stalls. A role with open work — an open org_task, or an actionable message from its reports_to/the boss — that has no session after not_started_s (default 90s) or no bus event for silent_s (default 180s) gets one [watch] message sent to its lead's mailbox, with doubling backoff, at most 3 per episode. Never fires for a role with no open work, a role that is progressing, or during a pending human wait; cancelling, re-creating for another role, or messaging the role settles it.

Fixed

  • The run's task text reaches every role, not only the coordinator. org run --task (and startOrg's task argument) was sent to the coordinator as a message; every other role's system prompt carried the org goal alone. With a short goal and the details in the task, workers asked the lead for what the task said, or read the run's bus to recover it. Every role's prompt now has a Task for this run: block with the text, whenever it differs from the goal. A run with no task, or a task equal to the goal, keeps its prompts byte for byte. A resumed run restarted without --task still has the goal alone.

  • A tool-call fence that will not parse is returned to the role as an error. Roles on the fence-protocol runners (codex, antigravity, opencode, kimi and others) call org tools by writing a ```tool_call block. A block with invalid JSON, such as an org_send whose message held raw newlines, or one cut off before its closing fence, was dropped with a note on the bus and nothing was sent back: the role believed the call had run and ended its turn, and the org could sit silent until the idle watchdog stopped it. The role now receives a tool_result saying its call could not be parsed, that nothing ran, and how to send it again; calls in the same reply that did parse still run. The bus note is unchanged.

  • A role stopped mid-query now reports its cost. When an org completed or was stopped, every Claude role still working had its query killed outright; the query never sent a result, so its cost was never recorded. A short trial's meter showed $1.46 where its session transcripts put the spend near $5.65, and budget_usd closures never saw that spend. The Claude runner now interrupts the query first. The SDK answers with a result carrying the cost so far, which the runtime records like any other turn, as an interrupted stop that is not a failed turn and does not count toward the circuit breaker. A query that does not answer within 3 seconds is aborted as before.

  • A role's budget_usd is a hard stop on Claude roles. USD cost arrives only when a turn ends, so one long turn could run far past the cap: in a 24-minute trial of an 11-role org capped at $10, a $0.80 role spent $6.50 and the org spent $27. Each Claude query now carries the SDK's maxBudgetUsd, set to what the role has left of its cap, so the SDK stops the query once it is exceeded. Overshoot is now limited to the model call in flight. That stop closes the role for budget like any exhausted cap; it is not counted as a failed turn, does not trip the circuit breaker and is not reported as a crash. A role with no USD left starts no query. Codex and antigravity roles report no USD and are unchanged.

  • The org token meter counts each model response once (#597). One API response can reach the SDK stream as several assistant messages that share a message.id and repeat the same input and cache usage. The live meter added every one of them, so roles were metered at roughly twice their real tokens: usage events were inflated and budget_tokens caps closed sessions early. The result-time settle only tops the meter up, so it never corrected this. The Claude runner now passes the response id through, and the meter counts only what a message adds over the largest usage already seen for that response. That also takes a response's final output count instead of the placeholder counts on its earlier messages. Subagent responses have their own ids and are still counted. USD costs were not affected.

  • The resource governor's SDK-session count no longer doubles when a role runs sandboxed. It matched any process whose command line referenced the SDK package path; a sandboxed role's bubblewrap wrapper process matches too, so each role's session was counted twice and MONOMIND_MAX_SDK_PROCS throttled new role starts at roughly half its configured cap. It now reads the process table directly and counts only the actual SDK agent process per role.

npm: monomind@2.23.0 · @monoes/monomindcli@2.23.0

v2.22.0

View on GitHub

[2.22.0] — 2026-09-30

Fixed

  • Codex and antigravity roles no longer spend many times their budget_tokens in one turn (#550). Both CLIs report the whole prompt as input, cached part included, and it was charged against budget_tokens as uncached input, so one turn could spend 7-35 times a role's budget and close every other role at the org-wide ceiling. The runners now move the cached part into cache_read / cache_creation (the tokens total is unchanged), so these roles are charged on the same basis as Claude roles. They also meter each agy step and each codex exec as it completes instead of once per message: an agy exec is killed at the step that exhausts the budget, a codex role starts no further tool round once it is spent, and neither starts an exec with less than 5% of the role's token cap left or after its session was closed for budget. The role is then closed for budget rather than counted as a failed turn. A codex exec that has started still runs to its end, since codex reports usage only then. See Token budgets on codex and antigravity roles. A role closed because it is under that floor counts as out of budget: the coordinator's notice gives its numbers, and org reload reopens it only once its budget is raised above the floor.

    • agent exec and agent test report the same split: the input_tokens of a codex or antigravity run's usage event now excludes cached input, as it already did for Claude.
  • The org-wide token budget stops deferred lazy spawns (#552). When run_config.budget_tokens ran out, the org closed every open mailbox and stopped pending spawns, but a role already waiting for a max_concurrent_agents slot kept its retry loop. The closure freed slots, so the role spawned with an open mailbox after "closing all roles" and ran until idle-stop. The closure now cancels those deferrals (a deferred-spawn-cancelled audit per role) and holds their tasks with the budget reason. A deferred spawn, including one waiting on host resources, checks the org-wide ceiling and the role's own budget closure (its own caps or the #550 turn floor) right before it starts. spawnRole refuses while the ceiling is spent and logs a spawn-refused audit. A reload that raises the ceiling puts the roles back to pending, dispatches their tasks and delivers the messages queued for them. A role a reload adds while the ceiling is spent is set aside the same way, and its tasks are held instead of reported as unresolved.

    • A role replacement (org_respawn_role) no longer runs past the ceiling. If the ceiling closes while the replacement starts, the replacement is stopped instead of published, the old incarnation stays closed like the other roles, and its tasks are held. The org's spend stays exact: the old incarnation is counted once, and what the stopped replacement spent while starting is counted too. The cancelled replacement doesn't use up a max_role_respawns attempt. A reload that raises the ceiling reopens it with the mail it had swept up.
  • A role deferred by max_concurrent_agents stays a known assignee (#551). The deferral took the role out of the pending roles, so every later dispatch pass reported dispatch-assignee-unresolved: assignee "X" does not resolve for a role the org defines, and messages to it failed with "unknown recipient". Its tasks now wait ready with one concurrency-limit audit each ("deferred by max_concurrent_agents") and go out when the role spawns, whichever path deferred it. A second deferral of the same role joins the first retry loop instead of starting another. If no slot frees in time, the tasks waiting on the role are failed with the reason and the coordinator is told, instead of sitting ready with no owner. The role goes back to pending, so later work for it defers again. The give-up is written to the org state (abandonedRoles), and the coordinator is also told when only queued messages were waiting.

    • A role deferred under host resource pressure gets the same treatment: its tasks wait with one resource-pressure audit each and go out when it spawns.

    • A deferred role that spawns now delivers only its own queued messages. It drained the whole org inbox, so messages queued for other roles that weren't running yet were lost.

    • deliver() says "waiting for a concurrency slot" or "waiting for resources" to match the deferral.

  • A freed max_concurrent_agents slot goes to the role that was deferred first (#589). Each deferred role polled for a slot on its own timer, so the first timer to fire after a slot freed took it. A role deferred later could start ahead of one deferred earlier, and could keep doing so each time a slot freed. A role now takes a free slot only when no role deferred before it is still waiting for one; its concurrency-limit audit then says which roles it is waiting behind. A role that was not deferred, started directly by a message or task, can still take a freed slot before the next deferred role polls.

  • An approval a decider owns now holds the tool call until the decider rules, instead of denying it as "pending human approval" (#553). monomind now routes a request the way mono-agent does, using a port of its decision class, tier and level × tier routing. With mid or full autonomy and a model, boss, parent or jev decider, a call that mono-agent sends to a rule or a decider waits for the verdict. For example, tool:Bash is routine unless a tool:Bash or tool:* tier says otherwise. The wait lasts up to decider.timeout_seconds + 25s: the timeout defaults to 120s, and the total wait is capped at 300s, below the 600s PreToolUse hook timeout. The call does not wait when mono-agent sends the request to a person: at mid, that covers irreversible tiers and grants with no known tier. It also does not wait at manual, during an active paused_until, or when the autonomy block is missing or not understood. The autonomy block is read fresh from the org file on each check. When the verdict is approve, the call runs. A denial names who decided. If no decision comes in time, the message says a decider or a human will resolve it and an [approval] message follows. A call that got its verdict while waiting never gets an [approval] message telling it to repeat, so it never runs twice. That holds even when a human resolves it together with other entries. Mailbox messages name the resolver: a rule, the decider, or a human (--by name). Waits end when the org stops or the role closes. Known gap: monoagentcli org autonomy pause writes only mono-agent's database, so monomind does not see the pause until mono-agent adds paused_until to the org file. Known limit: a grant's own tier lives only in mono-agent's database. At mid, a grant that mono-agent rates consequential goes to its decider, for example one with no outbound workflow nodes. monomind can't see that tier, so the call does not wait; it is denied as pending at once, as before. A grant:<alias> or grant:* tier in the org file avoids this. Every runtime goes through the same in-process gate: claude's canUseTool and PreToolUse hook, and the in-process org-tool calls of codex, grok, hermes, antigravity and vercel, all wait inline. Approvals owned by a human are unchanged.

  • Vercel and openrouter roles post one chat event per assistant message (#563). The vercel runner yielded every streamed text delta as its own message, so the org bus carried a chat event per chunk ("I", "'ve asked the question", ...), which filled history and event limits. It now joins the deltas and yields one message when the model step ends, like the claude, codex and aider runners. A turn that is aborted or fails midway still reports its text once. agent exec still streams the deltas, since it asks for partial messages.

    • A vercel turn whose stream carries an error or abort event is now reported as failed (error_during_execution, is_error) with the error message, like a failed claude turn. It was reported as success, so the circuit breaker never counted it and agent exec exited 0 instead of reporting a rate-limited, auth, quota or runner-error code.
  • agent test pi-rpc no longer fails with turn failed (error_max_turns) when the model runs one of pi's own tools before it answers (#564). pi counts one turn per model call, so a model that lists or reads the temporary directory before replying ok needs a second turn, and agent test capped the turn at one: the runner aborted the answer. agent test now allows 3 turns for every runtime. Plain replies were never affected; checked against pi 0.87.1, which starts exactly one turn for them, retries included.

  • A blocking ask_human question now stops org_complete until it is answered (#564). A boss could ask a blocking question and end the run in the same turn with an answer it made up. While any blocking question in the org is unanswered, org_complete is refused with a tool error naming the question ids; it works again once the answer arrives. The one outcome still allowed is partial with blocker human, also under run_config.completion: 'dag' while runnable work remains, so a run whose human never answers can still be ended honestly. Non-blocking questions don't hold it. The blocking receipt now tells the role to end its turn and not call org_complete. A blocking question still does not hold the role's turn open: as documented, the answer arrives as a new message.

  • The session ledger and its session-run audit name the runtime a role actually runs on (#562). They used role.runtime ?? def.runtime ?? 'claude', so a role whose runtime comes from provider.kind (vercel-api-key runs on vercel, codex on codex, antigravity on antigravity) was audited as claude and had its task sessions filed under claude. Both now use the runtime that runner selection resolves. A task session an older build filed under claude for such a role is still resumed on org run --resume and moves to the new key when it is. Only a role with no runtime of its own or of the org's reads that old key, because only its entries there came from its own runner.

    • The full-access check and its audit, the sandbox and authority-mask choice, org validate's sandbox findings and org sign's review use that runtime too (#567). A provider.kind role was checked as Claude, so a vercel role declaring policy.access: full passed the runner check it fails, so a signed grant made it full on a runner without full access; a vercel role was given an authority mask its in-process runner never applies; and org sign counted a codex role as covered by Claude's sandbox. A role that sets runtime itself is checked as before. A MONOMIND_RUNTIME value no runner answers to is checked as claude, the runner that then runs.
  • An open ask_human question can be dismissed, and a removed role's question can be closed (#572). An open blocking question holds org_complete (#564), and until now the only way to close one was to answer it. monomind org questions dismiss <org> <id> [--reason <text>] closes it without an answer: questions.json records state: "dismissed", dismissedAt and the reason, the org_complete gate and the idle-watchdog hold are released, and the asking role is told that no answer is coming (live, or queued while the org is stopped, without waking it). A running org logs a decision-resolved audit event with verdict: "dismissed". The dashboard's Human Input view has a Dismiss button (POST /api/questions/dismiss, the same human-session auth as answering), and the daemon route is /api/dismiss-question (operator credential only). Answering a question whose role is no longer in the org definition failed with "role not found", so it could never be closed. The answer or dismissal is now recorded and delivery is skipped, with a delivery: "skipped" note in the audit event.

  • org approve, org deny, org answer and org gate-approve / gate-reject no longer resolve a decision behind a refusing daemon (#572). Security: when the daemon running the org refused the call, for example with a 403 because the operator credential was missing, the command fell back to writing approvals.json, gates.json or questions.json (plus the inbox) directly. That approved a tool call or gate, or answered a question, without the operator check, the audit event or delivery to the waiting role. A refusal now fails with "nothing recorded" and exit code 1. The offline write happens only when the daemon can't be reached. The commands also ask only a daemon that hosts this project's org, the same lookup the dashboard uses, so a same-named org run from another project no longer receives the decision.

  • A role's blueprint is now covered by the org signature (#571). A role with a blueprint and no skills gets its skills and skill_pool from the catalog's blueprint.json when the org starts. That file lives in the project's .monomind/catalog/, which the #502 signature did not cover and which a role may be able to write, so the skills (and the MCP tools they grant) a role got could change without the org being re-signed. The signed hash now records a sha256: digest of each named blueprint's blueprint.json under a new blueprints key, next to the instructions_file digests; the same single read feeds the review, --check, --expect-hash and the start-time check. org run and org reload use a blueprint only while its bytes still have the digest the signature was checked with. An org that uses a blueprint verifies as changed after the upgrade and needs monomind org sign once; an org without blueprints hashes exactly as before. org sign's review lists each role's blueprint. The hash is documented in org sign with a pinned example.

  • Org roles can no longer change the skill catalog (#576). The content of a role's catalog skills and their grantedTools (which decide the MCP tools the daemon grants) are read at org start from the project's .monomind/catalog/, which the org signature does not cover beyond skill names. That directory was writable to roles, and monomind catalog ran inside them, so a role could re-stage or re-activate a catalog skill and change what another role got on its next start without the org being re-signed. .monomind/catalog/ is now an operator-protected path, like .monomind/org-skills/: denied to the file tools, in the SDK sandbox's denyWrite and read-only under the bubblewrap mask, for the org root and a role's cwd, and created empty before a role starts so it can't be planted (an empty directory still means the catalog is not configured; a refused catalog stage no longer removes it again while roles run). monomind catalog stage, approve, activate, disable, quarantine, release, revoke, and project/unproject --apply, refuse inside an org role or agent exec process tree, as org sign does. Roles can still read the catalog and run the read-only verbs and projection dry runs; a signed policy.sandbox.allowWrite entry naming .monomind/catalog is the opt-in. See Skill Catalog.

  • agent exec --runtime claude works inside an org role again (#559). ~/.monomind/deps is read-only to roles (#527), so a role could never do the first-use install of the Claude Agent SDK and failed with EROFS. The deps directory stays read-only: it holds code the unsandboxed daemons load. Instead, the org runtime installs the pinned SDK on the host, through the same hash-pinned installer, before it starts a role session whose effective runtime is claude (the runtime runner selection resolves: role, org, provider kind, then MONOMIND_RUNTIME). Roles on other runtimes get no download, so a codex-only org never fetches the 300 MB SDK. An SDK installed without its bundled binary (#522) counts as installed. The install is logged as a role-deps-installed audit. A failed install is logged as a role-deps-missing audit, does not stop the role, and is not retried for 10 minutes; a session start waits for it at most 5 minutes or until the org stops. MONOMIND_NO_AUTO_INSTALL=1 turns the host install off, for offline or no-network hosts. Inside a role, a missing SDK now fails at once, before any install attempt, and names the operator command. The new monomind deps install command installs the SDK even with MONOMIND_NO_AUTO_INSTALL set, since it is an explicit request, and refuses to run inside an org role.

  • The test suites no longer inherit an org role's environment (#560). A suite run from inside an org role picked up MONOMIND_ORG_ROLE, which moves cline's scoped dir under the role's TMPDIR, so cline-runner.test.ts and cline-runner-scoped.test.ts failed. The shared test setup (tests/setup/isolated-home.global.ts) now unsets the markers a role session and its runners set: MONOMIND_ORG_ROLE, MONOMIND_ROLE_ID, MONOMIND_ORG_NAME, MONOMIND_ORG_DIR, MONOMIND_ORG_RUN, MONOMIND_ORG_ROOT, MONOMIND_AGENT_EXEC, MONOMIND_SDK_AGENT, MONOMIND_CLINE_TURN, MONOMIND_AIDER, MONOMIND_HOOK_QUIET, MONOMIND_GRAPH_GATE, MONOMIND_GIT_LEVEL and MONOMIND_EXEC_TREE.

  • Other runtimes' project config is now operator-protected from org roles, .agents/skills included (#580). monomind catalog project --surface platform:agents writes skills to .agents/skills, and the operator's Codex, Gemini, Kimi, OpenCode and other sessions load them, but unlike .claude/ a role could write it, so it could plant or change a skill a later operator session loaded. The same held for the rest of what those sessions load and act on from the project: .gemini/ (settings.json MCP servers and hooks, the status-line helpers), .codex/ (config.toml MCP servers and hooks, the hook scripts), .kimi-code/ (MCP servers, plugin hooks), .opencode/ and opencode.json/opencode.jsonc (plugins, and the node_modules OpenCode installs for them), .agents/monomind/ (the hook bridge rendered hooks run), agy's .agents/hooks.json, .agents/plugins/ and .agents/skills.json, .qwen/ (settings, .env, commands, agents, skills, extensions), crush.json/.crush.json, crushrc/.crushrc and .crush/skills, .pi/ (settings, extensions, skills, prompts, themes, system prompt, installed packages), Cline's .clinerules/hooks and workflows, .aider.conf.yml, .cursor/, .vscode/mcp.json, .kiro/ and .factory/: a role that wrote one got code run in the operator's next session there. Where a runtime writes into its own project dir while it runs as a role, only the parts it loads are protected, so it keeps working: OpenCode writes .opencode/.gitignore at every start and exits when it can't, pi creates .pi/settings.json.lock to read its settings, Qwen Code writes .qwen/worktrees/ and batch/, and agy writes .agents/teamwork/. With the org root or a role cwd at $HOME, the runtimes' own home state dirs (.codex, .gemini, .kimi-code, .qwen, .pi, .opencode, .cursor, .factory, .kiro) are left alone, since those runtimes write their sessions there. Each (at the org root and a role's cwd) is now denied to the file tools, in the SDK sandbox's denyWrite and read-only under the bubblewrap mask once it exists. Like .claude/ none is created at org start, so repos get no stray directories; while one is missing it is on the planted-path watch, so one a role creates is quarantined (one the operator creates while an org runs, for example with monomind init or catalog project --apply, is quarantined too and restored with the mv … && monomind org approve-paths … the notice gives). Instruction files (AGENTS.md, GEMINI.md, QWEN.md, rules) stay writable, as CLAUDE.md does, and so does runtime state such as Crush's .crush/ data dir. A full-access pi role in coder mode whose trusted project settings declare packages needs a signed allowWrite for .pi/npm / .pi/git to install them. A signed policy.sandbox.allowWrite entry naming the path is the opt-in. .claude/skills and .agents/skills are the catalog's only projection targets.

  • A role can no longer block the operator's catalog changes with a lock file (#581). The catalog lock was .monomind/locks/catalog.lock, which roles can write, so a role could create it and make every monomind catalog mutation fail with "catalog is locked". The lock is now .monomind/catalog/.lock, inside the operator-protected catalog directory. A leftover lock at the old path from an older version is ignored and left where it is. A refused mutation in a project with no catalog no longer leaves an empty directory behind.

  • monomind cleanup --force keeps the skill catalog unless --purge-data is given (#579). .monomind/catalog/ (staged packages, approvals and tool grants) was not among cleanup's data paths, so --force alone deleted it. It is now data, like .monomind/org-skills/.

  • org status no longer reports a killed standalone run as running (#573). An org run killed from outside (SIGKILL, or together with the app that started it) never reaches its stop or crash handlers, so runtime.json kept saying running with its pid, and a kill -0 probe kept passing once that pid was reused by another process. runtime.json now records the process's start identity (pidStart: its kernel start time and boot id on Linux, ps -o lstart elsewhere), and every reader checks that the recorded pid is still that process: org status (text and --format json), org list, org stop, org delete, org migrate, org mark-complete, org logs --follow, the dashboard's runtime view and startup gap-fill, and the statusline. A record written before this change has no start identity and is judged by its pid alone, as before.

    • On the next org status, org run or org serve start, a running record whose run is dead is rewritten as crashed with closedBy: "liveness-check" and the reason (pid N gone, or pid N now belongs to another process), and a line is appended to the org's liveness.jsonl. org status shows it as crashed (pid N gone). The #274 cross-checks still apply first, so a run whose pid is stale but whose serve heartbeat or event log shows it alive is left alone. The run's checkpoint is kept, so org run --resume still works.

    • org run now refuses to start an org whose recorded run is still alive in another process ("already running (pid N)"), instead of starting a second process on the same runtime.json.

  • monodesign URL detection retries a Chrome launch that times out waiting for its CDP port (#583). On a cold Windows CI runner, Chrome's first launch could take longer than the 30s launch timeout to write DevToolsActivePort, so the first browser test failed while every later launch in the same job passed. The monobrowse detection driver now retries a CDP-port timeout once. The timed-out Chrome has already been killed by monobrowse, its profile dir is deleted, and the retry uses a new one, since a leftover Chrome process could still hold the old dir's lock. Other launch failures (no Chrome, Chrome exiting at startup, a port held by another process) are not retried. A failed launch no longer leaves its monodesign-cdp-* profile dir behind.

  • Marking a dead run crashed can no longer overwrite a run that just started (#586). The #573 check re-read runtime.json and then renamed a crashed record over it, so a new run that wrote its record in between lost it until its next state write. The check now moves the record aside, writes crashed only if it is still the dead run's record, and puts it back with an exclusive link, so a record a new run writes at any point in that sequence is kept. The running process's own writes are never blocked or delayed.

Added

  • monomind org sign --check and --project <dir> (#558). Tools that rewrite org files themselves, such as mono-agent, re-sign only their own writes: they verify the org before writing and sign with --yes only if it verified. They had to scrape the review text for that. org sign <org> --check (or --check --all) only reports each org's state and never prompts, signs or writes anything (it skips the startup update check and subsystem init too, and does not record the plant watch's first look). It prints one line per org (release: signed), or with --format json {"orgs":[{"org","state","signedAt","message"}]}, where state is signed, changed, unsigned, invalid-signature, forbidden-key, not-found or invalid. It exits 0 when every org checked is signed and unchanged, 1 otherwise, and 2 for an org that is not there, --all with no orgs, or a usage error. Being read-only, it also runs inside a role. --project <dir> (with or without --check) uses that directory's real path as the project root instead of the current directory; it must hold .monomind/orgs. Signing through --project binds the same path as signing from inside the directory, and the refusal inside a role or agent exec process tree still applies.

  • monomind org sign --expect-hash <hex>, and a hash in org sign --check --format json (#558). A tool that checks an org, writes it and then runs org sign <org> --yes left a window: a role could edit the org JSON or an instructions_file in between, and the edit was signed. With --expect-hash, monomind reads the org file and each instructions file once, computes the hash it is about to sign from those bytes, and signs them only if it equals the one given. Otherwise it exits 1, names the expected and actual hashes, and writes nothing to the operator directory. It works with --yes and --project. With --all, pass --expect-hash <org>=<hex> once for every org (a missing, repeated or unknown org is a usage error, exit 2), and if one org does not match, none is signed. --check --format json now reports each signable org's current hash, computed from the same read as its state. The hash (the signed projection, its canonical JSON, the instructions digests and SHA-256) is documented in org sign so a tool in another language can compute it from the bytes it wrote, and a fixed-fixture test pins it.

    • org sign <org> --format json without --yes prints the review as JSON ({"org","state","hash","review","reviewText"}). hash is the hash of exactly the content reviewed, from the same single read that --expect-hash uses. review holds the structured fields: authority lines, unconfined roles, non-bundled skills, approval candidates, first-look configs and the diff since the last signature. reviewText is the text review. It never prompts or signs and exits 0. Signing afterwards with --yes --expect-hash <hash> refuses if a role changed the files after the review, so a signature is always of what the user saw.

    • The documented key order of the canonical JSON now matches what monomind has always produced. Array-index keys (canonical integers from 0 to 4294967294, with no leading zero or sign) come first in numeric order, and the other keys follow in UTF-16 order. The doc gives a Go recipe, and test vectors pin it, including the non-index keys 01 and 4294967295. Existing signatures are unchanged.

    • org run's one-time sign prompt now signs the instructions files it read for the review, instead of reading them again when it signs.

  • org sign declares its features in the --version --json handshake, and rejects options it does not know. An older monomind silently ignored --expect-hash and signed with exit 0, so a caller could not tell its guard had not run. monomind --version --json now lists org-sign-check (--check and --project, #561), org-sign-expect-hash and org-sign-review-json in capabilities (Agent Exec Protocol rev 29); a caller checks for the one it needs before relying on it. org sign now fails closed: any option it does not recognise (for example a misspelled --expect-hsh) prints org sign: unknown option --expect-hsh — nothing signed. and exits 2 without signing or writing anything. Other commands keep their current flag handling.

Removed

  • BREAKING CHANGE: monoswarm and autopilot are removed (#418). They were deprecated in 2.21.0. Neither started an agent: both recorded state files. Instead, spawn subagents with Claude Code's Task tool, all in one message, or run an agent org with monomind org run <org>.

    • CLI: the monoswarm command (init, start, status, stop, scale) and the autopilot command (status, enable, disable, config, reset, log, predict, check) are gone. Running either one prints what to use instead, not a typo suggestion.

    • MCP tools, for MCP clients: the 13 monoswarm_* tools (monoswarm_init, monoswarm_status, monoswarm_scale, monoswarm_health, monoswarm_shutdown, monoswarm_agent_add, monoswarm_join, monoswarm_leave, monoswarm_vote, monoswarm_notice, monoswarm_memory, monoswarm_audit_list, monoswarm_audit_verify) and the 8 autopilot_* tools (autopilot_status, autopilot_enable, autopilot_disable, autopilot_config, autopilot_reset, autopilot_log, autopilot_progress, autopilot_predict) no longer exist. A client that calls one gets "tool not found". The monoswarm and autopilot MCP tool categories are gone, so the full registry now has 198 tools.

    • monomind start and start stop no longer record or terminate a monoswarm state file, and call no MCP tool. start checks the project is initialized and prints the topology and max-agents settings from .monomind/config.yaml; its --topology/-t flag, which only set the recorded state, is gone: passing it prints a one-line warning and is otherwise ignored. start stop still stops a running daemon.

    • monomind status reads the agent count from the agent store (agent_list) instead of monoswarm_status. Its JSON output has agents: { total } in place of the swarm object, the Swarm panel is gone, and --health-check no longer has a "Swarm Status" check.

    • Generated files: the full, security and performance CLAUDE.md templates drop ## Monoswarm Orchestration and ## Monoswarm Configuration & Anti-Drift. ## Monoswarm Protocols & Routing becomes ## Agent Spawning & Routing and ## Monoswarm Execution Rules becomes ## Agent Execution Rules, without the monoswarm lines. All four old headings are recognised on upgrade, so an old CLAUDE.md written before the managed block sheds them cleanly. .monomind/CAPABILITIES.md drops "Monoswarm Orchestration" and "Monoswarm Vote Strategies" and the monoswarm command row. The monoswarm area is gone from guidance_capabilities / guidance_recommend, guidance_quickref's swarm-ops domain lists the Task tool and org run, and guidance_workflow no longer returns a swarmConfig or topology.

    • Shipped assets: the monoswarm skill, the /monoswarm:* commands, /coordination:monoswarm-init, /coordination:task-orchestrate, /mastermind:monoswarm, /mastermind:topology, /optimization:auto-topology and the coordinator-monoswarm-init agent are removed from every asset tree (.claude, the npm package, .agents, .gemini, .kimi-code). The swarm pack no longer carries them. Agents and commands that told models to call monoswarm_* tools now spawn with the Task tool.

    • Upgrading a project: init --force and init upgrade retire every file an older release installed for these: the .claude skill, commands and agent above, their .agents/skills and .gemini/skills mirrors, their .kimi-code/{agents,skills,plugin/commands} copies and their .opencode/{agent,command,skills} copies (.opencode/command/monoswarm-*.md, coordination-monoswarm-init.md, …), including projects set up before the init manifest existed. A file is retired only when its content matches a version some release shipped; it is moved to .monomind/backups/<run>/retired/files/<path>, and a directory left empty is removed. A file you edited is kept, and init prints a warning naming it. The READMEs init no longer rewrites (.claude/commands/{coordination,monitoring,workflows}/README.md), whose old versions named monomind monoswarm / monoswarm_init, are refreshed to the current copy when unmodified.

    • Manual steps after upgrading, only where init warned or you customised things:

      1. Delete or rewrite each file init reported as kept ("… was removed in 2.22.0 … but you edited it"), and any command, skill, agent, hook or script of your own that calls monomind monoswarm, monomind autopilot, or a monoswarm_* / autopilot_* MCP tool. Use Claude Code's Task tool or monomind org run <org> instead.
      2. Remove the old state if you have it: the monoswarm/ directory in the monomind data root (.monomind/monoswarm/, or monomind/monoswarm/ inside the repository's git directory) and .monomind/data/autopilot-state.json / autopilot-log.json. Nothing reads them now.
      3. An MCP client that pinned tool names (an allow-list, a saved prompt) should drop the 21 removed names.
      4. Scripts that parse monomind status --format json should read agents.total in place of swarm.*.
    • Also removed: the dashboard's Swarm Status panel and its monoswarm_status / swarmState fields, the statusline's and the UI's reads of .monomind/monoswarm/state.json (nothing writes it any more), the .monomind/monoswarm/ gitignore check in doctor, the monoswarm entry in the system_health checks, the unused MonoswarmCheckpointer set-up at CLI start, and the vote-tally and HMAC audit-log code only monoswarm used. doc/concepts/monoswarm.md is now a short removal note.

    • MONOMIND_LOG_LEVEL is no longer listed in the full CLAUDE.md template's Environment Variables. Its only reader in the CLI source was the monoswarm tools; bin/cli.js still honours MONOMIND_LOG_LEVEL=debug.

npm: @monoes/monodesign@1.2.25, @monoes/monomindcli@2.22.0, monomind@2.22.0

v2.21.0

View on GitHub

[2.21.0] — 2026-09-30

Deprecated

  • monoswarm and autopilot are deprecated and will be removed in 2.22.0, the minor release after this one (#418). Both record state and start no agents. Use Claude Code's Task tool or monomind org run instead. Nothing is removed in this release:

    • Every monoswarm and autopilot subcommand prints a one-line deprecation notice on stderr. -Q drops it. The notice never goes to stdout, so the subcommands that emit JSON (--format json / --json) keep it clean.

    • monomind start and monomind start stop record and terminate a monoswarm state file, so they print the same notice. start no longer suggests monoswarm status, and its progress lines say it records state and starts no agents. When monoswarm is removed in 2.22.0, start stops recording monoswarm state and start stop stops marking it terminated.

    • The 13 monoswarm_* and 8 autopilot_* MCP tools start their descriptions with DEPRECATED (removed in 2.22.0; use the Task tool or 'monomind org run'): and carry the full notice in a deprecated field on every result. The autopilot tool descriptions no longer claim to re-engage agents or report learning metrics.

    • monoswarm status counts idle agent records as idle, not active.

    • monoswarm init --format json printed its progress lines and table on stdout ahead of the JSON. It now prints only the result document there.

    • Honest wording: monoswarm scale reports roster entries recorded or removed (it said "Spawned N agent(s)"), monoswarm stop says it marks the state terminated (in its prompt, its output and the bare monoswarm help), and autopilot status shows Tasks: 0/0 (n/a) with no tasks instead of 100%. autopilot_status and autopilot_progress return percent: 0 for zero tasks.

    • The generated CLAUDE.md (full/security/performance templates), .monomind/CAPABILITIES.md, the main --help examples, the guidance catalog and quick reference, and the shipped monoswarm skill, commands and agents that tell models to initialize a monoswarm now say it is deprecated and point to the Task tool or org run. Section headings are unchanged, so upgrades of existing CLAUDE.md files are unaffected.

Removed

  • monomind.memory.learningBridge, memoryGraph and agentScopes config keys. init wrote them to .claude/settings.json and .monomind/config.yaml (with confidenceDecayRate, accessBoostAmount, consolidationThreshold and defaultScope), init upgrade added them, and the wizard asked "Record agent memory scopes (project/local/user) in the config?", but no code, helper or hook read any of them. init and init upgrade no longer write them, the wizard no longer asks, and CAPABILITIES.md drops the "Memory Scopes (ADR-049)" section. Existing configs that carry the keys still load, and init upgrade keeps them as they are. monomind.neural.enabled is unchanged: the SessionStart hook reads it.

Changed

  • The Claude Agent SDK and puppeteer's Chrome are no longer installed up front; they install on first use (#428). npm install monomind pulled the ~300 MB native Claude binary through @anthropic-ai/claude-agent-sdk, and puppeteer's postinstall downloaded 686 MB of Chrome into ~/.cache/puppeteer, for everyone. Measured from the packed tarballs on Linux x64, an install is now 263 packages and 938 MB of node_modules with nothing outside it, down from 344 packages, 1.23 GB and the Chrome download; four install scripts run instead of five. The SDK is now installed the first time a Claude org role, agent exec --runtime claude or agent models --runtime claude needs it. monomind browse still uses an installed Chrome, Chromium or Edge first; only when there is none does its first launch download Chrome for Testing through @puppeteer/browsers, and design detect of a URL uses that Chrome too. Both go into ~/.monomind/deps ($MONOMIND_HOME/deps), never into your project, with a notice on stderr. npm runs npm ci there, in a staging directory, against lockfiles shipped with the CLI (every tarball must match their integrity hashes, whatever registry is configured), with --ignore-scripts and one short fetch attempt, behind a lock, and the result is moved into place only once complete. Org roles cannot write the deps directory, ~/.npmrc or ~/.config/npm (file tools, the Claude sandbox, and a read-only bind in the bubblewrap mask), and monomind refuses to load a deps tree containing a symlink on the way in or out, a file owned by another user, or a group- or other-writable file. A copy of the SDK that monomind itself resolves is used only at the pinned version. Chrome is checked by HTTPS only; Chrome for Testing publishes no checksums. MONOMIND_NO_AUTO_INSTALL=1 turns this off and prints the exact install command instead. @monoes/monodesign no longer lists puppeteer (its URL scans use monobrowse, and fall back to a puppeteer you install yourself), and monobrowse gains setChromeFallback() and a MONOBROWSE_CHROME_PATH fallback that an installed browser always beats. The README and doc/privacy.md describe what installs when.

  • monomind init installs a small core pack; everything else is an opt-in pack (#411). Claude Code lists every skill and command with its description in about 1% of the context window (~8,000 chars on a 200k model) and drops descriptions past that. The default init installed 88 skills, 112 commands and 84 agents: ~39,500 chars of skill/command listing and ~13,000 of agent listing, so most descriptions never reached the model. It now installs the core pack: 26 skills (the mastermind engineering workflows, monolean, monodesign, monomotion, stop-slop, verification-quality, hooks, memory, GitHub and browser toolkits), 20 commands (/mastermind:do, review, plan, execute, debug, design, research, help, …) and 20 agents (the core dev agents plus Security Engineer, Frontend Developer, Software Architect, Technical Writer, Git Workflow Master, DevOps Automator, Monodesign and the GitHub PR/issue/release agents): 6,997 chars of skill/command listing and 3,094 of agent listing. The rest ships in eight opt-in packs: orgs, org-admin, swarm, github, testing, specialists (WeChat, Feishu, Solidity, embedded, SRE, …), business and extras. Add them with monomind init --packs orgs,github, --all-packs (or --full), the wizard's new pack question, or later with monomind packs add <pack>; monomind packs list shows each pack and its listing size, and monomind packs remove <pack> deletes only the pack's files that still match what init installed. Both keep the Kimi Code and OpenCode trees in step when a project has them. init --minimal now installs the 26 core skills (still no commands or agents) instead of 2.20.0's 20-skill set. init skills takes --packs in place of --memory/--github. Existing projects keep everything: re-running init or init upgrade deletes nothing, and init upgrade --add-missing now adds only files for the packs a project has (a project from before packs counts every pack it has files for).

  • Shipped skill, command and agent descriptions are capped at 200 characters (#411). pnpm run lint:skills fails on a longer one. The 62 over the cap were shortened, among them monodesign (1,080 chars), monolean (606), mastermind-liveness (434) and mastermind-monitor (426), and 15 more core ones were tightened. node scripts/measure-init-listing.mjs prints the listing size of a preset.

  • monomind init sets up only the coding platforms installed on your machine (#420). It wrote Claude Code, Antigravity, OpenCode, Kimi Code and Codex into every project. It now checks each one's CLI on PATH (claude, gemini/agy/antigravity, opencode, kimi, codex; on Windows with PATHEXT) and its config directory (~/.claude or $CLAUDE_CONFIG_DIR; ~/.gemini or ~/.antigravity; ~/.config/opencode, $XDG_CONFIG_HOME/opencode or ~/.opencode; ~/.kimi or ~/.kimi-code; ~/.codex or $CODEX_HOME), without running any of them, and writes the ones it finds plus the ones the project already has, so init --force still refreshes and re-pins every platform's MCP entry. With none found it writes Claude Code and says so. Init prints what it detected and how to add the rest. On a machine with only Claude Code, a default init in an empty project now writes 162 files (2.4 MB) instead of 437 (5.3 MB), code graph included. --platforms a,b names the platforms (--platform still works, but not together with --platforms); --all-platforms and --target all write all five, and so does --full along with every component and pack. --all-platforms with a narrowing flag (--platforms, --target <one>, --only-claude, --skip-claude, --codex, …) is an error, and --skip-claude still means all platforms but Claude Code. The wizard asks which platforms to set up before the component questions, with the detected ones pre-selected (all five for Full). init --json reports platforms: {source, selected, detected}, and init skills copies skills into .gemini/ and .agents/ only if the project has them. init upgrade --add-missing copies new skills only into the .gemini/ and .agents/ trees a project already has, so an upgrade never adds a platform; init upgrade does not refresh .codex/, opencode.json/.opencode/ or .kimi-code/ (re-run init --yes for that). The post-init doctor pass no longer installs the Claude Code CLI on its own: it asks first, only when Claude Code is selected and missing and someone is at a terminal, and otherwise prints npm install -g @anthropic-ai/claude-code; a claude in ~/.local/bin or ~/.claude/local counts as installed. init --json never asks. Init still runs no npm install in your project: package.json stays byte-identical and no node_modules appears. The code graph and the hooks use the @monoes/monograph copy bundled with the CLI (or a global install).

  • The Claude runtime uses an installed Claude Code instead of downloading the SDK's copy (#522). Claude org roles, agent exec --runtime claude and agent models --runtime claude pass a usable installed claude to the SDK as pathToClaudeCodeExecutable, and the first-use install then fetches the SDK with --omit=optional (about 4 MB, still from the shipped lockfile) instead of 300 MB. monomind looks at $MONOMIND_CLAUDE_PATH, then claude on PATH, ~/.local/bin/claude and ~/.claude/local/claude, without running anything to find it. The real path runs, and it must be named claude or the native installer's versions/<x.y.z> and not be a script, so a shim that resolves to another program (mise) is never run. A binary found on its own is used only if it is a system install (not under $HOME, a temp dir or the cwd, and the file and every directory above it owned by root and not group- or other-writable), because org roles run as your user and could otherwise replace a binary the org daemon runs outside the sandbox; running as root, or on Windows, nothing is picked up on its own. Per-user installs (the native installer, mise, nvm, Homebrew) need MONOMIND_CLAUDE_PATH, which only has to be owned by you or root and not group- or other-writable (not checked on Windows). When it is not a system install, monomind warns and keeps it read-only for roles: denied to the file tools and in the Claude sandbox, and read-only in the bubblewrap mask with every directory between $HOME and it pinned so none can be renamed aside. claude --version (once per process, no shell, 5-second timeout) must print x.y.z (Claude Code) with 2.x at or above the 2.1.226 the pinned SDK bundles. Anything else falls back to the bundled binary; a refused MONOMIND_CLAUDE_PATH is reported on stderr, and MONOMIND_CLAUDE_PATH=bundled turns detection off. The SDK's query always passes the chosen binary, and fails with a clear message if an update has removed it. doc/privacy.md describes the checks.

Fixed

  • org sign and org approve-paths no longer list the live ~/.claude/.config.json as a possible plant before monomind's first look (#548). With no first-look record for the home directory, the Claude Code global configs are not approval candidates, since the first look trusts every one present. org sign prints them on a dim line instead: "will be trusted at monomind's first look: …".

  • Codex home and cost follow-ups from the #537 review (#540). When ~/.codex or $CODEX_HOME is a symlink (dotfile managers), the codex runner now resolves it and makes the real directory 0700 when the current user owns it, so its logs are no longer world-readable. It tightens each directory through an O_NOFOLLOW | O_DIRECTORY file descriptor with fchmod instead of lstat + chmod (the old calls remain the fallback where Node lacks those flags). org costs keeps a live $0 role cost as 0 instead of reporting it as unknown, and the mastermind-budgets skill marks the org spend as a lower bound when some roles report no cost.

  • npm calls work on Windows again (#521). Node refuses to spawn npm.cmd without a shell (EINVAL since 18.20.2 / 20.12.2), so the first-use installer, MCP auto-install, security cve and the update checker and installer failed on Windows. They now run npm's npm-cli.js with Node (found through npm_execpath or next to node.exe), still without a shell.

  • A fileWrite/fileRead entry that names a directory now grants everything inside it (#492). Scope entries were always matched as globs, and a glob with no wildcard matches only that exact path, so a role with fileWrite: ["/srv/growth/site"] was denied every file inside site, while the deny message told it that it "may use /srv/growth/site". An entry with no glob characters (*, ?, [, {) now means that path and everything beneath it; a relative one resolves against the org workdir. It is compared on real paths, so a sibling with a shared prefix (site-old) and a symlink leading out of the directory are still denied, and the credential/guard deny list, the .git write check and the decision-file check apply as before. Entries with glob characters match exactly as they did. A directory entry's real path is taken once, when the role starts, so a role cannot widen it by swapping the directory (or a not-yet-existing entry) for a symlink from Bash; an entry that no longer resolves to its startup path refuses the call. An entry that is already a symlink, or is /, a drive root, $HOME or an ancestor of $HOME, grants nothing (write an explicit glob if that is really intended), and an empty-string entry is a config error. Deny messages now label each entry as a directory grant or a glob, and name absolute grants when a path is outside every root. org validate (after {{org_root}}/{{home}} expansion) reports a refused directory entry as an error, and warns when an absolute non-glob entry does not exist or a relative one leaves the role's workdir. Per-call approval results are also reworded: a pending or denied Bash/WebFetch/org_send call now says only that one call is waiting for or was refused by a human, that the task queue is not stuck, and what to do meanwhile (continue other work, don't retry the identical call while it is pending, pick another approach after a denial). The [approval] <action>: APPROVED|DENIED inbox line keeps its prefix and adds the next step for the pending call(s).

  • -o json/-o sarif/--json output is a clean document on stdout (#495). security scan -o sarif printed its "Security Scan" banner and "Scan complete" line on stdout ahead of the document, so monomind security scan -o sarif > results.sarif wrote a file that SARIF uploaders reject; -o json had the same problem, and -Q changed neither. security scan, security cve --json, security defend -o json and performance benchmark -o json now send the banner, progress and summary lines to stderr, and -Q drops them. Errors still go to stderr under -Q. security defend uses -Q for --quick, so write --quiet in full there. User-visible changes beyond JSON output:

    • Spinner and progress-bar lines now go to stderr in every command, as ora does, so cmd > file no longer captures lines such as "Scan complete". This cleans the JSON output of commands that start a spinner before printing it, such as hooks coverage-gaps --format json and hooks worker run --format json. Under -Q the spinner's progress line is dropped, but its completion line is kept.

    • Commands whose only output is their result line still print it on stdout, and -Q keeps it: doc ingest, doc import, doc export, hooks intelligence export --output, and browse workflow run.

    • security scan -Q in text mode drops the banner and the "Scan complete" line. It keeps the findings and the summary box.

  • monobrowse: two launches racing for the same default port no longer both fail when both lose the bind (#491). On Linux, two processes that call listen() on the same port at the same instant can both get EADDRINUSE (each socket is marked LISTEN before the kernel's conflict check), leaving the port free; about 1 race in 600 locally. Both Chromes then exited early with nothing listening, which launchBrowser() read as a Chrome that cannot start, so it failed instead of moving to the next candidate port ("Chrome exited before the CDP endpoint opened on port 23480 (code=21)" in CI). One such early exit per launch is now treated as a lost race and the scan moves on; a Chrome that really cannot start fails the same way on the next port, and the first failure is reported.

  • A claude role's Bash tool uses the role's private TMPDIR (#503, follow-up to #480). Claude Code reads CLAUDE_CODE_TMPDIR before TMPDIR, and its Bash tool exports that variable to every command it runs. An org started from a Claude Code session's Bash tool inherited the outer session's value, so in the SDK sandbox a claude role's Bash got that shared directory as $TMPDIR and a bare mktemp landed there: $HOME/mrg-tmp/claude-1000/claude-1000 in the 2.20.0 release run's drill. Without the sandbox, $TMPDIR was right, but a claude started from the role's shell still used the shared directory. The role environment now sets CLAUDE_CODE_TMPDIR to the role's directory as well as TMPDIR, TMP and TEMP. Claude Code keeps its own files in claude-<uid>/ inside that directory. The sandbox is unchanged: its writable roots already include the base the role directory sits in. A new opt-in test (MONOMIND_SANDBOX_E2E=1) runs the bundled Claude Code CLI against a scripted API, both unsandboxed and in the sandbox, and checks $TMPDIR, mktemp -d and $CLAUDE_CODE_TMPDIR.

  • The pre-bash hook no longer prints git's "not a git repository" error in a project without git (#506). A grep/find command reached the monograph lookup, which runs git rev-parse to find the repo root with git's stderr passed through, so a project outside a git repository (or across a filesystem boundary) got fatal: not a git repository … on the hook's stderr. The helper's git calls in utils/monograph.cjs now discard git's stderr; the result was already ignored on failure. tests/hooks/security-gates.test.mjs also stops inheriting MONOMIND_HOOK_QUIET from a live session (it skipped the code path the fail-open test crashes) and sets GIT_CEILING_DIRECTORIES, so it passes the same on tmpfs and disk-backed TMPDIR.

  • Security: org roles can no longer rewrite their own org definition, decisions or runtime state with file tools (#498). The file tools refused only the four decision files (gates.json, approvals.json, questions.json, inbox.jsonl). A role whose fileWrite reached the org root could Write or Edit .monomind/orgs/<org>.json, which holds its own policy (scopes, git level, sandbox.allowWrite), and have that apply on reload or at the next run. It could also rewrite decisions.jsonl. This includes the default fileWrite: ["**"] when the workspace is the project root. On the Claude runtime, Write, Edit, MultiEdit and NotebookEdit are now refused, regardless of scope, root or allowWrite, on these files under the org root's .monomind/orgs/:

    • every file directly in it (org definitions and their -state, -secrets, -runstate, … files);

    • every file directly in an org dir (decision files, runtime.json, decisions.jsonl, history.jsonl, idle-watchdog.json, and the run/stop/pause/reload control files);

    • a run dir's bus.jsonl and sessions.json;

    • anything under git-guard/. Every path argument of a call is checked. Paths are classified both as written and after resolving symlinks (dangling ones included), and hard links are compared by inode. On macOS and Windows, segments are compared case-insensitively, and on Windows without trailing dots, spaces or :stream suffixes. The .git write check now compares the same way. reports/, work/, workspace/, worktree/, .mail/ and <x>-memory/ stay writable, and so does a checkout's own .monomind/orgs/. For Bash, and for the native file tools of other CLI runtimes (codex apply_patch, kimi, …), which never reach that check:

    • The bubblewrap authority mask binds the orgs dir read-only and binds only the role work dirs back read-write. Each org's work, reports, runs, scratch, workspace and .mail, and any <dir> a role's fileWrite names, are created first, so git worktree add … work/src still works. The org root and .monomind can't be renamed. A planted symlink (ln -s .. orgs/foo, ln -s $HOME orgs/foo) can't loosen the mask or uncover the hidden credentials.

    • The SDK sandbox makes the existing authority files read-only, including every org's whole git-guard/. The orgs tree and every dir in an org dir can't be renamed or swapped. Bash there can still create a new org definition plus its run file, which org serve would start, or pre-create an authority file the daemon hasn't written yet. org-runtime.md ("Authority files") lists these and the other limits.

  • monomind start uses the topology and maxAgents from .monomind/config.yaml (#509). init writes that section as swarm:, but start read monoswarm:, so it always fell back to hierarchical-mesh and 15 agents. It now reads swarm: and still accepts a monoswarm: section. The --topology flag still takes precedence.

  • The guidance catalog named skills that do not exist. guidance_capabilities and guidance_recommend listed memory-advanced, memory-vector-search, memory-patterns, memory-learning, memory-optimization and five github-* skills; none ship. The memory and GitHub areas now point to the shipped memory-toolkit and github-toolkit; the embeddings area links no skill, since none covers the embeddings_* tools. A test fails if the catalog names a skill monomind init does not install.

  • Security: org file-tool path checks fold case and Unicode look-alikes; the Bash git check matches git in any case (#496). On a case-insensitive filesystem (macOS, Windows, vfat/exfat, a Linux casefold dir) a role could reach a denied path through another spelling of it. Deny checks now fold every path segment on every platform, whatever the filesystem: NFKC normalization, removal of default-ignorable code points (zero-width space and joiners, soft hyphen, BOM, CGJ, which Linux casefold ignores), and full case folding (so .SSH, .ſsh, .ßh, .ẞh, .gıt, .gi<ZWJ>t, .ss<soft hyphen>h, .config, .profile, daſhboard-token and a Kelvin-sign K all match), with trailing dots and spaces and a :stream suffix dropped. This covers the credential and guard deny list (~/.GITCONFIG, ~/.BashRC), the dashboard token, the org authority files and the .git write check. On a case-sensitive filesystem a deny now also refuses look-alike names, for example a Dashboard-Token file anywhere, or anything under .monomind/Orgs/ of the org root, on Linux. That fail-closed trade-off is intended: the policy cannot always tell whether a directory folds case, and a missed deny is worse than a refused look-alike. Grants (roots and directory entries in fileWrite/fileRead) compare the on-disk spelling that realpath returns and fold only the part of a path that does not exist yet. They do that only on macOS and Windows, and only where a probe of the target directory (a case-swapped lookup of its own name and of one of its entries, by inode and never through a symlink) shows that the filesystem folds case. Globs never fold, and a grant never reaches an existing directory spelled in another case. A directory entry spelled in another case than the directory on disk is no longer refused as a symlink. The Bash git classifier matches GIT, /usr/bin/GIT, git.EXE, BASH -c "git …", ENV -i …, cmd /c, powershell/pwsh and other interpreters in any case, so at level read GIT push is refused like git push.

  • init --only-claude with another platform flag is an error, and --skip-claude no longer suggests adding Claude Code back (#525). init --only-claude --codex quietly wrote Claude Code only; --only-claude with --platforms/--platform naming another platform, --target <other>, --codex/--opencode/--kimicode or --skip-claude now fails with --only-claude cannot be combined with … (--target claude and --platforms claude are still accepted). After init --skip-claude, the "Not written" hint left Claude Code in its --platforms list and offered --all-platforms; it now names only the other platforms and its suggested command keeps --skip-claude.

  • --runtime hermes works with hermes 0.19.0 (#531). The runner ran hermes chat --query-file <file> --oneshot -Q, and hermes 0.19.0 (the PyPI release) has neither flag, so every turn failed with unrecognized arguments. The runner now reads hermes chat --help (stdout and stderr) and caches the answer once a probe exits cleanly; a timed-out or failed probe is retried on the next run, and the probe stops when the run is aborted. A build that lists --query-file keeps that form, and otherwise the runner runs hermes chat --query=<prompt> -Q, which in 0.19.0 answers one query and exits. With 0.19.0 the prompt therefore travels on the command line: other local users can read it in ps or /proc while the turn runs, and a prompt over 128 KiB fails with a clear error instead of E2BIG. A failed turn with nothing on stderr now shows what hermes printed on stdout, where 0.19.0 puts its "isn't configured yet" setup error; that line maps to auth, and the rest of stdout is shown but never used to pick the error code.

  • --runtime pi-rpc reports a missing API key at once instead of timing out (#532). Without a key, pi 0.87.1 in --mode rpc answers the prompt with success:false ("No API key found for openai") and sends nothing else. The runner ignored that reply and waited on its 10-minute silence watchdog. It now fails the turn with missing API key: set OPENAI_API_KEY for provider openai, or run \pi` then /login, and pi's own message. When a model is set, the runner first asks pi with pi auth check --model <m> --json(about 0.3 s): onlynot_readystops the run before pi starts, as a missing key or, for other reasons, "not logged in or the login expired". pi resolves the provider itself, so an OpenRouter-routed id such asdeepseek/deepseek-chat-v3.1with onlyOPENROUTER_API_KEYset runs normally. A pi withoutauth check`, or a check that fails, skips the pre-check. Any other rejected prompt also fails the turn, and pi's no-key text on stderr when it exits is reported the same way.

    • agent exec reports a missing API key as error {code:"auth", fatal:true} on every runtime (Agent Exec Protocol rev 27). A message saying "missing API key", "no API key found/configured", or hermes's "no inference provider configured" / "no API keys or providers found" was runner-error; §3.4's auth now also covers a key that was never set. Text a runner attaches but did not write itself (hermes's stdout, cline's final model text) follows a [output below is not classified] line and never decides the error code, so a model saying "401" can no longer turn a failure into auth.
  • An unknown cost is reported as null, not 0 (#533). A runtime that reports no cost (codex, kimicode, hermes, vercel and the other reports_cost: false runtimes) showed cost_usd: 0 in agent exec's usage and result events, in agent test --json when no tokens were reported, and in org usage events, org report and org costs — the same value as a free turn. Those fields are now null when no cost was reported, and totals are the sum of the reported costs or null when there are none. When only some usage had a cost, the total is a lower bound and org report --json / org costs --json add cost_complete: false. A null cost never counts toward --budget-usd or a role's budget_usd. The human-readable org costs, org report --by-role, org logs --stats, run-end line and org status say unknown; the dashboard's run history says unpriced. vercel and hermes no longer yield a fake cost_usd: 0. Protocol rev 28, capability agent-exec-cost-null.

  • agent models marks aliases of the same model (#534). Claude's default and opus aliases both resolve to the same model, so a caller that tested every listed model ran and paid for it twice. Every entry is still listed, so a lookup by id such as opus keeps working; an entry that resolves to the same model as an earlier one now carries alias_of with that entry's id ("alias_of":"default" on opus), and the earlier entry lists all of them in aliases. Skip alias_of entries to test each model once. The table view shows (alias of default). What each alias resolves to is unchanged. Capability agent-models-alias-of.

  • MonoFence no longer installs monofence-ai into your project (#519). When monofence-ai was missing, the monofence_* MCP tools ran npm install monofence-ai --no-save in the current directory, which created or changed node_modules in the user's project, and then asked for an MCP server restart. They now use the first-use installer, which puts monofence-ai@1.0.7 (pinned, with a shipped lockfile, --ignore-scripts) into ~/.monomind/deps and loads it from there without a restart. security defend, security redteam and org role fences load it the same way; they imported it by name, which never saw that directory. A failed install reports the installer's own message, including the command to install by hand, and is not retried in the same session. The installer now also resolves ESM-only packages such as monofence-ai, whose exports have only an import condition; before, it could not load one even once installed.

  • design detect <url> and design fix <path> use their positional target (#520). The --target option had a parser default of ., which always won over the positional argument, so monomind design detect https://example.com scanned the current directory instead (and design fix ./src fixed the current directory). The positional target is now used when -t/--target is not given; -t still works, and with neither the target is still ..

Security

  • codex no longer writes your environment to a world-readable shell snapshot (#535). codex's shell_snapshot feature is on by default in codex 0.156.1, and codex exec, which monomind's codex runner uses, creates $CODEX_HOME/shell_snapshots/. A snapshot holds the user's shell environment, including every exported API key and token, and is created with the process umask, so 0644 (world-readable) under the usual umask 022. The runner now passes -c features.shell_snapshot=false -c features.shell_snapshot_v2=false on every codex exec, so no snapshot is written. Before each spawn it also makes $CODEX_HOME (default ~/.codex) and its sessions/ and shell_snapshots/ 0700 when you own them, which hides the files inside from other users whatever their own modes. The process umask is not changed, so files the agent writes in the workspace keep their usual modes. Snapshots already on disk (from monomind runs or interactive codex) stay there: delete ~/.codex/shell_snapshots/*.sh and rotate the keys they contain.

  • Org definitions take effect only when the operator has signed them (#502). A role whose Bash could write .monomind/orgs/ (an unsandboxed or full-access role, a runtime whose own file tools are not policy-gated, or the SDK sandbox, which lets Bash create new files there) could add evil.json with a policy.git: push role plus an evil/run file, and org serve started it with push credentials. A role could also widen its own org's policy for the next reload or run. access_ack covered only full-access grants. Now:

    • monomind org sign <org> (and --all) prints everything that decides what the roles may run, reach or be granted (tool provider commands and env names, adapter and provider config, sandbox allowWrite/allowedDomains, skills, instructions_file, precheck commands, federation, fence), names every role that would run unconfined on this machine, shows a diff against the last signed version, and signs it. The signature covers every field of the definition except the goal and each role's title, responsibilities and ui, so each role's whole policy, the roles with their runtimes and adapters, instructions_file, skills/skill_pool, run_config (including prechecks), schedule, runtime, fence, federation and loadouts are covered; a __proto__/constructor/prototype key is refused. It is an HMAC under the same machine-local key as full-access grants, stored beside that key in ~/.monomind/orgrt-operator/, which no role can read or write. The key and signature files must be the operator's own, mode 0600 and not symlinks, and a key replaced after a daemon loaded it is refused. It is not stored in the org file, so tracked org files stay unchanged. sign refuses inside an org role's or agent exec's process tree; without a TTY and --yes it prints the review and signs nothing.

    • Enforced where a definition takes effect: org run, org serve's runfile poll and schedule (before a scheduled org's prechecks run), resume from a checkpoint, and org reload. An unsigned or changed definition is refused with "run monomind org sign <org> as the operator after reviewing the change". A refused reload changes nothing: the running org keeps its last verified definition and emits a hot-reload-refused audit event. Goal and prompt edits need no new signature.

    • Migration: existing orgs are unsigned. org run on a TTY offers a one-time review and sign; org serve, a detached org run and every other non-TTY path refuse until the operator runs monomind org sign <org>, or monomind org sign --all once per checkout (this includes the shipped release, monomind-dev and sample-team orgs). org create and /mastermind:createorg sign the org they write. org role set-access re-signs an org that was signed before its edit.

    • Roles can no longer write what the operator's own sessions run or trust: the org root's .claude/ and .mcp.json, ~/.claude.json (read-only in the bubblewrap mask), both org skill libraries, ~/.monomind (except the CLI's own state such as projects/, browser state and models/), the terminal-execution gate, ~/.npm/_npx, ~/.npmrc, ~/.local/bin and more shell startup dirs. They are refused to the file tools, in the SDK sandbox's denyWrite and read-only in the bubblewrap mask; the skill libraries and the terminal gate (as disabled) are created before a role starts. A signed policy.sandbox.allowWrite entry opens one of them. A role can no longer fill npx's cache; point npm_config_cache at $TMPDIR if it must. In the mask ~/.monomind itself is read-only with only those entries bound back, and cline and aider keep an org role's state in its $TMPDIR. mcp stop signals the pid in ~/.monomind/mcp.pid only when its command line is a monomind MCP server, and the terminal-execution gate is read from $MONOMIND_HOME when set, where it is protected. doctor -c org-skills and org sign list org skills that come from the project or user library.

    • instructions_file is read only from inside the project, through every symlink, and never from the operator or dashboard-auth directories, a credential store or a dashboard token. Its content is signed as a digest; the file is read through a descriptor opened with O_NOFOLLOW and checked to be the verified inode with no other hard link, and a session reads it only while its content matches the digest verified at org start.

    • A path a role plants because it did not exist yet is quarantined: ~/.claude/.config.json (which Claude Code prefers over ~/.claude.json) and other .claude*.json variants that were not there at monomind's first look (recorded once; a live legacy config the operator already had is left alone), a .mcp.json in an org work tree that is untracked or differs from the main checkout's, and every other protected path that was missing when a role session started. That baseline is kept in the operator dir, so a crashed or killed org run does not make a plant look pre-existing, and only monomind org approve-paths <path>… (a new subcommand, TTY only, never from a role) trusts a path; signing approves nothing. Checks run at every org start, every session start and end, every 2-second org run and org serve tick, and every doctor run. Anything found is moved (never deleted) to ~/.monomind/orgrt-operator/quarantine/<project>/<ts>/, out of every role's reach, with an audit event and an operator question giving the exact mv … && monomind org approve-paths … to restore it. The first look prints what it trusted. doctor -c org-skills warns when .mcp.json servers are approved by name but .mcp.json is missing, untracked or modified.

    • org test-loop runs its fixture orgs in a throwaway directory, not in the project, and removes their signatures.

    • Residual: a role that can read the operator-credential directory can sign, as it can already forge a full-access grant: an active full-access role, or a role that runs with neither the SDK sandbox nor the bubblewrap mask. Such roles are allowed, by decision: refusing them would stop orgs that need one (a push-level releaser, codex on macOS, any role on a host without bubblewrap), so signing protects every other role and these run with a warning instead. org sign and every org start name each unconfined role and why it runs without an OS sandbox (for example policy.git push, and no bubblewrap mask). To confine one, run it on the claude runtime below policy.git: push with the sandbox on, or install bubblewrap (Linux).

  • Org roles can no longer overwrite the operator's node, npm, claude or monomind installed under $HOME, or plant a file on the operator's PATH (#527). With node from mise, nvm, volta, fnm, asdf or bun, the SDK sandbox's allowWrite (which includes $HOME) and the bubblewrap mask both let a sandboxed role replace node, npm or monomind's own code, or drop a git into a writable PATH directory, which the daemon and the operator's shells then ran outside every sandbox. At every org and role-session start monomind now resolves the real paths of process.execPath, the running CLI's package root, every writable directory on PATH (and the directory holding a symlink on the way to one, such as fnm's multishells), and node/npm/npx/claude on PATH, each with its install root, plus the version-manager roots (mise, nvm, volta, fnm, asdf, rustup, pyenv, rbenv, ~/.cargo/bin, ~/go/bin, bun's global installs, pnpm's home as a whole), honouring $XDG_DATA_HOME/$XDG_STATE_HOME/$XDG_CONFIG_HOME and each tool's own variable. Also covered: mise's global config dir and trust store, ~/.mise.toml, ~/.tool-versions, direnv's allow list and config dir (a role could otherwise write or trust a config that every mise- or direnv-activated operator shell then runs), and toolchain config files (~/.bunfig.toml, ~/.cargo/env, ~/.cargo/config.toml, ~/.yarnrc.yml, ~/.default-npm-packages, pnpm's rc, Go's env). The list joins the operator-protected paths, so it is refused to the file tools, in the SDK sandbox's denyWrite, read-only in the mask and watched for plants; the install dirs a tool in use expects are created empty up front, so the operator's own pnpm add -g is never taken for a plant. Every directory above a protected path (~/.local, ~/.local/share, …) is now a mount point in both OS layers, so a role cannot rename it aside and plant a new tree; this also closes that route for ~/.local/bin and ~/.npm/_npx. An org root at $HOME no longer uncovers ~/.monomind in the mask, and excludes no PATH directory (with a warning). Roles still run node, npm and claude. A role that installs a global tool gets EROFS; npm_config_prefix=$TMPDIR/npm-global installs it in the role's temp dir. A role's pnpm store moves to $XDG_DATA_HOME/pnpm-store (npm_config_store_dir) and pnpm no longer self-installs versions in a role (npm_config_manage_package_manager_versions=false); bun's cache stays writable.

  • First-use code is pinned by hash, and roles can no longer plant missing config or move a custom MONOMIND_HOME aside (#526, follow-ups to the #518 review).

    • Pinned hashes. The Claude Agent SDK's sdk.mjs, each platform's Claude binary, and every dist/*.js file of monofence-ai (which has no dependencies) have SHA-256 hashes shipped next to the install lockfiles, taken from the registry tarballs (the procedure is documented beside them). They are hashed once per process before the package is imported, whether the copy is in ~/.monomind/deps or found up monomind's own module path. Every query() then passes the verified bundled binary as pathToClaudeCodeExecutable, so the SDK never picks its own (an installed Claude Code that #522 selected is passed as is and not pin-checked), and one stat before the query and again before a spawn hook refuses a binary that changed since it was hashed. The first Claude session in a process waits for the hash of the about 300 MB binary (well under a second on a current machine). sdk.mjs is imported by path right after its hash, a window of milliseconds that only an unsandboxed process could use (roles cannot write the deps dir). @puppeteer/browsers is not pinned (it loads a whole dependency tree); a test fails for any optional dependency that is neither pinned nor listed as unpinned with a reason. A same-user plant passed the ownership and mode checks; now a mismatch refuses to load, names the file and says what to delete. A test keeps the pins in step with the pinned version and lockfile, and checks them against the copy the checkout installed.

    • Missing config is created before a role starts. The SDK sandbox drops a denyWrite path that does not exist, so a role could create ~/.npmrc, ~/.config/npm or a shell rc file. At org and session start, in the operator's HOME and only where the path is absent (nothing is ever overwritten), monomind now creates:

      • ~/.npmrc, ~/.bashrc, ~/.profile as empty files (mode 0600). Empty, each runs or sets nothing: npm merges nothing from it, interactive bash sources nothing, and ~/.profile is read by sh/dash login shells, and by bash only without .bash_profile/.bash_login, never by zsh. ~/.profile is not created when $SHELL is zsh or fish: installers such as nvm's append to ~/.profile when it exists instead of that shell's rc file;
      • ~/.ssh, ~/.config/git, ~/.config/gh, ~/.config/npm as empty mode-0700 directories (and ~/.config if missing). Tools read files inside them, not the directories.

      Linux only. On macOS only ~/.config is created: seatbelt denies a missing path by rule, so the missing entries are passed to it instead (see below). The SDK sandbox then denies them and the mask binds them read-only. Left to the planted-path watch, because an empty one could change behaviour: ~/.bash_profile and ~/.bash_login (bash would skip ~/.profile), ~/.gitconfig (git config --global would stop writing a later ~/.config/git/config) and the zsh startup files (zsh's new-user setup would not run).

    • No rename aside through an ancestor. Every directory above $MONOMIND_HOME and ~/.monomind whose parent a role can write is a mount point in the SDK sandbox and the bubblewrap mask. monomind refuses to load from a deps root reached through a symlink in a directory the user can write.

    • macOS. The SDK's seatbelt profile already denies unlinking and creating every ancestor of a denied path, so the rename-aside defence holds there without mount points. Seatbelt rules match paths, so on macOS a denyWrite entry that does not exist yet (with an existing parent) is now passed too, and creating it is denied.

npm: monomind@2.21.0, @monoes/monomindcli@2.21.0, @monoes/monobrowse@1.0.30, @monoes/monodesign@1.2.24, @monoes/hooks@1.0.13

v2.20.0

View on GitHub

[2.20.0] — 2026-09-29

Added

  • agent exec reports subagents on every runtime, not only claude (#387, capability agent-exec-subagent-events, agent-exec protocol rev 24). On any other runtime, a tool call whose tool_activity has kind:"task" is now followed by a subagent started event, and its end by finished with status (completed, failed, denied, or stopped on cancel/timeout) and a summary of up to 500 characters of its output. id and tool_use_id are the call's tool_activity id. The events are synthesized from tool_activity, so they have no progress phase and no usage. opencode (task), cline (spawn_agent, team_*) and dsh (subagent) mark such calls themselves; other runtimes get task from the shared tool-name table (Task, Agent, spawn_subagent, invoke_subagent, browser_subagent, …). claude keeps its SDK-based events and gets no duplicates. New golden fixture doc/agent-exec-protocol/fixtures/subagent-synth.ndjson.

  • agent test --json takes --sandbox and --env, and reports native_sandbox (#474, agent-exec protocol rev 25, capability agent-test-sandbox). --sandbox read-only|workspace-write|full and repeatable --env KEY=V mean what they mean for agent exec, and are checked the same way. The result has a new native_sandbox field with the sandbox the vendor CLI really ran with, taken from the turn's start event (null when the turn never started). A mode the runtime does not have, such as --sandbox workspace-write on pi, returns status: "error" with error.code: "unsupported". The test turn keeps scoped access, and neither flag can loosen the sandbox: an org git level below push still caps codex and grok at workspace-write. Callers such as mono-agent can now test a runtime inside the sandbox their real turns use.

  • agent exec --sandbox has real restricted modes on more runtimes, and --sandbox-fallback makes an unsupported mode non-fatal (#482, agent-exec protocol rev 26, capabilities agent-exec-sandbox-restricted and agent-exec-sandbox-fallback). 2.19.0 offered read-only/workspace-write only on codex, grok and dsh, and any other mode was a fatal unsupported, so a caller sending one --sandbox value to every runtime broke claude and copilot chats. New mode restricted: the CLI's own approval rules apply and every call they would ask about is refused (a rule set, not a file-system boundary). New per runtime, each checked with a live turn that tried a write and a shell command: copilot read-only (--deny-tool=write --deny-tool=shell), workspace-write (--allow-tool=write --deny-tool=shell, edits confined to the cwd and temp dir, no shell) and restricted; antigravity restricted (no --dangerously-skip-permissions); opencode restricted (edit/bash/task/external_directory ask, every ask rejected); pi and pi-rpc read-only; claude read-only and workspace-write with --access scoped or read, enforced by monomind's own tool gate (native_sandbox: "monomind"). --sandbox-fallback fail|strictest|run (also on agent test): fail stays the default; strictest runs the closest mode at least as strict as the request (else the strictest there is); run runs the runtime default. A replaced mode emits a status notice, and start now carries sandbox_requested and sandbox_applied. agent scan --json entries gain sandbox_mode_reports, and the agent test --json result gains sandbox_applied. Without --sandbox, every runtime's argv is unchanged.

Changed

  • The dashboard no longer starts at every session start unless you opt in (#423). The SessionStart hook control-start.cjs started the Control Room server (:4242) for every initialised project, and the servers stayed resident: one machine had 8, two at 0.7–0.9 GB RSS. The hook now does nothing, and prints nothing, unless MONOMIND_DASHBOARD_AUTOSTART=1 is set or .monomind/dashboard.json has {"autostart": true} (written by the new monomind init --dashboard); MONOMIND_DASHBOARD_AUTOSTART=0 turns it off for a project that opted in. A server that is already running is left alone. monomind ui starts it by hand and monomind org run still starts it unless MONOMIND_DASHBOARD_AUTOSTART=0. Existing projects: the hook ships with the package helpers, so updating turns auto-start off there too; run monomind init --dashboard in a project to keep it. Without a running dashboard the per-prompt Second Brain lookup uses its keyword fallback.

  • monomind route task is monomind pick --agents, and the routing hooks carry pick's verdict (#430). route task (and bare monomind route "<task>") ranked through the picker but always named an agent: the top of a ranking pick called unconfident (shown as e.g. 72%), or coder when nothing matched, while pick said "no confident match". It now runs pick and prints exactly its output, text or --json; data.agentId is set only when pick is confident. hooks_route, hooks_pre-task and hooks_explain return pick's confident flag (hooks_route also its summary), pre-task names a primary agent only when pick is confident, and explain says when the top is below the bar. The hooks no longer load .claude/helpers/router.cjs, which no hook used for selection; the file stays for scripts and doctor. route semantic and the route layer (@monoes/routing) are marked deprecated in help and docs, not removed.

Removed

  • Hooks and helpers that ran every session, turn or prompt and did nothing (#417). monomind init no longer registers the SessionStart auto-memory-hook.mjs import and Stop auto-memory-hook.mjs sync hooks (both only printed "skipped — AutoMemoryBridge removed"), the SubagentStart hook-handler.cjs status hook or the Notification hook-handler.cjs notify hook (both only printed [OK] Hook: …). With no hooks left, it writes no Stop or Notification event, and the init wizard no longer offers them. The helpers auto-memory-hook.mjs, learning-service.mjs (nothing called record()) and memory-palace.cjs (nothing wrote its drawers, so its session-start wakeUp injection was always empty) are no longer installed. The UserPromptSubmit route hook no longer runs the [INTELLIGENCE] lookup, which rewrote .monomind/data/ranked-context.json (~870 KB) on every prompt and matched nothing; intelligence.cjs drops getContext() and bootstrapFromDb(). init upgrade leaves the old hooks and files of an existing install in place (they stay harmless no-ops); init --force removes auto-memory-hook.mjs and its settings hooks. intelligence-outcomes.jsonl is still written: session-end success detection, doctor's route-outcome correlation and hooks intelligence train read it.

Fixed

  • A role's git guard no longer leaks into repositories its own tests create (#481, follow-up to #298). Roles below policy.git: 'push' got core.hooksPath and core.excludesFile as process-wide GIT_CONFIG_* entries, so every git call in the process tree saw them, including a test's throwaway repo in $TMPDIR: git add .claude/settings.json there failed as ignored by the guard's excludes file (cleanup-after-init-e2e.test.ts). The guard now writes both settings to a gitconfig file in its state dir and exports only includeIf.gitdir:<common dir> and includeIf.gitdir:<common dir>/worktrees/ entries that include it, so they apply in the org's protected repositories and all their linked worktrees and nowhere else. Inside those repositories the guard is unchanged: pushes and, at read/none, ref updates are still refused. The transport and credential settings (protocol.file.allow=never, the reset credential.helper, failing askpass/ssh commands) stay process-wide, so a scratch repository still cannot push.

  • org events --follow, org logs --follow and org watch exit when nobody is reading (#433). An idle follower only ever stopped on SIGINT/SIGTERM, so one orphaned by its parent (or whose reader had closed the pipe) polled a finished run's bus.jsonl twice a second forever. The follow loop now stops when the process is re-parented (its parent pid changes), when stdout errors (EPIPE) or closes, and on SIGHUP. It also exits 0 once the followed run has closed: runtime.json records the run as stopped or crashed, or the run's org-stopped event was seen and runtime.json belongs to a newer run; any remaining events are drained first. A live run is followed as before. Each tick now reads only the bytes appended since the last one instead of the whole file.

  • The README no longer says installing runs no download scripts (#428). The Trust & Security table said "No post-install scripts that download code" and called tree-sitter a native addon. A fresh npm install monomind@2.18.5 adds 362 packages and 1.3 GB of node_modules, and three install scripts download binaries: puppeteer (657 MB of Chrome into ~/.cache/puppeteer), onnxruntime-node (CUDA libraries from NuGet on Linux x64) and better-sqlite3 (a prebuilt addon). The table now gives those numbers, and doc/privacy.md has a new "Install-time downloads" section listing each install script, what it fetches, and the PUPPETEER_SKIP_DOWNLOAD=1 ONNXRUNTIME_NODE_INSTALL=skip setting that brings the install down to 981 MB with no Chrome.

  • The mastermind "Paperclip" admin skills say what they actually do (#422). mastermind-approval-detail read .monomind/orgs/<org>-approvals.json, which does not exist (the queue is .monomind/orgs/<org>/approvals.json), so it stopped with "No approvals file" on every real org. It now lists, shows, approves and denies through monomind org approvals, org approve and org deny, which reach a running org's daemon; the comment, revision and resubmit actions nothing backed are gone. mastermind-secrets, -environments, -plugin-manager, -invites, -invite-landing, -join-queue and -access write side files no runtime code reads. Each now says "bookkeeping only — not enforced by the Org Runtime" in its description and at the top of its body, and the claims of effects that never happen (secrets "consumed by agents", environments controlling where agents run, a disabled plugin not loading) are removed. 43 skills said they were "invoked by mastermind:X" for slash commands that do not exist; those lines now name only the skill's own /mastermind-X entry.

  • cleanup --force keeps the helpers a git-tracked settings file still runs (#448). Cleanup never edits a git-tracked file, so when a team committed .claude/settings.json but not .claude/helpers/, the #401 fix could not strip the hooks and cleanup deleted the helpers they run: every prompt and tool call then failed. Cleanup now keeps the whole helpers directory those hooks and the statusLine run (listed as "kept: referenced by tracked .claude/settings.json"), and both the preview and --force print the dangling commands with the manual edit that completes the uninstall: delete them from the settings file, commit, re-run cleanup --force.

  • doctor's Routing Learning check no longer reports accuracy from too little or one-sided data (#425). It printed "routing accuracy 100%" from 13 outcomes that were all marked successful. It now reports the sample size and the PICK follow rate (how often the agent used matched the recommendation), shows "insufficient data" as info (not pass) below 30 outcomes, and prints no accuracy when every outcome carries the same flag (warn). The routing-feedback.jsonl fallback follows the same rules.

  • monomind init runs its doctor pass once, after all its writes, and prints only problems (#425). The embedded doctor ran before init's last writes and printed each check, then its post-fix re-check, so one run said "No .gitignore found" and then "All … gitignored" (and "1 stale" then "match"). init now runs it at the end, applies the same fixes silently, prints only the warnings and failures left after them, then a one-line Health check: N passed, W warning(s), F failed summary.

  • monoswarm, autopilot and agent spawn say they start nothing (#418). monoswarm init recorded "status": "running" with an empty roster and monoswarm status showed a hard-coded 5% progress for a swarm with no tasks. The state file now records "initialized", status reads recorded (no agents started) and shows progress only from recorded task files (n/a when there are none), and monoswarm start shows a "Suggested Agent Roster (not started)" instead of an "Agent Deployment Plan". agent spawn prints "recorded in the agent store" and that no process was started (pointing at monomind agent exec); the agent_spawn MCP tool returns status: "registered" with the same note. monoswarm and autopilot are marked deprecated in help, autopilot status and the docs; autopilot status says when no task source has tasks, since nothing writes swarm-tasks.json. Removing both commands is left for a later release.

  • Grep/search [MONOGRAPH_HINT]s no longer point at test mocks (#447). The pre-bash and pre-search hint lookups in hook-handler.cjs took the first matching graph row, which was often a test (grep bridgeStoreEntry hinted …/__tests__/hooks-core-commands.test.ts:17), and since #409 those hints reach the model. Symbol hints now skip test files, using the same test-path heuristic as the monograph node resolver (#441), so a symbol matched only in tests gets no hint; file-name hints rank non-test files first.

  • The Bash destructive-ops gate no longer blocks commands that only mention a dangerous string (#427). The PreToolUse gate matched the raw command text, so grep -rn "rm -rf" src/, git commit -m "document git push --force risks", echo 'DROP TABLE' > notes.txt and heredoc documentation were blocked. The patterns now run per command segment (split on &&, ||, ;, |, & and newlines outside quotes). Quoted literals that contain whitespace, and heredoc bodies, are masked only in segments whose command is on a short allowlist of commands that do not execute their arguments (grep/egrep/fgrep/rg/ag/ack, echo, printf, cat, tee, head, tail, wc, jq, yq, touch, mkdir, ls, git commit/tag/notes/log/show/grep/diff, gh issue/pr/api/release), and only when the rest of the pipeline is allowlisted too and, if anything writes a file, the whole command is. Options that run a program (printf -v, rg --pre, ack --pager, git grep -O) disqualify a segment. Every other segment is scanned with the quote characters removed and the text kept, so npm exec -c '…', nodemon --exec "…" or any unknown runner still blocks. Assignment values (X="rm -rf ~"; $X) and quoted words without spaces ("rm" -rf ~) are never masked, and the whole raw command is scanned when a quote is unterminated, when there is a command substitution or a $X command word, or when a word names a known string executor (bash -c, eval, xargs, ssh, interpreters, database clients such as psql, git's -c/--exec/rebase/config). The monofence-ai layer on Bash now only warns (on stderr, logged to the security audit as warn) unless the command also pipes downloaded content into a shell (curl … | sh, bash <(curl …), sh -c "$(curl …)"), which still blocks.

  • The statusline renders in about 50 ms instead of about 220 ms (#429). Every render spawned npm config get prefix (for the version), git (branch/status, remote, graph freshness, common dir), sqlite3 (monograph and memory counts) and curl (dashboard probe). Those results are now cached per project in .monomind/cache/statusline.json (git and the dashboard probe for 5 s, DB-derived counts for 30 s, version, remote and git dir for 10 min), and an expired segment is recomputed by the render that finds it expired, so a warm render only reads files. The rows and segments shown are unchanged. This covers both .claude/helpers/statusline.cjs and the script init generates, which also drops its whole-output cache in ~/.monomind/statusline-cache.json: that cache was keyed only by mode, so another project's statusline could show for up to 5 s. The generated script also imports spawnSync again, so its memory count shows instead of silently failing.

  • The graph gate no longer blocks the first grep of a session; it adds a one-time reminder instead (#413). The PreToolUse Bash and Grep/Glob hooks blocked the first grep, rg or find of every session until a monograph tool was called. That cost a round trip, and in most blocked sessions the agent just ran grep again. The block also caught greps that were not code searches, such as … | grep. The search now goes through, and the first source-code search of a session carries a reminder to try monograph_query/monograph_suggest as PreToolUse additionalContext. The reminder appears once per session, only when the graph is fresh and non-empty, and never for piped greps or searches over dependencies, build output, logs, docs/data files or paths outside the project. The init fallback hook-handler behaves the same way. Security gates still block as before. Also fixed: the node count the reminder quotes closed the hook's shared graph handle, which made every later [MONOGRAPH_HINT] lookup in that call fail.

  • The per-prompt Second Brain lookup is cheaper and injects only strong matches; its background reindex uses the installed CLI on the docs only (#416). At a 0.35 floor with up to 3 excerpts, 2 of 27 injected excerpts were relevant (~180 tokens per prompt), and a hung dashboard server held every qualifying prompt for the full 900 ms timeout. The route hook now skips the POST when the pid in .monomind/control.json is not alive, waits at most 250 ms, raises the semantic floor to 0.65 (the keyword fallback stays at 0.5) and injects one excerpt, plus a runner-up only when it scores within 0.03 of the top; nothing is injected when no hit clears the floor. relevanceFloor and injectionLimit in .monomind/second-brain.json still override. The session-start reindex ran npx -y monomind@latest doc ingest . (a different version than installed, over 2,402 files including package READMEs and duplicates); it now runs the project's node_modules/.bin/monomind, a monomind on PATH or the monorepo's CLI entry, and skips when none exists, and it ingests only docs/, doc/ and top-level *.md (dot-directories such as .agents, .gemini, .monomind and .mail are never walked; identical content shares one set of chunks). Only changes inside that scope trigger it. monomind doc ingest now takes several paths and ingests them in turn.

  • agent test --json reports crush and pi sign-in failures as auth (#473). Without credentials, crush says "No providers configured - please run 'crush' to set up a provider interactively." and pi says "No API key found for the selected model. Use /login to log into a provider via OAuth or API key." Both came back as status:"error" (runner-error). They are now auth, and crush, pi and pi-rpc have a login_hint (also shown by agent scan --json). Unknown-model and quota errors are classified as before.

  • The dashboard server no longer duplicates itself, hangs on SIGTERM or grows to ~2 GB (#477). A second server.mjs for a project whose dashboard is already running (on the requested port, or on the port .monomind/control.json records, confirmed through /api/identity) now prints that dashboard's URL and exits 0; another project's server on the port is still skipped as before, and monomind ui reports the running dashboard instead of waiting. SIGTERM, SIGINT and SIGHUP now close every SSE stream (the mastermind and per-org streams were left open) and every socket, then exit 0, with a forced exit after 5 s. Sockets were never force-closed because the port-fallback loop removed Node's own listening listener, so the HTTP server tracked no connections and server.close() waited on open keep-alive and SSE sockets indefinitely, leaving a process with no port that ignored SIGTERM. The memory growth came from fs.watch({ recursive: true }), which Linux Node emulates with one inotify watch and one retained fs.Stats per file: the .monomind watcher alone held ~109,000 watches on one machine. Watchers now watch directories (capped at 2,000) instead of files: 100,000 files under .monomind now cost 206 watches and 106 MB RSS at start, down from 100,208 watches and 312 MB. SSE clients that stop reading are dropped once 1 MB is queued, the per-run digest cache is capped at 64 runs, and nothing (watchers, the document sweep) starts before the port is bound.

  • Each org role session gets its own TMPDIR (#480). Every role of an org run shared the daemon's TMPDIR (the release org uses $HOME/mrg-tmp), so a bare mktemp -d landed in that shared root as tmp.XXXXXXXXXX, and one role's rm -rf tmp.* there deleted other running roles' scratch too: 13 directories matched where 3 were meant on the 2.19.0 release run. Each role session (each task session with session_scope: "task") now runs with TMPDIR, TMP and TEMP set to its own <base>/<org>-<role>-XXXXXX/ (mode 0700), where <base> is the TMPDIR it had before, so the sandbox and file-tool roots still cover it. The runtime removes a task session's directory when its task closes, the rest when the role's session ends and at org stop, each by exact path and only with this org's and role's prefix; at start it sweeps only this org's directories whose owning process is gone. A TMPDIR that a role-specific env overlay sets explicitly still wins. Every role's prompt now says its $TMPDIR is private and that cleanup globs must never run in a shared directory.

  • monomind search finds documents doc ingest just indexed, without search scan (#479). Which content types search looks at comes from the directory fingerprint, and that is refreshed only by search scan or once it is a day old. A fingerprint taken before any document existed (as init writes one) kept the documents type off, so doc search found a freshly ingested file and search did not. The documents type was also off in a tree where documents are under 10% of the files, even right after a scan. Now, when the project's doc store has live documents, search turns the documents type on for that run. This covers everything that writes the project store: doc ingest, the MCP knowledge_ingest tool, and the session-start auto-ingest. There is no rescan and the saved fingerprint is not rewritten, so an unchanged store costs one read of doc-metadata.jsonl. search still reads documents from the working tree, so a file ingested from outside it, or into the global brain or a profile store, is found by doc search only. search --help now says what search scan is still needed for: other content types added since the last scan.

  • config get prints object and array values instead of [object Object] (#478). monomind config get memory printed memory = [object Object] because the value went straight into a template string. An object or array value is now printed as indented JSON after key = ; scalars print as before, and --format json was already correct. The full-config table (config get with no key) printed arrays with String(), so an array of objects showed [object Object]; arrays there are now compact JSON (["a","b"], []).

npm: https://www.npmjs.com/package/monomind/v/2.20.0 · https://www.npmjs.com/package/@monoes/monomindcli/v/2.20.0

v2.19.0

View on GitHub

[2.19.0] — 2026-09-29

Changed

  • The MCP server advertises a 20-tool core by default (#410). tools/list sent 71 tools (34.7 KB, about 8.7k tokens on clients that load schemas eagerly), and 45 of them only read or write state files: agent_*, task_*, session_*, config_*, system_*, guidance_*, hooks_* and mcp_status. The default roster is now monograph (build, query, suggest, impact, context, neighbors), pick, org_skill_show, monomind_tool_search, knowledge_search/ingest/remove, monodesign_detect/fix/palette, and the five memory tools the generated CLAUDE.md and the KG nudge name (memory_pattern-store, memory_feedback, memory_kg_ingest, memory_kg_search, memory_kg_stats), 14.6 KB in all. Every other tool is still callable by name and found through monomind_tool_search; MONOMIND_MCP_FULL=1 still advertises all of them.

Added

  • Coder mode on every full-access runtime (#431, agent-exec protocol rev 19). agent exec now drives claude, codex, copilot, antigravity, opencode, kimicode, grok, qwen, pi — and the new Cline, Aider and DeepSeek Harness (dsh) runners — with matched start/status/tool/done events and full-access editing/commands, instead of only claude and codex having real coverage. --effort off|low|medium|high|xhigh|max (rev 16) is now honored per runtime where the vendor CLI supports it and reported as a status notice where it is ignored. agent exec retries a transient provider rate limit (HTTP 429), now its own rate-limited code distinct from quota (rev 20), up to 3 attempts with ~2s/~4s backoff and jitter or the provider's Retry-After hint, each wait capped at 30s and kept inside --timeout, emitting a status notice before each retry. Cline turns run scoped by default (file edits inside the project only; approval-gated tools refused) unless given full access. monomind init --target agents and --target cline/--target aider write only the files those runtimes read (AGENTS.md, or nothing extra) instead of every platform's files.
  • agent exec --access read (#388, agent-exec protocol rev 21, capability agent-exec-access-read). A turn that can read the project and the web but cannot edit files, run arbitrary commands or start subagents. Allowed: Read, Grep, Glob, LS, WebSearch, WebFetch, TodoWrite, Skill, ToolSearch, caller (stdio) tools, and shell commands that start with git status|diff|log|show|blame, ls, cat, head, tail, wc, rg, grep or find (plus any --allow-bash-prefix entries) with no pipes, redirects, chaining, substitution or subshells, and no find -exec/-delete/-fprint…, rg --pre or git --output/--ext-diff. Edit, Write, MultiEdit, NotebookEdit, other shell commands and Task/Agent are denied (tool_activity end denied: true). Works with --settings. claude enforces it itself; codex runs --sandbox read-only (never danger-full-access, whatever the git level) and pi/pi-rpc run --tools read,grep,find,ls. Every other runtime, opencode included, answers error {code:"unsupported"}. agent scan --json entries gain access_modes (e.g. ["scoped","read","full"]).
  • Caller tools with agent exec --access full, and parallel caller calls (#389, agent-exec protocol rev 22, capability agent-exec-full-access-tools). --access full --tools stdio --tools-file … is supported and tested on claude and every other runtime with full_access: true: caller tools sit next to the native tools and use the same tool_call/tool_result frames and --tool-timeout as scoped mode (no monomind maximum; bounded by --timeout, and on claude by Claude Code's MCP call timeout — a 130s call was verified). When one assistant message makes several caller calls, all their tool_call frames are sent before monomind waits for any result, and results match by id in any order (claude marks caller tools readOnlyHint so Claude Code runs them concurrently; fence runtimes start a round's calls together). agent scan --json entries gain caller_tools and caller_tools_with_full_access; a runtime that cannot take caller tools in the requested mode answers error {code:"unsupported"} instead of dropping them. --allow-bash-prefix is still rejected with --access full.
  • agent exec reports what the vendor CLI really runs with, and --sandbox picks its own sandbox (#396, agent-exec protocol rev 23, capability agent-exec-sandbox). The default is unchanged: without the new flag, a non-org turn still runs codex with danger-full-access, grok without a sandbox, and copilot, qwen, antigravity and others with approvals off. The start event now says so, with native_sandbox (read-only, workspace-write, full, none, or monomind for claude, where monomind enforces access itself) and approvals (off, on, n/a), and each agent scan --json entry gives the same defaults plus sandbox_modes. --sandbox read-only|workspace-write|full uses the CLI's own sandbox on codex, grok and dsh. full means today's default on every runtime. Other modes on other runtimes fail with unsupported. The flag can tighten an org role's git level but never loosen it. --access read always runs codex read-only, and --access read --sandbox full is a usage error. Callers that don't want an unsandboxed turn (e.g. mono-agent) should pass --sandbox.

Fixed

  • The per-prompt Second Brain lookup only sends the prompt to a loopback server (#402). The route hook POSTed every substantive prompt to the url in .monomind/control.json without checking where it pointed, so a tampered or committed control.json could send prompts to any host. The POST now happens only when that url is http(s) to 127.0.0.1, localhost or ::1 (no credentials in the url); otherwise the hook skips it and uses the local keyword fallback.
  • monobrowse no longer leaves Chromium profiles in /tmp (#395). Every browser monobrowse launched got a fresh --user-data-dir under os.tmpdir() (monomind-browser-*, monomind-browse-*) that nothing deleted, so they piled up until /tmp ran out of quota. A profile dir monobrowse created is now deleted once its Chrome has exited: on a graceful close, on the kill fallback, on browse close from a later process (the session record carries a new ownsUserDataDir flag), and when a launch fails. Every launch also sweeps dirs left by a crashed or killed process: only exact monobrowse names directly in tmpdir, real directories (never symlinks), older than 10 minutes, whose owning pid is dead and that no live Chrome still uses (/proc command lines on Linux, the profile's SingletonLock everywhere). A caller-supplied userDataDir is never deleted.
  • The provider API key file and memory databases are gitignored (#398). monomind.config.json (where providers configure -k stores the key in plain text), .swarm/ and .claude/memory.db were not ignored after init, and doctor's gitignore check still passed. Doctor now requires all three, and doctor --fix (which init runs) adds any that are missing to the root .gitignore. providers configure prints where it wrote the key and warns when that file is not gitignored.
  • mastermind-budgets now sets caps the org runtime enforces (#400). Its set wrote .monomind/orgs/<org>-budgets.json, which nothing in the runtime reads, so a budget set through the skill capped nothing. It now edits roles[].budget_usd, roles[].budget_tokens and run_config.budget_tokens in the org definition, validates it and runs monomind org reload (the caps hot-reload with spend kept). show and alert read spend from monomind org costs --format json and the run's budget events. There is no org-wide USD cap, and the skill now says so and refuses to fake one. reset is replaced by clear, which removes a role's own caps.
  • mastermind-routines maps onto the org schedule (#400). It wrote per-agent cron routines to <org>-routines.json, which the runtime never runs. It now sets or clears the org's schedule interval (applied by monomind org serve at start), pauses and resumes with org pause/org resume, and triggers a run with org run. list flags any entries left in the old file as not enforced.
  • The dashboard's Budgets data shows the enforced limits. GET /api/org/:name/budgets takes org_budget and agent_budgets from the org definition (run_config.budget_tokens, each role's budget_usd/budget_tokens or its policy.maxUsd/maxTokens) instead of <org>-budgets.json.
  • cleanup --force no longer leaves hooks pointing at deleted helpers (#401). After a default init, cleanup --force --purge-data removed .claude/helpers/ but kept all 17 monomind hooks in .claude/settings.json, so every prompt and tool call then failed with Cannot find module …/hook-handler.cjs. Cleanup now rewrites .claude/settings.json and .gemini/settings.json in place, dropping only the hook entries and statusLine whose command runs a helper the same plan removes (plus matcher groups and events left empty); other keys and user hooks stay, and a git-tracked settings file is still never rewritten. It also removes the monomind server from .kimi-code/mcp.json, the [mcp_servers.monomind] table from .codex/config.toml and init's npx monomind bash rules from opencode.json. init now records hashes for the converted .opencode/agent, .opencode/command and .kimi-code/agents files, .kimi-code/plugin/kimi.plugin.json and .gemini/helpers/statusline.sh, so cleanup can prove they are untouched installs and remove them; ones you edited are kept. The dry run lists every edit.
  • The SessionStart session-restore hook no longer parses every transcript (#403). After quickSummary() went cache-first for #42, session-restore still called quickSummaryData(), which re-parsed every transcript under ~/.claude/projects synchronously (tens of seconds, up to 140 s on active machines). That blocked the event loop, so the handler's own safety timer never fired and Claude Code killed the hook at 15 s. quickSummaryData() now reads the same cached totals as quickSummary() and starts the detached refresh when the cache is stale or missing, at most once per process. A cold cache writes no token-summary.json on that session start.
  • monograph_suggest task= returns the nodes relevant to the task (#406). Suggest answered only from AMBIGUOUS/INFERRED edges (about 3% of a real graph), so most task descriptions got "No suggestions for this task. Run monograph_build first." even on a fully built index. With task= it now lists the top limit (default 10) nodes ranked by the same search monograph_query uses, each with file:line, followed by the graph-topology questions about them when any exist. It says "Run monograph_build first" only when the graph has no nodes; a built graph with no match for the task says that no nodes match.
  • monograph no longer indexes monomind's own asset mirrors, gitignored files or anonymous closures as searchable symbols (#404). In a fresh 5-file project, 30,405 of ~30,430 nodes came from the .agents, .gemini, .kimi-code and .opencode trees monomind init writes. The scan now skips .agents, .gemini, .kimi-code, .opencode, .codex, its own .monograph cache and .mail by default, and inside a git work tree it only scans files git ls-files --cached --others --exclude-standard lists, so .gitignore is honoured (tracked files stay in even if they match; a .monographignore ! negation can still bring a file back; outside git the walk is unchanged). Anonymous closures (() => {, function () {) stay in the graph so calls inside them are still attributed to them, but monograph_query/search and god-node rankings no longer return them. @monoes/monograph 1.6.14.
  • monograph_impact and monograph_context no longer pick one of several same-named symbols (#405). Without a filePath both tools took whichever node named name came first, so asking about bridgeStoreEntry could land on a test mock and report "0 callers, Risk LOW" for a function with 29 call sites. When a name matches more than one definition they now return the candidates (non-test definitions first, with nodeId, file and line) and ask you to re-run with nodeId or filePath, like monograph_neighbors already did. Both tools take the new nodeId input, and filePath also accepts a trailing path fragment. The [MONOGRAPH_HINT] grep hint still picks the first match and is left for a follow-up.
  • monomind memory search finds matches with default options again (#407). The --threshold option defaulted to 0.7 while the memory bridge and the command's own fallback used 0.3, and correct matches from the bundled embedding model score about 0.55–0.61, so default searches returned nothing. The option default, the bridge and the sql.js fallback now share one DEFAULT_SEARCH_THRESHOLD (0.3).
  • monomind browse … exits as soon as its output is written (#408). Every browse subcommand left its CDP websocket open, so the process only ended at the CLI's 5 s force-exit watchdog: browse get title took ~5.5 s against 0.3 s through the bare monobrowse bin. The command now drops its CDP connection once the subcommand finishes (also when it fails), without touching the browser, so the next command still reuses the session; get title now takes ~0.3 s and open ~1.6 s instead of ~5.8 s. @monoes/monobrowse 1.0.28 exports disconnectSession() for this.
  • [MONOGRAPH_HINT]s now reach the model, and the status line stops showing an unmeasured "$ saved" (#409). The PreToolUse pre-search and pre-bash hooks printed their hints (and the graph-gate reminder) as plain stdout, which Claude Code only shows in the transcript, never to the model. They are now one JSON document, {"hookSpecificOutput":{"hookEventName":"PreToolUse","additionalContext":…}}; stdout stays empty when there is nothing to say and on any block, whose reason is still on stderr with exit code 2. Each hint was also credited as 1,700 saved tokens, which fed the status line's 💰 dollar figure and graph-status's "saved $". Hints no longer earn savings credit, and both displays show the hint count instead of dollars.
  • The fallback hook-handler's PreToolUse blocks now reach Claude Code (#446). The fallback hook-handler.cjs that init writes when the full helpers can't be copied ended with an unconditional process.exit(0), overriding the exit code 2 its graph gate sets to block a command. It now exits with process.exitCode, so a block's exit 2 survives.
  • Generated MCP configs start the version that ran init instead of monomind@latest (#419). .mcp.json, Codex config.toml, OpenCode opencode.json, Kimi mcp.json and the Antigravity/Gemini entries launched npx -y monomind@latest mcp start, which re-resolves the dist-tag on every start (3–4 s to tools/list), could hang past the client's startup timeout on a cold npx cache and leave _npx broken, and could switch versions mid-session. They now run npx -y --package=@monoes/monomindcli@<version> monomind mcp start, and the printed claude mcp add hints match. --pin latest or --no-pin keeps monomind@latest; --pin <version> still picks another version. monomind init --force re-pins after an upgrade; monomind update does not rewrite these configs. The Codex, OpenCode and Kimi entries also drop the unread MONOMIND_MODE, MONOMIND_HOOKS_ENABLED, MONOMIND_TOPOLOGY, MONOMIND_MAX_AGENTS and MONOMIND_MEMORY_BACKEND env vars (already gone from .mcp.json).
  • The per-prompt route hook is cheaper (#415). Opening the graph ran npm root -g (a 60–250 ms spawn) on every prompt in a project without its own @monoes/monograph; the answer is now cached for 24 h in ~/.monomind/cache/npm-root-g.json (or under MONOMIND_HOME), keyed by the node binary, npm_config_prefix and PATH, and asked again when the cached root is gone. A trivial reply ("ok", "yes", "continue", "thanks", fewer than three content words) now returns before any routing work — no pick, no graph, no Second Brain lookup, no banners — instead of only skipping the pick. The [PICK] line names an Org skill by its MCP call only: the (or: npx -y monomind org skills show …) suffix, ~40% of the line, is gone, since the picking section init writes into CLAUDE.md already gives that CLI fallback.
  • The CLAUDE.md init writes is 4 KB instead of 10.7 KB (#412). It is sent with every request and every subagent, and about 40% of it did not change what the model does in the project. The default (standard), minimal and solo templates drop the CLI command table, Monoswarm Rules, the topology/max-agents Project Config, the curated agent list, Memory Commands, Quick Setup, "Claude Code vs CLI Tools", Support, and the DDD / TDD-London / event-sourcing / "5-10+ todos" mandates; the opt-in full, security and performance templates keep their reference sections. Build & Test lists only the build, test and lint scripts package.json defines (with the detected package manager; the npm init placeholder test script does not count) and is left out when there are none. The Second Brain section appears only when the documents capability is active, and the agent picking rules only when the [PICK] prompt hook is installed. When a parent directory's CLAUDE.md already carries the monomind block, init in a subdirectory no longer writes a second copy and prints a warning naming that file. init --force over a pre-delimiter CLAUDE.md also replaces the retired sections instead of leaving them behind.
  • monomind init no longer installs docs as slash commands or --minimal as the full catalog (#411). Claude Code registers every .md under .claude/commands/ as a command, and its skill/command listing has a fixed budget past which descriptions are dropped. init now leaves out command-directory READMEs, _-prefixed includes and references/ pages (20 descriptionless entries); the task-file spec the mastermind commands read moved to .claude/skills/mastermind/references/taskfile.md, and the duplicate commands/mastermind/references/ copies are gone. --minimal installs 23 skills instead of 83: the mastermind engineering workflows (design, plan, execute, review, receive-review, debug, research, worktree) and the pieces they read, monolean, monodesign, stop-slop, verification-quality and the memory, GitHub and browser toolkits, plus the mastermind idea, org and memory skills the platform install always writes; the org-admin mastermind skills, monoswarm, hooks-automation and the rest are a new extended skill set, still part of the default install. The init wizard's Custom skill-set answer is now honoured (it left skills.all on, so every skill was installed) and no longer writes into the shared presets; it also offers the extended, browser and advanced sets. Agents marked deprecated: true are no longer installed, and the training/verify command groups, which never existed, are gone from the command map.
  • Agents, skills, commands and the guidance catalog only name MCP tools and CLI commands that exist (#421). Shipped markdown referenced 43 unregistered mcp__monomind__* tools 208 times per tree (swarm_init, memory_usage, coordination_orchestrate, hooks_pre_task, ...), the guidance catalog behind guidance_capabilities/guidance_recommend listed 30 tools and 15 commands that do not exist, and optimization agents told the model to run invented monomind topology-analyze-style commands. References now point at the real tool (monoswarm_init, monoswarm_memory, task_create, hooks_pre-task, monofence_scan, performance_bottleneck, ...) or are removed where nothing equivalent exists, and the catalog is rebuilt from the live registry. scripts/lint-tool-refs.mjs (pnpm run lint:tool-refs, run in CI) fails on any mcp__monomind__<tool> missing from the full MCP registry, any catalog tool or command that does not resolve, and any unresolved monomind <cmd> in an agent definition. The invented monomind github … / monomind actions … / monomind swarm … commands in six GitHub agents (140 references per tree) are still allowlisted in KNOWN_BAD_CLI_REFS; the allowlist can only shrink.
  • Session start no longer rebuilds the graph in non-git directories, and builds stop writing into the repo root (#414). Without a git HEAD the SessionStart freshen hook could never see the index as fresh, so every session started a full rebuild (a non-git workspace parent grew to 3.4 GB). The hook now skips directories outside a git work tree and prints a one-line hint to run monomind monograph build yourself, and it starts at most one automatic build per project every 10 minutes (tracked in .monomind/graph/last-auto-build). GRAPH_REPORT.md is now written to .monomind/GRAPH_REPORT.md instead of the repo root; monomind monograph build --report-path GRAPH_REPORT.md, MONOGRAPH_REPORT_PATH or buildAsync(..., { reportPath }) restore the old location. The churn cache moved from .monograph/cache/ to .monomind/cache/.
  • init no longer runs npm install @monoes/monograph in your project (#420). The code-graph step resolved @monoes/monograph/dist/src/index.js, which the package's exports map does not expose (ERR_PACKAGE_PATH_NOT_EXPORTED), so it always fell back to installing monograph into the user's project: a new dependencies entry in package.json and about 61 MB of node_modules. It now resolves the package's public entry from the CLI's own dependencies. The install fallback is gone; if monograph cannot be loaded, init prints one line saying to run npx monomind monograph build later.
  • init's summary counts the files it actually wrote (#420). It counted report items (a whole skill folder, an agent category) as files and labelled every skip and diagnostic "already exist", so an empty repo that received 2,060 files was told "267 created, 101 already exist". The counts now come from the disk, before and after the run, across the root files and every dot-directory init writes to (all platform trees): directories and files created, existing files updated, and existing files left unchanged.
  • monodesign detection no longer floods its output (#424). One failing token repeated on hundreds of elements printed one finding per element: doc/index.html gave 249 findings for 17 distinct issues, monodesign_detect returned about 41 KB, and design fix --dry-run printed nearly whole files. The text report now prints one line per (rule, snippet) with its count and up to three example locations (--no-group lists every occurrence; --json is unchanged). monodesign_detect returns the same groups, 20 at a time and most severe first, with rule descriptions listed once and a more hint that names the next offset; verbose: true returns the raw list. Contrast the static analyser cannot measure (translucent text or backgrounds, overlays, gradients, SVG text, or a page with no resolvable surface) is now reported as unverified and left out of the default count, with a line saying how many were held back (--include-unverified / include_unverified: true shows them). On doc/design-system.html that removes 99 of 102 contrast findings. fix --dry-run prints one hunk per edit with 3 lines of context instead of a single hunk from the first change to the last.
  • Opening the memory database no longer re-runs its dedupe repairs every time (#426). initializeSchema ran the namespace+key dedupe and the FTS5 duplicate-row cleanup on every open. Both scan every row, which made each knowledge_search or memory call wait seconds on a large store. They now run only while the database's PRAGMA user_version is below the schema version, which is now 4, so each existing store is repaired once more and then skips them. The namespace+key repair also runs whenever the unique index is missing, and an older release that opens the file writes its lower version back, so the next open repairs it again. On a synthetic 20k-entry, 507 MB store, a cold open fell from 3.0–4.5 s to about 10 ms.
  • Semantic search stays on brute force up to 100,000 entries (#426). The default MONOMIND_HNSW_THRESHOLD was 5,000. On the same 20k-entry store, the first search spent 78 s building the HNSW graph and wrote a 389 MB JSON cache, and later searches took 1.2 s to load that cache with about 1 GB peak RSS. Brute-force cosine answered in about 0.25 s at about 330 MB. The default is now 100,000, and setting the env var still overrides it.

Security

  • hooks_pre-command no longer rates destructive compound commands as safe (#399). The MCP tool capped any command starting with echo/ls/cat at low risk and git at 0.2, so echo hi && rm -rf ~/ and git push --force origin main returned shouldProceed: true while the PreToolUse Bash gate blocked them. It now splits the command on &&, ||, ;, |, & and newlines (quotes respected), checks every segment with no prefix caps, and applies the Bash gate's destructive patterns (mirrored, parity pinned by a test). Force-push to main/master, recursive rm of ~, $HOME or /, piping into a shell (curl … | sh, cat x | sh), dd of=/dev/…, mkfs and fork bombs are critical and shouldProceed: false; ls -la, git status and echo hi stay low.

npm: @monoes/memory@1.0.23, @monoes/monodesign@1.2.23, @monoes/monograph@1.6.15, @monoes/monobrowse@1.0.28, @monoes/monomindcli@2.19.0, monomind@2.19.0

v2.18.5

View on GitHub

[2.18.5] — 2026-09-29

Added

  • agent exec --effort <level> (agent-exec protocol rev 16, capability agent-exec-effort). Sets the turn's reasoning effort: off, low, medium, high, xhigh or max. claude gets it as the Agent SDK's effort option (off disables thinking); codex gets -c model_reasoning_effort=<level> (off becomes none). Other runtimes ignore it, and an unknown level is rejected before the turn starts.
  • agent exec reports Claude's native subagents (#387, capability agent-exec-subagent-events, agent-exec protocol rev 17). When a claude turn delegates through the Task/Agent tool, the stream now carries subagent events (started, progress, finished) with the subagent's type, description, prompt, summary, last tool, status and usage. Their tool_use_id equals the Task call's tool_activity id, so callers can join the two. New golden fixture doc/agent-exec-protocol/fixtures/subagent.ndjson.
  • monomind agent test <runtime> --json (#390, agent-exec protocol rev 18, capability agent-test-json). One "Reply with the single word: ok" turn (max turns 1, no tools, scoped access, a temporary cwd) reported as one object: status (ok, ok_unexpected, auth, quota, model_unavailable, timeout, missing_binary, error), reply, first-text and total latency, tokens, cost_usd with cost_estimated: true when the cost comes from the pricing table, runtime_version, and error with the login hint for auth. --model tests one model. model_unavailable recognises each runtime's "unknown model / not available on your plan" wording, which agent exec reports as runner-error. Without --json, agent test still streams the NDJSON events as before.

Fixed

  • A subagent's text no longer leaks into the main agent's output (#387). On agent exec --runtime claude, a subagent's prose was emitted as ordinary assistant text and joined into result.text. It is now an assistant event with parent_tool_use_id set to the subagent's Task call, and result.text holds only the main agent's text.

npm: monomind@2.18.5, @monoes/monomindcli@2.18.5

v2.18.3

View on GitHub

[2.18.3] — 2026-09-29

Fixed

  • Web captures whose URL has a query string ingest again, in a profile or not. Every chunk of a capture carries a url:<canonical url> tag, and @monoes/memory refused tags containing ?, =, & or %, so any such page (every YouTube video) failed with all chunk stores failed and indexed nothing. url: and parent: tags now follow the same rule as src: (anything but control characters), a URL too long for a tag is left off the chunk rather than failing it, and a refused store now says why in the ingest error. Also: the extra documents a mono-agent capture carries beside readable.md (transcript.md, summary.md) no longer supersede each other under their shared URL, so all of them stay searchable and a repeat ingest is a no-op; and doc cite / doc related with --scope profile:<id> read that profile's store instead of the project's.

npm: monomind@2.18.3, @monoes/monomindcli@2.18.3

v2.18.4

View on GitHub

Added

  • knowledge-profile-captures capability (agent-exec protocol rev 15). monomind --version --json now advertises the per-profile web capture behaviour that shipped in 2.18.3: profile envelopes ingest into profile:<id> (query-string URLs included), transcript.md / summary.md are indexed beside readable.md instead of superseding it, and doc search|cite|related|lookup|list --scope profile:<id> read that store. 2.18.3 itself has the behaviour but not the flag, so callers accept version ≥ 2.18.3 or the capability.

Security

  • undici bumped from 8.10.0 to 8.11.2 (chore(deps): bump undici in the npm_and_yarn group across 1 directory, a6e177f00).
  • ip-address (transitive) bumped to 10.7.2, closing Dependabot alerts #245 and #246 (chore(deps): bump transitive ip-address to 10.7.2, 6ca3f2d42).

npm: monomind@2.18.4, @monoes/monomindcli@2.18.4

v2.18.2

View on GitHub

[2.18.2] — 2026-09-28

Fixed

  • monomind init --target claude adds only Claude Code's files (#372). It still created .gemini/ (skills and rules) and .agents/ (skills and shared_instructions.md), which only Antigravity/Gemini and the other agents read — noise in a user's own repo, where mono-agent's coder mode runs it. They are now created only when a platform that reads them is selected; the default all-targets init is unchanged, and a Claude-only init keeps its project memory seeds. The CLI reference's init row is corrected to match.

npm: monomind@2.18.2, @monoes/monomindcli@2.18.2

v2.18.1

View on GitHub

[2.18.1] — 2026-09-28

Fixed

  • monograph watch no longer waits on a dead build that only looked alive (#370). The build lock held just a pid, and a pid only means something inside its own pid namespace: sandboxed tools give every command a fresh namespace with small, reused pids, so a killed sandboxed build left "pid 47" and the next sandbox found an unrelated pid 47 alive — every rebuild was deferred for up to 30 minutes. The lock now records its pid namespace and boot id: a lock from another boot is taken over at once, and one from another namespace once its 30-second heartbeat has been silent for 2 minutes.
  • monograph no longer prints git's own errors in a repo with no commits (#371). git rev-parse HEAD (and the git log/git status/git diff probes) inherited the terminal's stderr, so fatal: ambiguous argument 'HEAD' showed up during monograph watch even though the failure was already handled as "freshness unknown".

Internal

  • @monoes/monograph bumped to 1.6.13.

npm: monomind@2.18.1, @monoes/monomindcli@2.18.1, @monoes/monograph@1.6.13

v2.18.0

View on GitHub

[2.18.0] — 2026-09-28

Added

  • monomind agent models --runtime <id> --json (#369) — a runtime's own model list, so callers stop keeping hand-written lists that go stale. claude comes from the Agent SDK's supportedModels() (Claude Code's /model picker for the signed-in account; no prompt is sent), codex from codex debug models, antigravity from agy models, opencode from opencode models; other runtimes report supported: false. Each entry has id, label, and where known resolved_id, description, default and effort_levels. New capability agent-models (protocol §12, rev 14).

Fixed

  • The statusline shows the installed version for a global @monoes/monomindcli (#368). A helper copied into a project only looked for a global monomind package and fell back to a made-up v1.0.6. It now also finds @monoes/monomindcli (on its own or nested under monomind), then asks monomind --version, and shows no version rather than a wrong one.
  • A session in a set-up folder no longer starts another dashboard server every turn (#366). When another project's dashboard held the default port, the server control-start spawned for the project came up as a secondary and wrote dashboard-token-<port>, so the next session could not authenticate to it, judged it stale, and spawned another — one more monomind ui per turn. A server control-start spawns now always takes the project's primary pairing file, control-start also accepts a port's own token, and it finds a globally installed monomind instead of falling back to a slow npx monomind@latest.
  • agent exec --access full no longer reports or kills monomind's own session-hook daemons (#366). The dashboard, helper self-heal, token tracker and monograph refresh spawns set MONOMIND_EXEC_TREE empty; a process carrying any other value than the turn's own has left its tree and is left out of done.background_pids and the cancel/timeout/budget kill.
  • No CLAUDE_SDK_CAN_USE_TOOL_SHADOWED warning on full-access turns (#366). Under bypassPermissions the SDK never calls canUseTool, so full access no longer passes one; the PreToolUse hook and the message stream still observe every call. A SIGTERM to monomind closes open tool_activity ids with cancelled:true before done, same as cancel (now covered by a test).
  • org status --format json reports roles_access for an org that has never run (#367), so a stopped org's full-access grants (active, never acknowledged, suspended, unattended-blocked) can be reviewed before it starts.

npm: monomind@2.18.0, @monoes/monomindcli@2.18.0

v2.17.0

View on GitHub

[2.17.0] — 2026-09-28

Added

  • monomind agent exec --access full (#355), part of the Coder mode epic (#364). The claude runtime can now run a turn with unrestricted native tool access (canUseTool allows everything, permissionMode: "bypassPermissions") instead of the default scoped allow-list — guarded against root, unsupported runtimes, and a missing/invalid --cwd. New capability agent-exec-full-access and agent scan --json's full_access field.
  • monomind agent exec --settings none|<csv of user,project,local> (#356). A non-none value (claude runtime only) loads the normal Claude Code setup for the turn — CLAUDE.md, skills, hooks, and project/user MCP servers — and appends the caller's system prompt to Claude Code's own preset instead of replacing it; --settings none (default) stays byte-identical to before. New status NDJSON event reports SDK startup progress, and a --startup-timeout watchdog (default 30s) reports a clear error instead of hanging if the SDK never reports ready. Capability agent-exec-settings.
  • monomind agent exec emits tool_activity start/end events for the agent's own native tool calls (#357), capability agent-exec-tool-activity. Previously only --tools stdio bridged calls were visible on stdout; native calls (Bash, Edit, Write, Read, …) now get matched, size-capped events correlated by the SDK's own tool_use id, in every access mode. Edit/MultiEdit carry old_string/new_string, Write carries file_path/content; a denied call (scoped mode) closes with ok:false, denied:true; a --timeout or cancel closes any still-open call with ok:false, cancelled:true before done. parent_tool_use_id nests subagent calls. Non-Claude runtimes map their own best-effort liveness signal to a start-only event; agent scan --json reports each runtime's fidelity as tool_activity_fidelity.
  • monomind init --project <dir> --if-missing --json (#358) — headless, idempotent workspace init for coder sessions. --project <dir> targets a directory other than the cwd; --if-missing creates only files that don't exist yet and never touches an existing CLAUDE.md/AGENTS.md/.claude/settings.json/.mcp.json (idempotent — a second run creates nothing); --json prints {root, created, skipped, claude_project_registered, duration_ms} on stdout with human output suppressed; --no-graph skips the Monograph build for a faster init; --register-claude-project best-effort registers ~/.claude/projects/<slug>/ without a model call. New capability init-json — see doc/agent-exec-protocol.md §11.
  • Coder mode threat model + guardrails (#360). agent exec --access full now appends a one-line JSON audit record per turn (ts, cwd, runtime, session_id?, exit_code, tool_calls) to ~/.monomind/logs/agent-exec-full-access.log (MONOMIND_FULL_ACCESS_LOG overrides), regardless of how the turn ended — never for scoped access, and best-effort (a write failure never fails the turn). No MCP tool, org-runtime session, workflow/routine node, UI route, or hook can set or raise access: "full" — audited and pinned by regression tests. New threat-model doc: doc/concepts/coder-mode-security.md.
  • Coder mode for a specific org role — policy.access: "full" (#365, part of the Coder mode epic #364), capability org-role-full-access. A role can now run with the same unrestricted native tool access as agent exec --access full — no allow-list, no OS sandbox, no authority mask, no per-tool approval gate; budgets are still enforced. It is human-only, opt-in per role: monomind org role set-access <org> <role> full|scoped refuses outright when it detects an agent-context env var (CLAUDECODE, CLAUDE_CODE_ENTRYPOINT, MONOMIND_ORG_ROLE, MONOMIND_SDK_AGENT, or the new MONOMIND_AGENT_EXEC set on agent exec's runner child env) — not overridable by --yes-i-understand or a TTY — so a scoped chat/org can't reach a grant through an allowed monomind org … Bash prefix; outside that, full needs an interactive confirmation or --yes-i-understand. It is the only place that writes access_ack, which now carries both a hash over the role's security-relevant config (prompt, runtime, model, tool providers, reports_to, coder-mode settings, plus the org's unattended/taint knobs) and a sig — an HMAC-SHA256 of that hash under a machine-local key created on first grant and stored in the operator-credential directory, which every scoped/sandboxed role is denied Read/Edit on, so a config-writing path that can merely recompute the public hash still can't forge a grant the runtime will honor. The runtime verifies sig (timing-safe) before ever trusting hash, and recomputes both every session start: no signature, an invalid one, or a covered field changing since the grant drops the role to scoped (access_state: "suspended"); a scheduled/daemon run without run_config.allow_unattended_full_access also runs it scoped ("unattended-blocked"). org validate now errors on an unsupported runtime, a policy.git explicitly authored below push alongside access: "full", and taint — a full-access role that itself ingests untrusted input, or is reachable from one via reports_to, unless the path is named in run_config.accept_full_access_taint. Taint errors are also checked at every session start, so a role that becomes reachable from untrusted input after its grant runs scoped. org status --json gains roles_access for any role that declares it.
  • monomind agent exec --access full now kills the whole agent process tree on Stop/timeout/budget, and reports background survivors (#359, part of the Coder mode epic #364). The claude CLI is now spawned as the leader of its own process group; a cancel frame, --timeout, or --budget-usd breach SIGTERMs (then SIGKILLs after a 5s grace) the WHOLE tree, not just the CLI process. A single point-in-time check turned out to be insufficient against the real, installed Claude Code CLI (live-verified during development): it spawns each Bash-tool shell call as the leader of its OWN process group, and that shell — or a background job's whole launching chain — often exits within milliseconds of starting the job. orgrt/process-tree.ts's trackDescendants now finds the turn's processes by a per-turn MONOMIND_EXEC_TREE env marker every descendant inherits (so a nohup … & job reparented after its shell exited is still found, regardless of timing), plus continuous 50ms sampling that remembers every process-group id it saw, for jobs that clear their own environment. On a normal end_turn, background jobs are left running (the "start a dev server, use it next turn" flow still works) but now reported: done gains background_pids: number[]. Residual, documented v1 limitation: a job that clears its environment AND whose launching chain exited between samples can still go undiscovered. Implemented at the ClaudeAgentRunner layer, so a future full-access org role (#365) gets the same protection automatically. Scoped mode is unaffected. Windows falls back to taskkill /T for the kill and does not yet support background_pids discovery (omitted, not fabricated as empty). New capability agent-exec-background-pids.

Fixed

  • agent exec --tools stdio honors a cancel frame even when no tools are declared. stdin was only read when a tools file or tool names were given, so a caller's cancel was silently ignored and the turn ran on.
  • A second dashboard server no longer takes over the first one's pairing token when the first is too busy to answer. A secondary decided whether the primary recorded in .monomind/control.json was alive only by probing its /api/status (3 tries, 1.5 s each); a primary whose event loop was blocked longer than that looked dead, so the secondary overwrote dashboard-token — logging out the primary's clients — and never wrote its own dashboard-token-<port>. A live recorded pid now also keeps it a secondary.

npm: monomind@2.17.0, @monoes/monomindcli@2.17.0

v2.16.19

View on GitHub

[2.16.19] — 2026-09-27

Fixed

  • The monodesign_detect MCP tool now reports what monodesign detect does for HTML (#353). It ran the regex text engine on every file and on inline content, so HTML lost every cascade-dependent finding (low contrast, computed sizes) and could return 0 findings where the CLI reported some. HTML files and inline HTML now go through the static-HTML engine like the CLI; inline findings keep the caller's virtual path.
  • check-package-bumps.mjs no longer demands a version bump for a package whose only change is its top-level README.md (#354). The markdown exclude matched only files at least one directory deep.

npm: https://www.npmjs.com/package/monomind/v/2.16.19

v2.16.18

View on GitHub

[2.16.18] — 2026-09-27

Fixed

  • scripts/sync-claude-trees.mjs now creates files missing inside a skill directory when the .agents/.gemini mirrors already hold that skill (previously silently left dangling imports to files that were never copied over).

Internal

  • File-size sweep wave 2: split ~95 oversized source files across the CLI, mcp-tools, orgrt, memory, init packages and the @monoes/monodesign, @monoes/memory, @monoes/monobrowse, @monoes/monograph, monofence-ai siblings into smaller modules. Pure code reorganization — original paths re-export everything, no behavior change.

npm: monomind@2.16.18, @monoes/monomindcli@2.16.18, @monoes/monodesign@1.2.22, @monoes/memory@1.0.21, @monoes/monobrowse@1.0.27, @monoes/monograph@1.6.12, monofence-ai@1.0.7 — all published and confirmed live on the registry.

v2.16.17

View on GitHub

Fixed

  • The sandbox-stub crash ledger no longer keeps a killed sandboxed runtime's entries forever. An org runtime started inside a role's sandbox (a QA drill) runs in its own pid namespace; when it is killed before its cleanup, other runtimes left its entries alone because a pid in another namespace cannot be checked, so they accumulated (18 after the 2.16.16 release run). A runtime in the initial pid namespace — which sees every process — now reclaims such entries once no process of that namespace is left; a runtime inside a sandbox still leaves them alone.

npm: monomind@2.16.17, @monoes/monomindcli@2.16.17 published to npm (latest tag).

v2.16.16

View on GitHub

Fixed

  • Sandboxed org roles no longer fail a Bash call on ~/.claude/.claude.json. The SDK binds .claude.json and its three OAuth-profile siblings next to whichever global config the Claude CLI picked — with a legacy ~/.claude/.config.json that is ~/.claude/ — and created and deleted empty mount-point stubs there per command, so one role's cleanup could remove the file while another role's bwrap was binding it (bwrap: Can't find source path ~/.claude/.claude.json, 2.16.15 release run). Without CLAUDE_CONFIG_DIR the CLI never reads those four files in ~/.claude/ (its config is ~/.claude/.config.json or $HOME/.claude.json), so the runtime now holds them for the whole run like its other stubs; with CLAUDE_CONFIG_DIR set they can be the live config and stay with the SDK.

npm: monomind@2.16.16, @monoes/monomindcli@2.16.16, @monoes/mcp@1.0.7, @monoes/hooks@1.0.11, @monoes/monodesign@1.2.20

v2.16.15

View on GitHub

[2.16.15] — 2026-09-27

Added

  • Org runs record the idle watchdog's state when they stop. The org stopped event in bus.jsonl now carries data.idleWatchdog: idle_minutes, when the next idle nudge was due (next_nudge_at), when the run would have been idle-stopped, and any hold in force. idle-watchdog.json (read by org status --json) also gains next_nudge_at. Before this, a run that was cut short, for example a drill bounded by timeout, deleted the watchdog file on stop, and its bus did not show whether a nudge had been missed or simply was not due yet. The default nudge comes after 10 idle minutes. The 5-minute interval is block_recheck_minutes, which applies only to tasks blocked with org_task_block. (#352)

Fixed

  • Two browse open launches racing for the same CDP port no longer end up sharing one Chrome. Both launches could see the port as free and start Chrome on it. If the losing launch's Chrome was still starting when the winner's began answering, the loser took the winner's browser as its own and returned the same port. It then recorded its own Chrome's pid, which was about to exit, under that port. Both callers then drove one browser, and the winner's Chrome was left running with nothing able to close it. On a fixed port, a launch now accepts an endpoint only when it reports the browser id that its own Chrome printed on stderr (DevTools listening on ws://…/devtools/browser/<id>). If another Chrome holds the port, the launch waits for its own Chrome to lose the bind and moves on to the next port. Each launch now gets its own profile directory, even when two launches run in the same process. A launch that gives up now kills the Chrome it started, on a fixed port as well as on port 0. Bumped @monoes/monobrowse to 1.0.26.

npm: monomind@2.16.15, @monoes/monomindcli@2.16.15, @monoes/monobrowse@1.0.26 published to the npm registry.

v2.16.14

View on GitHub

[2.16.14] — 2026-09-27

Internal

  • Split large CLI/orgrt modules into smaller files for maintainability; no behavior change. org.ts/org-observe.ts were split into commands/org-*.ts modules, and daemon.ts/session.ts were split into orgrt/session-*.ts modules, with doc source-anchors updated to point at the new module locations. This range is entirely behaviour-preserving internal refactors plus doc-anchor updates; confirmed by this round's pre-audit with no functional or user-facing change.

npm: monomind@2.16.14, @monoes/monomindcli@2.16.14

v2.16.13

View on GitHub

[2.16.13] — 2026-09-27

Fixed

  • browse open no longer rejects the Chrome it just started on a busy machine. Once Chrome's CDP endpoint answered, the launcher checked /json/version with a 1 s timeout and treated a timeout as "not Chrome". A Chrome that had only just started, on a loaded CI runner, answered /json/list but missed that timeout, and open failed with "Port N is occupied by a CDP-speaking process that does not identify as Chrome/Chromium" for its own browser. This made the #318 concurrent browse sessions test flaky on CI. A timeout or a failed request now means "try again" until the launch deadline. Only an endpoint that answers as another browser is refused, and a port-0 launch now also kills the Chrome it refused instead of leaving it running.
  • init no longer downloads the published monomind package, and Chrome with it, into $HOME, and it no longer leaves npm running after it exits. Its "Starting services" step ran npx monomind@latest swarm init. That step could never succeed: swarm was renamed to monoswarm, so it always ended with "Unknown command" and printed "Swarm initialization skipped". Before failing, it installed the whole published package from the registry (about 30,000 files) and ran that package's install scripts, which include puppeteer downloading two Chrome builds into ~/.cache/puppeteer. On a cold npm cache this cost tens of seconds on every init. The 30-second timeout did not limit it, because npm postpones SIGTERM until the current install step finishes (one run took 105 s). When init itself was killed partway through, for example by a caller's timeout, npm and puppeteer's installer kept running and writing into $HOME. They even recreated a home directory that had already been deleted, with 261 MB of Chrome in it. This caused the intermittent ENOTEMPTY failures in init-watch-non-interactive.test.ts's cleanup. init no longer runs this step. Run monomind monoswarm init when you need a swarm.

npm: monomind@2.16.13, @monoes/monomindcli@2.16.13, @monoes/monobrowse@1.0.25

v2.16.12

View on GitHub

[2.16.12] — 2026-09-26

Fixed

  • The org runtime no longer removes an empty file someone else recreated where one of its sandbox stubs was. A stub was recognised by device and inode only, and a filesystem reuses a freed inode at once, so an empty file recreated at the same path (an SDK stub, a user's placeholder) passed as the runtime's own and was deleted when the run ended. A file stub now also records its ctime at creation (ledger entries too), so a replaced or re-chmodded file is left alone. This also made the Tests workflow fail on every push since 2.16.10.

  • cleanup --data --force could corrupt ~/.monomind-projects.json if interrupted mid-write. It rewrote the registry file in place; it now writes through the same atomic temp-file-then-rename helper init uses. The dry run and the forced run also now report project-data folders and pruned registry entries as separate counts instead of one combined total.

npm: monomind@2.16.12, @monoes/monomindcli@2.16.12

v2.16.11

View on GitHub

[2.16.11] — 2026-09-26

Fixed

  • A sandboxed org role could create new files in the org root it was told not to write. In the 2.16.10 release run, a QA role with policy.sandbox.denyWrite: ["."] (the org root, which is also its cwd) wrote a new file, qaSample.js, into the org root with Bash. Since #323 a denied directory that is or holds the cwd went to the SDK sandbox as its existing children, each read-only. The directory itself became a writable mount point, because bubblewrap had to create the SDK's empty mount-point files in it. The runtime now creates those files itself before the role's restrictions are built, and keeps them for the whole run. With every one of them in place in the cwd, the cwd goes to the SDK as a plain read-only deny again: touch newfile fails with "Read-only file system", while reads, ls and git status still work and bubblewrap starts cleanly. If a stub is missing (it could not be created, or another process made it and may remove it), the cwd falls back to the #323 expansion. The org root above a cwd in a checkout below it, and ~/.claude, keep the #323 expansion. The file tools (Write/Edit) were never affected. Verified against the real bundled CLI and bubblewrap. See Git policy enforcement.

npm: monomind@2.16.11 · @monoes/monomindcli@2.16.11

v2.16.10

View on GitHub

[2.16.10] — 2026-09-26

Fixed

  • The sandbox-stub crash ledger's reclaim() could wrongly treat a live entry as dead, because alive() was not pid-namespace aware. The Claude SDK sandbox runs every org role under bwrap --unshare-pid, so a role sees its own private pid namespace, not the host's: process.kill(pid, 0) on a pid recorded by another role (or the host daemon) always throws ESRCH, whether that process is alive or not, because the pid simply is not visible from inside the caller's namespace. reclaim() read that ESRCH as "dead" and freed the entry's stubs — so a sandboxed role's own crash/recovery drill calling reclaim() could empty ~/.monomind/orgrt-sandbox-stubs/ledger.json mid-run while the run's real daemon and its stubs were still alive. Each ledger entry now also records the writer's pid namespace (/proc/self/ns/pid) and the machine's boot id (/proc/sys/kernel/random/boot_id, stable for one boot, never reused after a reboot). reclaim() now only treats an entry as reclaimable when it is either from a different boot (the machine rebooted, so no pid from that boot can still be alive) or from the same boot AND the same pid namespace with a pid that fails the liveness check; an entry from the same boot but a different (or unreadable) pid namespace is left alone, since its liveness cannot be determined from here. Entries written before this change (no pidNamespace/bootId fields) keep the old bare-pid behavior.

  • Sandboxed org roles no longer fail Bash calls with bwrap: Can't find source path …. Every recent release run had 0–5 of these (~/.claude/local, <org root>/.claude/settings.local.json), each audited as a sandbox-fault. For a missing "dangerous file" (.bashrc, .mcp.json, .claude/settings.local.json, ~/.claude/local, …), the SDK sandbox has bubblewrap create an empty mount-point file, and deletes it when that command ends. It coordinates this only within one process, and every role is its own process. So a role that wrapped a command while another role's stub existed bound the stub as a real file, and the other role's cleanup deleted it before bubblewrap started. Before a sandboxed role starts, the runtime now creates each of those paths that is missing, as the same empty read-only file, and keeps it until the run stops. The SDK never deletes a path that already existed. At the end the runtime removes only the files and .claude/ directories it created, and only while they are unchanged. Pre-existing files are never touched. A per-machine ledger (~/.monomind/orgrt-sandbox-stubs/ledger.json) lets the next runtime reclaim, under the same rule, the stubs of a daemon that was killed or a machine that rebooted mid-run. Verified against the real bundled CLI with two concurrent role processes. See Git policy enforcement.

  • Every push to main now gets a Deploy Pages run (#348). pages.yml filtered pushes by paths: ['doc/**', ...], so a push that changed no doc file got no run at all. The 2.16.8 release push (d09b3ecdd..803111a67, only CHANGELOG.md and the package.json versions) was one of these: d09b3ecdd and its doc changes had already been pushed and deployed. The release rules then found no pages run for the release commit, and the publisher had to dispatch one by hand. The trigger no longer has a path filter. A changes job diffs github.event.before..github.sha and runs the deploy job only when doc/** or pages.yml changed. A new branch, a force push or a before that cannot be fetched always deploys, and so does workflow_dispatch. A push with no doc change now ends as a successful run with the deploy job skipped.

  • cleanup --data prunes project data whose whole parent tree was deleted, and prunes the project registry. A ~/.monomind/projects/<name>-<hash> folder counted as orphaned only when its project's parent directory still existed, so a project inside a deleted test root (/var/tmp/fx-init/agent-ops-test-* after /var/tmp/fx-init was removed) was kept forever, and --aggressive did not help. The check now walks up to the nearest directory that still exists. The folder is pruned unless that directory is a mount point or a removable-media directory (/Volumes, /media, /mnt, /run/media), where the project may be on a volume that is not mounted. The home directory, /tmp, /var/tmp and the OS temp directory count as local. cleanup --data also lists ~/.monomind-projects.json entries whose project was deleted by the same rule, and removes them with --force. The CLI test suite now points HOME and the global brain at a temp directory, so test runs no longer leave folders in ~/.monomind/projects (#347).

npm: monomind@2.16.10, @monoes/monomindcli@2.16.10 published to https://www.npmjs.com/package/monomind

v2.16.9

View on GitHub

[2.16.9] — 2026-09-26

Fixed

  • Security: every tool call of a Claude org role is now decided by the role's policy. The Claude Code CLI asks the org's canUseTool gate only about calls its own rules would ask about. Read-only Bash (cat, ls, grep, git status, git log), Read inside the cwd, Agent, ToolSearch and ListAgents ran without it, so for those calls denyTools, allowTools, fileRead scopes, budget exhaustion, a pending decision gate, the fence and approvals did not apply, and no tool audit event was written. The 2.16.7 release run had 959 Bash results against 655 Bash decisions, and 38 ToolSearch, 7 ListAgents and 6 Agent calls had no decision at all. Reproduced against the real CLI: a role with denyTools: ["Bash"] could still run cat, and a role with fileRead: ["docs/**"] could still Read any file in its cwd. Write-type calls were not affected: git commit in a git: 'read' role, writes and non-read-only Bash always reached the gate, and the OS sandbox and git guard held underneath. The gate now also runs from a PreToolUse hook, which fires for every call, including a subagent's calls. A call is decided and audited once even when the CLI also asks canUseTool. ToolSearch is exempt from allowTools, since it only loads tool schemas; denyTools still blocks it. Approvals now cover these calls too: a role whose Bash needs approval (the default, unless autoApproveTools lists Bash or the run passes --auto-approve Bash) now also waits for approval of read-only commands. See Where the policy is enforced.
  • Org tools reject argument keys they do not declare. The 2.16.7 release run's captain passed org_plan_graph nodes deps (org_task's field) instead of after. The schema stripped the unknown key, the graph was accepted with no edges, every node came back ready, and QA was dispatched before the build. Every built-in org tool (org_*, ask_human, knowledge_search) now refuses unknown keys, at the top level and in nested objects, with an error that names each key and changes nothing. deps on a plan-graph node is pointed to after with node names, and after on org_task to deps with task ids. The tool schemas now advertise additionalProperties: false, so the model sees the rule before it calls. Tool-provider tools keep their inputSchema behaviour (#325).

npm: monomind@2.16.9, @monoes/monomindcli@2.16.9

v2.16.8

View on GitHub

[2.16.8] — 2026-09-26

Added

  • The coordinator is warned at 80% of a role's token cap and of the org-wide run_config.budget_tokens. (Follow-up to #343) The one-time 80% warning previously covered only budget_usd. It now also fires once per role per run at 80% of the role's token cap (its own budget_tokens, or its even split of run_config.budget_tokens, on whichever basis the cap is enforced on), and once per run when the whole run passes 80% of run_config.budget_tokens. Each warning is a budget-warning audit event whose data.budget names the budget (budget_usd, budget_tokens or run_config.budget_tokens). See Budget-closed assignees.

Changed

  • MCP result shape: hooks_session-start drops fields that never held real values. (Follow-up to #341) The config block (intelligenceEnabled, hooksEnabled and memoryPersistence, all always true) and sessionMemory.restoredPatterns (always 0) are gone. previousSession no longer has id, tasksRestored or memoryRestored; it now carries the loaded session's sessionId, status, startedAt and, when present, endedAt, summary and metrics.

Fixed

  • hooks_session-start with restoreLatest reports the previous session it actually found. (Follow-up to #341) It returned restored: true whenever restoreLatest was set and a previousSession whose id was made up from the current time minus one day, without looking anything up. It now reads the most recently started session from the sessions store that hooks_session-end updates. It reports restored: true and that session's record only when one exists, and restored: false with previousSession: null otherwise. The session being started is never reported as its own previous session.
  • hooks_model-outcome reports recorded: false when the ledger write fails. (Fixes #346) recordModelOutcome swallowed every error and the tool always returned recorded: true, so an unwritable .monomind/neural/ or a full disk dropped the outcome without anyone knowing. recordModelOutcome still never throws, but it now resolves to whether the line was appended, the tool reports that, and hooks model-outcome prints a warning instead of "Outcome recorded" when the write failed.
  • Four more hooks tools stop reporting writes that did not happen. (Follow-up to #346) hooks_post-task set learningUpdates.outcomePersisted: true even when writing .monomind/routing-outcomes.json failed. hooks_session-end and memory_session-end reported the session end as persisted when no session with that id had been started, which is every hooks session-end run, since the command passes no session id; they now report persisted: false / success: false. hooks_intelligence-reset returned reset: true when some learning files could not be deleted; it now returns reset: false with a failedFiles list, and hooks intelligence --reset warns and names them. hooks_pretrain counted neuralPatternsLearned even when recording the trajectory failed; it now reports 0.
  • org reload reopens roles the org-wide run_config.budget_tokens ceiling closed. (Follow-up to #343) A reload that raised the ceiling above the run's total spend could not reopen the roles it had closed; their tasks stayed blocked with "org-wide budget_tokens exhausted" for the rest of the run. Raising run_config.budget_tokens above the run's total spend now re-arms the ceiling at the new value, reopens those roles with their spend kept, restores any roles that had been held back from spawning, and re-dispatches their held tasks (org-budget-reopened audit event); a raise that is not enough keeps them closed and updates the numbers in the held tasks' reason. A reload also recomputes the token cap of every live role that uses the org's even split, so a changed run_config.budget_tokens or a role gaining or dropping its own budget_tokens moves the other roles' shares too. See Budget-closed assignees.
  • pick no longer mis-routes tasks that mention "org" or API documentation. Keyword picks showed monoswarm-multi-repo for tasks like "set up an org that tracks competitor pricing changes" — its description said "many repositories in an org", which matched monomind's own meaning of "org" (an agent organization); it now says "GitHub repositories" / "GitHub repos". api-designer showed up for "document the public REST API for external developers" because it carried the documentation tag, which is reserved for technical docs, READMEs, ADRs and changelogs; that tag is dropped, since api already covers it. code-documenter's description now names the API reference docs and tutorials its skills actually cover.
  • Editing a bundled org skill in place is picked up without another change. .claude/helpers/skill-registry.json compared the bundled org-skills/ library by directory mtime only, so editing an existing bundled SKILL.md left the index looking fresh and the prompt hook, monomind pick and the pick MCP tool kept ranking the old description and tags until something else touched the directory. The bundled root now gets the same per-skill scan as project and user org skill roots.

npm: https://www.npmjs.com/package/monomind/v/2.16.8 and https://www.npmjs.com/package/@monoes/monomindcli/v/2.16.8

v0.129.0

View on GitHub

What's New in v0.129.0

✨ New Features

  • re-pin profile MCP, install SDK deps, register via init, offline doctor, packs for coder folders
  • dismiss a blocking question from the CLI and the org bubble

🐛 Bug Fixes

  • review fixes — dismiss needs 2.22.0, accurate --force and packs notes, nil-safe handshake
  • reuse-safe run liveness, crashed display, schedule-audit refusals
  • adapt coder chat and sandbox classes to monomind 2.24.4
  • adapt to monomind 2.21-2.24 contracts

🔄 Other Changes

  • Merge pull request #449 from monoes/fix/monomind-2244-adapt
  • Merge branch 'worktree-agent-af714906b8333e116' into fix/monomind-2244-adapt
  • Merge branch 'worktree-agent-aa740327f8e56ca25' into fix/monomind-2244-adapt

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe + monoagentcli-windows-amd64-bundled.exe (save both in the same folder)
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.129.0/monoagentcli-darwin-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (x86_64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.129.0/monoagentcli-linux-amd64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (arm64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.129.0/monoagentcli-linux-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Self-update (once installed)
monoagentcli update

Chrome Extension

Bridges monoagentcli to your real, already-logged-in Chrome browser. Not on the Web Store — download, unzip, and load unpacked:

  1. Download monoagent-chrome-extension.zip and unzip it
  2. Open chrome://extensions, enable Developer mode
  3. Click Load unpacked and select the unzipped chrome-extension folder

v0.128.0

View on GitHub

What's New in v0.128.0

✨ New Features

  • pin the current and next signing keys alongside today's published key (dormant)

🔄 Other Changes

  • Merge pull request #450 from monoes/feat/pin-current-and-next-signing-keys

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe + monoagentcli-windows-amd64-bundled.exe (save both in the same folder)
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.128.0/monoagentcli-darwin-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (x86_64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.128.0/monoagentcli-linux-amd64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (arm64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.128.0/monoagentcli-linux-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Self-update (once installed)
monoagentcli update

Chrome Extension

Bridges monoagentcli to your real, already-logged-in Chrome browser. Not on the Web Store — download, unzip, and load unpacked:

  1. Download monoagent-chrome-extension.zip and unzip it
  2. Open chrome://extensions, enable Developer mode
  3. Click Load unpacked and select the unzipped chrome-extension folder

v0.127.0

View on GitHub

What's New in v0.127.0

✨ New Features

  • replace the MPL-2.0 MySQL driver with go-mysql-org/go-mysql (MIT)
  • pin the production signing key monoes.me publishes today (dormant)

🐛 Bug Fixes

  • mysql retries off by default, deterministic tls/ssl, stricter DSN parsing

🔄 Other Changes

  • Merge pull request #448 from monoes/integration/next
  • chore(license): refresh NOTICE and the dependency audit for go-redis 9.23.0 and go.uber.org/atomic 1.12.0
  • Merge feat/mysql-driver-go-mysql-org into integration/next
  • Merge feat/pin-account-signing-key into integration/next
  • Merge dependabot/npm_and_yarn/wails-app/frontend/npm-patch-minor-399d44f55e into integration/next
  • Merge dependabot/go_modules/go-patch-minor-7c8509d383 into integration/next
  • Merge branch 'master' into dependabot/npm_and_yarn/wails-app/frontend/npm-patch-minor-399d44f55e
  • Merge branch 'master' into dependabot/go_modules/go-patch-minor-7c8509d383
  • chore(deps-dev): bump @vitejs/plugin-react
  • chore(deps): bump github.com/redis/go-redis/v9

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe + monoagentcli-windows-amd64-bundled.exe (save both in the same folder)
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.127.0/monoagentcli-darwin-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (x86_64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.127.0/monoagentcli-linux-amd64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (arm64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.127.0/monoagentcli-linux-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Self-update (once installed)
monoagentcli update

Chrome Extension

Bridges monoagentcli to your real, already-logged-in Chrome browser. Not on the Web Store — download, unzip, and load unpacked:

  1. Download monoagent-chrome-extension.zip and unzip it
  2. Open chrome://extensions, enable Developer mode
  3. Click Load unpacked and select the unzipped chrome-extension folder

v0.126.2

View on GitHub

What's New in v0.126.2

🐛 Bug Fixes

  • move to go1.26.9 and x/net v0.60.0 to clear 12 stdlib advisories

🔄 Other Changes

  • Merge pull request #445 from monoes/fix/go-toolchain-1.26.9

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe + monoagentcli-windows-amd64-bundled.exe (save both in the same folder)
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.126.2/monoagentcli-darwin-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (x86_64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.126.2/monoagentcli-linux-amd64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (arm64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.126.2/monoagentcli-linux-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Self-update (once installed)
monoagentcli update

Chrome Extension

Bridges monoagentcli to your real, already-logged-in Chrome browser. Not on the Web Store — download, unzip, and load unpacked:

  1. Download monoagent-chrome-extension.zip and unzip it
  2. Open chrome://extensions, enable Developer mode
  3. Click Load unpacked and select the unzipped chrome-extension folder

v0.124.1

View on GitHub

What's New in v0.124.1

🔄 Other Changes

  • Merge pull request #399 from monoes/ci/shard-and-dedupe-runs
  • ci: drop the test sharding, keep push-on-master-only and cancel superseded PR runs
  • Merge remote-tracking branch 'origin/master' into trim399
  • ci: shard cmd/monoagentcli tests, run push only on master, cancel superseded PR runs

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe + monoagentcli-windows-amd64-bundled.exe (save both in the same folder)
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.124.1/monoagentcli-darwin-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (x86_64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.124.1/monoagentcli-linux-amd64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (arm64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.124.1/monoagentcli-linux-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Self-update (once installed)
monoagentcli update

Chrome Extension

Bridges monoagentcli to your real, already-logged-in Chrome browser. Not on the Web Store — download, unzip, and load unpacked:

  1. Download monoagent-chrome-extension.zip and unzip it
  2. Open chrome://extensions, enable Developer mode
  3. Click Load unpacked and select the unzipped chrome-extension folder

v0.124.0

View on GitHub

What's New in v0.124.0

✨ New Features

  • verify updates against a signed release manifest

🐛 Bug Fixes

  • align signed-manifest client with the shared signing contract

🔄 Other Changes

  • Merge pull request #437 from monoes/feat/signed-release-manifest
  • Merge master
  • Merge origin/master into feat/signed-release-manifest
  • ci(release): the release guard also rejects binaries built with the releasee2e test tag
  • test(release): loopback end-to-end script; release verify refuses an expired manifest
  • Merge remote-tracking branch 'origin/master' into pr437

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe + monoagentcli-windows-amd64-bundled.exe (save both in the same folder)
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.124.0/monoagentcli-darwin-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (x86_64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.124.0/monoagentcli-linux-amd64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (arm64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.124.0/monoagentcli-linux-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Self-update (once installed)
monoagentcli update

Chrome Extension

Bridges monoagentcli to your real, already-logged-in Chrome browser. Not on the Web Store — download, unzip, and load unpacked:

  1. Download monoagent-chrome-extension.zip and unzip it
  2. Open chrome://extensions, enable Developer mode
  3. Click Load unpacked and select the unzipped chrome-extension folder

v0.123.0

View on GitHub

What's New in v0.123.0

✨ New Features

  • expires_at, seed keys, safer releases-repo upload, runbook
  • unsigned update manifest, signing tool, releases-repo publish

🔄 Other Changes

  • Merge pull request #435 from monoes/feat/release-manifest-tooling
  • Merge origin/master into feat/release-manifest-tooling
  • merge origin/master

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe + monoagentcli-windows-amd64-bundled.exe (save both in the same folder)
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.123.0/monoagentcli-darwin-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (x86_64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.123.0/monoagentcli-linux-amd64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (arm64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.123.0/monoagentcli-linux-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Self-update (once installed)
monoagentcli update

Chrome Extension

Bridges monoagentcli to your real, already-logged-in Chrome browser. Not on the Web Store — download, unzip, and load unpacked:

  1. Download monoagent-chrome-extension.zip and unzip it
  2. Open chrome://extensions, enable Developer mode
  3. Click Load unpacked and select the unzipped chrome-extension folder

v0.122.0

View on GitHub

What's New in v0.122.0

✨ New Features

  • install from a signed release manifest with checksum verification

🐛 Bug Fixes

  • refuse an expired manifest
  • enforce signature key id format and asset host allow-list

🔄 Other Changes

  • Merge pull request #436 from monoes/worktree-wf_01183276-c9e-3
  • Merge origin/master

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe + monoagentcli-windows-amd64-bundled.exe (save both in the same folder)
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.122.0/monoagentcli-darwin-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (x86_64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.122.0/monoagentcli-linux-amd64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (arm64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.122.0/monoagentcli-linux-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Self-update (once installed)
monoagentcli update

Chrome Extension

Bridges monoagentcli to your real, already-logged-in Chrome browser. Not on the Web Store — download, unzip, and load unpacked:

  1. Download monoagent-chrome-extension.zip and unzip it
  2. Open chrome://extensions, enable Developer mode
  3. Click Load unpacked and select the unzipped chrome-extension folder

v0.121.0

View on GitHub

What's New in v0.121.0

✨ New Features

  • redact command and operator-only delete/redact MCP and chat tools

🐛 Bug Fixes

  • redact also clears the media list

🔄 Other Changes

  • Merge pull request #432 from monoes/feat/publication-delete-redact
  • Merge master

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe + monoagentcli-windows-amd64-bundled.exe (save both in the same folder)
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.121.0/monoagentcli-darwin-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (x86_64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.121.0/monoagentcli-linux-amd64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (arm64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.121.0/monoagentcli-linux-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Self-update (once installed)
monoagentcli update

Chrome Extension

Bridges monoagentcli to your real, already-logged-in Chrome browser. Not on the Web Store — download, unzip, and load unpacked:

  1. Download monoagent-chrome-extension.zip and unzip it
  2. Open chrome://extensions, enable Developer mode
  3. Click Load unpacked and select the unzipped chrome-extension folder

v0.120.2

View on GitHub

What's New in v0.120.2

🔄 Other Changes

  • Merge pull request #434 from monoes/test/adoption-real-login
  • test(account): adopt a real older library login end to end through run()

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe + monoagentcli-windows-amd64-bundled.exe (save both in the same folder)
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.120.2/monoagentcli-darwin-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (x86_64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.120.2/monoagentcli-linux-amd64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (arm64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.120.2/monoagentcli-linux-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Self-update (once installed)
monoagentcli update

Chrome Extension

Bridges monoagentcli to your real, already-logged-in Chrome browser. Not on the Web Store — download, unzip, and load unpacked:

  1. Download monoagent-chrome-extension.zip and unzip it
  2. Open chrome://extensions, enable Developer mode
  3. Click Load unpacked and select the unzipped chrome-extension folder

v0.120.1

View on GitHub

What's New in v0.120.1

🔄 Other Changes

  • Merge pull request #433 from monoes/docs/b5b-account-docs
  • test(account): pin ref account as an open command (#370)

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe + monoagentcli-windows-amd64-bundled.exe (save both in the same folder)
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.120.1/monoagentcli-darwin-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (x86_64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.120.1/monoagentcli-linux-amd64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (arm64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.120.1/monoagentcli-linux-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Self-update (once installed)
monoagentcli update

Chrome Extension

Bridges monoagentcli to your real, already-logged-in Chrome browser. Not on the Web Store — download, unzip, and load unpacked:

  1. Download monoagent-chrome-extension.zip and unzip it
  2. Open chrome://extensions, enable Developer mode
  3. Click Load unpacked and select the unzipped chrome-extension folder

v0.120.0

View on GitHub

What's New in v0.120.0

✨ New Features

  • restart a stale daemon on update, flag it in doctor, give stops 35 s

🐛 Bug Fixes

  • restart only the daemon the service runs, and verify the restart

🔄 Other Changes

  • Merge pull request #431 from monoes/feat/stale-daemon-b5a
  • Merge remote-tracking branch 'origin/master' into feat/stale-daemon-b5a

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe + monoagentcli-windows-amd64-bundled.exe (save both in the same folder)
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.120.0/monoagentcli-darwin-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (x86_64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.120.0/monoagentcli-linux-amd64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (arm64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.120.0/monoagentcli-linux-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Self-update (once installed)
monoagentcli update

Chrome Extension

Bridges monoagentcli to your real, already-logged-in Chrome browser. Not on the Web Store — download, unzip, and load unpacked:

  1. Download monoagent-chrome-extension.zip and unzip it
  2. Open chrome://extensions, enable Developer mode
  3. Click Load unpacked and select the unzipped chrome-extension folder

v0.119.0

View on GitHub

What's New in v0.119.0

✨ New Features

  • adopt an older library login once, at the first gated command

🐛 Bug Fixes

  • adopt the older login before the gate judges, read before claiming

🔄 Other Changes

  • Merge pull request #430 from monoes/feat/account-adopt-wire
  • Merge remote-tracking branch 'origin/master' into adopt430

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe + monoagentcli-windows-amd64-bundled.exe (save both in the same folder)
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.119.0/monoagentcli-darwin-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (x86_64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.119.0/monoagentcli-linux-amd64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (arm64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.119.0/monoagentcli-linux-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Self-update (once installed)
monoagentcli update

Chrome Extension

Bridges monoagentcli to your real, already-logged-in Chrome browser. Not on the Web Store — download, unzip, and load unpacked:

  1. Download monoagent-chrome-extension.zip and unzip it
  2. Open chrome://extensions, enable Developer mode
  3. Click Load unpacked and select the unzipped chrome-extension folder

v0.118.0

View on GitHub

What's New in v0.118.0

✨ New Features

  • finish Tasks page cards, a11y, optimistic keep, archive close, hidden pause

🔄 Other Changes

  • Merge pull request #429 from monoes/feat/tasks-page-leftovers

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe + monoagentcli-windows-amd64-bundled.exe (save both in the same folder)
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.118.0/monoagentcli-darwin-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (x86_64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.118.0/monoagentcli-linux-amd64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (arm64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.118.0/monoagentcli-linux-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Self-update (once installed)
monoagentcli update

Chrome Extension

Bridges monoagentcli to your real, already-logged-in Chrome browser. Not on the Web Store — download, unzip, and load unpacked:

  1. Download monoagent-chrome-extension.zip and unzip it
  2. Open chrome://extensions, enable Developer mode
  3. Click Load unpacked and select the unzipped chrome-extension folder

v0.117.1

View on GitHub

What's New in v0.117.1

🐛 Bug Fixes

  • the #364 remainder: claim and key rules in the board model, tag-pinned MCP fields, range wording

🔄 Other Changes

  • Merge pull request #415 from monoes/fix/tasks-followups-remainder

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe + monoagentcli-windows-amd64-bundled.exe (save both in the same folder)
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.117.1/monoagentcli-darwin-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (x86_64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.117.1/monoagentcli-linux-amd64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (arm64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.117.1/monoagentcli-linux-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Self-update (once installed)
monoagentcli update

Chrome Extension

Bridges monoagentcli to your real, already-logged-in Chrome browser. Not on the Web Store — download, unzip, and load unpacked:

  1. Download monoagent-chrome-extension.zip and unzip it
  2. Open chrome://extensions, enable Developer mode
  3. Click Load unpacked and select the unzipped chrome-extension folder

v0.117.0

View on GitHub

What's New in v0.117.0

✨ New Features

  • the core.monoes_account row
  • run() installs the guard and gates every command before cobra runs it
  • the account gate's verdict, refusal text and stderr lines
  • resolve what an invocation would run before the gate decides
  • classify every command for the monoes.me account gate
  • a locked daemon stops its org services and resumes by itself
  • the daemon heartbeat reports the account, and re-validation waits while locked
  • serving commands start the guard's refresher at once
  • the app starts behind the account gate
  • the account gate, its banners and its strings
  • the account gate controller
  • the account status answer and the binding watch
  • the engine cancels a refused account's runs and ends a run in flight at its next node while locked
  • the side panel says when the bridge needs a monoes.me sign-in
  • account bindings, a read-only guard and Wails bindings; library login bindings alias them
  • library login, logout and status are aliases of the account session
  • the account command group: login, logout, status
  • adopt an older login into the account session
  • read with the machine session and keep an older login working
  • the default guard, the host seam and the devaccount development key
  • agent turns and browser actions refuse while the account is locked
  • nothing runs on a capture written while the account is locked
  • the bridge refuses requests, relay and CDP while the account is locked
  • logout that keeps the clock record, and adoption of an older refresh token
  • the webhook server answers 503 while the account is locked
  • /v1 refuses in the OpenAI envelope while the account is locked
  • browser and emailed-code sign-in client
  • a locked engine drops triggers and leaves paused and queued runs alone
  • the refresh-token grant, and exactly what Settled can mean
  • refuse tools/call and org deliveries while the account is locked
  • sign JWT access tokens with the dev key, and fail, block and tell time on request
  • the engine refuses to create or start an execution while the account is locked
  • refuse every route but /health while the monoes.me account is locked
  • the words every door says to a locked caller
  • endpoint discovery and the browser sign-in, shared with the library
  • mark the Load failures that mean session.json is unusable
  • a refresh token that a drop gave up is never presented again (A24 ruling 5)
  • a pass that finds the marker and no refresh token finishes the drop (A24 rule 1d)
  • a machine that never signed in keeps the clock-guard record from the enforcement date on (A25)
  • the refresher retries a marker that another process left within 30 s (A24, the loop)
  • a refresh whose answer was lost is retried inside 240 s and its token dropped after (A24 rules 1a-1d)
  • a refresh grant writes a marker before it is sent, and what the answer was decides whether it stays
  • unconfirmed is a grace reason, then locked, and has its text
  • the data of A24: Session.PendingSince, TransientError.Settled, ReasonUnconfirmed, pendingRetryWindow
  • add isStrict, the accessor of the strict flag
  • the process-wide guard and accounttest.Install
  • the background refresher with backoff
  • the refresh algorithm under the cross-process lock
  • the guard with its cached verdict and OnRefused
  • the on-disk session, atomic writes and the cross-process lock
  • seal the refresh token under the vault's key stores
  • the session and its verdict, with the clock guard
  • strict EdDSA JWS verification and the accounttest fixture
  • states, errors, the enforcement date and the test hooks

🐛 Bug Fixes

  • skip the reconcile when the org file cannot be reloaded under the rows lock
  • keep a new grant from being revoked by the daemon's reconcile mid-add
  • sign-in leftovers of B1b: cancellation, browser-open errors, redirects, fake and tests
  • cancel before waiting on org services; carry the refusal cause in the cancel
  • dormant when bindings are absent; raw failure message behind a details toggle
  • open directories on Windows to refuse them; retry test reads during a replace
  • replace and read the store files with Windows sharing semantics
  • pin HEAD and OPTIONS and classify the escaped path at the door
  • keep discovered endpoints on the base host whatever their shape
  • a running refresher takes a step back of its clock for what it is and drops a token in doubt (F-7)
  • an answer that names no refresh token is an unknown outcome (F-6)
  • a fresh marker starts the evidence of a clock set back at its stamp (F-4)
  • a running refresher keeps the evidence of a clock set back at most a minute old (F-3)
  • judge a marker on the clock read after the refresh token, just before the send (F-2)
  • a 5xx is never a settled outcome of a refresh grant (F-1)
  • the refresher backs off after a completed drop instead of passing at every wake-up (A24, F3)
  • no write of the guard moves the last attempt back while a token is in doubt (A24)
  • a token that must never be presented again is dropped unread when the key store cannot open it (A24, F1)
  • a long-running guard drops its cached session when session.json turns unusable (A24 ruling 9)
  • a clock that reads before the last attempt drops a marked token instead of presenting it (A24 ruling 7)
  • write session.json and refresh.enc through on Windows
  • read the store's files without waiting, and at most 64 KiB of them
  • seal the account's refresh token under the key the key store holds now
  • the refresher keeps a marker it follows out of the hold and starts its schedule at 30 s (A24 point 6)
  • make a t.Parallel test of the global-state seams fail at once
  • read the refresher's time after its verdict
  • let at most one key store call stay parked
  • do not bound the interactive sealer's key store call
  • let the refresher repair a clock_rollback lock while it holds
  • bound the key store waits at the store level
  • read a typed-nil error from a Refresher as no error
  • make accounttest.Install fail on an unknown mode
  • do not let an older file put back a newer session only the guard holds
  • delete refresh.enc only once the refused marker is saved
  • never abandon a refresh grant the server may have rotated
  • build the refusal text from GraceWindow and ClockSkew
  • hand out copies of the extra keys too
  • sync the directory after a rename or a remove
  • take in the session read under the lock when the mark write fails
  • ignore OnRefused(nil) and say callbacks must be idempotent
  • do not read a typed-nil TransientError as a server error
  • answer on a nil receiver and never take a typed-nil refusal for one
  • keep the high-water mark current while the refresher waits
  • hold the refresher for half the new token's lifetime after a refresh
  • keep a rotated refresh token that came without an access token
  • never dereference a missing receipt in dueForRefresh
  • serialize adopt with a reload, notice a removed file after a failed read, call a late OnRefused callback only while refused
  • refuse Save(nil) instead of panicking
  • copy the key out of the vault's memo, enforce 32-byte keys, say how the key is created
  • compare wall-clock time only in the verdict
  • report the plan only from a verified token
  • cut the kid a key_unknown message quotes to 64 bytes

🔄 Other Changes

  • Merge pull request #417 from monoes/feat/monoes-account-gate
  • Merge master into the account gate branch (keep the gate's library login aliases, follow the console-hiding rename)
  • Merge pull request #423 from monoes/feat/account-b5-readiness
  • Merge remote-tracking branch 'origin/feat/monoes-account-gate' into feat/account-b5-readiness
  • Merge pull request #424 from monoes/fix/grant-add-daemon-reconcile-race
  • Merge pull request #421 from monoes/fix/account-b1b-leftovers
  • Merge pull request #419 from monoes/feat/account-b3a-remaining
  • Merge pull request #418 from monoes/feat/account-b2-cli-guard
  • Merge pull request #420 from monoes/fix/account-b3b-bypass-review
  • chore(license): copyright and dependency audits and the NOTICE file
  • ci(release): fail a release whose binaries carry the devaccount tag
  • ci(account): the smoke job reports without blocking until the command-line gate lands
  • test(account): the smoke skips the rig's file-keyring warning when checking the first stderr line
  • test(account): real-binary smoke rig, the dev-only enforcement override and its CI job
  • Merge pull request #416 from monoes/feat/account-b4-gate-ui
  • Merge remote-tracking branch 'origin/feat/monoes-account-gate' into fix/account-b1b-leftovers
  • test(gate): fail when a subcommand of mcp or httpapi is not listed in the account classes
  • Merge remote-tracking branch 'origin/feat/monoes-account-gate' into fix/account-b3b-bypass-review
  • Merge origin/feat/monoes-account-gate into feat/account-b3a-remaining
  • test(accountdoor): bypass review of every network, MCP and bridge door while locked
  • test(cli): pin ref publication and ref tasks as open reference pages
  • Merge origin/feat/monoes-account-gate into feat/account-b4-gate-ui
  • Merge master into the account gate integration branch
  • Merge pull request #404 from monoes/feat/account-b4
  • Merge pull request #393 from monoes/feat/account-b3b-doors
  • Merge remote-tracking branch 'origin/feat/account-b3b-doors' into feat/account-b4
  • Merge remote-tracking branch 'origin/feat/account-b3b' into feat/account-b4
  • Merge pull request #391 from monoes/feat/account-b3a-t2-t4
  • Merge remote-tracking branch 'origin/feat/monoes-account-gate' into ma393
  • Merge remote-tracking branch 'origin/feat/monoes-account-gate' into ma391
  • Merge pull request #396 from monoes/feat/account-b1b-finish
  • Merge pull request #400 from monoes/fix/account-windows-tests
  • refactor(cli): the login-required error carries the account state
  • test(library): the library's endpoints never leave the base host
  • refactor(library): sign in through the shared browser sign-in of account
  • ci(account): run the account package on Windows and macOS (informational)
  • test(account): read a refresher's verdict only once the pass that wrote it has ended
  • test(account): make the refresher tests wait on what the refresher wrote, never on a pause
  • test(account): sync the clock-step tests of the refresher on what it wrote, not on a pause
  • test(account): pin that a key store failure with nothing in doubt records the clock as it reads
  • test(account): pin the marker cleared by a same-token answer and the reading that judges a key store failure
  • refactor(account): move the high-water mark and the clock-guard record to guard_hw.go
  • test(account): split the retry tests of A24 in two files under 500 lines
  • merge: A24 (the write-ahead marker and the drop of a token in doubt) and A25 (the clock-guard record of a machine that never signed in)
  • test(account): pin that the high-water write keeps a session in doubt as it was
  • test(account): pin that the last attempt still follows a clock that went back when nothing is in doubt
  • Merge branch 'feat/account-integration' into feat/account-a24
  • merge: the review round of the store changes (the Windows rename and read tripwires, the factored import rule, comments)
  • test(account): pin the Windows rename, the write chain and the open-file type check
  • test(account): print no token in the failures of the drop's tests, and say what a refresh does with an unusable file
  • test(account): make the foreign-stamp test of the refresher fail when the loop forgets to reset its own stamp
  • merge: the review round of the key fix (Open reads fresh, a reset entry gets a new key, comments)
  • test(secrets): pin that Open reads fresh and that a reset entry gets a new key
  • test(account): restore the missing-session subtests of the token-less test with the record of A25
  • Merge branch 'feat/account-integration' into feat/account-a24
  • merge: the store reads (regular files only, 64 KiB cap, no blocking), the session-invalid sentinel and the Windows write-through
  • merge: the stale key-encryption-key fix: Seal reads the key the key store holds now
  • test(account): pin that the store stops reading a file at the cap
  • test(account): pin that a marker stays while the key store cannot open the refresh token (A24 rule 1d)
  • test(secrets): pin how the account key is made: on absence only, once, adopted by a loser
  • test(account): pin that a directory or a refresh.enc that stops taking writes never replays a rotated token (sec3)
  • merge: the Task 9 pins of requireNoGuard, noGuardStatus and the seams' restore and race tests
  • Merge branch 'feat/account-integration' into feat/account-a24
  • test(account): race the keys and date seams against their readers
  • test(account): pin that every seam puts back the previous value, not the default
  • test(account): the fakes' transient failures are settled unless a test models a lost answer
  • test(account): pin the shapes of requireNoGuard and noGuardStatus
  • merge: the Task 9 review rounds (marker position, time argument, parameter names)
  • merge: the security-fix review round (the parked-count test, four doc fixes)
  • test(account): store the refusal under the lock in the loop's refusal test
  • test(account): read the names Require's pin expects from its signature
  • test(account): pin the time Require hands requireNoGuard
  • refactor(account): Require reads the strict flag through isStrict()
  • test(account): Close and a cancelled context wait for a grant in flight
  • test(account): make the t.Parallel tests look at what a seam leaves behind
  • test(account): pin the parked count when an answer arrives as the timer fires
  • test(account): pin where a seam sets the marker
  • merge: the hygiene and key tests (Task 10)
  • merge: the process-wide guard and accounttest.Install (Task 9)
  • merge: the security fixes (a grant is never abandoned, the refused marker before the delete, bounded key store waits)
  • merge: the hardening pass (A1-A9, B, C, D, E) into the account core
  • test(account): require the refusal of a *ForTest hook to come first
  • test(account): pin that Require has no exit but the guard's and requireNoGuard's
  • test(account): pin that requireTestBinary refuses whenever testing.Testing() is false
  • test(account): write the session under the lock where a refresher is running
  • test(account): give the grant-context test a caller deadline no stall can reach
  • test(account): have the key store wait test queue a second process behind the lock
  • test(account): pin that every *ForTest hook refuses to run in a release binary
  • test(account): pin the nil cache case of adoptUnlessOlder
  • test(account): pin that a session with no token keeps the enforcement date
  • test(account): give accounttest a throwaway HOME and a mock keyring
  • test(account): pin how Require and InstallForTest reach the test-binary checks
  • refactor(account): make the production half of Require testable
  • test(account): print whether the refresh token matches, not the token
  • test(account): pin the test-binary exceptions of process.go
  • test(account): pin the process guard and accounttest.Install against surviving mutants
  • test(account): a release build refuses a token signed with the development key
  • test(account): golden test of the wire strings and the refusal text
  • test(account): pin what three foundation tests only seemed to check
  • test(account): fail, not skip, when time.Time's layout is not the one wallBack edits
  • test(account): do not print session.json when its format test fails
  • test(account): the import rule, the pinned-key rule and the default-build key check
  • test(account): say what the swap after the lock is, and is not
  • test(account): wait 150 ms in settle, above the 100 ms floor
  • test(account): wait for the loop's own mark write before the test writes the session
  • test(account): let a sign-in reach a polling refresher all at once
  • test(account): stamp the loop server's tokens when the request arrives
  • test(account): pin the refresher against surviving mutants
  • test(account): pin the refresh algorithm against surviving mutants
  • test(account): wait for the OnRefused call before counting
  • test(account): pin that a kept session still expires on schedule
  • test(account): pin the guard's reads, callbacks and Close against surviving mutants
  • test(account): pin the lock's poll-delay cap
  • test(account): pin the store and its lock against surviving mutants
  • test(account): finish the key accessor hermeticity and correct two comments
  • test(account): neutralize the passphrase-file variable in the key accessor helper
  • test(account): make the key accessor tests hermetic and correct a doc comment
  • test(account): pin the key accessor and the sealer against surviving mutants
  • test(account): pin a receipt with an error and a cleared token with a stale receipt
  • test(account): pin the order, clock and stored-field boundaries of the verdict
  • test(account): write U+202E as an escape and correct a comment
  • test(account): harden the accounttest fixture and its tests
  • test(account): pin the strict parts of Verify and sign the payload-parser cases
  • test(account): pin that Verify never trusts or fetches key material from a token

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe + monoagentcli-windows-amd64-bundled.exe (save both in the same folder)
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.117.0/monoagentcli-darwin-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (x86_64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.117.0/monoagentcli-linux-amd64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (arm64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.117.0/monoagentcli-linux-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Self-update (once installed)
monoagentcli update

Chrome Extension

Bridges monoagentcli to your real, already-logged-in Chrome browser. Not on the Web Store — download, unzip, and load unpacked:

  1. Download monoagent-chrome-extension.zip and unzip it
  2. Open chrome://extensions, enable Developer mode
  3. Click Load unpacked and select the unzipped chrome-extension folder

v0.116.2

View on GitHub

What's New in v0.116.2

🔄 Other Changes

  • Merge pull request #427 from monoes/fix/documents-watcher-test-flake
  • test(wails): drop watched files in atomically in the document watcher test

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe + monoagentcli-windows-amd64-bundled.exe (save both in the same folder)
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.116.2/monoagentcli-darwin-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (x86_64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.116.2/monoagentcli-linux-amd64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (arm64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.116.2/monoagentcli-linux-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Self-update (once installed)
monoagentcli update

Chrome Extension

Bridges monoagentcli to your real, already-logged-in Chrome browser. Not on the Web Store — download, unzip, and load unpacked:

  1. Download monoagent-chrome-extension.zip and unzip it
  2. Open chrome://extensions, enable Developer mode
  3. Click Load unpacked and select the unzipped chrome-extension folder

v0.116.1

View on GitHub

What's New in v0.116.1

🔄 Other Changes

  • Merge pull request #425 from monoes/refactor/relicense-prep-rewrite-contributor-lines
  • refactor: rewrite lines authored by outside contributors (relicense prep)

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe + monoagentcli-windows-amd64-bundled.exe (save both in the same folder)
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.116.1/monoagentcli-darwin-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (x86_64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.116.1/monoagentcli-linux-amd64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (arm64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.116.1/monoagentcli-linux-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Self-update (once installed)
monoagentcli update

Chrome Extension

Bridges monoagentcli to your real, already-logged-in Chrome browser. Not on the Web Store — download, unzip, and load unpacked:

  1. Download monoagent-chrome-extension.zip and unzip it
  2. Open chrome://extensions, enable Developer mode
  3. Click Load unpacked and select the unzipped chrome-extension folder

v0.116.0

View on GitHub

What's New in v0.116.0

✨ New Features

  • Done and claim pulses, lease clock, sidebar badge revision guard

🔄 Other Changes

  • Merge pull request #422 from monoes/feat/tasks-pulses-phase-review

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe + monoagentcli-windows-amd64-bundled.exe (save both in the same folder)
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.116.0/monoagentcli-darwin-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (x86_64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.116.0/monoagentcli-linux-amd64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (arm64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.116.0/monoagentcli-linux-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Self-update (once installed)
monoagentcli update

Chrome Extension

Bridges monoagentcli to your real, already-logged-in Chrome browser. Not on the Web Store — download, unzip, and load unpacked:

  1. Download monoagent-chrome-extension.zip and unzip it
  2. Open chrome://extensions, enable Developer mode
  3. Click Load unpacked and select the unzipped chrome-extension folder

v0.115.7

View on GitHub

What's New in v0.115.7

🔧 Build & CI

  • bump the npm-patch-minor group

🔄 Other Changes

  • Merge pull request #414 from monoes/dependabot/npm_and_yarn/wails-app/frontend/npm-patch-minor-30ffb9cf44

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe + monoagentcli-windows-amd64-bundled.exe (save both in the same folder)
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.115.7/monoagentcli-darwin-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (x86_64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.115.7/monoagentcli-linux-amd64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (arm64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.115.7/monoagentcli-linux-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Self-update (once installed)
monoagentcli update

Chrome Extension

Bridges monoagentcli to your real, already-logged-in Chrome browser. Not on the Web Store — download, unzip, and load unpacked:

  1. Download monoagent-chrome-extension.zip and unzip it
  2. Open chrome://extensions, enable Developer mode
  3. Click Load unpacked and select the unzipped chrome-extension folder

v0.115.6

View on GitHub

What's New in v0.115.6

🔧 Build & CI

  • bump github.com/slack-go/slack

🔄 Other Changes

  • Merge pull request #413 from monoes/dependabot/go_modules/go-patch-minor-79c93786d0

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe + monoagentcli-windows-amd64-bundled.exe (save both in the same folder)
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.115.6/monoagentcli-darwin-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (x86_64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.115.6/monoagentcli-linux-amd64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (arm64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.115.6/monoagentcli-linux-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Self-update (once installed)
monoagentcli update

Chrome Extension

Bridges monoagentcli to your real, already-logged-in Chrome browser. Not on the Web Store — download, unzip, and load unpacked:

  1. Download monoagent-chrome-extension.zip and unzip it
  2. Open chrome://extensions, enable Developer mode
  3. Click Load unpacked and select the unzipped chrome-extension folder

v0.115.5

View on GitHub

What's New in v0.115.5

🔄 Other Changes

  • Merge pull request #412 from monoes/fix/workflow-cancel-test-hardening
  • test(workflow): harden the cancel tests' process helpers against load

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe + monoagentcli-windows-amd64-bundled.exe (save both in the same folder)
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.115.5/monoagentcli-darwin-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (x86_64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.115.5/monoagentcli-linux-amd64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (arm64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.115.5/monoagentcli-linux-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Self-update (once installed)
monoagentcli update

Chrome Extension

Bridges monoagentcli to your real, already-logged-in Chrome browser. Not on the Web Store — download, unzip, and load unpacked:

  1. Download monoagent-chrome-extension.zip and unzip it
  2. Open chrome://extensions, enable Developer mode
  3. Click Load unpacked and select the unzipped chrome-extension folder

v0.115.4

View on GitHub

What's New in v0.115.4

🐛 Bug Fixes

  • bound task_get history, flag task_list truncation, guard unexported arg fields

🔄 Other Changes

  • Merge pull request #411 from monoes/fix/tasks-mcp-bounds

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe + monoagentcli-windows-amd64-bundled.exe (save both in the same folder)
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.115.4/monoagentcli-darwin-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (x86_64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.115.4/monoagentcli-linux-amd64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (arm64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.115.4/monoagentcli-linux-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Self-update (once installed)
monoagentcli update

Chrome Extension

Bridges monoagentcli to your real, already-logged-in Chrome browser. Not on the Web Store — download, unzip, and load unpacked:

  1. Download monoagent-chrome-extension.zip and unzip it
  2. Open chrome://extensions, enable Developer mode
  3. Click Load unpacked and select the unzipped chrome-extension folder

v0.115.3

View on GitHub

What's New in v0.115.3

🐛 Bug Fixes

  • keep focus on a card moved by key, close the drawer on Escape; add the board model's changes and label helpers (#372)

🔄 Other Changes

  • Merge pull request #410 from monoes/fix/tasks-board-browser-372

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe + monoagentcli-windows-amd64-bundled.exe (save both in the same folder)
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.115.3/monoagentcli-darwin-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (x86_64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.115.3/monoagentcli-linux-amd64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (arm64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.115.3/monoagentcli-linux-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Self-update (once installed)
monoagentcli update

Chrome Extension

Bridges monoagentcli to your real, already-logged-in Chrome browser. Not on the Web Store — download, unzip, and load unpacked:

  1. Download monoagent-chrome-extension.zip and unzip it
  2. Open chrome://extensions, enable Developer mode
  3. Click Load unpacked and select the unzipped chrome-extension folder

v0.115.2

View on GitHub

What's New in v0.115.2

🐛 Bug Fixes

  • stop the detached-start capture timeouts racing under load

🔄 Other Changes

  • Merge pull request #409 from monoes/fix/org-start-drain-timeouts

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe + monoagentcli-windows-amd64-bundled.exe (save both in the same folder)
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.115.2/monoagentcli-darwin-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (x86_64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.115.2/monoagentcli-linux-amd64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (arm64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.115.2/monoagentcli-linux-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Self-update (once installed)
monoagentcli update

Chrome Extension

Bridges monoagentcli to your real, already-logged-in Chrome browser. Not on the Web Store — download, unzip, and load unpacked:

  1. Download monoagent-chrome-extension.zip and unzip it
  2. Open chrome://extensions, enable Developer mode
  3. Click Load unpacked and select the unzipped chrome-extension folder

v0.115.1

View on GitHub

What's New in v0.115.1

🔄 Other Changes

  • Merge pull request #406 from monoes/test/tasks-mcp-smoke-371
  • test(mcp): mutation check covers every task tool, baseline run first; smoke waits for responses
  • Merge remote-tracking branch 'origin/master' into test/tasks-mcp-smoke-371
  • test(mcp): smoke and mutation-proof scripts for the tasks-only server

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe + monoagentcli-windows-amd64-bundled.exe (save both in the same folder)
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.115.1/monoagentcli-darwin-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (x86_64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.115.1/monoagentcli-linux-amd64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (arm64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.115.1/monoagentcli-linux-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Self-update (once installed)
monoagentcli update

Chrome Extension

Bridges monoagentcli to your real, already-logged-in Chrome browser. Not on the Web Store — download, unzip, and load unpacked:

  1. Download monoagent-chrome-extension.zip and unzip it
  2. Open chrome://extensions, enable Developer mode
  3. Click Load unpacked and select the unzipped chrome-extension folder

v0.115.0

View on GitHub

What's New in v0.115.0

✨ New Features

  • sortable indexed timestamp, delete command and keyset cursor paging
  • FLIP card motion, capture help and empty-column hints on the Tasks tab

🐛 Bug Fixes

  • backfill published_ts by truncation and build cursors from the stored column
  • require the unit's MainPID or ExecStart to own a bridge found in its cgroup
  • make board FLIP scroll-, resize- and visibility-safe; follow reduced-motion live
  • recognise a user service whose bridge runs under a wrapper shell via cgroup
  • retry a locked write a few times with a short backoff

🔄 Other Changes

  • Merge pull request #407 from monoes/feat/publication-history-ts-delete-cursor
  • Merge pull request #403 from monoes/worktree-wf_e9b02d00-fda-3
  • Merge pull request #405 from monoes/worktree-wf_e9b02d00-fda-5
  • Merge pull request #401 from monoes/fix/tasks-busy-retry
  • Merge remote-tracking branch 'origin/master' into worktree-wf_e9b02d00-fda-3
  • Merge remote-tracking branch 'origin/master' into work
  • Merge remote-tracking branch 'origin/master' into fix-flip-review
  • Merge origin/master into fix/tasks-busy-retry

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe + monoagentcli-windows-amd64-bundled.exe (save both in the same folder)
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.115.0/monoagentcli-darwin-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (x86_64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.115.0/monoagentcli-linux-amd64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (arm64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.115.0/monoagentcli-linux-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Self-update (once installed)
monoagentcli update

Chrome Extension

Bridges monoagentcli to your real, already-logged-in Chrome browser. Not on the Web Store — download, unzip, and load unpacked:

  1. Download monoagent-chrome-extension.zip and unzip it
  2. Open chrome://extensions, enable Developer mode
  3. Click Load unpacked and select the unzipped chrome-extension folder

v0.114.0

View on GitHub

What's New in v0.114.0

✨ New Features

  • the floating panel in a closed shadow root, answering real clicks only, with a task button

🔄 Other Changes

  • Merge pull request #408 from monoes/fix/tests-363-flakes
  • Merge pull request #402 from monoes/feat/tasks-360-selection-panel
  • test(flakes): mock the keychain for the CLI tests and pin timing in three load flakes

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe + monoagentcli-windows-amd64-bundled.exe (save both in the same folder)
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.114.0/monoagentcli-darwin-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (x86_64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.114.0/monoagentcli-linux-amd64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (arm64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.114.0/monoagentcli-linux-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Self-update (once installed)
monoagentcli update

Chrome Extension

Bridges monoagentcli to your real, already-logged-in Chrome browser. Not on the Web Store — download, unzip, and load unpacked:

  1. Download monoagent-chrome-extension.zip and unzip it
  2. Open chrome://extensions, enable Developer mode
  3. Click Load unpacked and select the unzipped chrome-extension folder

v0.113.1

View on GitHub

What's New in v0.113.1

🐛 Bug Fixes

  • fail loudly on duplicate migration version numbers

🔄 Other Changes

  • Merge pull request #382 from monoes/fix/migration-duplicate-guard
  • Merge master
  • Merge master

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe + monoagentcli-windows-amd64-bundled.exe (save both in the same folder)
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.113.1/monoagentcli-darwin-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (x86_64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.113.1/monoagentcli-linux-amd64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (arm64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.113.1/monoagentcli-linux-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Self-update (once installed)
monoagentcli update

Chrome Extension

Bridges monoagentcli to your real, already-logged-in Chrome browser. Not on the Web Store — download, unzip, and load unpacked:

  1. Download monoagent-chrome-extension.zip and unzip it
  2. Open chrome://extensions, enable Developer mode
  3. Click Load unpacked and select the unzipped chrome-extension folder

v0.113.0

View on GitHub

What's New in v0.113.0

✨ New Features

  • Add a task box in the side panel
  • Add selection/page as task menu items and the add-task shortcut
  • tasks on the toolbar badge and the worker wired to the task bridge
  • the extension worker's task bridge: queue, flush, sender checks, feedback
  • task.add on the extension channel, the bridge's task sink and the extension's task outbox

🔄 Other Changes

  • Merge pull request #394 from monoes/feat/tasks-board-extension
  • Merge master
  • Merge master

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe + monoagentcli-windows-amd64-bundled.exe (save both in the same folder)
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.113.0/monoagentcli-darwin-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (x86_64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.113.0/monoagentcli-linux-amd64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Linux (arm64)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.113.0/monoagentcli-linux-arm64 -o monoagentcli && chmod +x monoagentcli && sudo mv monoagentcli /usr/local/bin/

# Self-update (once installed)
monoagentcli update

Chrome Extension

Bridges monoagentcli to your real, already-logged-in Chrome browser. Not on the Web Store — download, unzip, and load unpacked:

  1. Download monoagent-chrome-extension.zip and unzip it
  2. Open chrome://extensions, enable Developer mode
  3. Click Load unpacked and select the unzipped chrome-extension folder

v0.2.19

View on GitHub

MonoClip v0.2.19

Adds checklists to the note editor.

  • Insert checklist items with the new ☑ toolbar button.
  • Continue a checklist by pressing Enter.
  • Save and reopen checked and unchecked items using Markdown task lists.

v0.2.9

View on GitHub

MonoClip v0.2.9

What's New

Auto-Update

  • Fully automatic updates — clicking "⬆ Update" in the tray now handles everything:
    • Homebrew users: runs brew upgrade --cask mono-clip, waits for completion, then relaunches
    • Direct installs: downloads the DMG, mounts it, copies to /Applications, unmounts, then relaunches
  • Progress toasts show status (Downloading, Installing, Relaunching)
  • Error toast shown with reason if anything fails

Install

brew tap nokhodian/tap && brew install --cask mono-clip

Or download MonoClip_0.2.9_aarch64.dmg below.

v0.2.8

View on GitHub

MonoClip v0.2.8

What's New

Bug Fix

  • Fixed clipboard capture stopping permanently — the previous fix used an unsafe NSPasteboard API on a background thread without an autorelease pool, causing intermittent crashes that silently killed the watcher with no recovery
  • Watcher now auto-restarts if anything unexpected happens (panic recovery)
  • arboard file-list reads are isolated so they can't crash the watcher thread

Install

brew tap nokhodian/tap && brew install --cask mono-clip

Or download MonoClip_0.2.8_aarch64.dmg below.

v0.2.7

View on GitHub

MonoClip v0.2.7

What's New

Bug Fix

  • Fixed clipboard capture reliability — clips now land in Inbox consistently on every Cmd+C:
    • Uses NSPasteboard changeCount via FFI to detect changes instantly instead of polling content hashes
    • Reuses a single arboard instance (was creating a new one every 500ms, causing read interference)
    • Poll interval reduced from 500ms to 250ms
    • Folder shortcut sentinel strings are now filtered so they never appear in Inbox

Install

brew tap nokhodian/tap && brew install --cask mono-clip

Or download MonoClip_0.2.7_aarch64.dmg below.

v0.2.6

View on GitHub

MonoClip v0.2.6

What's New

Bug Fix

  • Drag & drop now works — fixed Tauri's built-in file drop handler intercepting HTML5 drag events, preventing clips from being dropped onto folders

Improvements

  • Version shown in Settings — app version now displayed at the bottom of the Settings panel

Install

brew tap nokhodian/tap && brew install --cask mono-clip

Or download MonoClip_0.2.6_aarch64.dmg below.

v0.2.5

View on GitHub

MonoClip v0.2.5

What's New

Features

  • Drag & drop clips between folders — grab any clip card and drop it on a folder in the sidebar to move it
  • Right-click folder context menu (works on Inbox too):
    • 📄 Export to File — downloads all clips in the folder as a .txt file
    • 🧹 Clear All Clips — removes all non-pinned clips (two-tap safety confirm)
    • ✏️ Edit / 🗑️ Delete still available for custom folders

Bug Fix (v0.2.4)

  • Fixed iCloud Universal Clipboard interference — folder shortcut keys no longer accidentally capture clipboard content pushed from iPhone/iPad

Install

brew tap nokhodian/tap && brew install --cask mono-clip

Or download MonoClip_0.2.5_aarch64.dmg below.

v0.2.4

View on GitHub

MonoClip v0.2.4

What's New

Bug Fix

  • Fixed iCloud Universal Clipboard interference — folder shortcut keys no longer accidentally capture clipboard content pushed from iPhone/iPad via iCloud. Uses a sentinel-based detection instead of before/after comparison to avoid the race condition.

Install

brew tap nokhodian/tap && brew install --cask mono-clip

Or download MonoClip_0.2.4_aarch64.dmg below.

v0.2.3

View on GitHub

MonoClip v0.2.3

What's New

Bug Fixes

  • Fixed clip timestamps — clips no longer show incorrect "2h ago"; SQLite UTC times are now parsed correctly in the UI
  • Fixed grid layout order — clips now flow left→right, top→bottom (row-first) instead of column-first; newest items always appear at top-left

New Features

  • Hourly update checker — MonoClip now checks GitHub releases every hour and shows "⬆ Update Available" in the tray menu when a new version is found
  • One-click update — clicking the update menu item runs brew upgrade --cask mono-clip (Homebrew installs) or opens the releases page (direct installs)

Install

brew tap nokhodian/tap && brew install --cask mono-clip

Or download MonoClip_0.2.3_aarch64.dmg below.

v0.2.2

View on GitHub

MonoClip v0.2.2

Bug fixes

  • Clean Now now also purges already-deleted (trashed) clips, and shows "Nothing to clean yet" instead of silent 0 count
  • Clear All Clips button added — deletes everything except pinned clips (tap twice to confirm)
  • ⌫ / Delete key now deletes whichever clip is hovered — no need to find the tiny ✕ button

v0.2.1

View on GitHub

MonoClip v0.2.1

What's new

Settings — Permissions section

  • Accessibility status — shows ✅ Granted or ⚠️ Not Granted with a direct Open Settings → button that takes you straight to System Settings → Privacy → Accessibility
  • Launch at Login — moved into the Permissions section with an explanation that it appears under Background Items in Login Items (normal for menu bar apps)
  • mclip CLI — expanded description explaining what it enables, including AI/MCP usage

Bug fixes

  • Launch-at-login toggle now correctly enables/disables the macOS LaunchAgent (previously saved to DB only)
  • LaunchAgent state is now re-synced on every app startup to prevent drift

v0.2.0

View on GitHub

MonoClip v0.2.0

What's new

🖼️ Images & Files

  • Copy an image — it appears as a thumbnail in your inbox
  • Copy a file or folder in Finder — captures the full path (not just the filename)

🖥️ mclip CLI

  • Ships automatically with the app — install once via Settings → Install mclip CLI
  • Full clip and folder management from your terminal
  • mclip get <id> | pbcopy — pipe any clip back to your clipboard

🤖 AI Integration

  • mclip context — prints a ready-to-paste markdown block describing all commands; drop it into any AI chat or save to CLAUDE.md / .cursorrules
  • mclip mcp — starts a JSON-RPC stdio MCP server so Claude Desktop, Cursor, and Windsurf can call your clipboard directly as native tools

📖 Help Panel

  • New Help button in the sidebar with keyboard shortcuts, CLI reference, and a one-click Copy AI Context button

🐛 Reliability

  • Fixed clipboard items occasionally not appearing in Inbox
  • Fixed file copy capturing only filename instead of full path

v0.1.0

View on GitHub

MonoClip v0.1.0

MonoClip v0.1.0 — Initial Release

🎉 First release of MonoClip, a blazing-fast macOS clipboard manager.

What's included

  • Multi-folder clipboard organization
  • Global shortcut routing (save selected text directly to a folder)
  • Keyboard shortcut recorder
  • Auto-cleanup, search, pin, copy-on-click
  • Glass-morphism UI with spring animations
  • Menu bar tray icon — no Dock presence

Install via Homebrew

brew tap nokhodian/tap
brew install --cask mono-clip

Manual Install

Download MonoClip_0.1.0_aarch64.dmg below — Apple Silicon only.

v1.4.0

View on GitHub

Monotask v1.4.0

Monotask v1.4.0

Desktop App (macOS) — via Homebrew

``` brew tap nokhodian/tap brew install --cask monotask ```

CLI — via Homebrew

``` brew tap nokhodian/tap brew install monotask ```

Manual install

Platform Download
macOS Desktop (Apple Silicon) `Monotask-v1.4.0-aarch64.dmg`
Windows Desktop (x64) `Monotask-v1.4.0-x64-setup.exe`
Windows CLI (x64) `monotask-v1.4.0-x86_64-windows.zip`
macOS CLI (Apple Silicon) `monotask-v1.4.0-aarch64-apple-darwin.tar.gz`
macOS CLI (Intel) `monotask-v1.4.0-x86_64-apple-darwin.tar.gz`
Linux x86_64 CLI `monotask-v1.4.0-x86_64-linux.tar.gz`

v1.3.0

View on GitHub

v1.3.0 — iroh QUIC, card links, mentions, deep links, chat CLI

What's new in v1.3.0

Net layer — iroh QUIC transport

  • Replaced libp2p v0.53 with iroh 1.0.1 — QUIC-native P2P sync, no more libp2p complexity
  • Protocol version negotiation — VersionHello/VersionReject exchange on every new connection; incompatible peers are cleanly rejected
  • Peer presence heartbeats — SyncRequest::Presence broadcast every 30 s; recipients update space_members.presence in SQLite
  • HLC remote clock — clock::observe_remote() advances the logical counter from any remote HLC string

Card links (CRDT)

  • add_card_link / remove_card_link / list_card_links in monotask-core::card
  • Stored as a links Map on the Automerge card object
  • Exposed as add_card_link_cmd / remove_card_link_cmd / list_card_links_cmd Tauri commands
  • CLI: monotaskcli card link add/list/remove

@Mention scanning

  • index_mentions() scans card descriptions for @token patterns after every update_card_cmd
  • Results indexed in mention_index SQLite table
  • CLI: monotaskcli card mentions <BOARD_ID> <CARD_ID>

Deep links

  • monotask://board/<id> and monotask://board/<id>/card/<id> registered via tauri-plugin-deep-link
  • Deep link events forwarded to JS, which navigates to the board/card automatically
  • CLI: monotaskcli app open <url>

New CLI commands

  • monotaskcli board undo/redo — undo/redo via SQLite stack
  • monotaskcli chat send/list — send and list chat messages per space
  • monotaskcli card link add/list/remove — card-to-card links
  • monotaskcli card mentions — query @mention index
  • monotaskcli app open <url> — open deep link in desktop app

CLI binary renamed

  • Binary is now monotaskcli (was monotask) — resolves output filename collision with the Tauri app binary
  • monotask binary is now exclusively the Tauri desktop app

Quality

  • Zero compiler warnings across all workspace crates
  • Integration tests updated: make_space helper, --space flag threading, board list object format
  • All 100+ tests passing (0 failures)

v1.1.6

View on GitHub

Monotask v1.1.6

Monotask v1.1.6

Desktop App (macOS) — via Homebrew

``` brew tap nokhodian/tap brew install --cask monotask ```

CLI — via Homebrew

``` brew tap nokhodian/tap brew install monotask ```

Manual install

Platform Download
macOS Desktop (Apple Silicon) `Monotask-v1.1.6-aarch64.dmg`
Windows Desktop (x64) `Monotask-v1.1.6-x64-setup.exe`
Windows CLI (x64) `monotask-v1.1.6-x86_64-windows.zip`
macOS CLI (Apple Silicon) `monotask-v1.1.6-aarch64-apple-darwin.tar.gz`
macOS CLI (Intel) `monotask-v1.1.6-x86_64-apple-darwin.tar.gz`
Linux x86_64 CLI `monotask-v1.1.6-x86_64-linux.tar.gz`

v1.1.5

View on GitHub

Monotask v1.1.5

Monotask v1.1.5

Desktop App (macOS) — via Homebrew

``` brew tap nokhodian/tap brew install --cask monotask ```

CLI — via Homebrew

``` brew tap nokhodian/tap brew install monotask ```

Manual install

Platform Download
macOS Desktop (Apple Silicon) `Monotask-v1.1.5-aarch64.dmg`
Windows Desktop (x64) `Monotask-v1.1.5-x64-setup.exe`
Windows CLI (x64) `monotask-v1.1.5-x86_64-windows.zip`
macOS CLI (Apple Silicon) `monotask-v1.1.5-aarch64-apple-darwin.tar.gz`
macOS CLI (Intel) `monotask-v1.1.5-x86_64-apple-darwin.tar.gz`
Linux x86_64 CLI `monotask-v1.1.5-x86_64-linux.tar.gz`

v1.1.1

View on GitHub

Monotask v1.1.1

Monotask v1.1.1

Desktop App (macOS) — via Homebrew

``` brew tap nokhodian/tap brew install --cask monotask ```

CLI — via Homebrew

``` brew tap nokhodian/tap brew install monotask ```

Manual install

Platform Download
macOS Desktop (Apple Silicon) `Monotask-v1.1.1-aarch64.dmg`
Windows Desktop (x64) `Monotask-v1.1.1-x64-setup.exe`
Windows CLI (x64) `monotask-v1.1.1-x86_64-windows.zip`
macOS CLI (Apple Silicon) `monotask-v1.1.1-aarch64-apple-darwin.tar.gz`
macOS CLI (Intel) `monotask-v1.1.1-x86_64-apple-darwin.tar.gz`
Linux x86_64 CLI `monotask-v1.1.1-x86_64-linux.tar.gz`

v1.1.0

View on GitHub

Monotask v1.1.0

Monotask v1.1.0

Desktop App (macOS) — via Homebrew

``` brew tap nokhodian/tap brew install --cask monotask ```

CLI — via Homebrew

``` brew tap nokhodian/tap brew install monotask ```

Manual install

Platform Download
macOS Desktop (Apple Silicon) `Monotask-v1.1.0-aarch64.dmg`
Windows Desktop (x64) `Monotask-v1.1.0-x64-setup.exe`
Windows CLI (x64) `monotask-v1.1.0-x86_64-windows.zip`
macOS CLI (Apple Silicon) `monotask-v1.1.0-aarch64-apple-darwin.tar.gz`
macOS CLI (Intel) `monotask-v1.1.0-x86_64-apple-darwin.tar.gz`
Linux x86_64 CLI `monotask-v1.1.0-x86_64-linux.tar.gz`

v1.0.0

View on GitHub

Monotask v1.0.0

Monotask v1.0.0

Desktop App (macOS) — via Homebrew

``` brew tap nokhodian/tap brew install --cask monotask ```

CLI — via Homebrew

``` brew tap nokhodian/tap brew install monotask ```

Manual install

Platform Download
macOS Desktop (Apple Silicon) `Monotask-v1.0.0-aarch64.dmg`
Windows Desktop (x64) `Monotask-v1.0.0-x64-setup.exe`
Windows CLI (x64) `monotask-v1.0.0-x86_64-windows.zip`
macOS CLI (Apple Silicon) `monotask-v1.0.0-aarch64-apple-darwin.tar.gz`
macOS CLI (Intel) `monotask-v1.0.0-x86_64-apple-darwin.tar.gz`
Linux x86_64 CLI `monotask-v1.0.0-x86_64-linux.tar.gz`

v0.4.4

View on GitHub

Monotask v0.4.4

Monotask v0.4.4

Desktop App (macOS) — via Homebrew

``` brew tap nokhodian/tap brew install --cask monotask ```

CLI — via Homebrew

``` brew tap nokhodian/tap brew install monotask ```

Manual install

Platform Download
macOS Desktop (Apple Silicon) `Monotask-v0.4.4-aarch64.dmg`
Windows Desktop (x64) `Monotask-v0.4.4-x64-setup.exe`
Windows CLI (x64) `monotask-v0.4.4-x86_64-windows.zip`
macOS CLI (Apple Silicon) `monotask-v0.4.4-aarch64-apple-darwin.tar.gz`
macOS CLI (Intel) `monotask-v0.4.4-x86_64-apple-darwin.tar.gz`
Linux x86_64 CLI `monotask-v0.4.4-x86_64-linux.tar.gz`

v0.4.3

View on GitHub

Monotask v0.4.3

Monotask v0.4.3

Desktop App (macOS) — via Homebrew

``` brew tap nokhodian/tap brew install --cask monotask ```

CLI — via Homebrew

``` brew tap nokhodian/tap brew install monotask ```

Manual install

Platform Download
macOS Desktop (Apple Silicon) `Monotask-v0.4.3-aarch64.dmg`
Windows Desktop (x64) `Monotask-v0.4.3-x64-setup.exe`
Windows CLI (x64) `monotask-v0.4.3-x86_64-windows.zip`
macOS CLI (Apple Silicon) `monotask-v0.4.3-aarch64-apple-darwin.tar.gz`
macOS CLI (Intel) `monotask-v0.4.3-x86_64-apple-darwin.tar.gz`
Linux x86_64 CLI `monotask-v0.4.3-x86_64-linux.tar.gz`

v0.4.2

View on GitHub

Monotask v0.4.2

Monotask v0.4.2

Desktop App (macOS) — via Homebrew

``` brew tap nokhodian/tap brew install --cask monotask ```

CLI — via Homebrew

``` brew tap nokhodian/tap brew install monotask ```

Manual install

Platform Download
macOS Desktop (Apple Silicon) `Monotask-v0.4.2-aarch64.dmg`
Windows Desktop (x64) `Monotask-v0.4.2-x64-setup.exe`
Windows CLI (x64) `monotask-v0.4.2-x86_64-windows.zip`
macOS CLI (Apple Silicon) `monotask-v0.4.2-aarch64-apple-darwin.tar.gz`
macOS CLI (Intel) `monotask-v0.4.2-x86_64-apple-darwin.tar.gz`
Linux x86_64 CLI `monotask-v0.4.2-x86_64-linux.tar.gz`

v0.4.1

View on GitHub

Monotask v0.4.1

Monotask v0.4.1

Desktop App (macOS) — via Homebrew

``` brew tap nokhodian/tap brew install --cask monotask ```

CLI — via Homebrew

``` brew tap nokhodian/tap brew install monotask ```

Manual install

Platform Download
macOS Desktop (Apple Silicon) `Monotask-v0.4.1-aarch64.dmg`
Windows Desktop (x64) `Monotask-v0.4.1-x64-setup.exe`
Windows CLI (x64) `monotask-v0.4.1-x86_64-windows.zip`
macOS CLI (Apple Silicon) `monotask-v0.4.1-aarch64-apple-darwin.tar.gz`
macOS CLI (Intel) `monotask-v0.4.1-x86_64-apple-darwin.tar.gz`
Linux x86_64 CLI `monotask-v0.4.1-x86_64-linux.tar.gz`

v0.4.0

View on GitHub

Monotask v0.4.0

Monotask v0.4.0

Desktop App (macOS) — via Homebrew

``` brew tap nokhodian/tap brew install --cask monotask ```

CLI — via Homebrew

``` brew tap nokhodian/tap brew install monotask ```

Manual install

Platform Download
macOS Desktop (Apple Silicon) `Monotask-v0.4.0-aarch64.dmg`
Windows Desktop (x64) `Monotask-v0.4.0-x64-setup.exe`
Windows CLI (x64) `monotask-v0.4.0-x86_64-windows.zip`
macOS CLI (Apple Silicon) `monotask-v0.4.0-aarch64-apple-darwin.tar.gz`
macOS CLI (Intel) `monotask-v0.4.0-x86_64-apple-darwin.tar.gz`
Linux x86_64 CLI `monotask-v0.4.0-x86_64-linux.tar.gz`

v0.3.21

View on GitHub

Monotask v0.3.21

Monotask v0.3.21

Desktop App (macOS) — via Homebrew

``` brew tap nokhodian/tap brew install --cask monotask ```

CLI — via Homebrew

``` brew tap nokhodian/tap brew install monotask ```

Manual install

Platform Download
macOS Desktop (Apple Silicon) `Monotask-v0.3.21-aarch64.dmg`
Windows Desktop (x64) `Monotask-v0.3.21-x64-setup.exe`
Windows CLI (x64) `monotask-v0.3.21-x86_64-windows.zip`
macOS CLI (Apple Silicon) `monotask-v0.3.21-aarch64-apple-darwin.tar.gz`
macOS CLI (Intel) `monotask-v0.3.21-x86_64-apple-darwin.tar.gz`
Linux x86_64 CLI `monotask-v0.3.21-x86_64-linux.tar.gz`

v0.3.20

View on GitHub

Monotask v0.3.20

Monotask v0.3.20

Desktop App (macOS) — via Homebrew

``` brew tap nokhodian/tap brew install --cask monotask ```

CLI — via Homebrew

``` brew tap nokhodian/tap brew install monotask ```

Manual install

Platform Download
macOS Desktop (Apple Silicon) `Monotask-v0.3.20-aarch64.dmg`
Windows Desktop (x64) `Monotask-v0.3.20-x64-setup.exe`
Windows CLI (x64) `monotask-v0.3.20-x86_64-windows.zip`
macOS CLI (Apple Silicon) `monotask-v0.3.20-aarch64-apple-darwin.tar.gz`
macOS CLI (Intel) `monotask-v0.3.20-x86_64-apple-darwin.tar.gz`
Linux x86_64 CLI `monotask-v0.3.20-x86_64-linux.tar.gz`

v0.3.19

View on GitHub

Monotask v0.3.19

Monotask v0.3.19

Desktop App (macOS) — via Homebrew

``` brew tap nokhodian/tap brew install --cask monotask ```

CLI — via Homebrew

``` brew tap nokhodian/tap brew install monotask ```

Manual install

Platform Download
macOS Desktop (Apple Silicon) `Monotask-v0.3.19-aarch64.dmg`
Windows Desktop (x64) `Monotask-v0.3.19-x64-setup.exe`
Windows CLI (x64) `monotask-v0.3.19-x86_64-windows.zip`
macOS CLI (Apple Silicon) `monotask-v0.3.19-aarch64-apple-darwin.tar.gz`
macOS CLI (Intel) `monotask-v0.3.19-x86_64-apple-darwin.tar.gz`
Linux x86_64 CLI `monotask-v0.3.19-x86_64-linux.tar.gz`

v0.3.18

View on GitHub

Monotask v0.3.18

Monotask v0.3.18

Desktop App (macOS) — via Homebrew

``` brew tap nokhodian/tap brew install --cask monotask ```

CLI — via Homebrew

``` brew tap nokhodian/tap brew install monotask ```

Manual install

Platform Download
macOS Desktop (Apple Silicon) `Monotask-v0.3.18-aarch64.dmg`
Windows Desktop (x64) `Monotask-v0.3.18-x64-setup.exe`
Windows CLI (x64) `monotask-v0.3.18-x86_64-windows.zip`
macOS CLI (Apple Silicon) `monotask-v0.3.18-aarch64-apple-darwin.tar.gz`
macOS CLI (Intel) `monotask-v0.3.18-x86_64-apple-darwin.tar.gz`
Linux x86_64 CLI `monotask-v0.3.18-x86_64-linux.tar.gz`

v0.3.17

View on GitHub

Monotask v0.3.17

Monotask v0.3.17

Desktop App (macOS) — via Homebrew

``` brew tap nokhodian/tap brew install --cask monotask ```

CLI — via Homebrew

``` brew tap nokhodian/tap brew install monotask ```

Manual install

Platform Download
macOS Desktop (Apple Silicon) `Monotask-v0.3.17-aarch64.dmg`
Windows Desktop (x64) `Monotask-v0.3.17-x64-setup.exe`
Windows CLI (x64) `monotask-v0.3.17-x86_64-windows.zip`
macOS CLI (Apple Silicon) `monotask-v0.3.17-aarch64-apple-darwin.tar.gz`
macOS CLI (Intel) `monotask-v0.3.17-x86_64-apple-darwin.tar.gz`
Linux x86_64 CLI `monotask-v0.3.17-x86_64-linux.tar.gz`

v0.3.16

View on GitHub

Monotask v0.3.16

Monotask v0.3.16

Desktop App (macOS) — via Homebrew

``` brew tap nokhodian/tap brew install --cask monotask ```

CLI — via Homebrew

``` brew tap nokhodian/tap brew install monotask ```

Manual install

Platform Download
macOS Desktop (Apple Silicon) `Monotask-v0.3.16-aarch64.dmg`
Windows Desktop (x64) `Monotask-v0.3.16-x64-setup.exe`
macOS CLI (Apple Silicon) `monotask-v0.3.16-aarch64-apple-darwin.tar.gz`
macOS CLI (Intel) `monotask-v0.3.16-x86_64-apple-darwin.tar.gz`
Linux x86_64 CLI `monotask-v0.3.16-x86_64-linux.tar.gz`

v0.3.15

View on GitHub

Monotask v0.3.15

Monotask v0.3.15

Desktop App (macOS) — via Homebrew

``` brew tap nokhodian/tap brew install --cask monotask ```

CLI — via Homebrew

``` brew tap nokhodian/tap brew install monotask ```

Manual install

Platform Download
macOS Desktop (Apple Silicon) `Monotask-v0.3.15-aarch64.dmg`
Windows Desktop (x64) `Monotask-v0.3.15-x64-setup.exe`
macOS CLI (Apple Silicon) `monotask-v0.3.15-aarch64-apple-darwin.tar.gz`
macOS CLI (Intel) `monotask-v0.3.15-x86_64-apple-darwin.tar.gz`
Linux x86_64 CLI `monotask-v0.3.15-x86_64-linux.tar.gz`

v0.3.14

View on GitHub

Monotask v0.3.14

Monotask v0.3.14

Desktop App (macOS) — via Homebrew

``` brew tap nokhodian/tap brew install --cask monotask ```

CLI — via Homebrew

``` brew tap nokhodian/tap brew install monotask ```

Manual install

Platform Download
macOS Desktop (Apple Silicon) `Monotask-v0.3.14-aarch64.dmg`
Windows Desktop (x64) `Monotask-v0.3.14-x64-setup.exe`
macOS CLI (Apple Silicon) `monotask-v0.3.14-aarch64-apple-darwin.tar.gz`
macOS CLI (Intel) `monotask-v0.3.14-x86_64-apple-darwin.tar.gz`
Linux x86_64 CLI `monotask-v0.3.14-x86_64-linux.tar.gz`

v0.3.13

View on GitHub

Monotask v0.3.13

Monotask v0.3.13

Desktop App (macOS) — via Homebrew

``` brew tap nokhodian/tap brew install --cask monotask ```

CLI — via Homebrew

``` brew tap nokhodian/tap brew install monotask ```

Manual install

Platform Download
macOS Desktop (Apple Silicon) `Monotask-v0.3.13-aarch64.dmg`
macOS CLI (Apple Silicon) `monotask-v0.3.13-aarch64-apple-darwin.tar.gz`
macOS CLI (Intel) `monotask-v0.3.13-x86_64-apple-darwin.tar.gz`
Linux x86_64 CLI `monotask-v0.3.13-x86_64-linux.tar.gz`

v0.3.12

View on GitHub

Monotask v0.3.12

Monotask v0.3.12

Desktop App (macOS) — via Homebrew

``` brew tap nokhodian/tap brew install --cask monotask ```

CLI — via Homebrew

``` brew tap nokhodian/tap brew install monotask ```

Manual install

Platform Download
macOS Desktop (Apple Silicon) `Monotask-v0.3.12-aarch64.dmg`
macOS CLI (Apple Silicon) `monotask-v0.3.12-aarch64-apple-darwin.tar.gz`
macOS CLI (Intel) `monotask-v0.3.12-x86_64-apple-darwin.tar.gz`
Linux x86_64 CLI `monotask-v0.3.12-x86_64-linux.tar.gz`

v0.3.11

View on GitHub

Monotask v0.3.11

Monotask v0.3.11

Desktop App (macOS) — via Homebrew

``` brew tap nokhodian/tap brew install --cask monotask ```

CLI — via Homebrew

``` brew tap nokhodian/tap brew install monotask ```

Manual install

Platform Download
macOS Desktop (Apple Silicon) `Monotask-v0.3.11-aarch64.dmg`
macOS CLI (Apple Silicon) `monotask-v0.3.11-aarch64-apple-darwin.tar.gz`
macOS CLI (Intel) `monotask-v0.3.11-x86_64-apple-darwin.tar.gz`
Linux x86_64 CLI `monotask-v0.3.11-x86_64-linux.tar.gz`

v0.3.10

View on GitHub

Monotask v0.3.10

Monotask v0.3.10

Desktop App (macOS) — via Homebrew

``` brew tap nokhodian/tap brew install --cask monotask ```

CLI — via Homebrew

``` brew tap nokhodian/tap brew install monotask ```

Manual install

Platform Download
macOS Desktop (Apple Silicon) `Monotask-v0.3.10-aarch64.dmg`
macOS CLI (Apple Silicon) `monotask-v0.3.10-aarch64-apple-darwin.tar.gz`
macOS CLI (Intel) `monotask-v0.3.10-x86_64-apple-darwin.tar.gz`
Linux x86_64 CLI `monotask-v0.3.10-x86_64-linux.tar.gz`

v0.3.9

View on GitHub

Monotask v0.3.9

Monotask v0.3.9

Desktop App (macOS) — via Homebrew

``` brew tap nokhodian/tap brew install --cask monotask ```

CLI — via Homebrew

``` brew tap nokhodian/tap brew install monotask ```

Manual install

Platform Download
macOS Desktop (Apple Silicon) `Monotask-v0.3.9-aarch64.dmg`
macOS CLI (Apple Silicon) `monotask-v0.3.9-aarch64-apple-darwin.tar.gz`
macOS CLI (Intel) `monotask-v0.3.9-x86_64-apple-darwin.tar.gz`
Linux x86_64 CLI `monotask-v0.3.9-x86_64-linux.tar.gz`

v0.3.8

View on GitHub

Monotask v0.3.8

Monotask v0.3.8

Desktop App (macOS) — via Homebrew

``` brew tap nokhodian/tap brew install --cask monotask ```

CLI — via Homebrew

``` brew tap nokhodian/tap brew install monotask ```

Manual install

Platform Download
macOS Desktop (Apple Silicon) `Monotask-v0.3.8-aarch64.dmg`
macOS CLI (Apple Silicon) `monotask-v0.3.8-aarch64-apple-darwin.tar.gz`
macOS CLI (Intel) `monotask-v0.3.8-x86_64-apple-darwin.tar.gz`
Linux x86_64 CLI `monotask-v0.3.8-x86_64-linux.tar.gz`

v0.3.7

View on GitHub

Monotask v0.3.7

Monotask v0.3.7

Desktop App (macOS) — via Homebrew

``` brew tap nokhodian/tap brew install --cask monotask ```

CLI — via Homebrew

``` brew tap nokhodian/tap brew install monotask ```

Manual install

Platform Download
macOS Desktop (Apple Silicon) `Monotask-v0.3.7-aarch64.dmg`
macOS CLI (Apple Silicon) `monotask-v0.3.7-aarch64-apple-darwin.tar.gz`
macOS CLI (Intel) `monotask-v0.3.7-x86_64-apple-darwin.tar.gz`
Linux x86_64 CLI `monotask-v0.3.7-x86_64-linux.tar.gz`

v0.3.6

View on GitHub

Monotask v0.3.6

Monotask v0.3.6

Desktop App (macOS) — via Homebrew

``` brew tap nokhodian/tap brew install --cask monotask ```

CLI — via Homebrew

``` brew tap nokhodian/tap brew install monotask ```

Manual install

Platform Download
macOS Desktop (Apple Silicon) `Monotask-v0.3.6-aarch64.dmg`
macOS CLI (Apple Silicon) `monotask-v0.3.6-aarch64-apple-darwin.tar.gz`
macOS CLI (Intel) `monotask-v0.3.6-x86_64-apple-darwin.tar.gz`
Linux x86_64 CLI `monotask-v0.3.6-x86_64-linux.tar.gz`

v0.3.5

View on GitHub

Monotask v0.3.5

Monotask v0.3.5

Desktop App (macOS) — via Homebrew

``` brew tap nokhodian/tap brew install --cask monotask ```

CLI — via Homebrew

``` brew tap nokhodian/tap brew install monotask ```

Manual install

Platform Download
macOS Desktop (Apple Silicon) `Monotask-v0.3.5-aarch64.dmg`
macOS CLI (Apple Silicon) `monotask-v0.3.5-aarch64-apple-darwin.tar.gz`
macOS CLI (Intel) `monotask-v0.3.5-x86_64-apple-darwin.tar.gz`
Linux x86_64 CLI `monotask-v0.3.5-x86_64-linux.tar.gz`

v0.3.4

View on GitHub

Monotask v0.3.4

Monotask v0.3.4

Desktop App (macOS) — via Homebrew

``` brew tap nokhodian/tap brew install --cask monotask ```

CLI — via Homebrew

``` brew tap nokhodian/tap brew install monotask ```

Manual install

Platform Download
macOS Desktop (Apple Silicon) `Monotask-v0.3.4-aarch64.dmg`
macOS CLI (Apple Silicon) `monotask-v0.3.4-aarch64-apple-darwin.tar.gz`
macOS CLI (Intel) `monotask-v0.3.4-x86_64-apple-darwin.tar.gz`
Linux x86_64 CLI `monotask-v0.3.4-x86_64-linux.tar.gz`