From fb8bddf74caf225920fede349fff9c56b642b9ef Mon Sep 17 00:00:00 2001 From: Christopher Tso Date: Thu, 9 Apr 2026 19:44:06 +1000 Subject: [PATCH 1/2] fix(studio): use shell mode for spawn on Windows to fix re-run eval On Windows, Node's spawn() cannot execute .cmd/.bat wrappers (e.g. npm-installed agentv.cmd) without shell:true, causing ENOENT errors when clicking "Re-run with Filters" in Studio. Closes #1024 Co-Authored-By: Claude Opus 4.6 (1M context) --- apps/cli/src/commands/results/eval-runner.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/cli/src/commands/results/eval-runner.ts b/apps/cli/src/commands/results/eval-runner.ts index 9d5053cdd..91dd8386c 100644 --- a/apps/cli/src/commands/results/eval-runner.ts +++ b/apps/cli/src/commands/results/eval-runner.ts @@ -279,6 +279,8 @@ export function registerEvalRoutes( cwd, stdio: ['ignore', 'pipe', 'pipe'], env: { ...process.env }, + // Windows requires shell:true to execute .cmd/.bat wrappers (e.g. npm-installed agentv.cmd) + shell: process.platform === 'win32', }); run.process = child; @@ -440,6 +442,7 @@ export function registerEvalRoutes( cwd, stdio: ['ignore', 'pipe', 'pipe'], env: { ...process.env }, + shell: process.platform === 'win32', }); run.process = child; From 289014b851bb523482c43ab385fa313740823b88 Mon Sep 17 00:00:00 2001 From: Christopher Tso Date: Thu, 9 Apr 2026 20:01:15 +1000 Subject: [PATCH 2/2] fix(test): fix Windows path separator issues in 3 tests - content-preprocessor.test.ts: double-escape backslash in inline script regex so split() handles Windows paths - llm-grader-multimodal.test.ts: same fix for spreadsheet preprocessor test - evaluator-parser.test.ts: use [/\] in regex to match both path separators Co-Authored-By: Claude Opus 4.6 (1M context) --- packages/core/test/evaluation/content-preprocessor.test.ts | 3 ++- packages/core/test/evaluation/llm-grader-multimodal.test.ts | 3 ++- packages/core/test/evaluation/loaders/evaluator-parser.test.ts | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/core/test/evaluation/content-preprocessor.test.ts b/packages/core/test/evaluation/content-preprocessor.test.ts index 22c562feb..bc0f4e049 100644 --- a/packages/core/test/evaluation/content-preprocessor.test.ts +++ b/packages/core/test/evaluation/content-preprocessor.test.ts @@ -42,8 +42,9 @@ describe('content preprocessors', () => { await writeFile( scriptPath, `const fs = require('node:fs'); +const path = require('node:path'); const payload = JSON.parse(fs.readFileSync(0, 'utf8')); -console.log('sheet:' + payload.original_path.split('/').pop());`, +console.log('sheet:' + path.basename(payload.original_path));`, 'utf8', ); diff --git a/packages/core/test/evaluation/llm-grader-multimodal.test.ts b/packages/core/test/evaluation/llm-grader-multimodal.test.ts index bbf6e8c04..158d10245 100644 --- a/packages/core/test/evaluation/llm-grader-multimodal.test.ts +++ b/packages/core/test/evaluation/llm-grader-multimodal.test.ts @@ -374,8 +374,9 @@ describe('LlmGraderEvaluator multimodal', () => { await writeFile( scriptPath, `const fs = require('node:fs'); +const path = require('node:path'); const payload = JSON.parse(fs.readFileSync(0, 'utf8')); -console.log('spreadsheet:' + payload.original_path.split('/').pop());`, +console.log('spreadsheet:' + path.basename(payload.original_path));`, 'utf8', ); diff --git a/packages/core/test/evaluation/loaders/evaluator-parser.test.ts b/packages/core/test/evaluation/loaders/evaluator-parser.test.ts index 5d7b393f0..bf2998c58 100644 --- a/packages/core/test/evaluation/loaders/evaluator-parser.test.ts +++ b/packages/core/test/evaluation/loaders/evaluator-parser.test.ts @@ -1571,7 +1571,7 @@ assertions: [tempDir], 'test-5', ), - ).rejects.toThrow(/\.agentv\/templates\/missing-template\.yaml/); + ).rejects.toThrow(/\.agentv[/\\]templates[/\\]missing-template\.yaml/); }); });