Aquesta és una versió anterior. La versió actual és la v0.3.5. mnml v0.3.5 · Data de publicació:
Fitxers d’instal·lació v0.3.0
| Arquitectura | Tipus | Àmbit | Mida del fitxer | Baixa | SHA256 |
|---|---|---|---|---|---|
| 64 bits | MSI · en-US | Tots els usuaris | — | github.com | VirusTotal |
L’enllaç i l’SHA256 provenen del manifest comunitari del Gestor de paquets del Windows. Convé comparar el hash del fitxer baixat abans d’executar-lo.
Notes de la versió
mnml 0.3.0 is the same editor, rewritten in Zig 0.16.0. One static binary per
platform, no runtime, and the shared .test corpus as the definition of
parity (every file at 120x40; the 80x24 and 200x60 sweeps check for panics,
leaks and rects outside their parent). Everything below is what the 0.2.x user notices; the
architecture behind it is in docs/DESIGN.md.
The editor
- The core: a String buffer and a byte cursor behind one apply chokepoint;
vim and standard keymaps as two complete profiles that never leak into the
render layer. Undo groups, registers, marks, macros, dot-repeat.
- Multi-cursor — every cursor types, deletes, selects and puts. Visual block
yanks and deletes the rectangle. Surround (ys / ds / cs), align,
ctrl+a / ctrl+x, gq reflow, gcc comment toggle, the [ ] pairs, the
section / method / TODO jumps.
- A save writes the file's terminating newline.
- Incremental tree-sitter highlighting for 43 grammars, compiled in. Spans
slide with the text as you type; the reparse waits for idle. Language
injection (fenced code, <script> / <style>), predicates and roles.
- Sticky context: the enclosing scope's header pinned above the viewport.
Text objects, the symbol outline, the rendered markdown preview, snippets
with tab stops that track the text.
- Open files are stat'ed every 2 s — a clean buffer reloads, a dirty one is
warned.
The frame
- Splits, tab pages, per-leaf strips, the statusline, the editor scrollbar
and pin, drag-to-resize dividers and tabs, click-count selection, the wheel
batch, right-click menus, overlays, the palette — the Rust frame, cell for
cell.
- The 94 NvChad base46 palettes as ZON, derived into every UI role at compile
time. theme.pick previews as you move; toggle, reset, follow-the-OS.
- The first-launch wizard — eight sections, Enter writes only what was
touched; the last offers Jira and Bitbucket as checkboxes that install on
the spot, with a Private integrations row under them. The settings overlay — sectioned rows, the file follows the row.
- Build-artifact directories stay hidden in the tree without a .gitignore.
- A pane that opens beside another sizes itself by what is already there:
the first one takes an empty editor area whole, the third makes thirds and
the fourth quarters, and a stack inside one of the columns keeps its own
proportions. Integrations, terminals and session panes all follow the one
rule now. integrations.arrange = .fixed — a row under Integrations in the
settings overlay — puts back the old half-the-active-pane sizing.
Config — ZON, not TOML
- config.zon beside your config.toml; mnml 0.3.0 never touches the TOML.
Run mnml export-config-zon on 0.2.22 once to convert. Three layers (user,
workspace, defaults), a typed schema, Patch(T) merges derived at compile
time, persistScalar splices one value back into the file with a backup.
- Workspace trust is decided at load and asked once.
- Two profiles, so one machine can run the mnml you live in and the mnml you
are working on. MNML_PROFILE=dev (or --profile dev) moves the data root
to ~/.config/mnml-dev, the session file to .mnml/session-dev.zon, the
IPC mailbox and the running-instance marker to their own names, and paints
a dev chip on the statusline with a matching window title. The first dev
launch seeds itself from your stable setup — config, integration manifests
and configs, launchers, themes — and never copies a credential, a cache or
a session; mnml profile says which one you are in and mnml profile seed --force copies again.
- docs/CONFIG.md is the complete commented config.zon, and a test parses
it.
Panes
- Pane.pty — a shell or command in a split, painted from the libghostty-vt
grid. cargo / npm / pytest / go runners and test.* in a pty pane,
the tools picker, configured tasks (task.run, task.<name>, :task,
startup tasks).
- Git: status, diff, blame, graph, staging — every call on a worker, results
posted back as one event. Gutter marks and blame labels on the editor. One
Repo per repository, a job queue, the one-hunk patch writer.
- Git, line by line: select rows in the diff pane (v, shift+arrows, a drag)
and stage, unstage, discard, stash or commit just those lines — the same
selection for the keys, the chips, the row menu and the palette. t
cycles the diff view now that v selects.
- Git, conflicts: a conflicted file resolves in the editor. The status pane
lists it under ⚠ Conflicts, enter opens it with every block tinted and a
row of chips above it (Ours · Theirs · Both · Edit · Split · AI resolve);
vim co / ct / cb and ]x / [x, standard alt+1..3 and f8;
Split shows ours against theirs in the diff pane; saving with no marker
left stages the file.
- LSP: one stdio JSON-RPC transport shared with DAP. Diagnostics, completion,
hover, peek, navigation, rename, formatting, code actions, symbols.
- DAP: breakpoints, watches, the debug and REPL panes, the dap.* commands. A
scripted adapter in process drives the whole session under test.
- AI: ghost text, the agentic loop on the confirm channel, Claude Code and
Codex panes, every ai.* runner, the Claude Agents dashboard (sessions
across workspaces, filters, pause chip, live tail, kill), the 24 h spend
report and the statusline meter.
- HTTP: Pane.request — the tabbed request pane, the send worker, the
http.* commands. The request parser, envs, cookie jar, JWT decoding, SSE,
a JSON-schema subset, HAR and Postman import, the captured log, chains,
bench, mocks, history. Pane.websocket (a WebSocket client by hand) and
Pane.browser (the CDP wire layer). The CLI: run, chain run,
discover (JSON and a YAML subset), sync, sync-check, proxy.
- HTTP, beyond 0.2.x: an env file edited on disk reloads on its own
(a toast says so); COLLECTIONS lists a multi-block file's ###
blocks and renames, duplicates, deletes and moves a request or a
block from the row menu; http.find_request (ctrl+shift+r,
<leader>hr) is a fuzzy picker over every block of every file;
:id path segments take their # @path id=… value on send and get
a Path group on the Params tab; the Body tab has a mode chip —
raw, JSON (formatted on send), form-urlencoded, multipart with
name = @file parts — that round-trips through curl's -F and
--data-urlencode; # @description shows under the URL and
# @tags feed the filter (tag:smoke) and the picker.
- The TODOS panel, and the reference module behind it — scan worker,
snapshot, commands, panel, mouse — that every other panel is checked
against.
Integrations and the Marketplace
- Integrations are back, on the v2 bridge and the Zig SDK: each one is
released on its own <id>-v<version> tag, and every mnml release carries
integrations.json, the index the Marketplace tab reads by default. A row
is listed only when its SDK is compatible and it was built for your
platform; an install checks the sha256 before anything is written.
- marketplace.add_source (the palette, the tab's + source chip, the tab
strip's menu) adds a folder or owner/repo[:dir], or a pasted GitHub repo
URL — https://github.com/owner/repo, the same without the scheme, with a
trailing .git, …/tree/<branch>/<dir> (the branch is dropped, the folder
kept) or git@github.com:owner/repo.git. Any other URL is refused by name.
- A source already added is found under another spelling — the repo's case,
the folder's case, a symlink — instead of being added twice. Adding a
source while the Marketplace is disabled is refused before config.zon is
written. A folder just added lists at once, not when the slowest source
answers.
- An integration row built on an older SDK wears a rebuild chip; one whose
source folder is gone wears old SDK instead and is not rebuilt. A
rebuild toasts the SDK its fresh manifest is stamped with.
- A refresh or a quit no longer waits out a running install.
- Jira and Bitbucket poll adaptively, write an event feed, and share one
rate-limit budget across windows and processes. The state file is the
first of <SERVICE>_RATELIMIT_STATE,
$MNML_SHARED_STATE_DIR/<service>-ratelimit.json,
<MNML_DATA_ROOT>/ratelimit/<service>.json,
~/.config/mnml/ratelimit/<service>.json.
- MNML_OPEN_URL decides whether a URL reaches the browser, for the host and
every integration: unset or empty opens it, none drops it, any other
value is a file the URL is appended to instead. A .test run logs to a
file and --headless defaults to none, so neither opens a browser.
Fixes and polish since 2026-09-20
- --headless --ascii paints the ASCII screen, as the terminal does.
- The update check and the Nerd Fonts release fetch run only from the
terminal loop — never under --headless, a .test run or a unit test.
- A workspace with nothing to distrust is trusted without a prompt; an
adapter added to its config later goes through the trust dialog.
- Vim: dozens of Neovim-parity fixes — counts on n / N, D, C, j /
k under an operator; u and gv after Visual operators; case changes
and word motions over non-ASCII and CJK text; whichwrap-style h / l;
& / g&; Visual p and "x; puts setting '[ / ']; the "N fewer
lines" message past 'report'; an underline cursor while an operator
waits. :jumps, :changes, :display and :setlocal et / noet / wrap / nowrap are new, and :term opens in the focused leaf.
- In the standard profile Ctrl+N asks for the new file's path from any
focus, and Ctrl+Shift+S is Save As. F3 / Shift+F3 search from the cursor with the find bar open or
closed. Typing over a selection is one undo stop.
- A shell pane's bash and fish mark their prompts (OSC 133, OSC 7), and a
device-attributes query is answered.
- Windows: paths spell one way everywhere — the tree, SEARCH, TODOS, notes,
LSP URIs, the HTTP panel — and installs, uninstalls, the bridge socket and
cmd.exe command lines behave as on macOS and Linux.
- The statusline measures its chips in cells and never ends a lane on a