controlroom

Changelog

Every release of controlroom, newest first, from its CHANGELOG.md — what changed and the pull request it came from.

1.0.5

Patch Changes

  • #1160 0b381a0 Thanks @ofri-peretz! - Export ./package.json. require('<package>/package.json') threw ERR_PACKAGE_PATH_NOT_EXPORTED, which broke tools that read a dependency's manifest that way: bundlers, license scanners and version checks.
  • Updated dependencies [0b381a0]:
    • caique@1.4.4
    • closeout@1.1.5
    • flagstaff@1.7.2
    • linegauge@1.1.3
    • paratext@1.0.9
    • roundel@1.1.3

1.0.4

Patch Changes

  • #1156 05d1942 Thanks @ofri-peretz! - A pane taller than its rectangle scrolls. Before this, fit kept a pane's first rows and dropped the rest, and no key could reach them. The focused pane now moves with ↑/↓, PgUp/PgDn and Home/End, bound in the default keymap as scroll.up, scroll.down, scroll.pageUp, scroll.pageDown, scroll.top and scroll.bottom and listed by hints(). A pane at its bottom follows new lines like a log tail. Scrolled up, it stays where it was put, and its last row says how many lines are below (↓ 180). A resize re-clamps the position. Its position is reducer state, ScreenState.scroll, and reduce(state, action, extents) takes the pane heights that the new extents() measures.

    A tall pane on a live screen now opens at its last rows, where before it showed its first rows. Those rows were unreachable before, so nothing that worked stops working, but a long static text in a short pane now opens at its end until someone presses Home.

    Off a terminal nothing changes: a pipe, CI, a screen reader and an agent still get every line of every pane. compose with live: false now prints every line too, so a screen that closes inline leaves every line in the scrollback, not just the page it was on.

1.0.3

Patch Changes

  • #1130 c05c86e Thanks @ofri-peretz! - Every drop-in subpath now type-checks under moduleResolution: node10, and under module: commonjs with no resolution set, which is TypeScript's default there. import … from 'burgee/commander' used to fail with TS2307 in such a project, although require() of the same specifier worked. Each package now declares types and a typesVersions map, derived from exports, with one key per typed subpath pointing at the file exports already names. exports is unchanged, so node16, nodenext and bundler read exactly what they read before. controlroom/ink's declarations no longer name the untyped react-reconciler, which was TS7016 for consumers with skipLibCheck: false.
  • Updated dependencies [c05c86e]:
    • caique@1.4.2
    • closeout@1.1.4
    • flagstaff@1.7.1
    • linegauge@1.1.2
    • paratext@1.0.8
    • roundel@1.1.2

1.0.2

Patch Changes

  • #1045 c4fd9a3 Thanks @ofri-peretz! - The family plugin schema (schema.json, identical in every plugin host) now describes locales, burgee's locale-pack key. A plugin carrying locales validates against the shared schema as it does against burgee/locale-pack-schema.json, which lists every message id. This package reads nothing new, and a plugin carrying locales registers here as before.
  • Updated dependencies [c4fd9a3, c4fd9a3, b45f141]:
    • caique@1.1.0
    • closeout@1.1.2
    • flagstaff@1.4.0
    • linegauge@1.1.1
    • paratext@1.0.6
    • roundel@1.1.1

1.0.1

Patch Changes

  • #1011 1968eb4 Thanks @ofri-peretz! - The README quick start runs as written. On npm it was broken for flagstaff (rt undefined) and linegauge (styled undefined), controlroom's imported flagstaff without installing it, and paratext's printed nothing. No code changed; readme-quick-start-lock now runs every package's quick start.

  • #1022 ecb0a00 Thanks @ofri-peretz! - The tarball no longer carries declaration files that no exports entry reaches. TypeScript could never open them, because a deep import is refused by exports. Every entry's types are unchanged. The ten packages drop 71 files and 118,312 bytes between them, burgee 35 files and 76,504 bytes, which takes its tarball from 251,814 to 225,278 bytes gzipped.

  • Updated dependencies [1357061, 49d8e94, bfe4ab8, 45a70be, 1968eb4, 65afee5, bcc438a, ecb0a00]:

    • flagstaff@1.3.0
    • caique@1.0.5
    • linegauge@1.1.0
    • paratext@1.0.5
    • roundel@1.1.0
    • closeout@1.1.1

