Add task sidebar workflow

This commit is contained in:
2026-06-24 12:28:56 +01:00
parent 45263d59f8
commit d133839194
33 changed files with 1890 additions and 134 deletions
+49
View File
@@ -6,6 +6,7 @@ import (
"time"
"github.com/hjbdev/patterm/internal/preset"
"github.com/hjbdev/patterm/internal/task"
)
// makeFakeChild builds a Child with just enough state for the palette
@@ -83,6 +84,54 @@ func TestContextItemsProcess(t *testing.T) {
}
}
func TestFocusedTaskShowsTaskActions(t *testing.T) {
agent := &preset.Preset{Name: "codex", Kind: preset.KindAgent, Argv: []string{"codex"}}
taskList := []task.Task{{ID: "task_1", Title: "Fix sidebar"}}
p := newPaletteWithTasks(nil, "", "", "task_1", taskList, preset.Set{Agents: []*preset.Preset{agent}})
if got := p.focusedSubject(); got != "task: Fix sidebar" {
t.Fatalf("focused subject = %q", got)
}
if _, it := findItem(p, "task-rename-form"); it == nil || it.action.taskID != "task_1" {
t.Fatalf("task rename missing or wrong: %+v", it)
}
if _, it := findItem(p, "task-start-agent"); it == nil || it.action.taskID != "task_1" || it.action.preset != agent {
t.Fatalf("task start-agent missing or wrong: %+v", it)
}
if i, _ := findItem(p, "spawn-agent"); i < 0 {
t.Fatalf("normal unscoped spawn-agent row should remain available")
}
}
func TestTaskCreateFormSubmitsTitle(t *testing.T) {
p := newPaletteWithTasks(nil, "", "", "", []task.Task{}, preset.Set{})
idx, _ := findItem(p, "task-create-form")
if idx < 0 {
t.Fatalf("task-create-form missing")
}
p.cursor = idx
_, done, _ := p.handleInput([]byte("\r"), 0)
if done || p.mode != paletteModeRenameForm || p.renameForm == nil || p.renameForm.subject != "task-create" {
t.Fatalf("create task did not open name form: done=%v form=%+v", done, p.renameForm)
}
for _, b := range []byte("New task") {
_, _, _ = p.handleInput([]byte{b}, 0)
}
action, done, _ := p.handleInput([]byte("\r"), 0)
if !done || action.kind != "task-create-submit" || action.newName != "New task" {
t.Fatalf("submit = %+v done=%v", action, done)
}
}
func TestTaskBoundChildShowsOpenTask(t *testing.T) {
c := makeFakeChild("aid", "codex", KindAgent)
c.TaskID = "task_1"
taskList := []task.Task{{ID: "task_1", Title: "Fix sidebar"}}
p := newPaletteWithTasks([]*Child{c}, "aid", "", "", taskList, preset.Set{})
if _, it := findItem(p, "task-switch"); it == nil || it.action.taskID != "task_1" {
t.Fatalf("task-switch missing for task-bound child: %+v", it)
}
}
func TestContextItemsTerminalUsesCloseNotStop(t *testing.T) {
c := makeFakeChild("tid", "terminal", KindTerminal)
p := newPalette([]*Child{c}, "tid", "", preset.Set{})