Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 95 additions & 9 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,44 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.0.25] - unreleased
## [0.0.25] - 2026-10-21

### Added

- **Shell integration for all five supported shells (#2386):** `bitty
shell-init <shell>` now emits the init script and nested Tab completion
inline for bash, zsh, fish, PowerShell, and Nushell, generated from the
parser-owned grammar tables (`config`/`profile`, `ctl` resources,
`plugin`/`config` actions, `extension`, `dev trace`/`dump`/`overlay`,
`inspect`/`list`, `shell-init`/`completion`). Sourcing never invokes
`bitty`, registers once per shell, and stays safe under strict mode or a
double source; absent or older binaries remain harmless. Every prompt path
emits OSC 133 A/B/D and OSC 7 (`PROMPT_COMMAND`/precmd+prexc, fish events,
wrapped prompt plus PSReadLine, Nushell `pre_prompt`/`pre_execution`).
- **Profile-backed `bitty init` (#2344, #2382):** a bare `bitty init` writes
`profiles/default.lua` plus a thin `init.lua` selector. `--profile NAME`
creates or refreshes one named preset (`minimal`, `dark`, `light`, or a
custom name), `--migrate` moves a legacy `init.lua` to
`profiles/default.lua`, and `BITTY_PROFILE` selects a profile over the
persisted selector. Existing files are never overwritten: a conflicting
preset fails closed with a typed diagnostic.
- **Bounded extension catalog install path (#2346):** extension installs can
resolve a catalog entry for the exact `(name, host target)` and enforce its
digest before staging, on top of the existing store and TOFU pin flow.
- **Windows named-pipe IPC transport (#2351):** terminal IPC and devtools
inspection use a per-user named pipe on Windows with the same request
framing and denial behavior as the Unix socket, including the no-orphan
worker check.
- **Interactive surfaces: band hit regions, anchors, and drag preview
(#2347, #2350, #2343):** bands expose per-item click and scroll regions
and target anchors/present annotations, and `Mod+LMB` drag shows a live
preview that reflows on release.
- **Lua UI composition parity and scene style primitives (#2385, #2392,
#2363, #2369):** overlay style declarations are honored (pill chrome is
kept and root declarations inherit), a parity matrix pins the bounded Lua
UI composition surface, and candidate scene style primitives plus a
bounded component catalog provide reusable, capped building blocks. These
are candidate surfaces with no production consumer yet.

### Changed

Expand Down Expand Up @@ -43,9 +80,36 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
`set_layout`, which syncs the primary owner's grid/winsize when the owner
is visible and leaves a hidden owner untouched; any embedder that used the
preserve variant should call `set_layout` instead.
- **`window.blur_radius` rejects non-zero values (OQ-038):** the key is now
recognized by the Lua loader so a non-zero value fails closed with a typed
`window.blur_radius` diagnostic ("background blur is not supported
(OQ-038): only 0 is accepted") instead of an unknown-key error or a silent
no-op. `0` remains accepted; the platform blur seam stays reserved for a
future bounded contract.

### Removed

- **`bitty-rich` kitty stub and `wallpaper_theme` (#2358, #2359; #2365):** the
unwired kitty graphics stub and the wallpaper theme hook are gone instead
of remaining as dead seams.
- **Unwired `bitty-rich` surfaces (#2117; #2357):** retire-out candidates that no
production path reached were removed in the first retire-out batch, leaving
the graphics seam fenced to the extension boundary; the remaining
candidates stay tracked in #2117.
- **Core dependency resolver (#1999):** package-distribution resolution
semantics are retired from Core; their replacement in
`bitty-plugin-manager` is deferred, so no component currently owns them.

### Fixed

- **Closing a pane tears down the session it painted (#2389, #2404):** close
teardown asked whether the focused leaf was the primary view, which can name
a leaf that owns a pane session after the documented re-home. A close could
then kill the hidden primary PTY and leave the pane session the panel was
painting without an owning leaf, keeping a foreground job alive behind an
unreachable close-confirm prompt. Teardown now follows the WS-INV-8 paint
precedence (`paints_primary_grid`), so a re-homed leaf's pane session is
torn down and the hidden primary shell is left intact.
- **Profile init polish (#2349):** `--migrate` refuses wizard value flags
(`--theme`, `--font-size`, ...) instead of silently discarding them and
bounds the legacy file with `symlink_metadata` before reading it.
Expand Down Expand Up @@ -134,14 +198,36 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
`apply_theme_request`) presents a frame byte-identical to a fresh render with
no cell left on the old theme.

### Changed

- **`window.blur_radius` rejects non-zero values (OQ-038):** the key is now
recognized by the Lua loader so a non-zero value fails closed with a typed
`window.blur_radius` diagnostic ("background blur is not supported
(OQ-038): only 0 is accepted") instead of an unknown-key error or a silent
no-op. `0` remains accepted; the platform blur seam stays reserved for a
future bounded contract.
- **Plugin hints stop advertising a dead scaffold command (#2384):**
`bitty plugin enable` and `bitty plugin install` printed
`bitty plugin config scaffold <id>` for every plugin, but the command exits
without writing when the manifest declares no `[settings]` (for example the
bundled `bitty-terminal.shell-integration`). Settings-less plugins now read
`scaffold: unavailable (no [settings] declared)`, while plugins with
declared settings keep the actionable pointer.
- **Plugin next steps point at canonical Lua settings (#2377):** the
post-install guidance names `settings.lua` and the canonical scope keys
instead of the retired TOML example path.
- **Shaped renderer coverage and cursor fixes (#2339):** block elements are
covered in the shaped render path, a cursor over a ligature un-shapes only
the affected run after blank cells, and block atlas slots are keyed by mask
dimensions so distinct block glyphs cannot collide.
- **One-shot accessibility announcements (#2361):** `UiSnapshotHost` buffered
notices without a drain hook, so a host reused across ingests re-delivered
every notice it had ever accumulated. Notices now live in a bounded
one-shot queue (8 pending), and an ingest consumes them exactly once.
- **Routine plugin use no longer raises OS notifications (#2341):** normal
plugin lifecycle traffic stays in the terminal instead of posting desktop
notifications.
- **Accurate activation projections (#2328):** `bitty extension list`
reports per-version activation rows and last-recorded liveness, records
state in the XDG state directory for both tiers, protects the crash latch
from a denial downgrade, and sweeps stale temporary records.
- **Suspended policy-host generations stay suspended (#2338):** a later
activation or refresh can no longer revive a suspended generation; it stays
suspended until explicitly resumed.
- **Versioned AUR cached binary filename (#2353):** the AUR PKGBUILD cache
key includes the version, so an upgrade cannot reuse a stale binary.

## [0.0.24] - 2026-10-20

Expand Down
34 changes: 17 additions & 17 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ members = [
resolver = "3"

[workspace.package]
version = "0.0.24"
version = "0.0.25"
edition = "2024"
rust-version = "1.85"
publish = false
Expand Down Expand Up @@ -64,7 +64,7 @@ windows-sys = { version = "0.61", default-features = false }
# bitty#2249: the execution extension is compiled against the workspace's
# current Core mechanism crates instead of its own older `bitty` git pin.
# Without this patch Cargo builds two `bitty-pty`/`bitty-plugin-host` trees
# (0.0.21 from the extension pin and 0.0.24 path crates), which duplicates
# (0.0.21 from the extension pin and 0.0.25 path crates), which duplicates
# Core code in the shipped graph and makes the compat-lab `live_compat` link
# exceed the Linux runner's linker budget. The patch does not change the
# extension's public contract or its exact `bitty-execution` pin; it aligns
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

Bitty is a Rust terminal workspace: a GPU-rendered terminal emulator and
multi-pane window manager for shell sessions. It is pre-1.0 and pre-alpha; the
current release line is `v0.0.24`, there is no stable public API, and behavior,
current release line is `v0.0.25`, there is no stable public API, and behavior,
configuration keys, and package names may change between releases.

The product site is [bitty.run](https://bitty.run). Release artifacts and
Expand Down
4 changes: 2 additions & 2 deletions crates/bitty-config/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,5 @@ publish = true
workspace = true

[dependencies]
bitty-lua = { version = "0.0.24", path = "../bitty-lua" }
bitty-ui = { version = "0.0.24", path = "../bitty-ui" }
bitty-lua = { version = "0.0.25", path = "../bitty-lua" }
bitty-ui = { version = "0.0.25", path = "../bitty-ui" }
6 changes: 3 additions & 3 deletions crates/bitty-plugin-host/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ publish = true
workspace = true

[dependencies]
bitty-term-state = { version = "0.0.24", path = "../bitty-term-state" }
bitty-config = { version = "0.0.24", path = "../bitty-config" }
bitty-package = { version = "0.0.24", path = "../bitty-package" }
bitty-term-state = { version = "0.0.25", path = "../bitty-term-state" }
bitty-config = { version = "0.0.25", path = "../bitty-config" }
bitty-package = { version = "0.0.25", path = "../bitty-package" }

[dev-dependencies]
# V-C install tests mint real Ed25519 signatures (bitty#767).
Expand Down
2 changes: 1 addition & 1 deletion crates/bitty-pty/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ nix = { workspace = true, features = ["event", "process", "signal"] }
# first-party `bitty-winjob` adapter holds the reviewed Win32 FFI, so this
# crate stays `forbid(unsafe_code)` on Windows too.
[target.'cfg(windows)'.dependencies]
bitty-winjob = { version = "0.0.24", path = "../bitty-winjob" }
bitty-winjob = { version = "0.0.25", path = "../bitty-winjob" }

[dev-dependencies]
bitty-test-support = { path = "../bitty-test-support" }
8 changes: 4 additions & 4 deletions crates/bitty-render/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,14 @@ sw-fallback = []
[dependencies]
# ADR-0003 dependency rule 3: bitty-render consumes only the public
# Snapshot/Damage render surface of bitty-term-state, never grid internals.
bitty-term-state = { version = "0.0.24", path = "../bitty-term-state" }
bitty-term-state = { version = "0.0.25", path = "../bitty-term-state" }
# ADR-0003/ADR-0004 platform seam: GpuContext consumes the owned SurfaceTarget
# produced by bitty-platform without leaking winit types.
bitty-platform = { version = "0.0.24", path = "../bitty-platform" }
bitty-platform = { version = "0.0.25", path = "../bitty-platform" }
# Theme preset registry: render consumes bitty-config's single source of
# truth for clear color, default fg/bg, cursor, selection, and ANSI 0-15
# (CTX-0147). bitty-config stays dependency-free (pure std), so no cycle.
bitty-config = { version = "0.0.24", path = "../bitty-config" }
bitty-config = { version = "0.0.25", path = "../bitty-config" }
# ADR-0004 rendering rows: ADOPT wgpu (~26.x line); WRAP crossfont
# (production default, CTX-0957 additive landing per DEC-0095); WRAP
# harfrust/swash/fontdb as the explicit opt-in stack (shape with harfrust
Expand Down Expand Up @@ -60,4 +60,4 @@ fontdb = { version = "=0.24.0", default-features = false, features = ["std", "fs
[dev-dependencies]
# Tests drive the pipeline through real State action scripts; GraphemeCell
# lives in bitty-vt (dev-only edge; the ADR-0003 DAG stays acyclic).
bitty-vt = { version = "0.0.24", path = "../bitty-vt" }
bitty-vt = { version = "0.0.25", path = "../bitty-vt" }
8 changes: 4 additions & 4 deletions crates/bitty-rich/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,14 @@ publish = true
workspace = true

[dependencies]
bitty-term-state = { version = "0.0.24", path = "../bitty-term-state" }
bitty-vt = { version = "0.0.24", path = "../bitty-vt" }
bitty-platform = { version = "0.0.24", path = "../bitty-platform" }
bitty-term-state = { version = "0.0.25", path = "../bitty-term-state" }
bitty-vt = { version = "0.0.25", path = "../bitty-vt" }
bitty-platform = { version = "0.0.25", path = "../bitty-platform" }
# W-103 G-3: the blocking hosted-editor spawn records and kills the whole
# owned process tree through the execution boundary's reviewed tracker
# (`bitty_pty::OwnedTree`); workspace-internal path edge, no new
# supply-chain surface.
bitty-pty = { version = "0.0.24", path = "../bitty-pty" }
bitty-pty = { version = "0.0.25", path = "../bitty-pty" }
# CTX-1412 (#2117): the `bitty-ipc` edge existed only for the unwired
# fragment-to-`RichBlock` projection; it is retired, so this Core crate keeps
# no production edge to the extracted IPC repository.
Expand Down
Loading
Loading