From cde12790d721ab2a90471750fd75d9f5bf13f57d Mon Sep 17 00:00:00 2001 From: Jake Leventhal Date: Tue, 1 Sep 2026 21:15:07 -0700 Subject: [PATCH] fix(contracts): accept legacy pull request checkout results (#8238) --- packages/contracts/src/git.test.ts | 41 ++++++++++++++++++++++++++++++ packages/contracts/src/git.ts | 3 ++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/packages/contracts/src/git.test.ts b/packages/contracts/src/git.test.ts index 4ea86670ff8f3142dce6fd60ac7d6ffec14fe119..5dda491b009b2d09f5b82c882876dd7e5ee0181e 100644 --- a/packages/contracts/src/git.test.ts +++ b/packages/contracts/src/git.test.ts @@ -4,6 +4,7 @@ import * as Schema from "effect/Schema"; import { VcsCreateWorktreeInput, GitPreparePullRequestThreadInput, + GitPreparePullRequestThreadResult, GitRunStackedActionResult, GitRunStackedActionInput, GitResolvePullRequestResult, @@ -13,6 +14,9 @@ const decodeCreateWorktreeInput = Schema.decodeUnknownSync(VcsCreateWorktreeInpu const decodePreparePullRequestThreadInput = Schema.decodeUnknownSync( GitPreparePullRequestThreadInput, ); +const decodePreparePullRequestThreadResult = Schema.decodeUnknownSync( + GitPreparePullRequestThreadResult, +); const decodeRunStackedActionInput = Schema.decodeUnknownSync(GitRunStackedActionInput); const decodeRunStackedActionResult = Schema.decodeUnknownSync(GitRunStackedActionResult); const decodeResolvePullRequestResult = Schema.decodeUnknownSync(GitResolvePullRequestResult); @@ -55,6 +59,43 @@ describe("GitPreparePullRequestThreadInput", () => { }); }); +describe("GitPreparePullRequestThreadResult", () => { + it("defaults legacy responses to the pull request head", () => { + const parsed = decodePreparePullRequestThreadResult({ + pullRequest: { + number: 42, + title: "PR threads", + url: "https://github.com/pingdotgg/codething-mvp/pull/42", + baseBranch: "main", + headBranch: "feature/pr-threads", + state: "open", + }, + branch: "feature/pr-threads", + worktreePath: "/tmp/pr-threads", + }); + + expect(parsed.isOnPullRequestHead).toBe(true); + }); + + it("preserves an explicit stale pull request checkout result", () => { + const parsed = decodePreparePullRequestThreadResult({ + pullRequest: { + number: 42, + title: "PR threads", + url: "https://github.com/pingdotgg/codething-mvp/pull/42", + baseBranch: "main", + headBranch: "feature/pr-threads", + state: "open", + }, + branch: "feature/pr-threads", + worktreePath: "/tmp/pr-threads", + isOnPullRequestHead: false, + }); + + expect(parsed.isOnPullRequestHead).toBe(false); + }); +}); + describe("GitResolvePullRequestResult", () => { it("decodes resolved pull request metadata", () => { const parsed = decodeResolvePullRequestResult({ diff --git a/packages/contracts/src/git.ts b/packages/contracts/src/git.ts index 915c3627c9b9a695f995d2934588ae904e80e12b..d39be34bf6e9cb654aeb7691c1ebebd87450b12e 100644 --- a/packages/contracts/src/git.ts +++ b/packages/contracts/src/git.ts @@ -1,3 +1,4 @@ +import * as Effect from "effect/Effect"; import * as Schema from "effect/Schema"; import { NonNegativeInt, PositiveInt, ThreadId, TrimmedNonEmptyString } from "./baseSchemas.ts"; import { SourceControlProviderError, SourceControlProviderInfo } from "./sourceControl.ts"; @@ -289,7 +290,7 @@ export const GitPreparePullRequestThreadResult = Schema.Struct({ * holding local commits or uncommitted changes keeps its own state, so the code being handed * over is older than the pull request. */ - isOnPullRequestHead: Schema.Boolean, + isOnPullRequestHead: Schema.Boolean.pipe(Schema.withDecodingDefaultKey(Effect.succeed(true))), }); export type GitPreparePullRequestThreadResult = typeof GitPreparePullRequestThreadResult.Type; -- 2.54.0