diff --git a/packages/opencode/src/cli/cmd/tui/context/event.ts b/packages/opencode/src/cli/cmd/tui/context/event.ts index 5d814ecdcaab..1aaac548df62 100644 --- a/packages/opencode/src/cli/cmd/tui/context/event.ts +++ b/packages/opencode/src/cli/cmd/tui/context/event.ts @@ -16,7 +16,8 @@ export function useEvent() { return } - if (event.directory === "global" || event.project === project.project()) { + const currentProject = project.project() + if (event.directory === "global" || currentProject === undefined || event.project === currentProject) { handler(event.payload, { workspace: event.workspace }) } }) diff --git a/packages/opencode/test/cli/tui/use-event.test.tsx b/packages/opencode/test/cli/tui/use-event.test.tsx index d690cfd6cec8..2c50a07e4ee4 100644 --- a/packages/opencode/test/cli/tui/use-event.test.tsx +++ b/packages/opencode/test/cli/tui/use-event.test.tsx @@ -65,7 +65,7 @@ function createSource() { } } -async function mount() { +async function mount(input: { syncProject?: boolean } = {}) { const source = createSource() const seen: Event[] = [] const workspaces: Array = [] @@ -87,7 +87,7 @@ async function mount() { { project = ctx.project - await project.sync() + if (input.syncProject !== false) await project.sync() done() }} seen={seen} @@ -178,4 +178,19 @@ describe("useEvent", () => { app.renderer.destroy() } }) + + test("delivers project events before the current project finishes loading", async () => { + const { app, emit, seen, workspaces } = await mount({ syncProject: false }) + + try { + emit(event(vcs("startup"), { directory: "/tmp/root", project: projectID, workspace: "ws_start" })) + + await wait(() => seen.length === 1) + + expect(seen).toEqual([vcs("startup")]) + expect(workspaces).toEqual(["ws_start"]) + } finally { + app.renderer.destroy() + } + }) })