Skip to content

fix(engine): route review via explicit external checkout metadata#1865

Merged
gsxdsm merged 4 commits into
Runfusion:mainfrom
plarson:fix/review-external-checkout-routing
Jul 2, 2026
Merged

fix(engine): route review via explicit external checkout metadata#1865
gsxdsm merged 4 commits into
Runfusion:mainfrom
plarson:fix/review-external-checkout-routing

Conversation

@plarson

@plarson plarson commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Add explicit sourceMetadata.externalReviewCheckout review routing with fail-closed validation.
  • Log the selected review checkout so operator/runtime tasks can verify where review ran.
  • Cover metadata extraction, invalid metadata fallback, fn_review_step, and workflow stepReview routing.

Test Plan

  • cd packages/engine && corepack pnpm exec vitest run src/__tests__/review-checkout.test.ts src/__tests__/reviewer-workspace.test.ts

Summary by CodeRabbit

  • New Features

    • Review routing now supports explicit external checkout overrides via review checkout metadata, using the resolved external checkout as the review working directory when valid.
    • Logging now highlights the selected review routing target and warns when external checkout metadata is present but invalid.
  • Bug Fixes

    • Missing/blank/invalid/relative/nonexistent/non-git paths now fail closed to the task worktree instead of falling back.
    • Metadata priority is enforced strictly (custom fields → branch context → source metadata → root), preventing lower-priority fallback when higher-priority data is invalid.
  • Tests

    • Added/expanded automated coverage for override and fail-closed behavior, including workspace-mode routing semantics.

Copilot AI review requested due to automatic review settings July 1, 2026 23:27
@coderabbitai

coderabbitai Bot commented Jul 1, 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: 8e3b328e-4e6b-4280-9732-643fb407c7e8

📥 Commits

Reviewing files that changed from the base of the PR and between c46d11f and 87ce378.

📒 Files selected for processing (3)
  • packages/engine/src/__tests__/review-checkout.test.ts
  • packages/engine/src/executor.ts
  • packages/engine/src/review-checkout.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • packages/engine/src/tests/review-checkout.test.ts
  • packages/engine/src/executor.ts

📝 Walkthrough

Walkthrough

Review-checkout metadata resolution now includes externalReviewCheckout, falls back to the task worktree when metadata is invalid, logs routing decisions, and updates engine and CLI tests to match the expanded mock and routing behavior.

Changes

Review checkout routing

Layer / File(s) Summary
Metadata resolution and priority policy
packages/engine/src/review-checkout.ts
readMetadataPath now also reads externalReviewCheckout; getTaskReviewCheckoutPath keeps a fixed priority chain across customFields, branchContext, sourceMetadata, and the root record.
Executor routing visibility logging
packages/engine/src/executor.ts
Logs when review routing uses an external checkout differing from the task worktree, and warns when invalid sourceMetadata.externalReviewCheckout causes fallback, in both review execution paths.
Review checkout and workspace coverage
packages/engine/src/__tests__/review-checkout.test.ts, packages/engine/src/__tests__/reviewer-workspace.test.ts, .changeset/review-checkout-routing.md
Adds contract and routing tests for fail-closed defaults, priority ordering, non-inference, and workspace-mode behavior; the changeset records the patch release note.
CLI engine mock expansion
packages/cli/src/__tests__/extension-experiment-finalize.test.ts, packages/cli/src/__tests__/extension-fn-secret-get.test.ts, packages/cli/src/__tests__/extension-github-tracking.test.ts, packages/cli/src/__tests__/extension-web-fetch.test.ts
Extends the mocked @fusion/engine surface with additional workflow, trait, and audit exports needed by the affected extension tests.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Possibly related PRs

  • Runfusion/Fusion#1823: Both PRs modify the same review-routing flow, with this PR building on the fail-closed external checkout resolution and worktree routing introduced there.

Suggested reviewers: gsxdsm

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly matches the main change: routing review through explicit external checkout metadata.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
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.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

This PR tightens review routing in the engine by deriving the reviewer working directory from explicit task metadata (including the new sourceMetadata.externalReviewCheckout) with fail-closed validation, and adds observability + tests to ensure review runs in the intended checkout.

Changes:

  • Extend review checkout metadata extraction to include sourceMetadata.externalReviewCheckout with explicit priority ordering and fail-closed behavior.
  • Add reviewer logging that surfaces when review is routed to an external checkout (and warns when external metadata is present but invalid).
  • Add/extend tests covering metadata extraction + routing for both fn_review_step and workflow stepReview, plus a changeset.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
packages/engine/src/review-checkout.ts Adds sourceMetadata as an explicit metadata source and accepts externalReviewCheckout as a candidate field.
packages/engine/src/executor.ts Logs the selected review cwd and warns when external metadata is present but invalid.
packages/engine/src/tests/reviewer-workspace.test.ts Extends workspace/reviewer tests to cover sourceMetadata.externalReviewCheckout for both review seams.
packages/engine/src/tests/review-checkout.test.ts New contract tests for metadata extraction + fail-closed checkout resolution behavior.
.changeset/review-checkout-routing.md Publishes the routing behavior change as a patch fix for @runfusion/fusion.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread packages/engine/src/review-checkout.ts Outdated
Comment thread packages/engine/src/executor.ts Outdated
Comment thread packages/engine/src/executor.ts Outdated
Comment thread packages/engine/src/executor.ts Outdated
Comment thread packages/engine/src/executor.ts Outdated
Comment thread packages/engine/src/__tests__/review-checkout.test.ts
@greptile-apps

greptile-apps Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR wires sourceMetadata.externalReviewCheckout into the review routing chain with fail-closed validation, and refactors the previously duplicated logging blocks in both review seams into a single logReviewCheckoutRouting helper that correctly attributes the invalid-path warning only when sourceMetadata was the actual winning candidate.

  • review-checkout.ts: Adds externalReviewCheckout to the field list searched by readMetadataPath, and inserts sourceMetadata as a priority tier between branchContext and the root object in getTaskReviewCheckoutPath.
  • executor.ts: Extracts the duplicate 12-line logging block into private logReviewCheckoutRouting, fixing the false-positive warning issue raised in previous review threads; calls are added at both the fn_review_step seam and the workflow stepReview seam.
  • Tests: New review-checkout.test.ts pins the fail-closed contract across blank, relative, non-existent, non-git, and valid paths; reviewer-workspace.test.ts gains integration coverage for all four sourceMetadata scenarios.

Confidence Score: 5/5

Safe to merge — the routing change is strictly additive, fail-closed, and covered by both unit and integration tests.

The core logic change is small and self-contained: a new field is recognized, a new priority tier is inserted, and the duplicate logging block is replaced by a helper with a correctly scoped warning condition. All three concerns from the prior review round are addressed. Test coverage explicitly pins the fail-closed invariant across every known invalid-path variant and both executor seams. No correctness gaps identified.

No files require special attention.

Important Files Changed

Filename Overview
packages/engine/src/review-checkout.ts Adds externalReviewCheckout to readMetadataPath's field list and inserts sourceMetadata as a priority tier in getTaskReviewCheckoutPath; validation logic unchanged and fail-closed behavior preserved.
packages/engine/src/executor.ts Extracts duplicated review-routing logging into logReviewCheckoutRouting; warning now fires only when sourceMetadata.externalReviewCheckout was the winning (and invalid) candidate, fixing the false-positive addressed in prior review threads.
packages/engine/src/tests/review-checkout.test.ts New unit test file pinning fail-closed resolution for all invalid path variants and confirming priority ordering; covers blank, relative, non-existent, non-git, file-not-directory, and valid git checkout cases.
packages/engine/src/tests/reviewer-workspace.test.ts Adds integration coverage for sourceMetadata.externalReviewCheckout across both review seams (fn_review_step and stepReview), including valid override, no-metadata fallback, invalid-path fallback, and workspace-mode passthrough.
.changeset/review-checkout-routing.md Compliant patch-level changeset with required summary, category: fix, and dev fields per AGENTS.md format.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A["resolveReviewCheckoutCwd(task, fallbackCwd)"] --> B["getTaskReviewCheckoutPath(task)"]
    B --> C{customFields has path?}
    C -- yes --> D["candidate = customFields.*"]
    C -- no --> E{branchContext has path?}
    E -- yes --> F["candidate = branchContext.*"]
    E -- no --> G{sourceMetadata has externalReviewCheckout?}
    G -- yes --> H["candidate = sourceMetadata.externalReviewCheckout"]
    G -- no --> I{root-level path field?}
    I -- yes --> J["candidate = task.*"]
    I -- no --> K["candidate = undefined → return fallbackCwd"]
    D & F & H & J --> L{isAbsolute && exists && isDirectory?}
    L -- no --> M["return fallbackCwd"]
    L -- yes --> N["git rev-parse --show-toplevel"]
    N -- error/empty --> M
    N -- success --> O["return realpathSync(topLevel)"]
    O --> P["logReviewCheckoutRouting"]
    M --> P
    P --> Q{reviewCwd != worktreePath?}
    Q -- yes --> R["log: routed to external checkout"]
    Q -- no --> S{selectedCandidate == sourceMetadata.externalReviewCheckout?}
    S -- yes --> T["warn: external metadata present but invalid"]
    S -- no --> U["silent fallback"]
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
    A["resolveReviewCheckoutCwd(task, fallbackCwd)"] --> B["getTaskReviewCheckoutPath(task)"]
    B --> C{customFields has path?}
    C -- yes --> D["candidate = customFields.*"]
    C -- no --> E{branchContext has path?}
    E -- yes --> F["candidate = branchContext.*"]
    E -- no --> G{sourceMetadata has externalReviewCheckout?}
    G -- yes --> H["candidate = sourceMetadata.externalReviewCheckout"]
    G -- no --> I{root-level path field?}
    I -- yes --> J["candidate = task.*"]
    I -- no --> K["candidate = undefined → return fallbackCwd"]
    D & F & H & J --> L{isAbsolute && exists && isDirectory?}
    L -- no --> M["return fallbackCwd"]
    L -- yes --> N["git rev-parse --show-toplevel"]
    N -- error/empty --> M
    N -- success --> O["return realpathSync(topLevel)"]
    O --> P["logReviewCheckoutRouting"]
    M --> P
    P --> Q{reviewCwd != worktreePath?}
    Q -- yes --> R["log: routed to external checkout"]
    Q -- no --> S{selectedCandidate == sourceMetadata.externalReviewCheckout?}
    S -- yes --> T["warn: external metadata present but invalid"]
    S -- no --> U["silent fallback"]
Loading

Reviews (3): Last reviewed commit: "fix(engine): address review checkout rou..." | Re-trigger Greptile

Comment thread packages/engine/src/executor.ts Outdated
Comment thread packages/engine/src/executor.ts Outdated
Comment thread packages/engine/src/executor.ts Outdated

@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.

🧹 Nitpick comments (1)
packages/engine/src/executor.ts (1)

6366-6377: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Duplicated review-checkout routing/logging logic.

The routing-visibility block (compute reviewCwd, compare to the worktree, log the external-checkout route, or warn on invalid sourceMetadata.externalReviewCheckout) is copy-pasted verbatim in both the stepReview seam and createReviewStepTool. Consider extracting a small shared helper (e.g. private logReviewCheckoutRouting(taskId, sourceMetadata, reviewCwd, worktreePath)) to avoid the two copies silently diverging on a future edit.

♻️ Proposed extraction
+  private logReviewCheckoutRouting(taskId: string, sourceMetadata: unknown, reviewCwd: string, worktreePath: string): void {
+    if (reviewCwd !== worktreePath) {
+      reviewerLog.log(`${taskId}: review routed to external checkout ${reviewCwd} (task worktree: ${worktreePath})`);
+      return;
+    }
+    const sm = sourceMetadata as Record<string, unknown> | undefined;
+    const hasExternalMeta = sm && typeof sm.externalReviewCheckout === "string" && sm.externalReviewCheckout.trim();
+    if (hasExternalMeta) {
+      reviewerLog.warn(`${taskId}: external review checkout metadata present (${sm!.externalReviewCheckout}) but invalid — reviewing task worktree ${worktreePath}`);
+    }
+  }

Then both call sites become:

-        if (reviewCwd !== worktreePath) {
-          reviewerLog.log(`${seamTask.id}: review routed to external checkout ${reviewCwd} (task worktree: ${worktreePath})`);
-        } else {
-          const sm = detail.sourceMetadata as Record<string, unknown> | undefined;
-          const hasExternalMeta = sm && typeof sm.externalReviewCheckout === "string" && sm.externalReviewCheckout.trim();
-          if (hasExternalMeta) {
-            reviewerLog.warn(`${seamTask.id}: external review checkout metadata present (${sm!.externalReviewCheckout}) but invalid — reviewing task worktree ${worktreePath}`);
-          }
-        }
+        this.logReviewCheckoutRouting(seamTask.id, detail.sourceMetadata, reviewCwd, worktreePath);

Also applies to: 12994-13005

🤖 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/engine/src/executor.ts` around lines 6366 - 6377, The
review-checkout routing/logging block is duplicated in both the stepReview seam
and createReviewStepTool, so extract the shared logic into a small helper such
as logReviewCheckoutRouting on the executor/reviewer path. Move the
reviewCwd/worktreePath comparison and the sourceMetadata.externalReviewCheckout
validation logging into that helper, then call it from both existing sites so
the routing behavior stays consistent and won’t diverge on future edits.
🤖 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.

Nitpick comments:
In `@packages/engine/src/executor.ts`:
- Around line 6366-6377: The review-checkout routing/logging block is duplicated
in both the stepReview seam and createReviewStepTool, so extract the shared
logic into a small helper such as logReviewCheckoutRouting on the
executor/reviewer path. Move the reviewCwd/worktreePath comparison and the
sourceMetadata.externalReviewCheckout validation logging into that helper, then
call it from both existing sites so the routing behavior stays consistent and
won’t diverge on future edits.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: bf42558d-ea41-43b0-b575-5f774717b2f8

📥 Commits

Reviewing files that changed from the base of the PR and between 20e42c6 and b58d9b5.

📒 Files selected for processing (5)
  • .changeset/review-checkout-routing.md
  • packages/engine/src/__tests__/review-checkout.test.ts
  • packages/engine/src/__tests__/reviewer-workspace.test.ts
  • packages/engine/src/executor.ts
  • packages/engine/src/review-checkout.ts

@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.

🧹 Nitpick comments (4)
packages/cli/src/__tests__/extension-experiment-finalize.test.ts (1)

60-69: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

createWorkflowAuthoringTools mock returns wrong shape.

Real implementation returns ToolDefinition[], and the extension calls .find(...) on the result. Stubbing it as vi.fn(() => ({})) means any code path reaching workflow tool dispatch in this suite would throw workflowTools.find is not a function.

🔧 Proposed fix
-  createWorkflowAuthoringTools: vi.fn(() => ({})),
+  createWorkflowAuthoringTools: vi.fn(() => []),
🤖 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/cli/src/__tests__/extension-experiment-finalize.test.ts` around
lines 60 - 69, The `createWorkflowAuthoringTools` mock is returning the wrong
type, which breaks any code path that expects workflow tools to behave like a
`ToolDefinition[]` and call `.find(...)` on them. Update the test setup in
`extension-experiment-finalize.test.ts` so `createWorkflowAuthoringTools`
returns an array-shaped mock consistent with the real implementation, using the
`createWorkflowAuthoringTools` stub that feeds the extension’s workflow tool
dispatch logic.
packages/cli/src/__tests__/extension-fn-secret-get.test.ts (1)

16-25: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Same createWorkflowAuthoringTools stub shape mismatch as sibling files.

Real export returns ToolDefinition[], and consumers call .find(...) on it (see packages/engine/src/agent-tools.ts:2404-2419 and packages/cli/src/extension.ts). Returning {} will crash with .find is not a function if this suite's tools ever reach the workflow-dispatch path.

🔧 Proposed fix
-  createWorkflowAuthoringTools: vi.fn(() => ({})),
+  createWorkflowAuthoringTools: vi.fn(() => []),
🤖 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/cli/src/__tests__/extension-fn-secret-get.test.ts` around lines 16 -
25, The `createWorkflowAuthoringTools` test stub has the wrong return shape and
should match the real `ToolDefinition[]` contract used by `agent-tools` and
`extension.ts`. Update the mock in this test to return an array-like tool list
(consistent with sibling fixtures) so callers that use `.find(...)` do not fail
with a non-function error. Keep the rest of the mocked params unchanged and
ensure the stubbed tools expose the fields needed by workflow dispatch.
packages/cli/src/__tests__/extension-github-tracking.test.ts (1)

34-43: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Same createWorkflowAuthoringTools stub shape mismatch.

Should return an array (ToolDefinition[]) rather than {}, matching the upstream export used by .find(...) calls in the extension.

🔧 Proposed fix
-  createWorkflowAuthoringTools: vi.fn(() => ({})),
+  createWorkflowAuthoringTools: vi.fn(() => []),
🤖 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/cli/src/__tests__/extension-github-tracking.test.ts` around lines 34
- 43, The `createWorkflowAuthoringTools` stub in the test setup returns an
object, but the extension code expects an array and calls `.find(...)` on it.
Update the `vi.fn` stub for `createWorkflowAuthoringTools` to return an empty
`ToolDefinition[]`-shaped array (or an array of tool definitions) so it matches
the real export used by the extension and its `.find(...)` usage.
packages/cli/src/__tests__/extension-web-fetch.test.ts (1)

12-21: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Same createWorkflowAuthoringTools stub shape mismatch.

Consistent with the other three test files — the stub should return [], not {}, to match the real array-returning export and avoid breaking .find(...) consumers.

🔧 Proposed fix
-  createWorkflowAuthoringTools: vi.fn(() => ({})),
+  createWorkflowAuthoringTools: vi.fn(() => []),
🤖 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/cli/src/__tests__/extension-web-fetch.test.ts` around lines 12 - 21,
The test stub for createWorkflowAuthoringTools is returning the wrong shape and
should match the real export’s array result. Update the mock in
extension-web-fetch.test.ts so createWorkflowAuthoringTools returns an empty
array instead of an object, consistent with the other test files and safe for
any .find(...) usage.
🤖 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.

Nitpick comments:
In `@packages/cli/src/__tests__/extension-experiment-finalize.test.ts`:
- Around line 60-69: The `createWorkflowAuthoringTools` mock is returning the
wrong type, which breaks any code path that expects workflow tools to behave
like a `ToolDefinition[]` and call `.find(...)` on them. Update the test setup
in `extension-experiment-finalize.test.ts` so `createWorkflowAuthoringTools`
returns an array-shaped mock consistent with the real implementation, using the
`createWorkflowAuthoringTools` stub that feeds the extension’s workflow tool
dispatch logic.

In `@packages/cli/src/__tests__/extension-fn-secret-get.test.ts`:
- Around line 16-25: The `createWorkflowAuthoringTools` test stub has the wrong
return shape and should match the real `ToolDefinition[]` contract used by
`agent-tools` and `extension.ts`. Update the mock in this test to return an
array-like tool list (consistent with sibling fixtures) so callers that use
`.find(...)` do not fail with a non-function error. Keep the rest of the mocked
params unchanged and ensure the stubbed tools expose the fields needed by
workflow dispatch.

In `@packages/cli/src/__tests__/extension-github-tracking.test.ts`:
- Around line 34-43: The `createWorkflowAuthoringTools` stub in the test setup
returns an object, but the extension code expects an array and calls
`.find(...)` on it. Update the `vi.fn` stub for `createWorkflowAuthoringTools`
to return an empty `ToolDefinition[]`-shaped array (or an array of tool
definitions) so it matches the real export used by the extension and its
`.find(...)` usage.

In `@packages/cli/src/__tests__/extension-web-fetch.test.ts`:
- Around line 12-21: The test stub for createWorkflowAuthoringTools is returning
the wrong shape and should match the real export’s array result. Update the mock
in extension-web-fetch.test.ts so createWorkflowAuthoringTools returns an empty
array instead of an object, consistent with the other test files and safe for
any .find(...) usage.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 28a96327-bb1e-48f1-af6d-4751bca776b9

📥 Commits

Reviewing files that changed from the base of the PR and between b58d9b5 and c46d11f.

📒 Files selected for processing (4)
  • packages/cli/src/__tests__/extension-experiment-finalize.test.ts
  • packages/cli/src/__tests__/extension-fn-secret-get.test.ts
  • packages/cli/src/__tests__/extension-github-tracking.test.ts
  • packages/cli/src/__tests__/extension-web-fetch.test.ts

@gsxdsm gsxdsm merged commit a03aae7 into Runfusion:main Jul 2, 2026
6 checks passed
gsxdsm added a commit that referenced this pull request Jul 2, 2026
Resolves the pnpm-lock.yaml conflict. Main's #1865 (review-checkout routing)
auto-merged cleanly with the completion-summary backstop in executor.ts.

Main independently pinned pi-claude-cli's pi-ai/pi-coding-agent to ^0.80.3
(e154892) but kept the top-level `getModels` import, which 0.80.3 removed —
this branch's migration to `getBuiltinModels` from `/providers/all` is retained
as the working fix. Lockfile regenerated against the merged package.json.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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.

3 participants