mnml 0.3.2

Release notes for mnml 0.3.2, the week after the cutover — a sessions mode, an API, and links everywhere.

mnml 0.3.2 is the week after the cutover. Sessions get a mode of their own — every Claude Code and Codex session side by side, with a ring that walks the ones waiting on you — and mnml grows an API: a local socket with mnml remote, a gate on what a program in a pane may ask for, and a face for Claude Code's IDE protocol, so a session can open files, read the selection and show its diffs in a review pane with no setup. Ticket keys and PR references are links wherever they appear. The dashboards prefetch and refresh on their own cadence. Jira and Bitbucket 0.2.2 ship alongside: their chips wear Atlassian's own icons, and their cards and terminals link to the issue or pull request they name.

This release is 1 contributor over 257 commits since 0.3.1.

Highlights

A program in a pane asks first

A program running in a pane can no longer run commands through the file channel unasked. Anything that changes more than the view, and every open-pty, waits on a toast with a Review button: Allow once, Allow for the session, Deny or Cancel, and nothing answered in two minutes is denied. Every command has a class — view, edit, write or exec — and every answer is written to .mnml/ipc/audit.jsonl. See What a program may do.

The API

Each mnml serves a local socket that mnml remote (or mnml r) talks to: open PATH[:LINE[:COL]], run COMMAND-ID, status, panes, and call METHOD [JSON] for anything raw. Run in a pane it reaches that mnml as that pane; from any other terminal it finds the mnml whose workspace holds the current directory. Every pane gets its own token, and a command that changes more than the view asks you first, naming the pane. See mnml remote.

A Claude Code session started in an mnml pane links to mnml with no setup. It sees your selection, opens files, reads diagnostics, and shows its edits as a diff in mnml's review pane, for you to accept hunk by hunk or reject. A linked session wears ⇄ on its tab. Settings → Integrations → API turns the socket, and the link, off. See Claude Code, with no setup.

A sessions mode, and a ring of who is ready

The Sessions row of the activity bar puts the editor layout aside and stands every Claude Code and Codex session in columns side by side (ai.session_columns, 1 to 4), the rest stacked behind them; click it again and the layout comes back as it was. sessions.next_waiting (Ctrl+Alt+N, space a j) walks every session ready for you — the ones waiting on you first, then the ones that finished or ended since you last looked — and skips the rest. See AI sessions.

Ticket keys and pull-request refs link everywhere text is shown: a terminal pane, an editor, the Markdown preview, the git graph's detail column, a toast, an HTTP response body and the SESSIONS cards. A dotted underline marks one, the pointer lights it, and a click (Ctrl/Cmd+click in a terminal or editor) opens it. What a ticket key looks like comes from the installed integrations: a manifest's new links[] pairs a pattern with the address it opens. With none declaring one, only URLs link.

Jira and Bitbucket 0.2.2

The Jira integration declares the issue key, and Bitbucket links <repo>#<number> to that pull request in your workspace; --install writes your site or workspace in. The four Atlassian chips wear Atlassian's own icons: the pull request, the pipeline loop, the board and the ship. Run ./run.sh install-font to pick the icons up.

To update, update mnml first, then open the Marketplace tab under INTEGRATIONS: an installed Jira or Bitbucket 0.2.1 reads update available. See Marketplace.

Changelog

What a 0.3.1 user notices. The full list is the v0.3.2 section of CHANGELOG.md and the GitHub release.

Safety

  • A run-command of anything that changes more than the view, and every open-pty, waits on a Review toast; two minutes unanswered is a denial, and the toast never takes the key you are typing.
  • Every command has a class — view, edit, write or exec — listed in docs/commands.md; Allow for the session covers one class until mnml quits.
  • Each answer is a line in .mnml/ipc/audit.jsonl and in events.jsonl.
  • .api.allow_commands and .api.clients in config.zon let a command or the file channel through unasked; an untrusted workspace cannot set them.

The API

  • mnml remote / mnml r: open, run, status, panes, ping, instances and call, with --json. docs/API.md has the methods and the exit codes.
  • Every pane gets the socket and its own token, gone when the pane closes. Anything without a token may only read the status and the command list.
  • Settings → Integrations → API turns the socket off.
  • Claude Code sessions in a pane link to mnml as their IDE; an accepted diff is saved, and a session asking to save a file itself asks first.
  • A linked session wears ⇄ on its tab and its SESSIONS card, and a toast says so when it first connects.
  • ai.send_selection points the session you looked at last at the selected lines.

