Problem
setupRegistryAutoRun writes our batch-file path into HKCU\Software\Microsoft\Command Processor\AutoRun with reg add ... /f, which completely overwrites any existing AutoRun value the user (or another tool) had configured.
CMD AutoRun is a chainable command string — tools that need to hook into CMD startup conventionally append with & rather than overwrite. Our code does not do this.
Symptoms
A user who relies on a personal AutoRun (a common pattern: pointing AutoRun at a .cmd startup file that adds tools to PATH, sets aliases, etc.) will see those customizations stop working after PEM activates the CMD shell integration. The most visible failure mode is "tool X disappears from PATH in the VS Code terminal but works elsewhere," because the PATH-additions in their AutoRun are no longer running.
This matches a recent marketplace review describing exactly this shape — PATH losing entries and a CLI tool (ripgrep) becoming unfindable from the VS Code terminal specifically.
Affected code
setupRegistryAutoRun — overwrites with /f.
setupCmdStartup — calls getExistingAutoRun() to check whether our path is already present, but if any other content is there it still overwrites.
removeCmdStartup — explicitly comments "We deliberately DO NOT remove the main batch file or registry AutoRun setting". So once we've overwritten the user's AutoRun, we never restore it on disable/uninstall either.
Fix direction
- Chain instead of overwrite. When
getExistingAutoRun() returns non-empty content that doesn't already include our path, prepend the existing string and join with &: ${existingAutoRun} & if exist "${mainBatchFile}" call "${mainBatchFile}".
- Surgically remove on teardown. In
removeCmdStartup, locate our segment in the AutoRun value and strip just that segment (preserving the user's prior content), rather than leaving the registry pointing at our (possibly missing) batch file.
- Unit-test the merge/strip logic as pure string transformations — no need to mock the registry.
Acceptance criteria
Notes
- Risk is low. The chained-AutoRun pattern is well-established CMD convention.
- This issue stays narrowly scoped to the registry overwrite. Adjacent concerns (e.g. whether to write to AutoRun at all, vs. relying on
clink / VS Code's shell integration) are out of scope here.
Problem
setupRegistryAutoRunwrites our batch-file path intoHKCU\Software\Microsoft\Command Processor\AutoRunwithreg add ... /f, which completely overwrites any existing AutoRun value the user (or another tool) had configured.CMD AutoRun is a chainable command string — tools that need to hook into CMD startup conventionally append with
&rather than overwrite. Our code does not do this.Symptoms
A user who relies on a personal AutoRun (a common pattern: pointing AutoRun at a
.cmdstartup file that adds tools toPATH, sets aliases, etc.) will see those customizations stop working after PEM activates the CMD shell integration. The most visible failure mode is "tool X disappears fromPATHin the VS Code terminal but works elsewhere," because the PATH-additions in their AutoRun are no longer running.This matches a recent marketplace review describing exactly this shape —
PATHlosing entries and a CLI tool (ripgrep) becoming unfindable from the VS Code terminal specifically.Affected code
setupRegistryAutoRun— overwrites with/f.setupCmdStartup— callsgetExistingAutoRun()to check whether our path is already present, but if any other content is there it still overwrites.removeCmdStartup— explicitly comments "We deliberately DO NOT remove the main batch file or registry AutoRun setting". So once we've overwritten the user's AutoRun, we never restore it on disable/uninstall either.Fix direction
getExistingAutoRun()returns non-empty content that doesn't already include our path, prepend the existing string and join with&:${existingAutoRun} & if exist "${mainBatchFile}" call "${mainBatchFile}".removeCmdStartup, locate our segment in the AutoRun value and strip just that segment (preserving the user's prior content), rather than leaving the registry pointing at our (possibly missing) batch file.Acceptance criteria
${existing} & ${ours}.Notes
clink/ VS Code's shell integration) are out of scope here.