Skip to content

chore: version packages - #138

Open
bombshell-bot[bot] wants to merge 1 commit into
mainfrom
changeset-release/main
Open

bombshell-bot[bot] wants to merge 1 commit into
mainfrom
changeset-release/main

Conversation

@bombshell-bot

@bombshell-bot bombshell-bot Bot commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.

Releases

@bomb.sh/tty@0.10.0

Minor Changes

  • #132 d8f2a24 Thanks @natemoo-re! - Adds CapabilityEvent to InputEvent and changes InputOptions.terminfo to accept a TerminalInfo.

    scan() now parses terminal probe responses — OSC 10/11/12 theme colors, OSC 21 kitty color protocol, OSC 22 pointer shape, XTGETTCAP (DCS), kitty graphics (APC), kitty keyboard (CSI ?…u), synchronized output (DECRPM), and DA1 — and surfaces them as typed CapabilityEvent objects with keys foreground-color, background-color, cursor-color, colordepth, sync-output, kitty-keyboard, kitty-graphics, and pointer-shape.

    Breaking: InputOptions.terminfo now takes the TerminalInfo returned by detectTerminal() instead of raw compiled terminfo bytes. It seeds the key-sequence trie from terminfo.keys and uses terminfo.capabilities.colors to resolve colordepth denial events to the correct tier ("16" vs "256"). Raw bytes now go to detectTerminal({ entry }).

    Migration

    - import { createInput } from "@bomb.sh/tty";
    + import { createInput, detectTerminal } from "@bomb.sh/tty";
    
    - const input = await createInput({ terminfo: myTerminfoBinary });
    + const terminfo = await detectTerminal({ env: process.env, entry: myTerminfoBinary });
    + const input = await createInput({ terminfo });

    Omit terminfo entirely to keep the xterm default key sequences.

  • #137 628196c Thanks @natemoo-re! - Adds a cursor property to open(), so the mouse pointer changes shape (OSC 22) as it moves over elements

    When the terminal confirms support through the probe (term.capabilities.pointerShape), render() appends the shape change to output, so writing output keeps the pointer in sync. The shape resets to default when the pointer leaves, when a frame renders without pointer, or when update() withdraws the capability. detectTerminal() also seeds the capability from a known-support table for terminals that set shapes without answering the query (ghostty, kitty, foot, xterm ≥ 367), so those work out of the box. For anything the table misses, assert support with term.update([{ type: "capability", key: "pointer-shape", value: true }]).

    term.render([open("link", { cursor: "pointer" }), text("Docs"), close()], { pointer });
  • #139 acb51e1 Thanks @natemoo-re! - Adds synchronized output (DEC mode 2026) driven by the sync-output capability.

    When RuntimeCapabilities.syncOutput is true, every full-screen render is wrapped in Begin/End Synchronized Update (CSI ? 2026 h / CSI ? 2026 l) so the terminal presents the frame as one atomic repaint without tearing. The capability is raised only on positive evidence, resolved from three channels — a DECRPM 2026 probe reply (CSI ? 2026 $ p), an XTGETTCAP Sync reply (the terminal's own terminfo-declared synchronization sequence, value discarded in favor of the 2026 form), and detection-time seeding from the Sync extended capability in the parsed terminfo entry or the TMUX environment variable (tmux consumes mode 2026 from inner applications). Probe replies outrank detection-time evidence in both directions, so a DECRPM 0 or 4 reply turns the capability off even when detection seeded it. Frames render unwrapped when the capability is false or unknown. Zero-diff frames emit nothing whether or not wrapping is active, and line mode is never wrapped.

    Migration

    Capabilities gains a required syncOutput field. An object literal passed to createTerm as terminfo.capabilities must include it:

      terminfo: {
        capabilities: {
          colors: 256,
          trueColor: false,
          bce: true,
          autoMargin: true,
          xenl: true,
          altScreen: true,
          styledUnderline: false,
    +     syncOutput: false,
        },
      }
  • #133 2c6215c Thanks @natemoo-re! - Adds detectTerminal(), TerminalInfo, Capabilities, DetectOptions, KeyTable, and MAX_TERMINFO_ENTRY to the public API, and a terminfo option to createTerm.

    detectTerminal() reads the compiled terminfo entry for the current terminal (from the ncurses search path, or from bytes passed as entry), applies environment evidence (COLORTERM), and resolves a frozen TerminalInfo carrying static capabilities, a probe query batch to write to stdout, and opaque keys for the input parser.

    Pass the returned TerminalInfo as terminfo to createTerm and createInput. term.capabilities exposes the renderer's current capability snapshot, seeded from terminfo.capabilities (or the 256-color baseline when omitted).

    Changes term.update() to accept an array of InputEvent values instead of { events } or { width, height }. Resizes are now ResizeEvents tagged type: "resize"; capability events from scan() are folded into term.capabilities; all other input events are no-ops, so the full events array from scan() can be passed straight through. update() now returns a Uint8Array of bytes to write immediately (empty when there are none).

    Migration

    -term.update({ events });
    +const out = term.update(events);
    +if (out.length) process.stdout.write(out);
    -term.update({ width, height });
    +term.update([{ type: "resize", width, height }]);

    To opt in to terminfo-based capability detection:

    +const terminfo = await detectTerminal({ env: process.env });
     const term = await createTerm({ width, height, terminfo });
     const input = await createInput({ terminfo });
    +process.stdout.write(terminfo.probe);

Patch Changes

  • #114 666546e Thanks @natemoo-re! - Fixes combining marks (accents, ZWJ, variation selectors, kitty-graphics placeholder diacritics) being silently dropped from rendered output instead of attaching to their base character's cell. Cells that overflow the 8-mark-per-cell limit now also surface a COMBINING_MARKS_EXCEEDED render error instead of truncating silently.

@bombshell-cooper

bombshell-cooper Bot commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

Changeset review

  • warning: Changeset should start with an approved active present-tense verb.
  • warning: Changeset package scope does not match the affected packages confidently.

@pkg-pr-new

pkg-pr-new Bot commented Oct 9, 2026 •

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/@bomb.sh/tty@138

commit: 85ad172

@bombshell-bot
bombshell-bot Bot force-pushed the changeset-release/main branch 2 times, most recently from 145e743 to aa3054f Compare October 9, 2026 15:24
@bombshell-bot
bombshell-bot Bot force-pushed the changeset-release/main branch 3 times, most recently from 376cc6a to a363dac Compare October 19, 2026 12:04
@bombshell-bot
bombshell-bot Bot force-pushed the changeset-release/main branch from a363dac to 85ad172 Compare October 19, 2026 12:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants