2a7875e1a9e7e1d73fbddb33bbd1a1d110470ee4
39
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
7ba0500f75 |
test sweep: cover kernel toolchain + medium services (T-91)
test / unit + widget + golden + a11y (push) Failing after 30s
test / bundle smoke (xvfb 5s) (push) Has been skipped
test / integration_test (xvfb) (push) Has been skipped
test / daemon subprocess + web WASM smoke (push) Has been skipped
test / dart doc (lib API) (push) Failing after 1m1s
Two test files chasing the bigger kernel residuals: - test/kernel/src/toolchain_test.dart (10 tests): Toolchain defaults + missing list, applyResolved with full / partial paths, waitForResolution sync + async, Toolchain.resolvePaths against the current workspace + dugite detection + PATH fallback, resolveToolchainPaths top-level matches the static. - test/kernel/src/services_bigger_test.dart (15 tests): DialogRouter show/dismiss/queue/notify, FileServices.pick* UnimplementedError trio + notifyDropped event, OsBridge openURL / reveal / fire, WindowControls setStyle idempotency + MissingPlugin-safe platform-channel methods + isMaximized success path, SchedulerTier intervals + SchedulerTick payload + start/dispose. Coverage: kernel/src/toolchain.dart 37/95 -> 67/95 (71%); dialog.dart 20/47 -> 27/47 (remaining is the DialogHost widget, needs a real overlay tree); files.dart 1/16 -> 14/16 (88%); os.dart 1/26 -> 19/26 (73%); window_controls.dart 2/25 -> 25/25 (100%); scheduler.dart 14/41 -> 18/41 (remaining is the isolate ticker entry point, only fires after a real project-open event). Total coverage 82.43% -> 83.57%; floor bumped to 83. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
8efcf186e6 |
test sweep: cover kernel ProjectManager + RecentProject (T-91)
test / unit + widget + golden + a11y (push) Failing after 31s
test / integration_test (xvfb) (push) Has been skipped
test / bundle smoke (xvfb 5s) (push) Has been skipped
test / daemon subprocess + web WASM smoke (push) Has been skipped
test / dart doc (lib API) (push) Failing after 1m3s
18 tests in test/kernel/src/project_test.dart driving ProjectManager with an injected onValidateProject hook so the manager doesn't shell out to git in tests. Covers: - RecentProject: relativePath HOME collapsing, timeAgo bucketing (minutes / hours / yesterday / days / weeks / months), toJson / fromJson round-trip, fromJson tolerance for missing fields. - ProjectManager.open: non-git path (returns false), valid path (sets current, emits ProjectOpened, registers in recents), re-open deduplication, recents capped at 10. - ProjectManager.close: resets current, emits ProjectClosed, no-op when already closed. - ProjectManager.loadRecents: happy path, malformed-value tolerance, no-setting clears to empty. - ProjectManager.openLast: no-stored, stored-but-missing, stored-and-exists. - ProjectManager.resolveProject without injected validator falls back to Process.run. Coverage: kernel/src/project.dart 2/72 -> 66/72 (92%). Remaining 6 lines are the _currentBranch helper + ProjectOpened-event-time branch shake (need a real git in the sandbox to materialise the branch). Total coverage 81.64% -> 82.42%; floor bumped to 82. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
2d123681be |
test sweep: cover kernel Tier-0 service stubs (T-91)
test / unit + widget + golden + a11y (push) Failing after 30s
test / integration_test (xvfb) (push) Has been skipped
test / bundle smoke (xvfb 5s) (push) Has been skipped
test / daemon subprocess + web WASM smoke (push) Has been skipped
test / dart doc (lib API) (push) Failing after 1m1s
19 tests in test/kernel/src/services_stubs_test.dart covering six small Tier-0 service classes: ClideClipboard (typed write + readAs, bounded LIFO history, typed history miss, writePlain/readPlain via mocked platform channel, write-with-toPlain OS sync, clear), FocusTracker (setActive flip + same-value no-op + clear), NetworkStatus (default + setState idempotency), SecretsVault (per-extension isolation, read/write/delete/deleteAll), TrayRegistry (add/remove + priority sort + unknown-id no-op), Notifications (info/warn/error/ success levels, dismiss + unknown-id no-op). Coverage: kernel/src/clipboard.dart 1/23 -> 23/23; focus.dart 1/12 -> 12/12; net.dart 0/6 -> 6/6; secrets.dart 0/8 -> 8/8; tray.dart 0/7 -> 7/7; notify.dart 4/23 -> 23/23. All six files now at 100%. Total coverage 80.81% -> 81.64%; floor bumped to 81. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
3339d3fcb5 |
test sweep: cover default_layout commands (T-91)
test / unit + widget + golden + a11y (push) Failing after 31s
test / integration_test (xvfb) (push) Has been skipped
test / bundle smoke (xvfb 5s) (push) Has been skipped
test / daemon subprocess + web WASM smoke (push) Has been skipped
test / dart doc (lib API) (push) Failing after 1m1s
Eight new tests in test/builtin/default_layout/widget_test.dart covering the DefaultLayoutExtension command handlers the existing four-test suite didn't reach: - All commands return the _notActivated() error pre-activate (sweeps every command's defensive null-context branch in one loop). - palette.toggle flips the palette's open state. - sidebar.collapse + context.collapse toggle their slots. - panel.focus.left / .middle / .right — including the auto-expand branches when a focused side is collapsed. - panel.focusMode toggles focus mode on the active slot. - panel.focusMode.exit unwinds in order: focus mode → editor → palette, with the empty-data no-op fallback. - editor.open + editor.close including the close-already-closed no-op. - sidebar.section.N: auto-expand sidebar + no-op when no tabs are contributed. Coverage: builtin/default_layout/src/extension.dart 60/167 -> 139/167 (83%). Remaining 28 lines are the _restoreLayout / _persistLayout persistence paths and the section-activation happy path, which need a populated tab list + a projectDir on settings to exercise — out of scope for this batch. Total coverage 79.80% -> 80.81%; floor bumped to 80. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
b1e9abd6aa |
test sweep: cover daemon editor / files / pane / pql commands (T-91)
test / unit + widget + golden + a11y (push) Failing after 31s
test / integration_test (xvfb) (push) Has been skipped
test / bundle smoke (xvfb 5s) (push) Has been skipped
test / daemon subprocess + web WASM smoke (push) Has been skipped
test / dart doc (lib API) (push) Failing after 1m1s
Extends the four existing daemon command suites with the verbs + error paths the originals didn't reach: - editor_commands_test (12 new): unreadable-path FileSystemException catch, editor.active with no buffer, editor.activate requires + validates id, editor.read no-active / unknown-id, editor.set-selection no-active / clamped, editor.set-content with + without selection, editor.save no-active, editor.close requires + validates id. - files_commands_test (8 new): files.read happy + missing-path + empty-path + outside-root + missing-file, files.ls outside-root, files.watch idempotent, FilesService.atCwd resolver. - pane_commands_test (10 new): argv-non-string rejection, unknown kind rejection, env passthrough, close / write / focus / resize missing-id and unknown-id validations, write requires bytes_b64 or text, malformed base64 rejection. - pql_commands_test (14 new): pql.files glob + limit, pql.backlinks happy, pql.outlinks missing, pql.tags, pql.query + pql.search happy paths + missing-arg user_error, pql.decisions.read missing + happy, pql.decisions.show with --with-refs / --with-tickets, pql.decisions.list domain filter, pql.tickets.list multi-filter, pql.tickets.show missing + happy, pql.tickets.status missing + partial-args, pql.tickets.board with team. Coverage: src/daemon/editor_commands.dart 64/100 -> 88/100; files_commands.dart 33/70 -> 64/70 (91%); pane_commands.dart 66/92 -> 78/92 (85%); pql_commands.dart 62/149 -> 105/149 (70% — remaining 44 lines are the per-command PqlException catch branches that only fire when the pql subprocess itself fails mid-call). Total coverage 77.92% -> 79.26%; floor bumped to 79. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
035491f7db |
test sweep: finish src/git/ (T-91)
test / unit + widget + golden + a11y (push) Failing after 30s
test / integration_test (xvfb) (push) Has been skipped
test / bundle smoke (xvfb 5s) (push) Has been skipped
test / daemon subprocess + web WASM smoke (push) Has been skipped
test / dart doc (lib API) (push) Failing after 1m1s
Closes out the three remaining files in src/git/ following the client.dart batch: operations.dart (25 new tests): - GitException.toString - GitLogEntry.toJson (body present + absent) - gitStage / gitUnstage / gitStashPop / gitPush / gitPull error paths (no remote, empty stash, bogus path) - gitUnstage with empty paths (unstage everything) - gitStageHunk + gitUnstageHunk via _applyPatch - _applyPatch surfaces stderr in GitException on a bad patch - gitBranches happy + non-repo - gitCheckout happy + unknown-branch error - gitPull + gitPush round-trip against a local bare remote - gitLog / gitCurrentBranch / gitBranches non-repo fallbacks - gitDiscard with empty list short-circuit - gitBin resolver diff.dart (7 new tests): - gitDiff with paths argument and non-repo fallback - GitHunk.toPatch round-tripping header + every DiffLineKind - GitDiff.toJson with / without oldPath - parseDiffOutput edge cases: pre-diff garbage skipped, "\ No newline" marker captured as a header line, malformed @@ header skipped via _parseHunk null return status.dart (4 new tests): - branch.upstream + branch.ab populated from a local bare remote - non-git directory returns an empty branchless status - rename in porcelain output captures the original path - parsePorcelainV1 short-part / empty-part / empty-input edge cases Coverage: src/git/diff.dart 106/124 -> 124/124 (100%); src/git/operations.dart 88/155 -> 148/155 (95% — remaining 7 lines are gitPull/gitPush variants that need credentials, and the gitBranches non-zero stderr path); src/git/status.dart 86/98 -> 95/98 (97% — remaining 3 are the ProcessException-during-call catch branches, only reachable if git crashes mid-call). Total coverage 76.04% -> 77.05%; floor bumped to 77. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
7c8114ecbe |
test sweep: cover src/git/client.dart (T-91)
test / unit + widget + golden + a11y (push) Failing after 29s
test / integration_test (xvfb) (push) Has been skipped
test / bundle smoke (xvfb 5s) (push) Has been skipped
test / daemon subprocess + web WASM smoke (push) Has been skipped
test / dart doc (lib API) (push) Failing after 1m0s
23 integration tests in test/git/client_test.dart driving a real git binary against per-test sandbox repos. Covers every GitClient public method that wasn't already exercised through the daemon command suite: - Queries: status (clean + with upstream tracking ahead/behind), diff with explicit paths, log, currentBranch, branches (with the current-marker check), repoRoot (in-repo + non-repo paths). - Mutations: unstage with paths, commit-returns-hash, discard, discard with empty list, stash + stashPop with includeUntracked, checkout, stageHunk + unstageHunk via _applyPatch. - Error surface: mutations throw GitException on non-zero exit, _applyPatch surfaces stderr from a bad patch, bad git binary path → ProcessException → GitException, queries return empty fallbacks on a non-git workDir. - parseLog standalone parser: empty input, short-record skip, full record with body, 5-field record without body. Coverage: src/git/client.dart 76/141 -> 124/141 (88%). The remaining 17 lines are the pull / push paths (would need a real remote with matching credentials — out of scope) and the status GitException catch branches that require an in-flight git process failure mid-call. Total coverage 75.42% -> 76.04%; floor bumped to 76. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
331201e287 |
test sweep: cover src/editor/ tail paths (T-91)
test / unit + widget + golden + a11y (push) Failing after 33s
test / integration_test (xvfb) (push) Has been skipped
test / bundle smoke (xvfb 5s) (push) Has been skipped
test / daemon subprocess + web WASM smoke (push) Has been skipped
test / dart doc (lib API) (push) Failing after 1m2s
Adds 6 tests in test/editor/registry_test.dart closing out the EditorRegistry methods the existing suite didn't reach: - activate(id): unknown id is a no-op (no event emitted); known id flips the active buffer and emits editor.active-changed. - setContent(id, content, selection?): explicit selection clamped to new content length, missing selection falls back to clamping the existing one, missing id is a silent no-op. Each emits the editor.edited replace event. - contentFromArgs(args): the content_b64 fallback when text is absent, plus the empty-args default. - Selection.hashCode + .toString. Coverage: src/editor/buffer.dart 20/24 -> 24/24; src/editor/registry .dart 87/105 -> 105/105. Both at 100%. Total coverage 74.79% -> 75.11%; floor bumped to 75. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
c3033fe304 |
test sweep: cover i18n catalog loaders + theme_picker _pick (T-91)
test / unit + widget + golden + a11y (push) Failing after 32s
test / integration_test (xvfb) (push) Has been skipped
test / bundle smoke (xvfb 5s) (push) Has been skipped
test / daemon subprocess + web WASM smoke (push) Has been skipped
test / dart doc (lib API) (push) Failing after 1m1s
Two test files / batches:
- test/kernel/src/i18n/catalog_loader_test.dart (11 tests): all three
CatalogLoader implementations end-to-end. AssetCatalogLoader against
an in-memory AssetBundle covers happy path, FlutterError catch
(missing asset), FormatException catch (malformed JSON), blank
asset, non-object JSON. FileCatalogLoader against a tempdir covers
happy path, missing file, malformed, blank. InMemoryCatalogLoader
covers lookup + namespace-miss.
- Extends test/builtin/theme_picker/widget_test.dart with two tests
for the _pick command callback: defensive not-activated branch
(drive the contribution's run() before activate runs, _ctx is still
null) and the dialog-resolution happy path (register + activate,
invoke theme.pick, manually drive dialog.dismiss('forest'), assert
IpcResponse data['selected']).
Coverage: kernel/src/i18n/catalog_loader.dart 14/26 -> 26/26;
builtin/theme_picker/src/extension.dart 9/18 -> 15/18 (remaining 3
lines are the dialog builder body — needs a DialogHost in the test
harness, out of scope).
Total coverage 74.08% -> 74.55%; floor bumped to 74.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
||
|
|
889058db1b |
test sweep: cover kernel/src/{events,ipc} (T-91)
test / unit + widget + golden + a11y (push) Failing after 28s
test / integration_test (xvfb) (push) Has been skipped
test / bundle smoke (xvfb 5s) (push) Has been skipped
test / daemon subprocess + web WASM smoke (push) Has been skipped
test / dart doc (lib API) (push) Failing after 1m2s
Three new test files + a small DaemonClient dispose-safety fix: - test/kernel/src/events/types_test.dart (7 tests): every ClideEvent subclass's subsystem / kind / payload contract + the ClideEventEnvelope v1 JSON shape. - test/kernel/src/events/message_bus_test.dart (6 tests): Message shape, MessageBus publish/subscribe/dispose, filter-by-publisher, filter-by-channel, intersection. - test/kernel/src/ipc/client_test.dart (9 tests): real Unix-socket roundtrip via a _TestDaemon helper — connect + correlate request/ response, event forwarding to the DaemonBus, malformed-line skip, daemon-disconnect failing pending requests, stop cleanup, dispose, connect-failure-then-reconnect, daemon-sent-Request warn-and-skip, DaemonConnectionChanged emission. Fix in lib/kernel/src/ipc/client.dart: _setConnected now skips notifyListeners / event emit when _disposed. The socket stream's onDone can fire after dispose runs, which previously hit ChangeNotifier's "used after disposed" assertion. State flip stays unconditional so stop()'s explicit transition still works. Coverage: ipc/client.dart 14% -> 92% (79/86; remaining 7 lines are the socket onError callback + 1 const ctor phantom); events/types .dart 95% (37/39 — 2 const-ctor phantoms); events/message_bus.dart 100%; events/bus.dart stays 100%. Total coverage 71.93% -> 73.34%; floor bumped to 73. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
ae8e43c298 |
lower coverage floor to 71 after dead-widget deletion
test / unit + widget + golden + a11y (push) Failing after 30s
test / integration_test (xvfb) (push) Has been skipped
test / bundle smoke (xvfb 5s) (push) Has been skipped
test / daemon subprocess + web WASM smoke (push) Has been skipped
test / dart doc (lib API) (push) Failing after 1m0s
The previous commit deleted three dead widgets + their tests under lib/src/terminal/src/ui/ — 585 lines net. The deleted test suite was contributing more lcov hits than the deleted code was contributing DA lines, so total coverage drops from 72.22% to 71.93%. Intentional: deleting tested-but-unused code is the right move; the absolute coverage number isn't. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
d2e65d8821 |
test sweep: cover ui/render.dart (T-91)
test / unit + widget + golden + a11y (push) Failing after 34s
test / integration_test (xvfb) (push) Has been skipped
test / bundle smoke (xvfb 5s) (push) Has been skipped
test / daemon subprocess + web WASM smoke (push) Has been skipped
test / dart doc (lib API) (push) Failing after 1m2s
10 widget tests driving RenderTerminal through a hosted TerminalView: the reactive setters via updateRenderObject (theme, textStyle, textScaler, padding, autoResize, cursorType, alwaysShowCursor) and direct setter calls on the render box (padding, onEditableRect, composingText) to cover the value-changed branches; getOffset for non-origin cells; systemFontsDidChange; the terminal listener via write(); the viewport-offset listener via scrollback overflow; and the paint paths for composingText and controller-driven highlights. Coverage: render.dart 179/249 -> 245/249 (98%). The 4 still-uncovered lines are the _onScroll body — reachable only when the inner ViewportOffset notifies, which doesn't happen with the current ViewportOffset.zero() wiring (scroll lives in PointerScrollEvent → PgUp/PgDown). Total 71.23% -> 72.02%; floor bumped to 72. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
8ae5e7a9e8 |
test sweep: cover ui/custom_text_edit.dart (T-91)
test / unit + widget + golden + a11y (push) Failing after 32s
test / integration_test (xvfb) (push) Has been skipped
test / bundle smoke (xvfb 5s) (push) Has been skipped
test / daemon subprocess + web WASM smoke (push) Has been skipped
test / dart doc (lib API) (push) Failing after 1m2s
Adds 17 widget tests covering CustomTextEdit's focus / input-connection lifecycle (autofocus, focus loss, readOnly toggling both directions, focusNode swap), the keyboard helpers (requestKeyboard / closeKeyboard both with and without an active connection, setEditingState, setEditableRect early-return + active path), and the TextInputClient surface (updateEditingValue insert / delete / composing branches, performAction, plus the no-op stubs — updateFloatingCursor, showAutocorrectionPromptRect, connectionClosed, performPrivateCommand, insertTextPlaceholder, removeTextPlaceholder, showToolbar — and the two getters). Coverage: custom_text_edit.dart 66/96 -> 96/96. Total 70.86% -> 71.20%; floor bumped to 71. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
3ea49421bb |
test sweep: cover shortcut/ + base/event.dart (T-91)
test / unit + widget + golden + a11y (push) Failing after 30s
test / integration_test (xvfb) (push) Has been skipped
test / bundle smoke (xvfb 5s) (push) Has been skipped
test / daemon subprocess + web WASM smoke (push) Has been skipped
test / dart doc (lib API) (push) Failing after 1m0s
Adds 9 tests in test/terminal/shortcut_event_test.dart covering Event / EventEmitter / EventSubscription, the platform branch in defaultTerminalShortcuts, and the three TerminalActions intent handlers (copy / paste / select-all, plus the empty-selection no-op path). Coverage: base/event.dart 2/13 -> 13/13; shortcut/actions.dart 8/24 -> 24/24; shortcut/shortcuts.dart 8/18 -> 18/18. Total 69.87% -> 70.30%; floor bumped to 70. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
e966836886 |
test sweep: cover ui/ widget-level helpers (T-91)
Adds test/terminal/ui/ui_widget_test.dart — 14 widget tests covering the lib/src/terminal/src/ui/ helpers that need a Flutter widget tree (CustomKeyboardListener, KeyboardVisibilty, InfiniteScrollView, TerminalScrollGestureHandler). Files reaching ~100% (the 4 missing lines in infinite_scroll_view sit in the render-object's `position` setter, only triggered when Scrollable feeds a different ViewportOffset between rebuilds — not reachable through normal widget plumbing without internal access): - scroll_handler.dart: 0 / unmeasured → 39/39 (100%) — main-buffer passthrough vs. alt-buffer interception, mouse-mode forwarding vs. simulateScroll fallback, simulateScroll=false drop, alt-flip + didUpdateWidget rebinding, onPointerDown tracking the cursor for the next scroll event. - infinite_scroll_view.dart: 0 / unmeasured → 36/40 (90%) — onScroll fires on viewport position change, callback identity update via updateRenderObject. - keyboard_listener.dart: 7/12 → 12/12 (100%) — character-key fallthrough into onInsert when onKeyEvent returns ignored, short-circuit to onKeyEvent's "handled" return, no-op on a key with no character. - keyboard_visibility.dart: 18/19 → 19/19 (100%) — show + hide callbacks paired against view-insets transitions; no fire on same-inset metrics events. Coverage delta: - Total project: 68.80% → 69.12%; coverage_floor bumped 68 → 69. Tests use a `_host()` helper that wraps the widget under test in Directionality + MediaQuery + Center + a sized SizedBox. The TerminalScrollGestureHandler tests use ColoredBox as the child because Listener.onPointerSignal needs a hit-testable render object below it, and SizedBox.expand alone doesn't paint anything. Co-Authored-By: Claude <noreply@anthropic.com> |
||
|
|
ecf8ee56af |
test sweep: cover ui/ pure-Dart files (T-91)
test / unit + widget + golden + a11y (push) Failing after 48s
test / integration_test (xvfb) (push) Has been skipped
test / bundle smoke (xvfb 5s) (push) Has been skipped
test / daemon subprocess + web WASM smoke (push) Has been skipped
test / dart doc (lib API) (push) Failing after 1m0s
Adds test/terminal/ui/ui_pure_test.dart — 39 unit tests covering the lib/src/terminal/src/ui/ files that don't need a Flutter widget harness. Files at 100%: - palette_builder.dart: 0/52 → 52/52 (named-colour mapping for indices 0..15, RGB cube walk for 16..231 with the 95-then-+40 step pattern, grayscale ramp 232..255, out-of-range clamp). - paragraph_cache.dart: 2/22 → 22/22 (LRU promotion on read, eviction at maxSize, miss returns null, clear empties). - terminal_text_style.dart: 7/19 → 19/19 (default ctor, fromTextStyle fontFamily fallback chain + size/height pass- through, toTextStyle attribute threading, copyWith with override + no-args clone). - input_map.dart: 8/20 → 20/20 (keyToTerminalKey hits + null on unmapped LogicalKeyboardKey id, charToTerminalKey case-fold + multi-char/unknown null). - terminal_size.dart: 4/8 → 8/8 (operator==/hashCode/toString, identity + type-mismatch branches). - pointer_input.dart: 1/3 → 3/3 (default ctor, .none(), .all()). - terminal_theme.dart: 1/1 unchanged. - char_metrics.dart: 0/10 → 10/10 (positive width/height, monotonic text-scaler scaling). - ui/controller.dart: 18/52 → 52/52 (TerminalController default state, setSelection + mode override, attached/detached anchor selection-getter behaviour, prior-anchor disposal on second setSelection, setSelectionMode no-op short-circuit, clearSelection, setPointerInputs / setSuspendPointerInput gating, highlight register/dispose lifecycle, TerminalHighlight.range null on detached anchors). Enums (selection_mode, cursor_type) and themes constants are covered transitively — they have no executable lines that lcov instruments. Coverage delta: - Total project: 67.06% → 68.80%; coverage_floor bumped 66 → 68. Co-Authored-By: Claude <noreply@anthropic.com> |
||
|
|
6b7290dc42 |
fix dead-wired TerminalView.onTapUp callback (T-93)
test / unit + widget + golden + a11y (push) Failing after 28s
test / integration_test (xvfb) (push) Has been skipped
test / bundle smoke (xvfb 5s) (push) Has been skipped
test / daemon subprocess + web WASM smoke (push) Has been skipped
test / dart doc (lib API) (push) Failing after 59s
`TerminalView.onTapUp` was documented as "Callback for when the
user taps on the terminal" but was wired to a code path nothing
ever invoked:
- `TerminalView.build` passed it via `onTapUp:` to
`TerminalGestureHandler`,
- which forwarded via `onTapUp:` to `TerminalGestureDetector`,
- whose `onTapUp` field was declared and accepted but never called
by `_handleTapUp` (which only fires `onSingleTapUp`).
Net: every caller that registered an `onTapUp` callback on
`TerminalView` got silent failure. zero in-tree callers depended
on it (clide_pty_view.dart is the only TerminalView callsite and
doesn't pass any tap callback), but the public API said one thing
and did another.
Fix: wire `_onTapUp` (the cell-resolving state-method) through the
detector's working `onSingleTapUp` slot. The user-facing semantics
("fires on confirmed single tap with the resolved cell offset")
match the only sane interpretation of the docstring, and don't
overlap with the existing `onSecondaryTap*` (which were already
correctly wired through TapGestureRecognizer's secondary callbacks).
Also drops the dead surface that surfaced the bug:
- `TerminalGestureHandler.onTapUp` parameter + field — no caller
passes it after the fix; was only used to forward into the dead
detector field.
- `TerminalGestureDetector.onTapUp` parameter + field — never
invoked by `_handleTapUp`. Pure dead code.
Tests: extends `terminal_view_test.dart` with a primary-tap
regression case + paired tests for selection-clearing and
secondary-tap callback routing. The double-tap recognizer's
300 ms timer is flushed via `pump(const Duration(seconds: 1))`
(pumpAndSettle waits for animations, not arbitrary timers).
Coverage delta:
- terminal_view.dart: 151/188 → 180/188 (95.7%; remaining gaps
are IME `_onComposing`/`_onEditableRect`/`_onKeyboardShow`
body branches that need deeper IME mocking).
- gesture_handler.dart: 18/60 → 39/59.
- gesture_detector.dart: 30/50 → 42/50.
- Total project: 65.76% → 66.97%; coverage_floor 65 → 66.
Co-Authored-By: Claude <noreply@anthropic.com>
|
||
|
|
fb85dfa6f9 |
test sweep: cover TerminalView widget (T-91)
Adds test/terminal/terminal_view_test.dart — 14 widget tests covering the StatefulWidget that wires gesture / keyboard / scroll plumbing around a `Terminal`: - Construction smoke tests (default, externally-supplied controller / focusNode / scrollController, hardwareKeyboardOnly, readOnly + hardwareKeyboardOnly). - Pointer-signal handling: PointerScrollEvent → PgUp/PgDown keyInput; non-scroll PointerSignalEvent ignored. - didUpdateWidget swap of focusNode / controller / scrollController (auto-created previous instance gets disposed cleanly). - Hardware key event flowing through to Terminal.keyInput. - cursorRect / globalCursorRect after layout. - requestKeyboard / closeKeyboard as no-ops when no edit state is mounted; hasInputConnection false when no input connection is open. - Selection survival when the widget unmounts but an externally-owned controller stays alive. Coverage delta: - terminal_view.dart: 0/188 → 151/188 (80.3%). - Total project: 59.82% → 65.76%; coverage_floor bumped 59 → 65. The remaining ~20% in terminal_view.dart sits in gesture / IME / keyboard-event plumbing (`_onTapUp`, `_onTapDown`, secondary-tap callbacks, `_onInsert`, `_onComposing`, `_handleKeyEvent` shortcut path, `_onKeyboardShow`, `_onEditableRect`, `_scrollToBottom`). These are reachable only through full pointer / IME simulation that's better suited to `integration_test/` than widget tests — leaving them for a later integration-test pass rather than papering over with brittle gesture mocking. Co-Authored-By: Claude <noreply@anthropic.com> |
||
|
|
4642a2f25b |
test sweep: cover Terminal orchestrator (T-91)
Adds test/terminal/terminal_test.dart — 54 unit tests covering the
`Terminal` class as a pure-Dart orchestrator: construction +
TerminalState defaults, the Observable mixin, write/writeChar,
keyInput / charInput / textInput / paste (with bracketed-paste +
ctrl/alt encodings, including macOS reservation), mouseInput
gating, resize (clamping + onResize callback + alt-buffer
scrollback clear), buffer switching (use{Alt,Main}Buffer +
clearAltBuffer), every SBC handler (bell / backspace / lineFeed /
CR / SO / SI / unknown), tab-stop manipulation (tab jump +
saturation, clearTabStopUnderCursor, clearAllTabStops, setTapStop),
every ANSI escape handler (save/restore cursor, index, nextLine,
reverseIndex, designateCharset), CSI cursor + erase + line/char
insert/delete + scroll + repeatPreviousCharacter (incl. no-op when
no preceding char), device-attribute and status reports, every
mode setter mirroring into its getter, every SGR set/unset attr +
colour setter, OSC handlers (setTitle / setIconName / unknownOSC),
and all the documented no-op fallbacks (unknownSBC, unkownEscape,
unknownCSI, setUnknownMode, setUnknownDecMode, setColumnMode,
unsupportedStyle).
Also fixes a real production bug surfaced while writing tests:
`BufferLine.eraseRange(0, 0, ...)` panicked with a `RangeError`
because the right-side wide-char guard read `_data[-1]` via
`getWidth(end - 1)` when `end == 0`. The left guard already had a
`start > 0` check; the right guard was missing the symmetric
`end > 0`. Real trigger path: `Terminal.eraseDisplayAbove`
(`ESC[1J`) with the cursor at column 0 — common after `ESC[H\x1b[1J`
home-then-erase-above sequences that many TUIs emit on redraw.
Regression test added in line_test.dart.
Coverage delta:
- terminal.dart: 0/283 → 291/291 (file grew by 8 LF for the
fix's comment lines).
- base/observable.dart: 0/7 → 7/7 (covered transitively via
Terminal's listener tests).
- Total project: 56.40% → 59.82%; coverage_floor bumped 56 → 59.
Co-Authored-By: Claude <noreply@anthropic.com>
|
||
|
|
6008b4914c |
test sweep: cover utils/ + core/mouse/ (T-91)
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> |
||
|
|
3196c4957f |
test sweep: cover core/(root) — cell, cursor, charset, tabs, reflow (T-91)
Adds test/terminal/core/core_test.dart — 36 unit tests across the small standalone files that sit directly under `lib/src/terminal/src/core/*.dart`: - CellData (constructor + empty + getHash + toString), - CursorStyle (default ctor, every set/unset attr getter pair, all three colour-mode setters per channel, reset, the .empty singleton) + CursorPosition, - Charset (translate, designate/use, save/restore, asciiTranslator, decSpecGraphicsTranslator with in-table, out-of-table, and high- codepoint paths), - TabStops (default 8-column grid, find with empty-range / out-of- bounds / no-stop-in-range cases, setAt/clearAt/clearAll/reset), - reflow (empty input, single-line passthrough, grow, shrink-with- split, wrapped-run continuation, wide-char boundary on the new width, inner wide-char clamp during _addPart, anchor reparent on the main path, anchor reparent past trimmedLength). Two source-side cleanups folded in: - `CursorStyle.isItalis` was a defined-but-never-called getter with a typo. No external callers reference it; renamed to `isItalic` in the same change as the test that exercises it. - `_LineBuilder.isEmpty` in reflow.dart was dead — the only callers use `isNotEmpty` or check `_lines.isNotEmpty` separately. Removed. Coverage delta: - cell.dart: 3/7 → 7/7. - charset.dart: 12/25 → 25/25. - cursor.dart: 2/62 → 62/62. - tabs.dart: 0/23 → 23/23. - reflow.dart: 24/72 → 71/71 (file shrank by one line after the isEmpty getter removal). - Total project: 52.72% → 54.62%; coverage_floor bumped 52 → 54. Note for follow-up (not blocking): the post-loop "anchor.x >= to" branch in reflow's `_addPart` reparents anchors past trimmedLength onto whatever builder line is active at that moment. If no subsequent content is added (no wrapped continuations after the last shrink iteration), that builder line is never emitted by `finish()` and the anchor lands on a dangling reference. The path is exercised by the new test, but the contract it implements is arguably broken — anchors that should follow the source content end up off the visible buffer. Worth a separate ticket if real terminals trip it. Co-Authored-By: Claude <noreply@anthropic.com> |
||
|
|
f3e164b834 |
test sweep: cover core/input/ keytab + handlers (T-91)
Adds test/terminal/input/input_test.dart — 58 unit tests covering the keytab tokenizer, parser, unescape helper, KeytabRecord toString shapes, Keytab.find modifier-matching rules, and the four TerminalInputHandler implementations (CascadeInputHandler, KeytabInputHandler, CtrlInputHandler, AltInputHandler). Highlights: - keytabUnescape: every documented backslash escape + \xHH hex. - LineReader: peek/take/done, whitespace skip, readString (alphanumeric/underscore), readUntil (both exclusive and inclusive variants). - tokenize: keyboard-name and key-define lines, comment + blank stripping, shortcut vs string actions, error paths on malformed input. - KeytabParser: full mode-flag matrix, error paths on every defensive throw reachable through the public addTokens API (stray non-keyboard token, missing colon, modeStatus value other than '+'/'-', non-mode token after modeStatus, action token of wrong type, second token of wrong kind for both _parseName and _parseKeyDefine). - KeytabRecord.toString covers every supported flag (Alt, Control, Shift, AnyMod, Ansi, AppScreen, KeyPad, AppCuKeys, AppKeyPad, NewLine, Mac). - Keytab.find: -Shift / +AnyMod / -AnyMod gating, mode-flag filters (newLine, appKeyPad, appScreen, macos, appCursorKeys, keyPad), -Ansi (VT52) skip, fallthrough to fallback record, null when no key matches. - KeytabInputHandler: every modifier combination's `*` placeholder expansion (1..8 inclusive), default-keytab fallback, no-match null, no-* passthrough. - CtrlInputHandler: A..Z → 0x01..0x1A; null without ctrl, with shift / alt, or on non-letter keys. - AltInputHandler: A..Z → ESC + uppercase; null without alt, with shift / ctrl, on macOS, or on non-letter keys. - defaultInputHandler integration: keytab routing, fallthrough to CtrlInputHandler. Coverage delta: - core/input/handler.dart: 4/54 → 54/54. - keytab.dart: 0/29 → 29/29. - keytab_record.dart: 0/44 → 44/44. - keytab_token.dart: 0/82 → 80/82 (the two remaining lines are defensive throws inside `_parseKeyboardNameDefine` / `_parseKeyDefine` that are unreachable from tokenize() — the callers only enter those functions after the `_isKeyboardNameDefine` / `_isKeyDefine` guards in the same file, so the inner readString always matches). - keytab_parse.dart: 0/65 → 63/65 (the two remaining lines mirror the same shape — _parseName and _parseKeyDefine both check the first token's type, but addTokens only delegates to them after matching that type, so the throws are dead defensive code). - keytab_default.dart: 0/4 unchanged — that's the file's own `void main()` debug entrypoint that prints the parsed default keytab; not part of the runtime contract. - keytab_escape.dart: 0/14 → 14/14. - Total project: 49.31% → 52.53%; coverage_floor bumped 49 → 52. The 4 dead defensive throws are flagged but not removed in this commit — they're a code-style call (defensive paranoia vs. dead- code cleanup) that belongs in a separate review, not folded into a test sweep. Co-Authored-By: Claude <noreply@anthropic.com> |
||
|
|
9331055b44 |
test sweep: cover EscapeParser + EscapeEmitter (T-91)
Adds test/terminal/escape/parser_test.dart — 70 unit tests covering the parser's dispatch surface end-to-end: - single-byte controls (BEL, BS, HT, LF/VT/FF, CR, SO, SI), - ESC sequences (D, E, H, M, =, >, 7, 8, ( name, ) name, unknown), - CSI cursor moves (A/B/C/D/E/F/G/H/d/f) with default + 0-as-1 fallback semantics, - erase / scroll / line-insert/delete / chars (J, K, L, M, P, S, T, X, @, b, g, r), - device attributes (c / >c / =c) and DSR (5, 6), - window manipulation (CSI 8 t resize, CSI 18 t sendSize, ignored no-op codes, malformed CSI 8 t), - mode set/reset (h/l, ? prefix for DEC modes — covering ?1, ?3, ?5, ?6, ?7, ?9, ?12, ?25, ?47, ?66, ?1000, ?1002, ?1003, ?1004, ?1005, ?1006, ?1007, ?1015, ?1047, ?1048, ?1049, ?2004, + unknown fallback), - SGR styling (resets, set/unset for every attr, 16-colour foreground + background, 256-colour, 24-bit RGB, 39 / 49 resets, unknown → unsupportedStyle), - OSC 0/1/2 (BEL- and ST-terminated), unknown OSC, incomplete sequence held back across writes, - unknown CSI final byte → unknownCSI, - token bookkeeping (tokenBegin / tokenEnd advance with consumed bytes). Plus EscapeEmitter — every reply string format (primary / secondary / tertiary device attributes, operating status, cursor position, bracketed paste, size). Coverage delta: - parser.dart: 0 / 462 → 504 / 514 (98.1%; the remaining 10 lines sit inside the `// ignore: dead_code` SGR loop, which I'm surfacing for separate review rather than extending tests around). - emitter.dart: 1 / 11 → 11 / 11. - Total project: 43.20% → 49.38%; coverage_floor bumped 43 → 49. Two real source-code issues found while writing tests, fixed in the same commit: 1. Swapped docstrings on `_escHandleSetAppKeypadMode` / `_escHandleResetAppKeypadMode`. The function names + dispatch table + bodies all match the VT spec correctly (ESC = enables, ESC > disables); only the doc-comments were swapped. Now read the right way around. 2. `case 10061000:` in `_setDecMode` was unreachable (no DEC mode has that value). Almost certainly a typo where `case 1006:` meant to glue onto `case 1000:` but a newline went missing. Mode 1006 is already handled separately at its own clause as `MouseReportMode.sgr`. Removed. Co-Authored-By: Claude <noreply@anthropic.com> |
||
|
|
c233b7607d |
test sweep: cover Buffer (T-91)
Adds test/terminal/buffer/buffer_test.dart — 67 unit tests against the Buffer orchestrator on top of BufferLine. Drives a fake TerminalState through writes, cursor moves, scroll regions, erase commands, line insert/delete, resize (with and without reflow), word-boundary lookup, getText, and the toString debug dump. Coverage delta: - buffer.dart: 0 / 260 → 260 / 261 (one while-loop-body line Dart coverage doesn't instrument distinctly; the loop's effect is exercised end-to-end by the reflow-pad test). - Total project: 39.12% → 43.20%. - pubspec.yaml `coverage_floor:` bumped 39 → 43. Notes: - The fake TerminalState (`_State`) is a per-file impl rather than a shared fixture; it stays close to the test that exercises it and avoids forcing other terminal tests to depend on a one-shape- fits-all stub. - Tests that walk through `lineFeed` use `lineFeedMode: true` so the column resets between newlines — otherwise the saturated cursor X from a previous full-width write spills the next write onto an extra line via `writeChar`'s autoWrap branch. This closes the `core/buffer/` sub-area for T-91 — every leaf file in `lib/src/terminal/src/core/buffer/` is now at >= 96% line coverage; the only outliers are Dart-coverage-instrumentation quirks, not real gaps. Co-Authored-By: Claude <noreply@anthropic.com> |
||
|
|
c744c8ce4b |
test sweep: cover BufferLine + CellAnchor (T-91)
Adds test/terminal/buffer/line_test.dart — 51 unit tests covering BufferLine and CellAnchor, hitting every reachable line in lib/src/terminal/src/core/buffer/line.dart (192 / 192). Coverage delta: - line.dart: 0 / 194 → 192 / 192 (file shrank by two lines after the prior commit's iteration fix folded two for-loop heads into for-each-toList). - Total project: 36.39% → 39.12%. - pubspec.yaml `coverage_floor:` bumped 36 → 39 in lockstep. Highlights: - All packed-cell encodings (foreground/background/attrs/content channels, codepoint+width packing, CellData round-trips). - `eraseRange` wide-char neighbor extension on both ends. - `removeCells` / `insertCells` shift logic, anchor reposition, and the wide-tail-erase branch (insertCells case where the post-shift last cell carries a wide marker). - `resize` exercising the [64, 256) capacity-doubling branch and the >=256 +32 branch separately. - `getTrimmedLength` cols-clamp behaviour for null/over-capacity. - `getText` skip-trailing-wide-char branch. - `CellAnchor` lifecycle: detached construction, `reposition`, `reparent` (both detached→attached and between owners), `dispose`, attached y/offset via a real IndexAwareCircularBuffer. Also cleans up five `unrelated_type_equality_checks` analyze infos in test/terminal/buffer/range_test.dart by typing the RHS as Object when intentionally probing the type-mismatch branch of operator==. Co-Authored-By: Claude <noreply@anthropic.com> |
||
|
|
eb32396bd4 |
test sweep: cover BufferRange family (T-91)
Adds test/terminal/buffer/range_test.dart — 38 unit tests covering the small pure-Dart files in lib/src/terminal/src/core/buffer/: - cell_offset.dart 23 / 23 (was 0 / 23) - range.dart 13 / 13 (was 0 / 13) - segment.dart 13 / 13 (was 0 / 13) - range_line.dart 30 / 30 (was 0 / 30) - range_block.dart 48 / 48 (was 0 / 48) Total project line coverage 34.90% → 36.39%; coverage_floor in pubspec.yaml bumped 34 → 36 in lockstep. Tests exercise the abstract BufferRange operator==/hashCode/toString via a local _StubRange (BufferRangeLine and BufferRangeBlock both override those, so the base versions are otherwise unreachable — worth a stub rather than carving the lines out of coverage). The denormalized-input branches in Block contain/toSegments/extend get explicit cases too. Pure Dart, no Flutter dependency — uses package:test/test.dart and runs in <100ms. First batch under T-91; line.dart and buffer.dart land in subsequent commits with their own floor bumps. Co-Authored-By: Claude <noreply@anthropic.com> |
||
|
|
1151a0ce80 |
install ratcheting line-coverage gate at 34% floor (T-90)
First child of T-89. Codifies "don't make coverage worse" as a durable pre-push contract before any test-writing children land. - pubspec.yaml: new `coverage_floor: 34` key. Single source of truth for the floor; ratchets up only. - ci/coverage_gate.sh: parses coverage/lcov.info (LH/LF), reads the floor from pubspec.yaml, exits non-zero if integer-truncated measured % drops below it. Self-contained awk parser — no `lcov` CLI dependency. - ci/test.sh: flutter test now runs with --coverage, so the gate reads fresh data without an extra test invocation. Wall time delta is small and stays inside the < 90 s pre-push budget (D-29). - Makefile: new `coverage-gate` target wires the script in; `push-check` adds it as a dependency. The .githooks/pre-push hook (already wired) picks this up automatically. - .gitignore: ignore /coverage/ wholesale; the floor lives in pubspec.yaml, nothing under coverage/ is committed. Decision recorded as D-66 (decisions/testing.md). End target is 95%; reaching it is tracked as the rest of T-89's children. Co-Authored-By: Claude <noreply@anthropic.com> |
||
|
|
a67a768592 |
restore semantic bold rendering in terminal panes (T-73)
Bold attributes from terminal escapes now render in a real bold
weight instead of being silently flattened.
- pubspec.yaml: register JetBrainsMono Bold + BoldItalic at
weight 700 under family JetBrainsMono. Files already shipped on
disk; only the registration was missing.
- assets/licenses.yaml: bump JetBrainsMono weights_bundled to
[Regular, Italic, Bold, BoldItalic] per D-42 (the entry must
match what is actually wired into the family).
- lib/src/terminal/src/ui/painter.dart: revert the `bold: false`
override and drop the workaround comment. Bold now flows from
CellFlags.bold to TextStyle.fontWeight.
- test/terminal/painter_bold_metrics_test.dart: load Regular and
Bold via FontLoader and assert paragraph maxIntrinsicWidth is
identical (cell-grid drift = 0). JetBrainsMono Bold's monospace
by spec; this test is the canary for the day someone swaps the
font.
- test/goldens/goldens/{ci,linux}/clide_button.png: regenerate.
ClideButton's label renders slightly heavier on the bold variant
(expected — 0.28% pixel diff before regen).
Earlier perception of over-bolding in the Claude pane was
synthetic-bold smearing (Flutter overpaints when no Bold.ttf is
registered for the family), not legitimate bold rendering. Visual
A/B confirms a real Bold face renders crisp emphasis without the
smear, so no per-pane renderer config is needed.
Co-Authored-By: Claude <noreply@anthropic.com>
|
||
|
|
5f162a6668 |
rename tagline to "IDE for Claude Code CLI"
clide is an IDE for the Claude Code CLI. The previous tagline "Flutter desktop IDE for Claude Code" overemphasized the host toolkit (Flutter is implementation detail, immediately obvious to contributors) and was ambiguous about whether the integration target is the CLI specifically. Updates the welcome subtitle (i18n catalog + widget test + view), the project description in pubspec.yaml, README and CLAUDE.md, the CLI banner, and the web manifest/index. Co-Authored-By: Claude <noreply@anthropic.com> |
||
|
|
9c1597a450 |
inline terminal emulator, drop xterm.dart dependency
Replace the xterm pub.dev package with owned code under lib/src/terminal/. Based on xterm.dart v4.0.0 by xuty (MIT). Quiver LRU replaced with hand-rolled LinkedHashMap cache. Scrollable removed from TerminalView — scroll events are forwarded via Listener.onPointerSignal instead. zmodem, debugger, and suggestion modules stripped as unused. Also: bundle clide.tmux.conf (no status bar, 50k scrollback, mouse on, zero escape delay, isolated -L clide socket), bump PTY read buffer to 64KB, add 2px terminal padding, drop bold JetBrains Mono registration. Co-Authored-By: Claude <noreply@anthropic.com> |
||
|
|
5301c4753c |
release v2.0.0
test / unit + widget + golden + a11y (push) Failing after 31s
test / integration_test (xvfb) (push) Has been skipped
test / bundle smoke (xvfb 5s) (push) Has been skipped
test / daemon subprocess + web WASM smoke (push) Has been skipped
Co-Authored-By: Claude <noreply@anthropic.com> |
||
|
|
7911075107 |
move canonical upstream to GitHub
Gitea remote kept as secondary (`gitea`). Updated repository URLs in pubspec.yaml, licenses.yaml, and initial-plan.md. README rewritten to reflect the current single-process Flutter architecture. Co-Authored-By: Claude <noreply@anthropic.com> |
||
|
|
a44a2efae7 |
add format engine packages: jovial_svg, markdown, html_core (D-058)
Three format engines adopted per the new D-058 rule (format engines clear the dependency bar; UI chrome stays in-house): - jovial_svg 1.1.26 (BSD-3) — SVG renderer via CustomPaint - markdown 7.2.2 (BSD-3) — GFM parser; renderer is ours - flutter_widget_from_html_core 0.17.2 (MIT) — HTML renderer Welcome screen now loads logo.svg via jovial_svg instead of a raster PNG. POLICY.md updated with format engine rule. All three documented in licenses.yaml. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> |
||
|
|
fa0032d26d |
rename logo assets: logo-* and appicon-* sets
Two clean sets from their SVG sources:
logo.svg → logo-{16..1024}.png (bare, transparent)
appicon.svg → appicon-{16..1024}.png (on dark circle)
All rendered from 2048px masters. References updated in
pubspec.yaml, welcome view, and native runner.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
||
|
|
1fdd35706e |
fold project.yaml into pubspec.yaml
pubspec.yaml is now the single source of truth for version and project metadata. Makefile reads version from pubspec.yaml. All references to project.yaml across CLAUDE.md, CHANGELOG.md, decisions, and skills updated. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> |
||
|
|
46329700d5 |
dissolve app/ into repo root (D-056)
Single Flutter package at the repo root. All code, tests, assets, and platform directories moved from app/ to root. Package renamed from clide_app to clide — all imports rewritten. Merged pubspec combines core (ffi) and app (flutter, yaml, xterm) dependencies. Makefile simplified: no APP_PRESENT conditionals, no cd, no daemon lifecycle. 317 tests pass. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> |
||
|
|
5869697297 |
add four design themes + syntax tokens to theme pipeline
test / unit + widget + golden + a11y (push) Failing after 39s
test / integration_test (xvfb) (push) Has been skipped
test / bundle smoke (xvfb 5s) (push) Has been skipped
test / daemon subprocess + web WASM smoke (push) Has been skipped
SurfaceTokens gains seven syntax-role fields (keyword, type, string, number, comment, method, punct). Theme loader parses the syntax: YAML block and injects values into the surface override layer. Resolver defaults map syntax roles to semantic colours so themes without explicit syntax blocks still compile. Four new theme YAMLs (clide, midnight, paper, terminal) replace summer-night. Palette keys mapped to the existing semantic layer; syntax values pass through directly. Goldens regenerated for the 14→font-size change. Co-Authored-By: Claude <noreply@anthropic.com> |
||
|
|
edd8a20e0d |
add Dart PTY wrapper and test-core harness
PtySession wraps the ptyc helper: socketpair + Process.start + recvmsg with SCM_RIGHTS for master-fd transfer, a background isolate that loops on blocking read() and posts byte chunks, plus write/resize/ kill/close. close() SIGTERMs the child so the PTY's EOF wakes the reader naturally; SIGKILL + fd close + isolate kill cover the edge where the shell ignores SIGTERM — avoids the known Linux quirk where closing an fd doesn't unblock an in-flight read() on it. Env defaults stamp TERM=xterm-256color, COLORTERM=truecolor, CLICOLOR_FORCE=1 so shells + tmux + Claude emit 24-bit sequences that xterm.dart can render. User env (HOME / USER / SHELL) still inherits via mergePtyEnv(). ffi: 2.1.3 added as a runtime dep — the FFI bindings for socketpair, recvmsg, read/write, and ioctl(TIOCSWINSZ) need an allocator we're not writing by hand. Justified in pubspec + listed in licenses.yaml per D-042. make test-core (ci/test_core.sh) runs the Flutter-free core tests under a 120s hard timeout with setsid + process-group kill, wired ahead of the fast app tests in push-check so a hung PTY test can't wedge a pre-push. Current core suite: 24 tests in ~1s. Co-Authored-By: Claude <noreply@anthropic.com> |
||
|
|
235cbcc046 |
add Dart core package — IPC envelopes, daemon, ping round-trip
First real content for the `clide` Dart package at the repo root.
One AOT-compiled binary (ADR 0005) with two modes:
* `clide --daemon` long-running unix-socket server; listens on
`$XDG_RUNTIME_DIR/clide-$USER.sock` with stale-socket
reclaim, accepts JSON-lines request/response traffic, clean
SIGTERM shutdown unlinks the socket file.
* `clide <subcommand>` one-shot; opens the socket, sends a
request, writes the response JSON to stdout, exits with the
dispatcher's error code per ADR 0006 (0/1/2/3/4). Unknown
subcommands forward to the daemon so extensions can register
their own without CLI changes.
Tier 0 handlers: `ping` (returns pong + version + UTC ts) and
`version`. Both are covered by `test/ipc/` + `test/daemon/`; the
subprocess test builds `bin/clide`, starts it, pings it, SIGTERMs
it, and asserts the socket file disappears.
Co-Authored-By: Claude <noreply@anthropic.com>
|