Changelog

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

v2.16.4

View on GitHub

[2.16.4] — 2026-09-25

Added

  • User-level agents are indexed and routed. Agents in ~/.claude/agents/** join the agent registry with origin user, so the prompt hook, monomind pick and the pick MCP tool can choose them in every project; a project agent with the same slug or name wins and the hidden one is listed as shadowed. The registry builder is now one CommonJS helper (.claude/helpers/agent-registry.cjs) shared by the CLI and the hooks, and every session start rebuilds a stale registry, so a new user agent is routed from the next session without running the CLI. monomind init and init upgrade build both routing indexes and print their counts, for example Indexed 89 agents (1 from ~/.claude/agents) and 569 skills (1 from ~/.claude/skills). pick --json agent entries carry origin, and doctor shows user and shadowed counts.
  • org_skill_show MCP tool. Input { name }; returns one Org-library skill's description, tags, tools, origin and body, read locally (catalog skills only while active for org). Picked Org skills now point at it, so they work without a global monomind install.
  • Agents & Skills guide. doc/concepts/agents-and-skills.md and a matching page on the docs site explain where agents, skills, slash commands and Org skills live, their frontmatter, how to add and verify each, and how picking works (with Routing as the mechanism deep-dive). The docs now carry auto-counted agent, skill, command and Org-skill totals checked by docs:counts:check.
  • pick-eval --logs measures picking on real use. node scripts/pick-eval.mjs --logs [dir] reads a project's hook logs and scores the current ranker (keyword, or --jev) against the agents actually spawned, with route statistics and the top disagreements (redacted previews only); --export FILE writes the labelled prompts as a tests/pick-eval dataset to review and curate. doctor -c pick adds a line real use: N spawns, followed X%, current ranker agrees Y% (top-3) once 10 spawns are recorded.
  • browse --session <name> now selects an isolated named session. (Fixes #318) The documented flag did nothing outside open, where it only restored saved state; every later --session command then silently acted on the newest session, so two "named" browsers were really one and one, or a snapshot/scroll call using -s for --selector on a named session, could return the wrong tab. Session records now carry a name: open/connect --session X start the session named X or re-open the live one, any other command with --session X acts on it and fails with No live browse session named "X" when there is none, and --session has no -s shorthand on snapshot/scroll (which use -s for --selector). A command with no --session still resolves the sole live session in the directory — named or not — and only refuses to guess when two or more are live. @monoes/monobrowse 1.0.23.

Changed

  • Picks ignore what a prompt rules out. The keyword ranker drops words in the scope of "rather than", "other than", "instead of", "except", "besides", "without", "not", "no" and similar cues, up to the next clause boundary, so "anything else pending rather than release" no longer picks release-manager; problem descriptions such as "is not loading" keep their words. Status questions like "anything else pending?" now count as trivial and get no [PICK].

Fixed

  • init --target antigravity gives Antigravity a working status bar. That target turns the helper component off, so no statusline.cjs was written anywhere and the status bar (.gemini/helpers/statusline.sh) printed nothing. Init now copies the helper tree into .gemini/helpers when Antigravity is selected without the helper component. It still installs no .claude/helpers or hooks.
  • init writes .gemini/helpers only when Antigravity is selected. Only Antigravity's status bar reads that copy of the helper tree, but init wrote it for every Claude or Codex-with-hooks setup, e.g. --platform claude or --target codex. Kimi's statusline reads .claude/helpers first, so it does not need it. An existing .gemini/helpers is not deleted, and init upgrade still refreshes it where it exists.
  • The org command reference covers every subcommand and flag. org events and org approvals were undocumented, along with flags such as run --resume/--budget-usd, create --goal/--schedule, questions --all and the --by resolver flags; serve --forward (which does not exist), the approve/deny arguments and the supervisor/test-loop arguments were wrong.
  • The metrics-db hook tests run again. They skipped themselves unless sql.js resolved from the repo root, a dependency the helper dropped long ago, and one test always failed; they now check the helper runs with no packages installed, and its nine real tests run.
  • monomind init --with-embeddings actually prepares embeddings. It shelled out to npx monomind@latest embeddings init, a command that does not exist, so it always printed "Embedding initialization skipped." It now runs in-process — the embeddings_init MCP tool writes .monomind/embeddings.json and downloads gte-modernbert-base with the same revision/dtype the memory bridge loads — and offline (or with MONOMIND_NO_LOCAL_EMBEDDINGS=1) it continues with a warning pointing at monomind doc eval --provision-model.
  • init and doc ingest --embedder default to and describe the embedding model memory search actually uses. Init presets, init --embedding-model, the init wizard and hooks pretrain defaulted to Xenova/all-MiniLM-L6-v2 (384d) while the memory bridge always embeds with Alibaba-NLP/gte-modernbert-base (768d); the default is now gte-modernbert-base everywhere (MiniLM and MPNet stay accepted choices, and existing .monomind/embeddings.json files are untouched). doc ingest --embedder help said it picked minilm (384d) or bge-m3 (1024d); the flag never worked that way — ingest always shares the 768d memory-bridge store — so it is now documented as deprecated and a no-op, and a non-minilm value warns that it is ignored.
  • A sandboxed Claude role's Bash shell stays pinned to its cwd. (Fixes #339) Claude Code's sandbox makes an existing hooks or config entry read-only from the session cwd down to the shell's current directory, and the shell's directory persists between Bash calls — so a role that cd'd into a package directory could get a sibling package bind-mounted read-only and fail its tests with EROFS. A sandboxed role now runs with CLAUDE_BASH_MAINTAIN_PROJECT_WORKING_DIR=1, so its shell returns to the cwd after every command.
  • monograph watch no longer silently drops a rebuild. (Fixes #338) When the cross-process build lock was held by another monograph command, a queued watch rebuild was skipped and the change batch was dropped for good, while the watcher and the MCP monograph_watch tool still printed a success message. A shared rebuild queue now serializes watch rebuilds, folds changes that arrive mid-build into the next one, and retries a lock-skipped batch until it builds; each rebuild logs its real outcome, for example Graph updated in 9.7s — nodes +2 (now 20653), … or Rebuild deferred — another build is in progress; retrying …. @monoes/monograph 1.6.10.
  • mastermind-agents hire writes role entries org run accepts as current-format. It appended new roles with the retired agent_type key, so runorg's legacy check treated an otherwise current-format org as needing migration. hire now writes type (default specialist), requires reports_to to name an existing role, and runs monomind org validate afterward; list shows type, inspect lists direct reports instead of reading the retired communication array, and remove no longer writes a communication key.

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

v2.16.3

View on GitHub

[2.16.3] — 2026-09-25

Added

  • monomind doctor --json, advertised as capability doctor-json. stdout holds one JSON document with every check's result, the component id that re-runs it (-c), and how its fix is applied: auto (local and repeatable, by --fix), confirm (installs software or runs network or sudo commands, so the caller asks a person first, then passes the flag the result names) or manual. With --fix it also lists what was fixed. Everything a check or fix prints, and the subprocesses a fix runs, go to stderr. An unknown -c name comes back as the payload's error. mono-agent uses this to show and fix monomind's checks in its Settings › System health, per project. Contract: doc/agent-exec-protocol.md §10.
  • monomind doctor --read-only and --offline, advertised as capabilities doctor-read-only and doctor-offline. (Fixes #335) A read-only run changes no file in the project or $HOME; it is the default under --json unless --fix or --install is given, and --read-only asks for it in the human output. --offline skips every check that uses the network. A check that cannot run in the mode is reported with status skipped and a skipped_reason (read-only or offline); the JSON payload also gains read_only, offline and summary.skipped. --read-only --fix and --offline --install are refused. mono-agent can now include monomind's checks in its read-only monoagentcli doctor default. Contract: doc/agent-exec-protocol.md §10.1.
  • agent scan --json entries carry install and login_hint. install is the install hint in a shape a caller can run without a shell — npm packages, an https install script for bash/sh, or manual for anything else — and login_hint is the runtime's sign-in command, as text to show a person — never something to run. An install script URL must be a plain https URL; a hint with shell syntax, credentials in the URL or an npm version range is manual. mono-agent's agent install and its Agents page use them.
  • Claude sees the prompt's pick as one [PICK] line. The UserPromptSubmit hook now prints [PICK] agent: <name> · skill: <invoke> into Claude's context when it is confident: a Jev decision-model answer at or above MONOMIND_JEV_MIN_CONFIDENCE (0.6), or a keyword agent with a relevance score of at least 2 and a 1.5× lead over the runner-up (a keyword skill needs a score of 4). <name> is the agent's frontmatter name, the value the Task tool takes as subagent_type. Ties and weak overlap print nothing. The line is printed even under MONOMIND_HOOK_QUIET, which monomind init sets; the other banners stay quiet. Task notifications, reminder-only turns, slash-command expansions and local-command output get no pick. The generated CLAUDE.md tells Claude to follow a [PICK] line unless it is clearly wrong and to call the pick tool before choosing a subagent itself.
  • pick MCP tool (mcp__monomind__pick). Input { task, kind?: "agents" | "skills" | "both", categories?, top?: 1-20 }; it returns the same JSON as monomind pick --json plus a one-line summary. It is in the core tool set, so the advertised MCP tool list grows by one.
  • The hooks log whether a pick was followed, and a bounded prior learns from it. A new PreToolUse hook on Task|Agent spawns writes .monomind/pick-adherence.jsonl (the session's pick, the subagent_type actually spawned, followed); it only observes. .claude/helpers/pick-stats.cjs folds adherence and SubagentStop outcomes into .monomind/pick-stats.json at SubagentStop and SessionEnd. An agent with at least 5 observations gets a factor between 0.85 and 1.15 from its success and adoption rates, applied to keyword agent scores in monomind pick and the prompt hook. The largest swing (about 1.35×) is below the 1.5× lead a [PICK] needs, so history breaks near-ties but never overturns a clear match; Jev rankings are not re-ranked. monomind pick --explain shows score = baseScore × prior and the pick history, and readPickStats(root) is exported. In org runs, auto-assignment and per-task skill suggestions break keyword near-ties the same way from the run's own finished tasks (3 outcomes minimum).
  • monomind pick --min-confidence, --explain, and low-confidence rankings. A Jev answer below 0.6 is no longer thrown away when a person or Claude reads the result: down to MONOMIND_JEV_PICK_MIN_CONFIDENCE (default 0.25, or --min-confidence) it is kept and flagged lowConfidence: true. Jev tail entries under 0.02 are dropped. Each list in the JSON now carries source (jev, keyword, or keyword-fallback when a configured model gave no usable answer). Agents print by their spawnable name.
  • pnpm run pick:eval and monomind doctor -c pick. The eval scores 60 tasks in tests/pick-eval/ (each listing every acceptable agent and skill) with the keyword ranker in-process, or through the real picker with --jev; CI holds a floor on a frozen catalog snapshot. Keyword picks now get agents right at top-1 on 47/60 tasks and skills on 49/59; Jev gets 59/60 and 58/59. Before this work, on the original 40 tasks, keyword got 23/40 and 27/40 and Jev 34/40 and 39/40. doctor -c pick (opt-in, not in the default run) reports registry and skill-index counts and freshness, whether a decision model is configured, the eval score when the project carries the set, [PICK] adherence, and subagent success when the pick was followed versus overridden.
  • pnpm run lint:agent-refs, in verify and CI. Every subagent_type, agentSlug and Skill(...) name in shipped skills, commands, the init generators and the CLAUDE.md agent rosters must name an agent or skill that exists.
  • Skills can declare pick: low. The skill index records it and the keyword ranker keeps 35 % of such a skill's score, so admin and meta skills (the org management pages, specialagent and a few others, which now declare it) surface only when a task names them.
  • Org task provenance and org_skill_search. Every task created by org_task records assignedBy (auto or explicit); an auto-assigned task also records pick (method, confidence or score, top three candidates), and suggestions and loads are recorded as suggestedSkills and loadedSkills. Audit events task-auto-assigned, task-skills-suggested and skill-loaded carry the same data. Roles with skills or skill_pool get org_skill_search, which ranks the whole library by name and description; loading stays limited to the role's own skills.
  • Agent frontmatter for picking. Every bundled agent now has when_to_use, tags and one category (core, architecture, engineering, testing, security, devops, github, marketing, design, coordination, data-ai, specialized), and every description fits in 160 characters. The registry stores whenToUse, tags and vibe, and the picker leads each agent's text with when_to_use. Org skills get the same treatment: all 376 descriptions open with a sentence of at most 160 characters ("Use when…", or "Org role guidance…" for the 36 that share a name with an agent), with 3-5 tags each from the new 99-tag vocabulary in org-skills/TAGS.md.
  • summary in monomind pick --json, the same one-line agent: <name> · skill: <invoke> the MCP tool returns.

Changed

  • One index for agents and skills, shared by every selector. The prompt hook and monomind pick now load candidates through one loader (.claude/helpers/jev-catalog.cjs) and rank exactly the same set: the registry's agents (deprecated ones left out), then platform skills (the project's .claude/skills and commands, plus ~/.claude/skills for names the project lacks, origin: "user"), then Org-library skills (bundled, ~/.monomind/org-skills, project and active catalog entries) whose name is not already a platform skill, a known alias of one, or an agent. Each ranked skill is tagged source: "platform" or "org"; an Org skill's invoke is mcp__monomind__org_skill_show {"name":"<name>"}. README, overview and helper-only skill files are no longer entries. The agent registry is built for the project root, awaited when missing or stale, written atomically and never replaced by an empty one. doctor -c registry now reports duplicate slugs and extra agent roots.
  • .claude/helpers/skill-registry.json is generated per machine and no longer shipped. monomind init, init upgrade, monomind pick and SessionStart build it when it is missing or older than its sources, and it is gitignored. A project that committed the file can delete it from version control.
  • The keyword ranker is BM25-style. .claude/helpers/pick-rank.cjs drops stopwords, stems words lightly, weights each word by its rarity across the catalog, normalises description matches by length and scales by the share of task words matched. The old bonus for a category prefix in an id (engineering-, mastermind-) is gone. It is the fallback of every picker and builds the shortlist Jev chooses from.
  • Every agent selector wraps the central picker. hooks_route, monomind hooks route, hooks_pre-task, hooks_explain and route task rank through the same code as monomind pick, so they can no longer disagree, and every agent they return is a spawnable name (coder when nothing ranks). hooks_route no longer takes useSemanticRouter and no longer blends memory-bridge or ReasoningBank matches; semanticMatches is always empty and topK (1-20) sets the count. route task's fixed eight-type table (architect, optimizer, debugger, documenter, …) is gone and route list-agents lists the registry. route semantic, hooks_route_semantic and agent spawn --task ask the picker first: a decision-model answer at or above 0.6, then the @monoes/routing keyword rules, then a clearly leading keyword pick; embeddings and the Haiku fallback run only after that. agent spawn --type accepts any registry agent name, and the old fixed types map to one (architect → Software Architect, security-auditor → Security Engineer, …). Breaking for guidance_recommend callers: the recommended agents moved from each capability area's agents list to one top-level agents array ({ name, confidence, reason }) from the picker.
  • @monoes/routing 1.1.1 routes name agents that exist. Every route and keyword rule names a bundled agent's spawnable name (Security Engineer, DevOps Automator, …) instead of slugs that did not ship. Routes and rules with no matching agent are removed, not redirected: the game-development routes and the Blender, Unreal, Unity and Godot rules, the Salesforce rule and route, the TikTok and LinkedIn routes, and the ZK-proof rule.
  • Skills and commands pick their specialists instead of naming them. The mastermind skills and commands ask the [PICK] line, then the pick MCP tool, then a local monomind pick (never through npx), and keep a short fallback of agents that exist. About 75 agent and skill names that did not exist are fixed (backend-dev, code-review-swarm, Trend Researcher, Skill("mastermind-do"), …). /mastermind:<x> references point at /mastermind-<x> where only a skill exists. The content, marketing, sales, ops and finance commands spawn a picked specialist instead of a missing mastermind-<domain> skill. mastermind-agent-select's category map and fallbacks name real registry categories and agents.
  • Near-duplicate agents are deprecated. Code Reviewer → reviewer, mobile-dev → Mobile App Builder, monoswarm-pr → pr-manager, monoswarm-issue → issue-tracker. They are no longer picked but can still be spawned by name. security-manager is scoped to consensus-protocol security, so application security goes to Security Engineer. The reengineer-squad tester is renamed reengineer-tester so it no longer collides with the core tester.
  • Org auto-assignment picks the specific role, or refuses. org_task's assignee: "auto" never picks an endpoint role or the caller, reads the task's brief, weights words by how few roles mention them, needs a minimum score, and breaks ties by specificity and then by open work instead of declaration order. A tie that survives, or no role clearing the bar, refuses the call and names the closest roles. Per-task skill suggestions now work without a decision model, by keyword match over the role's pool.
  • Route records say what was picked and shown. .monomind/route-outcomes.jsonl stores a prompt hash and a secret-redacted 120-character preview instead of the first 500 characters of the prompt, plus the candidates, provider, session id and shown (whether a [PICK] line was printed). Each session's latest pick is kept in .monomind/routes/<sessionId>.json, so concurrent sessions no longer read each other's picks.

Fixed

  • agent scan writes nothing. It no longer runs the startup update check (which wrote ~/.monomind/update-state.json after a network call) or the subsystem init (which wrote .monomind/registry.json in the current directory). Callers such as mono-agent run it on a timer to show installed runtimes. The agent CLIs' own --version probes may still write their own state.
  • init upgrade refreshes the .gemini/helpers copy too. init writes the helper tree to .gemini/helpers as well as .claude/helpers, and Antigravity's status bar runs .gemini/helpers/statusline.cjs from it, but init upgrade only refreshed .claude/helpers, so upgraded projects kept the first install's helpers there. The Gemini copy now gets the same refresh (only where it exists; files the bundle does not ship are kept), and doctor reports stale files in it under Helper Files.
  • The "update available" notice goes to stderr. It was written to stdout on the first run of any command after a release, ahead of the JSON of agent scan --json, doctor --json and the org --json commands, so callers such as mono-agent failed to parse it ("invalid character '↑'"). stdout now holds only the command's own output.
  • doctor --json no longer writes to the folder it checks or to $HOME. (Fixes #335) A plain doctor --json rewrote .monomind/registry.json (from the CLI's startup refresh and the Agent Registry check), created the memory database under ~/.monomind/projects/ to count the knowledge graph, wrote the update-check state, updated the monograph db's -shm file, and filled ~/.npm with cache entries and debug logs. Read-only runs now do none of this (see Added). The TypeScript check no longer runs npx tsc --version, which downloaded the unrelated tsc package from the registry in a project without TypeScript; it reads the version of the project's own typescript package.
  • -v debug lines go to stderr. [DEBUG] and [TRACE] lines, and the "Completed in …ms" line, were written to stdout, so -v with a --json command put them ahead of the JSON. They now go to stderr, like [INFO].
  • The agent registry reads agent frontmatter correctly and no longer holds duplicates. .monomind/registry.json left every agent's capabilities empty, because the builder skipped the expertise: list inside a capability: block, and stored a literal | as the description of the 17 agents that write it as a YAML block scalar. It now reads both, so monomind pick and Jev see each agent's expertise and description. The repo's own .claude/agents/ also held 88 flat copies of agents that live in category folders (committed by accident in 2026-09), which put 63 agents in category default and gave 49 agents two registry entries; they are removed. The shipped package tree was not affected.
  • org_task_cancel stops the assignee's work on the task. On the 2.16.2 release run the coordinator cancelled task-25 while the fixer was mid-turn on it. Nothing told the fixer, which worked on for 25 minutes and committed a fix that was later integrated after the final audit. The assignee is now sent [task:<id>] CANCELLED … — stop now, do not commit or report further work for it. In task scope (session_scope: 'task'), a running process for that task is also ended, the way a sandbox fault ends one, since mail only arrives when a turn ends. Processes for the role's other tasks are left alone. org_task_done on a cancelled task is refused with the cancel reason and the instruction to stop, where it used to say the close "would notify its creator about work that was reported long ago". org_task_cancel's description says this, so the org tool list changes once.
  • A role's Bash sandbox no longer fails on an SDK stub that has gone away. On the 2.16.2 release run docs-writer's Bash calls failed with bwrap: Can't find source path ~/.claude/local. When a read-only directory holds the role's cwd or ~/.claude, monomind passes the SDK that directory's existing entries (#323). Those entries included the empty mount-point stubs another sandbox had made, and the SDK deletes a stub when the sandbox that made it ends. A stub that was listed when the role's process started but gone by a later Bash call made bwrap fail. Empty regular files are now left out of that list. The SDK already denies those names itself.
  • A command that runs bwrap itself no longer counts as the role's sandbox failing. Any Bash result starting bwrap: was taken as the OS sandbox failing to start, and two in a row restart the role's process. On the 2.16.2 release run cli-qa's orphan-reaper repros ran bwrap on purpose and printed bwrap: : No such file or directory among other output, which was counted. A result now counts only when it is wholly one of the messages bwrap dies with while it sets the sandbox up (Can't …, Creating …, setting up …, execvp …, …). The tool's leading Exit code N line is allowed, so a failed call such as Exit code 1 + bwrap: Can't find source path …, which was missed before, is counted now.
  • Hook timeouts are written in seconds. Claude Code reads a hook's timeout in seconds, and the generated settings wrote milliseconds: 5000 allowed a hung hook about 83 minutes. They now write seconds (12 for the prompt hook, which covers the longest Jev window).
  • Route outcomes record the agent that actually ran. The prompt hook no longer fills agentActuallyUsed with its own recommendation; only a real Task/Agent spawn sets it. SubagentStop logs the subagent from the event's agent_type as actualAgent and the pick as suggestedAgent, which were swapped, and PostTask reads agent_type too. Session-end success reads the tail of a large outcomes file instead of skipping it.
  • SessionStart rebuilds a stale skill index. A missing skill-registry.json, or one older than .claude/skills, is rebuilt at session start instead of serving skills that no longer exist.
  • router.cjs no longer selects agents or skills. Most slugs in its keyword agent table were not registry agents; the table is gone, and the prompt hook ranks keyword agents and skills with pick-rank.cjs over the shared catalogs (a keyword skill needs a score of at least 3 and a 1.25× lead).
  • Recommendations name agents that exist. guidance_recommend's capability areas and workflows, route coverage/coverage_route gap assignments and the prompt hook's intelligence advisory named agents that do not ship (security-architect, backend-dev, code-review-swarm, swarm-pr, …); they now name registry agents.
  • mastermind-new-agent writes valid Org Runtime v2 roles, and mastermind-createorg seeds role responsibilities from the agent registry.
  • The generated settings no longer mention MONOMIND_HOOK_VERBOSE. The MONOMIND_HOOK_QUIET comment offered it as the opt-out, but nothing reads it; the opt-out is removing MONOMIND_HOOK_QUIET or setting it to 0.
  • Catalog skills reach the decision model only with approval. A skill projected from the catalog, including a copy in ~/.claude/skills, is sent to Jev only when .monomind/catalog/state.json exists, lists it active with the jev target, and its package digest verifies. Before, a missing state file let the projection's own jev:yes marker through, and user skills were never checked. doc/privacy.md now lists what the picker sends.
  • The picker writes nothing outside a project. monomind pick, route, agent and doctor run from $HOME or a folder that is not a project build their catalogs in memory; they no longer create .monomind/registry.json or a skill index there. The skill index is never replaced by an empty one.
  • Concurrent sessions no longer lose route records. Appends, outcome joins and rotation of .monomind/route-outcomes.jsonl, from the hook and from hooks_route, hold one lock file; in a two-process test 28 of 150 records were lost before and none after.
  • Slash commands no longer count as recommendations. A slash-command route names no agent, and a spawn is compared only with its own session's route, so adherence and the outcome prior are not skewed.
  • The outcome prior stays bounded. Counts read from pick-stats.json are sanitised and the factor is clamped to ×0.85–1.15, so a damaged file cannot reorder picks or produce NaN scores.
  • Every selector ranks with the outcome prior. The pick MCP tool, hooks_route, route task and guidance_recommend now apply it like monomind pick and the hook, so they return the same order.
  • No pick for trivial prompts, and non-Latin prompts rank. Prompts with fewer than three content words get no [PICK]; the keyword tokenizer handles Unicode letters, folds accents and splits CJK text into bigrams.
  • SubagentStart/SubagentStop are silent under MONOMIND_HOOK_QUIET, and two same-type subagents finishing in the same millisecond both count.
  • init upgrade --settings brings old installs up to date. It adds the monomind hooks the install lacks (the Task|Agent adherence hook, SubagentStart/Stop capture) and converts monomind hook timeouts written in milliseconds to seconds; user hooks are untouched. Upgrade also refreshes bundled agents whose body the user has not edited. New doctor check hook-settings warns about missing pick hooks and millisecond timeouts, and the registry check counts agents missing when_to_use.
  • Pick guidance works before the MCP tool is published. Generated CLAUDE.md and CAPABILITIES.md say to call mcp__monomind__pick when available, else monomind pick -t "<task>" --json.
  • A cancelled org task no longer reaches its assignee after the cancel. A task still held for dispatch is withdrawn without a notice, a task that was never sent no longer wakes its assignee, and a cancel that arrives while a task-scoped process is starting ends it.
  • agent spawn --type matches names case-insensitively and takes capabilities from the resolved agent.
  • Test suites cannot reach a hosted decision model. Both vitest configs clear Jev provider environment before running.

Removed

  • Four duplicate Org skills. database-migration, internal-comms, accessibility and error-handling-patterns are gone; use database-migrations, team-communications, accessibility-compliance and error-handling. A role that names a removed skill in skills or skill_pool must be updated.
  • hooks_route's useSemanticRouter input, and the @monoes/routing routes and rules listed under Changed.
  • cleanup --force reaps an orphaned SDK process under a bwrap sandbox. (Fixes #333) In a sandbox, bwrap stays pid 1 and keeps the whole wrapped Bash command in its own cmdline. Any word in that text could make the reaper treat it as a live session and skip every orphan beneath it: monomind cleanup --force itself, claude, or claude-agent-sdk --output-format next to each other. The 2.16.2 fixes narrowed this case but did not close it. An ancestor now counts as a live session only when the program it runs is Claude Code, monomind, or the SDK: its first word, or the script after node/bun. Words later on the line are ignored. A Claude Code, monomind or SDK process that a shell starts is its own process, so it still protects the processes under it. Verified in a real bwrap PID namespace with the issue's repro: the orphan is reaped and the live sibling is kept.
  • The Bash-timeout test passes inside a Claude org role. (Fixes #334) The test "a non-Claude runtime session env does not carry them" failed with expected '600000' to be undefined when the suite ran inside a Claude role. The role's own BASH_DEFAULT_TIMEOUT_MS/BASH_MAX_TIMEOUT_MS passed through the parent env into the session env the test inspects. The test now clears both variables for each case. Runtime behavior is unchanged: monomind still adds these variables only for Claude roles and still passes the parent env through to every runtime.

npm: npm install -g monomind@2.16.3 — published packages: monomind@2.16.3, @monoes/monomindcli@2.16.3, @monoes/routing@1.1.1, @monoes/memory@1.0.20, monofence-ai@1.0.6.

v2.16.2

View on GitHub

[2.16.2] — 2026-09-24

Changed

  • Claude-runtime org roles get a 10-minute Bash timeout. Roles hit Claude Code's 2-minute default Bash timeout on long foreground commands (three times for runtime-qa on the 2.16.1 release run). A Claude role's session env now sets BASH_DEFAULT_TIMEOUT_MS and BASH_MAX_TIMEOUT_MS to 600000, which Claude Code reads; run_config.bash_timeout_ms (up to 3600000) changes both. Other runtimes are unaffected.

Fixed

  • The hooks keep the monograph graph fresh in npx setups, and say so when they can't. (Fixes #328) The post-edit rebuild imported @monoes/monograph by bare name, which only finds a project-local install, so with the default npx .mcp.json every qualifying edit failed with ERR_MODULE_NOT_FOUND (1,896 copies in one project's build.log), the graph fell 79 commits behind, and past the 50-commit limit the grep gate and [MONOGRAPH] hints switched off without a word. Every hook now resolves the package the same way — the project, the global npm root (standalone or bundled with a global monomind), then the copy the MCP server's npx run left in the npx cache — and imports it by absolute path. With none of those it runs monomind monograph build from the project or PATH; it never runs npx -y. When the hooks still can't rebuild, SessionStart prints one [MONOGRAPH_WARN] line with the graph's lag and the fix (npm i -g --allow-scripts=better-sqlite3 @monoes/monograph when the package is missing or a global install skipped building better-sqlite3), the first prompt after the gate switches off says so once, and a repeated failure adds one line to build.log instead of one per edit (the log also moves aside past 1 MB). A .rebuild-lock or build.lock whose process has exited no longer blocks the next rebuild. doctor has a new Hook graph rebuild row (doctor -c hook-monograph) that fails when the graph is over 50 commits behind and the hooks can't rebuild it, and names a missing package or an unbuilt better-sqlite3.
  • A blocked org task is re-checked instead of sleeping until its deadline. (Fixes #329) Nothing external wakes a task blocked with org_task_block: a background command's completion or a Monitor event only reaches the role's own process, which idle-cycling may already have ended, and npm propagation reaches nobody. On the 2.16.1 release run a builder blocked "until 11:00Z" on a pnpm install that finished four minutes later and sat idle for 28 minutes until an operator stepped in; a publisher waiting on npm propagation idled the same way. The assignee of a blocked task is now woken every run_config.block_recheck_minutes (default 5, at most 60) with [task:<id>] still blocked (reason …) — re-check … and asked to close the task, re-block it or report, until the deadline or the close. A role may pass recheckAfterMinutes (1–60) for one block, and may now re-block a task that is already blocked. The schedule is stored on the task, so it survives process cycling and checkpoint resume. org_task_block's description now says that nothing external wakes a blocked task and that waits belong in the foreground.
  • An org role no longer loses its tool calls partway through a long turn. (Fixes #331) On the 2.16.1 release run the publisher's org tools, Read, and every Bash call that needed a permission decision started failing with Tool permission request failed: AbortError: Stream closed. Bash calls allowed by a static rule kept working, so the role could not report, block or close its task, and it ended its turn with the task still open. The cause was monomind's mailbox stream: the SDK closes the Claude Code process's input when the prompt stream ends, and permission requests and in-process org tools use that same channel. The stream's run_config.session_idle_exit_ms timer started when the SDK asked for the next message, which it does right after receiving the current one, so any turn longer than the idle window was cut off. In task scope, mail for another task arriving mid-turn cut it off the same way. The stream now stays open until the turn's result, and the idle window counts from then. If the channel closes anyway, the first such tool result ends the role's process and resumes the same session in a fresh one with a note saying why (channel-fault audit event, channel-restart status). This is the recovery path bwrap sandbox faults already use, with the same limit of two restarts per task, counted separately from sandbox restarts. After that the coordinator is told once (channel-fault-exhausted).
  • org_task_done evidence can name its worktree by a relative label. On the 2.16.1 release run all 11 first closes were refused. Roles pinned worktree: "src" (or docs) for the release worktree at .monomind/orgs/release/work/src, and the gate resolved that against the org root, to a directory that is not a worktree. A relative worktree is still resolved against the workspace first. If that path is not a worktree, the gate now uses the one worktree of the repository whose path ends with the label (src, work/src), and the evidence is checked against that worktree's HEAD. A label that fits more than one worktree is refused, and the refusal names each one. Stale-head, unknown-commit and placeholder refusals are unchanged.
  • A role that re-closes its own finished task is told the first close worked. When the assignee calls org_task_done again on a task it already closed and has nothing else open, the refusal now says the earlier close was accepted and nothing else is needed. Before, it said the close "would notify its creator about work that was reported long ago" and told the role to ask for a new task.
  • monograph watch no longer looks hung when a rebuild is skipped. The watcher's monograph:updated handler called buildAsync() without an onProgress callback, unlike the build/wiki call sites in the same file, so a build-lock collision or an already-fresh-index skip — reported via onProgress?.({ phase: 'skip', ... }) — produced no output at all, and neither did a successful rebuild; watch mode looked permanently hung. It now wires up onProgress so a skip is logged and prints "Rebuild complete." on success.
  • cleanup --force's orphan reaper narrows a false-positive class under a bwrap sandbox — every org role's actual runtime — but does not fully close it. selectOrphanedSdkPids matched LIVE_SESSION_RE (/\bclaude\b|monomind/i) against the raw cmdline of every ancestor in a candidate orphan's parent chain, so it wrongly treated some orphans as live-parented and skipped them. Two fixes landed in 2.16.2: bwrap's own --ro-bind .../.claude/... --ro-bind .../.monomind/... bind-mount arguments substring-matched the regex, so an ancestor's cmdline is now tested only after bwrap's -- separator between its own options and the wrapped command (36c79c6de); and a bwrap-wrapped shell script's incidental mentions of a .claude path or a socket name did the same, so an ancestor is now judged by its own executable name(s) instead of whether some argument or path elsewhere on the line happens to contain those words (935c1c57e). A residual gap remains unfixed in this release: a wrapped script whose text merely contains the substrings "claude-agent-sdk" and "--output-format" — unrelated to any real invocation — still falsely shields the orphan from the reaper; a fix (an argv-adjacency check requiring a claude-agent-sdk path token to sit directly next to an --output-format token, instead of a wildcard substring scan) is ready but not included in 2.16.2, tracked in a follow-up issue.

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

v2.16.1

View on GitHub

[2.16.1] — 2026-09-24

Added

  • org_task and org_plan_graph nodes take a brief. The creator's instructions for a task — scope, acceptance criteria, paths, what failed last time, up to 4000 characters — are stored on the task and delivered in the same mailbox message as its title, every time it is dispatched: at creation, later when its dependencies complete, and again after a refused close or a checkpoint resume. Split children inherit it, and per-task skill suggestions still follow it. Until now org_task took only a title, so a coordinator sent the details in a follow-up org_send, which joined the dispatch only if it landed inside the 500 ms coalescing window; on the 2.16.0 release run it often did not — the publisher asked for the details twice, and the maintainer finished tasks before their briefs arrived and was then woken four more times (about 3M tokens).
  • org_tasks takes an optional taskId. It then returns just that task — status, result and latest evidence — instead of the whole DAG. On a long run the full listing is large enough to be spilled to a file, and on the 2.16.0 release run the coordinator read single tasks back out of those files with dd and python.
  • {{home}} and {{org_root}} work in a role's policy paths. policy.fileRead, policy.fileWrite, policy.sandbox.allowWrite and policy.sandbox.denyWrite now take the same placeholders as responsibilities, expanded when the daemon loads the org, so the file-tool roots and the OS sandbox see absolute paths. Before, only responsibilities were expanded, so a tracked config couldn't grant a role a scratch dir under the operator's home without hard-coding it. On the 2.16.0 release run that produced 17 "path escapes every root" denials for files under $HOME/monomind-release/<ver>/logs and $HOME/mrg-tmp. org validate reports an unknown placeholder in these fields as an error, naming the field.
  • Tool-call traces now say which turn a call belongs to, and org_send carries the sender's chain. (Fixes #327) Every call a role made carried the same chain_id and hop across all its turns, and a role's native org_send mail carried no trace at all, so mono-agent's loop control could not tell ten calls answering one request from a loop between roles — a loop running only through org_send was stopped after 64 calls. _meta.trace now has turn, a per-role count that is the same for every call in one turn and goes up by one each turn (checkpointed, so a resumed role continues it). A role's org_send, in the same org or across orgs, now starts with [trace <chain_id> hop=<hop+1>] for the sender's chain, replacing any trace line already in the body; the receiver adopts it, so A → B → A shows up as one chain with hops 1, 2, 3. Human, operator and dispatch mail is not stamped. The _meta.trace shape is documented in doc/concepts/org-runtime.md.
  • run_config.max_tool_rounds and a role's own max_tool_rounds set the tool-call round cap. (Fixes #326) Fence-protocol runtimes (every runtime but claude and vercel) stopped after 10 tool-call rounds per message, fixed. A role with a longer job, like the 13 automation calls in mono-agent's C-46 live gate, could not finish it in one turn. The default stays 10. Values must be a positive integer up to 200, and org validate rejects anything else.

Changed

  • A sandboxed org role can run node $SCRIPT again. The git policy's Bash classifier denies any command it can't read (node $X, python3 $F, $BIN …, env -i …, eval) for every role below policy.git: 'push', because without an OS sandbox such a command could run git at any level. It did this even when the role's Bash ran inside the SDK sandbox, which already enforces the level where git runs: 27 denials on the 2.16.0 release run. When a role's session actually got the sandbox (the runtime decision, never the config alone), those commands are now allowed. Every git call written out literally is still checked per level, including one after an unreadable part of the same command. A visible git call with a hidden subcommand (sh -c "git …", git $SUB, an alias, a guard override) still fails closed. Unsandboxed roles, mode: 'off', a host without the sandbox, and non-Claude runtimes behave exactly as before.
  • Org roles no longer see Claude Code's own scheduling, task-list, question and plan-mode tools. On the 2.16.0 release run a builder called ScheduleWakeup and AskUserQuestion and the captain created a TaskCreate("placeholder"). None of them does anything useful in a headless org session: nobody is there to answer the question, and a harness task or wakeup is invisible to the other roles, the org's task DAG and the daemon's watchdogs. Every claude-runtime role, at every policy.git level, now runs with AskUserQuestion, ScheduleWakeup, TaskCreate, TaskUpdate, TaskList, TaskGet, CronCreate, CronDelete, CronList, EnterPlanMode and ExitPlanMode in the SDK's disallowedTools. Their org equivalents are ask_human, org_task/org_tasks and org_task_block.
  • monomind init now sets up the memory database by default. Memory was only initialized as part of --start-all, so init --no-start-all (and init wizard) left monomind doctor reporting "Memory Database: Not initialized" until you ran monomind memory init yourself. Init now creates the same .swarm/memory.db (copied to .claude/memory.db) in every mode, --minimal included, whether or not services auto-start. An existing database is kept as it is, never recreated, so re-running init leaves stored entries in place. Pass --no-memory to opt out; --only-claude skips it because that mode writes no runtime state, and --skip-claude skips only the .claude/ copy. If the database can't be created, init still succeeds and prints a warning telling you to run monomind memory init. Doctor's fix hint for a missing database now says monomind memory init instead of memory configure, which never created one.
  • A role that hits the tool-call round cap is now told so. (#326) Its pending calls used to be dropped with only a bus notice, so the role stopped mid-task without knowing why. Now each of those calls comes back as a tool result saying the round cap was reached. The role then gets one wrap-up round whose calls run, to report what it finished and ask to be continued (for example with org_send). Calls after that round are dropped with the bus notice as before, and agent exec still reports stop_reason: "tool_round_cap".
  • The prompt hook can wait up to 10 s for the Jev decision model. Hosted Jev sometimes takes 1.5–9 s to answer, and MONOMIND_JEV_HOOK_TIMEOUT_MS was capped at 4000 because every hook process force-exits at 5 s. The cap is now 10000 (the default stays 1500), and while a Jev provider is configured the route hook's force-exit moves to that limit plus 1.5 s so the route is still recorded after a slow pick; every other hook, including the pre-bash/pre-write security gates, keeps 5 s. The trade-off: a slow model delays each prompt by up to the configured limit, and a timed-out pick still makes the hook skip Jev for 5 minutes.

Fixed

  • monomind init wrote one full copy of every shared skill per platform. .agents/skills is a single directory that codex, kimi, opencode, gemini, cursor and several other platforms all declare as their skill root, and each adapter wrapped the same body in its own skills:<platform>:<name> block — a default init left .agents/skills/mastermind-org/SKILL.md with three stacked copies (49 lines instead of ~16), and mastermind-idea/SKILL.md grew by 2,281 lines. A shared root now carries one co-owned skills:agents:<name> block. The next init, init upgrade or platforms install/upgrade folds existing per-platform blocks into that one block where the first sat, leaving text outside the blocks byte-for-byte and backing the file up to .monomind/backups/ first. Which platforms installed into the shared root is recorded in .monomind/platforms/shared-skills.json, so platforms uninstall of one platform keeps the block while another platform still uses it. Platform-specific roots such as .claude/skills keep their per-platform markers.
  • org report marked every role EXHAUSTED on a well-cached run. The per-role budget percentage compared each role's total tokens — cache reads included — against budget_tokens, which the runtime enforces on input+output only, so on the 2.16.0 release run the captain read "8391% of 500000 — EXHAUSTED" while it had really used about 13% of its budget. The percentage is now computed on the basis the policy enforces (input+output, or the billable total when run_config.budget_tokens_basis is "billable"), the basis is named on the line (13% of 500000 in+out), and cache tokens are still shown, labelled separately (41955000 tokens (65000 in+out, 41890000 cache)). --format json role rows gain uncachedTokens.
  • runtime.json still said every role was running after the org had stopped. The stop checkpoint is captured before sessions drain — deliberately, so unconsumed mail survives into a resume — which froze each live role's status at running in checkpoint.roleState, after org stop, org_complete and a normal exit alike. A role that was live at that moment is now recorded as stopped; resuming from the checkpoint still brings it back as running.
  • A detached org run log just stopped, with nothing saying how the run ended. org run now prints one final line on every exit path — org_complete, org stop, Ctrl-C/SIGTERM, the idle watchdog, a budget, or a crash — naming the outcome (complete, stopped, budget or error, with the cause), the wall time and the run's total cost from its usage events: org release run run-… ended — outcome: complete (achieved), wall time 1h57m12s, cost $63.63. The exit code is unchanged.
  • Org events went to a dashboard built from a deleted worktree, and heals left dashboards running on every port. The org event forwarder accepted whatever dashboard .monomind/control.json named as long as its pid was alive; on the 2.16.0 release run that was a server.mjs from a worktree that no longer existed. It now also requires the server script to still exist on disk (recorded as server in control.json, or read from the process's command line) and, when control.json records a version, that it is this CLI's. A stale dashboard it can prove is this project's own is stopped before it is replaced, a live dashboard already serving this project on ports 4242–4251 is reused instead of starting another, and a dashboard it starts records its server path and version. Events to a secondary dashboard now carry that server's dashboard-token-<port> credential.
  • A role could silently lose its shell to a sandbox that failed to start. A Bash result starting with bwrap: is the OS sandbox's own error, not the command's; on the 2.16.0 release run there were 31 of them and a QA role spent about 7 minutes and 27 tool calls without a working shell. Each one now raises a sandbox-fault audit event, and two in a row end the role's process and resume the same session in a new one (a new process builds a new sandbox), with a message telling the role to re-run the command. It is bounded to two restarts per task session; after that the role's coordinator is told its shell is not running.
  • Evidence refusals misnamed two common slips. A typo'd headSha was refused with "the tree moved after those checks ran", sending the role to re-run checks that were fine; org_task_done now asks git whether the sha is a commit at all and, when it is not, says "unknown commit (typo?)". A worktree left as a template — a literal <…> or {{…}}, or a path such as …/monomind/SRC that does not exist — is now refused as a placeholder with a hint to pin the real worktree path, instead of as an unknown worktree. Both were seen on the 2.16.0 release run.
  • org_complete read as a session error, and the last turn's usage went unrecorded. Ending the run aborts every live session, and each one announced "session ended with an error" before the daemon's own "stopped with the org" status. A session aborted by the org's stop or completion now reports a session-stopped status, and a genuine crash keeps the error. The turn in flight when a session is cut off never received its result, so its tokens reached the role's budget but no usage event; it now gets one (subtype: "aborted", no cost, since the SDK reports cost only on result).
  • Org cost and tokens were under-counted after a resumed session. The SDK's total_cost_usd and modelUsage are running totals for the CLI process, and the runtime turned them into per-turn deltas keyed by session id alone. With run_config.session_scope: "task" every resume runs in a new process whose total usually starts again from zero, so the first turn after a resume was billed as max(0, small − previous) = 0 — on the 2.16.0 release run nine turns of more than 100k tokens each (14.6M in all) were recorded at about $0, the run reported $63.63 against roughly $72.70 re-priced, and budget_usd caps tripped late because maxUsd enforcement saw the same numbers. Deltas are now taken per process: the first result of a new process counts in full when its total is lower than what the previous process last reported for that session, and only the increase when Claude Code carried the old total over.
  • A sandboxed org role could lose its Bash tool to bwrap: Can't create file …: Read-only file system. (Fixes #323) The Claude Agent SDK's sandbox binds /dev/null over "dangerous files" that don't exist yet — .gitconfig, .bashrc, .mcp.json in the role's cwd, ide, local and friends in ~/.claude — and bubblewrap has to create a 0-byte mount-point file for each. monomind made the parent directories read-only (policy.sandbox.denyWrite: ["."] resolves to the org root, which is or holds every role's cwd, and ~/.claude is always denied), so every Bash call failed unless another sandboxed process happened to hold the stubs. On the 2.16.0 release run that was 31 failed calls, ~7 minutes of a QA role's time and three mandatory checks skipped until the next QA round. Such a directory now goes to the SDK as its existing children, each still read-only, and the directory itself becomes a writable bind mount (so it can't be renamed away). The OS layer now allows only one new thing: creating new entries directly inside it. The Claude Code and git names that matter there are the SDK's own denies, and the file tools still refuse writes anywhere in a denyWrite directory. Linux only; macOS's seatbelt needs no mount points and is unchanged.
  • monomind search X and search X --type code missed code symbols that monograph search -q X found. (Fixes #322) Three things stacked up. The code capability only switched on when the saved capability fingerprint counted code files, and that fingerprint is trusted for 24 hours, so one taken before the code existed (init writes one up front) left code search off even after monograph build. It now also switches on whenever .monomind/monograph.db exists. Code hits were scored with the raw FTS5 bm25 rank, about 1e-6 on a small index, so they sorted below every document, media or data hit (scored 0.5–1) and fell out of the top --limit. They are now scored by rank position on the same scale as documents. And --type filtered the merged list after the limit, so any other type that filled the top 20 left --type code with "No results found."; the filter now picks which capabilities are searched before the limit is applied.
  • monograph wiki never created Section nodes for markdown headings. (Fixes #321) The command promised "headings → Section nodes", but the phase that splits documents into sections — and the PDF, co-occurrence and --llm phases that read those sections — were never registered with the build pipeline, so each .md file produced one Document node, no heading was searchable on its own, and --llm had nothing to enrich. A build now creates one Section per heading (linked to its parent heading and its file) plus one for a heading-less .txt/.rst/.md file, and monograph search -q "<subheading>" finds it. A rebuild replaces a file's sections instead of leaving the old ones behind when a heading moves. @monoes/monograph 1.6.9.
  • doc/agent-exec-protocol.md said "rev 8" but its revision history stopped at rev 7. (Fixes #324) The rev 8 change was real: on 2026-09-17 the §2 handshake example gained the org-tool-providers, org-endpoint-roles, org-federation and org-decision-attribution capabilities, but no history entry was written for it. The history now has one.
  • A tool provider's tool never received arguments its inputSchema didn't list. (Fixes #325) The runtime built its argument validator from properties alone, and every runner's zod object stripped the other keys, so a tool advertising {"type":"object","additionalProperties":true} got {} from tools/call whatever the role passed. mono-agent's granted-automation tools hit this in a live org run. When the top-level schema allows additional properties, which JSON Schema does when the keyword is absent, unlisted keys are now kept and passed through on every runtime: the Claude SDK's MCP server, the fence runners and the Vercel runner. Listed properties are still type-checked, a schema-valued additionalProperties checks the extra keys, and additionalProperties: false still strips them. The fence protocol lists such a tool's parameters with ...other keys.

npm: @monoes/monograph 1.6.9, @monoes/monomindcli 2.16.1, monomind 2.16.1

v2.16.0

View on GitHub

[2.16.0] — 2026-09-23

Added

  • A Jev decision model can pick agents and skills instead of keyword ranking. Point MONOMIND_JEV_URL at a self-hosted OpenJev server, or set TYPESAFE_API_KEY plus MONOMIND_JEV_HOSTED=1 for hosted TypeSafe (api.typesafe.ai) — either way it's off by default, and keyword ranking stays as the fallback whenever nothing is configured or a call fails. It now backs the prompt hook's agent/skill choice, the route layer, the new monomind pick -t "<task>" command, org skills search, per-task org skill suggestions, and org_task's assignee: "auto". Prompt text is scanned for credential-shaped strings and masked before any of it leaves the machine; the prompt hook budgets 1.5s for a decision, and a failed call trips a 5-minute circuit breaker (.monomind/jev-breaker.json) so a flaky provider can't slow down every keystroke. monomind doctor -c jev probes each configured provider.
  • monomind catalog — a policy-governed catalog for imported and locally authored skills. stage, inspect, approve, activate, disable, quarantine, release, revoke, list, show, search, audit, project, and unproject move an entry through an explicit lifecycle, with archetypes and blueprints for org roles and projection to .claude/skills and .agents/skills happening only once an operator asks for it. With no .monomind/catalog, every consumer behaves exactly as before — the catalog is entirely inert until a mutating command runs. monomind doctor -c catalog checks its health. See Skill Catalog.

Fixed

  • monobrowse --version crashed instead of printing a version. (Fixes #320) The standalone binary read its manifest with _require('../package.json') — correct for src/cli.ts, which sits one level under the package root, and wrong for the only file that ever runs it. The package compiles with rootDir: ".", so the entry point emits to dist/src/cli.js and createRequire(import.meta.url) resolved ../ to dist/, which holds no manifest: every monobrowse --version / -V died with ✗ Cannot find module '../package.json' and exit 1, in the repo and from a clean npm install alike. The path now resolves from the compiled location, and a subprocess test spawns the built dist/src/cli.js — the exact file bin.monobrowse points at — because an in-process test re-resolves from src/, where the broken path already worked. Present since the binary was added (2026-06-22, 89b25c2ca1); monomind browse never used this code path and was unaffected. @monoes/monobrowse 1.0.22.

Security

  • Six rounds of review hardening on the catalog and Jev integration. A frontmatter allow-list rejects unknown keys instead of passing them through; shell-execution syntax is refused wherever it can hide — including Claude Code's own argument substitution and a fence cut at the frontmatter boundary; the catalog scanner now fails closed on an unreadable or ambiguous package instead of admitting it; secret redaction runs in linear time so a large pasted blob can't stall the prompt hook; and Jev only ever sees catalog skills that are both active and explicitly granted to the jev target — approving a skill for any other surface no longer leaks it into Jev's picks.

npm: monomind@2.16.0, @monoes/monomindcli@2.16.0, @monoes/monobrowse@1.0.22 published to npm.

v2.15.7

View on GitHub

[2.15.7] — 2026-09-22

Fixed

  • A role could end its turn with its own task still open and nothing noticed. On the 2.15.6 release run the publisher reported its results with org_send and ended its turn without calling org_task_done; the coordinator waited on a completion that never came and the run sat still for ~10 minutes until a human intervened, because the only backstop was the org-wide idle watchdog (run_config.idle_minutes, 45 in that org). When a role's turn ends the runtime now checks what it left open and delivers one short [task:<id>] STILL OPEN — … message naming the task and what closing it takes (including evidence when run_config.completion_evidence is on), plus a task-open-at-turn-end audit event. It is bounded: nothing is sent while the role still has mail queued or coalescing, a task blocked on a real-world time (org_task_block) is never nudged, and each task earns at most one nudge per dispatch. The idle watchdog's own behaviour is unchanged.
  • A completion notification could name an already-closed task. (Fixes #319) With run_config.session_scope: "task" a role's model session is keyed per task and resumed per task, so a session resumed for a follow-up task still carries the previous, already-closed task in its context. Closing that remembered id used to succeed — nothing in the runtime refused a second close — so with notify_task_creator the creator received a second [task:<already-closed id>] DONE while the task actually in flight stayed running until a human cross-checked org_tasks against the notifications (observed twice on the 2.15.6 release run). org_task_done now refuses a task that has already reached a terminal status, names the caller's open task(s) in the refusal, records a task-already-closed audit event, and leaves the DAG and the closed task's evidence untouched; the notification's tag and title come from the task that just closed.

Changed

  • expectExit can no longer hide failures inside an aggregate command. In the 2.15.6 release run a role put expectExit: 1 on pnpm run test:all:run — a ~7,800-test suite — and the completion-evidence gate accepted it: a suite's exit 1 means "at least one of 7,800 things failed", so the known failure and any new regression are the same exit code and the gate cannot tell them apart. A human had to read the log by hand to confirm only the expected test had failed. org_task_done now refuses expectExit on a command that runs a test suite or an aggregate runner (vitest, jest, npm/pnpm/yarn test scripts, node --test, pnpm -r, pnpm --filter … test, run verify, test:all — a command naming a single test file is not one), and the refusal says to run the failing test file on its own and declare expectExit on that check, or exclude the known failure and record the exclusion. Every other expectExit now requires a one-line expectReason saying why the non-zero exit is correct; the reason travels with the exit code into the refusal, the task's stored result and the review packet (exit 1 (expected 1: 404 = branch not protected)), and each accepted expectExit raises an audit event (evidence-expect-exit) so they can be swept after a run. expectExit: 0 is the default and declares nothing.

  • Two monomind browse open calls running at once fought over one browser. (Fixes #318) With no --port, every open targeted the same default CDP port (9222) and the profile directory derived from it, so two uncoordinated invocations either collided at launch (Chrome exited before the CDP endpoint opened on port 9222) or silently shared one Chrome, where the second navigation aborted the first (net::ERR_ABORTED) and one browse close killed both. Reproduced 5/5 with two concurrent opens; 5/5 pass now, each with its own browser.

    open with no --port now starts its own session: Chrome binds a kernel-assigned free port in a profile directory of its own, and open reports it — ✓ Opened: … [port 41337]. Sessions are recorded one file per port, per working directory, in .monomind/monobrowse/sessions/<port>.json (they shared a single active-port.json before), and every later command follows one rule: --port N acts on that session, no --port acts on the newest session in this directory whose browser still answers. Dead records are dropped as they are passed, so a crashed or manually-killed browser self-heals instead of wedging later commands, and close ends exactly the session it resolved — never another invocation's browser. open --port N and connect --port N keep today's attach-to-that-port behaviour exactly, and each session keeps its own snapshot ref cache so concurrent snapshot/click work does not cross over.

    Upgrading with a session already open does not strand its browser: a directory that still has the old single-session file (.monomind/monobrowse/active-port.json) has it treated as one more candidate — the oldest, so live per-port sessions win. If its browser still answers it is adopted (rewritten as sessions/<port>.json, keeping port, PID and open/connect provenance, old file deleted) and behaves like any other session for snapshot, --port and close; if it does not answer, the old file is just removed. Nothing writes that file again, and adoption never makes a bare open join an existing session. @monoes/monobrowse 1.0.21.

npm: monomind@2.15.7, @monoes/monomindcli@2.15.7, @monoes/monobrowse@1.0.21

v2.15.6

View on GitHub

[2.15.6] — 2026-09-22

Added

  • policy.sandbox.denyWrite for org roles. Paths listed there are read-only for the role's shell (OS sandbox) and its file tools; relative paths resolve against the org root, so ["."] keeps a role from writing anywhere in the checkout. The release org now uses it — with mode: "required" — for its QA and audit roles, after a QA role ran cleanup --force from the main checkout during a release run.

Changed

  • monomind cleanup --force keeps user data unless you also pass --purge-data. Memory stores (data/memory, MONOMIND_MEMORY_PATH, memory/), .monomind/org-memory, .monomind/knowledge, .monomind/orgs, .monomind/org-skills, backups, the monograph database and any other *.db file are listed as kept by --force alone; --force --purge-data removes them too, provided they are not git-tracked. The preview (cleanup without --force) runs the same plan, so it lists exactly what --force will remove or edit, followed by everything it keeps and why.
  • Completion evidence is checked against every local worktree and branch, not just the org workspace. With run_config.completion_evidence on, org_task_done used to refuse any evidence whose headSha was not the org workspace's HEAD — so an org that builds in a release or per-task worktree (the usual shape) could never close a task honestly. Evidence may now be pinned to the current HEAD of any worktree of the repository or the tip of any local branch, and may name its worktree to pin the check to that worktree's HEAD exactly. A commit that is no longer the head of any local work is still refused as stale, and the refusal now lists the current heads.
  • Completion evidence checks may declare the exit code they expect. On the release org's first run, checks whose correct outcome is non-zero — a branch-protection GET that 404s, git config --get of an unset key, agent exec --timeout 1s → 124 — were refused, and roles "fixed" them with || true, erasing the exit code the gate checks. Each check now takes an optional expectExit; it passes iff exitCode === (expectExit ?? 0), a mismatch refusal names the expected and actual codes, and the review packet and the task's recorded result show exit 1 (expected 1).
  • Evidence refusals say how to close a report task and where to pin out-of-repo checks. A QA task that finishes by reporting failures could not close, because the failing command it found went into checks. The gate still requires every check to pass; the refusal and the org_task_done description now say that such a task's acceptance commands prove the report exists (e.g. test -s <report>) and its failures go in result and to the coordinator. Evidence whose worktree is a scratch dir (e.g. an installed tarball) is still refused; the refusal now says to pin headSha/worktree to the git worktree the tested artifact was built from.
  • monomind --version now refreshes a stale update cache in the background. It returns before the startup update check runs, so until now it never refreshed the cache its tagline reads — on a missing or stale cache it stayed silent about new releases until some other command ran. When the cache is missing or older than the 24h check interval, --version prints its line exactly as before, then reserves the check slot and starts a detached, unref'd child that prints nothing, fetches the latest versions (5s per-request timeout, 20s hard cap, silent when offline) and rewrites the cache, so the next --version is accurate. It uses the startup check's own gate — CI/CONTINUOUS_INTEGRATION, MONOMIND_AUTO_UPDATE=false, the 24h interval and the daily cap — and --no-update; reserving the slot stamps lastCheck first, so a refresh that is running or just ran blocks the next one. --version --json never spawns. Cost on the run that spawns: roughly 5-10 ms.

Fixed

  • monomind cleanup --force deleted git-tracked files and the project's memory. It removed a fixed list of paths wholesale — .claude/, .agents/, .gemini/, .opencode/, .codex/, .kimi-code/, data/, memory/, AGENTS.md, GEMINI.md, opencode.json, .mcp.json — without checking that monomind had created them. Run in a real repository it deleted about 1000 git-tracked files (including hand-written AGENTS.md/GEMINI.md, which many projects own themselves) and wiped the memory store, org memory, knowledge index and monograph database. Cleanup now builds one ownership-checked plan. It never deletes or edits a git-tracked file (a directory holding tracked files keeps them; only its untracked monomind content goes), and it refuses to delete anything if a git repository is present but git ls-files fails. It deletes a path only when monomind demonstrably owns it: untracked .monomind/ runtime state and monomind.config.json, entries listed in .monomind/init-manifest.json, monomind* files in agent-tool directories, a GEMINI.md still carrying init's title line, and files whose whole content is monomind marker blocks. From a file that mixes user content with a monomind block (AGENTS.md, CLAUDE.md, GEMINI.md) or a monomind server entry (.mcp.json, opencode.json), only the monomind part is removed. Everything else, including .claude/settings.json, is kept and listed with the reason. cleanup --force also refuses to run in monomind's own source checkout (root package.json named monomind with packages/@monomind/cli present).
  • cleanup --force killed live agent processes when Claude Code ran as a container's pid 1. Deciding orphan-hood by pid 1's name went wrong both ways: a systemd/init allow-list left real orphans running under tini or bwrap, and the replacement "pid 1 is a shell" deny-list SIGTERMed the live SDK children of a node .../claude pid 1, whose ppid is 1 (reproduced 3/3 with real processes in a PID namespace). A claude-agent-sdk process is now reaped only when ownership says it is an orphan. It must not be the invoking process, one of its ancestors or one of its descendants. It must share neither the invoking session nor its process group. No live claude/monomind process may sit up its parent chain. And it must no longer be in its parent's session, which is what happens when init, systemd --user, tini, bwrap or any other subreaper adopts it. On Linux this is read from /proc (ppid, process group, session and start time; the start time also guards against a recycled PID). macOS keeps the ps fallback, now with the process-group check, and Windows still never reaps.
  • An org_task_done call with no evidence object no longer spends an evidence attempt. On the release org's first run, 4 of 6 tasks lost an attempt toward max_evidence_attempts because the role's first call simply omitted evidence — a formatting slip, not a failed proof — leaving them one refusal from escalation. Such a call is still refused and requeued, and the returned notice says it did not count; failed checks, a stale sha and an unknown worktree still count.
  • The no-progress alarm no longer fires for a role that has nothing to do. role "publisher" has been running for 30m without a single bus event — it is hooked but producing nothing was emitted for a role with no task whose process had exited on session_idle_exit_ms and was parked waiting for mail. The alarm now only considers a role with a running task, undelivered mail, or a turn in progress (not parked on its mailbox); a role with a running task or pending mail that emits nothing still trips it.
  • monodesign URL detection intermittently failed with "monobrowse: CDP connection closed" when browsers launched concurrently. Each detection launch picked its own CDP port (random in 9520-9899, "free" per a probe made before Chrome bound it), so two concurrent launches — e.g. test files run in parallel by node --test — could pick the same port. The second Chrome then did not fail: it logged bind() failed: Address already in use, silently listened on [::1]:<port> instead, and monobrowse (polling 127.0.0.1:<port>) accepted the other launcher's Chrome as its own. When that owner closed its browser, this launch died mid-connect, and its own Chrome was left running. launchBrowser({ port: 0, userDataDir }) (monobrowse 1.0.18) now has Chrome take a kernel-assigned port and reads it from DevToolsActivePort in its own profile directory, so the endpoint is always the process it spawned; monodesign 1.2.18 uses it for every launch without a forced MONODESIGN_MONOBROWSE_PORT.
  • Two concurrent monomind browse open calls (or any two port-less launchBrowser() callers) reliably failed one of the two with "Chrome exited before the CDP endpoint opened on port 9222 (code=21, signal=null)". The port-scan probed each candidate with a TCP connect before spawning Chrome on it, which only proves nothing was listening a moment ago — two racing callers could both see the same candidate as free and both spawn Chrome there, so one lost the real bind and its launch threw instead of moving on. A launch that loses this race now checks whether something else is now listening on that candidate and, if so, retries the next one exactly like an already-occupied port, instead of failing outright. Also fixed a related bug the retry uncovered: process tracking used for closeBrowser()'s kill fallback recorded a spawned pid before confirming it had actually bound the port, so a racing loser's about-to-exit pid could overwrite the winner's entry; tracking now happens only once, at confirmed success.
  • monomind search <query> (and search --type code) printed a bare "No results found." on a fresh project with no indication of what to do next. The code capability searches the monograph knowledge graph's on-disk database, which only the explicit monomind monograph build populates — the directory scan search auto-runs on first use just records that code files are present, it doesn't index their content. So a fresh project legitimately returns zero code results, indistinguishable from "no matches" on the user's side. When the code capability is active, results are empty, any --type filter is unset or code, and the index database doesn't exist yet, search now prints a one-line hint: "Hint: the code index has not been built yet. Run monomind monograph build and search again."

npm: monomind@2.15.6, @monoes/monomindcli@2.15.6, @monoes/monodesign@1.2.18, @monoes/monobrowse@1.0.19

v2.15.4

View on GitHub

Added

  • An org skill library, fed to roles by name. @monoes/monomindcli now ships ~380 curated skills in org-skills/: monomind's 111 role archetypes, three monomind skills (monograph-code-navigation, monodesign-ui-quality, monolean-minimal-change) and 266 skills curated from nine MIT/Apache-2.0 repositories (ECC, superpowers, anthropics/skills, wshobson/agents, alirezarezvani/claude-skills, Jeffallan/claude-skills, marketingskills, K-Dense scientific skills, context-engineering skills). Each imported skill records its source repository, path, commit and license, and keeps the license text beside it; org-skills/SOURCES.md lists every source with its copyright notice.
  • Two role fields: skills and skill_pool. skills pins library skills into a role's system prompt for the whole run. skill_pool (names or tag:<tag>) lists skills the role may load mid-run with the new org_skill_load tool — only their one-line descriptions sit in the prompt, so the prompt stays a stable cache prefix while a role can still pick up expertise per task.
  • Tools follow skills. A skill declares the monomind MCP tools its work needs; the daemon attaches the monomind MCP server to the role allow-listed to exactly those. Code roles get monograph_*, UI roles get monodesign_*, and a role whose skills need neither gets neither.
  • monomind org skills list|search|show|import. Browse and rank the library, and import skills from another repository into the project (.monomind/org-skills) or ~/.monomind/org-skills — both override the shipped library. Only MIT and Apache-2.0 skills are accepted; a skill's own license wins over its repository's.
  • /mastermind:createorg now searches the library for each role and writes skills/skill_pool explicitly.

Changed

  • ui.icon no longer selects prompt text. The icon is only the role's picture on the canvas; archetype guidance is now a library skill named in skills. monomind org migrate converts an archetype icon into an explicit skills entry, and loadout skills resolve from the same library. org validate and org run reject unknown skill names.

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

v2.15.0

View on GitHub

monomind 2.15.0

Upgrading — the dashboard now requires a login. Its pages and human-decision routes no longer serve an unauthenticated request, so opening http://localhost:4242 directly is no longer enough. Run monomind dashboard open, which issues a one-time login link (add --print to emit the link instead of opening a browser, e.g. over SSH). Anything that scripted the dashboard's HTTP routes needs that login.

Org roles lost write access to decision state. A role can no longer write gate, approval, question or inbox files. A queued inbox line not written by the daemon, CLI or dashboard now arrives marked unverified(<sender>) rather than being trusted.

Added

  • A brain per browser profile. Captures are scoped to the profile they came from, so a work profile and a personal one no longer share one undifferentiated library.
  • CDP over the mono-agent extension bridge. CdpClient owned its WebSocket outright, which made "CDP" and "a socket to a Chrome we launched" the same thing. The transport is now pluggable: the local path is the original code moved wholesale and connect(wsUrl) is unchanged for every caller, while a second transport drives the user's real, logged-in Chrome through the extension bridge. Console capture, network, HAR, vitals, traces, CPU profiles and the AX tree all work against it without porting a single instrument. Documented limits rather than worked around: MV3's chrome.debugger exposes no HeapProfiler domain (heap snapshots do not work over the bridge) and no Browser domain; attaching shows Chrome's debugging banner; DevTools and the debugger are mutually exclusive on a tab.
  • monomind doc lookup <url> — answers "is this already saved, and what was noted about it" on capture identity (canonical URL with the fragment stripped, the same rule ingest dedupes by), returning the note written at save time, the version count and the envelope path. The older substring filter is now reachable as --text on doc list and doc search; it matches any longer URL merely containing the string and carries no note, which is the whole difference between a lookup and a bookmark.
  • monomind dashboard open — see the upgrade note above.
  • Org: an opt-in notice to a task's creator when it completes.

Changed

  • Two files that had outgrown themselves were split, as a standalone commit so it can be reviewed or reverted without touching the features. document-pipeline.ts 1399 → 48 lines (a barrel over 7 focused modules), exported surface verified identical at 22 names before and after, so all 40+ import sites are untouched. monobrowse's cli/commands.ts 4228 → 380 lines over 12 command-group modules. The second could not be split until a hidden coupling was fixed: six module-level let bindings written from 82 call sites. ESM import bindings are read-only for importers, so nothing could move out while that state lived in the module; it now sits behind one object, and that rename alone was verified behaviour-neutral before anything moved.

Fixed

  • A publish with npm instead of pnpm could ship an uninstallable package, and did. @monoes/monodesign@1.2.12 went out with a literal "@monoes/monobrowse": "workspace:*" in its manifest, because npm copies package.json verbatim where pnpm rewrites the protocol. Every consumer install then failed with EUNSUPPORTEDPROTOCOL, and because the releases current at the time resolved monodesign by ^1.2.x range, 2.13.0 and 2.14.0 both became uninstallable — releases that had been fine for days, broken by a sibling publish that touched none of their code. Fixed at the source: scripts/check-workspace-publish.mjs blocks prepublishOnly for any package with workspace: dependencies unless the publish is via pnpm, now wired into monodesign and hooks (the CLI has had this guard since #130 and was never affected). @monoes/monodesign@1.2.13 is published correctly and 1.2.12 is deprecated; 2.13.0 and 2.14.0 install again with no action needed.
  • Dashboard: Human Input drafts survive a list rebuild; a concurrently resolved approval is distinguished from an ended one; a stale approval reports as ended rather than 404.
  • Org: a relative MONOMIND_ORGRT_OPERATOR_DIR is masked from roles.

Security

  • An authority mask for every role outside the SDK sandbox. Push-capable roles and non-Claude CLIs now run under a bubblewrap mask rather than inheriting the operator's authority.
  • Signed inbox entries, and decision gates held in memory for the duration of a run.

Action needed if you use the dashboard. It now requires a logged-in browser. Run monomind dashboard open (or --print over SSH) to get a one-time login link; the session then lasts 30 days in that browser. Opening http://localhost:4242 directly shows how to log in instead of the dashboard.

Changed

  • The dashboard only acts for a browser you logged in yourself. Its pages used to hand the dashboard token to any local program that asked, and that token could approve tool calls, resolve gates, answer questions, message roles and edit org config, so anything running as you, org roles included, could act as you. The pages now need a session cookie, which a browser gets from a one-time, ten-minute login link (monomind dashboard open, or the tab the dashboard opens when it starts). Approvals, gates, answers, chat and config edits are refused without it, even with the token. The token keeps its machine uses (hooks, the CLI, event forwarding), so nothing else changes. The session-start hook that pairs a project with a dashboard already running for another project no longer scrapes the page; it reads the new GET /api/identity (pid, project dir, token file path, never the token).
  • Removed dashboard code for the v1 org model: 22 org tabs that could no longer be shown, and 10 GET /api/org/:name/… routes that only read v1 files nothing writes (projects, members, issues, environments, workspaces, invites, my-issues, secrets, join-requests, goals). No live view used them.

Fixed

  • Approving a tool call for an org that is not running looked like it worked, but did nothing. 2.14.0 recorded the decision in the org's approvals.json, but nothing reads that file back: an approval request lives in the run that asked for it, and a new run asks again. The dashboard now refuses the decision (409) and says why. It does the same when a daemon started since then (for example a --resume in a new process) no longer holds the request, instead of reporting a bare 404. While no daemon hosts the org, its pending approvals show as expired instead of counting as waiting on you. Gates and answers are unchanged, because the next run does read those.
  • Human-in-the-loop decisions and the Runtime tab could reach a same-named org in another project. The daemon registry is machine-wide and keyed by org name, so an approval, answer or chat message for project B's dev went to project A's running dev, and B's Runtime tab showed A's run. A daemon now counts only when it is registered for the same project root.
  • A malformed approval or gate id, or a client that disconnected mid-request, could crash the dashboard process. Those requests now get 400; a body over 64 KB gets 413 instead of a reset connection. A multi-byte character split across network chunks is no longer corrupted.
  • The Runtime tab left out budget exhaustion, agent-fatal, loadout mismatches, session and coordinator crashes, and context-limit restarts. The runtime emits the first three as status events, not audit events, and the rest were not on the list.
  • /health counted a stopped-then-resumed run twice. It now counts each run once, by how it last ended.
  • A chat message the daemon refused now shows the daemon's reason. A network failure when sending chat now says so, and an org event no longer wipes an answer you are halfway through typing in Human Input. One unreadable questions.json no longer hides the same org's approvals and gates. The Config tab refuses a non-string goal instead of saving "null".

Security

  • An org role could redirect the dashboard's file writes to any file the user owns. When the dashboard recorded a decision for an org that was not running, or saved its config, it wrote through a predictable temp file (<file>.<pid>.tmp) in a directory roles can write to. A link planted there redirected the write, with agent-chosen content, to a file such as ~/.bashrc. Temp files are now created exclusively (O_EXCL) with a random name.
  • Values from runtime files an agent can write reached the Runtime tab's HTML unescaped. They came from the run checkpoint, the run history and the settings panel. They are now escaped.
  • An org role could approve its own decision gate. A running org re-read gates.json for every pending-gate check, and that file sits in a directory the org's roles can write to. A role that rewrote it, or swapped the directory holding it, unblocked itself. A running org now holds its gates in memory and writes the file only as a record, restoring it when the run stops.
  • An org role could pose as you in the next run. The org inbox (inbox.jsonl) is delivered when an org starts, as whichever sender each line names, human included. Entries are now signed with a key the roles cannot read. A line that does not verify arrives as unverified(<sender>) with a marked subject. Messages queued by a version before this one also arrive unverified.
  • Roles at policy.git: push, roles with the sandbox off, and every non-Claude runtime could read the operator credentials and write the decision files. Only Claude roles below push ran sandboxed. Every role is now kept from human authority: the operator-credential and dashboard-auth directories are hidden, the dashboard token files are unreadable, and gates.json, approvals.json, questions.json and inbox.jsonl are read-only. Roles outside the SDK sandbox get this from a minimal bubblewrap layer that adds no other restriction. Where bubblewrap cannot run, the role starts anyway and an authority-mask-unavailable audit event says so.
  • A relative MONOMIND_ORGRT_OPERATOR_DIR was not masked from roles. The broker uses a relative value as-is, but the role deny rules only accepted absolute paths. They now resolve it the same way.

v2.12.0

View on GitHub

Breaking Changes

  • Node.js >=22.12.0 is now required by every published package (monomind, @monoes/monomindcli, @monoes/hooks, @monoes/monograph, @monoes/monobrowse, @monoes/mcp, @monoes/memory, @monoes/routing, @monoes/monodesign, monofence-ai). The declared floor had stopped matching reality — engines.node was >=20.0.0 in some manifests, >=18.0.0 in others, and absent from four published packages entirely, while two optional dependencies already required more. monomind doctor reported "pass" on Node 20 the whole time; it now reports warn/fail below 22.12.0 and names the real floor. Node 20 reached EOL 2026-04-30.

    How this actually behaves differs by installer, measured on a real Node 20.20.2 install rather than assumed: npm install with engine-strict=true hard-fails with EBADENGINE; a default npm install only warns and installs anyway; pnpm install gives no warning or error at all. A runtime floor check in the CLI entrypoint is a candidate follow-up, not part of this change.

Security

  • Org roles no longer inherit ambient ANTHROPIC_API_KEY / ANTHROPIC_AUTH_TOKEN / ANTHROPIC_BASE_URL when running a non-Anthropic provider or CLI. Every vendor-CLI runner (codex, grok, qwen, opencode, hermes, copilot, kimicode, pi, antigravity, crush) and the version probe used by monomind agent scan built their child environment as { ...process.env, ...args.env } — a spread does not delete, so resolveProviderEnv's deliberate strip of these three keys for subscription mode (the default) was silently undone before the child ever saw it.

    Migration: if your org relied on an exported ANTHROPIC_API_KEY reaching a subscription-provider role (the previous, unintended behaviour), declare it explicitly instead: provider: { kind: 'api-key', apiKeyEnv: 'ANTHROPIC_API_KEY' }

Added

  • monomind init upgrade now refreshes the generated CLAUDE.md and .monomind/CAPABILITIES.md alongside the statusline and helpers, so an existing project picks up corrections instead of keeping whatever its first init wrote.

Fixed

  • The generated CLAUDE.md and CAPABILITIES.md told new projects things that were not true. They asserted that Claude Code MUST initialize the monoswarm before complex work — nothing in src/ requires or enforces that — and hard-coded a background-worker count that drifted from the real roster. Both the worker count and the command tables are now derived at doc-generation time from the actual registry, so they cannot silently go stale again.
  • Optional packages resolve via import.meta.resolve instead of require.resolve, which failed for callers whose module graph never referenced the package.

All 8 sibling packages were published ahead of the CLI, so every workspace:* pin resolves.

Full Changelog: https://github.com/monoes/monomind/compare/v2.11.12...v2.12.0

v2.11.12

View on GitHub

No consumer-visible change: the CLI is identical to 2.11.11. This release carries a release-process guard, which lives in the repo's own scripts/ and does not ship.

Added

  • A publish is blocked when a workspace:* pin names a version that is not on npm.

    2.11.10 and 2.11.11 both shipped depending on @monoes/monograph@1.6.6, a version that never reached the registry — monograph was bumped for the #298 hooksPath fix by an agent org with no publish rights. Both releases were uninstallable; every consumer died with:

    npm error notarget No matching version found for @monoes/monograph@1.6.6
    

    Nothing in the existing chain could catch it, because pnpm publish rewrites workspace:* to whatever the sibling declares without ever asking whether that version is public. scripts/check-published-pins.mjs now resolves each pin to the version pnpm will write into the tarball, verifies it against the registry, and fails with the exact pnpm publish needed to fix the ordering.

    It is the mirror of check-package-bumps.mjs: that guard proves a changed package was bumped, and the bump is precisely what strands the pin until someone publishes it — they only work as a pair.

    Escape hatch: MONOMIND_ALLOW_UNPUBLISHED_PINS=1.

Full Changelog: https://github.com/monoes/monomind/compare/v2.11.11...v2.11.12

v2.11.11

View on GitHub

Carries over skill work that had been sitting unreleased across earlier sessions.

Changed

  • mastermind/SKILL.md is now a router. Each of the five platform trees (.agents, .claude, .gemini, .kimi-code, and the CLI package's own .claude) inlined the full body of every mastermind workflow, so loading the router loaded all of them. It now lists the workflows and says which to load, leaving the detail in the domain skills — roughly 1000 lines of duplicated inline content drop out. Same treatment for the per-platform tool-mapping references.

Added

  • The monomind-status command and skill for Claude Code and kimi-code, and the kimi-code monodesign skill, which the other platform trees already shipped.

Fixed

  • .gitignore listed six specific paths under data/ and missed data/unknown-events.jsonl, so 31MB of runtime run logs showed as untracked. data/ holds nothing but runtime state and no file under it is tracked, so it is now ignored wholesale — the same drift, and the same fix, that be4051b43 applied to the .monomind directory.

Full Changelog: https://github.com/monoes/monomind/compare/v2.11.10...v2.11.11

v2.11.10

View on GitHub

Security

  • Crash reports are no longer filed without consent. The crash reporter opened a public GitHub issue on every crash with no consent step of any kind — no prompt, no opt-out, no TTY check. Consent is now tri-state (enabled / disabled / unanswered); an absent config reads as unanswered, not enabled. An interactive crash prompts once (showing the local report path first, defaulting to No). A non-interactive crash — which is most monomind runs, including agents and CI — only ever saves locally and never prompts or files.
  • The monoes.me OAuth token is no longer written into .mcp.json, a file that is routinely committed. doctor now detects the exposure, warns loudly, and keys its remediation on what it actually found rather than on whether a file exists.
  • Secret redaction widened: the six credential-prefix patterns dropped a leading boundary assertion that made them miss matches, and keyword shapes now match with surrounding quotes and spaces.

Added

  • org_complete is gated, and every stop path records the real reason an org stopped instead of leaking the raw SDK abort string (#302).
  • File-tool roots now match the Bash sandbox — a role reaches $TMPDIR, the org root and policy.sandbox.allowWrite, nothing more (#303).
  • doctor registers the crash-reporting check and surfaces native checks in --help.

Fixed

  • Org-runtime git guard, a series of escapes closed: the reflog allowlist examined only argv[0] instead of every token and is now fail-closed (#299); git stash is denied unconditionally below push (#300); policy.git read widened to the real read-only git surface; leaked .git/worktrees/<name> metadata is pruned unconditionally; an unlistable socket dir is masked instead of the socket.
  • mcp monoes-proxy no longer dies to the 5s exit watchdog, and the monoes.me proxy speaks Streamable HTTP.
  • monograph no longer mis-joins an absolute core.hooksPath (#298, monograph 1.6.6).
  • 119 dashboard onclick handlers threw ReferenceError; they now work.
  • init no longer narrows an existing blanket .monomind/ gitignore entry.
  • Prompts resolve immediately on EOF instead of hanging until a fallback timeout.
  • A test bug that only surfaced where TMPDIR is unset — the default on CI. The role-sandbox hermetic-env allowlist assigned an absent TMPDIR with a plain key, and since process.env coerces values to strings it wrote the literal string "undefined". os.tmpdir() returned that verbatim and all 12 tests in the describe failed with ENOENT. It passed only on machines that happen to export TMPDIR.

Full Changelog: https://github.com/monoes/monomind/compare/v2.11.9...v2.11.10

v2.11.9

View on GitHub

Fixed

npm install monomind is audit-clean again (#266).

A clean install reported four high-severity sharp<=0.35.4-rc.0 advisories, pulled in transitively through @huggingface/transformers. @huggingface/transformers is bumped ^3.8.1 → ^4.3.0.

Why nothing smaller worked: 3.8.1 declares sharp: ^0.34.1, so no version inside its range is safe. Neither a root overrides entry nor a sibling floor could fix it — a sibling floor made npm nest a second vulnerable copy rather than dedupe. 4.3.0 declares sharp: ^0.35.4.

Verified with the issue's own repro — a clean consumer install of monomind@2.11.9 resolves sharp@0.35.4 and npm audit reports 0 vulnerabilities.

Real-world exposure was low (both advisories require processing untrusted image input, and monomind only ever hands transformers text), but the dependency-graph risk and the audit noise were real.

Two follow-on fixes required by the v4 bump:

  • embedding-operations.ts now pins dtype: 'q8', matching memory-bridge.ts. Since v4 the default is fp32 (onnx/model.onnx), which the provisioning step never fetches — leaving it unset would have failed every load under local_files_only and silently degraded semantic search to the 128-dim hash fallback.
  • The Second Brain Model doctor check looked for .cache/Xenova, a model the bridge no longer uses, so it reported "Embedding model not downloaded yet" with a fully provisioned cache on disk. It now checks the model actually in use, and its fix hint names monomind doc eval --provision-model instead of monomind doc search, which passes local_files_only and never downloads anything.

Note for existing installs

The model cache lives at a version-keyed path inside node_modules, so this bump orphans any warm cache. Re-provision once with monomind doc eval --provision-model (~270MB). Until then semantic search falls back to keyword matching — which monomind doctor now reports accurately.

Full Changelog: https://github.com/monoes/monomind/compare/v2.11.8...v2.11.9

v2.11.7

View on GitHub

[2.11.7] — 2026-09-18

Added

  • The org bus now carries a tool_result event when a tool call completes, so "did that command work?" is a field rather than an inference from the agent's own narration — a Bash running a test suite previously looked identical on the bus whether it passed, failed, or the binary was missing. Correlated to its invocation by the SDK's per-call id (so two concurrent Bash calls from one role stay distinct), carrying ok, duration and output capped at 4,000 characters with redactSecrets applied before the cut and truncation signalled structurally. Typed as ToolResultEventData in types.ts rather than an ad-hoc literal; runners that cannot observe tool completion simply never emit it (#289: a4bcf86e6).
  • Decision traces carry a structured kind (fence-block, gate-pending, policy-deny, approval-pending, approval-resolved, cross-org-handoff, …). A prompt-injection fence block and a routine wait for human approval previously emitted identical structured fields, distinguishable only by matching English prose. The field is required in recordDecision's signature, so the compiler guarantees every emitter populates it — which covered four emitters, not the two originally reported (#290: 071a64618).

Fixed

  • Org run memory was silently dropped when the memory backend could not load: bridgeStoreEntry returns null, storeRunMemory ignored it, and its caller's catch never fired because nothing threw. Runs completed normally, runtime.json and history were written, the bus looked perfect — and every org_recall came back empty, with the only trace printed under MONOMIND_DEBUG=1. A failed store now surfaces three ways that outlive the terminal: an org-memory-store-failed audit event, an unconditional warning, and a memoryError field in runtime.json that org status prints (human and --format json). It deliberately does not throw — by then the run has succeeded and its history is on disk, so throwing would fail a run that worked and blame history for it. The same swallowed-null pattern was fixed in four more callers, two of which actively misreported: hooks post-command returned recorded: true for a write that never happened and skipped its JSON fallback (losing the record twice), and a consolidation worker counted patterns it never wrote (#293: bc75ea501).
  • policy.git denials now name the boundary and the allowed alternative, not just the rejected attempt. "path escapes org workdir" never said what the workdir was, so a role could only guess another path — in one rehearsal a reviewer's single Read was denied, it never learned the root it ran under, and it reviewed from submission messages without reading a line of code. Five denial messages fixed: workdir escape, write-scope, path-less Grep/Glob, tool allowlist and research-domain allowlist (#291: 3911a5e16).
  • monomind org branch <org> <run> <label> read as though <label> named the new run; the id is generated, and the label was not merely a note — it was discarded entirely, never reaching .branch-source. The label is now recorded, --format json prints the generated id ({"v":1,"org":…,"run":…,"from":…,"label":…}) so a script can replay without parsing prose, and the help no longer shows a label in the id position. The label is deliberately NOT used as the run id: run ids are joined into filesystem paths and the codebase already guards that shape against traversal (#292: f4c08a3d0).
  • biome linted nothing inside .claude/worktrees, which is where this repo's own workflow puts worktrees: npx biome check reported "Checked 0 files" and naming a file said the path was ignored. A "lint is clean" reading was really "biome refused to look" — CI was unaffected, but anyone working the recommended way was misled. The ignore pattern now excludes the .claude assets without excluding a worktree checkout's own source, with a repo test asserting both directions (#294: 71b3e1700).

Changed

  • scripts/sync-claude-trees.mjs (pnpm run sync:claude-trees, with --check in verify and CI) keeps the five .claude asset trees canonical after init marks files in this repo. It normalises rather than mirrors: the shipped packages/@monomind/cli/.claude is init's asset source, so copying the marked root copy into it would ship per-project markers to every npm user and make the next init nest a second block inside the first. It never creates and never deletes, which is how the shipped superset is protected structurally. The dead sync-claude-assets.sh (a hard exit 1 since July, still referenced by three checklists) is deleted, and the parity test, skill lint and doc/publishing.md now name the real command (42cb52e65).
  • @monoes/hooks 1.0.6 → 1.0.7 (the consolidation-worker fix above).

npm: monomind@2.11.7 · @monoes/monomindcli@2.11.7 · @monoes/hooks@1.0.7

v2.11.6

View on GitHub

[2.11.6] — 2026-09-18

Fixed

  • An org you stopped could come back to life ~10 seconds later. When a boss agent crashes, the runtime arms an auto-restart timer (10s backoff by default); when it fired it re-checked only whether a stop was in flight, which is never true by then, since a stop completes in far less time. Stopping an org with a restart pending therefore resurrected it: fresh sessions spending budget, runtime.json rewritten to running, a process exit handler re-registered, and nothing left that would ever stop it again (in a deterministic test, one stop was followed by three starts). The timer now also requires the org to still be registered — which distinguishes the two cases exactly, since a crashed boss leaves the org registered while an operator stop removes it (793e7c75f).
  • finishStop snapshotted the resume checkpoint before releasing the run's process exit listener, watchdog interval and broker lease. A throw in between — which a half-started org can provoke, as it may lack the state the snapshot expects — aborted the stop and left all three behind for a run that no longer existed, and nothing surfaced it because startOrg's teardown path swallows a rejecting stopOrg to report its own error. The three releases now happen first and both checkpoint captures are best-effort: a run that cannot be checkpointed must still stop and clean up (#288: 44b5ebb2e).

Both bugs showed up as the same CI symptom — a leaked process listener in the half-started-org test — and each was independently necessary: the run carrying only the second fix still failed.

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

v2.11.5

View on GitHub

[2.11.5] — 2026-09-18

Fixed

  • 2.11.4 shipped the monograph fix from #279/#280 that nobody could use. @monoes/monograph stayed at 1.6.4 — the version already on npm from five days earlier — while only the CLI and umbrella were bumped. Every sibling is pinned workspace:*, which pnpm resolves at pack time to the version that package declares, so the published CLI depended on the pre-fix tarball: GroupedConst/GroupedVar were still missing from the graph on a clean install. This release publishes @monoes/monograph 1.6.5 (the fix), @monoes/routing 1.0.5 (25 changed source files, unpublished since 2.9.24) and monofence-ai 1.0.3. scripts/check-package-bumps.mjs now fails the build — and tests/repo/publish-bumps.test.ts fails CI — when a publishable package has commits touching shipped files since its version was last set (#285: 4dd18df6e).
  • init --force appended a marked copy of each skill file instead of wrapping the content already there — the same defect #276 fixed for CLAUDE.md, still present in the skills writer. In this repo codex-tools.md went 64 → 130 lines with its body present twice; six reference files doubled. The skills writer now shares #276's managed-block primitive: an older unmarked skill file is migrated in place, repeated runs are byte-identical, and a project already damaged by 2.11.4 heals back to one copy on the next init --force. A block belonging to another platform in a shared skill root is never absorbed (#286: e8284a668).
  • init --force rewrote .monomind/config.yaml and .monomind/CAPABILITIES.md on every run purely to update their Generated: timestamp, dirtying the repo for no actionable information. When the timestamp is the only difference the file is now left untouched, mtime included; a real content change still writes and refreshes the stamp (e5a9d0238).
  • The .claude tree the CLI ships had drifted from the root tree: 2.11.4's regenerated settings.json (post-bash and notification hooks, longer pre-write timeout) reached maintainers but not installed users. Synced, and the duplicated skill files 2.11.4's init produced are restored (499a90133, 08f9083c4).

Changed

  • tests/repo/publish-bumps.test.ts and scripts/check-package-bumps.mjs discover publishable packages rather than listing them, so a new package is covered the day it is added; tests and markdown do not count as shipped code, and a manifest-only commit counts only when a key consumers actually resolve changed. MONOMIND_ALLOW_STALE_PACKAGES=1 is the escape hatch for a package that genuinely ships nothing (#285).
  • The hook-order test now derives its fixture from the settings template instead of the repo's own .claude/settings.json, which it had required to be out of date (6adf50809).

npm: monomind@2.11.5 · @monoes/monomindcli@2.11.5 · @monoes/monograph@1.6.5 · @monoes/routing@1.0.5 · monofence-ai@1.0.3

v2.11.4

View on GitHub

[2.11.4] — 2026-09-18

Fixed

  • monomind hooks list rendered Priority, Executions and Last Executed columns that nothing populates — and "Never" was actively false, e.g. the route hook had 500 recorded runs. Priority exists only in an in-memory registry production code never fills; there is no per-hook last-executed timestamp; and the counters that do exist are keyed by handler, a different name space (only 6 of 24 registry names overlap, so a join would be guesswork). The three dead columns are gone, and the real per-handler counts now appear as a "Handler invocations" section under the existing Claude Code wiring block — omitted entirely when no data has been recorded, rather than shown as zeros (e4e1fd2be).
  • Four overrides blocks (root package.json, and the cli, mcp and monograph packages) were never applied but read as protection: pnpm v10 takes workspace overrides from pnpm-workspace.yaml, and the blocks had silently diverged from it. Every entry was either byte-identical to the live one or, in the case of ws: "$ws", unresolvable — the root package declares no ws dependency for that syntax to match — so all four are removed with no constraint ported or weakened (pnpm why output for every affected package is identical before and after, and the lockfile is untouched). scripts/check-overrides-source.mjs, wired into check:versions and prepublishOnly, now fails when any manifest declares overrides/resolutions, reporting per entry whether it is redundant, disagrees with the applied range, or is a constraint applied nowhere (#284: 010254f96).

Changed

  • Docs cite source by symbol ([\orgrt/daemon.ts → startOrg`](…/daemon.ts#startOrg)) instead of by line number. 97 of the 200 line references in the living docs were already wrong, and OrgDaemon— hand-corrected to L438 a day earlier — had already moved to 444. Symbol anchors only break when a symbol is renamed or deleted, andscripts/check-doc-refs.mjs(wired intoverify) then fails by name; it also rejects any reintroduced #L<n>anchor. 200 references converted across 13 docs, 3 dead file paths repaired. The 134 references underdoc/reports/` are left as they are: each report states the commit it was reviewed at, so its line numbers are pinned rather than rotting (b9bc46552).
  • Tracked platform assets regenerated with 2.11.3: managed-block delimiters applied in place on CLAUDE.md, AGENTS.md, .agents/shared_instructions.md and the 14 .claude skill files; CLAUDE.md now matches the detected stack (/packages and pnpm, not /src and npm); .claude/settings.json gains the post-bash and notification hooks; .kimi-code agents drop mode: subagent, an opencode-only field the kimi generator ignores by design (b3b2d3397).

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

v2.11.3

View on GitHub

[2.11.3] — 2026-09-18

Fixed

  • hooks post-task --success true|false recorded the wrong thing entirely: the argument parser set a declared boolean flag to true and left the literal true/false in the positionals, where ctx.args[0] || ctx.flags['task-id'] picked it up as the task ID. On the invocation CLAUDE.md documents, --task-id abc --success false printed Task false recorded as successful — the real ID discarded and a failed task recorded as a success. A declared boolean flag now consumes an immediately following true/false; bare --flag, --no-flag and combined short flags are unchanged. This affected every boolean flag in the CLI (#269: 7c573b672).
  • mcp start --daemon was a no-op — the flag was read, passed to the server options, and never consulted — so -d blocked the terminal; and an unref'd 5s force-exit watchdog in bin/cli.js killed every mcp start, foreground included, about 6s after startup (measured). -d now re-execs detached with output to ~/.monomind/mcp.log and reports the child's own PID, and the watchdog exempts a foreground server. mcp stop also only deleted the PID file for a daemon, leaving it running and unreachable; it now signals the recorded PID (#267: d4354f84b).
  • mcp status always reported stdio, localhost and port 3000 because nothing about the running server was recorded — a separate status process only had its own defaults, which also aimed the health probe at the wrong port. The server now writes its transport/host/port beside the PID file (#268: 73c16d9d8).
  • hooks list showed every hook as "Enabled: No": the table rendered an enabled column the static registry never populated. Hooks now report their real state, and the separate Claude Code event wiring in .claude/settings.json is reported as its own labelled section (#270: ca5413378).
  • CopilotAgentRunner always reported 0 tokens, so a copilot role looked free and its budget cap could never engage. Usage is now read from the CLI's --usage-output-file JSON and summed across tool-fence rounds; cost_usd is deliberately left unset because copilot meters in AI credits and premium requests, never USD. The same work uncovered that the runner extracted no assistant text at all — the real NDJSON nests payloads under data, which none of the four checked shapes matched (#181: ef60e0b55).
  • monomind org status called a live run "crashed" whenever its recorded pid was stale (the pid is persisted only at start and stop, so re-attaching leaves one that answers to nothing). Liveness now falls back to the daemon heartbeat and then to recent bus activity, and says which evidence proved it live; JSON consumers still see only running/crashed (#274: 1bb4a0a9d).
  • org_task auto-dispatch delivered only the task title when an org_send briefing was issued in the same turn: they were two mailbox pushes and a role consumes one per turn, so the briefing always arrived a turn late. Both now arrive as one message (500ms coalescing window, DISPATCH_COALESCE_MS) (#275: 0207cadbd).
  • The release-gate org's hygiene step ("empty TMPDIR") could delete the scratch of the session running it — the shared temp dir also holds the agent harness's own per-session state, and wiping it broke a coordinator's shell mid-run. Hygiene is now narrow and run-scoped, with a test that fails if a wholesale-delete instruction is reintroduced into the shipped config (#273: 5b0c2931f).
  • monograph build failing on a better-sqlite3 ABI mismatch gave advice that could not work: under a global install the loaded binary sits in the install tree, so npm rebuild from the project rebuilds a different copy — which is why repeated rebuilds left the file byte-identical. monomind now names the exact binary, the Node ABI it disagrees with, and the one command in the one directory that fixes it; it rebuilds automatically when the tree is writable (MONOMIND_NO_NATIVE_REBUILD=1 opts out) and pins PATH to the running Node so the rebuild targets the right ABI; doctor gained a Native modules check that detects it without needing a crashed build's log (#231: e736fa6f3).
  • The monobrowse close-browser test could hang until its 60s timeout and fail an unrelated CI job: it drove a real filesystem read with fake timers, so all 60 advances burned 120,000 fake ms in ~50ms of real time and the process-exit poll never started, leaving an unsettled promise nothing could drive. The wait is now event-driven, and a timed-out run can no longer leak a real SIGKILL past restoreAllMocks (#283: fcf1f8ccb).
  • doc/commands/security.md and the security command's own subcommand list advertised a container scan type that hard-errors "not implemented"; removed from both (#271: feee3ce2a).
  • doc/concepts/org-runtime.md listed 6 of the 14 accepted runtime values (grok and hermes were the reported gap; 8 were missing) and documented max_turns_per_message as defaulting to 30 when the real default is 100,000 — the knob people reach for when a role is cut off. Also corrected idle_minutes' effective default, the role id constraint (that regex governs org names, not role ids), the deprecated gemini/openai provider kinds, and stale line references (#272: b5aa32cb6).

Note for upgraders

2.11.2's init --force fix migrates in place: a project initialised by an older monomind has an unmarked generated body in its CLAUDE.md (and .agents/shared_instructions.md), and the first init --force on 2.11.2+ replaces that body and wraps it in the current <!-- monomind-block:… --> delimiters instead of appending a second copy. Text you wrote outside the generated block is preserved in place; an already-doubled file heals back to one copy.

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

v2.11.2

View on GitHub

[2.11.2] — 2026-09-18

Fixed

  • init --force appended a second complete copy of the managed instructions to CLAUDE.md (230 lines became 455 in this repo, every rule stated twice) for any project initialised before the <!-- monomind-block:… --> delimiter existed: the writer recognised only its own current delimiter, so an older unmarked generated body read as user content and a fresh block was appended on every run. The merge primitive now also recognises the older # monomind:start <marker> pair and an unmarked generated body (matched structurally, conservatively — anything not provably generated terminates the region rather than being swallowed), replaces it in place, and migrates it to the current delimiter; an already-doubled file heals back to one copy, and repeated init --force runs are byte-identical. Same primitive backs .agents/shared_instructions.md (#276: 22918c7bd).
  • Every monomind platforms subcommand printed nothing at all — doctor, plan, install, upgrade, uninstall, setup, docs and even its error paths formatted their output with the colour helpers that return a styled string and discarded it, so platforms doctor --platform claude (which doctor tells you to run) wrote 0 bytes and exited 0. They now print (#277: e2c29d7a4).
  • platforms doctor reported all 16 platforms as legacy immediately after a fresh install: legacy ownership matched any monomind:start marker without requiring the old unnamed form, and flagged the shared skill roots (.agents/skills, .gemini/skills) on mere existence though they are the current portable layout. Because platforms install --all gates migration on the same predicate, it was rewriting current blocks and leaving stray marker-name lines in CLAUDE.md/AGENTS.md. A fresh install now reports 0 findings (#277: e2c29d7a4).

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

v2.11.1

View on GitHub

monomind v2.11.1

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

Added

  • Org runtime: every role now gets an explicit adapter_config.model when an org is created (mastermind-createorg templates, org create, and init's sample org) — the user's choice, or else the latest model for its runtime (claude-sonnet-5 for Claude, vendor defaults from VERCEL_PROVIDERS otherwise) — closing the drift where an unset model silently followed whatever the runtime's own default happened to be (3a6a4bca8).
  • Memory: entity resolution now tolerates common name-spelling variants (Node.js vs nodejs, case/separator/plain-plural differences) via a new coarser mergeKey fold, validated on a blind-labeled benchmark at F0.5 0.775 vs 0.480 for the previous exact-match identity — wired in as a purely additive second index alongside the existing exact-match one, so it can only ever promote or flag a candidate, never merge two differently-typed entities on its own (PR #260: 0450ecc97, 13d87a905).
  • Memory: the ettin reranker can now score without a self-exported PyTorch/ONNX build — a pure-JS classifier head (fetched by doc eval --provision-model) restores real reranking (measured Recall@5 0.458 vs 0.396 dense-only) instead of silently falling back to unranked order (PR #259: 75f265136).

Fixed

  • Org runtime / policy.git sandbox enforcement (#258, #262, #263): policy.git was previously enforced only by classifying Bash command text, which couldn't see git reached as data, through scripts, node -e, npm scripts, or non-Claude runtimes' native shells. Roles below push now get a real git guard (blocked credentials/hooks/protocols) plus, on the Claude runtime, an OS-level sandbox; codex and grok's own sandbox flags are now wired to the same policy, and the opencode runner's server now actually receives the role's scoped session env instead of the daemon's own (4c9ea05bb #258, 2215c3d4b, 4c96c8106, 3c3de1b12, 7c68fe2bf, 31ec5b2fe #263, 0265112a1 #262, dbb33006b, d23bc81a0, b812038f3).
  • Git command classifier gaps (#250, #257, #261): closed several ways a policy-gated role could reach git push/git commit/git config writes without detection — command substitutions hiding a git call ($(git push), backticks, here-docs, arithmetic) (#257: 334f7977f), four shell shapes the scanner previously gave up on and denied wholesale (case arms, ${...} quoting, arithmetic shifts, here-docs) (#261: c70369941), and git config write/read misclassification against real git argument parsing (#250: f61236962, 2a433982c).
  • Org daemon/session reliability: a role's task-dependency graph no longer lets org_task_done complete a task whose dependencies aren't done, which could dispatch downstream work (e.g. a final build) before docs/version-bump work had landed (#246: b473d6633). A crashed SDK session now actually resumes its prior conversation on auto-restart instead of starting cold (#247: 95e11e0e7). A stopped run's unanswered ask_human questions no longer leak into the next run (#248: fb671e6cd). Monomind-internal env vars (MONOMIND_SDK_AGENT, MONOMIND_HOOK_QUIET, MONOMIND_GRAPH_GATE, MONOMIND_NO_LOCAL_EMBEDDINGS) no longer leak into every Bash command an org role runs, which had been silently changing hook/graph-gate/memory-search behavior mid-role (#249: c503fc0fb, fd862dd75). Idle roles aborted by a normal org_complete/stop no longer get logged and alerted as crashes (#251: 659dd252c). The Claude runtime's default model no longer drifts to a stale claude-sonnet-4-5 fallback (#252: 25ddccd61). Org logs/status/questions/approvals timestamps are now explicitly marked UTC (Z suffix) instead of printing bare local-looking times (#253: 0bfe07921). org run now applies a reload request queued in the same tick as a stop, and clears a stale one at start (#254: 38cc8df28, 00215d3c3). A stuck/silent session attempt's internal abort no longer poisons the whole role slot's retry loop (#256: 027265060). org run/org serve no longer act on a stop/reload request left over from a previous daemon (#264: d5ef39fa9). Restored clearing a stale pending approval on a fresh (non-resume) org start, regressed since #165 (f6a0d9b8f).
  • monomind autopilot log entries are now marked UTC (Z) instead of printing an unlabelled local-looking time, matching #253's fix for the org runtime's own logs (#265: 3185ad220).
  • monomind monograph watch (and the background watcher init --watch starts) never fired for a project under a dot-directory or an ancestor named dist//build//node_modules — ignore patterns are now matched against the repo-relative path instead of the absolute one (#255: b1d2c2534).
  • Every pricing table (model-pricing, dashboard collector/server, token trackers) priced claude-sonnet-5 like Sonnet 4.6 ($3/$15 instead of its real $2/$10 per MTok), overstating org cost estimates and budget-cap usage by 50%; claude-fable-5-1 also gains a pricing row ($10 in / $50 out, cache reads $0.25/MTok) so its usage is no longer reported unpriced (17a42e29c).
  • This run's fixes, verified independently against a clean environment: security scan/secrets now actually reads file contents instead of always reporting "no issues found" (6085a72e8); top-level search --type code now returns results instead of always "No results found" (f10bc3250); mcp start now honors --help/--transport/--port instead of silently starting a hardcoded stdio server, and mcp status/mcp health can now see a bare mcp start via a PID file — 3 findings, one root cause (862780762); config set --help's own first example now works instead of failing "Required option missing" (469c8f4a8); analyze diff --risk/--classify no longer print literal "undefined" for Type/Category/Subcategory/Reasoning (77604550a); monograph search's text-mode table now shows a Line column, matching --format json (fd9f9ed95); graph-report-gaps.test.ts/graph-report-confidence.test.ts no longer hardcode /tmp for their output path, which fails with EROFS in any sandboxed/read-only-tmp environment (0902c91e4).

Changed

  • Replaced claude-sonnet-4-6 model defaults/aliases with claude-sonnet-5 across pricing tables, the dashboard adapters endpoint, the statusline label, and all five mastermind skill trees' recommendations (3b0cd3fb9); centralized the default Claude model into one exported constant instead of four hard-coded copies, refs #252 (f0be2c5cc); pinned every release-gate role explicitly to the latest model (ec767087f).
  • session.ts's hand-maintained per-vendor model-default table was replaced with a direct read of the VERCEL_PROVIDERS registry, removing a second list that could drift from the first (f23444572).
  • policy.ts (861 lines) split into shell-scan.ts and policy-git.ts, with behavior unchanged (7f150bf3f).
  • The release-gate org config is now tracked in the repo at config/orgs/release-gate.json instead of existing only on one machine (6978f8db8).
  • The mastermind-review skill and its command docs now explicitly trigger on plain-language "review this session/worktree" phrasing, not just the literal slash command (bce80ecd5).
  • Internal milestone notes recorded the org-run-reload fix and a worktree cleanup sweep, and corrected a stale version label (4650438d3, 45a198412).
  • Docs and site content updated for 2.11.1 (e5b402648).

v2.11.0

View on GitHub

[2.11.0] — 2026-09-17

Breaking Changes

  • MCP tools: Removed the deprecated graphify_* tool shims (122c55ebb). Callers still using these deprecated names (graphify_build, graphify_query, graphify_god_nodes, graphify_get_node, graphify_shortest_path, graphify_community, graphify_stats, graphify_surprises, graphify_suggest, graphify_visualize, graphify_watch, graphify_watch_stop, graphify_report, and graphify_health) must switch to the equivalent monograph_* tool.

Fixed

  • monomind cleanup --force now only reaps genuinely orphaned SDK processes (c4d430669, 01e38236c). Previously, cleanup invoked without an ownerPid would SIGTERM every process matching "claude-agent-sdk --output-format" machine-wide, including live org agents with running parent processes, causing mass crashes. Now only kills processes whose parent is PID 1 (classic init adoption) or matches an init/subreaper pattern (systemd, systemd --user, /sbin/init, /lib/systemd/systemd), correctly identifying orphans on both traditional init systems and modern systemd user sessions while never killing SDK processes with live application parents.
  • monomind init --force now properly migrates pre-rename projects (7dd8deb26). Previously, projects initialized before the graphify→monograph rename never fully migrated: the old graphify-freshen.cjs hook file stayed on disk forever, and even after --force refreshed settings.json, the old command survived as a duplicate SessionStart hook (looked 'unknown' next to the newly generated monograph-freshen.cjs command). Now obsolete helper files are deleted and obsolete hook commands are stripped from settings before the merge, so migration completes in one init --force.

Changed

  • Renamed "graphify" to "monograph" throughout the codebase (8cd1b8851). This product's own knowledge graph is branded Monograph (@monoes/monograph, monograph.db, monograph_query, …) — several internal names never got the memo:
    • SessionStart hook: graphify-freshen.cjs → monograph-freshen.cjs (root .claude, .gemini, packaged copies, and all generator/wiring references)
    • InitComponents.graphify / MCPConfig.graphify → .monograph
    • Various internal function names and comments
  • Root CI now builds monobrowse before typecheck (96e8a56fb). Root typecheck scans every package under packages/**, and @monoes/monobrowse/src/cli/platform.ts self-imports @monoes/monobrowse, which only resolves once the package has built its own dist/.

npm: npm install monomind@2.11.0 or npm install @monoes/monomindcli@2.11.0

v2.10.31

View on GitHub

Added

  • Agent-exec protocol rev 7: result.text always carries the complete final reply (#245, commit 16ae966db). Since rev 5's incremental assistant events, clients that read result.text got only the last streamed chunk.
  • Org runtime, mono-agent integration M1–M5 (see doc/concepts/org-runtime.md): role tool providers (tool_providers), endpoint roles (kind: "endpoint"), operator-authenticated cross-org delivery with a live org inbox, decision attribution with request-scoped approvals, and cross-root federation allowlists.

Fixed

  • Biome lint fixes (305d7f820) — unused imports, useIndexOf and useOptionalChain findings.
  • analyze diff no longer crashes when the risk breakdown is incomplete (293fdc4a6); hook, memory-search and graph-gate tests no longer inherit MONOMIND_SDK_AGENT, MONOMIND_HOOK_QUIET, MONOMIND_NO_LOCAL_EMBEDDINGS or MONOMIND_GRAPH_GATE from the calling process, so they pass when run inside an agent session.
  • monobrowse's close-browser force-kill test no longer inherits agent-session environment variables (51c00ed6b) — test-only change.
  • monomind status: the System Resources table no longer fails silently with "Resource governor not available" on every real machine; an unbound output.* method reference lost its receiver (4af9f55bc).
  • monomind browse open now exits 1 with the navigation error when Page.navigate fails (e.g. net::ERR_CONNECTION_REFUSED) instead of reporting success against Chrome's error page (a6a412e89).
  • SessionStart hook: the monograph freshen hook only runs npm root -g when no faster install location resolves, saving ~65 ms per session start (cf73f664e).
  • SubagentStart/SubagentStop hooks no longer wait ~3 s on the capture handler's stdin fallback timer (037674994).

Changed

  • @monoes/monobrowse bumped from 1.0.8 to 1.0.9 for the browse open navigation-failure fix.
  • Root build now builds every workspace package, and typecheck, test:run and test:all:run scripts were added for a non-watch build/test/lint gate (2f509f29a).

npm: monomind@2.10.31, @monoes/monomindcli@2.10.31, @monoes/monobrowse@1.0.9

v2.10.26

View on GitHub

Fixed

  • monomind init --force silently dropped custom hooks, permissions.allow entries, and other custom top-level fields. writeSettings() gated its merge-with-existing-settings logic on !options.force, so --force skipped the merge entirely and overwrote .claude/settings.json with only what the generator itself produces — discarding any hand-added hook, permission entry, or field (customInstructions, agents, skills, mcpServers, enabledMcpjsonServers) it doesn't recognize. Fixed: the merge path now always runs when settings.json exists, refreshing generator-known hooks per event type while preserving anything else.
  • .kimi-code/ mirrors accumulated forever and never got cleaned up. write-kimicode.ts had no stale-sweep for .kimi-code/plugin/commands/ or .kimi-code/skills/ — a mirror whose source command or skill was renamed or removed stuck around indefinitely. Fixed by extending the same manifest-based stale-sweep copy-assets.ts already uses for .claude/{skills,commands,agents} to cover both kimi-code output directories.

Both verified via TDD (failing test before, passing after) and end-to-end against the real packed-and-globally-installed CLI artifact, in addition to the full test suite (3000 tests, 0 failures).

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

v2.10.25

View on GitHub

Fixed

  • npx monomind@<version> failed outright with npm error EOVERRIDE: Override for vitest@^4.1.11 conflicts with direct dependency. Root's own package.json had vitest in both overrides (>=4.1.11 <5) and devDependencies (^4.1.11) — semver-identical ranges written differently, which real npm rejects even though pnpm silently accepted it. Fixed by making the two strings identical (no change in effective constraint). Verified against a real npm install of the published tarball.
  • Moderate DoS in qs (GHSA-4mjr-xmp4-gh2g, via express's bundled qs@6.13.0) reachable through @monoes/monograph and @monoes/mcp, both of which most users pull in only as optional dependencies of the CLI. Root's package.json already carried this override, but an override declared in a dependency's own manifest is never read by that dependency's own consumers, and — separately — a nested package's own override does not reach through an optionalDependencies edge. Fixed by pinning qs >=6.16.0 directly in each affected package's own package.json, verified by installing each standalone and inspecting the actually-resolved qs version.
  • Extended check-publish-versions.mjs (the prepublishOnly gate) to catch the first bug class going forward: any overrides key that also appears as a direct dependency with a different version string now fails the publish check.

Known, not fixed (upstream-blocked)

  • sharp (CVE-2026-33327 and others, via @huggingface/transformers, an optional CLI dependency): no override placement fixes this — verified three ways including a real global install — because it's also reached through an optionalDependencies edge, and the latest @huggingface/transformers (4.2.0) still pins sharp ^0.34.5, below the fix threshold. No fix available from monomind's side until upstream ships one.
  • adm-zip (CVE-2026-76845, medium, via onnxruntime-node): no patched version exists upstream at all (first_patched: null). Install-time-only extraction of a first-party binary bundle — no user data ever reaches it.

npm: monomind@2.10.25, @monoes/monomindcli@2.10.25, @monoes/monograph@1.6.4, @monoes/mcp@1.0.4

v2.10.24

View on GitHub

Fixed

  • monomind init --force, when re-run against a project whose .claude/commands/ already contained a flat command file previously namespaced by the kimi-code/opencode generators (e.g. monomind-truth-start.md), stacked another monomind- prefix onto the kimi-code and opencode mirror filenames on every single run with no bound (monomind-truth-start → monomind-monomind-truth-start → monomind-monomind-monomind-truth-start → ...). kimiCommandFilename/opencodeCommandFilename now recognize an already-namespaced name for the default monomind category and leave it as-is instead of re-joining. Real, non-default categories (e.g. a nested github/github-modes.md command) are unaffected.

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

v2.10.23

View on GitHub

v2.10.23 — streaming capability audit, dashboard Chat tab fix (#238)

Added

  • Agent Exec Protocol rev 5: new streams_incrementally capability (agent scan --json, the start frame) reports whether a runtime delivers real per-token/per-chunk assistant text as a turn streams, vs. only ever a complete message at a step/turn boundary — so a caller (e.g. a chat UI) can set the user's expectations honestly instead of a live turn on a whole-message-only runtime looking stuck. Every registered runner was audited and given an explicit, commented true/false with its confidence level (live-verified vs. read from docs). See doc/agent-exec-protocol.md §9 for the checklist future runner authors should follow.

Fixed

  • opencode / qwen-rpc runners: switched opencode from a blocking session.prompt() to real event-driven streaming (session.promptAsync()
    • client.event.subscribe()), catching a real bug live-testing surfaced (the echoed user prompt leaking out as a fake assistant message) before it could ship. qwen-rpc stopped buffering an entire multi-round turn into one blob — a turn could previously sit silent for a whole internal round instead of showing progress as soon as it landed.
  • Dashboard Chat tab was always empty for Org Runtime v2 orgs (#238): the three run-reading endpoints only ever looked at the v1 flat-file run-storage layout; v2 stores each run under its own directory (<org>/<runId>/bus.jsonl) with a different raw event vocabulary that only the live forwarder used to translate. All three endpoints now read the v2 layout and translate through the same functions the live view already uses, so historical playback matches what was live-streamed.
  • 3 test bugs found via a full-suite run on macOS: a chokidar regression-guard test that silently never exercised the code path it claimed to on macOS (fsevents/polling defaults masked it), and two timing-sensitive assertions in orgrt's forwarder/server tests broadened to accept the same legitimate outcomes under system load.

Full diff: https://github.com/monoes/monomind/compare/v2.10.22...v2.10.23

v2.10.22

View on GitHub

v2.10.22 — hook commands survive a missing/stale CLAUDE_PROJECT_DIR

Fixed

  • Every Claude Code hook command in .claude/settings.json (and the settings-generator.ts template used by monomind init) built its path as $CLAUDE_PROJECT_DIR/.claude/helpers/... with no fallback. When Claude Code's own CLAUDE_PROJECT_DIR env var comes up empty for a hook invocation (observed in a live session after an EnterWorktree/ExitWorktree cycle), the path collapsed to /.claude/helpers/... and every hook crashed with MODULE_NOT_FOUND before the script even started — on every single tool call.
  • The first fix (falling back to .) only worked if the shell's cwd happened to already be the project root. Hook commands now resolve the project directory through a validated search: prefer $CLAUDE_PROJECT_DIR only if it actually contains .claude/helpers, else $PWD (same check), else walk up parent directories — the same way git looks for .git — until .claude/helpers is found or the filesystem root is hit. This also recovers when the env var is set but stale (e.g. pointing at a worktree that was since removed), and when a hook fires with cwd inside a subdirectory of the project.

Full diff: https://github.com/monoes/monomind/compare/v2.10.21...v2.10.22

v2.10.21

View on GitHub

v2.10.21 — opencode/kimi frontmatter corruption fix, global npm monograph resolution (#237)

Fixed

  • Corrupted YAML frontmatter in 16 shipped .claude/agents/*.md files: monomind init's frontmatter-key inserter (ensureFmKey(), duplicated in both the opencode and kimi generators) inserted a new top-level key line in the middle of a YAML block-scalar description: | value instead of after it, corrupting both the description and the inserted key's parsed value. This broke opencode's config validation outright (ConfigInvalidError on launch, since .opencode/agent symlinks straight to .claude/agents) and silently mis-set name:/type: for kimi-targeted agent/skill/command files missing those keys. Both generators now skip past the entire block-scalar body before inserting.
  • (#237) The hook-side monograph resolver (.claude/helpers/utils/monograph.cjs, _requireMonograph()) never checked a global npm install (npm install -g @monoes/monograph) — only the build-side resolver did. Every hook-side consumer (graph-status, inline suggestions, the graph-first gate) reported "not found" even right after a successful monograph_build, for anyone who installed monograph globally rather than inside the project. Now mirrors the build-side script's npm root -g fallback.

Full diff: https://github.com/monoes/monomind/compare/v2.10.20...v2.10.21

v2.10.20

View on GitHub

v2.10.20 — skill double-write fix, fence-protocol tool permissions

Fixed

  • monomind init double-wrote the body of every skill that appears in both the legacy skill copier and the newer evidence-gated platform-adapter installer (mastermind, mastermind-plan, mastermind-execute, mastermind-debug, mastermind-org, mastermind-review, mastermind-research, mastermind-memory) — the copier's raw, unwrapped write ran first, and the installer's managed-block merge then treated that as foreign content to preserve and appended a second, marker-wrapped copy of the same body after it. Every real init shipped these skills at roughly double their real length.
  • Agents run through the fence-protocol path (antigravity-runner.ts, and any other runner built on tool-fence.ts's executeToolCall) had every tool call silently denied: canUseTool's allowlist only ever contained the mcp__org__-prefixed name the native Claude SDK path registers, never the bare name a ```tool_call fence uses. Those turns fell back to the model's own native tools instead of the ones actually supplied. allowedToolNames now includes both forms.
  • @monoes/monodesign 1.2.6: the published package pointed its main entry at raw .ts source with no compiled dist/ — import '@monoes/monodesign' crashed in any plain Node runtime. Not a live bug for this CLI (which only shells out to monodesign's CLI binary), but real for anyone depending on the package directly. Now ships a real dist/ build, rebuilt fresh on every publish.

Full diff: https://github.com/monoes/monomind/compare/v2.10.19...v2.10.20

v0.66.0

View on GitHub

What's New in v0.66.0

✨ New Features

  • add categorized tag suggestions, color customization, and unified HIL approvals

🔄 Other Changes

  • Merge pull request #155 from monoes/feat/people-tags-and-hil-approvals

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.66.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.66.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.66.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.65.4

View on GitHub

What's New in v0.65.4

🐛 Bug Fixes

  • NULL-safe people reads, tag changes through the CLI, People page

🔄 Other Changes

  • Merge pull request #154 from monoes/fix/people-null-and-tags

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.65.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.65.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.65.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.65.3

View on GitHub

What's New in v0.65.3

🔄 Other Changes

  • Merge pull request #153 from monoes/chore/dockerfile-go-1.26
  • chore(docker): build with golang:1.26-alpine to match go.mod

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.65.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.65.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.65.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.65.2

View on GitHub

What's New in v0.65.2

🔧 Build & CI

  • bump react-i18next

🔄 Other Changes

  • Merge pull request #151 from monoes/dependabot/npm_and_yarn/wails-app/frontend/npm-patch-minor-932571d2ce

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.65.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.65.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.65.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.65.1

View on GitHub

What's New in v0.65.1

🐛 Bug Fixes

  • review queue goes through the CLI, no fixed workflow id

🔄 Other Changes

  • Merge pull request #152 from monoes/fix/people-review-cli

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.65.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.65.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.65.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.65.0

View on GitHub

What's New in v0.65.0

This entry also covers work that shipped in 0.50–0.64, which were cut automatically on every push to master without changelog entries of their own.

Added

  • monoagentcli doctor checks everything monoagent needs and fixes what it can. The groups are core (data folder, database, profile, vault, PATH, disk), monomind (Node.js, monomind, its version and features, the profile's monomind init, and monomind's own checks per profile folder and --projects), AI agent runtimes, browser and extension, background services, Claude Code integrations, and accounts.
    • --json prints a versioned report.
    • --fix applies fixes, repeating passes until nothing is left to fix.
    • doctor fix <id> runs one fix and streams NDJSON progress.
    • --deep adds the network checks.
    • --skip-group leaves groups (and their dependents) out.
    • Fixes are auto, confirm or manual. Optional ones (installing a runtime, start-at-login, MCP registration) run only when asked for by id.
  • monoagentcli setup takes a machine from nothing to ready: it applies the fixes (asking before it installs software, or accepting with --yes), offers the optional extras, and reports what is left to do by hand.
  • Managed Node.js. monoagentcli nodejs install|update|remove|status downloads Node LTS into ~/.monoagent/node when there is no suitable system Node.
    • The download's checksum file is checked against the Node release team's signature, the archive's size is capped, and installs are serialized.
    • It is used only by the processes monoagent starts. Workflow commands keep the user's own PATH.
  • monoagentcli agent install <runtime> installs Claude Code, Codex, OpenCode, Copilot, Qwen, Pi and others from monomind's install recipe: npm packages, or a vendor https script from an allow-listed host. Anything else is shown as steps to do by hand.
  • Settings › System health in the app shows the doctor report.
    • It has a Finish setup step list, a Fix / Copy steps button per row and Update/Remove actions for the managed Node.
    • Deep and per-project checks, cancelling a running check or fix, and a status-bar dot fed by a background check. That check runs on start and every 30 minutes, and writes nothing outside ~/.monoagent.
  • AI agents is back in the sidebar, with Install / Update / Copy steps on every runtime.
  • Human in Loop has a review queue for leads staged as pending_approval: edit the introduction, then approve or reject.

Changed

  • AI Providers is now "AI connections (legacy)". Agent runtimes on the AI agents page are the recommended way to use AI.

  • A doctor account test offers the silent token refresh only when the service refused the credentials (401/403) or the token expired. Other failures ask first. Connections are tested in parallel, and AI keys are checked with a free model-list call where the provider has one.

  • people.save evaluates introduction, category and job_title per item. The browser nodes parse LinkedIn search-card text.

  • Loops through webhooks now stop. A run on an org chain sends that chain on its HTTP requests to this machine as a signed X-Monoagent-Trace header, and a webhook it reaches continues the chain and is refused with HTTP 429 past the hop limit. A workflow that posts to its own webhook used to run without end; it now stops after 9 runs. Sending many requests from one run (a fan-out) is not a loop and is not limited.

  • Webhook runs have a monoagent_trace field in their trigger item: the chain the run is on, set by mono-agent. A workflow that stores or forwards the whole webhook payload will see it. A monoagent_trace field in a request body is dropped; a body's own trace field is kept.

  • The HTTP request node has a propagate_trace option, off by default, to send the signed chain to hosts other than this machine too (for a system that calls a webhook here back with it).

  • Loop control follow-ups (#132): trigger.org runs are recorded in the ledger (org_event, event_start), so a loop through a role's tool events climbs, including one started by a Bash tool event; a run signs the deeper of its hop and the hop its item reached; a replayed token starts at most 200 runs of a workflow a minute, then gets HTTP 429; with a wildcard MONOAGENT_WEBHOOK_ADDR a request to this machine's LAN address or host name keeps its trace; tokens expire after an hour; and a webhook crossing uses the max_hops of the org its chain started in.

  • The signing key is ~/.monoagent/trace.key (mode 0600; a key other users can read is refused). To rotate it, delete the file and restart monoagentcli daemon.

Fixed

  • First launch on a new machine. The app created no ~/.monoagent, so its database never opened and the app never finished starting.
  • monomind's stray output. monomind's "update available" notice, which it printed on stdout ahead of its JSON, no longer breaks runtime detection.
  • install.sh on linux-arm64. It no longer refuses a linux-arm64 machine.
  • Saved AI keys. Leaving the key blank when editing an AI connection keeps the stored key.
  • Docs. README, --help and the ref manual now match the code: node counts, deprecated ai.* nodes, and ref entries for every node type.

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.65.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.65.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.65.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.64.1

View on GitHub

What's New in v0.64.1

🔄 Other Changes

  • Merge pull request #145 from monoes/ci/doctor-smoke
  • ci(doctor-smoke): read setup's progress events among stderr's log lines
  • Merge remote-tracking branch 'origin/master' into int145
  • ci(doctor-smoke): match doctor as merged, and check what it must never do
  • Merge remote-tracking branch 'origin/feat/agents-install-legacy' into int145
  • ci: doctor smoke test

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.64.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.64.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.64.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.64.0

View on GitHub

What's New in v0.64.0

✨ New Features

  • install AI agent runtimes from the AI agents page; AI connections (legacy)

🐛 Bug Fixes

  • an install runs exactly the script the person was shown
  • parse monomind's JSON past a leading update notice

🔄 Other Changes

  • Merge pull request #144 from monoes/feat/agents-install-legacy
  • Merge remote-tracking branch 'origin/feat/gui-system-health' into int144

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.64.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.64.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.64.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.63.0

View on GitHub

What's New in v0.63.0

✨ New Features

  • Settings › System health

🐛 Bug Fixes

  • health fixes need a real yes, run once, start the daemon last

🔄 Other Changes

  • Merge pull request #143 from monoes/feat/gui-system-health
  • Merge remote-tracking branch 'origin/master' into int143

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.63.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.63.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.63.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.62.0

View on GitHub

What's New in v0.62.0

✨ New Features

  • import monomind's own checks, per profile folder and project

🐛 Bug Fixes

  • monomind's checks only for a set-up folder, only with --deep, and never trust its "auto" alone

🔄 Other Changes

  • Merge pull request #141 from monoes/feat/health-monomind-doctor
  • Merge remote-tracking branch 'origin/master' into int141

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.62.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.62.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.62.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.61.0

View on GitHub

What's New in v0.61.0

✨ New Features

  • guided setup command

🐛 Bug Fixes

  • ask only a person, say what runs, list what was not done, start the daemon last

🔄 Other Changes

  • Merge pull request #139 from monoes/feat/setup-command
  • Merge remote-tracking branch 'origin/feat/health-accounts' into int139

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.61.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.61.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.61.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.60.0

View on GitHub

What's New in v0.60.0

✨ New Features

  • account checks — connections, AI connections, logins

🐛 Bug Fixes

  • account checks only read, print nothing and leak no secret

🔄 Other Changes

  • Merge pull request #138 from monoes/feat/health-accounts
  • Merge remote-tracking branch 'origin/master' into int138

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.60.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.60.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.60.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.59.0

View on GitHub

What's New in v0.59.0

✨ New Features

  • browser, services and integration checks
  • install AI agent runtimes

🐛 Bug Fixes

  • one daemon per home; never rewrite an existing Claude skill
  • installs can't hang or hide what they run

🔄 Other Changes

  • Merge pull request #136 from monoes/feat/health-services
  • Merge pull request #135 from monoes/feat/agent-install
  • Merge remote-tracking branch 'origin/feat/agent-install' into int136
  • Merge remote-tracking branch 'origin/feat/health-monomind' into int135

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.59.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.59.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.59.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.58.0

View on GitHub

What's New in v0.58.0

✨ New Features

  • monomind and agent runtime checks with fixes

🔄 Other Changes

  • Merge pull request #134 from monoes/feat/health-monomind
  • Merge master into feat/health-monomind: keep #131's doctor fixes; activate the managed Node in doctor

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.58.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.58.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.58.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.57.0

View on GitHub

What's New in v0.57.0

✨ New Features

  • managed Node.js runtime for monomind

🐛 Bug Fixes

  • remove .. no longer deletes ~/.monoagent; archives can't escape through chained links

🔄 Other Changes

  • Merge pull request #133 from monoes/feat/managed-node
  • Merge remote-tracking branch 'origin/feat/health-doctor' into fix133

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.57.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.57.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.57.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.56.0

View on GitHub

What's New in v0.56.0

✨ New Features

  • check framework, core checks and doctor command

🐛 Bug Fixes

  • doctor changes nothing, takes a profile name, and reads the vault DB first

🔄 Other Changes

  • Merge pull request #131 from monoes/feat/health-doctor

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.56.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.56.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.56.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.55.0

View on GitHub

What's New in v0.55.0

✨ New Features

  • sign a run's chain on outbound HTTP so loops through webhooks stop

🐛 Bug Fixes

  • rework the signed trace after review — fan-outs, scope, null bodies

🔄 Other Changes

  • Merge pull request #130 from monoes/feat/signed-trace

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.55.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.55.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.55.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.54.0

View on GitHub

What's New in v0.54.0

✨ New Features

  • translate the org header's autonomy bar and Full auto confirmation
  • hold the extension bridge open and add login auto-start (#121)
  • translate the org view's tab bar
  • count queued messages on an org's Queued tab

🐛 Bug Fixes

  • decide and record a crossing in one transaction
  • kill the chat tree without importing internal/monomind; run GUI tests in CI
  • refuse to retry a run an org started
  • refused calls don't use the shared allowance; an item can't switch the chain
  • only runs the org side started continue a chain
  • roles taking turns on one chain share the granted-call allowance
  • keep MONOMIND_BIN alone in the CLI's shared test helpers
  • let tests wait for the knowledge-graph sync, and stop them running the real monomind
  • take a tool event's chain only for granted calls
  • clamp forged hops, keep refused rows out of a chain's depth, empty the decider folder
  • keep a chain's trace through workflows so loops through them climb
  • bound a role's sibling calls instead of exempting them; fixed decider folder
  • a role's sibling calls share a hop, and the decider runs in an empty folder
  • pass a granted tool's arguments to its workflow; record the C-46 live gate
  • start killable children suspended, detach org runs from our jobs, tree-kill the GUI chat
  • follow profile folders that move or appear while the daemon runs

🔄 Other Changes

  • Merge pull request #129 from monoes/chore/org-small-leftovers
  • Merge pull request #128 from monoes/fix/retry-org-runs
  • Merge pull request #126 from monoes/fix/org-chain-trust
  • Merge pull request #125 from monoes/fix/vault-background-sync
  • Merge pull request #124 from monoes/fix/org-trace-gaps
  • Merge remote-tracking branch 'origin/master' into trace-gaps-ff
  • Merge pull request #123 from monoes/fix/org-sibling-hops
  • Merge pull request #122 from monoes/docs/c46-live-gate
  • Merge remote-tracking branch 'origin/master' into pr122-merge
  • Merge pull request #120 from monoes/docs/phase5-walkthrough
  • Merge remote-tracking branch 'origin/master' into pr120-merge
  • Merge pull request #119 from monoes/fix/windows-process-trees
  • Merge pull request #118 from monoes/feat/org-tab-i18n
  • Merge pull request #117 from monoes/feat/org-queued-badge
  • Merge pull request #116 from monoes/fix/daemon-org-watchers
  • Merge pull request #115 from monoes/docs/plan-status-refresh

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.54.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.54.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.54.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.53.5

View on GitHub

What's New in v0.53.5

🐛 Bug Fixes

  • tell the person to reload when the side panel outgrows its worker

🔄 Other Changes

  • Merge pull request #114 from monoes/fix/stale-worker-notice

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.53.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.53.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.53.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.53.4

View on GitHub

What's New in v0.53.4

🔄 Other Changes

  • Merge pull request #105 from monoes/dependabot/go_modules/go-patch-minor-db739b89ca
  • chore(deps): tidy the Wails module for the root module's bumps
  • Merge remote-tracking branch 'origin/master' into dep105-local
  • chore(deps): bump the go-patch-minor group across 1 directory with 3 updates

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.53.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.53.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.53.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.53.3

View on GitHub

What's New in v0.53.3

🔄 Other Changes

  • Merge pull request #96 from monoes/dependabot/go_modules/wails-app/go-patch-minor-1ffc336233
  • chore(deps): bump the go-patch-minor group across 1 directory with 2 updates

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.53.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.53.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.53.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.53.2

View on GitHub

What's New in v0.53.2

🔄 Other Changes

  • Merge pull request #98 from monoes/dependabot/npm_and_yarn/wails-app/frontend/npm-patch-minor-003040ff4e
  • chore(deps): bump the npm-patch-minor group across 1 directory with 3 updates

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.53.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.53.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.53.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.53.1

View on GitHub

What's New in v0.53.1

🔄 Other Changes

  • Merge pull request #112 from monoes/chore/regen-wails-models
  • chore(ui): regenerate Wails models for the capture summary types

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.53.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.53.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.53.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.53.0

View on GitHub

What's New in v0.53.0

✨ New Features

  • AI for summaries picker and a Save mode choice in the side panel
  • let a capture pick the runtime and model that summarize it

🐛 Bug Fixes

  • keep the uninstalled-runtime note on screen and use the UI font for a typed model

🔄 Other Changes

  • Merge pull request #113 from monoes/feat/summary-model-picker

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.53.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.53.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.53.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.52.0

View on GitHub

What's New in v0.52.0

✨ New Features

  • Summary and Transcript tabs in the capture viewer
  • write an AI summary beside captures that ask for one
  • MonoAgent right-click menu with capture modes and YouTube video capture

🐛 Bug Fixes

  • refetch stale chapters after in-app navigation, and drop warnings that do not apply

🔄 Other Changes

  • Merge pull request #111 from monoes/feat/capture-modes-summary

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.52.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.52.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.52.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.51.1

View on GitHub

What's New in v0.51.1

🐛 Bug Fixes

  • style the Documents source filter like the app's other filters
  • preview browser captures in-app, and stop the delete button saying "double-click to view"

🔄 Other Changes

  • Merge pull request #110 from monoes/fix/documents-capture-viewer
  • chore(ui): keep the generated Wails runtime files as they were

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.51.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.51.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.51.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.51.0

View on GitHub

What's New in v0.51.0

✨ New Features

  • sort Documents by name, type, source and date
  • list browser-extension captures as profile documents

🔄 Other Changes

  • Merge pull request #109 from monoes/feat/docs-extension-source

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.51.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.51.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.51.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.50.1

View on GitHub

What's New in v0.50.1

🐛 Bug Fixes

  • profile picks stick, and a save visibly says it saved

🔄 Other Changes

  • Merge pull request #108 from monoes/fix/side-panel-feedback

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.50.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.50.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.50.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.50.0

View on GitHub

What's New in v0.50.0

✨ New Features

  • open MonoAgent as a full-height side panel with a profile picker

🔄 Other Changes

  • Merge pull request #107 from monoes/feat/side-panel

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.50.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.50.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.50.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.49.8

View on GitHub

What's New in v0.49.8

🔄 Other Changes

  • Extension: a bridge that stays up without a workflow, and a popup that says what to do (#106)

Desktop App Downloads

Platform Download
macOS (Apple Silicon) MonoAgent-darwin-arm64.zip
Windows MonoAgent-windows-amd64.exe
Linux MonoAgent-linux-amd64.tar.gz

CLI Downloads

# macOS (Apple Silicon)
curl -fsSL https://github.com/monoes/mono-agent/releases/download/v0.49.8/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.49.8/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.49.8/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`