Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ See what needs attention, resume the right conversation, and work on a paired PC

</div>

> **1.48.0** makes DevDeck lighter at rest — a quiet terminal is no longer re-scanned every second, the process listing that detects a tile's agent runs only after that tile printed something, git is re-read every two minutes for tiles you are not looking at, and the background-session listing slows to a minute when the group is empty and two when the window is not focused ([release notes](docs/releases/1.48.0.md)). 1.47.1 makes closing a Claude Code background session from the sidebar work when Claude Code's background service is not running — DevDeck starts it as Claude Code does and tries again, and a failure names the PC the command has to run on ([release notes](docs/releases/1.47.1.md)). 1.47.0 moves to Electron 44 (Chromium 152, Node.js 24); macOS 13 or later is now required, and screenshot paste / image copy use Electron's new clipboard API ([release notes](docs/releases/1.47.0.md)). 1.46.0 lets you close Claude Code's background sessions from the sidebar — the row's ⋯ menu or the group's bulk close runs `claude stop` and `claude rm` for you, so a finished or failed session no longer sits in the Background group forever; its conversation is kept ([release notes](docs/releases/1.46.0.md)). 1.45.2 stops an update from doubling the sessions on a paired PC — the relaunch no longer restores remote tiles itself, it adopts them from that PC, and no restore starts a second conversation for one that is already open here ([release notes](docs/releases/1.45.2.md)). 1.45.1 stops offering Claude background sessions whose folder was deleted, and says so plainly when a session's folder is gone ([release notes](docs/releases/1.45.1.md)). 1.45.0 sends any file to a session on another PC — any kind, up to 4 GB, in pieces with its progress shown ([release notes](docs/releases/1.45.0.md)). 1.44.1 fixes the "Assertion failed: remove_pty_baton" dialog (and the occasional hang or crash) when quitting or running Update all with several sessions open ([release notes](docs/releases/1.44.1.md)). 1.44.0 lists Claude Code's own background sessions (`claude --bg`, the agent view) in the sidebar, marks the ones waiting for you, and opens one in a tile by attaching to it ([release notes](docs/releases/1.44.0.md)). 1.43.0 runs parallel sessions in separate workspaces — each in its own git worktree and branch, so two agents never edit the same files — with its changes in the header and a clean-up that warns before unmerged work is lost ([release notes](docs/releases/1.43.0.md)). 1.42.0 shows what changed — a What's new window after each update, with Show me, and NEW dots on new buttons until you try them — and, as an experimental setting on Windows, lets Claude Code report its own state (working, needs approval, asking, done) instead of DevDeck reading the screen ([release notes](docs/releases/1.42.0.md)). 1.41.0 adds quick replies (one click or Ctrl+Shift+1…9 for the phrases you keep typing), a session timeline of your prompts with their times, replies and images, red boxes and arrows drawn on a screenshot and sent straight back to the session, and text, log and PDF attachments for sessions on another PC ([release notes](docs/releases/1.41.0.md)). 1.40.0 ties each screenshot to the terminal row it appeared on — hover a highlighted `[Image]` for a thumbnail, click for the full view, and jump from the viewer back to the row — says what led to each image, previews new screenshots, copies images, and adds Ctrl+↑/↓ between your prompts ([release notes](docs/releases/1.40.0.md)). 1.39.0 shows the screenshots and images a Claude session worked with — Claude Desktop shows them inline; DevDeck puts them in a strip beside the terminal, also for sessions on another PC — adds 📎 / drag-and-drop attachments (images travel to a remote PC), **Update all** for Claude Code on Windows, staggered session restores that no longer stall a PC, and ends the daily false "Login expired" ([release notes](docs/releases/1.39.0.md)). 1.38.0 made closing a session reliable across paired PCs ([notes](docs/releases/1.38.0.md)). See [the maintenance review](docs/quality-review-2026-09-08.md) and [session synchronization review](docs/session-sync-review-2026-09-08.md).
> **1.49.0** closes several sessions at once — a Select button above the sidebar's session groups (and Select… in every row's ⋯ menu) turns on a selection mode with checkboxes on rows and group headings; local, remote, background and saved rows close after one question that says what is on which PC, a tile attached to a Claude background session can end the session too, and the Background listing no longer starts a Claude Code process when its job records have not changed. Also fixes from a review of the sidebar and close flows: a confirmation that an unrelated Enter could answer, a row's ⋯ menu clipped on short lists, keyboard focus lost when rows reorder, Undo for forgetting a saved entry, one notice instead of a stack for bulk flows ([release notes](docs/releases/1.49.0.md)). 1.48.0 makes DevDeck lighter at rest — a quiet terminal is no longer re-scanned every second, the process listing that detects a tile's agent runs only after that tile printed something, git is re-read every two minutes for tiles you are not looking at, and the background-session listing slows to a minute when the group is empty and two when the window is not focused ([release notes](docs/releases/1.48.0.md)). 1.47.1 makes closing a Claude Code background session from the sidebar work when Claude Code's background service is not running — DevDeck starts it as Claude Code does and tries again, and a failure names the PC the command has to run on ([release notes](docs/releases/1.47.1.md)). 1.47.0 moves to Electron 44 (Chromium 152, Node.js 24); macOS 13 or later is now required, and screenshot paste / image copy use Electron's new clipboard API ([release notes](docs/releases/1.47.0.md)). 1.46.0 lets you close Claude Code's background sessions from the sidebar — the row's ⋯ menu or the group's bulk close runs `claude stop` and `claude rm` for you, so a finished or failed session no longer sits in the Background group forever; its conversation is kept ([release notes](docs/releases/1.46.0.md)). 1.45.2 stops an update from doubling the sessions on a paired PC — the relaunch no longer restores remote tiles itself, it adopts them from that PC, and no restore starts a second conversation for one that is already open here ([release notes](docs/releases/1.45.2.md)). 1.45.1 stops offering Claude background sessions whose folder was deleted, and says so plainly when a session's folder is gone ([release notes](docs/releases/1.45.1.md)). 1.45.0 sends any file to a session on another PC — any kind, up to 4 GB, in pieces with its progress shown ([release notes](docs/releases/1.45.0.md)). 1.44.1 fixes the "Assertion failed: remove_pty_baton" dialog (and the occasional hang or crash) when quitting or running Update all with several sessions open ([release notes](docs/releases/1.44.1.md)). 1.44.0 lists Claude Code's own background sessions (`claude --bg`, the agent view) in the sidebar, marks the ones waiting for you, and opens one in a tile by attaching to it ([release notes](docs/releases/1.44.0.md)). 1.43.0 runs parallel sessions in separate workspaces — each in its own git worktree and branch, so two agents never edit the same files — with its changes in the header and a clean-up that warns before unmerged work is lost ([release notes](docs/releases/1.43.0.md)). 1.42.0 shows what changed — a What's new window after each update, with Show me, and NEW dots on new buttons until you try them — and, as an experimental setting on Windows, lets Claude Code report its own state (working, needs approval, asking, done) instead of DevDeck reading the screen ([release notes](docs/releases/1.42.0.md)). 1.41.0 adds quick replies (one click or Ctrl+Shift+1…9 for the phrases you keep typing), a session timeline of your prompts with their times, replies and images, red boxes and arrows drawn on a screenshot and sent straight back to the session, and text, log and PDF attachments for sessions on another PC ([release notes](docs/releases/1.41.0.md)). 1.40.0 ties each screenshot to the terminal row it appeared on — hover a highlighted `[Image]` for a thumbnail, click for the full view, and jump from the viewer back to the row — says what led to each image, previews new screenshots, copies images, and adds Ctrl+↑/↓ between your prompts ([release notes](docs/releases/1.40.0.md)). 1.39.0 shows the screenshots and images a Claude session worked with — Claude Desktop shows them inline; DevDeck puts them in a strip beside the terminal, also for sessions on another PC — adds 📎 / drag-and-drop attachments (images travel to a remote PC), **Update all** for Claude Code on Windows, staggered session restores that no longer stall a PC, and ends the daily false "Login expired" ([release notes](docs/releases/1.39.0.md)). 1.38.0 made closing a session reliable across paired PCs ([notes](docs/releases/1.38.0.md)). See [the maintenance review](docs/quality-review-2026-09-08.md) and [session synchronization review](docs/session-sync-review-2026-09-08.md).

