Repository navigation
feat(tasks): Tasks screen becomes a Specs-style list with Play - #176
Merged
Merged
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
buildListModel splits tasks into scope sections, spec groups (revealed on demand), the done window and segment counts, the way specs/filterModel.js does for the Specs grid. Not wired yet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The prompt builder moves to the pure tasks/runPrompt.js. A task missing its description or acceptance criteria now opens with a step that has the agent write them and confirm the criteria before starting; a ready task's prompt is the old one plus its criteria. Every Play surface shares it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A non-blank userRequest is saved exactly as typed. Tests also pin that reorderTasks with id-only entries leaves every status untouched. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Kanban columns and drag-and-drop are gone. The screen takes the Specs shell: All / Active / Done segments with counts, In progress / Pending / Completed sections of tiles from the list model, and the older-done ghost tile. Filter and Sort move to the toolbar; Permanent Save sends ids only, so a sort can never change a status, and spec tasks keep their slots. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Play opens the shared run flow; the task turns in progress only after the dispatch succeeds. A non-spec task's drawer offers Play / Mark complete / Back to pending / Reopen by status. Spec tasks get none of them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A "Spec tasks n" chip reveals them in their own section, grouped by spec with an Open spec link. Their tiles and drawer are read-only: no Play, no status action, no Delete. The reveal resets with the project. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The form's Description becomes Request, saved verbatim as userRequest; Play has the agent write the description and acceptance criteria. Tiles show the request until a description exists. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The texts that described the Kanban now describe the grid, Play on a pending task, and spec tasks hidden until revealed. Spec closed with its digest. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Spec tasks join the status sections behind an "Include spec tasks" checkbox (D4 overturned), and Active gets In progress / Pending chips (D18). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Spec tasks chip and its section at the bottom give way to an "Include spec tasks" checkbox; included spec tasks sit in In progress, Pending and Completed with the others, labelled <slug> · T##, still without Play. Overturns D4 of the tasks-list-view plan. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
While Active is picked, two chips after the scope segments narrow the list to one section, the Specs phase-chip pattern: one at a time, a second click clears it, any scope pick resets it. Spec phase back to done; digest covers T09 and T10. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A long spec slug squeezed the tile foot: the date wrapped and the T number was cut. The slug now truncates on its own, the number and the date keep their width, and the badge row opens with a SPEC chip. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Outside a Frame terminal (or project) the session report hook exits without reading stdin, so the test's write of the payload races the child's exit; when sh wins, execFileSync throws EPIPE. It failed this way on CI's Ubuntu runner. The two no-op runs now go through spawnSync and assert exit 0 and nothing written, treating EPIPE as expected. Forcing the race with a 1 MB payload fails the old tests and passes these. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this adds
The Tasks screen stops being a three-column Kanban and takes the Specs screen's shape: All / Active / Done segments with counts, tiles in the Specs grid, and In progress above Pending. A pending task gets a Play button, and a task's drawer gets status actions. Nothing on the screen is draggable any more.
userRequest), priority, categoryWhy
source: spec:<slug>:T##) sat on the same board with nothing to set them apart. A spec's phase is derived from its tasks, so dropping a spec's last open card in Completed marked the specdonewith no implement run. Dragging one back out reopened a done spec. In this repo, 530 of 639 tasks are spec tasks.REORDER_TASKSwith the status of every card in every column, hidden ones included.tasks.jsonschema, but the New Task form wrote only a title and a description. Play's prompt carried only the title and description, so the agent never learned what "done" meant. 13 of this repo's 55 open hand-made tasks have no acceptance criteria.Design decisions worth reviewing
.specs-card, the older-done ghost tile).<slug> · T##label.descriptionoracceptanceCriteria, the prompt first asks the agent to write them intotasks.json, show the criteria and wait for confirmation.tasksPanel.openRunFlow. The builder moved into the puresrc/renderer/tasks/runPrompt.js, so all three get the same prompt. The rejected alternative, a Tasks-only prompt, would mean two prompt paths that drift.REORDER_TASKS { order: [{ id }] }.reorderTasksalready keeps a task's status when an entry has none, so a sort can never move a task between statuses. Spec tasks keep their slots in the file, so a spec's T01…Tn order survives.src/renderer/tasks/listModel.jsdecides what the grid lists andsrc/renderer/tasks/runPrompt.jsbuilds the prompt, mirroringspecs/filterModel.js.tasksPanel.jsrequireselectron, so the prompt builder could not be tested where it was.Before merging — things for the maintainer
tasks.md.userRequestinstead, anddescriptionstays empty until Play fills it. The retired side panel's own task modal still has Description; it is out of scope here.tasksManager.addTasknow keeps a non-blankuserRequest. Before, it dropped the field..frame/tasks.jsoncarries this spec's 10 imported tasks, and.frame/STRUCTURE.jsonis regenerated. Ifmainhas moved in either file, expect a conflict there; keeping both sides is correct.docs/capabilities/index.html, plus its diagram label "kanban state" became "task statuses".Testing
npm test: 1309 pass, 0 fail (1292 onmain).test/tasksListModel.test.jscovers each scope's sections, spec tasks hidden and included, the done window, filter, sort and status chips. It also sweeps every scope and status chip to check that each count equals what that control lists.test/taskRunPrompt.test.jschecks readiness and the spec-task exemption, and the format step's presence and order. It pins a ready task's prompt against a verbatim copy of the old builder: the old prompt plus the criteria line.test/tasksManager.test.jscoversaddTaskwith and withoutuserRequest. It also checks thatreorderTaskswith id-only entries leaves status,updatedAtandcompletedAtuntouched.npm run buildpasses.tasksDashboard.js, markup, CSS), because the repo has no DOM harness. I checked it by loading the realindex.htmlmarkup, CSS and module into a scratch Electron window with fixture tasks. I clicked through the scope segments, the status chips and the "Include spec tasks" checkbox, checked counts, Play placement and the drawer actions, and checked the IPC messages the screen sends.openRunFlow, unchanged apart from the prompt text.