From 6ff67b403dd836649411fdff8e431ad833cbe191 Mon Sep 17 00:00:00 2001 From: Sean Smith Date: Sat, 14 Mar 2026 13:30:42 -0500 Subject: [PATCH] fix(project): use case-insensitive path comparison for global session migration on Windows On Windows, directory paths are case-insensitive but migrateFromGlobal compared stored session directories against the current worktree using strict equality. When a parent directory was renamed with different casing (e.g. dtd -> DTD), sessions created under the old casing were never migrated to the correct project. Use SQL LOWER() on Windows to match directories case-insensitively, and path.normalize() to handle mixed slash directions. Preserves exact comparison on case-sensitive platforms. Relates to #17183 --- packages/opencode/src/project/project.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/opencode/src/project/project.ts b/packages/opencode/src/project/project.ts index 1cef41c85c91..3462d7e21cb4 100644 --- a/packages/opencode/src/project/project.ts +++ b/packages/opencode/src/project/project.ts @@ -1,7 +1,7 @@ import z from "zod" import { Filesystem } from "../util/filesystem" import path from "path" -import { and, Database, eq } from "../storage/db" +import { and, Database, eq, sql } from "../storage/db" import { ProjectTable } from "./project.sql" import { SessionTable } from "../session/session.sql" import { Log } from "../util/log" @@ -276,11 +276,17 @@ export namespace Project { // Runs on every startup because sessions created before git init // accumulate under "global" and need migrating whenever they appear. if (data.id !== ProjectID.global) { + // On Windows, use case-insensitive directory matching since the + // filesystem is case-insensitive and stored paths may differ in case. + const directory = + process.platform === "win32" + ? sql`LOWER(${SessionTable.directory}) = ${path.normalize(data.worktree).toLowerCase()}` + : eq(SessionTable.directory, data.worktree) Database.use((db) => db .update(SessionTable) .set({ project_id: data.id }) - .where(and(eq(SessionTable.project_id, ProjectID.global), eq(SessionTable.directory, data.worktree))) + .where(and(eq(SessionTable.project_id, ProjectID.global), directory)) .run(), ) }