Skip to content

fix(tui): stop vitest auto-kill firing on garbage memory metric and killing non-vitest processes#1361

Merged
gsxdsm merged 2 commits into
mainfrom
gsxdsm/vitest-killguard
Jun 3, 2026
Merged

fix(tui): stop vitest auto-kill firing on garbage memory metric and killing non-vitest processes#1361
gsxdsm merged 2 commits into
mainfrom
gsxdsm/vitest-killguard

Conversation

@gsxdsm

@gsxdsm gsxdsm commented Jun 3, 2026

Copy link
Copy Markdown
Collaborator

Summary

With the TUI's "auto-kill vitest on memory pressure" toggle enabled, every vitest process on the machine was being SIGKILLed every 30 seconds regardless of actual memory pressure — and the sweep also killed innocent processes (wrapper shells, monitor loops) whose command line merely mentioned vitest. In practice this made full test-suite runs die silently mid-run with truncated output and no exit status, which burned hours of debugging before the killer was identified.

Two compounding bugs:

  1. False pressure. getAvailableMemory() probed os.availableMemory — an API that does not exist — and silently fell back to os.freemem(). On macOS, freemem excludes the reclaimable file cache, so an idle 256GB machine reads ~99% "used", permanently above the 90% kill threshold. The function's own comment shows it was written specifically to avoid this trap; the correct API is process.availableMemory() (Node 22+), which reports ~46% used on the same machine. The guard now uses it, and refuses to auto-kill when only the unreliable freemem fallback is available rather than killing on a garbage ratio.

  2. Overbroad targeting. pgrep -f vitest matches full command lines, so the sweep matched and SIGKILLed zsh -c '... npx vitest run ...' wrapper shells (stranding their $? handlers — which is why dead runs looked like silent truncation) and even a monitoring loop whose command line contained grep 'node (vitest'. A new shared findVitestProcessIds() in @fusion/core filters pgrep candidates to actual node executables via ps -o pid=,comm= before anything signals them.

Surface Enumeration

All vitest-process kill/count surfaces, all now routed through findVitestProcessIds:

Surface Behavior change
TUI memory-pressure auto-kill (controller.killVitestProcesses) node-only targeting + skips entirely on unreliable memory reading
TUI manual kill-vitest command (same method) node-only targeting
dashboard POST /api/kill-vitest node-only targeting
dashboard GET /api/system-stats vitestProcessCount counts only real vitest node processes

Test plan

  • New unit tests for findVitestProcessIds (node-comm filtering spares shells/monitors, self/exclude pids, empty pgrep, win32 no-op)
  • New unit tests for getAvailableMemoryInfo (reliable via process.availableMemory, unreliable freemem fallback, throw fallback)
  • Updated routes-system tests: kill route now proves a zsh wrapper in the pgrep results is spared
  • core suite, dashboard routes-system (17/17), TUI tests (39/39), tsc --noEmit clean on core/cli/dashboard

Note: a running fn TUI/dashboard keeps the old behavior until restarted with this fix (or the auto-kill toggle is turned off in the TUI).


Compound Engineering
Claude Code

Summary by CodeRabbit

  • Bug Fixes
    • Improved reliability of the auto-kill-on-memory-pressure feature by using accurate, platform-aware memory readings.
    • Prevented unsafe auto-kills when only unreliable memory measurements are available.
    • Enhanced process targeting to avoid terminating unrelated wrapper/editor processes.
    • Unified process discovery/filtering logic across TUI and dashboard kill operations for consistent, safer behavior.

…illing non-vitest processes

Two compounding bugs made the memory-pressure vitest auto-kill a
30-second SIGKILL sweep of anything mentioning vitest:

1. False pressure: getAvailableMemory probed os.availableMemory, which
   does not exist, and silently fell back to os.freemem() — on macOS
   that reads ~99% used on an idle 256GB machine, permanently above the
   90% threshold. Now reads process.availableMemory() (Node 22+) and
   refuses to auto-kill when only the unreliable freemem fallback is
   available.

2. Overbroad targeting: pgrep -f vitest matches full command lines, so
   the sweep also killed wrapper shells (zsh -c '... npx vitest run'),
   monitor loops, and anything else whose argv mentions vitest —
   stranding exit handlers and taking out unrelated process trees.
   New shared findVitestProcessIds (@fusion/core) filters matches to
   actual node executables.

Surface enumeration (all vitest-process kill/count surfaces):
- TUI memory-pressure auto-kill (controller.killVitestProcesses)
- TUI manual kill-vitest command (same method)
- dashboard POST /api/kill-vitest
- dashboard GET /api/system-stats vitestProcessCount (display)
All four now route through findVitestProcessIds.
@coderabbitai

coderabbitai Bot commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 0d0646df-7827-4c55-a81c-3923a7cec4ae

📥 Commits

Reviewing files that changed from the base of the PR and between 614bec2 and 580c900.

📒 Files selected for processing (1)
  • packages/core/src/vitest-processes.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/core/src/vitest-processes.ts

📝 Walkthrough

Walkthrough

This PR introduces shared helpers for safer vitest process discovery and memory measurement, then integrates both into the TUI controller and dashboard routes to improve auto-kill guard behavior by filtering to actual node processes and refusing auto-kill on unreliable memory readings.

Changes

Vitest auto-kill guard refactoring

Layer / File(s) Summary
Core process discovery helper
packages/core/src/vitest-processes.ts, packages/core/src/__tests__/vitest-processes.test.ts, packages/core/src/index.ts
Introduces findVitestProcessIds that uses pgrep -f vitest to find candidates, then filters via ps to include only node/node.exe/nodejs processes while excluding the current process and caller-provided PIDs. Tests verify filtering logic, exclusion, error handling, and Windows no-op behavior.
Memory availability probe
packages/cli/src/commands/dashboard-tui/controller.ts, packages/cli/src/commands/dashboard-tui/__tests__/available-memory.test.ts
Introduces getAvailableMemoryInfo() that prefers process.availableMemory() when available and marks readings as reliable; otherwise falls back to os.freemem() and marks as unreliable. Tests cover the happy path, missing property fallback, and exception handling.
Dashboard auto-kill and process filtering integration
packages/cli/src/commands/dashboard-tui/controller.ts, packages/dashboard/src/routes.ts, packages/dashboard/src/__tests__/routes-system.test.ts
Auto-kill gating logic now checks memory reliability and skips auto-kill if only unreliable fallback is available. Both killVitestProcesses in the controller and getVitestProcessIds in routes now use the shared findVitestProcessIds helper. Route tests are updated to mock the pgrep/ps workflow accurately.
Changeset documentation
.changeset/vitest-autokill-guard.md
Documents the behavioral fixes including corrected memory sourcing and improved process targeting across TUI and dashboard kill/count flows.

Sequence Diagram

sequenceDiagram
  participant TUIController as TUI Controller
  participant Memory as getAvailableMemoryInfo()
  participant Discovery as findVitestProcessIds()
  participant Kill as SIGKILL

  TUIController->>Memory: probe available memory
  Memory-->>TUIController: { bytes, reliable }
  alt reliable == true
    TUIController->>Discovery: request vitest node PIDs
    Discovery-->>TUIController: filtered PIDs
    TUIController->>Kill: execute SIGKILL on filtered PIDs
  else reliable == false
    TUIController->>TUIController: skip auto-kill
  end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

A rabbit hops through memory lanes,
Sifts PIDs with careful, gentle paws,
Prefers the true node-heartbeats it gains,
Skips the fog of fallback's flawed laws,
Now auto-kill hums with safer cause. 🐰✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 40.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title directly and concisely describes the two main fixes: preventing false auto-kill signals based on unreliable memory metrics and avoiding killing non-vitest processes.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch gsxdsm/vitest-killguard

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.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (3)
packages/core/src/__tests__/vitest-processes.test.ts (1)

30-51: ⚡ Quick win

Add the missing regression for a non-Vitest node process.

This suite proves wrapper shells are excluded, but it never models a plain node process whose argv merely contains vitest. That is the false-positive path this PR is trying to remove, and the current tests would still pass with that bug intact. Add one candidate that looks like node in ps output but is not actually a Vitest runner, and assert it is filtered out.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/core/src/__tests__/vitest-processes.test.ts` around lines 30 - 51,
The test for findVitestProcessIds lacks a case for a plain `node` process whose
argv contains "vitest" (a non-Vitest false-positive) so add a ps entry that
shows "node" but whose command/args do not indicate the Vitest runner and update
the expected pids to exclude that PID; modify the makeExecFileMock call in the
test (packages/core/src/__tests__/vitest-processes.test.ts) to include an
additional ps line representing a non-Vitest node process and assert that
findVitestProcessIds still returns only the real Vitest PIDs (keep existing
expectations for pgrep and ps calls intact).
packages/dashboard/src/__tests__/routes-system.test.ts (2)

408-417: 💤 Low value

Consider explicitly checking for pgrep in the fallthrough case.

The mock checks if (file === "ps") but the else case assumes any other command is pgrep. While this works for the current test, it could return incorrect mock data if the route handler unexpectedly calls another command during refactoring.

🔍 Suggested defensive check
 mockExecFile.mockImplementation((...callArgs: unknown[]) => {
   const [file] = callArgs as [string];
   const cb = callArgs[callArgs.length - 1] as (err: unknown, stdout?: string, stderr?: string) => void;
   if (file === "ps") {
     // comm filter pass: all candidates are real node processes.
     cb(null, `  ${process.pid} node\n  111 /opt/homebrew/bin/node\n  222 node\n`, "");
     return;
   }
+  if (file === "pgrep") {
+    cb(null, `${process.pid}\n111\n222\n`, "");
+    return;
+  }
-  cb(null, `${process.pid}\n111\n222\n`, "");
+  // Unexpected command - fail explicitly
+  cb(new Error(`Unexpected execFile command: ${file}`), "", "");
 });
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/dashboard/src/__tests__/routes-system.test.ts` around lines 408 -
417, The mock implementation for mockExecFile currently only checks if (file ===
"ps") and assumes any other command is pgrep; update
mockExecFile.mockImplementation to explicitly handle the "pgrep" command (e.g.,
if (file === "pgrep") return the pid-list payload) and add a default branch that
throws or fails the test (or calls back with an error) for any unexpected
command to catch future refactors; reference the mockExecFile, the file variable
inside the mockImplementation, and the test behavior in routes-system.test.ts
when making this change.

593-604: 💤 Low value

Consider validating the command in each mockImplementationOnce for clarity.

The chained mocks implicitly rely on the order of execFile invocations (pgrep first, then ps), but neither mock validates which command it's handling. If the implementation changes the call order during refactoring, the test would fail in confusing ways.

📝 Suggested validation for clarity
 mockExecFile
   .mockImplementationOnce((...callArgs: unknown[]) => {
-    // pgrep -f vitest: matches the dashboard itself, two node processes,
-    // a wrapper shell whose command line mentions vitest, and garbage.
+    const [file, argsOrCb] = callArgs as [string, unknown];
+    const args = Array.isArray(argsOrCb) ? argsOrCb : [];
     const cb = callArgs[callArgs.length - 1] as (err: unknown, stdout?: string, stderr?: string) => void;
+    // Verify this is the pgrep call we expect
+    if (file !== "pgrep" || args[0] !== "-f" || args[1] !== "vitest") {
+      throw new Error(`Mock 1: expected pgrep -f vitest, got: ${file} ${args.join(" ")}`);
+    }
+    // pgrep -f vitest: matches the dashboard itself, two node processes,
+    // a wrapper shell whose command line mentions vitest, and garbage.
     cb(null, `${process.pid}\n1001\n1002\n1003\nnot-a-pid\n`, "");
   })
   .mockImplementationOnce((...callArgs: unknown[]) => {
-    // ps comm filter: 1003 is a zsh wrapper and must be spared.
+    const [file] = callArgs as [string];
     const cb = callArgs[callArgs.length - 1] as (err: unknown, stdout?: string, stderr?: string) => void;
+    // Verify this is the ps call we expect
+    if (file !== "ps") {
+      throw new Error(`Mock 2: expected ps, got: ${file}`);
+    }
+    // ps comm filter: 1003 is a zsh wrapper and must be spared.
     cb(null, `  ${process.pid} node\n  1001 /opt/homebrew/bin/node\n  1002 node\n  1003 zsh\n`, "");
   });
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/dashboard/src/__tests__/routes-system.test.ts` around lines 593 -
604, The tests register two mockImplementationOnce handlers on mockExecFile but
don't verify which command each handler is servicing, so refactors changing call
order will mis-route responses; update the mockImplementationOnce callbacks used
in the routes-system.test (the mockExecFile setup) to inspect the command/args
(e.g., check callArgs[0] or callArgs[1] for the invoked executable and its args)
and assert or branch on whether it's the pgrep invocation vs the ps invocation
(return the pgrep stdout for the pgrep call and the process list for the ps
call, otherwise throw or call back an error) so each mock only responds to the
intended command.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/core/src/vitest-processes.ts`:
- Around line 84-86: findVitestProcessIds currently uses pgrep -f vitest then
filterToNodeProcesses only checks ps comm, allowing unrelated Node processes
that mention "vitest" to slip through; update the filtering to inspect the full
argv/args. Modify filterToNodeProcesses (and its ps call) to use "ps -o
pid=,args=" (not just comm) via execToStdout/execFileImpl, require the
executable be node/node.exe AND also match a Vitest-specific marker in args
(e.g., "vitest", "node_modules/vitest", or the known Vitest entrypoint), and
return only those PIDs; ensure findVitestProcessIds still calls parsePids and
passes candidates into the tightened filter.

---

Nitpick comments:
In `@packages/core/src/__tests__/vitest-processes.test.ts`:
- Around line 30-51: The test for findVitestProcessIds lacks a case for a plain
`node` process whose argv contains "vitest" (a non-Vitest false-positive) so add
a ps entry that shows "node" but whose command/args do not indicate the Vitest
runner and update the expected pids to exclude that PID; modify the
makeExecFileMock call in the test
(packages/core/src/__tests__/vitest-processes.test.ts) to include an additional
ps line representing a non-Vitest node process and assert that
findVitestProcessIds still returns only the real Vitest PIDs (keep existing
expectations for pgrep and ps calls intact).

In `@packages/dashboard/src/__tests__/routes-system.test.ts`:
- Around line 408-417: The mock implementation for mockExecFile currently only
checks if (file === "ps") and assumes any other command is pgrep; update
mockExecFile.mockImplementation to explicitly handle the "pgrep" command (e.g.,
if (file === "pgrep") return the pid-list payload) and add a default branch that
throws or fails the test (or calls back with an error) for any unexpected
command to catch future refactors; reference the mockExecFile, the file variable
inside the mockImplementation, and the test behavior in routes-system.test.ts
when making this change.
- Around line 593-604: The tests register two mockImplementationOnce handlers on
mockExecFile but don't verify which command each handler is servicing, so
refactors changing call order will mis-route responses; update the
mockImplementationOnce callbacks used in the routes-system.test (the
mockExecFile setup) to inspect the command/args (e.g., check callArgs[0] or
callArgs[1] for the invoked executable and its args) and assert or branch on
whether it's the pgrep invocation vs the ps invocation (return the pgrep stdout
for the pgrep call and the process list for the ps call, otherwise throw or call
back an error) so each mock only responds to the intended command.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: be7225d6-0fba-41b3-a6ce-c3ab93d5873a

📥 Commits

Reviewing files that changed from the base of the PR and between 3a62b68 and 614bec2.

📒 Files selected for processing (8)
  • .changeset/vitest-autokill-guard.md
  • packages/cli/src/commands/dashboard-tui/__tests__/available-memory.test.ts
  • packages/cli/src/commands/dashboard-tui/controller.ts
  • packages/core/src/__tests__/vitest-processes.test.ts
  • packages/core/src/index.ts
  • packages/core/src/vitest-processes.ts
  • packages/dashboard/src/__tests__/routes-system.test.ts
  • packages/dashboard/src/routes.ts

Comment on lines +84 to +86
const candidates = parsePids(await execToStdout(execFileImpl, "pgrep", ["-f", "vitest"]));
const nodePids = await filterToNodeProcesses(execFileImpl, candidates);
return nodePids.filter((pid) => !excluded.has(pid));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Inspecting the vitest PID selection pipeline..."
sed -n '46,86p' packages/core/src/vitest-processes.ts

echo
echo "Searching for where the helper proves a process is Vitest vs only proving it is node..."
rg -n -C2 'pgrep|-o|comm=|args=|node\.exe|executable === "node"' packages/core/src/vitest-processes.ts

Repository: Runfusion/Fusion

Length of output: 3393


Tighten vitest PID selection: comm === node still allows unrelated Node processes that merely mention “vitest”.

