Compare commits

...
3 Commits
3 changed files with 33 additions and 5 deletions
@@ -6,13 +6,24 @@ import { EMPTY_SESSION_TAB_STATUS, SessionTabs, type SessionTabsController } fro
import { closeSessionTab, cycleSessionTab, moveSessionTab } from "../../../context/session-tabs-model"
import { StoryFooter } from "./footer"
import type { Story } from "./index"
import { projectName } from "../../../util/project"
type FixtureStatus = ReturnType<SessionTabsController["status"]>
const FIXTURE_TABS = [
{ sessionID: "fixture-1", title: "Implement session tabs", project: "opencode" },
{ sessionID: "fixture-2", title: "Investigate rendering", project: "opencode" },
{ sessionID: "fixture-3", title: "A deliberately long session title for truncation", project: "opencode-slack" },
{
sessionID: "fixture-2",
title: "Investigate rendering",
canonical: "C:\\",
directory: "C:\\Users\\demo\\Desktop\\Prabha",
},
{
sessionID: "fixture-3",
title: "A deliberately long session title for truncation",
canonical: "D:\\",
directory: "D:\\work\\notes",
},
{ sessionID: "fixture-4", title: "Fix provider state", project: "opencode" },
{ sessionID: "fixture-5", title: "Review animation", project: "opencode-slack" },
{ sessionID: "fixture-6", title: "Untitled behavior", project: "opencode-drive" },
@@ -98,7 +109,10 @@ function SessionTabsStory(props: { context: Plugin.Context }) {
current: active,
add: addTab,
detail(sessionID) {
return FIXTURE_TABS.find((tab) => tab.sessionID === sessionID)?.project
const tab = FIXTURE_TABS.find((tab) => tab.sessionID === sessionID)
if (!tab) return
if ("project" in tab) return tab.project
return projectName({ canonical: tab.canonical }, tab.directory)
},
status(sessionID) {
return statuses()[sessionID] ?? EMPTY_SESSION_TAB_STATUS
+3 -2
View File
@@ -2,6 +2,7 @@ import path from "path"
export function projectName(project?: { canonical: string; name?: string }, fallback = "") {
const canonical = project?.canonical ?? fallback
if (canonical === "/") return fallback ? path.basename(fallback) : undefined
return project?.name || path.basename(canonical)
const paths = /^(?:[a-z]:[\\/]|\\\\)/i.test(canonical) ? path.win32 : path.posix
if (paths.parse(canonical).root === canonical) return fallback ? paths.basename(fallback) : undefined
return project?.name || paths.basename(canonical)
}
+13
View File
@@ -0,0 +1,13 @@
import { describe, expect, test } from "bun:test"
import { projectName } from "../../src/util/project"
describe("projectName", () => {
test("falls back to the folder name for filesystem-root projects", () => {
expect(projectName({ canonical: "/" }, "/home/user/Prabha")).toBe("Prabha")
expect(projectName({ canonical: "C:\\" }, "C:\\Users\\user\\Desktop\\Prabha")).toBe("Prabha")
})
test("preserves backslashes in POSIX folder names", () => {
expect(projectName({ canonical: "/tmp/foo\\bar" })).toBe("foo\\bar")
})
})