Releases: Zhachory1/mewritecode
Release list
v1.5.2
Changed
- Branding: a distribution that sets
mewriteConfig.branding.primaryWordmarknow renders that art standalone, replacing the built-in pencil logo entirely instead of rendering beside it. Previously a custom wordmark was always drawn next to the hardcoded pencil and clamped to the pencil's 12x40 footprint, so there was no supported way to show a standalone ASCII/Unicode mark (onlylogoPathimages could replace the pencil). A standalone wordmark is now bounded only by the terminal width; the built-in default still renders beside the pencil within its fixed box. Upstream (noprimaryWordmark) is unchanged.
v1.5.1
Fixed
mewrite agents: entering a spawned agent that had finished its turn (idle, but still alive and listed) no longer re-execs it into a separate full-screenmewrite --sessionwith no way back. Enter now checks pty ownership first, so an owned agent — running or idle — opens the interactive pane in place with a workingesc/ctrl+wexit; the resume re-exec path only applies to sessions this viewer does not own (#195).- Branding: the interactive startup banner and the
mewrite agentsview now render the distribution wordmark frommewriteConfig.branding.primaryWordmark/secondaryWordmarkinstead of the hardcoded "Me Write Code" block. TheBANNER_PRIMARY_WORDMARK/BANNER_SECONDARY_WORDMARKconfig exports were parsed but never consumed by the renderer;renderPencilLogonow reads them (secondary shown only on tall terminals viashowSecondaryWordmark), so a wrapper distribution's wordmark applies to both surfaces. The built-in block is now the defaultprimaryWordmark, so upstream is unchanged. Themewrite agentsheader also now renders thebranding.logoPathimage logo (like the interactive banner) when one is configured, so image-branded distributions apply there too. Wordmark art is bounded to a fixed box (max 12 rows, 40 cells wide; primary + secondary combined also <= 12 rows) and oversized art now fails fast at startup with a dimension-named error instead of being silently clipped (#194).
v1.5.0
Added
mewrite agents: spawned agents are now driven interactively via live PTY panes. Selecting a running agent opens a full interactivemewritesession (rendered from a pseudo-terminal) whose keystrokes go straight to the child, so you can jump in and steer mid-run instead of only monitoring read-only or using thessteer modal. The pty master lives in the viewer, so agents run in the background while the view is open and are torn down on exit. Falls back to the prior detached-headless spawn when node-pty is unavailable (#192).mewrite agents: an always-visible "new agent" input bar pinned to the bottom of the view, styled like the interactive prompt editor (full-width rules, border brightens when focused). Type a task and press enter to spawn while staying in the view.nor down-arrow off the end of the list focuses the bar; up-arrow or esc returns to the list; with an empty list focus starts in the bar (#193).
Changed
- The
mewrite agentslist is now scoped to agents this viewer owns, so foreign interactivemewritesessions from other terminals no longer appear (and can't be entered/hijacked) (#192). - The brand wordmark is now a larger stacked "Me Write Code" block-letter title next to a refined pencil, using only universal glyphs so it renders on Apple Terminal, tmux, etc. (#192, #193).
Fixed
- Packaging: node-pty's prebuilt
spawn-helperships non-executable via the npm tarball, causingposix_spawnp failedat runtime; a postinstall restores its executable bit (#192).
v1.4.0
Fixed
-
Daemon no longer throws
TypeError: The database connection is not openon shutdown. An un-awaited runner turn (e.g. the echo runner's async reply stream) could emit astate/messageevent afterclose()had closed the SQLite store, hittingstore.updateSessionon a dead connection.close()now latches aclosedflag that makes the per-session emitter drop late events instead of touching the store or dead sockets (#176). -
mewrite agents: a hosted session that aborted a stalled turn for auto-retry (e.g. "Model stream idle for 120000ms") no longer stays stuck showingerrorafter the retry succeeds. The daemon runner treated the pre-retryagent_end(error)as terminal and latched, so the later successfulagent_end(stop)couldn't clear it. Onauto_retry_startthe runner now undoes the premature terminal state and returns the session torunning, so the final state reflects the retry's outcome (#158). -
Fixed daemon double-spawn race in
mewrite serve: two concurrentmewrite serveprocesses could both pass the pidfile existence check and race to bind the port (TOCTOU). Now the pidfile is acquired atomically with O_EXCL before starting the daemon; if another daemon holds a live pidfile, the second caller exits 0 (not 1) so auto-start workflows treat peer ownership as success. Stale pidfiles (dead process) are reclaimed automatically. Belt-and-suspenders: if two processes somehow pass the pidfile lock but one loses the port bind (EADDRINUSE), it releases its pidfile and exits 0 (#167). -
System prompt: core safety sections (instruction precedence, durable-memory/data boundaries, executing-with-care) are now always-on. Previously the
slimbuild flag and thecustomPromptpath both silently dropped every non-overridable safety section, producing an agent with no durable-memory or destructive-action consent gate while still ingesting untrusted project context. They are now injected in every build path via a sharedCORE_SAFETY_SECTIONSblock. -
System prompt: the
customPromptpath now routes appended text throughbuildAppendOnlySection(the "earlier system sections win" framing) instead of a raw concatenation. -
System prompt: injected project-context files (AGENTS.md/CLAUDE.md) now carry a precedence banner clarifying that project instructions cannot override the safety sections and grant durable-capture consent only when they name a destination and scope.
-
Git status snapshot no longer renders a failed or oversized
git statusas "(clean)"; it now reports the status as unavailable.
Changed
- New brand logo: a pencil (code shaft) with "Me Write Code / me write less, me do more" to its right, replacing the ASCII wordmark. Shown on interactive startup and on the
mewrite agentslaunch screen (shared renderer). Terminal-safe box-drawing, no image component (#185). mewrite agentsis now a single full-screen status-grouped list instead of a sidebar + side-by-side focus pane. On launch the screen is wiped and a pencil logo with "Me Write Code / me write less, me do more" is shown above the list. Agents are grouped underWORKING/ERRORED/COMPLETEDheaders (attention order), and selecting one opens it full-screen (ctrl+w/ enter to focus, back to return) rather than in a split. This is Phase A of the agents view v2 redesign toward a local process-registry model (#185).mewrite agentsfocus pane now supports two steering controls from interactive mode:shift+tab(app.thinking.cycle) cycles the remote session's thinking level via the daemonset_thinkingRPC — the status-line thinking level updates on the echoedusage— andctrl+o(app.tools.expand) toggles tool activity between the compact one-liner and an expanded card showing the tool's args and result/error. Tool start/end are correlated into a single card by tool-call id. Both reuse the existing configurable keybindings (#175).mewrite agentssidebar navigation now wraps: pressing up on the top agent selects the bottom one (and down on the bottom wraps to the top), so you can jump to the far end of the list in one keypress. Page up/down still clamp at the ends (#152).
Removed
- Dropped references to a non-existent
exploresubagent from the system prompt and thetask/agenttool descriptions.
Added
-
mewrite agents: while monitoring a running agent you can now steer it (presssto type a redirect) or interrupt it (pressx), so you can catch an agent working on the wrong thing before it finishes. Steering messages are delivered over a per-agent inbox file; the agent's own process injects them into its steering queue at the next turn boundary (mid-run) or as a fresh prompt (when idle). Interrupt signals the agent process. Configurable viaapp.agents.steer/app.agents.interrupt. Agents view v2 Phase C+ (#185). -
mewrite agents: selecting aWORKINGagent now opens a read-only live monitor that tails its transcript, so you can watch a running agent without interrupting it (another process owns its live turn). Idle/completed/errored interactive agents still resume in place. Agents view v2 Phase C (#185). -
mewrite agentsnow spawns new agents as independent, detachedmewriteprocesses instead of routing through the daemon (agents view v2, Phase B2). Pressn, type a task, and the agent starts working in the current directory and keeps running after you close the view; it shows up in the list via the liveness registry and is resumable. Output is logged under~/.mewrite/agent/agent-logs/. The daemon is no longer required for the local agents workflow (and is never auto-started); it is used only to surface any daemon-hosted[d]sessions that happen to be running. Removed the daemon auto-start/ensureDaemonpath from the agents view (#185). -
mewrite agents: selecting a live interactive[i]session now resumes it as a real full interactivemewritesession in place (replace-and-return) instead of opening a read-only transcript pane. The list is torn down,mewrite --session <path>runs attached to your terminal with the complete interactive UI (editor, footer, meter, tools, thinking), and quitting returns to the agents list. This is Phase B (resume-on-select) of the agents view v2 redesign; detached resumable spawning and retiring the daemon from the local path follow (#185). -
mewrite agentsfocus pane now shows a context-usage meter in its status line: a progress bar███░░░ 20% 40k(percent of context window + tokens used) plus the thinking level next to the model id, matching the interactive context meter. Fed by the daemonusagenotification (see #176), so it live-updates on each turn. Attaching to an idle session that already ran a turn now re-requests a usage snapshot on connect, so its meter is populated immediately instead of blank until the next turn. A session that has never run a turn (usage genuinely unknown) shows just the model id, and post-compaction it renders?for unknown token counts (#173). -
Daemon WS protocol now streams richer per-turn events so a focus-pane client can reach parity with interactive mode. Tool events carry
toolCallId,args(on start), andresult/isError(on end) correlated across start/end; a newusagenotification streams context tokens, context window, percent, and thinking level on turn boundaries;statecarries astopReason(stop|max_tokens|error|aborted) on the terminal state; and a newset_thinkingRPC steers a running session's thinking level (echoed back as ausageevent). All additions are optional fields / new methods, so the bundled web-ui and the attach REPL keep working unchanged. Oversized tool args/results are truncated over the wire (16 KiB cap).HealthCapabilities.richEventsadvertises support for feature detection (truefor the agent runner) (#176). -
Added
mewrite history: a standalone TUI to browse and resume persisted local JSONL sessions. Select a session and press enter to see the exactmewrite --session <path>command to copy and run. This is separate from the live daemon monitor (mewrite agents) and frommewrite sessions(which lists daemon-hosted sessions via the client). Read-only: no delete or rename, just browse and get the resume command (#159). -
Enhanced debug logging (
MEWRITE_AGENTS_DEBUG) with automatic log rotation (50 MiB cap, keeps one.1backup), category filtering (log only specific tags likerunner,daemon), and support for custom log paths viatag=pathsyntax. Prevents disk-fill from flapping sockets while remaining zero-cost when disabled (#168). -
The
mewrite agentsfocus pane is now live and interactive for hosted sessions: it streams the agent's response as markdown and gives you an input box to talk to the agent in place — no more dropping to a separate attach REPL.ctrl+wfocuses the pane, type and press enter to send,escapeinterrupts a running turn or (when the input is empty) returns focus to the sidebar. Interactive[i]terminal sessions remain read-only (#158). -
mewrite agentsis now a two-pane view: a sidebar of agents on the ...
v1.3.1
Added
- Subagents can now request a model by capability tier instead of a concrete id:
model: tier:fast,tier:normal, ortier:strongin an agent definition. The tier resolves to a curated model within the parent's current provider, so it works regardless of which single provider you are authed to. On a miss it falls back to the provider's curatednormal, then to the parent model with a warning (never your default model). - Added a
subagentModelsetting: the default model (tier keyword or concrete id) for spawned subagents whose definition pins no model.
v1.3.0
Changed
- Onboarding no longer prompts about "telemetry" and there is no telemetry setting. What was framed as telemetry is local-only diagnostics logging that stays on disk and is never uploaded; it is simply enabled so the agent has usage data to improve against. The onboarding question is dropped (four questions down to three), the notice copy now says "logs usage locally ... never uploaded — there is no telemetry", and
doctorreports "Local logging" instead of "Telemetry". The unusedtelemetrysettings key and its getter/setter are removed.
Fixed
-
Fixed onboarding option lists implying arrow-key navigation. Each option was drawn with a filled/empty radio-style dot (
●/○) marking the default, which read like a movable cursor even though selection requires typing the option's key. Options now show a plain(default)tag and the prompt readsType <keys> and press Enter, making the number/letter input obvious. -
Fixed the TUI appearing to freeze during a model call when auto-compaction runs. Compaction's summarization requests called
completeSimpledirectly, bypassing the agent loop's stream inactivity watchdog, and their onlyAbortControllerfired on manual user cancel — so a provider that opened the connection then went silent would hang the summarization forever. Since compaction fires automatically at context thresholds (right around a large turn), this presented as a freeze mid model call. Compaction and turn-prefix summarization now run throughstreamSimple+withIdleTimeout(the same inactivity watchdog the main agent loop uses): a stall with no events for the idle window aborts fast and surfaces a retryable error, while a legitimately slow-streaming summary is never killed. Default 30s of inactivity; override viaCAVE_COMPACTION_IDLE_TIMEOUT_MS,0disables. -
Fixed a TUI freeze during model streaming by memoizing markdown code-block syntax highlighting. Finished code blocks were re-highlighted on every frame while later content streamed in; memoizing by language and content makes repeat frames free and keeps the render loop responsive. The memo is cleared on theme change so colors stay correct.
-
Fixed the LLMLingua compression model download hanging the agent on first use. The download
fetchand its streamed body read were unbounded, so a download host that opened the connection then went silent would hang the first compressing turn forever — presenting as a freeze during a model call, like the compaction case above. The download now runs under a progress-driven inactivity watchdog that aborts thefetchand body stream when no bytes arrive within the idle window (resetting on every chunk, so a slow-but-progressing download is not killed) and throws a retryableModelDownloadStalledError. Default 60s of inactivity; override viaCAVE_MODEL_DOWNLOAD_IDLE_TIMEOUT_MS,0disables (#143).
v1.2.4
Fixed
- Fixed configured MCP servers never reaching the model in normal sessions:
createAgentSessionpinned a fixed initial active-tool list (read/bash/edit/write/task/agent) that overrode the session's computed default, so the registeredmcp_tool_search/mcp_tool_call(andmemory_*) tools were never activated.mcp listshowed servers and no error fired, yet the agent had no MCP tools. The initial active set is now left unset unless the caller passes explicittools, so the session activates the memory and MCP bridge tools it discovers (#127).
v1.2.3
Fixed
- Fixed
ctrl+o("Toggle tool output") not expanding tool output for tool rows grouped into a tool shelf (the running/most-recent turn): the shelf now propagates output expansion to its nested rows and reveals them when expanded, instead of flashing and reverting (#134). /model <search>now surfacespricing refresh failedinstead of silently swallowing the pricing refresh error (was fired fire-and-forget with no handling) (#133).
v1.2.2
Added
- Wired configured MCP servers into normal sessions: when
mcp.jsonhas at least one server, the session now registers the always-onmcp_tool_search+mcp_tool_callbridge tools (lazy connect, no startup blocking)./mcp listalso reports whether the current agent actually received the MCP tools (#127).
v1.2.1
Fixed
- Release and smoke-install CI: bind the local install-test server to
127.0.0.1so macOS runners (which resolvelocalhostto IPv6 first) no longer hang and fail the installer download (#124) - Linux package build produces a valid Debian version for non-numeric smoke builds (
smoke->0.0.0~smoke), fixing thedpkg-deb"version number does not start with digit" failure (#124) - Release workflow no longer pushes directly to protected
main: the Homebrew formula bump now lands via an auto-mergeable PR and nightly bench results are committed to a dedicatedbench-resultsbranch (#124, #125)