Skip to content
Merged
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
4 changes: 4 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,9 @@ jobs:
- name: Images tied to their terminal rows
if: runner.os == 'Windows'
run: node qa/image-rows.mjs
- name: Quick replies, timeline, image markup and sent documents
if: runner.os == 'Windows'
run: node qa/cockpit-tools.mjs
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
if: always()
with:
Expand All @@ -145,4 +148,5 @@ jobs:
qa/shots/images/
qa/shots/images-remote/
qa/shots/image-rows/
qa/shots/cockpit-tools/
qa/shots/claude-update/
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.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.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
2 changes: 1 addition & 1 deletion docs/quality.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ Results and screenshots are written to `qa/shots/maintenance/` and `qa/shots/res

The CI performance gate is `qa:perf-gate` (Windows, every push): a fixture agent instead of a real one, and units that do not depend on the runner's speed — running CSS animations and DOM mutation records on an idle deck (both must be ~0), DOM mutations outside the terminals while two tiles repaint at 10fps (a per-chunk sidebar rebuild is ~8,000 against a limit of 400), and the main process's longest event-loop stall while working and while 20,000 lines stream. Each limit was checked by injecting the regression it guards against: an infinite CSS animation, a sidebar render per PTY chunk, and a 700ms synchronous block in the main process all fail it. Results go to `qa/shots/perf-gate/results.json`.

`qa:images` (Windows) drives the cockpit image strip, full-size viewer and 📎 attach against an isolated home holding a transcript with a tool screenshot, a pasted image and a written image file; its fixture `claude` echoes what it is sent, so an attached path is read back off the terminal. `qa:update` (Windows) checks "Update all": a fixture `claude` prints Claude Code's failed-update footer, and the harness asserts that `claude update` ran with no session process alive and that every conversation was resumed by id. `qa:images-remote` (Windows) pairs a host and a viewer over real TLS and checks the same from the viewer: thumbnails and the full view cross the link, an attached JPEG lands on the host as PNG with the host path typed, and a non-image named `.png` or an unindexed id is refused over the link. `qa:restore-pacing` (Windows) checks that restored agents start one at a time: a fixture that draws for 2s while booting must not see the next one launched before it finished (measured before the fix: 26–49ms apart). `qa:image-rows` (Windows) ties images to the terminal: a fixture `claude` draws a screen the way Claude Code does (`● server - tool (MCP)` calls, `⎿ [Image]` results, shaded `❯` prompts, a composer between rules) over a transcript holding the same screenshots, and the harness checks that each placeholder is marked and opens its own image, that the viewer shows what led to an image and scrolls the terminal to its row, that copying puts an image on the clipboard (the person's clipboard is restored afterwards), that a new screenshot is previewed while the strip is closed, and that Ctrl+Up/Down steps between sent prompts without entering the composer. None of these starts a real agent.
`qa:images` (Windows) drives the cockpit image strip, full-size viewer and 📎 attach against an isolated home holding a transcript with a tool screenshot, a pasted image and a written image file; its fixture `claude` echoes what it is sent, so an attached path is read back off the terminal. `qa:update` (Windows) checks "Update all": a fixture `claude` prints Claude Code's failed-update footer, and the harness asserts that `claude update` ran with no session process alive and that every conversation was resumed by id. `qa:images-remote` (Windows) pairs a host and a viewer over real TLS and checks the same from the viewer: thumbnails and the full view cross the link, an attached JPEG lands on the host as PNG with the host path typed, and a non-image named `.png` or an unindexed id is refused over the link. `qa:restore-pacing` (Windows) checks that restored agents start one at a time: a fixture that draws for 2s while booting must not see the next one launched before it finished (measured before the fix: 26–49ms apart). `qa:image-rows` (Windows) ties images to the terminal: a fixture `claude` draws a screen the way Claude Code does (`● server - tool (MCP)` calls, `⎿ [Image]` results, shaded `❯` prompts, a composer between rules) over a transcript holding the same screenshots, and the harness checks that each placeholder is marked and opens its own image, that the viewer shows what led to an image and scrolls the terminal to its row, that copying puts an image on the clipboard (the person's clipboard is restored afterwards), that a new screenshot is previewed while the strip is closed, and that Ctrl+Up/Down steps between sent prompts without entering the composer. `qa:cockpit-tools` (Windows) uses a fixture `claude` that records every byte typed into it: a quick reply from the header menu and from Ctrl+Shift+<n> arrives as the phrase followed by Enter, phrases edited in Settings are saved and offered, the timeline lists each prompt with its time, reply and image count and scrolls the terminal to it without resizing it, and a screenshot marked up in the viewer reaches the session as a PNG that has the red marks in it. `qa:images-remote` also sends a log file from the viewer and checks it lands on the host under its own name. None of these starts a real agent.

Do not run these against a live development conversation. Do not equate a short loopback test with sleep/resume, VPN changes or multi-day field validation.

Expand Down
41 changes: 41 additions & 0 deletions docs/releases/1.41.0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# DevDeck 1.41.0

## Quick replies

- **One click for what you keep typing.** A 💬 button in a session's header opens your phrases: "Yes, go ahead", "Commit it", "Run the tests and check the result", "Summarize what you changed". Picking one types it and presses Enter. A green dot on the button means the session is waiting for you.
- **Ctrl+Shift+1…9** in the terminal sends phrase 1 to 9 without opening the menu. The digit is never typed into the agent. A number with no phrase behind it reaches the terminal as before.
- **Your own phrases.** Settings → Quick replies takes one phrase per line, up to nine. Leave it empty for the defaults in your language.

## Session timeline

- A panel over the right edge of the terminal lists every prompt you sent in the session. Each entry shows when you sent it, its first line, the agent's last words in reply, and how many images that turn produced.
- Click a prompt to scroll the terminal to it, briefly highlighted. Click the image count to open that turn's screenshot.
- Only what you typed is listed: the summary Claude Code writes when it compacts a conversation is left out, and pasted text shows its own first line.
- The list comes from the session's own record, so it is complete even when the terminal's scrollback no longer reaches back. Prompts that have scrolled out are shown dimmed and cannot be jumped to.
- The panel floats over the terminal and never resizes it.

## Mark up a screenshot and send it back

- In the full-size viewer, **Mark up** gives you a box, an arrow and a pen in red. Undo is Ctrl+Z, and Esc stops drawing.
- **Attach to the session** sends the image, with your marks, to the session it came from. The image is written where the session runs and its path is typed into the prompt, the same way a pasted screenshot is. This works for sessions on another PC too.
- The marks are drawn in the image's own pixels and sent at full resolution, then scaled down only if the picture would exceed the 5MB attachment limit.
- **Copy image** copies the marked-up version when there are marks.

## Documents for a session on another PC

- 📎 and drag-and-drop for a session on another PC now take text, log, data and PDF files as well as images: `.txt .log .md .json .jsonl .csv .tsv .yaml .xml .toml .ini .cfg .conf .diff .patch .sql .pdf`, up to 5MB each.
- The other PC writes the file into its temp folder under its own name and types that path. Old files are cleaned up after a day, like pasted images.
- That PC checks every file before writing it:
- only the kinds listed above are accepted, never scripts, executables or HTML
- a PDF must start like a PDF, and a text file must contain no binary bytes
- it needs the same "type in sessions" permission as an image, and shares the same hourly limit
- A PC still on an older DevDeck cannot receive documents. You are told how many files it could not take and that the PC needs updating; nothing is typed into the session for them.

## Under the hood

- A new automated check (`qa:cockpit-tools`) runs on every change on Windows. A fixture agent records every byte typed into it, and the check covers:
- both ways of sending a quick reply, and phrases edited in Settings
- the timeline's contents, and that clicking a prompt jumps to it
- that a marked-up screenshot reaches the session with its red marks in the pixels
- The remote-image check (`qa:images-remote`) now also sends a log file from one PC to another over the real link.
- Turns are read in the same incremental pass over the session record as the images. The timeline costs no second read of a transcript that can reach hundreds of megabytes. The performance gate is unchanged.
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.40.0",
"version": "1.41.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 @@ -43,6 +43,7 @@
"qa:session-sync": "npm run build && node qa/session-sync.mjs",
"qa:images": "npm run build && node qa/images.mjs",
"qa:image-rows": "npm run build && node qa/image-rows.mjs",
"qa:cockpit-tools": "npm run build && node qa/cockpit-tools.mjs",
"qa:images-remote": "npm run build && node qa/images-remote.mjs",
"qa:update": "npm run build && node qa/claude-update.mjs",
"qa:restore-pacing": "npm run build && node qa/restore-pacing.mjs"
Expand Down
Loading
Loading