fix(agents): enable cursor/windows in e2e matrix#381
Open
Conversation
31f0259 to
a6763e6
Compare
6439e3b to
eccf04d
Compare
4761284 to
f48d724
Compare
two root causes fixed: 1. powershell nesting hang: agent.cmd -> powershell -> cursor-agent.ps1 -> node.exe chain hangs on windows ci. new resolveCursorBinary() finds bundled node.exe + index.js directly, bypassing all wrappers. falls back to powershell if resolution fails. 2. missing api key: cursor executor never received authconfig from factory - CURSOR_API_KEY was absent from subprocess env. on linux/macos this was masked by ci step env inheritance. now injects key via buildEnv() helper across all spawn paths. re-enables cursor/windows in e2e matrix (9/9 combos). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
adds heartbeat, stdout/stderr chunk counters, env verification, and process lifecycle logging to debug zero-output hang on windows ci. will be removed once cursor/windows is stable. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- log every edge case: unknown event types, is_error results, non-json lines, zero-output exits, empty results, stream lifecycle events - log executeStream with heartbeat and chunk counters (was zero logging) - log resolveCursorBinary failure reasons (was silent undefined returns) - log powershell fallback spawn details - increase e2e wait from 10min to 20min and step timeout from 15 to 25 (cursor on windows takes 125s+ per api call, needs 250s+ for full flow) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…cally when no push/pr is needed (local-only mode), the merge node now commits changes in the worktree using programmatic git commands instead of calling the agent executor. this eliminates the second cursor cli call that hangs indefinitely on windows. adds commitAll dep to merge node, wired via gitPrService.commitAll. agent call 1 now only runs when push or openPr is requested. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…mit path tests now reflect that push=false + openPr=false skips the agent call and uses commitAll instead. agent-path tests set push=true explicitly. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
reduce expected executor call counts by 1 in merge/evidence/rejection flow tests since local-only mode no longer calls the agent for commit. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
default stage timeout was 1_800_000ms (30min) which let hung cursor processes run forever. reduced to 600_000ms (10min) per call. with 3 retries that's 30min max per phase - still generous for all agents but kills stuck processes instead of waiting forever. reverted ci e2e wait from 20min back to 10min and step timeout from 25 back to 15min now that executor kills hung processes. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
the stage timeout change was unintended - only e2e ci timeouts should be adjusted, not the shep application defaults. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
cursor cli on windows sometimes starts but never produces output, hanging indefinitely. adds a zero-output watchdog that kills the process after 3 minutes of silence so retryExecute can retry. resets silence timer on every stdout/stderr chunk. logs silence duration in heartbeat. cursor-specific, does not affect other agents. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
'Agent execution timed out' was in NON_RETRYABLE_RE which prevented retryExecute from retrying after the silence watchdog kills a hung cursor process. moved to retryable-network category so the 3-retry loop actually works. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
direct node.exe invocation hangs 100% on windows server ci with api key auth (0 output, 3/3 retries failed). powershell + temp file approach (attempt 13) previously worked for the implement phase. reverts to powershell as primary windows spawn method. goes through agent.cmd which sets up cursor environment properly. combined with programmatic merge (no second cursor call) and silence watchdog. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
… dialog powershell `& agent` triggers windows "open with" gui dialog when agent isn't on PATH, causing zero output and silent failure. reverts to direct node.exe invocation as primary. powershell fallback now uses full path to agent.cmd to avoid the dialog. locally verified: direct node.exe + api key auth completes full e2e (implement + programmatic merge + squash) on windows. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
heartbeat now uses process.kill(pid, 0) to verify child process is actually running, not just checking proc.killed which only reflects our explicit kills. also logs node.exe/index.js existence, cwd validity, and warns if spawn returns no pid. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
aad045e to
4ee145d
Compare
cursor cli on windows server hangs when long prompts are passed as spawn arguments (zero output, process alive but silent). piping the prompt via stdin (matching claude-code executor pattern) fixes this. verified locally: direct node.exe + api key + stdin pipe completes full e2e in 12s on windows. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
separate workflow with only cursor/windows job. uses shep feat logs for real-time log streaming instead of polling feat show with sleep. detects terminal states from log content for fast failure. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
shep resolves cursor node.exe directly via resolveCursorBinary(). having agent.cmd on path may cause internal cursor self-invocation issues or windows open-with dialogs inside the cursor process. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
shep settings agent validates the binary via agent --version which needs cursor-agent on path. reverting path removal. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
node.exeinvocation on Windows: Bypass the PowerShell nesting chain that hangs on CI. NewresolveCursorBinary()finds cursor's bundlednode.exe+index.jsdirectly.CURSOR_API_KEYfromauthConfig: Factory now passesauthConfigtoCursorExecutorService, which injectsCURSOR_API_KEYinto subprocess env viabuildEnv(). Was previously missing — cursor had no credentials on Windows.Test plan
pnpm validateclean (lint + format + typecheck + tsp)🤖 Generated with Claude Code