Problem
On macOS/Linux, slm-launch picks which slm binary runs the MCP server (SLM_LAUNCHER: auto by default, system, plugin, or a path), and under auto it prefers an slm already installed on PATH (8e914e4, "the plugin uses the SuperLocalMemory you already have").
The Windows launcher has no selection. plugin-src/scripts/slm-launch.bat always runs %CLAUDE_PLUGIN_DATA%\venv\Scripts\slm.exe, so on a Windows host that already has SLM installed (pip/pipx/npm, possibly running as a logon task via slm serve install):
- the plugin still needs its own venv, and so still needs Python ≥ 3.11 on PATH at SessionStart;
- the MCP server runs the plugin's copy of
slm, which can be a different version from the daemon serving the same store — this is what the POSIX auto path warns about already.
slm serve start is already idempotent against a running daemon (commands.py), so a second daemon is not started today; the issue is which binary the launcher runs.
Proposed change
Port the POSIX selection from slm-launch L59–131 to slm-launch.bat, using where slm for PATH lookup. Leave "is a daemon already running?" to slm serve start rather than re-implementing liveness in batch. Mirror the change to plugin/scripts/slm-launch.bat.
Acceptance criteria
Out of scope
This issue was generated by an AI assistant (Claude) from a read of the code at 5bfa47c, and reviewed by a human before posting.
Problem
On macOS/Linux,
slm-launchpicks whichslmbinary runs the MCP server (SLM_LAUNCHER:autoby default,system,plugin, or a path), and underautoit prefers anslmalready installed on PATH (8e914e4, "the plugin uses the SuperLocalMemory you already have").The Windows launcher has no selection.
plugin-src/scripts/slm-launch.batalways runs%CLAUDE_PLUGIN_DATA%\venv\Scripts\slm.exe, so on a Windows host that already has SLM installed (pip/pipx/npm, possibly running as a logon task viaslm serve install):slm, which can be a different version from the daemon serving the same store — this is what the POSIXautopath warns about already.slm serve startis already idempotent against a running daemon (commands.py), so a second daemon is not started today; the issue is which binary the launcher runs.Proposed change
Port the POSIX selection from
slm-launchL59–131 toslm-launch.bat, usingwhere slmfor PATH lookup. Leave "is a daemon already running?" toslm serve startrather than re-implementing liveness in batch. Mirror the change toplugin/scripts/slm-launch.bat.Acceptance criteria
SLM_LAUNCHERunset andslmon PATH,slm-launch.batrunsslm serve startthenslm mcpusing the PATH binary, and never referencesvenv\Scripts\slm.exe.SLM_LAUNCHERunset and noslmon PATH, it runs%CLAUDE_PLUGIN_DATA%\venv\Scripts\slm.exe(today's behaviour).SLM_LAUNCHER=systemwith noslmon PATH exits non-zero with a message namingSLM_LAUNCHER=system.SLM_LAUNCHER=pluginwithCLAUDE_PLUGIN_DATAunset exits non-zero with a message namingCLAUDE_PLUGIN_DATA.SLM_LAUNCHER=<path>runs that binary; a non-existent path exits non-zero naming the path.auto, when both a PATHslmand a plugin venv exist with different versions, a warning naming both versions is written to stderr (parity with POSIX).plugin/scripts/slm-launch.batis byte-identical toplugin-src/scripts/slm-launch.bat.tests/test_plugin/test_wf_windows_crossplatform.pyasserts the.bathandlesSLM_LAUNCHERvaluesauto,system,pluginand a path (structural, like the existing tests there).Out of scope
ensure-venv.bat— separate issue, depends on this one.This issue was generated by an AI assistant (Claude) from a read of the code at 5bfa47c, and reviewed by a human before posting.