diff options
| author | t <t@tjp.lol> | 2026-09-02 09:30:11 -0600 |
|---|---|---|
| committer | t <t@tjp.lol> | 2026-09-02 09:30:55 -0600 |
| commit | fd2b3dfd85d8d87716481425216abc5e8cdd9c1b (patch) | |
| tree | 25c9dc386150d963c39e6883803f69a4b2d6bcd3 | |
| parent | 997d80bc69a6363e8c65a987dace0e30d761522d (diff) | |
Sort completed subagents above active ones
| -rw-r--r-- | spec/test_progress.lua | 21 | ||||
| -rw-r--r-- | subagents/progress.lua | 12 |
2 files changed, 33 insertions, 0 deletions
diff --git a/spec/test_progress.lua b/spec/test_progress.lua index 3c1ea33..79570c1 100644 --- a/spec/test_progress.lua +++ b/spec/test_progress.lua @@ -204,6 +204,27 @@ return { progress.reset() end }, + { "finished cards sort above running cards in creation order", function() + progress.reset() + local component = board("call-sorting", true) + local alpha = progress.card("alpha", "a") + local beta = progress.card("beta", "b") + local gamma = progress.card("gamma", "c") + local delta = progress.card("delta", "d") + + gamma:done("completed") + alpha:done("completed") + delta:done("failed", "boom") + + local text = plain(component:render(80)) + local alpha_at = assert(text:find("alpha", 1, true)) + local gamma_at = assert(text:find("gamma", 1, true)) + local delta_at = assert(text:find("delta", 1, true)) + local beta_at = assert(text:find("beta", 1, true)) + assert(alpha_at < gamma_at and gamma_at < delta_at and delta_at < beta_at, text) + progress.reset() + end }, + { "Ctrl+O state expands and recollapses every existing board", function() progress.reset() local first = board("call-a", true) diff --git a/subagents/progress.lua b/subagents/progress.lua index 7cad2fa..fc86935 100644 --- a/subagents/progress.lua +++ b/subagents/progress.lua @@ -202,9 +202,21 @@ function card_mt:event(event) repaint(self) end +local function sort_cards(board) + local positions = {} + for index, card in ipairs(board.cards) do positions[card] = index end + table.sort(board.cards, function(a, b) + local a_done, b_done = a.status ~= "running", b.status ~= "running" + if a_done ~= b_done then return a_done end + if a.sequence ~= b.sequence then return a.sequence < b.sequence end + return positions[a] < positions[b] + end) +end + function card_mt:done(status, message) self.status = GLYPHS[status] and status or "failed" if self.status ~= "completed" then marker(self, message) else self.partial = false end + if self.board then sort_cards(self.board) end repaint(self) end |
