Tags: tempmd/dyad
Tags
Bump to v1.12.0-beta.1 (dyad-sh#4339) #skip-bb <!-- CURSOR_SUMMARY --> --- > [!NOTE] > <sup>[Cursor Bugbot](https://cursor.com/bugbot) is generating a summary for commit 39c1ef3. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
Avoid Ubuntu mirror hangs in Linux release builds (dyad-sh#4314) ## Summary Prevent the Linux release build from hanging on unrelated Ubuntu package mirrors while retaining clang 18 and the Ubuntu 22.04 glibc baseline. - Restrict `apt-get update` to the newly added LLVM Jammy repository instead of refreshing every configured runner repository. - Preserve the runner's existing package indexes so `apt-get install clang-18` can resolve any Ubuntu-provided dependencies without changing the existing installation behavior. - Keep the compiler selection and all non-Linux release jobs unchanged. #skip-bugbot <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > CI-only change to apt update flags on Linux release builds; no application runtime or release artifact logic changes. > > **Overview** > Linux release jobs were hanging when `apt-get update` refreshed every Ubuntu mirror on the runner. The **Use clang 18 for Linux native rebuilds** step now runs a **scoped** `apt-get update` that only refreshes the added `llvm-toolchain-jammy-18` source list, with `Dir::Etc::sourceparts="-"` and `APT::Get::List-Cleanup="0"` so existing runner package indexes stay intact. > > `clang-18` install and `CC`/`CXX` env setup are unchanged; other matrix platforms are untouched. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 81c8ba6. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY --> <!-- This is an auto-generated description by cubic. --> <a href="https://cubic.dev/pr/dyad-sh/dyad/pull/4314?utm_source=github" target="_blank" rel="noopener noreferrer" data-no-image-dialog="true"><picture><source media="(prefers-color-scheme: dark)" srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img alt="Review in cubic" src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a> <!-- End of auto-generated description by cubic. -->
Fix Squirrel install startup handling (dyad-sh#4301) ## Summary Route Electron Forge through a minimal main-process bootstrap that handles Squirrel install/update events before loading the Dyad application runtime. Normal launches dynamically load the existing `main.ts` entry, while Squirrel events quit immediately. ## Root cause and impact The previous Forge entry loaded `main.ts` directly. ES module imports and IPC registration ran before the `electron-squirrel-startup` guard, so Windows installer hooks could initialize the database, background services, and application windows instead of exiting. Squirrel then timed out and later install attempts failed to replace locked Electron binaries and DLLs with `UnauthorizedAccessException` errors. The new entry keeps the Squirrel path isolated from all application imports, preventing installer hooks from starting normal Dyad services. A focused regression test covers both Squirrel and ordinary launch paths. Validated with the focused Vitest suite, repository lint, TypeScript checks, and a complete Electron Forge package build. The packaged app now resolves `.vite/build/main_bootstrap.js` as its declared Electron entry point. <!-- This is an auto-generated description by cubic. --> <a href="https://cubic.dev/pr/dyad-sh/dyad/pull/4301?utm_source=github" target="_blank" rel="noopener noreferrer" data-no-image-dialog="true"><picture><source media="(prefers-color-scheme: dark)" srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img alt="Review in cubic" src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a> <!-- End of auto-generated description by cubic. --> <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Changes Electron main-process startup order on Windows; mis-handling Squirrel could break installs or normal launches, but scope is small and covered by focused tests. > > **Overview** > **Windows Squirrel install/update hooks** now run through a minimal `main_bootstrap.ts` entry instead of loading `main.ts` directly. Forge’s Vite main entry was switched from `src/main.ts` to that bootstrap. > > On a Squirrel event, the bootstrap calls `app.quit()` immediately and never dynamically imports `./main`, so installer hooks do not pull in IPC registration, the database, or other Dyad services that previously ran before the guard in `main.ts` and could cause Squirrel timeouts and locked-binary install failures. > > Normal launches still load the full runtime via `void import("./main")`. **Vitest** in `main_bootstrap.test.ts` covers both paths: quit without loading `main`, and load `main` without quit when Squirrel is inactive. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit a8cc05f. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
Allow new chats during E2E tests and recordings (dyad-sh#4281) ## Summary Allow users to create a new chat while an E2E test or Playwright recording session owns the app's working tree, without weakening the stable Git HEAD snapshot stored on the chat. - Splits repository coordination into ref and working-tree subresources while retaining `repository` as a backwards-compatible umbrella for existing general Git operations. - Makes test and recording sessions own the working tree exclusively but share read access to refs, so branch-changing and code-writing operations remain serialized. - Lets compatible ref snapshots pass repository writers only while those writers are directly blocked by a long-lived session, and only for conflicts on resources that session owns; unrelated operations retain request ordering. - Removes the recording-specific New Chat refusal because chat creation now conflicts only with operations that can change its initial commit anchor. - Adds focused coverage for umbrella expansion, scoped queue bypass, production resource declarations, and actual chat creation during recording. --------- Co-authored-by: Will Chen <7344640+wwwillchen@users.noreply.github.com>
Bump to v1.10.0 (dyad-sh#4238) #skip-bb <!-- This is an auto-generated description by cubic. --> <a href="https://cubic.dev/pr/dyad-sh/dyad/pull/4238?utm_source=github" target="_blank" rel="noopener noreferrer" data-no-image-dialog="true"><picture><source media="(prefers-color-scheme: dark)" srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img alt="Review in cubic" src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a> <!-- End of auto-generated description by cubic. -->
Make long error messages easier to inspect (dyad-sh#4226) ## Summary Long error messages are now contained in a keyboard-accessible, independently scrollable details area so the toast header and actions stay easy to reach. - Caps error details at half the viewport height (up to 20rem) while keeping short errors compact. - Wraps unbroken technical strings and uses the existing hover/focus scrollbar treatment to prevent horizontal overflow and heavy scrollbar chrome. - Makes copy and close controls explicitly labeled and focus-visible, fixes their Base UI tooltip trigger composition, and adds dark-theme styling. - Adds focused component coverage for scrolling semantics and the copy/close interactions. <!-- CURSOR_SUMMARY --> --- > [!NOTE] > <sup>[Cursor Bugbot](https://cursor.com/bugbot) is generating a summary for commit b00f38c. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY --> <!-- This is an auto-generated description by cubic. --> <a href="https://cubic.dev/pr/dyad-sh/dyad/pull/4226?utm_source=github" target="_blank" rel="noopener noreferrer" data-no-image-dialog="true"><picture><source media="(prefers-color-scheme: dark)" srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img alt="Review in cubic" src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a> <!-- End of auto-generated description by cubic. -->
Prevent preview wedge when reopening during shutdown (dyad-sh#4215) ## Summary Prevent a quick reopen during asynchronous shutdown from creating a replacement window inside a half-disposed Electron main process. Dyad now finishes cleanup and services that reopen request with a fresh process, avoiding previews stuck on “Waiting for server logs…” with an ineffective Restart action. - Treat shutdown as terminal for the current process: macOS open-URL, second-instance, and zero-window activation events request a relaunch instead of interacting with disposed main-owned services; activation while a window remains open does not override an intentional quit. - Preserve a protocol URL delivered during shutdown in the replacement process arguments, while explicitly stripping stale `dyad://` arguments from every relaunch, including payload-free reopens. - Coalesce explicit Restart-Dyad and reopen events through one request so `app.relaunch()` is scheduled exactly once immediately before the guarded final quit. - Keep a defensive precondition at the central window factory so future window-creation paths cannot accidentally resurrect the quitting process, while delayed startup exits quietly if shutdown began during its persistence cleanup. - Limit the change to Electron lifecycle policy; renderer connection identity and app-run transport protocols remain unchanged because the reproduced failure used a new window and renderer in the same shutting-down main process. <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Touches Electron quit/relaunch, deep links, and window creation at shutdown; mistakes could break clean quit, OAuth return URLs, or Dock reopen behavior. > > **Overview** > Fixes previews stuck on “Waiting for server logs…” when the user reopens Dyad while the main process is still tearing down after an async `before-quit`. > > **Shutdown is terminal in the current process.** `open-url`, `second-instance`, and macOS `activate` (only when activation would normally create a window and none remain) no longer open windows or run deep-link handling while `isAppQuitting`; they record a **single coalesced relaunch** via `appRelaunchRequest`. `createWindow` and delayed startup bail out during shutdown so nothing resurrects a dying process. > > **One relaunch at the end of quit.** Restart Dyad IPC and all shutdown-time reopen paths call `appRelaunchRequest.request()` instead of `app.relaunch()` directly. The guarded MCP `before-quit` path calls `appRelaunchRequest.finish()`, which strips stale `dyad://` args from `process.argv`, appends the first preserved shutdown deep link if any, invokes `app.relaunch()` once, then quits. > > **Lifecycle policy** gains `shouldRequestRelaunchOnActivate` (relaunch only when quitting with zero windows) and blocks `shouldCreateWindowOnActivate` while quitting. Unit tests cover relaunch arg building and activation policy. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit f26e512. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
Fix cross-platform CI test synchronization (dyad-sh#4205) ## Summary Fix every failure from the [post-merge `main` CI run](https://github.com/dyad-sh/dyad/actions/runs/31052691207) without changing production behavior. - Treat fake-server push events as evidence that a receive-pack request began, then wait for the main-owned Git operation's authoritative success state before comparing local and remote refs. - Exercise the release workflow contract against both LF and CRLF content while preserving the exact publish-job permission boundary. - Stop reselecting Preview after `sendPrompt()` has already activated it; the redundant toggle collapsed the cloud-sandbox preview panel before the iframe assertion. - Supersede dyad-sh#4203 by carrying its CRLF regression coverage together with the remaining Git synchronization fix, since GitHub still reports that PR as open and its commit is not on `main`. #skip-bugbot <!-- This is an auto-generated description by cubic. --> <a href="https://cubic.dev/pr/dyad-sh/dyad/pull/4205?utm_source=github" target="_blank" rel="noopener noreferrer" data-no-image-dialog="true"><picture><source media="(prefers-color-scheme: dark)" srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img alt="Review in cubic" src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a> <!-- End of auto-generated description by cubic. --> Co-authored-by: Will Chen <7344640+wwwillchen@users.noreply.github.com>
Bump to v1.9.0 (dyad-sh#4072) #skip-bb <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Version metadata only; no runtime or dependency changes. > > **Overview** > Promotes the **dyad** package from **`1.9.0-beta.3`** to stable **`1.9.0`**. > > The version field is updated in **`package.json`** and the root package entry in **`package-lock.json`** so npm metadata matches the v1.9.0 release. No application code, dependencies, or scripts change in this PR. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 9267409. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
Project GithubBranchManager from the github_ops machine (dyad-sh#4061) ## Summary Implements Phase 5 item 3, PR-B from `plans/even-more-machines.md`: project `GithubBranchManager` entirely from the per-app `github_ops` machine. This completes the scheduled GitHub operations machine migration and leaves only the follow-up chores PR plus trigger-gated work in that plan. - Replaces component-owned operation lifecycle, direct GitHub IPC calls, and error-string classification with machine snapshots, projections, and typed events. - Adds a TanStack Query branch-inventory projection for current, local, and remote branches while keeping operation state in the machine. - Keeps conflict recovery ownership explicit: `GitHubConnector` renders the single shared status panel with “Resolve with AI” and “Cancel sync,” while `GithubBranchManager` stays focused on branch selection and mutations. - Closes the stale-conflict-resolver bug by making abort-and-switch remove the obsolete conflict controls as soon as the machine leaves the conflicted state. - Fills two gaps exposed while consuming PR-A: the planned inventory query was not yet present, and the `conflicted → switch requested → switch blocked` transition cell was unreachable. Regression coverage now exercises that path and the renderer projection. - Avoids duplicate success surfaces from the machine banner and legacy toast, preserving one deterministic status message for users and E2E assertions. - Incorporates verified deep-review hardening: paused rebases now enter the same abort-and-switch flow, dismissing that flow restores its prior recovery context, and idle-only branch mutations are disabled instead of silently discarding user input in recovery states. - Preserves create/rename/merge/delete dialog state until typed machine success so failures keep user input and operation progress remains visible. - Hands merge-conflict failures directly to the recovery UI by closing the now-obsolete merge confirmation dialog when typed conflict state appears. - Consolidates conflict recovery into one connector-owned panel so the file list appears once and the related Resolve with AI / Cancel sync actions stay together. - Nests current-branch and branch-inventory queries under an app-scoped key so machine, rename, and version-preview mutations refresh both caches without invalidating other apps. <!-- This is an auto-generated description by cubic. --> <a href="https://cubic.dev/pr/dyad-sh/dyad/pull/4061?utm_source=github" target="_blank" rel="noopener noreferrer" data-no-image-dialog="true"><picture><source media="(prefers-color-scheme: dark)" srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img alt="Review in cubic" src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a> <!-- End of auto-generated description by cubic. --> --------- Co-authored-by: Will Chen <7344640+wwwillchen@users.noreply.github.com>
PreviousNext