The MCP and Modes tabs referenced non-existent per-type i18n keys
(marketplace.search.mcp, marketplace.empty.modes, etc.), causing raw
key names to render as placeholder text. Switch all three tabs to the
generic marketplace.search / marketplace.empty keys and remove the
now-unused marketplace.search.skills / marketplace.empty.skills keys
from all 16 locales.
Implements the full marketplace with all three tabs functional:
- MCP Servers: browse, search, filter by status/tags, install with
scope selection, method picker, and parameter form
- Modes: browse, search, filter by status/tags, install/remove
- Skills: unchanged from previous PR
Rewrites marketplace components to use kilo-ui Dialog/Card components,
useDialog() for modal management, and vscode.onMessage for result
subscriptions. Adds MarketplaceListView shared component for MCP and
Modes tabs. Full installer with MCP config writing (local/remote),
mode YAML parsing, and template parameter substitution.
Adds 18 new i18n keys per locale (16 languages) for MCP/mode specific
strings (badges, filters, install method, parameters, type labels).
* feat(vscode): add keyboard navigation to QuestionDock
* fix(vscode): guard Cmd+Enter submit against empty answers
Match the footer submit button's disabled condition so Cmd+Enter
cannot send partial data when no answer is selected.
* test(vscode): add architecture test for package.json command sync
* fix: match registerCommand() calls instead of any string occurrence
Addresses review feedback: the test now extracts command IDs
specifically from registerCommand() call sites, so an
executeCommand() reference won't satisfy the check.
Kobalte's Select fires onChange when the options list changes (even if
the selected value is the same), which triggers updateConfig → PATCH
/global/config → global.disposed → configLoaded → new options array →
onChange again, creating an infinite loop that floods SSE with events
and kills the server.
Add guards to all three settings Select components to skip updateConfig
when the new value equals the current config value.
Config.updateGlobal() was calling Instance.disposeAll() on every config
change, which destroyed all session state, MCP connections, and in-flight
operations across every project. This meant that any config change (e.g.
removing a mode in VS Code) would effectively kill all running CLI
instances.
The global.reset() call already clears the config cache so consumers
will pick up the new config on their next read. The disposeAll() was
unnecessary overkill.
The collapse icon (two L-shaped inward arrows) was confused with a close
button at small sizes. Replace it with a new compress icon (center line
with inward-pointing chevrons) that clearly conveys compression.
Closes#6081