Adds two test files closing the last two pure-Dart sub-areas in `lib/src/terminal/src/`: `test/terminal/utils/utils_test.dart` — 51 tests covering: - Ascii.isNonPrintable (control chars + DEL). - hashValues (every optional arg slot, 2..20 inclusive) + hashList (including the documented zero-on-empty short-circuit). - ByteConsumer (single-block + cross-block consume, peek's consume-rollback path, rollback within block + across consumed blocks, rollbackTo, unrefConsumedBlocks, reset). - IndexAwareCircularBuffer (push/trim, pushAll, pop, [] / []=, clear, forEach, remove with count clamp / no-op, insert in the middle / at end / at full ring, insertAll, trimStart, replaceWith with truncate-from-head, swap, maxLength setter incl. error + no-op cases, debugDump, IndexedItem mixin attach/detach/index). - UnicodeV11.wcwidth (control chars, printable ASCII, DEL+C1, combining marks BMP+high-plane, wide chars BMP+high-plane, unmapped high-plane default, version field). - The push wrap branch where _startIndex resets to 0 after a full revolution (last circular_buffer line). `test/terminal/mouse/mouse_test.dart` — 21 tests covering: - TerminalMouseButton ids + isWheel for the 7 enum values. - MouseReporter for all four MouseReportMode shapes (normal with >223 null-byte clamp, utf with the 2015-limit clamp, sgr's M/m pair, urxvt's button+32 / 3-on-up encoding). - TerminalMouseEvent constructor. - CascadeMouseHandler first-non-null semantics. - ClickMouseHandler — only fires on clickOnly + down + button id < 3; null otherwise. UpDownMouseHandler — fires on every upDownScroll* mode; drops wheel-up; passes wheel-down. Default defaultMouseHandler routes through both. Coverage delta: - utils/ascii.dart: 0/2 → 2/2. - utils/byte_consumer.dart: 28/42 → 42/42. - utils/circular_buffer.dart: 71/130 → 130/130. - utils/hash_values.dart: 16/36 → 36/36. - utils/unicode_v11.dart: 16/27 → 27/27. - core/mouse/handler.dart: 3/34 → 34/34. - core/mouse/reporter.dart: 0/17 → 17/17. - (utils/char_code.dart, utils/lookup_table.dart already at 100% from earlier reflow + parser work; mouse/button.dart, mouse/button_state.dart, mouse/mode.dart are pure enums with no executable lines.) - Total project: 54.62% → 56.40%; coverage_floor bumped 54 → 56. Two pre-existing `// ignore_for_file: constant_identifier_names` suppressions that lacked documented reasons get inline justifications: - `lib/src/terminal/src/utils/ascii.dart` — RFC 20 / ISO 646 control-character names; lowerCamelCase would diverge from every spec/man-page reference. - `lib/src/terminal/src/utils/unicode_v11.dart` — Unicode 11 wcwidth tables vendored as-is; future re-vendoring stays a verbatim paste. Both fall under the same "FFI / spec-shaped names" pattern as the libc.dart suppression (D-66 era). Co-Authored-By: Claude <noreply@anthropic.com>
clide
An IDE for Claude Code CLI. Native rendering, terminal-first interaction, pql-powered queries, canvas and graph surfaces. Linux and macOS.
Architecture
Single Flutter package at the repo root. The app hosts everything in-process: IPC server, subsystem handlers (pane, files, editor, git, pql), and the extension framework. tmux owns Claude session persistence.
lib/— all Dart code. Kernel services (theme, i18n, settings, panels, commands, focus), UI widgets, built-in extensions, and the extension contract.ptyc/— small C helper. Spawns a PTY + child and hands the master fd back overSCM_RIGHTS. Every pane (shell, tmux, claude, LSP, debug adapter) goes through it.- pql — external supporter tool. Clide wraps it for every query surface; never re-implements it.
Claude drives the UI through a clide CLI surface (Bash, not MCP). Every CLI subcommand has a UI affordance and every UI action has a CLI equivalent.
Built-in extensions
canvas, claude, claude_control, decisions, diff, editor, extensions_ui, files, git, graph, grammars_core, ipc_status, keybindings_ui, markdown, pql, problems, settings_ui, terminal, theme_picker, tickets, todos, welcome.
Building
Requires Flutter (stable channel) on the host. One-time setup:
make hooks && flutter pub get
Then:
make run # launch the desktop app
make test # fast suite: analyze + format + unit + widget + golden
make test-core # core subsystem tests (IPC, PTY, git, pane registry)
make test-integration # real app boot integration tests
make build-linux # flutter build linux
make build-macos # flutter build macos
make ptyc-build # build the ptyc PTY-spawn helper
make push-check # pre-push gate: decisions + core + fast tests
Status
Pre-v2.0 (2.0.0-dev). Interaction model and panel system landed. The Python Textual v1.2.0 predecessor is archived under legacy/.
Design doc: docs/initial-plan.md. Architectural decisions: decisions/.
License
MIT. See LICENSE.