Skip to content

spec: Tab Configs in Command Palette and keyboard shortcuts (#9176)#10023

Open
lonexreb wants to merge 1 commit intowarpdotdev:masterfrom
lonexreb:spec/9176-tab-configs-in-palette
Open

spec: Tab Configs in Command Palette and keyboard shortcuts (#9176)#10023
lonexreb wants to merge 1 commit intowarpdotdev:masterfrom
lonexreb:spec/9176-tab-configs-in-palette

Conversation

@lonexreb
Copy link
Copy Markdown
Contributor

@lonexreb lonexreb commented May 4, 2026

Adds a product+tech spec for #9176: expose Tab Configs in the Command Palette so they're keyboard-accessible, matching the affordances Launch Configurations have today.

Files

  • `specs/GH9176/product.md` (108 lines) — V1 scope, current vs requested affordances, 8 testable behavior invariants
  • `specs/GH9176/tech.md` (194 lines) — module layout (clone of `launch_config/` palette source), dispatch wiring, telemetry, end-to-end flow

Total: 302 insertions, 0 deletions. No code changes — this is a spec PR.

Why this matters

Per the issue: Tab Configs are positioned as the recommended replacement for Launch Configurations, but the new system loses every keyboard-driven entry point the legacy system had:

Surface Launch Configurations Tab Configs
Click + button → context menu
Right-click + button
Command Palette search
Cmd+Ctrl+L
Menu bar entry

The reporter's stated workaround is to "continue using the legacy Launch Configurations (YAML) to get keyboard access" — which defeats the purpose of the migration. Importance: 4/5.

V1 scope

The implementation surface is genuinely small: clone the existing `app/src/search/command_palette/launch_config/` source's three files (`data_source.rs`, `search_item.rs`, `renderer.rs`), point them at the existing `app/src/tab_configs/` loader, register in the palette mixer.

  • Palette indexing: walk `~/.warp/tab_configs/*.toml`, parse each, surface as palette items.
  • Selection: reuses the existing `launch_with_config` entry point used by the + button — invariant 2 ensures byte-equivalent behavior.
  • Error rows: malformed TOML files appear as error-state rows labeled "Failed to load: "; selecting opens the file in Warp's editor.
  • Iconography: a distinct row icon from Launch Configurations for visual differentiation (icon choice deferred to maintainer review — open question 1 in product.md).
  • Telemetry: new `TabConfigPaletteSelected` event so adoption is measurable independently of the Launch Configuration palette.

Out of V1 (tracked as follow-ups)

  • Per-Tab-Config keyboard shortcut bindings (the reporter's "ideally" ask). Requires a new keybinding surface; deferred until V1's Cmd+P search proves popular.
  • Menu-bar entry — discoverability improvement, deferred since Cmd+P is keyboard-equivalent.
  • Folding Launch Configurations and Tab Configs into a single palette source — useful only after Launch Configs are deprecated; V1 keeps them parallel.
  • "tab config:" filter prefix for users with very large catalogs.
  • Filesystem watcher on `~/.warp/tab_configs/` to avoid the per-open directory walk — if profiling shows it's needed.

Why this spec is high-leverage

Open questions for maintainers

  1. Row icon choice. `bundled/svg/tab.svg` vs `bundled/svg/grid.svg` vs another distinct glyph. Pick at implementation time so the visual differentiation from Launch Configurations is unambiguous.
  2. Telemetry naming. New `TabConfigPaletteSelected` event vs extending the existing Launch Configuration palette event with a discriminator. Spec recommends a new event for clean dashboards.
  3. Menu-bar entry deferral. Confirm out-of-V1 is acceptable (Cmd+P is keyboard-equivalent; menu bar adds discoverability for non-keyboard users who have the + button submenu).

Happy to iterate on the design or tighten the V1 scope further.

…ev#9176)

Adds product.md and tech.md for issue warpdotdev#9176: surface Tab Configs in
the Command Palette so they're keyboard-accessible, matching the
affordances Launch Configurations already have. Reporter explicitly
calls this out as a regression from migrating to Tab Configs (loses
Cmd+P search, dedicated shortcut, and menu-bar entry).

V1 scope:
- New palette source under app/src/search/command_palette/tab_config/
  mirroring the existing launch_config/ siblings (data_source.rs,
  search_item.rs, renderer.rs)
- Register the source in the existing data_sources.rs aggregator
- Selection dispatch reuses the existing launch_with_config entry
  point used by the + button — same parameter modal, same pane spawn
- Error-state rows for malformed TOML files; selecting opens in editor
- Distinct row icon for visual differentiation from Launch Configurations
- New TabConfigPaletteSelected telemetry event

Out of V1 (tracked as follow-ups):
- Per-Tab-Config keyboard shortcut bindings (the reporter's "ideally")
- Menu-bar entry for Tab Configs
- Folding Launch Configurations + Tab Configs into one source once
  Launch Configs are deprecated
- A "tab config:" filter prefix
- Filesystem watcher to avoid per-open directory walk if profiling
  shows it's a hot path

8 testable behavior invariants. Implementation surface is genuinely
small: clone the launch_config palette source structure, swap loader
calls. No new infrastructure, no new mixer logic.
@cla-bot cla-bot Bot added the cla-signed label May 4, 2026
@oz-for-oss
Copy link
Copy Markdown
Contributor

oz-for-oss Bot commented May 4, 2026

@lonexreb

I'm starting a first review of this spec-only pull request.

You can view the conversation on Warp.

I completed the review and no human review was requested for this pull request.

Comment /oz-review on this pull request to retrigger a review (up to 3 times on the same pull request).

Powered by Oz

@github-actions github-actions Bot added the external-contributor Indicates that a PR has been opened by someone outside the Warp team. label May 4, 2026
Copy link
Copy Markdown
Contributor

@oz-for-oss oz-for-oss Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Overview

This PR adds product and tech specs for exposing Tab Configs in the Command Palette. The scope is aligned with the linked issue, but the implementation plan has several gaps that would make the delivered behavior diverge from the stated requirements.

Concerns

  • The tech spec does not make the documented tab config query match all Tab Config rows.
  • The proposed data source bypasses the existing Tab Config loader/menu source, risking inconsistent inventory, sorting, refresh, and error behavior versus the + menu.

Security

  • The proposed telemetry payload includes user-authored Tab Config names without specifying redaction/UGC handling, which can leak project or customer names.

Verdict

Found: 0 critical, 3 important, 0 suggestions

Request changes

Comment /oz-review on this pull request to retrigger a review (up to 3 times on the same pull request).

Powered by Oz

Comment thread specs/GH9176/tech.md
/// dropped (invariant 5).
pub fn results(ctx: &AppContext) -> Vec<TabConfigSearchItem> {
let dir = warp_managed_paths::tab_configs_dir(); // existing helper
let entries = std::fs::read_dir(&dir).ok().into_iter().flatten();
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ [IMPORTANT] This new read_dir path can diverge from the existing Tab Config loader used by the + menu, so the spec should require reusing the same loaded config/error source or explicitly preserve identical inventory, sorting, refresh, and parse-error semantics.

Comment thread specs/GH9176/tech.md
impl SearchItem for TabConfigSearchItem {
fn match_against(&self) -> &str {
match self {
Self::Loaded { config, .. } => config.name.as_str(),
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ [IMPORTANT] The product spec promises typing tab config filters to all configs, but this match string only indexes the config name; add a type token/search alias to the indexed text or remove that UX guarantee.

Comment thread specs/GH9176/tech.md

```rust
TabConfigPaletteSelected {
config_name: String,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ [IMPORTANT] [SECURITY] config_name is user-authored and can contain sensitive project/customer names; the spec should either omit it from telemetry or require UGC marking/redaction/hashing before emission.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cla-signed external-contributor Indicates that a PR has been opened by someone outside the Warp team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant