feat(tui): show project copy in session list (#31421)

This commit is contained in:
James Long 2026-06-09 12:10:37 -04:00 committed by GitHub
commit ffcb45d7c9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 59 additions and 37 deletions

View file

@ -36,7 +36,12 @@ export const DirectoriesInput = Schema.Struct({
}).annotate({ identifier: "Project.DirectoriesInput" })
export type DirectoriesInput = typeof DirectoriesInput.Type
export const Directories = Schema.Array(AbsolutePath).annotate({ identifier: "Project.Directories" })
export const Directories = Schema.Array(
Schema.Struct({
directory: AbsolutePath,
type: Schema.Literals(["main", "root", "git_worktree"]),
}),
).annotate({ identifier: "Project.Directories" })
export type Directories = typeof Directories.Type
export interface Interface {
@ -73,13 +78,13 @@ export const layer = Layer.effect(
const directories = Effect.fn("Project.directories")(function* (input: DirectoriesInput) {
const rows = yield* db
.select({ directory: ProjectDirectoryTable.directory })
.select({ directory: ProjectDirectoryTable.directory, type: ProjectDirectoryTable.type })
.from(ProjectDirectoryTable)
.where(eq(ProjectDirectoryTable.project_id, input.projectID))
.orderBy(desc(ProjectDirectoryTable.time_created), asc(ProjectDirectoryTable.directory))
.all()
.pipe(Effect.orDie)
return rows.map((row) => AbsolutePath.make(row.directory))
return rows.map((row) => ({ directory: AbsolutePath.make(row.directory), type: row.type }))
})
const cached = Effect.fnUntraced(function* (dir: string) {

View file

@ -59,9 +59,11 @@ describe("Project directories schemas", () => {
projectID: ProjectV2.ID.make("project"),
},
)
expect(Schema.decodeUnknownSync(ProjectV2.Directories)([AbsolutePath.make("/tmp/project")])).toEqual([
AbsolutePath.make("/tmp/project"),
])
expect(
Schema.decodeUnknownSync(ProjectV2.Directories)([
{ directory: AbsolutePath.make("/tmp/project"), type: "main" },
]),
).toEqual([{ directory: AbsolutePath.make("/tmp/project"), type: "main" }])
}),
)
@ -90,8 +92,8 @@ describe("Project directories schemas", () => {
.pipe(Effect.orDie)
expect(yield* project.directories({ projectID })).toEqual([
AbsolutePath.make("/repo/z"),
AbsolutePath.make("/repo/a"),
{ directory: AbsolutePath.make("/repo/z"), type: "root" },
{ directory: AbsolutePath.make("/repo/a"), type: "main" },
])
}),
)