fix: update task search to show global history across all workspaces

- Remove workspace filtering in useTaskSearch hook to show all tasks
- Update tests to reflect global task history behavior
- Fix test expectations for sorting across multiple workspaces
- Remove unused cwd variable
This commit is contained in:
hannesrudolph 2025-07-01 15:20:13 -06:00
parent 9fe17a4be3
commit d8d4c37510
3 changed files with 23 additions and 16 deletions

View file

@ -191,7 +191,7 @@ describe("Cline", () => {
mockExtensionContext = {
globalState: {
get: vi.fn().mockImplementation((key: keyof GlobalState) => {
get: vi.fn().mockImplementation((key: string) => {
if (key === "taskHistory") {
return [
{

View file

@ -63,16 +63,19 @@ describe("useTaskSearch", () => {
it("returns all tasks by default", () => {
const { result } = renderHook(() => useTaskSearch())
expect(result.current.tasks).toHaveLength(2) // Only tasks from current workspace
expect(result.current.tasks).toHaveLength(3) // All tasks from all workspaces
expect(result.current.tasks[0].id).toBe("task-2") // Newest first
expect(result.current.tasks[1].id).toBe("task-1")
expect(result.current.tasks[2].id).toBe("task-3")
})
it("filters tasks by current workspace by default", () => {
it("shows tasks from all workspaces", () => {
const { result } = renderHook(() => useTaskSearch())
expect(result.current.tasks).toHaveLength(2)
expect(result.current.tasks.every((task) => task.workspace === "/workspace/project1")).toBe(true)
expect(result.current.tasks).toHaveLength(3)
const workspaces = result.current.tasks.map((task) => task.workspace)
expect(workspaces).toContain("/workspace/project1")
expect(workspaces).toContain("/workspace/project2")
})
it("sorts by newest by default", () => {
@ -90,8 +93,9 @@ describe("useTaskSearch", () => {
result.current.setSortOption("oldest")
})
expect(result.current.tasks[0].id).toBe("task-1") // Feb 16
expect(result.current.tasks[1].id).toBe("task-2") // Feb 17
expect(result.current.tasks[0].id).toBe("task-3") // Feb 15
expect(result.current.tasks[1].id).toBe("task-1") // Feb 16
expect(result.current.tasks[2].id).toBe("task-2") // Feb 17
})
it("sorts by most expensive", () => {
@ -101,8 +105,9 @@ describe("useTaskSearch", () => {
result.current.setSortOption("mostExpensive")
})
expect(result.current.tasks[0].id).toBe("task-2") // $0.02
expect(result.current.tasks[1].id).toBe("task-1") // $0.01
expect(result.current.tasks[0].id).toBe("task-3") // $0.05
expect(result.current.tasks[1].id).toBe("task-2") // $0.02
expect(result.current.tasks[2].id).toBe("task-1") // $0.01
})
it("sorts by most tokens", () => {
@ -113,9 +118,11 @@ describe("useTaskSearch", () => {
})
// task-2: 200 + 100 + 25 + 10 = 335 tokens
// task-3: 150 + 75 = 225 tokens
// task-1: 100 + 50 = 150 tokens
expect(result.current.tasks[0].id).toBe("task-2")
expect(result.current.tasks[1].id).toBe("task-1")
expect(result.current.tasks[1].id).toBe("task-3")
expect(result.current.tasks[2].id).toBe("task-1")
})
it("filters tasks by search query", () => {
@ -227,8 +234,8 @@ describe("useTaskSearch", () => {
const { result } = renderHook(() => useTaskSearch())
// Should only include tasks with both ts and task content from current workspace
expect(result.current.tasks).toHaveLength(2)
// Should only include tasks with both ts and task content from all workspaces
expect(result.current.tasks).toHaveLength(3)
expect(result.current.tasks.every((task) => task.ts && task.task)).toBe(true)
})

View file

@ -7,7 +7,7 @@ import { useExtensionState } from "@/context/ExtensionStateContext"
type SortOption = "newest" | "oldest" | "mostExpensive" | "mostTokens" | "mostRelevant"
export const useTaskSearch = () => {
const { taskHistory, cwd } = useExtensionState()
const { taskHistory } = useExtensionState()
const [searchQuery, setSearchQuery] = useState("")
const [sortOption, setSortOption] = useState<SortOption>("newest")
const [lastNonRelevantSort, setLastNonRelevantSort] = useState<SortOption | null>("newest")
@ -23,10 +23,10 @@ export const useTaskSearch = () => {
}, [searchQuery, sortOption, lastNonRelevantSort])
const presentableTasks = useMemo(() => {
// Filter tasks by current workspace and ensure they have required fields
const tasks = taskHistory.filter((item) => item.ts && item.task && item.workspace === cwd)
// Ensure tasks have required fields (no workspace filtering for global history)
const tasks = taskHistory.filter((item) => item.ts && item.task)
return tasks
}, [taskHistory, cwd])
}, [taskHistory])
const fzf = useMemo(() => {
return new Fzf(presentableTasks, {