fix: mock child_process in bundle tests for CI#7
Conversation
Tests assumed tools were pre-installed (mcporter, playwright-cli, uvx). On GitHub Actions runners these don't exist, causing 4 test failures. Now mocks execFileSync/execSync so 'which' always reports tools as installed.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 38acca8ac2
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| execFileSync: vi.fn((cmd: string, args?: string[], _opts?: any) => { | ||
| if (cmd === "which") return `/usr/local/bin/${args?.[0] ?? "unknown"}\n`; | ||
| // git clone for skill sync | ||
| if (cmd === "git") return ""; |
There was a problem hiding this comment.
Mock git clone with filesystem side effects
The execFileSync mock returns success for every git invocation, but syncSkillsFromRepo depends on git clone creating tmpDir before readdirSync(tmpDir) runs. In provisionBundle tests this means skill sync always falls into the failure path, so the suite no longer validates the successful sync behavior and can miss regressions in that code path while still passing. Consider making the git clone mock create the expected directory structure (or mocking syncSkillsFromRepo directly) so the happy path is actually exercised.
Useful? React with 👍 / 👎.
…31) (#133) * refactor(session-repair): beautify per code review (7 findings) Addresses all 7 findings from the post-v0.5.30 maintainability review. Pure refactor \u2014 zero behavior change. 536 tests passing (+2 new for the divergent-change fix). #1 + #7 \u2014 DRY: extract matchesErrorPatterns + fix divergent change isContextOverflowError and isToolPairingError shared ~80% of structure (top-level .message, cause-chain walk, stringify-gate, circular try/catch) but with subtle drift: only one walked the cause chain. Extracted matchesErrorPatterns(err, patterns, { stringifyGate }) shared helper. Both classifiers now ~7 lines and BOTH walk cause chains. Added 2 tests proving isToolPairingError now classifies wrapped/Bedrock-nested tool-pairing errors (regression guard for the divergent-change fix). Also extracted looksLikeValidationError() shared gate so the two classifiers don't repeat the 4xx/ValidationException check. #2 \u2014 long method: extracted buildTrimmedEntries(entries, cutIdx) from softResetSessionFile. The orchestration is now linear: validate \u2192 cut \u2192 build \u2192 repair \u2192 write \u2192 report. Each step at the same abstraction level. #3 \u2014 long catch with nested try: extracted attemptSoftResetRecovery() in lifecycle.ts. flushMemoryThenCompact catch block went from ~60 lines with nested try/catch to ~25 lines, linear: classify \u2192 recover \u2192 log \u2192 persist. #4 \u2014 magic number: MAX_CAUSE_CHAIN_DEPTH = 5 named constant. #5 \u2014 file >400 lines: split src/agents/shared/session-repair.ts (574 lines, two domains) into: - session-repair.ts (81 lines) \u2014 public surface, tool-pair repair, re-exports for backward compat - session-soft-reset.ts (120 lines) \u2014 softResetSessionFile + types - error-classifiers.ts (75 lines) \u2014 matchesErrorPatterns + isContextOverflowError + isToolPairingError + MAX_CAUSE_CHAIN_DEPTH - session-repair-internal.ts (239 lines) \u2014 shared filesystem + in-memory repair primitives All public exports preserved via re-exports (Feathers seam pattern). Existing callers compile unchanged. #6 \u2014 naming: introduced RepairResult { entries, report } named type for the previously-anonymous repairEntriesInMemory return shape. Better IDE hover/autocomplete; no inline destructuring noise at call sites. Verification: npm test \u2014 536 passing (was 534, +2 for cause-chain regression tests) wc -l src/agents/shared/session-repair.ts \u2014 81 (was 574) All public API surfaces preserved. * chore: bump to v0.5.31 + CHANGELOG --------- Co-authored-by: Roy Osherove <575051+royosherove@users.noreply.github.com>
Tests assumed tools were pre-installed (mcporter, playwright-cli, uvx). On GHA runners they don't exist, causing 4 failures. Now mocks execFileSync/execSync so 'which' always reports tools as installed.