Repository navigation
Releases: qualixar/modstage
Releases · qualixar/modstage
Release list
ModStage 0.0.20
Added
- Hermes (Nous Research) is a built-in agent, started over ACP (
hermes acp). Install:curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash. The launcher says so before Start when Hermes's ownapprovals.modeis off.
Changed
- OpenCode's model picker shows only the providers you have set up, newest models first, capped per provider instead of overall, and refreshes when OpenCode's auth or config changes. Nothing is tied to one machine: paths follow XDG,
OPENCODE_CONFIGandHERMES_HOME.
ModStage 0.0.19
Fixed
- The band above the prompt respects the row budget. Asked for in the listing review: the engine tells the band area how many rows it has (
maxRows). With none, ModStage's band steps aside and every other mod's band stays; with one or two rows it draws one compact row (title, counts, Open) without a chip per run; with more it draws the full band. It always sits below the other mods' bands (0.0.15 stopped it from hiding them). Tests cover no room, little room, plenty of room, nothing downstream, and the survey passthrough, on the desktop and the terminal. - The run chips in the band use each agent's own colour.
ModStage 0.0.18
Fixed
- The pane could not be scrolled while a run was streaming (P1). Two causes. 0.0.17 drew the head's pictures in frames (
isInteractive) so they would animate, and a frame swallows the mouse wheel; every picture is an ordinary image again (the animation is CSS, as in 0.0.16), and a test fails if any picture is ever framed. And the follow-the-output rule counted "one row short of the end" as still at the end, so one wheel notch up was undone by the next poll: any scroll up now ends following at once and cancels a pending snap to the end, a rest anywhere but the very end does too, and picking an agent in the launcher stops following so the pane is never pulled away from it. - The logo was missing. The panel's picture scrub does not draw an embedded bitmap, so 0.0.17's header showed a blank tile. The logo is now redrawn as vector shapes (the four robots and the sound waves) and drawn from the same colours as the README's.
- A failed send never leaves a trace. Enter pressed twice quickly no longer sends twice (the second press is ignored while the first is running); a message to a Claude subagent that fails to send is no longer shown in its transcript as sent; the box is emptied only when the bridge took the message, and a box that was sent is empty again.
- An agent colour from
~/.modstage/agents.jsoncan no longer reach any picture unchecked (the robots, the picker, the card titles, pills and gauges); 0.0.16 guarded the head only. - Pictures fit the pane. Card titles are as wide as the card's inside (they were 26 px short); a pane that does not report its width falls back to a sane width instead of the minimum.
Changed
- Start an agent is a row of robots. On the desktop each agent is its own robot (ringed in its colour when picked, asleep and grey when its CLI is not installed) over a button with its name, instead of a row of grey buttons. The card titles of Start an agent and the message box carry a small robot in the agent's colour, and the message box is edged in the agent's colour.
- The robot tile beside the run card is vertically centred; long notes (an agent's permission note) wrap over two lines instead of being cut; the header's "stalled" counter moves in 10-second steps so it does not redraw every second.
ModStage 0.0.17
Changed
- The panel's own logo, and robots in its style. The header carries ModStage's real logo (the four robots from the README) instead of a mark invented for 0.0.16, and each agent's robot is redrawn in the logo's family: a flat, rounded head in the agent's colour with a navy outline, round eyes and an antenna ball. Working: the eyes look left and right and the ball beats. Waiting on you: wide eyes and an amber ball. Idle: a smile and a blink. Ended: eyes closed. Failed: crossed eyes and a red ball.
- The lower cards match the head. Needs you, Start an agent and the message box open with the same vector title row as the head (an icon tile in the card's colour, the title, a dim line, a rule). Labels (agent, model, effort) sit at the top of their row instead of floating in the middle of wrapped chips. The run tabs are one line each: the agent's coloured mark, its name as a button (filled when selected) and the task in dim text, in place of the checkbox-like badge.
- No duplicate buttons on the desktop. The engine's text box already carries its own Send or Start button there, so ModStage's second Start and Send buttons are gone on the desktop (the terminal keeps them). The long hint under each box is gone on the desktop too.
Fixed
- Animation runs, and keeps running. The engine draws a plain vector picture as a still image; only a picture drawn in a frame (
isInteractive) animates. The animated pictures of the head now ask for the frame. The head is also split into separate pictures, because a picture that changes restarts its animation: the robot's picture now depends only on the agent, its state and the card's height, so it keeps animating while the numbers beside it change; elapsed time moves in 15 s and 30 s steps instead of every second; and pulses live only in pictures that stay constant. Tests cover each of these.
Known limits
- The engine's text box on the desktop is a single line with its own Send button: the
rowssetting (a taller box) is not applied there, as screenshots of 0.0.16 showed. Pasted text is kept whole. Attaching an image is not possible from a mod's text box.
ModStage 0.0.16
Fixed
- The desktop head never ran text into a neighbour. At the narrowest panes the header, the stat tiles and the run card now stack or shorten instead of overlapping; the bridge's problem line is shown on the desktop too; a custom agent's colour that is not a plain hex value is ignored instead of reaching the drawing. A test parses every drawn text at seven widths and fails on any overlap or overflow.
Changed
- A new look for the panel, built from soft cards. On the desktop the head is now one vector picture sized to the pane: a header card (wordmark, live state, one aligned cell per agent that has runs), four stat tiles (working, needs you, finished, spend), and the selected run's card with the agent's mark, a state pill, chips, the folder, a context gauge and token and cost use. It animates with CSS alone, so the 10-frames-a-second redraw of the old head is gone on the desktop. The terminal keeps its text drawing and gets the same four tiles. Look and layout were shaped after the screens of claude-mods, claude-flightdeck and Control-Room-Mod (all MIT; credited in THIRD-PARTY-NOTICES.md).
- Every agent has its own colour, and no two look alike: Claude coral, Codex blue, Muse violet, Grok amber, Antigravity teal, Kimi pink, Qwen green, OpenCode slate. The bridge and the panel use the same table, and tests fail if two agents ever come within reach of each other or the two tables drift apart.
- The robots are more mature. A squared head with a visor, an antenna and a neck, in the agent's colour. Working: a light sweeps the visor. Waiting on you: amber eyes. Idle: eyes that blink. Ended: eyes closed. Failed: crossed eyes. Every loop shares one 2.4 s beat so they stay in step. The terminal has the same mark in text, 9 columns wide in every state (it used to change width as its arms swung).
- Everything lines up. Inbox, launcher and message box are cards with one padding and a shared label column (agent, model, effort), so controls sit in the same columns. Needs-you comes first, then the head, then the launcher.
- A click is felt, and never overstated. A pressed button says what it is doing (Allowing…, Starting…, Sending…, Interrupting…, Closing…) while the bridge has not answered, then what it did (✓ Allowed, ✓ Started, ✓ Sent…) for a moment, and ignores a second press meanwhile. An approval you answer leaves a confirming line (✓ Allowed, ✓ Allowed for this run, ✓ Denied) for 1.8 s after its card is gone. An action the bridge refused or that failed never shows a ✓: its button simply returns and the error shows as before. Found by an independent review before release, which showed the first version claiming "✓ Allowed" for an approval the bridge had refused.
- Stronger text boxes. The task box and the message box are several lines tall and full width, with a Start and a Send button next to Enter, and a half-written message survives a redraw or a switch to another tab, is emptied only once the bridge has taken it (a send that fails keeps your text), and is dropped when the session ends. Pasted text stays whole. (Attaching an image is not possible from a mod's text box today; that needs a change in the engine's API or a path-based attach in the bridge.)
ModStage 0.0.15
Fixed
- ModStage hid every other mod's band above the prompt. Its band never asked the mods beneath it for theirs, so while ModStage was installed, context-bar, token-weather, cache-tax's keep-warm row and any other mod that draws above the prompt showed nothing. ModStage is an add-on and must not replace what a person already runs: its band now takes the shared place above the prompt (a Box keyed
band:modstage, in thebandscolumn the community band mods already use), below the bands the other mods draw, and a failing mod beneath it cannot take it down. A survey still hides ModStage's band, and only that. Regression tests mount a second mod's band under ModStage on desktop and terminal and fail on 0.0.14. Reported by a user running context-bar and token-weather beside ModStage.
ModStage 0.0.14
Added
- Thinking effort, per run. The launcher shows the levels each agent and model takes, with the default your CLI's own config uses marked, and
stage_starttakeseffort. Codex (low to ultra, from its own model list; Codex reports the effort it applied and the run shows it), Muse (minimal to max, from its per-modelvariants) and Grok (--effort, accepted by the CLI; Grok's service was failing every run on the day this was checked, so its effect was not observed) apply it. Observed live: Codex reported the applied effort, and Muse used 30 thinking tokens atminimalagainst 1.2k atmaxon the same question. Until now ModStage never sent one, so every Codex run used whatevermodel_reasoning_effortyour config says (medium here) however hard the task. An effort an agent cannot take is refused with what it does offer, never silently ignored: Antigravity carries its effort in the model name (High, Medium, Low) and OpenCode's ACP mode advertises no effort setting (checked live), so neither offers chips. - Thinking tokens are shown on the run card and in
stage_status/stage_wait, so the effect of an effort is visible: the same question cost Muse 30 thinking tokens atminimaland 1.2k atmax. stage_agentslists each agent's levels and default.
Fixed
- One message could still approve two actions when a reply was lost. If the bridge applied a
stage_decidebut its reply never arrived, the user's message was released and could then approve a second, different action. A request whose outcome is unknown (connection lost, or a 5xx) now keeps the message spent and tells Claude plainly that it could not confirm the result; the user answers again in a new message. Only a definite refusal from the bridge (a 4xx) or a failure before anything was sent gives the message back. Reported in review on the awesome-claude-code-mods listing; regression tests reproduce it on 0.0.13 and fail there. - Only a message that IS a decision counts as one.
stage_decideused to read a decision out of any message that contained the right words, so "allow it just this once, not for the rest of this run" passedallow_session, "never allow that" passedallow, and "should I allow it? what does it do?" passedallow. A decision is now a message that consists of a decision ("allow it", "yes allow the pip install", "no, don't run that", "allow it for the rest of this run", "deny the curl"); questions, negations, conditions, a second instruction and extra words decide nothing. Allowing needs an explicit verb (allow, approve, accept): a bare "yes", "ok", "sure" or "go ahead" can answer any question Claude asked, and an agent can steer Claude into asking one, so it no longer approves anything. Denying stays easy ("no", "deny it"). - A message answers only the approval it was sent for. It is bound, when the user sends it, to the one approval waiting, or, when it names an action ("allow the pip install"), to the one it names, and to nothing otherwise. So "allow the pip install" can no longer approve a different run's
rm(even when thermis the only one waiting), and a message the bridge refused (the panel answered first, the approval timed out) can no longer be reused on another approval. With several approvals waiting, "allow it" names none and Claude is told to ask which. A slow bridge never holds your prompt (the lookup gives up after 1.5 s and binds to nothing), and a newer message is never overwritten by an older one. A message that names an action must name that approval and nothing else ("allow codex nah", "allow pip install later", "allow it once for the run" answer nothing). Found by an independent adversarial review of the whole approval path (three rounds, the last with 30,888 generated phrases, none of which reaches the bridge carrying a decision the text does not state), after two upstream review rounds on the same gate. - Muse's edits showed no diff. Muse's edit tool takes
findandreplace, which the diff builder did not know. Found by running the real CLI. - Codex could not reach the coordination board. Its sandboxed shell cannot reach the local bridge, so when it chose
modstage-cliinstead of the board tools, the claim failed. Codex is now told to use the board tools only (the shell fallback stays for agents whose shell can reach the bridge).
ModStage 0.0.13
Fixed
- The black gap between the run's card and the tabs. The animated head was given a fixed 16 rows while its content used about 12. It now takes the height of what it draws; nothing in it depends on the room it is given, which is what made the old stage unmount.
Added
- Every agent now shows what it did in full, not a short cut of it. Edits show the change as a diff (Codex, Grok, Kimi, Qwen Code, OpenCode, Muse, Antigravity and Claude subagents); a command is shown whole (it was cut at 160 to 200 characters); a tool call's other arguments are listed; command and tool output reaches the panel up to 4,000 characters (it was cut at 1,500); Codex MCP and dynamic tool results are recorded, which they were not before; reasoning shows up to 3,000 characters (was 1,200).
- Claude reads the same detail.
stage_statusandstage_waitsummarise each step by what came of it (edited a.py (+3 -1), a result's last line), and takedetail: trueto include the full detail of each step, fenced as the agent's own words. - Two new rows in the parity matrix (tool input and output in full; edits show what changed), checked for every agent against its own protocol shapes. The diff fields of Codex and the ACP agents follow each protocol as documented and are marked as not yet confirmed against the real CLIs.
Known limits
- A Codex command's output appears when the command ends, not while it runs.
ModStage 0.0.12
Fixed
- 0.0.11 squeezed the panel to a few rows you could not scroll. The stage was given a fixed height worked out from an estimate of the pane's size; in a pane where that estimate came out small, the run's card was cut off and the transcript was gone. The stage no longer has a computed height at all: the card and the transcript take the room they need and the whole pane scrolls.
Added
- The run's transcript scrolls like a terminal. It is drawn in the pane body, so the mouse wheel, arrow keys and Page Up/Down move through it. Messages wrap in full (they were cut at 400 characters), a tool call's result expands to its whole output and an edit to its diff (
▸ N lines/▾ collapse), and↑ N earlier eventspages back through the run's history (up to 1,000 events kept in the panel). New output is followed while you are at the bottom and stops following when you scroll up; scroll back to the end to follow again. - Only the animated title bar and robot card stay in the animated region, at a fixed size; everything you read is ordinary pane content.
ModStage 0.0.11
Fixed
- Approvals can no longer push the stage past the engine's size limit. The stage received every run whole, including each waiting approval's full detail (up to 4,000 characters) and file lists; a few approvals across several agents passed the 100,000-character limit and the engine refused to draw the pane. The stage now receives only what it draws, capped.
- The animated stage no longer vanishes when an approval arrives. Its height followed its own measured region, so the approval card above it shrank the region, which shrank the content, until the engine unmounted it ("changed its own size after each of 3 draws") and the panel showed a hole until it was reopened. The pane now gives the stage a fixed height computed from its own size and the cards around it, and if the engine ever unmounts the stage anyway, the pane draws it from the plugin and says why.
- The start panel no longer stacks the "not installed" buttons flush under the installed ones. Installed and missing agents now share one wrapping row, so the gaps between buttons are the same everywhere.