Skip to content

Conversation

@ScotTFO
Copy link
Contributor

@ScotTFO ScotTFO commented Jan 24, 2026

Summary

On Windows, child processes spawned via cmd.exe or sh.exe don't terminate when the parent process is killed (unlike Unix where SIGTERM propagates). This caused dev servers and MCP processes to accumulate, consuming 30GB+ memory over time during Auto Mode execution.

Root Causes

  • Windows doesn't propagate termination signals to child process trees
  • tree-kill package was installed but never used
  • Process cleanup only happened on successful completion, not on abort/failure

Changes

  • New utility: libs/platform/src/process-utils.ts - Cross-platform process tree termination using tree-kill
  • Auto-mode cleanup: Kill orphaned node.exe/sh.exe/cmd.exe processes matching the worktree path when features complete
  • Startup cleanup: Detect and kill orphaned dev server processes from previous runs
  • subprocess.ts: Use tree-kill when aborting CLI provider agents (Codex, Cursor, OpenCode)
  • dev-server-service: Use tree-kill when stopping dev servers from UI
  • codex-app-server-service: Use tree-kill for Codex cleanup

Bug Fixes During Implementation

  • Fixed PowerShell -like pattern: backslashes don't need escaping
  • Fixed PowerShell single-line syntax: statements need semicolons
  • Fixed PowerShell $_ shadowing in nested Where-Object queries

Test Plan

  • Start auto mode with MCP servers enabled
  • Run a feature that spawns dev servers (Next.js)
  • Stop the feature or let it complete
  • Verify no orphaned node.exe processes remain in Task Manager
  • Restart server and verify startup cleanup catches any remaining orphans
  • Monitor memory over time - should remain stable

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Optional wait-for-cleanup when stopping features for coordinated shutdown.
    • Auto-mode service now runs initialization at startup to perform launch-time cleanup.
  • Bug Fixes

    • More reliable termination on Windows via process-tree termination and escalation.
    • Improved graceful shutdown with timeouts and post-run cleanup to prevent leftovers.
  • Chores

    • Added cross-platform process utilities and platform-aware termination helpers.
  • Tests

    • Updated unit tests to cover cross-platform process termination behavior.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link

coderabbitai bot commented Jan 24, 2026

Warning

Rate limit exceeded

@ScotTFO has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 15 minutes and 25 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

Note

Other AI code review bot(s) detected

CodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review.

📝 Walkthrough

Walkthrough

Adds cross-platform process-tree utilities and integrates Windows-aware process cleanup across platform libs, subprocess helpers, server services (auto-mode, dev-server, codex-app), a stop-feature route parameter, startup initialization of AutoModeService, and related unit test updates.

Changes

Cohort / File(s) Summary
Platform process utilities
libs/platform/src/process-utils.ts, libs/platform/src/index.ts, libs/platform/package.json
New cross-platform process utilities (killProcessTree, waitForProcessExit, forceKillProcessTree) and tree-kill dependency added; exports exposed from platform index.
Subprocess integration
libs/platform/src/subprocess.ts
Introduced killProcess helper that uses killProcessTree on Windows and SIGTERM elsewhere; replaced direct SIGTERM calls with helper for timeouts/aborts.
AutoMode service
apps/server/src/services/auto-mode-service.ts
Added initialize() (startup cleanup), Windows-specific orphan process cleanup, RunningFeature additions (completionPromise, signalCompletion), and extended stopFeature(featureId, waitForCleanup = true, timeoutMs = 10000): Promise<boolean>.
Server startup
apps/server/src/index.ts
Calls autoModeService.initialize() asynchronously at startup and logs initialization errors.
Stop-feature route
apps/server/src/routes/auto-mode/routes/stop-feature.ts
Route body now accepts optional waitForCleanup?: boolean (defaults to true) and forwards shouldWait to autoModeService.stopFeature(featureId, shouldWait).
DevServer & Codex cleanup
apps/server/src/services/dev-server-service.ts, apps/server/src/services/codex-app-server-service.ts
Added Windows detection and use of killProcessTree(pid) to terminate child process trees on Windows; non-Windows fallback retains SIGTERM.
Tests
apps/server/tests/unit/services/dev-server-service.test.ts
Mocked @automaker/platform.killProcessTree; platform-aware assertions added; mock processes include pid for cross-platform behavior.

