/** * Keybindings template generator. * Generates a well-documented template file for ~/.claude/keybindings.json */ import { jsonStringify } from '../utils/slowOperations.js' import { DEFAULT_BINDINGS } from './defaultBindings.js' import { NON_REBINDABLE, normalizeKeyForComparison, } from './reservedShortcuts.js' import type { KeybindingBlock } from './types.js' /** * Filter out reserved shortcuts that cannot be rebound. * These would cause /doctor to warn, so we exclude them from the template. */ function filterReservedShortcuts(blocks: KeybindingBlock[]): KeybindingBlock[] { const reservedKeys = new Set( NON_REBINDABLE.map(r => normalizeKeyForComparison(r.key)), ) return blocks .map(block => { const filteredBindings: Record = {} for (const [key, action] of Object.entries(block.bindings)) { if (!reservedKeys.has(normalizeKeyForComparison(key))) { filteredBindings[key] = action } } return { context: block.context, bindings: filteredBindings } }) .filter(block => Object.keys(block.bindings).length > 0) } /** * Generate a template keybindings.json file content. * Creates a fully valid JSON file with all default bindings that users can customize. */ export function generateKeybindingsTemplate(): string { // Filter out reserved shortcuts that cannot be rebound const bindings = filterReservedShortcuts(DEFAULT_BINDINGS) // Format as object wrapper with bindings array const config = { $schema: 'https://www.schemastore.org/claude-code-keybindings.json', $docs: 'https://code.claude.com/docs/en/keybindings', bindings, } return jsonStringify(config, null, 2) + '\n' }