Skip to content

Commit 64f9768

Browse files
chore: prepare v1.31.0 release
1 parent 2f49d91 commit 64f9768

5 files changed

Lines changed: 27 additions & 4 deletions

File tree

‎package-lock.json‎

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎package.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "devdeck",
3-
"version": "1.30.0",
3+
"version": "1.31.0",
44
"description": "Project command deck — at-a-glance state + Claude Code, Codex, and Antigravity resume",
55
"main": "dist/main/main.js",
66
"type": "commonjs",

‎qa/screenshot.mjs‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,24 @@ const win = await app.firstWindow();
3737
win.on('console', (m) => { if (m.type() === 'error') consoleErrors.push(m.text()); });
3838
win.on('pageerror', (e) => pageErrors.push(String(e)));
3939

40+
// Keep project-card costs deterministic. A live Codex/Claude session in this checkout can accrue
41+
// usage while the harness is running, which legitimately changes the card signature and makes the
42+
// "unchanged card is reconciled in place" assertion test moving external data instead.
43+
await app.evaluate(({ ipcMain }, projectPath) => {
44+
ipcMain.removeHandler('usage:report');
45+
ipcMain.handle('usage:report', () => ({
46+
global: { input: 0, output: 0, cacheWrite: 0, cacheRead: 0 }, globalCost: 4.5,
47+
hasUnknownModel: false, webSearch: 0, webFetch: 0, sessions: 1, activeMs: 0,
48+
byModel: [],
49+
byProject: [{
50+
path: projectPath, name: 'devdeck', sessions: 1,
51+
totals: { input: 0, output: 0, cacheWrite: 0, cacheRead: 0 },
52+
costEstimate: 4.5, hasUnknownModel: false, activeMs: 0, status: 'active', providerCosts: {},
53+
}],
54+
daily: [], byProvider: [],
55+
}));
56+
}, root);
57+
4058
// The tray guard turns window close into hide-to-tray (and window-all-closed keeps the app alive),
4159
// so Playwright's bare app.close() waits forever and leaks a zombie harness instance. Mark the quit
4260
// intent in main (same flag the tray's own Quit item sets) and quit explicitly.

‎src/renderer/projectMemoryModal.ts‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,11 @@ export function openProjectMemoryModal(project: ProjectViewModel, trigger: HTMLE
6767
window.removeEventListener('resize', applySurfaceMode);
6868
overlay.remove(); currentOverlay = null;
6969
closeCurrent = null;
70-
trigger.focus();
70+
const focusTarget = trigger.isConnected
71+
? trigger
72+
: Array.from(document.querySelectorAll<HTMLElement>('.project-memory-button'))
73+
.find((button) => button.dataset.projectPath === project.path);
74+
focusTarget?.focus();
7175
};
7276
closeCurrent = close;
7377
const focusable = (): HTMLElement[] => Array.from(

‎src/renderer/projectsView.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,7 @@ function githubBtn(p: ProjectViewModel): HTMLButtonElement {
321321

322322
function memoryBtn(p: ProjectViewModel): HTMLButtonElement {
323323
const b = document.createElement('button'); b.className = 'iconbtn project-memory-button'; b.appendChild(createIcon('clock'));
324+
b.dataset.projectPath = p.path;
324325
b.title = tr('memory.button'); b.setAttribute('aria-label', `${tr('memory.button')} · ${p.name}`);
325326
b.addEventListener('click', () => openProjectMemoryModal(p, b));
326327
return b;

0 commit comments

Comments
 (0)