Sequence Diagram(s)

sequenceDiagram
    participant Server as Server
    participant AMS as AutoModeService
    participant Util as ProcessUtils
    participant OS as OS

    Server->>AMS: initialize()
    activate AMS
    AMS->>Util: cleanupOrphanedProcessesOnStartup()
    activate Util
    Util->>OS: detect platform (IS_WINDOWS)
    alt Windows
        Util->>OS: killProcessTree(orphaned_pids)
    else Non-Windows
        Note over Util: no tree-kill (skip)
    end
    deactivate Util
    AMS-->>Server: initialization complete
    deactivate AMS
Loading
sequenceDiagram
    participant Client as Client
    participant Route as StopFeature Route
    participant AMS as AutoModeService
    participant RF as RunningFeature
    participant Util as ProcessUtils

    Client->>Route: POST /stop-feature { featureId, waitForCleanup? }
    activate Route
    Route->>AMS: stopFeature(featureId, shouldWait)
    activate AMS
    AMS->>RF: signalCompletion() / set completionPromise
    activate RF
    RF->>Util: trigger cleanup (killProcessTree / SIGTERM)
    activate Util
    Util-->>RF: cleanup done
    deactivate Util
    RF-->>AMS: completionPromise resolves
    deactivate RF
    alt shouldWait == true
        AMS->>AMS: await completionPromise (with timeout)
    end
    AMS-->>Route: result (true/false)
    deactivate AMS
    Route-->>Client: 200 OK / error
    deactivate Route
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Suggested reviewers

  • Shironex

Poem

🐰 I hopped through tangled process trees,

On Windows winds I learned to seize,
A gentle term, then firmer sway,
Orphans cleared to meet the day,
Servers tidy—hop hooray! 🥕

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main change: fixing a Windows memory leak by preventing orphaned Node.js processes, which is the core problem and solution addressed throughout the changeset.
Docstring Coverage ✅ Passed Docstring coverage is 85.71% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @ScotTFO, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request addresses a critical memory leak issue on Windows where Node.js processes, particularly those spawned by dev servers and other agents, would become orphaned and accumulate over time, leading to significant memory consumption. The core solution involves integrating a cross-platform process tree termination utility (tree-kill) and implementing comprehensive cleanup routines. These routines ensure that processes are properly terminated both when auto-mode features complete or are aborted, and proactively on application startup to catch any remnants from previous sessions.

Highlights

  • Cross-platform Process Termination Utility: Introduced libs/platform/src/process-utils.ts to provide killProcessTree for reliably terminating process trees, especially crucial on Windows where child processes don't automatically exit with their parent.
  • Auto-Mode Feature Cleanup: Implemented mechanisms to kill orphaned node.exe, sh.exe, and cmd.exe processes associated with a specific worktree path when an auto-mode feature completes or is aborted.
  • Startup Orphaned Process Cleanup: Added a startup routine to AutoModeService that detects and terminates orphaned dev server processes from previous runs, preventing long-term memory accumulation.
  • Integrated Process Cleanup: Applied killProcessTree across various services, including subprocess.ts for CLI provider agents, dev-server-service for UI-stopped dev servers, and codex-app-server-service for Codex cleanup.
  • Enhanced Feature Stopping: Modified the stopFeature API to allow waiting for a feature's full cleanup, including process termination, with an optional timeout.
  • PowerShell Scripting Fixes: Corrected issues in PowerShell commands used for process detection, such as backslash escaping in -like patterns and statement separation with semicolons.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request introduces a robust solution to prevent memory leaks from orphaned processes on Windows by integrating the tree-kill package. The changes are well-structured, with a new cross-platform process utility and its application across various services like auto-mode-service, dev-server-service, and subprocess. The addition of logic to wait for feature cleanup is also a significant improvement. My main feedback concerns the use of execSync, which can block the server's event loop. I've suggested replacing it with its asynchronous counterpart to ensure the server remains responsive.