Sessions

  • + New session opens batches of 3 or 6 as well as 2, 4 or 8.
  • The sessions mode, from the activity bar's Sessions row: columns side by side (ai.session_columns, default 2; the AI chips' Show side by side sets it). In it Ctrl+Tab steps the focused column's stack, Ctrl+1 to Ctrl+9 show the rail's Nth session there, and Ctrl+N starts one in it. Ctrl+Shift+N starts a Claude Code session anywhere.
  • Closing a session keeps the shape: the zoom passes to the next one, and an emptied column is refilled from the stack.
  • One click on a SESSIONS card shows that session when zoomed or in the sessions mode; a • marks a session on screen, a ◆ one that finished or ended since you last looked.
  • sessions.next_waiting / prev_waiting (Ctrl+Alt+N / Ctrl+Alt+Shift+N, space a j / space a k) walk the sessions ready for you; the toast says which, needs you: NAME (3 ready).
  • The bell's right-click leads with a Needs input: NAME row per waiting session, then Finished: and Ended:.
  • The session needs input toast goes to the session when clicked.
  • Search sessions… (ai.search_sessions) searches every Claude Code and Codex transcript of the workspace; Enter goes to that session.
  • A session in the background, or started through a shell or wrapper script, now counts in a strip's ‹ n/m ›.
  • URLs and ticket keys on a SESSIONS card and in the sessions table are links, listed as Open … rows in the card's menu; Shift+F10 opens it.
  • The help panel steps aside while SESSIONS has more cards than fit.
  • SESSIONS is ready the first time you open it, and a changed transcript shows within half a second while it is on screen. Settings → Integrations → Dashboard refresh chooses auto, fast, slow or manual.
  • Ticket keys and PR refs link in terminal panes, editors, the Markdown preview, the git graph's detail column, toasts and HTTP response bodies, through the one rule set the integrations declare.
  • In a terminal Ctrl/Cmd+click opens a link and a right-click offers Copy link / Open link; in an editor gx or Ctrl/Cmd+click.
  • Bitbucket links <repo>#<number>; a bare #42 names no repo and does not link. Reinstall the integration to pick this up.
  • The wheel over a link scrolls what is under it.

Tabs

  • A strip whose tabs overflow shows ‹ 2/5 › and pages; ⋯ beside it opens the buffer picker. The +N hidden count is gone.
  • A page holds whole tabs only, and opening the tab just past the edge brings it into view whole.
  • Double-click a tab to zoom its pane; again to put the splits back.

The frame

  • The sidebar is a fifth of the window by default (30 to 48 cells) and follows a resize; a number in ui.tree_width still pins it. Its divider's right-click resets, sets, hides, auto-hides or moves it.
  • Every menu prints each row's chord at its right edge, for the profile you are in: VS Code's under standard, Neovim's own keys under vim.
  • The standard profile has VS Code's AI chords: Ctrl+Alt+I opens a Claude Code session and Ctrl+Alt+Shift+L asks Claude a question.

Sandbox and demo

  • mnml --demo opens a sample Zig workspace in a throwaway home, beside offline Jira and Bitbucket servers and a stand-in Claude Code session — no model, no network. A downloaded mnml carries the demo's servers (not on Windows, which has no --demo).
  • --sandbox and --demo clean up on SIGTERM, SIGHUP or SIGINT as on a quit, and exit with 128 + the signal.
  • mnml --help lists --demo.
  • ipc.report_input = true writes an input line to events.jsonl when a person presses a key, clicks, scrolls or pastes — never what was typed. Off by default.

Text fields

  • Every text input takes the mouse: a click places the caret, a double or triple click selects a word or the line, and Shift with a click or the arrows grows a selection — prompts, pickers, every sidebar and pane filter, the find bar, the : line, Settings, the HTTP pane and the debug console.
  • A paste goes where you are typing, not to the editor underneath.
  • In a terminal or session pane a double-click selects a word and a triple-click the line.

Terminal panes

  • The scrollback has a scrollbar over the pane's right column, shown while scrolled back or under the pointer; it never takes a column from the program.
  • A right-clicked link stays lit while its menu is open.

Splits

  • Auto-equalize splits carries a tick in the Window menu and has a switch in Settings → UI. Off by default.

Jira and Bitbucket chips

  • The Bitbucket pull requests, Bitbucket pipelines, Jira Boards and Jira Fix Versions chips wear Atlassian's design-system icons, baked into MnmlSymbols.ttf. Run ./run.sh install-font to pick them up; under --ascii the chips still read BP, BL, JB and JV.

Fixes

  • Copies outside the editor reach the system clipboard.
  • Ctrl+Shift+V and Shift+Insert paste into a terminal pane in both profiles; Ctrl+C over a selection copies without reaching the program; ui.copy_on_select turns drag-to-copy off.
  • The tree's lines and chevrons share the menu bar's grey and meet what they connect; MnmlSymbols.ttf uses JetBrains Mono's metrics.
  • Crashes fixed in :only and after closing panes another tab page or git mode showed.
  • Switching the workspace now switches the title, statusline, git mode and Ctrl+P, not only the tree.
  • HTTP: a request naming a {{VAR}} no env defines is not sent, and says which variable and where to define it; the Env chip reads no env when there is none.
  • Moving the sidebar to the right takes the activity rail and the width with it; Esc in Settings puts a previewed width back.
  • Vim ]a / [a step through sessions from a terminal pane's T-NORMAL mode too.
  • On Linux, a terminal whose command prints and exits at once no longer comes up empty.
Edit on GitHub