<div align="center">
<img src="docs/screenshots/projects.png" width="820" alt="DevDeck project overview with repository and session navigation" />
Expand Down
29 changes: 29 additions & 0 deletions docs/releases/1.49.0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# DevDeck 1.49.0

## Close several sessions at once

The sidebar could already close a hand-picked set of sessions — after a Ctrl+click that nothing on screen mentioned. So most decks were closed one row at a time, and a deck of twenty sessions stayed a deck of twenty sessions.

- **A Select button above the session groups** turns on a selection mode. Every row shows a checkbox, a plain click picks a row instead of opening it, the box on a group heading picks the whole group (opening it in full first, so nothing is picked that cannot be seen), Shift+click picks a range, and **Select all** opens every group and picks everything. **Close** closes the picked rows after one question; **Done** or Esc leaves the mode; Delete closes the picked rows from the keyboard. Every row's ⋯ menu also has **Select…**, which picks that row and starts the mode. Ctrl+click and Shift+click work as before, in and out of the mode.
- **Local, remote, background and saved rows mix freely**, and the one question says what the set holds — *2 on this PC · 3 on SIHYEONG-4080 · 1 background · 4 saved* — because a close on another PC stops an agent in front of someone else. The tiles go in one batch and the pane settles once at the end (it used to re-select and re-render after each one, a visible stall for a dozen). Closes on other PCs answer later; a group of refusals or owed closes is one line, not a stack. Background sessions close with one progress line and one summary, machines side by side and one after another within a machine, so the first refusal starts Claude Code's background service once and the rest find it running.
- **A tile attached to a Claude background session** (one opened from the Background group) used to leave the session running when closed; its row came straight back under Background, to be closed a second time. The question now offers to end the session as well, ticked by default. The conversation is kept either way.
- Closing one picked row asks that row's own question (*Close session 'x'?*) rather than *Close 1 selected sessions?*.

