Skip to content

M3: configurable shortcuts runtime sync and UI hints - #95

Merged
onevcat merged 25 commits into
mainfrom
onevclaw/issue-84-m3
Mar 30, 2026
Merged

onevcat merged 25 commits into
mainfrom
onevclaw/issue-84-m3

Conversation

@onevcat

@onevcat onevcat commented Mar 30, 2026

Copy link
Copy Markdown
Owner

Summary

  • finish M3 shortcut wiring for tab/pane/worktree scope separation
  • make local interaction shortcuts configurable (rename_branch, select_all_canvas_cards)
  • sync UI shortcut hints to resolved keybindings so runtime overrides are reflected consistently
  • expand schema/resolver tests for M3 coverage
  • redesign Shortcuts Settings as a compact table-style layout
  • align Default/Defined badge column and shortcut input column with fixed geometry
  • keep command names readable in narrow windows by shrinking the shortcut column first
  • group terminal navigation commands by Tab first, then Pane (instead of mixed alphabetical ordering)

Verification

  • make build-app
  • mise exec -- swiftlint lint --quiet --config .swiftlint.yml
  • targeted tests:
    • AppShortcutsTests
    • KeybindingSchemaTests
    • DetailToolbarTitleTests

UI Acceptance Checklist (Shortcuts Settings)

Setup

  1. Launch app and open Settings -> Shortcuts.
  2. Use the Terminal Tabs & Panes section for ordering checks.
  3. Resize the Settings window from wide to narrow to validate compression behavior.

Checklist

  • The page is rendered as a compact table-like layout with Command, Status, and Shortcut columns.
  • Default and Defined badges keep the same visual width and stay column-aligned across rows.
  • Shortcut input fields stay aligned across rows.
  • When the window narrows, the shortcut column shrinks before the command-name column.
  • In Terminal Tabs & Panes, all tab-related actions are listed together before pane-related actions.
  • Tab block order is: Previous Tab, Next Tab, then Tab 1 ... Tab 9, Tab 0.
  • Pane block order is: Previous Pane, Next Pane, Pane Up, Pane Down, Pane Left, Pane Right.
  • Clicking a shortcut field enters recording mode, and the inline helper row appears.
  • Pressing Esc during recording cancels recording without persisting changes.
  • For overridden commands, Defined badge and reset icon are shown; reset works.
  • Reset Section and Reset All still behave correctly.

Notes

  • this branch also includes a scan pass of remaining app-level hardcoded shortcuts to guide follow-up cleanup

onevcat and others added 13 commits March 28, 2026 23:06
Co-authored-by: onevpaw <onevpaw@onevcat.com>
Co-authored-by: onevtail <onevtail@onevcat.com>
Finish M2 keybinding resolver routing
…corder

Implements M3 of the keybinding integration project (issue #84).

Features:
- New 'Shortcuts' section in Settings sidebar (SettingsSection.shortcuts)
- ShortcutsSettingsView with full keybinding management:
  - Searchable list of all user-overridable commands grouped by category
  - Key recording via NSEvent local monitor (supports letters, digits,
    Return, arrow keys with ⌘⇧⌥⌃ modifiers)
  - Invalid combination detection (no modifiers, unsupported keys)
  - Conflict detection using KeybindingConflictPolicy.warnAndPreferUserOverride
  - Conflict confirmation dialog with Replace / Show Conflict / Cancel
  - Reset per-command, per-group, or all shortcuts
  - Source chip showing Default / Migrated / Override status

Schema integration:
- GlobalSettings gains keybindingUserOverrides field (KeybindingUserOverrideStore)
- SettingsFeature.State mirrors keybindingUserOverrides
- AppFeature.resolvedKeybindings now computed via resolvedKeybindings()
  helper that merges global overrides with legacy custom command migrations
- settingsChanged delegate propagates keybindingUserOverrides to AppFeature
  and recomputes resolvedKeybindings immediately

Bug fixes:
- KeybindingModifiers gains isEmpty property for recorder validation

Test coverage:
- SettingsFeatureTests.keybindingOverridesPersistAndFanOut
- AppFeatureSettingsChangedTests.settingsChangedRecomputesResolvedKeybindings
- fix AppFeature settingsChanged test to assert github integration follow-up actions

- add resolver tests for conflict replacement disable semantics and nil-enabled override no-op
@onevcat

onevcat commented Mar 30, 2026

Copy link
Copy Markdown
Owner Author

Updated for command palette configurability and toolbar hint resolve.

Changes:

  • command_palette scope changed to configurable app action.
  • Top status bar text now resolves shortcut dynamically from resolvedKeybindings.
  • Updated shortcut/schema tests accordingly.

Verification:

  • make build-app
  • xcodebuild test -only-testing:supacodeTests/AppShortcutsTests -only-testing:supacodeTests/KeybindingSchemaTests

@onevcat
onevcat merged commit 3da8fe6 into main Mar 30, 2026
1 check passed
@onevcat
onevcat deleted the onevclaw/issue-84-m3 branch March 30, 2026 07:46
onevcat added a commit that referenced this pull request Mar 30, 2026
This reverts commit 3da8fe6, reversing
changes made to 43da56f.
@onevcat
onevcat restored the onevclaw/issue-84-m3 branch March 30, 2026 07:59
@onevcat
onevcat deleted the onevclaw/issue-84-m3 branch March 30, 2026 08:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants