From d1191675c68d8995333fc4300b11d09e87d711d2 Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Sun, 4 Jan 2026 20:32:34 -0600 Subject: fix(app): worktree selection should navigate to worktree --- packages/app/src/context/layout.tsx | 48 +++++++++++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 7 deletions(-) (limited to 'packages/app/src/context') diff --git a/packages/app/src/context/layout.tsx b/packages/app/src/context/layout.tsx index 5836365ba..e454f6cfa 100644 --- a/packages/app/src/context/layout.tsx +++ b/packages/app/src/context/layout.tsx @@ -1,5 +1,5 @@ import { createStore, produce } from "solid-js/store" -import { batch, createMemo, onMount } from "solid-js" +import { batch, createEffect, createMemo, onMount } from "solid-js" import { createSimpleContext } from "@opencode-ai/ui/context" import { useGlobalSync } from "./global-sync" import { useGlobalSDK } from "./global-sdk" @@ -91,8 +91,8 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext( : globalSync.data.project.find((x) => x.worktree === project.worktree) return [ { - ...project, ...(metadata ?? {}), + ...project, icon: { url: metadata?.icon?.url, color: metadata?.icon?.color }, }, ] @@ -109,6 +109,41 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext( return project } + const roots = createMemo(() => { + const map = new Map() + for (const project of globalSync.data.project) { + const sandboxes = project.sandboxes ?? [] + for (const sandbox of sandboxes) { + map.set(sandbox, project.worktree) + } + } + return map + }) + + createEffect(() => { + const map = roots() + if (map.size === 0) return + + const projects = server.projects.list() + const seen = new Set(projects.map((project) => project.worktree)) + + batch(() => { + for (const project of projects) { + const root = map.get(project.worktree) + if (!root) continue + + server.projects.close(project.worktree) + + if (!seen.has(root)) { + server.projects.open(root) + seen.add(root) + } + + if (project.expanded) server.projects.expand(root) + } + }) + }) + const enriched = createMemo(() => server.projects.list().flatMap(enrich)) const list = createMemo(() => enriched().flatMap(colorize)) @@ -125,11 +160,10 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext( projects: { list, open(directory: string) { - if (server.projects.list().find((x) => x.worktree === directory)) { - return - } - globalSync.project.loadSessions(directory) - server.projects.open(directory) + const root = roots().get(directory) ?? directory + if (server.projects.list().find((x) => x.worktree === root)) return + globalSync.project.loadSessions(root) + server.projects.open(root) }, close(directory: string) { server.projects.close(directory) -- cgit v1.2.3