From ea8207f405d9e724114bcb141f582401b7c1a86d Mon Sep 17 00:00:00 2001 From: Thomas Kosiewski Date: Fri, 30 Oct 2026 02:06:37 +0000 Subject: [PATCH 1/6] Release v0.1.0-beta.2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit _Generated with [`xum`](https://github.com/coder/xum) • Model: `anthropic:claude-opus-5-5` • Thinking: `high`_ Change-Id: I33025b77f36fe1aa07caf6d235625e3179ece212 Signed-off-by: Thomas Kosiewski --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index b646eb3..8c8040e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@coder/libghostty-vt-node", - "version": "0.1.0-beta.1", + "version": "0.1.0-beta.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@coder/libghostty-vt-node", - "version": "0.1.0-beta.1", + "version": "0.1.0-beta.2", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 3ff2fc4..52162be 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@coder/libghostty-vt-node", - "version": "0.1.0-beta.1", + "version": "0.1.0-beta.2", "description": "ABI-stable Node-API bindings for Ghostty libghostty-vt terminal semantics.", "license": "MIT", "engines": { From 413ffd923e71bc62c12cbc773bf7b67c99e37f9c Mon Sep 17 00:00:00 2001 From: Thomas Kosiewski Date: Fri, 30 Oct 2026 02:15:00 +0000 Subject: [PATCH 2/6] chore(release): raise the Communique response limit to 16384 tokens MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Communique 1.0.3 defaults to 4096 tokens per response. Generating the v0.1.0-beta.2 notes failed twice with "submit_release_notes was malformed 3 times". Communique 1.2.2 raised its own default to 16384 for this failure. _Generated with [`xum`](https://github.com/coder/xum) • Model: `anthropic:claude-opus-5-5` • Thinking: `high`_ Change-Id: Ib949fba4b692fbf9280e4c52b39e5c4da3b8ce6c Signed-off-by: Thomas Kosiewski --- communique.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/communique.toml b/communique.toml index 9050b4b..69f66b3 100644 --- a/communique.toml +++ b/communique.toml @@ -14,6 +14,7 @@ context = """ [defaults] repo = "coder/libghostty-vt-node" +max_tokens = 16384 emoji = false verify_links = true match_style = true From 431c20ff6e98f7bc103b62aa35613f767b46b1ac Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 30 Oct 2026 02:18:04 +0000 Subject: [PATCH 3/6] docs: update changelog for v0.1.0-beta.2 --- CHANGELOG.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9ed070..7f92f66 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,30 @@ All notable user-facing changes to this package will be documented in this file. ## [Unreleased] +## [v0.1.0-beta.2](https://github.com/coder/libghostty-vt-node/releases/tag/v0.1.0-beta.2) - 2026-10-30 + +## Added +- `encodeMouse(event, options)` on every terminal, backed by Ghostty's mouse-protocol encoder with validation of grid geometry, surface coordinates, and pressed-button state. A new `supportsMouseInput` capability marker lets consumers probe at import time ([#12](https://github.com/coder/libghostty-vt-node/pull/12)). +- `SnapshotCell` now exposes `faint`, `inverse`, `invisible`, and `strikethrough` SGR attributes, following the same "present only when set" convention as `bold`/`italic`/`underline`. Note that `inverse` is the raw attribute: `foreground`/`background` are not swapped ([#17](https://github.com/coder/libghostty-vt-node/pull/17)). +- `TerminalSnapshot.cursorVisible: boolean` reflects DECTCEM state (`ESC[?25h` / `ESC[?25l`) ([#17](https://github.com/coder/libghostty-vt-node/pull/17), [#38](https://github.com/coder/libghostty-vt-node/pull/38)). +- EGM contract READMEs for `src/`, `native/`, `scripts/`, and `examples/`, plus Blueprint sections appended to the root README. `native/README.md` and `scripts/README.md` are shipped in the npm tarball ([#29](https://github.com/coder/libghostty-vt-node/pull/29)). + +## Changed +- Pinned Ghostty to `v1.4.0` (and Zig to `0.17.0` for source builds). DECSTR soft resets (`ESC[!p`) now apply, and consumers inherit upstream Ghostty 1.4.0 behavior changes including reflow cursor placement, C0/C1 control characters no longer printing as cells, Unicode 18 width tables, origin-relative CHA/VPA/HPR/VPR, and `formatHtml` no longer appending a trailing newline per page ([#43](https://github.com/coder/libghostty-vt-node/pull/43)). +- `TerminalSnapshot.cursorVisible` is now a required `boolean` in the published types. The native binding has always set it; code that constructs its own snapshots must now include the field ([#38](https://github.com/coder/libghostty-vt-node/pull/38)). +- Release scripts now fail closed: tag creation stops on `git ls-remote` failures, prebuild assembly stages into a sibling directory before swapping, and `verify-prebuilds.mjs` sets `PREBUILDS_ONLY=1` and asserts the loaded addon came from `prebuilds/` rather than a stale local build ([#31](https://github.com/coder/libghostty-vt-node/pull/31)). +- Documentation no longer lists macOS x64 as a published prebuild target ([#4](https://github.com/coder/libghostty-vt-node/pull/4)). + +## Fixed +- Keep the `TerminalWrap` class reference per Node environment so `createTerminal` works correctly from `worker_threads` Workers and from the main thread after a worker that loaded the addon exits. The previous process-wide static could cause V8 aborts (`Cannot create a handle without a HandleScope`) or segfaults ([#23](https://github.com/coder/libghostty-vt-node/pull/23)). +- Range-check `cols`, `rows`, and `scrollbackLimit` for `NaN`, infinities, and out-of-range values before casting in the native layer, replacing undefined behavior with a `RangeError` ([#30](https://github.com/coder/libghostty-vt-node/pull/30)). +- `encodeMouse` now accepts UTF-8 mouse rows above U+FFFF (rows 65503-65534) in mode 1005 rather than throwing a spurious `RangeError`; surrogate guards remain ([#42](https://github.com/coder/libghostty-vt-node/pull/42)). +- `encodeMouse` now reads each caller field exactly once, so hostile getters cannot pass TypeScript validation with one value and forward another to the native layer ([#41](https://github.com/coder/libghostty-vt-node/pull/41)). +- Skip the mouse-safety test suite when the native addon is not loadable, matching the other native suites ([#39](https://github.com/coder/libghostty-vt-node/pull/39)). + +## Security +- Upgraded the repo Node toolchain to 26.12.1 for CVE-2026-111497 (Node2Shell). The published package's `engines.node` floor (`>=20.19`) is unchanged ([#21](https://github.com/coder/libghostty-vt-node/pull/21)). + ## [v0.1.0-beta.1](https://github.com/coder/libghostty-vt-node/releases/tag/v0.1.0-beta.1) - 2026-04-24 ## Added From 35b240ab234a071f4e030ebf79e1442c98261330 Mon Sep 17 00:00:00 2001 From: Thomas Kosiewski Date: Fri, 30 Oct 2026 02:25:06 +0000 Subject: [PATCH 4/6] fix(release): detect CHANGELOG headings that link the version MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Communique writes "## [v0.1.0-beta.2](url) - date". The entry check required whitespace after "]", so it never saw an existing entry and every push to a release branch regenerated the notes over hand edits. _Generated with [`xum`](https://github.com/coder/xum) • Model: `anthropic:claude-opus-5-5` • Thinking: `high`_ Change-Id: Ia23261661b60dcf63f73914409e025a5d57b80b3 Signed-off-by: Thomas Kosiewski --- .github/scripts/prepare-release-changelog.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/scripts/prepare-release-changelog.mjs b/.github/scripts/prepare-release-changelog.mjs index 32a3240..9e28d4e 100644 --- a/.github/scripts/prepare-release-changelog.mjs +++ b/.github/scripts/prepare-release-changelog.mjs @@ -44,7 +44,7 @@ function hasChangelogEntry(tagName) { const version = tagName.replace(/^v/, ""); const escapedVersion = version.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); const escapedTag = tagName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - const entryPattern = new RegExp(String.raw`^##\s+(?:\[?(?:${escapedVersion}|${escapedTag})\]?)(?:\s|$)`, "m"); + const entryPattern = new RegExp(String.raw`^##\s+\[?(?:${escapedVersion}|${escapedTag})\]?(?:\(|\s|$)`, "m"); return entryPattern.test(changelog); } From b9b631adc4054a518aa4813cc2edb95fca48a161 Mon Sep 17 00:00:00 2001 From: Thomas Kosiewski Date: Fri, 30 Oct 2026 02:25:06 +0000 Subject: [PATCH 5/6] docs: correct the v0.1.0-beta.2 changelog entry MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit cursorVisible first ships in this release, so it was never optional in a published version. The #39 bullet only changed a test. _Generated with [`xum`](https://github.com/coder/xum) • Model: `anthropic:claude-opus-5-5` • Thinking: `high`_ Change-Id: I9407e114ee961f9392f37b4afecafe2a774a0c4c Signed-off-by: Thomas Kosiewski --- CHANGELOG.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f92f66..cbef945 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,12 +9,11 @@ All notable user-facing changes to this package will be documented in this file. ## Added - `encodeMouse(event, options)` on every terminal, backed by Ghostty's mouse-protocol encoder with validation of grid geometry, surface coordinates, and pressed-button state. A new `supportsMouseInput` capability marker lets consumers probe at import time ([#12](https://github.com/coder/libghostty-vt-node/pull/12)). - `SnapshotCell` now exposes `faint`, `inverse`, `invisible`, and `strikethrough` SGR attributes, following the same "present only when set" convention as `bold`/`italic`/`underline`. Note that `inverse` is the raw attribute: `foreground`/`background` are not swapped ([#17](https://github.com/coder/libghostty-vt-node/pull/17)). -- `TerminalSnapshot.cursorVisible: boolean` reflects DECTCEM state (`ESC[?25h` / `ESC[?25l`) ([#17](https://github.com/coder/libghostty-vt-node/pull/17), [#38](https://github.com/coder/libghostty-vt-node/pull/38)). +- `TerminalSnapshot.cursorVisible: boolean` reflects DECTCEM state (`ESC[?25h` / `ESC[?25l`). The field is required, so code that constructs its own `TerminalSnapshot` objects must set it ([#17](https://github.com/coder/libghostty-vt-node/pull/17), [#38](https://github.com/coder/libghostty-vt-node/pull/38)). - EGM contract READMEs for `src/`, `native/`, `scripts/`, and `examples/`, plus Blueprint sections appended to the root README. `native/README.md` and `scripts/README.md` are shipped in the npm tarball ([#29](https://github.com/coder/libghostty-vt-node/pull/29)). ## Changed - Pinned Ghostty to `v1.4.0` (and Zig to `0.17.0` for source builds). DECSTR soft resets (`ESC[!p`) now apply, and consumers inherit upstream Ghostty 1.4.0 behavior changes including reflow cursor placement, C0/C1 control characters no longer printing as cells, Unicode 18 width tables, origin-relative CHA/VPA/HPR/VPR, and `formatHtml` no longer appending a trailing newline per page ([#43](https://github.com/coder/libghostty-vt-node/pull/43)). -- `TerminalSnapshot.cursorVisible` is now a required `boolean` in the published types. The native binding has always set it; code that constructs its own snapshots must now include the field ([#38](https://github.com/coder/libghostty-vt-node/pull/38)). - Release scripts now fail closed: tag creation stops on `git ls-remote` failures, prebuild assembly stages into a sibling directory before swapping, and `verify-prebuilds.mjs` sets `PREBUILDS_ONLY=1` and asserts the loaded addon came from `prebuilds/` rather than a stale local build ([#31](https://github.com/coder/libghostty-vt-node/pull/31)). - Documentation no longer lists macOS x64 as a published prebuild target ([#4](https://github.com/coder/libghostty-vt-node/pull/4)). @@ -23,7 +22,6 @@ All notable user-facing changes to this package will be documented in this file. - Range-check `cols`, `rows`, and `scrollbackLimit` for `NaN`, infinities, and out-of-range values before casting in the native layer, replacing undefined behavior with a `RangeError` ([#30](https://github.com/coder/libghostty-vt-node/pull/30)). - `encodeMouse` now accepts UTF-8 mouse rows above U+FFFF (rows 65503-65534) in mode 1005 rather than throwing a spurious `RangeError`; surrogate guards remain ([#42](https://github.com/coder/libghostty-vt-node/pull/42)). - `encodeMouse` now reads each caller field exactly once, so hostile getters cannot pass TypeScript validation with one value and forward another to the native layer ([#41](https://github.com/coder/libghostty-vt-node/pull/41)). -- Skip the mouse-safety test suite when the native addon is not loadable, matching the other native suites ([#39](https://github.com/coder/libghostty-vt-node/pull/39)). ## Security - Upgraded the repo Node toolchain to 26.12.1 for CVE-2026-111497 (Node2Shell). The published package's `engines.node` floor (`>=20.19`) is unchanged ([#21](https://github.com/coder/libghostty-vt-node/pull/21)). From 1678613fb3cb80d5cc1a785259c721b9127dce06 Mon Sep 17 00:00:00 2001 From: Thomas Kosiewski Date: Fri, 30 Oct 2026 02:31:54 +0000 Subject: [PATCH 6/6] docs: fold the encodeMouse fixes into its Added bullet MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit encodeMouse first ships in this release, so #41 and #42 did not fix a released bug. Their behavior now reads as part of the new API. _Generated with [`xum`](https://github.com/coder/xum) • Model: `anthropic:claude-opus-5-5` • Thinking: `high`_ Change-Id: Ic6de3b1b21ac87d8274619c74fd8121ef0e333e0 Signed-off-by: Thomas Kosiewski --- CHANGELOG.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cbef945..5e143c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ All notable user-facing changes to this package will be documented in this file. ## [v0.1.0-beta.2](https://github.com/coder/libghostty-vt-node/releases/tag/v0.1.0-beta.2) - 2026-10-30 ## Added -- `encodeMouse(event, options)` on every terminal, backed by Ghostty's mouse-protocol encoder with validation of grid geometry, surface coordinates, and pressed-button state. A new `supportsMouseInput` capability marker lets consumers probe at import time ([#12](https://github.com/coder/libghostty-vt-node/pull/12)). +- `encodeMouse(event, options)` on every terminal, backed by Ghostty's mouse-protocol encoder with validation of grid geometry, surface coordinates, and pressed-button state. It reads each caller field once, so the value it validates is the value it encodes. In UTF-8 mouse mode (1005), rows whose encoded value is above U+FFFF encode as 4-byte UTF-8, and cells whose encoded value would be a Unicode surrogate throw a `RangeError`. A new `supportsMouseInput` capability marker lets consumers probe at import time ([#12](https://github.com/coder/libghostty-vt-node/pull/12), [#41](https://github.com/coder/libghostty-vt-node/pull/41), [#42](https://github.com/coder/libghostty-vt-node/pull/42)). - `SnapshotCell` now exposes `faint`, `inverse`, `invisible`, and `strikethrough` SGR attributes, following the same "present only when set" convention as `bold`/`italic`/`underline`. Note that `inverse` is the raw attribute: `foreground`/`background` are not swapped ([#17](https://github.com/coder/libghostty-vt-node/pull/17)). - `TerminalSnapshot.cursorVisible: boolean` reflects DECTCEM state (`ESC[?25h` / `ESC[?25l`). The field is required, so code that constructs its own `TerminalSnapshot` objects must set it ([#17](https://github.com/coder/libghostty-vt-node/pull/17), [#38](https://github.com/coder/libghostty-vt-node/pull/38)). - EGM contract READMEs for `src/`, `native/`, `scripts/`, and `examples/`, plus Blueprint sections appended to the root README. `native/README.md` and `scripts/README.md` are shipped in the npm tarball ([#29](https://github.com/coder/libghostty-vt-node/pull/29)). @@ -20,8 +20,6 @@ All notable user-facing changes to this package will be documented in this file. ## Fixed - Keep the `TerminalWrap` class reference per Node environment so `createTerminal` works correctly from `worker_threads` Workers and from the main thread after a worker that loaded the addon exits. The previous process-wide static could cause V8 aborts (`Cannot create a handle without a HandleScope`) or segfaults ([#23](https://github.com/coder/libghostty-vt-node/pull/23)). - Range-check `cols`, `rows`, and `scrollbackLimit` for `NaN`, infinities, and out-of-range values before casting in the native layer, replacing undefined behavior with a `RangeError` ([#30](https://github.com/coder/libghostty-vt-node/pull/30)). -- `encodeMouse` now accepts UTF-8 mouse rows above U+FFFF (rows 65503-65534) in mode 1005 rather than throwing a spurious `RangeError`; surrogate guards remain ([#42](https://github.com/coder/libghostty-vt-node/pull/42)). -- `encodeMouse` now reads each caller field exactly once, so hostile getters cannot pass TypeScript validation with one value and forward another to the native layer ([#41](https://github.com/coder/libghostty-vt-node/pull/41)). ## Security - Upgraded the repo Node toolchain to 26.12.1 for CVE-2026-111497 (Node2Shell). The published package's `engines.node` floor (`>=20.19`) is unchanged ([#21](https://github.com/coder/libghostty-vt-node/pull/21)).