Skip to content

Warp host tool shows "not detected on $PATH" on Windows/Linux — catalogue entry is macOS-only but not platform-gated #4539

@cbeaulieu-gt

Description

@cbeaulieu-gt

What users will see

In the project Hand-off menu ("open project in "), Warp is listed but always renders as unavailable with the tooltip "Warp - not detected on $PATH", even when the Warp terminal is installed. This happens on Windows and Linux; Warp can only ever be detected on macOS.

Environment (reporter)

  • OS: Windows (MINGW64_NT-10.0-26200)
  • Warp installed at: C:\Users\chris\AppData\Local\Programs\Warp\warp.exe (official Windows installer location; WarpPreview also present)
  • where warp / which warpnot on PATH (the Warp Windows installer does not add a warp shim to $PATH)

Steps to reproduce

  1. On Windows (or Linux), install Warp via the official installer (lands in %LOCALAPPDATA%\Programs\Warp\warp.exe, not added to $PATH).
  2. Open the project Hand-off menu in OpenDesign.
  3. Warp appears in the "unavailable" rail with "Warp - not detected on $PATH".

Expected: Warp is detected (or, if Warp open-in-app is not supported off-macOS, it is hidden on those platforms rather than shown as broken).
Actual: Warp is shown but is permanently undetectable on Windows/Linux.

Root cause

The host-tool catalogue entry for Warp declares only a macOS bundle fallback and no command, and it carries no platforms / excludedPlatforms guard — so it is shown on every platform but can only resolve on macOS.

apps/daemon/src/routes/host-tools.ts:70

{ id: 'warp', label: 'Warp', icon: 'sliders', macOpenBundle: 'Warp' },

resolveEntry()apps/daemon/src/routes/host-tools.ts:160-191:

async function resolveEntry(entry: CatalogueEntry): Promise<{ /* … */ }> {
  if (entry.command) {                       // ← skipped: Warp has no `command`
    const resolved = await probeCommandOnPath(entry.command);
    if (resolved) { return { available: true, /* … */ }; }
  }
  if (entry.macOpenBundle && process.platform === 'darwin') {   // ← gated darwin-only
    const bundle = await probeMacBundle(entry.macOpenBundle);
    if (bundle) { return { available: true, /* … */ }; }
  }
  return { available: false };               // ← Windows/Linux always land here
}

So on Windows/Linux:

  • The entry.command branch is skipped (Warp has no command).
  • The macOpenBundle branch is gated process.platform === 'darwin'.
  • resolveEntry unconditionally returns { available: false }.

Detection never probes the actual Windows install path (%LOCALAPPDATA%\Programs\Warp\warp.exe), Program Files, the Windows registry App Paths, or Start Menu shortcuts.

The user-facing string: apps/web/src/i18n/locales/en.ts:596

'handoff.notDetectedTitle': '{target} - not detected on $PATH',

Contrast: the terminal entry (host-tools.ts:69) is correctly platform-gated with platforms: ['darwin'], so it is hidden off-macOS instead of shown-but-broken. Warp lacks the equivalent guard.

Suggested fixes (pick per product intent)

  1. Add Windows/Linux detection for Warp — probe well-known install paths when the binary is not on $PATH:
    • Windows: %LOCALAPPDATA%\Programs\Warp\warp.exe (and WarpPreview), plus %PROGRAMFILES%\Warp\.
    • Linux: warp-terminal on $PATH / standard install dirs.
      This needs a new path-probe fallback in resolveEntry (the current logic only knows $PATH + macOS bundles).
  2. Add command: 'warp' so a $PATH shim is honored on all platforms (helps users who do have the shim, but does NOT fix the installer-default case since Warp's Windows installer doesn't add a shim).
  3. Minimal stop-gap: add platforms: ['darwin'] (or excludedPlatforms: ['win32', 'linux']) to the Warp entry so it is hidden where it cannot be detected, matching the terminal entry — until proper detection lands.

Options 1 + 3 could ship together (hide now, enable on real detection later).

Notes

🤖 Generated by Claude Code on behalf of @cbeaulieu-gt

Metadata

Metadata

Assignees

Labels

bugSomething isn't workinggood first issueGood for newcomershelp wantedExtra attention is needed

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions