From 792c85da4da56558b691dd562652520f3155e3e0 Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Fri, 31 Jul 2026 11:21:05 -0400 Subject: [PATCH] fix(core): exclude deleted projects from listing --- packages/core/src/project.ts | 2 +- packages/core/test/project.test.ts | 29 ++++++++++++++++++++++------- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/packages/core/src/project.ts b/packages/core/src/project.ts index f63ccb2569..c7eda17ddf 100644 --- a/packages/core/src/project.ts +++ b/packages/core/src/project.ts @@ -148,7 +148,7 @@ const layer = Layer.effect( .orderBy(desc(ProjectTable.time_updated), asc(ProjectTable.id)) .all() .pipe(Effect.orDie) - return rows.map(fromRow) + return yield* Effect.filter(rows.map(fromRow), (project) => fs.existsSafe(project.canonical)) }) const directories = Effect.fn("Project.directories")(function* (input: DirectoriesInput) { diff --git a/packages/core/test/project.test.ts b/packages/core/test/project.test.ts index 8cb44e0f77..cd19fc1102 100644 --- a/packages/core/test/project.test.ts +++ b/packages/core/test/project.test.ts @@ -15,8 +15,16 @@ import { testEffect } from "./lib/effect" const it = testEffect(Layer.merge(AppNodeBuilder.build(Project.node), AppNodeBuilder.build(Database.node))) describe("Project.list", () => { - it.effect("returns complete projects ordered by recent update", () => + it.live("returns existing projects ordered by recent update", () => Effect.gen(function* () { + const tmp = yield* Effect.acquireRelease( + Effect.promise(() => tmpdir()), + (tmp) => Effect.promise(() => tmp[Symbol.asyncDispose]()), + ) + const older = abs(path.join(tmp.path, "older")) + const newer = abs(path.join(tmp.path, "newer")) + const deleted = abs(path.join(tmp.path, "deleted")) + yield* Effect.promise(() => Promise.all([fs.mkdir(older), fs.mkdir(newer)])) const db = (yield* Database.Service).db const project = yield* Project.Service yield* db @@ -24,42 +32,49 @@ describe("Project.list", () => { .values([ { id: Project.ID.make("older"), - worktree: abs("/older"), + worktree: older, vcs: "git", name: "Older", icon_color: "#000000", commands: { start: "bun dev" }, - sandboxes: [abs("/older/sandbox")], + sandboxes: [abs(path.join(older, "sandbox"))], time_created: 1, time_updated: 1, }, { id: Project.ID.make("newer"), - worktree: abs("/newer"), + worktree: newer, sandboxes: [], time_created: 2, time_updated: 2, time_initialized: 3, }, + { + id: Project.ID.make("deleted"), + worktree: deleted, + sandboxes: [], + time_created: 3, + time_updated: 3, + }, ]) .run() expect(yield* project.list()).toEqual([ { id: Project.ID.make("newer"), - canonical: abs("/newer"), + canonical: newer, time: { created: 2, updated: 2, initialized: 3 }, sandboxes: [], }, { id: Project.ID.make("older"), - canonical: abs("/older"), + canonical: older, vcs: "git", name: "Older", icon: { color: "#000000" }, commands: { start: "bun dev" }, time: { created: 1, updated: 1 }, - sandboxes: [abs("/older/sandbox")], + sandboxes: [abs(path.join(older, "sandbox"))], }, ]) }),