Files
Aperant/apps/backend/core/platform
VDT-91 aa7f56e5d0 fix(windows): complete System32 executable path fixes for where.exe and taskkill.exe (#1715)
* fix(windows): complete System32 executable path fixes for where.exe and taskkill.exe

Complete the Windows System32 executable path fixes started in #1659.
The previous fix addressed where.exe in a few frontend files but missed
several critical locations in both backend and frontend.

Backend changes:
- Add get_where_exe_path() helper in core/platform/__init__.py
- Update auth.py, git_executable.py, gh_executable.py, glab_executable.py
  to use full path instead of bare 'where' command
- Remove shell=True from subprocess calls (security improvement)

Frontend changes:
- Add getTaskkillExePath() helper in windows-paths.ts
- Update platform/index.ts, subprocess-runner.ts, pty-daemon-client.ts
  to use full path for taskkill.exe
- Update claude-code-handlers.ts to use getWhereExePath()
- Add System32 to ESSENTIAL_SYSTEM_PATHS in env-utils.ts
- Update process-kill.test.ts to mock the new helper

Why full paths:
- Works even when System32 isn't in PATH (GUI launch scenarios)
- SystemRoot env var is a protected Windows system variable
- Prevents PATH hijacking attacks
- Removing shell=True prevents command injection

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: address PR review feedback for Windows System32 executable paths

- Fix missed bare 'taskkill' at subprocess-runner.ts:174 (stopFn closure)
- Fix missed bare 'where' at mcp-handlers.ts:198 (MCP health check)
- Update stale comments in gh_executable.py and glab_executable.py
  (removed incorrect "shell=True" reference, now matches git_executable.py)
- Add error logging callback for taskkill in stopFn (was empty callback)
- Improve MCP health check error messages with actionable diagnostics
  for ENOENT and EACCES errors on both Windows and Unix

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: use getWhereExePath() for 'where gh' in validateGitHubModule

Fix missed bare 'where gh' at line 617 in subprocess-runner.ts.
This completes the System32 executable path refactoring.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: use execFileAsync for gh CLI detection consistency

Replace shell string interpolation with execFileAsync for the gh CLI
check in subprocess-runner.ts, matching the pattern used in
claude-code-handlers.ts and mcp-handlers.ts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(windows): address PR review findings for System32 path consistency

- Use getTaskkillExePath() in claude-code-handlers.ts install commands
  instead of bare 'taskkill' (NEW-003)
- Add ENOENT error handling in subprocess-runner.ts validateGitHubModule
  to distinguish missing where.exe from missing gh CLI (NEW-006)
- Extract shared getSystemRoot() helper in windows-paths.ts to
  deduplicate SystemRoot resolution logic (NEW-002)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(windows): add tests, export getSystemRoot, add windowsHide to MCP spawn

- Add unit tests for getWhereExePath/getTaskkillExePath with env fallback coverage
- Export getSystemRoot() for reuse across modules
- Add windowsHide: true to mcp-handlers spawn call (consistency with other sites)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Andy <119136210+AndyMik90@users.noreply.github.com>
2026-02-09 22:20:41 +01:00
..