diff --git a/products/desktop/packages/ui/src/features/command-center/components/CommandCenterPanel.tsx b/products/desktop/packages/ui/src/features/command-center/components/CommandCenterPanel.tsx
index acb9c0cc77ba..720feb13de4f 100644
--- a/products/desktop/packages/ui/src/features/command-center/components/CommandCenterPanel.tsx
+++ b/products/desktop/packages/ui/src/features/command-center/components/CommandCenterPanel.tsx
@@ -293,7 +293,10 @@ function TerminalCell({
}) {
const clearCell = useCommandCenterStore((s) => s.clearCell);
const { getRecentFolders, getFolderDisplayName } = useFolders();
- const cwd = terminalCwd ?? getRecentFolders(1)[0]?.path;
+ const defaultCwd = useSettingsStore((s) => s.terminalDefaultCwd);
+ // Cells restored from a previous session may predate the setting, so fall
+ // back to it here too rather than only at creation time.
+ const cwd = terminalCwd ?? (defaultCwd || getRecentFolders(1)[0]?.path);
const folderName = cwd ? getFolderDisplayName(cwd) : null;
const stateKey = getTerminalCellStateKey(terminalId);
diff --git a/products/desktop/packages/ui/src/features/command-center/components/TaskSelector.test.tsx b/products/desktop/packages/ui/src/features/command-center/components/TaskSelector.test.tsx
index cc3d22fd6a26..fdf926179630 100644
--- a/products/desktop/packages/ui/src/features/command-center/components/TaskSelector.test.tsx
+++ b/products/desktop/packages/ui/src/features/command-center/components/TaskSelector.test.tsx
@@ -1,7 +1,9 @@
+import { useSettingsStore } from "@posthog/ui/features/settings/settingsStore";
import { Theme } from "@radix-ui/themes";
import { render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
-import { describe, expect, it, vi } from "vitest";
+import { useState } from "react";
+import { beforeEach, describe, expect, it, vi } from "vitest";
vi.mock("@posthog/ui/features/command-center/hooks/useAvailableTasks", () => ({
useAvailableTasks: () => [],
@@ -18,21 +20,32 @@ vi.mock("@posthog/ui/features/folders/useFolders", () => ({
import { TaskSelector } from "./TaskSelector";
-function renderSelector() {
- return render(
+// Mirrors how CommandCenterPanel drives the selector: `open` is real state, so
+// the popup can actually unmount when a choice closes it.
+function ControlledSelector({
+ onNewTerminal,
+}: {
+ onNewTerminal: (cwd?: string) => void;
+}) {
+ const [open, setOpen] = useState(true);
+ return (
{}}
- onNewTerminal={() => {}}
+ open={open}
+ onOpenChange={setOpen}
+ onNewTerminal={onNewTerminal}
>
- ,
+
);
}
+function renderSelector(onNewTerminal: (cwd?: string) => void = () => {}) {
+ return render();
+}
+
function expectPopupWidth(input: HTMLElement) {
expect(input.closest(".combobox-content")).toHaveStyle({
minWidth: "240px",
@@ -40,6 +53,12 @@ function expectPopupWidth(input: HTMLElement) {
}
describe("TaskSelector", () => {
+ // Reset before rather than after: an afterEach hook runs ahead of Testing
+ // Library's auto-cleanup, so it would update a still-mounted component.
+ beforeEach(() => {
+ useSettingsStore.setState({ terminalDefaultCwd: "" });
+ });
+
it("keeps the task popup wider than its compact trigger", () => {
renderSelector();
@@ -53,4 +72,26 @@ describe("TaskSelector", () => {
expectPopupWidth(screen.getByPlaceholderText("Search folders..."));
});
+
+ it("opens the default directory instead of prompting for a folder", async () => {
+ useSettingsStore.setState({ terminalDefaultCwd: "/default" });
+ const onNewTerminal = vi.fn();
+ renderSelector(onNewTerminal);
+
+ await userEvent.click(screen.getByRole("button", { name: "Terminal" }));
+
+ expect(onNewTerminal).toHaveBeenCalledWith("/default");
+ // The popup closes outright, so neither step is left on screen.
+ expect(screen.queryByPlaceholderText("Search folders...")).toBeNull();
+ expect(screen.queryByPlaceholderText("Search tasks...")).toBeNull();
+ });
+
+ it("still offers an explicit folder choice once a default is set", async () => {
+ useSettingsStore.setState({ terminalDefaultCwd: "/default" });
+ renderSelector();
+
+ await userEvent.click(screen.getByRole("button", { name: "Terminal in…" }));
+
+ expect(screen.getByPlaceholderText("Search folders...")).toBeVisible();
+ });
});
diff --git a/products/desktop/packages/ui/src/features/command-center/components/TaskSelector.tsx b/products/desktop/packages/ui/src/features/command-center/components/TaskSelector.tsx
index 456dc5e6b8b5..7a0650c21b44 100644
--- a/products/desktop/packages/ui/src/features/command-center/components/TaskSelector.tsx
+++ b/products/desktop/packages/ui/src/features/command-center/components/TaskSelector.tsx
@@ -10,6 +10,7 @@ import { Popover } from "@radix-ui/themes";
import { type ReactNode, useCallback, useState } from "react";
import { Combobox } from "../../../primitives/combobox/Combobox";
import { useFolders } from "../../folders/useFolders";
+import { useSettingsStore } from "../../settings/settingsStore";
import { useCommandCenterStore } from "../commandCenterStore";
import { useAvailableTasks } from "../hooks/useAvailableTasks";
@@ -39,6 +40,7 @@ export function TaskSelector({
const assignTask = useCommandCenterStore((s) => s.assignTask);
const { getRecentFolders } = useFolders();
const folders = getRecentFolders();
+ const defaultCwd = useSettingsStore((s) => s.terminalDefaultCwd);
const [step, setStep] = useState<"tasks" | "folder">("tasks");
const handleOpenChange = useCallback(
@@ -70,14 +72,21 @@ export function TaskSelector({
}
}, [handleOpenChange, onNewTask]);
+ // A configured default wins outright: no folder prompt, even with several
+ // folders registered. "Terminal in…" below stays as the one-off escape hatch.
const handleNewTerminal = useCallback(() => {
+ if (defaultCwd) {
+ handleOpenChange(false);
+ onNewTerminal?.(defaultCwd);
+ return;
+ }
if (folders.length > 1) {
setStep("folder");
return;
}
handleOpenChange(false);
onNewTerminal?.(folders[0]?.path);
- }, [folders, handleOpenChange, onNewTerminal]);
+ }, [defaultCwd, folders, handleOpenChange, onNewTerminal]);
const handleBrainrot = useCallback(() => {
handleOpenChange(false);
@@ -177,6 +186,16 @@ export function TaskSelector({
Terminal
)}
+ {onNewTerminal && defaultCwd && folders.length > 0 && (
+
+ )}
{onBrainrot && (