Skip to content

0.8.0

Choose a tag to compare

@mishan mishan released this 18 Oct 07:57
· 258 commits to main since this release
v0.8.0
28eec84

MCP tools named for what they do (verb_noun: renamed, see below), with
descriptions that say when to use each; MCP revisions 2025-11-25 and
2026-07-28; pictures sized for the model looking at them, bounded
answers, and a program's text marked as its own. Waiting for a spawned
program's window by its name, window waits that say what's there, and
sessions killed outright cleaned up, with sessions --stale and
--clean for what was left before.

Changes to check when upgrading

  • An unknown MCP tool is a protocol error: a tools/call of a tool
    shotbox doesn't have is a JSON-RPC error, -32602, as the spec has it,
    not an isError answer.

  • MCP's tools are named verb_noun, so an agent can guess what each
    does from its name. A client's permission list that names them
    (Claude Code's mcp__shotbox__click, say) needs the new names; a call
    by an old one is refused, naming the new one. Their arguments and
    answers are as before.

    Was Now
    spawn spawn_program
    program_output get_program_output
    accessible_tree get_accessible_tree
    screenshot take_screenshot
    record record_video
    click click_element
    scroll scroll_wheel
    gamepad use_gamepad
    lint check_accessible_names
    contrast check_contrast
    tab_walk check_focus_order
    announcements list_announcements
    sound record_audio

    start_session, stop_session, press_keys, type_text and
    wait_for keep theirs. The commands (shotbox click, a11y lint...)
    are as they were.

  • MCP marks a program's text: get_program_output's lines, the line
    wait_for line and record_video's until_line end on, and
    list_announcements come a line each after | , and the instructions
    say such lines, and quoted names and titles, are the programs', not
    the person's. A client reading
    wait_for line's answer as the bare line needs to take the | off.

Added

  • shotbox --version: which shotbox this is.
  • shotbox sessions --stale lists scratch dirs whose sessions have gone,
    with each one's size and the command, pid and time that made it, which
    a shotbox.json in it now says, and lasting sessions unused for a day;
    shotbox sessions --clean removes those dirs, with what's left running
    of their sessions (an older shotbox's, which say nothing, only with
    --unmarked). shotbox doctor says how many there are, and their
    size.
  • MCP's wait_for a window takes the name a program was spawned by, and
    waits for a window of that program's, whatever its title, on X11 and
    Wayland, over one titled the name (^name$ still waits for that),
    which is taken if the program has none of its own, as a daemon's
    window is; spawn_program's answer says so.
  • MCP revisions 2025-11-25 and 2026-07-28, with server/discover.
  • MCP's take_screenshot and record_video say a picture's size, and
    shrink one past what Claude sees unscaled (a 1568 px long edge or 1568
    patches of 28 px: 1920x1080 to 1456x819), saying the scale, so an x,y
    read off it can be mapped back for click_element. A burst's and a
    clip's sheet lays its pictures out as many to a row as shrinks them
    least, two 1920x1080 screens to a row, not always four.
  • MCP's start_session, without the system's PyGObject in sight (plain
    pipx install, uvx), starts anyway and says which tools won't work
    and how to fix it, as it says what it couldn't seal.

Changed

  • A session killed outright (SIGKILL) no longer leaves its scratch dir
    in $TMPDIR, nor its X server, bus and programs running, nor those of
    a session started in it: a watchdog process of its own stops them,
    letting a recording finish its file
    within 5 seconds, and removes the dir (not one kept
    with --keep), as shotbox mcp's does for its sessions, which it now
    stops with SIGTERM too, before SIGKILL 5 seconds on.
  • MCP's answers are bounded: start_session's screen is at most
    7680x4320; get_accessible_tree, the checks and list_announcements
    stop at 500 lines, saying how many more and to narrow it with window;
    and a program's line, or a tree line, stops at 500 characters.
  • docs/mcp.md says that wait_for line reads any text file under the
    allow file's directory, so it belongs in its own or the project's, not
    your home, and that allowing a terminal, browser or file manager hands
    the agent arbitrary commands through type_text.
  • A command that needs PyGObject, run from uvx or uv tool install,
    whose environments can't see the system's, says to install with
    pipx install --system-site-packages shotbox, not to make the
    virtualenv with --system-site-packages, which uv's tools can't.
  • MCP's tool descriptions say when to use each tool and which to use
    instead, what its answer holds, and its defaults: get_program_output
    reads a program that has exited, list_announcements keeps what was
    said, oldest first, and check_contrast raises the window it measures.
  • MCP's check_focus_order, when nothing has the focus to start from,
    says to click the window with click_element, not to run
    shotbox focus, which an agent can't.
  • A window wait that gives up (wait window, Screen.wait_window, a
    --window that waits, MCP's wait_for) lists the windows there are,
    the nearest first, with their app ids on Wayland, as a click by name
    lists the nearest names; so does a --window with no such window.