## The Background listing no longer starts a process on every poll

`claude agents --json --all` is a Claude Code process — about 340 ms of a 300 MB executable — that every poll started, on this PC and on every paired one, nearly always to answer what it had answered the time before. DevDeck now looks first at what that command reads: the job records under `~/.claude/jobs`, one folder per background session with its `state.json` (a readdir and a stat per record, about a millisecond). No records means no sessions and no process at all; records unchanged since the last listing means the last answer, for up to five minutes; only a change runs the command. On a PC with no background sessions the process never starts.

## From a review of the sidebar and the close flows

- **The confirmation could be answered by an Enter that was not aimed at it.** Ctrl+Shift+P pressed while a question was open moved focus to the quick-open field behind it, and the Enter meant for that field closed the sessions. Chords no longer leave the question, an Enter from outside it only brings focus back to it, a held key's auto-repeat is ignored, and a second question is never stacked on the first — a row's ⋯ menu stayed open above the dialog and could ask one; it closes first now, and the dialog sits above every menu. After Cancel the keyboard goes back to where it was, so the next Delete or Enter acts on the same thing.
- **A row's ⋯ menu was clipped when the list was short.** The session list is its own scrolling box, sized to its content; a menu dropped from the last row ran past its bottom and one flipped up from the first row ran past its top. On a fresh install with one session only the bottom item (Close) showed. The menu is placed against the window now, below the ⋯ when there is room and above it otherwise, and closes when the list scrolls.
- **Keyboard focus survived a re-render only on a row.** Every publish that reorders rows (every 30 s with two active sessions) blurred the ⋯ button, an open menu's item or a group heading's controls; a keyboard user lost the menu they were in. They are put back now.
- **Forgetting a saved entry from its ⋯ menu** — the one destructive row action with no question, right under Pin — offers Undo.
- **Bulk flows toasted once per row**: restoring saved entries for a PC that is offline, or closing a group on a PC that refuses, stacked a notice per session past the top of the window. They show one line for the set; the diagnostics log keeps the rest.
- **A pinned row wears its pin.** The groups that come before Pinned (needs you, working, another PC) keep their rows, so pinning one moved nothing and read as having done nothing.
- Smaller: the Korean group confirmations use the same register as every other question; a group section is named for screen readers by its name and count alone, not by its buttons as well; rows carry a pressed state only while picking; the selection bar's Close is drawn as the destructive action it is.

## Also in this release

- `npm run qa:multi-close` drives the selection mode end to end in the real app — 24 checks, no agent needed.
- The selection itself lives in `src/shared/sessionSelection.ts` as pure functions, with tests; the job-record signature in `src/main/backgroundAgents.ts` is tested against a real temporary folder.
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "devdeck",
"version": "1.48.0",
"version": "1.49.0",
"description": "Project command deck — at-a-glance state + Claude Code, Codex, and Antigravity resume",
"main": "dist/main/main.js",
"type": "commonjs",
Expand Down Expand Up @@ -35,6 +35,7 @@
"qa:audit": "npm run build && node qa/audit.mjs",
"qa:link": "npm run build && node qa/link.mjs",
"qa:close": "npm run build && node qa/close.mjs",
"qa:multi-close": "npm run build && node qa/multi-close.mjs",
"qa:resilience": "npm run build && node qa/resilience.mjs",
"qa:perf": "npm run build && node qa/perf.mjs",
"qa:perf-gate": "npm run build && node qa/perf-gate.mjs",
Expand Down
Loading
Loading