@ScotTFO ScotTFO force-pushed the fix/windows-memory-leak-auto-mode branch from 0929af2 to 0975042 Compare January 24, 2026 00:32
@ScotTFO ScotTFO marked this pull request as ready for review January 24, 2026 01:14
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🤖 Fix all issues with AI agents
In `@apps/server/src/services/auto-mode-service.ts`:
- Around line 146-158: The skip logic in the pidsToKill filter is too broad
because automakerPaths includes 'automaker', causing any command line with
"\automaker\" to be skipped; update the automakerPaths array to only include
specific process indicators (e.g., ['tsx','vite']) and keep the existing check
in the pidsToKill filter (the automakerPaths.some(...) expression) so it only
skips processes when the command line contains both a specific indicator (like
'tsx' or 'vite') and the automaker path marker; ensure you reference the
automakerPaths constant and the pidsToKill filter (and variables serverPid,
process.ppid, cmdLower) when making the change.
- Around line 101-118: The PowerShell -like patterns interpolate normalizedDir
and unixStyleDir directly which breaks when folder names contain wildcard chars
([ ] * ? ) or single quotes; add an escaping helper (e.g.,
escapeForPowerShellLike) and use it before building psCommand: replace all
wildcard characters with a backtick-escaped version
(value.replace(/([*?\[\]])/g, '`$1')) and double any single quotes
(value.replace(/'/g, "''")) so both normalizedDir and unixStyleDir are escaped
prior to interpolation into psCommand (refer to normalizedDir, unixStyleDir, and
psCommand).

In `@libs/platform/src/subprocess.ts`:
- Around line 7-9: Replace the relative import of killProcessTree with the
shared package barrel import; specifically change the import that currently
references './process-utils.js' to the `@automaker` package entry (for example
import { killProcessTree } from '@automaker/process-utils') so the code uses the
canonical shared module export (ensure the imported symbol name killProcessTree
remains unchanged).

@ScotTFO
Copy link
Contributor Author

ScotTFO commented Jan 24, 2026

Response to CodeRabbit Review Comments

1. automakerPaths filter (lines 146-158)

The current logic is intentionally broad to protect Automaker's own server processes from being killed. The check requires both:

  • Command line contains \automaker\
  • AND contains one of ['automaker', 'tsx', 'vite']

While this could theoretically skip processes if a user's project is named "automaker", this is an acceptable trade-off to prevent accidentally killing the Automaker server itself. A more precise fix would add significant complexity for an edge case.

2. PowerShell -like pattern escaping (lines 101-118)

Windows file system prohibits * and ? characters in folder names (they are illegal). The characters [ and ] are technically allowed but extremely rare in practice. Adding escape logic would add complexity for a scenario that effectively cannot occur in real-world usage.

3. subprocess.ts relative import (lines 7-9)

The suggestion to use @automaker/process-utils (or @automaker/platform) is not applicable here. The file subprocess.ts is inside the @automaker/platform package, and process-utils.ts is also part of the same package.

Using the barrel import would create a circular dependency:

  • index.ts exports from subprocess.js
  • subprocess.ts would import from index.ts (via @automaker/platform)

The relative import ./process-utils.js is the correct pattern for intra-package imports, consistent with all other files in this package.

@Shironex Shironex added the Performance A feature or bug is impacting performance and this needs to be looked at, label Jan 24, 2026
@Shironex Shironex changed the base branch from main to v0.14.0rc January 25, 2026 00:37
@Shironex
Copy link
Collaborator

if u could resolve merge conflicts before i review the pr

@Shironex Shironex added the waiting-on-author Waiting on the PR author to review and address applicable automated review comments. label Jan 25, 2026
@ScotTFO ScotTFO force-pushed the fix/windows-memory-leak-auto-mode branch from 44edfb4 to 1923a3b Compare January 25, 2026 01:06
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@apps/server/src/services/auto-mode-service.ts`:
- Around line 344-347: The RunningFeature's completionPromise/signalCompletion
fields are never initialized or resolved, so waitForCleanup in stopFeature
doesn't actually wait; initialize completionPromise and signalCompletion when a
RunningFeature is created (set completionPromise = new Promise<void>(resolve =>
signalCompletion = resolve) and attach both to the RunningFeature instance), and
then call signalCompletion() in the finalizers/finally blocks of executeFeature,
resumePipelineFeature, and followUpFeature (where execution ends on success,
failure, or abort) so completionPromise is resolved; ensure stopFeature uses
await running.completionPromise when the abort-and-wait path is taken so cleanup
truly waits.

@ScotTFO ScotTFO force-pushed the fix/windows-memory-leak-auto-mode branch 2 times, most recently from d141852 to bd7e039 Compare January 25, 2026 01:26
On Windows, child processes spawned via cmd.exe or sh.exe don't terminate
when the parent process is killed (unlike Unix where SIGTERM propagates).
This caused dev servers and MCP processes to accumulate, consuming 30GB+
memory over time.

Changes:
- Add tree-kill integration for cross-platform process tree termination
- Add cleanupOrphanedProcesses() to kill lingering processes when features complete
- Add startup cleanup to catch orphans from previous runs
- Fix PowerShell pattern matching (no backslash escaping needed for -like)
- Fix PowerShell script syntax (semicolons required for single-line execution)
- Apply tree-kill to subprocess.ts, dev-server-service, codex-app-server-service
- Add completion tracking for graceful feature cleanup on stop
- Add pid to mock process in tests for tree-kill condition

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

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@apps/server/src/services/auto-mode-service.ts`:
- Around line 79-83: The file fails Prettier formatting; run Prettier to fix
formatting inconsistencies in this file (e.g., align whitespace around the
top-level constant IS_WINDOWS and the surrounding JSDoc/comment blocks). Run
your formatter (prettier --write) on
apps/server/src/services/auto-mode-service.ts or apply equivalent lint/format
fixes so the declaration const IS_WINDOWS = process.platform === 'win32'; and
the following comment block match the project's Prettier rules.
♻️ Duplicate comments (3)
libs/platform/src/subprocess.ts (1)

7-10: Align import with shared-package rule.
Consider reorganizing exports (e.g., move killProcessTree into a lower-level module) so this can import via @automaker/platform instead of a relative path, avoiding circular dependency while staying guideline‑compliant. As per coding guidelines, ...

apps/server/src/services/auto-mode-service.ts (2)

101-118: Escape PowerShell -like patterns to avoid wildcard mis-matches.
Paths containing *, ?, [, ], or ' can break matching and skip cleanup. Consider escaping those characters before interpolation.

🛠️ Suggested escape helper
-    const normalizedDir = workDir.replace(/\//g, '\\');
+    const escapeForLike = (value: string) =>
+      value.replace(/'/g, "''").replace(/([`*?\[\]])/g, '`$1');
+    const normalizedDir = escapeForLike(workDir.replace(/\//g, '\\'));
 
-    const unixStyleDir = workDir
+    const unixStyleDir = escapeForLike(
+      workDir
         .replace(/^([A-Z]):/i, (_, drive) => `/${drive.toLowerCase()}`)
-        .replace(/\\/g, '/');
+        .replace(/\\/g, '/')
+    );
PowerShell -like operator: how to escape wildcard characters (* ? [ ]) and single quotes inside single-quoted strings?

344-347: waitForCleanup won’t wait because completionPromise is never wired.
stopFeature(..., true) relies on completionPromise, but it’s never created or resolved. As-is, the wait path is a no‑op.

🛠️ Wire completionPromise to execution lifecycle
@@
-    const entry: RunningFeature = {
+    let signalCompletion!: () => void;
+    const completionPromise = new Promise<void>((resolve) => {
+      signalCompletion = resolve;
+    });
+    const entry: RunningFeature = {
       featureId: params.featureId,
       projectPath: params.projectPath,
       worktreePath: null,
       branchName: null,
       abortController,
       isAutoMode: params.isAutoMode,
       startTime: Date.now(),
       leaseCount: 1,
+      completionPromise,
+      signalCompletion,
     };
@@
-      this.releaseRunningFeature(featureId);
+      tempRunningFeature.signalCompletion?.();
+      this.releaseRunningFeature(featureId);
@@
-    } finally {
-      this.releaseRunningFeature(featureId);
+    } finally {
+      runningEntry.signalCompletion?.();
+      this.releaseRunningFeature(featureId);
     }
@@
-    } finally {
-      this.releaseRunningFeature(featureId);
+    } finally {
+      runningEntry.signalCompletion?.();
+      this.releaseRunningFeature(featureId);
     }

Also applies to: 463-475, 1663-1674, 1838-1867, 2246-2248, 2501-2503

@ScotTFO
Copy link
Contributor Author

ScotTFO commented Jan 25, 2026

Merge Conflict Resolved ✅

Rebased onto v0.14.0rc and resolved conflicts:

  1. Integrated completion tracking with new acquireRunningFeature/releaseRunningFeature pattern - The v0.14.0rc branch introduced lease counting for running features. Updated the completion waiting logic to work with releaseRunningFeature() instead of direct Map deletion.

  2. Fixed formatting issue - A multi-line logger.warn call was condensed to single line per prettier rules.

All CI checks are now passing:

  • ✅ audit
  • ✅ build
  • ✅ format
  • ✅ test
  • ✅ e2e

- Create completionPromise and signalCompletion in acquireRunningFeature
- Call signalCompletion in finally blocks of all execute methods
- Fixes CodeRabbit review: completionPromise was defined but never wired

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@ScotTFO
Copy link
Contributor Author

ScotTFO commented Jan 25, 2026

Addressed CodeRabbit Review ✅

Fixed the issue raised by CodeRabbit:

completionPromise was never wired - The interface defined completionPromise and signalCompletion fields, but they were never actually created or used.

Fix Applied (commit 72a080a):

  1. Create completion tracking in acquireRunningFeature:

    let signalCompletion: () => void;
    const completionPromise = new Promise<void>((resolve) => {
      signalCompletion = resolve;
    });
  2. Signal completion in all finally blocks before calling releaseRunningFeature:

    • executeFeature
    • resumeFeature
    • resumePipelineFeature
    • followUpFeature

This ensures stopFeature(..., waitForCleanup=true) properly waits for execution to complete before cleanup.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In `@apps/server/src/services/auto-mode-service.ts`:
- Line 52: The PowerShell output "null" is not handled in
cleanupOrphanedProcesses(), causing JSON.parse to produce null and then access
.ProcessId on null; update cleanupOrphanedProcesses() to mirror
cleanupOrphanedProcessesOnStartup() by rejecting outputs that are falsy, empty
when trimmed, or equal to the literal string "null" before calling JSON.parse
(or alternatively parse and verify the result is non-null and an array/object),
and ensure you normalize single-object results into an array before filtering so
access to .ProcessId is safe.
- Around line 524-533: The current cleanupOrphanedProcessesOnStartup builds a
broad psScript that can kill unrelated dev servers; update it to fetch known
project paths via settingsService.getGlobalSettings(), skip the cleanup entirely
if no Automaker project paths are found, and restrict the PowerShell filter
(psScript) to only match processes whose CommandLine contains one of those
project paths (build a safe escaped regex or explicit contains checks for each
path). Modify the method cleanupOrphanedProcessesOnStartup to early-return when
settingsService reports no paths, and to dynamically construct psScript using
the retrieved paths so only processes launched from those project directories
(not any node.exe/sh.exe/cmd.exe) are considered orphaned.

PowerShell returns the literal string "null" when no processes match,
which JSON.parse accepts as valid JSON (returning null). Added check
for this case to prevent null reference errors.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@ScotTFO
Copy link
Contributor Author

ScotTFO commented Jan 25, 2026

Addressing CodeRabbit Review Comments

✅ Fixed Issues

  1. completionPromise never wired (commit 72a080a) - Created completion tracking in acquireRunningFeature and signal completion in all finally blocks.

  2. PowerShell "null" output handling (commit abc3f48) - Added check for result.trim() === 'null' and !parsed after JSON.parse to match the pattern already used in cleanupOrphanedProcessesOnStartup.

ℹ️ Issues That Don't Need Fixing

  1. PowerShell -like pattern escaping - The wildcard characters *, ?, [, ] are illegal in Windows file paths (reserved by NTFS). Since we're matching against working directory paths, these characters cannot appear. Escaping is unnecessary.

  2. Relative import in subprocess.ts - Using @automaker/platform would create a circular dependency since subprocess.ts is part of the platform package itself. Relative imports within the same package are the correct pattern.

  3. automakerPaths filter "too broad" - The filter requires BOTH conditions: cmdLower.includes('\automaker\') && cmdLower.includes(ap). This correctly identifies Automaker's own processes (tsx/vite running from the automaker directory).

  4. Startup cleanup "too broad" - The startup cleanup is actually targeted - it only matches processes with 'next|npm run dev|start-server' in their command lines AND whose parent process no longer exists (orphaned). This is intentionally conservative.

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

Labels

Performance A feature or bug is impacting performance and this needs to be looked at, waiting-on-author Waiting on the PR author to review and address applicable automated review comments.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants