Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@ src/test/circleciconfig/ @CircleCI-Public/developer-experience @meeech @gordonsy
src/negative_test/circleciconfig/ @CircleCI-Public/developer-experience @meeech @gordonsyme

# Managed by JetBrains YouTrack team
src/schemas/json/youtrack-app.json @skoch13 @andrey-skl @zmaks
src/test/youtrack-app/ @skoch13 @andrey-skl @zmaks
src/negative_test/youtrack-app/ @skoch13 @andrey-skl @zmaks
src/schemas/json/youtrack-app.json @skoch13 @andrey-skl @zmaks @maxmaximov
src/test/youtrack-app/ @skoch13 @andrey-skl @zmaks @maxmaximov
src/negative_test/youtrack-app/ @skoch13 @andrey-skl @zmaks @maxmaximov

# Managed by Vector Informatik canoe-ci-tools team
src/schemas/json/venvironment-* @vectorgrp/canoe-ci-tools @raphael-grimm @JoergSrj @VCecileKefelian
Expand Down Expand Up @@ -65,6 +65,9 @@ src/negative_test/powerpages.config/ @priyanshu92 @ashishchoudhary001 @amitjoshi
src/schemas/json/claude-code-settings.json @domdomegg @bogini
src/test/claude-code-settings/ @domdomegg @bogini
src/negative_test/claude-code-settings/ @domdomegg @bogini
src/schemas/json/claude-code-keybindings.json @domdomegg @bogini @antrewmorrison
src/test/claude-code-keybindings/ @domdomegg @bogini @antrewmorrison
src/negative_test/claude-code-keybindings/ @domdomegg @bogini @antrewmorrison

# Managed by Convex Team:
src/schemas/json/convex.json @ianmacartney @thomasballinger @Nicolapps
Expand Down
6 changes: 6 additions & 0 deletions src/api/json/catalog.json
Original file line number Diff line number Diff line change
Expand Up @@ -1479,6 +1479,12 @@
"fileMatch": [".clawjectrc", ".clawjectrc.json"],
"url": "https://raw.githubusercontent.com/clawject/clawject/main/packages/core/src/config/schema.json"
},
{
"name": "Claude Code Keybindings",
"description": "Keyboard shortcut configuration for Claude Code",
"fileMatch": ["**/.claude/keybindings.json"],
"url": "https://www.schemastore.org/claude-code-keybindings.json"
},
{
"name": "Claude Code Settings",
"description": "Configuration file for Claude Code",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"bindings": [],
"unknownProperty": true
}
10 changes: 10 additions & 0 deletions src/negative_test/claude-code-keybindings/invalid-action.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"bindings": [
{
"bindings": {
"ctrl+s": "not:a:valid:action"
},
"context": "Chat"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"bindings": [
{
"bindings": {
"ctrl+k": "command:invalid command with spaces"
},
"context": "Chat"
}
]
}
10 changes: 10 additions & 0 deletions src/negative_test/claude-code-keybindings/invalid-context.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"bindings": [
{
"bindings": {
"ctrl+c": "app:interrupt"
},
"context": "NonExistentContext"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"$schema": "https://json.schemastore.org/claude-code-keybindings.json"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"bindings": [
{
"bindings": {
"ctrl+c": "app:interrupt"
}
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"bindings": "not-an-array"
}
174 changes: 174 additions & 0 deletions src/schemas/json/claude-code-keybindings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://json.schemastore.org/claude-code-keybindings.json",
"$defs": {
"keybindingBlock": {
"description": "A block of keybindings for a specific UI context",
"type": "object",
"properties": {
"context": {
"$ref": "#/$defs/context"
},
"bindings": {
"description": "Map of keystroke patterns to actions.\nhttps://code.claude.com/docs/en/keybindings",
"type": "object",
"propertyNames": {
"$ref": "#/$defs/keystrokePattern"
},
"additionalProperties": {
"$ref": "#/$defs/bindingValue"
}
}
},
"required": ["context", "bindings"],
"additionalProperties": false
},
"context": {
"description": "UI context where these bindings apply. Global bindings work everywhere.\nhttps://code.claude.com/docs/en/keybindings",
"type": "string",
"enum": [
"Global",
"Chat",
"Autocomplete",
"Confirmation",
"Help",
"Transcript",
"HistorySearch",
"Task",
"ThemePicker",
"Settings",
"Tabs",
"Attachments",
"Footer",
"MessageSelector",
"DiffDialog",
"ModelPicker",
"Select",
"Plugin"
]
},
"keystrokePattern": {
"description": "Keystroke pattern such as \"ctrl+k\", \"shift+tab\", or chord \"ctrl+k ctrl+s\"",
"type": "string"
},
"bindingValue": {
"description": "Action to trigger, command to invoke, or null to unbind a default shortcut",
"anyOf": [
{
"$ref": "#/$defs/builtinAction"
},
{
"$ref": "#/$defs/commandBinding"
},
{
"description": "Set to null to unbind a default shortcut",
"type": "null"
}
]
},
"builtinAction": {
"description": "Built-in action identifier.\nhttps://code.claude.com/docs/en/keybindings",
"type": "string",
"enum": [
"app:interrupt",
"app:exit",
"app:toggleTodos",
"app:toggleTranscript",
"app:toggleTeammatePreview",
"history:search",
"history:previous",
"history:next",
"chat:cancel",
"chat:cycleMode",
"chat:modelPicker",
"chat:thinkingToggle",
"chat:submit",
"chat:undo",
"chat:externalEditor",
"chat:stash",
"chat:imagePaste",
"autocomplete:accept",
"autocomplete:dismiss",
"autocomplete:previous",
"autocomplete:next",
"confirm:yes",
"confirm:no",
"confirm:previous",
"confirm:next",
"confirm:nextField",
"confirm:previousField",
"confirm:cycleMode",
"confirm:toggleExplanation",
"tabs:next",
"tabs:previous",
"transcript:toggleShowAll",
"transcript:exit",
"historySearch:next",
"historySearch:accept",
"historySearch:cancel",
"historySearch:execute",
"task:background",
"theme:toggleSyntaxHighlighting",
"help:dismiss",
"attachments:next",
"attachments:previous",
"attachments:remove",
"attachments:exit",
"footer:next",
"footer:previous",
"footer:openSelected",
"footer:clearSelection",
"messageSelector:up",
"messageSelector:down",
"messageSelector:top",
"messageSelector:bottom",
"messageSelector:select",
"diff:dismiss",
"diff:previousSource",
"diff:nextSource",
"diff:back",
"diff:viewDetails",
"diff:previousFile",
"diff:nextFile",
"modelPicker:decreaseEffort",
"modelPicker:increaseEffort",
"select:next",
"select:previous",
"select:accept",
"select:cancel",
"plugin:toggle",
"plugin:install",
"permission:toggleDebug",
"settings:search",
"settings:retry"
]
},
"commandBinding": {
"description": "Command binding that executes a slash command as if typed (e.g., \"command:commit\", \"command:help\")",
"type": "string",
"pattern": "^command:[a-zA-Z0-9:\\-_]+$"
}
},
"description": "Keyboard shortcut configuration for Claude Code.\nhttps://code.claude.com/docs/en/keybindings",
"title": "Claude Code Keybindings",
"type": "object",
"properties": {
"$schema": {
"description": "JSON Schema URL for editor validation",
"type": "string"
},
"$docs": {
"description": "Documentation URL",
"type": "string"
},
"bindings": {
"description": "Array of keybinding blocks, each scoping bindings to a UI context",
"type": "array",
"items": {
"$ref": "#/$defs/keybindingBlock"
}
}
},
"required": ["bindings"],
"additionalProperties": false
}
1 change: 1 addition & 0 deletions src/schemas/json/youtrack-app.json
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@
"ISSUE_OPTIONS_MENU_ITEM",
"MAIN_MENU_ITEM",
"MARKDOWN",
"PROJECT_TAB",
"PROJECT_SETTINGS",
"USER_CARD",
"USER_PROFILE_SETTINGS"
Expand Down
112 changes: 112 additions & 0 deletions src/test/claude-code-keybindings/all-contexts.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
{
"bindings": [
{
"bindings": {
"ctrl+c": "app:interrupt"
},
"context": "Global"
},
{
"bindings": {
"enter": "chat:submit"
},
"context": "Chat"
},
{
"bindings": {
"tab": "autocomplete:accept"
},
"context": "Autocomplete"
},
{
"bindings": {
"y": "confirm:yes"
},
"context": "Confirmation"
},
{
"bindings": {
"escape": "help:dismiss"
},
"context": "Help"
},
{
"bindings": {
"escape": "transcript:exit"
},
"context": "Transcript"
},
{
"bindings": {
"escape": "historySearch:cancel"
},
"context": "HistorySearch"
},
{
"bindings": {
"ctrl+z": "task:background"
},
"context": "Task"
},
{
"bindings": {
"s": "theme:toggleSyntaxHighlighting"
},
"context": "ThemePicker"
},
{
"bindings": {
"/": "settings:search"
},
"context": "Settings"
},
{
"bindings": {
"tab": "tabs:next"
},
"context": "Tabs"
},
{
"bindings": {
"backspace": "attachments:remove"
},
"context": "Attachments"
},
{
"bindings": {
"enter": "footer:openSelected"
},
"context": "Footer"
},
{
"bindings": {
"up": "messageSelector:up"
},
"context": "MessageSelector"
},
{
"bindings": {
"escape": "diff:dismiss"
},
"context": "DiffDialog"
},
{
"bindings": {
"left": "modelPicker:decreaseEffort"
},
"context": "ModelPicker"
},
{
"bindings": {
"enter": "select:accept"
},
"context": "Select"
},
{
"bindings": {
"i": "plugin:install"
},
"context": "Plugin"
}
]
}
Loading