1.0.0

Major Changes

  • #947 a5c3282 Thanks @ofri-peretz! - controlroom is 1.0. Its entries ., ./ink, ./plugin, ./schema.json and the controlroom bin are now a semver contract, and controlroom/ink is ink 8.0.0's API at that major: 1304 / 1304 on ink 8's own suite and 102 / 102 on @inkjs/ui 2.0.0's, level with real ink on both, with 100% coverage and every spec row built. Nothing changed in the code; the major ends the hold D-20261007-caique-controlroom-1-0-evidence placed on the cut, re-measured in D-20261009-controlroom-1-0.

0.3.5

Patch Changes

  • #938 9babb6d Thanks @ofri-peretz! - npm description and README: the description says what the package does, then its dependency fact in one of two wordings ("Zero dependencies." or "No dependency outside the burgee family."), then its drop-in paths. The README's family section states how the family is built — the leaves, one-way dependencies, nothing from outside the family, trusted publishing with provenance — and its table column is "Migrates from". No API, compatibility grade or benchmark changes.
  • Updated dependencies [9babb6d]:
    • caique@1.0.4
    • closeout@1.0.4
    • flagstaff@1.2.5
    • linegauge@1.0.8
    • paratext@1.0.4
    • roundel@1.0.4

0.3.4

Patch Changes

  • #917 735f0f6 Thanks @ofri-peretz! - README: the opening paragraph says what the package does first. The drop-in path follows it as one line, naming the incumbent and npx burgee migrate, and every compatibility row and benchmark is unchanged.
  • Updated dependencies [735f0f6]:
    • caique@1.0.3
    • closeout@1.0.3
    • flagstaff@1.2.4
    • linegauge@1.0.7
    • paratext@1.0.3
    • roundel@1.0.3

0.3.3

Patch Changes

0.3.2

Patch Changes

  • #892 82292af Thanks @ofri-peretz! - The root entry's doc comment, which TypeScript shows on hover and the API reference prints, no longer says the package is reserved and exports one constant. It names what the entry exports: open() and its runtime, the layout arithmetic, the tab, focus and collapse reducer with its hint line, and the compositor, with ink's API at controlroom/ink and plugins at controlroom/plugin. status is still 'reserved', kept so a program that read it still loads.

  • #895 e641aa3 Thanks @ofri-peretz! - README: the Plugins example now default-exports its plugin, so controlroom check accepts it, and registers flagstaff's log-tail before open(), which threw for a pane drawn with an unregistered component.

  • Updated dependencies [d33ae03]:

    • caique@1.0.1

0.3.1

Patch Changes

  • #848 6ae533e Thanks @ofri-peretz! - The family schema.json describes what five values look like. contract is 1, and burgee refuses a plugin that declares none. A caique widget's static(spec) gets { kind, message, ...sample.done }. A seniority rank sits between the built-in layers at flag 0, environment 10, config file 20, package.json 30 and default 40. A burgee hook's filter is { command: RegExp }, now with command required, so the schema and the host refuse the same filters.

  • #857 d80b2d0 Thanks @ofri-peretz! - The family schema.json closes a bellpull resolver's when with additionalProperties: false, so the schema and bellpull's own validation refuse the same unknown keys.

  • Updated dependencies [446a691, d80b2d0, 6ae533e, d80b2d0, fd8e659, 6ae533e]:

    • caique@1.0.0
    • closeout@1.0.1
    • flagstaff@1.2.2
    • linegauge@1.0.5
    • paratext@1.0.1
    • roundel@1.0.1

0.3.0

Minor Changes

  • #839 7694faa Thanks @ofri-peretz! - controlroom/ink is ink 8.0.0's API, graded 1304 / 1304 by ink 8's own suite (control 1303 / 1304). New: usePaste, useAnimation, useBoxMetrics, useWindowSize, suspendTerminal and waitUntilRenderFlush on useApp, the alternateScreen and interactive options, wrap="hard", and the yoga props ink 8 sets — maxWidth/maxHeight, aspectRatio, top/right/bottom/left, position: static, alignContent. Where ink 8 changed ink 6's answer, the drop-in follows ink 8: the kitty keyboard answer is read off the input stream, Delete is no longer read as Backspace, and a non-interactive debug run ends with a newline.

