| ... | @@ -4,19 +4,6 @@ T3 Code reads keybindings from: | ... | @@ -4,19 +4,6 @@ T3 Code reads keybindings from: |
| 4 | | 4 | |
| 5 | - `~/.t3/keybindings.json` | 5 | - `~/.t3/keybindings.json` |
| 6 | | 6 | |
| 7 | Schema source of truth: | | |
| 8 | | | |
| 9 | - [`packages/contracts/src/keybindings.ts`](packages/contracts/src/keybindings.ts) | | |
| 10 | - [`packages/contracts/src/server.ts`](packages/contracts/src/server.ts) | | |
| 11 | | | |
| 12 | Server-side parsing/default resolution/merging: | | |
| 13 | | | |
| 14 | - [`apps/server/src/keybindings.ts`](apps/server/src/keybindings.ts) | | |
| 15 | | | |
| 16 | Server wiring (`server.getConfig`): | | |
| 17 | | | |
| 18 | - [`apps/server/src/wsServer.ts`](apps/server/src/wsServer.ts) | | |
| 19 | | | |
| 20 | The file must be a JSON array of rules: | 7 | The file must be a JSON array of rules: |
| 21 | | 8 | |
| 22 | ```json | 9 | ```json |
| ... | @@ -26,7 +13,25 @@ The file must be a JSON array of rules: | ... | @@ -26,7 +13,25 @@ The file must be a JSON array of rules: |
| 26 | ] | 13 | ] |
| 27 | ``` | 14 | ``` |
| 28 | | 15 | |
| 29 | ## Rule Shape | 16 | See the full schema for more details: [`packages/contracts/src/keybindings.ts`](packages/contracts/src/keybindings.ts) |
| | 17 | |
| | 18 | ## Defaults |
| | 19 | |
| | 20 | ```json |
| | 21 | [ |
| | 22 | { "key": "mod+j", "command": "terminal.toggle" }, |
| | 23 | { "key": "mod+d", "command": "terminal.split", "when": "terminalFocus" }, |
| | 24 | { "key": "mod+shift+d", "command": "terminal.new", "when": "terminalFocus" }, |
| | 25 | { "key": "mod+shift+o", "command": "chat.new" }, |
| | 26 | { "key": "mod+o", "command": "editor.openFavorite" } |
| | 27 | ] |
| | 28 | ``` |
| | 29 | |
| | 30 | For most up to date defaults, see [`DEFAULT_KEYBINDINGS` in `apps/server/src/keybindings.ts`](apps/server/src/keybindings.ts) |
| | 31 | |
| | 32 | ## Configuration |
| | 33 | |
| | 34 | ### Rule Shape |
| 30 | | 35 | |
| 31 | Each entry supports: | 36 | Each entry supports: |
| 32 | | 37 | |
| ... | @@ -36,7 +41,7 @@ Each entry supports: | ... | @@ -36,7 +41,7 @@ Each entry supports: |
| 36 | | 41 | |
| 37 | Invalid rules are ignored. Invalid config files are ignored. Warnings are logged by the server. | 42 | Invalid rules are ignored. Invalid config files are ignored. Warnings are logged by the server. |
| 38 | | 43 | |
| 39 | ## Available Commands | 44 | ### Available Commands |
| 40 | | 45 | |
| 41 | - `terminal.toggle`: open/close terminal drawer | 46 | - `terminal.toggle`: open/close terminal drawer |
| 42 | - `terminal.split`: split terminal (in focused terminal context by default) | 47 | - `terminal.split`: split terminal (in focused terminal context by default) |
| ... | @@ -44,7 +49,7 @@ Invalid rules are ignored. Invalid config files are ignored. Warnings are logged | ... | @@ -44,7 +49,7 @@ Invalid rules are ignored. Invalid config files are ignored. Warnings are logged |
| 44 | - `chat.new`: create a new chat thread for the active project | 49 | - `chat.new`: create a new chat thread for the active project |
| 45 | - `editor.openFavorite`: open current project/worktree in the last-used editor | 50 | - `editor.openFavorite`: open current project/worktree in the last-used editor |
| 46 | | 51 | |
| 47 | ## Key Syntax | 52 | ### Key Syntax |
| 48 | | 53 | |
| 49 | Supported modifiers: | 54 | Supported modifiers: |
| 50 | | 55 | |
| ... | @@ -61,7 +66,7 @@ Examples: | ... | @@ -61,7 +66,7 @@ Examples: |
| 61 | - `ctrl+l` | 66 | - `ctrl+l` |
| 62 | - `cmd+k` | 67 | - `cmd+k` |
| 63 | | 68 | |
| 64 | ## `when` Conditions | 69 | ### `when` Conditions |
| 65 | | 70 | |
| 66 | Currently available context keys: | 71 | Currently available context keys: |
| 67 | | 72 | |
| ... | @@ -83,31 +88,7 @@ Examples: | ... | @@ -83,31 +88,7 @@ Examples: |
| 83 | | 88 | |
| 84 | Unknown condition keys evaluate to `false`. | 89 | Unknown condition keys evaluate to `false`. |
| 85 | | 90 | |
| 86 | ## Defaults | 91 | ### Precedence |
| 87 | | | |
| 88 | Built-in defaults are resolved on the server and sent to the web client via `server.getConfig`: | | |
| 89 | | | |
| 90 | - Source of truth: [`DEFAULT_KEYBINDINGS` in `apps/server/src/keybindings.ts`](apps/server/src/keybindings.ts) | | |
| 91 | | | |
| 92 | If you define any rules for a command, the default rule for that command is removed on the server. | | |
| 93 | | | |
| 94 | ## Server-Resolved Payload | | |
| 95 | | | |
| 96 | `~/.t3/keybindings.json` is parsed and compiled on the server. The web client receives resolved rules and does not parse raw keybinding strings. | | |
| 97 | | | |
| 98 | Resolved rule payload fields: | | |
| 99 | | | |
| 100 | - `command` | | |
| 101 | - `shortcut` | | |
| 102 | - `whenAst` (optional) | | |
| 103 | | | |
| 104 | See: | | |
| 105 | | | |
| 106 | - [`packages/contracts/src/keybindings.ts`](packages/contracts/src/keybindings.ts) | | |
| 107 | - [`apps/server/src/keybindings.ts`](apps/server/src/keybindings.ts) | | |
| 108 | - [`apps/server/src/wsServer.ts`](apps/server/src/wsServer.ts) | | |
| 109 | | | |
| 110 | ## Precedence | | |
| 111 | | 92 | |
| 112 | - Rules are evaluated in array order. | 93 | - Rules are evaluated in array order. |
| 113 | - For a key event, the last rule where both `key` matches and `when` evaluates to `true` wins. | 94 | - For a key event, the last rule where both `key` matches and `when` evaluates to `true` wins. |