Skip to content

feat(web): rebindable keyboard shortcuts and a Keybinds settings page - #470

Merged
Makisuo merged 9 commits into
mainfrom
feat/rebindable-keybinds
Nov 12, 2026
Merged

Makisuo merged 9 commits into
mainfrom
feat/rebindable-keybinds

fix(web): per-row Reset shows whenever a row is off its default

6fdd136
Select commit
Loading
Failed to load commit list.
Maple Review Bot / Maple / review succeeded Nov 12, 2026 in 3m 23s

Confidence 10/10 · No issues found

🟢 Confidence 10/10 · safe to merge. The earlier per-row Reset defect is fixed and pinned by a scene test; keymap uniqueness, entry cleaning and binding paths are read and tested.
no findings · tests covered · risk low

Adds rebindable shortcuts: defineKeymap replaces the hotkey registry and catalog, overrides are stored per device and resolved into Shared.keys, and a Keybinds page records, resets and unbinds them. The earlier per-row Reset finding is fixed, and the McpQueryError issues are untouched by this diff. Safe to merge.

  • defineKeymap declares every action once and keeps rebindable keys unique in resolve
  • Layout and channel hotkeys bind the user's resolved keys as a subscription dependency
  • New /:org/my-settings/keybinds page records, refuses typing keys, resets and unbinds
  • The ⌘/ dialog lists current keys and links to the settings page

Fixed since the last review

  • ✅ F2 · A shortcut whose key another row took has no per-row Reset

Production impact

Open errors in the changed files (2)
Issue Service Occurrences File
@maple/mcp/errors/McpQueryError (2 issues) maple-chat 9 apps/web-foldkit/src/page/registry.ts
@maple/mcp/errors/McpQueryError (8 issues) maple-ai 30 apps/web-foldkit/src/page/registry.ts

After this merges, Maple checks whether they stop.

What was checked
  • F2: isChanged now also compares the resolved key to the default (view.ts:149-151); a displaced row keeps its Reset, pinned by scene.test.ts:179
  • clean decodes each stored entry alone and keeps only isTypingSafe keys, and readStored swallows decode failures (data/storage.ts:14)
  • No @tanstack/hotkeys import survives the dependency removal (grep over all .ts/.json at head); the removed imageViewer.* entries were never bound or listed

6fdd136 · Reply "won't fix" to dismiss a finding, or mention @maple-review-bot to ask about one.