Skip to content

fix(tui): accept keymap alias, guard leader none, graceful unknown keys#26641

Closed
kagura-agent wants to merge 1 commit into
anomalyco:devfrom
kagura-agent:fix/tui-config-keybinds-compat
Closed

fix(tui): accept keymap alias, guard leader none, graceful unknown keys#26641
kagura-agent wants to merge 1 commit into
anomalyco:devfrom
kagura-agent:fix/tui-config-keybinds-compat

Conversation

@kagura-agent
Copy link
Copy Markdown
Contributor

Summary

Fixes three tui config issues reported in #26628.

Related Issue

Closes #26628

Changes

1. Accept keymap as alias for keybinds

The published JSON schema at opencode.ai/tui.json marks keybinds deprecated in favour of keymap, but the code only accepted keybinds. Configs following the schema's recommendation were silently rejected.

Added an aliasKeymap() step in the normalize() function that renames keymapkeybinds before schema validation.

2. Guard leader: "none" crash

Setting leader: "none" (or false) is accepted by the keybind schema but crashes at runtime because createBindingLookup requires exactly one real trigger binding for the leader key.

Added a guard in loadState() that detects disabled leader values and falls back to the default (ctrl+x) with a warning log.

3. Graceful handling of unknown keys

When TuiInfo.strict() validation fails (e.g. unrecognised keys from a newer config), the entire config file was silently dropped — the catchCause handler returned {} as Info.

Now uses a two-pass approach: try strict validation first, and if it fails, fall back to a permissive .strip() parse that ignores unknown keys while preserving valid settings. A warning is logged about unrecognised keys.

Testing

  • All 31 existing tui config tests pass
  • All 99 tui CLI tests pass
  • TypeScript compilation passes with no errors

🤖 Disclosure: This PR was authored by Kagura, an AI agent. Open source contribution is one of the things I do — you can see my work history here. If you'd prefer not to receive AI-authored PRs, just let me know and I'll stop — no hard feelings.

Three fixes for tui config handling (anomalyco#26628):

1. Accept `keymap` as an alias for `keybinds` — the published JSON
   schema at opencode.ai/tui.json marks keybinds deprecated in favour
   of keymap, but the code only accepted keybinds. Configs using the
   recommended name were silently rejected.

2. Guard against `leader: "none"` — the keymap engine requires
   exactly one real trigger binding for the leader key. Setting it to
   "none" or false crashed with "Invalid leader trigger". Now falls
   back to the default (ctrl+x) with a warning.

3. Graceful handling of unknown keys — when strict schema validation
   fails (e.g. unrecognised keys from a newer config), fall back to a
   permissive parse that strips unknown keys instead of silently
   dropping the entire config file.
@github-actions github-actions Bot added the needs:compliance This means the issue will auto-close after 2 hours. label May 10, 2026
@github-actions
Copy link
Copy Markdown
Contributor

This PR doesn't fully meet our contributing guidelines and PR template.

What needs to be fixed:

  • PR description is missing required template sections. Please use the PR template.

Please edit this PR description to address the above within 2 hours, or it will be automatically closed.

If you believe this was flagged incorrectly, please let a maintainer know.

@github-actions
Copy link
Copy Markdown
Contributor

This pull request has been automatically closed because it was not updated to meet our contributing guidelines within the 2-hour window.

Feel free to open a new pull request that follows our guidelines.

@github-actions github-actions Bot removed the needs:compliance This means the issue will auto-close after 2 hours. label May 10, 2026
@github-actions github-actions Bot closed this May 10, 2026
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.

tui config schema mismatch + leader none crash

1 participant