findVitestProcessIds() uses pgrep -f vitest to create candidates, then filterToNodeProcesses() only checks ps -o pid=,comm= and keeps node / node.exe processes—there’s no inspection of the full command/argv. Any unrelated Node process whose command line contains “vitest” can therefore be returned and later SIGKILLed/count as vitest. Tighten the second stage to match Vitest-specific argv/entrypoint (e.g., via ps -o pid=,args= plus a Vitest marker) in addition to the node executable check.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/core/src/vitest-processes.ts` around lines 84 - 86,
findVitestProcessIds currently uses pgrep -f vitest then filterToNodeProcesses
only checks ps comm, allowing unrelated Node processes that mention "vitest" to
slip through; update the filtering to inspect the full argv/args. Modify
filterToNodeProcesses (and its ps call) to use "ps -o pid=,args=" (not just
comm) via execToStdout/execFileImpl, require the executable be node/node.exe AND
also match a Vitest-specific marker in args (e.g., "vitest",
"node_modules/vitest", or the known Vitest entrypoint), and return only those
PIDs; ensure findVitestProcessIds still calls parsePids and passes candidates
into the tightened filter.

@greptile-apps

greptile-apps Bot commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR fixes two compounding bugs in the TUI's vitest auto-kill feature: a nonexistent os.availableMemory API call that silently fell back to os.freemem() (permanently reading ~99% used on macOS), and pgrep -f vitest overbroad matching that killed wrapper shells and monitoring processes whose command lines merely mentioned vitest.

  • Memory fix: getAvailableMemoryInfo() now calls process.availableMemory() (Node 22+) and returns a reliable: boolean flag; the auto-kill loop skips entirely when only the unreliable freemem fallback is available.
  • Process targeting fix: A new findVitestProcessIds() helper in @fusion/core runs a secondary ps -o pid=,comm= query to filter pgrep candidates to actual node/nodejs executables before signalling anything.
  • Unified surface: TUI auto-kill, TUI manual kill, dashboard POST /api/kill-vitest, and GET /api/system-stats vitestProcessCount all route through the shared helper.

Confidence Score: 5/5

Safe to merge — both bugs are fixed with correct logic, test coverage is thorough, and the shared helper is properly exercised across all four surfaces.

The memory API fix is straightforward: process.availableMemory() replaces the nonexistent os.availableMemory, and the reliable flag prevents kill decisions from being made on garbage readings. The process-targeting fix correctly chains pgrep + ps and filters to node executables before signalling anything. All changed surfaces are covered by updated tests.

No files require special attention.

Important Files Changed

Filename Overview
packages/core/src/vitest-processes.ts New shared helper; correctly runs pgrep then ps to filter candidates to node processes; handles all edge cases (empty pgrep, win32 no-op, excludePids). nodejs binary name already included for Debian-style distros.
packages/cli/src/commands/dashboard-tui/controller.ts Corrects the memory API call from nonexistent os.availableMemory to process.availableMemory(); gates auto-kill on the reliable flag; delegates kill targeting to findVitestProcessIds. getAvailableMemory() is still live — used for the UI's systemFreeMem display field.
packages/dashboard/src/routes.ts Replaces inline pgrep logic with findVitestProcessIds(); dashboard process PID is excluded by the shared helper's default. Both the kill route and system-stats count are now consistent.
packages/cli/src/commands/dashboard-tui/tests/available-memory.test.ts New tests for getAvailableMemoryInfo; reliable path, freemem fallback, and throw-fallback cases all covered. Reliable path silently skips on Node < 22 runtimes.
packages/core/src/tests/vitest-processes.test.ts New tests for findVitestProcessIds; verifies shell/monitor processes are spared, self and extra excludePids are dropped, empty pgrep skips the ps call, win32 is a no-op.
packages/dashboard/src/tests/routes-system.test.ts Updated to dispatch mock execFile calls by command name (pgrep vs ps); kill test now includes a zsh wrapper PID and asserts it is not signalled.
packages/core/src/index.ts Exports findVitestProcessIds and FindVitestProcessIdsOptions from the new module; straightforward addition.
.changeset/vitest-autokill-guard.md Patch-level changeset entry with an accurate description of both root causes and the fixes applied.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[Memory check tick every 2s] --> B[getAvailableMemoryInfo]
    B --> C{process.availableMemory\nexists and works?}
    C -- Yes --> D[reliable: true\nbytes: accurate value]
    C -- No / throws --> E[reliable: false\nbytes: os.freemem]
    D --> F{reliable && total > 0?}
    E --> F
    F -- No --> G[Skip — garbage signal\ndo NOT SIGKILL]
    F -- Yes --> H{usedRatio > threshold\n&& gap > 30s?}
    H -- No --> I[No action]
    H -- Yes --> J[findVitestProcessIds]
    J --> K[pgrep -f vitest]
    K --> L{Any candidates?}
    L -- No --> M[Return empty list]
    L -- Yes --> N[ps -o pid=,comm= -p PIDs]
    N --> O[Filter: comm basename == node\nor nodejs or node.exe]
    O --> P[Exclude process.pid and excludePids]
    P --> Q[SIGKILL remaining PIDs]
Loading

Reviews (2): Last reviewed commit: "Update packages/core/src/vitest-processe..." | Re-trigger Greptile

Comment thread packages/core/src/vitest-processes.ts Outdated
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
@greptile-apps

greptile-apps Bot commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

Want your agent to iterate on Greptile's feedback? Try greploops.

@gsxdsm
gsxdsm merged commit 7bfdd97 into main Jun 3, 2026
8 checks passed
@gsxdsm
gsxdsm deleted the gsxdsm/vitest-killguard branch June 3, 2026 21:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant