From 3355c93efdb5b5c69873d81eec0a93fa849d385e Mon Sep 17 00:00:00 2001 From: Luke Parker <10430890+Hona@users.noreply.github.com> Date: Fri, 18 Sep 2026 14:12:18 +1000 Subject: [PATCH] fix(app): create local sessions in project root (#49668) --- .../regression/new-session-summary.spec.ts | 26 ++++++++++++++----- .../app/src/new-session/composer-adapter.ts | 3 ++- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/packages/app/e2e/regression/new-session-summary.spec.ts b/packages/app/e2e/regression/new-session-summary.spec.ts index d5196374e4d..f2c6d49d7bc 100644 --- a/packages/app/e2e/regression/new-session-summary.spec.ts +++ b/packages/app/e2e/regression/new-session-summary.spec.ts @@ -108,6 +108,15 @@ test("non-Git folders show their status without offering worktree actions", asyn ).toBeEnabled() }) +test("submits locally after changing a new worktree draft to Local", async ({ page }) => { + const mock = await openDraft(page, "create", { currentDirectory: workspace }) + await page.getByRole("button", { name: "New worktree", exact: true }).click() + await page.getByRole("menuitem", { name: "Local repository", exact: true }).click() + await page.locator('[data-component="composer-editor"]').fill("Run locally") + await page.locator('[data-action="composer-submit"]').click() + await expect.poll(() => mock.calls.find((call) => call.type === "session")?.directory).toBe(directory) +}) + test("new worktree MCP choices persist per draft and apply before the first prompt", async ({ page }, testInfo) => { const mock = await openDraft(page, "create") await page.locator('[data-component="composer-editor"]').fill("Use my selected MCPs") @@ -296,7 +305,12 @@ test("new worktree sign-in completes before the draft can send", async ({ page, expect(attempts).toHaveLength(1) }) -async function openDraft(page: Page, worktree = "main", options: { git?: boolean; direction?: "ltr" | "rtl" } = {}) { +async function openDraft( + page: Page, + worktree = "main", + options: { git?: boolean; direction?: "ltr" | "rtl"; currentDirectory?: string } = {}, +) { + const currentDirectory = options.currentDirectory ?? directory const project = { id: "proj_new_summary", worktree: directory, @@ -315,7 +329,7 @@ async function openDraft(page: Page, worktree = "main", options: { git?: boolean const prompts: { sessionID: string; body: Record }[] = [] const state: { fail: boolean; hold?: Promise; holdDirectory?: string } = { fail: false } await mockOpenCodeServer(page, { - directory, + directory: currentDirectory, project, sessions, provider: { @@ -442,7 +456,7 @@ async function openDraft(page: Page, worktree = "main", options: { git?: boolean }, ) await page.addInitScript( - ({ directory, server, draftID, secondDraftID, worktree }) => { + ({ directory, currentDirectory, server, draftID, secondDraftID, worktree }) => { if (!localStorage.getItem("opencode.global.dat:server")) localStorage.setItem( "opencode.global.dat:server", @@ -455,12 +469,12 @@ async function openDraft(page: Page, worktree = "main", options: { git?: boolean localStorage.setItem( "opencode.window.browser.dat:tabs", JSON.stringify([ - { type: "draft", draftID, server, directory, worktree }, - { type: "draft", draftID: secondDraftID, server, directory, worktree }, + { type: "draft", draftID, server, directory: currentDirectory, worktree }, + { type: "draft", draftID: secondDraftID, server, directory: currentDirectory, worktree }, ]), ) }, - { directory, server, draftID, secondDraftID, worktree }, + { directory, currentDirectory, server, draftID, secondDraftID, worktree }, ) if (options.direction) await openWithDirection(page, draftPath, options.direction) if (!options.direction) await page.goto(draftPath) diff --git a/packages/app/src/new-session/composer-adapter.ts b/packages/app/src/new-session/composer-adapter.ts index 336f2e535de..0961cbcae77 100644 --- a/packages/app/src/new-session/composer-adapter.ts +++ b/packages/app/src/new-session/composer-adapter.ts @@ -48,7 +48,8 @@ export function createNewSessionComposerAdapter(props: { submitted: props.submitted, async start(selection, submission, message) { const draftID = props.draftID - const projectDirectory = location().directory + const currentDirectory = location().directory + const projectDirectory = data.location.info({ directory: currentDirectory })?.project.canonical ?? currentDirectory const worktree = props.worktree() const branch = props.branch() const mcp = props.mcp.capture()