0.2.1

Patch Changes

0.2.0

Minor Changes

  • #816 5230016 Thanks @ofri-peretz! - controlroom hosts an input line inside a screen (R20): open(rt, { input: { editor, pane, onSubmit } }) routes keys to caique's line editor while its pane has focus and lets unused keys fall through to the keymap; outside a terminal, entries come from piped stdin, never a wait. closeout gains bracketedPaste() in closeout/cursor, paired with its restore like the alternate screen.

  • #816 5230016 Thanks @ofri-peretz! - controlroom/ink negotiates the kitty keyboard protocol as ink does: pushed at once with kittyKeyboard: { mode: 'enabled' }, and in auto mode only once a known terminal answers the query, with every other byte handed back to stdin and the pop written at unmount. ink's own suite now passes 584 / 584. paratext's csi spells the protocol's three sequences (kittyKeyboardPush, kittyKeyboardPop, kittyKeyboardQuery).

  • #816 5230016 Thanks @ofri-peretz! - controlroom is no longer a reservation: the screen (open(), inline or in the alternate screen, with static and NDJSON projections), the layout and tab state, and controlroom/ink ship. The package is held to the family's 100% coverage thresholds.

  • #816 5230016 Thanks @ofri-peretz! - controlroom hosts plugins (R10): keymaps and panes register through controlroom/plugin's register() against the family schema, a screen takes either by name, and controlroom check <plugin-file> reports what a plugin contributes. The family schema every host ships gains the keymaps and panes definitions.

Patch Changes

  • #815 28cb9a5 Thanks @ofri-peretz! - controlroom's README documents the line that runs packages written for ink on controlroom/ink unchanged — "ink": "file:./ink", a two-file package that re-exports the drop-in — and why a bare npm: alias cannot: it names a package, not a subpath. ink-spinner, ink-text-input and ink-select-input run that way, as published, in examples/ink-ecosystem, and examples/chat-cli-ink is the chat boilerplate written for Ink and run on the drop-in.

    The benchmarks measure controlroom's weight gates against ink 6.8.0 on React 19.3.0, each at ≤ 1.0×: the drop-in with React and the reconciler bundled against ink with React (W1, 0.745), the same two installed, in bytes and in packages (W2, 0.378 and 0.238), the native root against ink alone (W3, 0.048), and importing each entry point against importing ink and React (W4, 0.289 and 0.144). A B4 side may now be several imports, with externals, and counted whole when its peers load under top-level await.

  • Updated dependencies [a47209b, 5230016, 5230016, 5230016]:

    • caique@0.7.1
    • closeout@0.7.0
    • paratext@0.9.0
    • flagstaff@1.1.1
    • linegauge@1.0.4
    • roundel@0.6.3

0.1.0

Minor Changes

  • #809 4f45dbf Thanks @ofri-peretz! - controlroom/ink: a drop-in for ink 6.8 — render, renderToString, Box, Text, Static, Transform, Newline, Spacer, every ink hook and measureElement — rendered by the program's own React through React's own reconciler (React 18 and 19), and laid out by a TypeScript port of yoga's flexbox for the props ink exposes, with no yoga. react and react-reconciler are optional peers: installed alone, the subpath refuses on first import with E_PEER_MISSING and npm install react react-reconciler as its fix, and the package root never loads either. Graded by ink's own suite at 576 of 584 cases and by @inkjs/ui's at 103 / 103, with 'ink' resolved to the drop-in.

    compat-oracle resolves a target's optional peers from the suite's own tree (Host.peers) and can serve a gated file's internal import from the target's own module (Host.targetInternals); both ink rows now grade controlroom/ink.

    burgee migrate reports ink → controlroom/ink as a graded drop-in path that is not level yet, and does not rewrite it.

Patch Changes

On this page