From 638869621eea3a1fa0325c159f024a0c5d8c4085 Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Fri, 12 Jun 2026 01:24:58 +0200 Subject: [PATCH] remove dead welcome tiles; advertise only real shortcuts (T-383) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Clone-from-git and Start-a-Claude-session were inert onTap: () {} stubs whose printed shortcuts were never registered — dead UI on the first screen a new user sees. No advertised dead ends: the tiles are removed until their flows exist. The tips card was also fiction (four of six shortcuts unregistered, ⌘ glyphs for a ctrl-based default keymap) — it now lists six bindings that exist in the shipped default preset / contributed commands, and the Open-folder glyph matches the real ctrl+o binding. Co-Authored-By: Claude Fable 5 --- .pql/changelog/ticket_history/2026-06.sql | 13 +++++++++++++ .pql/changelog/tickets/2026-06.sql | 17 +++++++++++++++++ CHANGELOG.md | 7 +++++++ lib/builtin/welcome/src/welcome_view.dart | 22 +++++++++++++--------- test/builtin/welcome/widget_test.dart | 4 ++++ 5 files changed, 54 insertions(+), 9 deletions(-) diff --git a/.pql/changelog/ticket_history/2026-06.sql b/.pql/changelog/ticket_history/2026-06.sql index 4d88245b..08f153a4 100644 --- a/.pql/changelog/ticket_history/2026-06.sql +++ b/.pql/changelog/ticket_history/2026-06.sql @@ -4022,3 +4022,16 @@ Fix options (pick one, note it on this ticket): (a) route notify-level messages Acceptance: a notification posted by cli_install is visibly surfaced in the UI (test via whichever surface is chosen); no silent sink remains. Resolved with option (a): Notifications now takes the kernel MessageBus and publishes every notification to the toast channel (severity-mapped, ''title — message''); the in-memory active list stays for API compatibility. No tray built.', NULL, '2026-06-11 23:20:59', '2026-06-11 23:20:59', '2026-06-11 23:20:59', NULL, 'a34021fbc6ce201bc9e8f5954129b7cd', 2) ON CONFLICT(hash) DO NOTHING; +INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FBHCST6CQ449VJGAP6C5KZ5W', 'status', 'backlog', 'in_progress', NULL, '2026-06-11 23:21:26', '2026-06-11 23:21:26', '2026-06-11 23:21:26', NULL, '6aa2966edf63b21ad22355332371c219', 2) ON CONFLICT(hash) DO NOTHING; +INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FBHCST6CQ449VJGAP6C5KZ5W', 'status', 'in_progress', 'done', NULL, '2026-06-11 23:24:31', '2026-06-11 23:24:31', '2026-06-11 23:24:31', NULL, '8d2499a198a90a09f0fd145c4c6ee9de', 2) ON CONFLICT(hash) DO NOTHING; +INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FBHCST6CQ449VJGAP6C5KZ5W', 'description', 'lib/builtin/welcome/src/welcome_view.dart:173-174 — the Clone-from-git and Start-a-Claude-session tiles are inert on tap, and the keyboard shortcuts printed on the tiles are not registered anywhere. First-run users hit dead UI on the first screen. + +Fix: either wire the tiles (clone flow; open a Claude pane) and register the shortcuts through the keymap subsystem, or remove the tiles until the flows exist — no advertised dead ends. Note: the welcome screen also duplicates FileActions'' open-folder flow verbatim; the dedup is covered by the copy-paste sweep ticket under this epic, but if you touch this file, prefer calling into FileActions. + +Acceptance: every tile on the welcome screen performs its action (widget test taps each); every shortcut shown is registered in the keymap.', 'lib/builtin/welcome/src/welcome_view.dart:173-174 — the Clone-from-git and Start-a-Claude-session tiles are inert on tap, and the keyboard shortcuts printed on the tiles are not registered anywhere. First-run users hit dead UI on the first screen. + +Fix: either wire the tiles (clone flow; open a Claude pane) and register the shortcuts through the keymap subsystem, or remove the tiles until the flows exist — no advertised dead ends. Note: the welcome screen also duplicates FileActions'' open-folder flow verbatim; the dedup is covered by the copy-paste sweep ticket under this epic, but if you touch this file, prefer calling into FileActions. + +Acceptance: every tile on the welcome screen performs its action (widget test taps each); every shortcut shown is registered in the keymap. + +Resolved by removal, not stub flows: the two inert tiles are gone (each returns with its real flow — clone is honorable-mention territory in Q-49), the Open-folder shortcut glyph now matches the actual ctrl+o binding, and the tips card was corrected to six bindings that actually exist (quick open, palette, sidebar/context collapse, find-in-files, focus mode — the old card advertised four bindings that were never registered).', NULL, '2026-06-11 23:24:39', '2026-06-11 23:24:39', '2026-06-11 23:24:39', NULL, '53b1878fe9fd9c383d11bade928e811d', 2) ON CONFLICT(hash) DO NOTHING; diff --git a/.pql/changelog/tickets/2026-06.sql b/.pql/changelog/tickets/2026-06.sql index c4f39e0f..b9356318 100644 --- a/.pql/changelog/tickets/2026-06.sql +++ b/.pql/changelog/tickets/2026-06.sql @@ -4166,3 +4166,20 @@ Fix options (pick one, note it on this ticket): (a) route notify-level messages Acceptance: a notification posted by cli_install is visibly surfaced in the UI (test via whichever surface is chosen); no silent sink remains. Resolved with option (a): Notifications now takes the kernel MessageBus and publishes every notification to the toast channel (severity-mapped, ''title — message''); the in-memory active list stays for API compatibility. No tray built.', 'done', 'medium', NULL, NULL, NULL, '2026-06-11 21:59:55', '2026-06-11 23:20:59', NULL, 'e98115731bb2c593bd17ae945a79d260', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash); +INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FBHCST6CQ449VJGAP6C5KZ5W', 'bug', '06FBHBGHNEQTAEPGNJKN42C1E8', 'Welcome screen no-ops: Clone-from-git and Start-a-Claude-session tiles do nothing; advertised shortcuts don''t exist', 'lib/builtin/welcome/src/welcome_view.dart:173-174 — the Clone-from-git and Start-a-Claude-session tiles are inert on tap, and the keyboard shortcuts printed on the tiles are not registered anywhere. First-run users hit dead UI on the first screen. + +Fix: either wire the tiles (clone flow; open a Claude pane) and register the shortcuts through the keymap subsystem, or remove the tiles until the flows exist — no advertised dead ends. Note: the welcome screen also duplicates FileActions'' open-folder flow verbatim; the dedup is covered by the copy-paste sweep ticket under this epic, but if you touch this file, prefer calling into FileActions. + +Acceptance: every tile on the welcome screen performs its action (widget test taps each); every shortcut shown is registered in the keymap.', 'in_progress', 'medium', NULL, NULL, NULL, '2026-06-11 22:00:14', '2026-06-11 23:21:26', NULL, '7c76dbeb0ea389b836633f9ca5df2e68', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash); +INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FBHCST6CQ449VJGAP6C5KZ5W', 'bug', '06FBHBGHNEQTAEPGNJKN42C1E8', 'Welcome screen no-ops: Clone-from-git and Start-a-Claude-session tiles do nothing; advertised shortcuts don''t exist', 'lib/builtin/welcome/src/welcome_view.dart:173-174 — the Clone-from-git and Start-a-Claude-session tiles are inert on tap, and the keyboard shortcuts printed on the tiles are not registered anywhere. First-run users hit dead UI on the first screen. + +Fix: either wire the tiles (clone flow; open a Claude pane) and register the shortcuts through the keymap subsystem, or remove the tiles until the flows exist — no advertised dead ends. Note: the welcome screen also duplicates FileActions'' open-folder flow verbatim; the dedup is covered by the copy-paste sweep ticket under this epic, but if you touch this file, prefer calling into FileActions. + +Acceptance: every tile on the welcome screen performs its action (widget test taps each); every shortcut shown is registered in the keymap.', 'done', 'medium', NULL, NULL, NULL, '2026-06-11 22:00:14', '2026-06-11 23:24:31', NULL, '259cc1f4603bb7a7b4101d963ea1a9ab', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash); +INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FBHCST6CQ449VJGAP6C5KZ5W', 'bug', '06FBHBGHNEQTAEPGNJKN42C1E8', 'Welcome screen no-ops: Clone-from-git and Start-a-Claude-session tiles do nothing; advertised shortcuts don''t exist', 'lib/builtin/welcome/src/welcome_view.dart:173-174 — the Clone-from-git and Start-a-Claude-session tiles are inert on tap, and the keyboard shortcuts printed on the tiles are not registered anywhere. First-run users hit dead UI on the first screen. + +Fix: either wire the tiles (clone flow; open a Claude pane) and register the shortcuts through the keymap subsystem, or remove the tiles until the flows exist — no advertised dead ends. Note: the welcome screen also duplicates FileActions'' open-folder flow verbatim; the dedup is covered by the copy-paste sweep ticket under this epic, but if you touch this file, prefer calling into FileActions. + +Acceptance: every tile on the welcome screen performs its action (widget test taps each); every shortcut shown is registered in the keymap. + +Resolved by removal, not stub flows: the two inert tiles are gone (each returns with its real flow — clone is honorable-mention territory in Q-49), the Open-folder shortcut glyph now matches the actual ctrl+o binding, and the tips card was corrected to six bindings that actually exist (quick open, palette, sidebar/context collapse, find-in-files, focus mode — the old card advertised four bindings that were never registered).', 'done', 'medium', NULL, NULL, NULL, '2026-06-11 22:00:14', '2026-06-11 23:24:39', NULL, '49859fb995fa3e1dbd916a153c651c40', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash); diff --git a/CHANGELOG.md b/CHANGELOG.md index 7cff8677..96dde1c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,13 @@ heading, and (b) bumping `pubspec.yaml` `version:` in the same commit. its own card with its prompt and nested run. Non-agent tool calls still group as before. (T-342) +### Removed + +- **Dead welcome-screen tiles.** "Clone from git…" and "Start a Claude + session" did nothing on tap and advertised shortcuts that were never + registered; the tips card now lists only shortcuts that exist in the + default keymap. Each tile returns when its flow ships. (T-383) + ### Fixed - **PTY master fd no longer leaks when a child exits on its own.** Every diff --git a/lib/builtin/welcome/src/welcome_view.dart b/lib/builtin/welcome/src/welcome_view.dart index 3941d993..aec2a082 100644 --- a/lib/builtin/welcome/src/welcome_view.dart +++ b/lib/builtin/welcome/src/welcome_view.dart @@ -74,13 +74,16 @@ class _TipsCard extends StatelessWidget { const _TipsCard({required this.tokens}); final SurfaceTokens tokens; + // Every tip mirrors a binding that actually exists in the default + // preset / contributed commands (T-383) — ctrl-based on the shipped + // default keymap, hence ⌃ glyphs. If a binding moves, move the tip. static const _tips = <(String, String)>[ - ('Quick open', '⌘P'), - ('Command palette', '⌘⇧P'), - ('Toggle sidebar', '⌘B'), - ('Toggle context', '⌘J'), - ('Switch theme', '⌘K ⌘T'), - ('New Claude session', '⌘⇧C'), + ('Quick open', '⌃P'), + ('Command palette', '⌃⇧P'), + ('Toggle sidebar', '⌃⇧1'), + ('Toggle context', '⌃⇧3'), + ('Find in files', '⌃⇧F'), + ('Focus mode', '⌃.'), ]; @override @@ -169,9 +172,10 @@ class _StartColumn extends StatelessWidget { children: [ ClideText('START', fontSize: clideFontSmall, color: tokens.sidebarSectionHeader, fontFamily: clideMonoFamily), const SizedBox(height: 20), - _ActionRow(icon: PhosphorIcons.byName('folder'), label: 'Open folder…', shortcut: '⌘O', tokens: tokens, onTap: () => _openFolder(context)), - _ActionRow(icon: PhosphorIcons.byName('git-branch'), label: 'Clone from git…', shortcut: '⌘G', tokens: tokens, onTap: () {}), - _ActionRow(icon: PhosphorIcons.byName('chat-circle'), label: 'Start a Claude session', shortcut: '⌘C', tokens: tokens, onTap: () {}), + // Only flows that exist get a tile — the old Clone-from-git and + // Start-a-Claude-session rows were inert and advertised shortcuts + // that were never registered (T-383). Re-add each WITH its flow. + _ActionRow(icon: PhosphorIcons.byName('folder'), label: 'Open folder…', shortcut: '⌃O', tokens: tokens, onTap: () => _openFolder(context)), ], ); } diff --git a/test/builtin/welcome/widget_test.dart b/test/builtin/welcome/widget_test.dart index f46c4ff5..6f0cf0f0 100644 --- a/test/builtin/welcome/widget_test.dart +++ b/test/builtin/welcome/widget_test.dart @@ -46,6 +46,10 @@ void main() { expect(find.text('clide'), findsOneWidget); expect(find.text('IDE for Claude Code CLI'), findsOneWidget); expect(find.text('Open folder…'), findsOneWidget); + // T-383: no advertised dead ends — these tiles were inert no-ops with + // unregistered shortcuts; they return only with working flows. + expect(find.text('Clone from git…'), findsNothing); + expect(find.text('Start a Claude session'), findsNothing); }); testWidgets('TIPS card renders when the viewport is tall enough', (tester) async {