1. 11 2月, 2026 15 次提交
    • Will Chen's avatar
      Update npm config and CI workflows (#2621) · 932ae082
      Will Chen 提交于
      ## Summary
      - Add .npmrc configuration file for npm package manager settings
      - Update package.json to specify npm version constraint (11.8.0)
      - Update CI/CD workflow files for npm compatibility
      - Add fast-push command documentation
      
      ## Test plan
      - Verify npm builds correctly with the new .npmrc configuration
      - Check CI workflows execute successfully with updated configuration
      - Ensure package.json constraints are properly honored
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2621"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      <!-- CURSOR_SUMMARY -->
      ---
      
      > [!NOTE]
      > **Low Risk**
      > Mostly tooling and workflow changes; primary risk is CI/build failures
      if npm 11.8.0 or strict engine checks conflict with some environments.
      > 
      > **Overview**
      > **Standardizes npm version/engine enforcement.** Adds `.npmrc` with
      `engine-strict=true` and updates `package.json`/`package-lock.json`
      `engines` to require `npm` `11.8.0`.
      > 
      > **Updates automation to match.** CI, release, and deflake workflows
      now install `npm@11.8.0` before running `npm ci`, and a new `.claude`
      command (`fast-push`) documents an autonomous commit/lint/amend/push/PR
      flow.
      > 
      > <sup>Written by [Cursor
      Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
      391bd1deb4c07dae590444cdda77cfc2cb85482a. This will update automatically
      on new commits. Configure
      [here](https://cursor.com/dashboard?tab=bugbot).</sup>
      <!-- /CURSOR_SUMMARY -->
      
      <!-- This is an auto-generated description by cubic. -->
      ---
      ## Summary by cubic
      Standardizes on npm 11.8.0 across local dev and CI to ensure consistent
      installs/builds, and adds documentation for the dyad fast-push command.
      
      - **Dependencies**
        - Add .npmrc with engine-strict=true
        - Set engines.npm to 11.8.0 in package.json
        - CI workflows install npm@11.8.0 before npm ci
      
      - **Migration**
        - Upgrade local npm: npm install -g npm@11.8.0
        - Reinstall deps with Node >= 20: npm ci
      
      <sup>Written for commit 391bd1deb4c07dae590444cdda77cfc2cb85482a.
      Summary will update on new commits.</sup>
      
      <!-- End of auto-generated description by cubic. -->
      Co-authored-by: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      932ae082
    • Will Chen's avatar
      Add CI cleanup script for self-hosted macOS runners (#2617) · c971fe82
      Will Chen 提交于
      ## Summary
      - Adds `scripts/ci-cleanup-macos.sh` that cleans up build outputs, test
      artifacts, old Playwright browsers, npm cache, and stale runner
      diagnostic logs after each CI job
      - Integrates the cleanup as an `if: always()` post-job step in `ci.yml`
      (build + e2e-tests jobs) and `claude-deflake-e2e.yml`
      - Prevents disk space exhaustion on Mac Mini self-hosted runners (see
      [failed
      job](https://github.com/dyad-sh/dyad/actions/runs/21882508263/job/63168659300))
      
      ## Test plan
      - [ ] Verify cleanup step runs on self-hosted macOS runners after build
      job
      - [ ] Verify cleanup step runs on self-hosted macOS runners after
      e2e-tests job
      - [ ] Verify cleanup step runs after deflake workflow
      - [ ] Verify cleanup is skipped on GitHub-hosted runners (guarded by
      `contains(matrix.os.image, 'self-hosted')`)
      - [ ] Verify the script is idempotent (safe to run when artifacts don't
      exist)
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2617"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      <!-- This is an auto-generated description by cubic. -->
      ---
      ## Summary by cubic
      Adds a macOS CI cleanup script that runs after each job on self-hosted
      Mac Minis to free disk space and prevent failures from exhaustion.
      
      - **New Features**
      - Added scripts/ci-cleanup-macos.sh to remove build outputs, test
      artifacts, old Playwright browsers (keeps current via chromium revision
      from browsers.json), npm cache/logs (rm -rf _cacache), and runner
      diagnostics older than 7 days; safe to run multiple times with a
      corrected Node check.
      - Integrated as an if: always() post-job step in ci.yml (build and
      e2e-tests, guarded to self-hosted) and claude-deflake-e2e.yml.
      
      <sup>Written for commit 756485ea0c30b9ba26800c168f182b3688bef6cc.
      Summary will update on new commits.</sup>
      
      <!-- End of auto-generated description by cubic. -->
      
      <!-- CURSOR_SUMMARY -->
      ---
      
      > [!NOTE]
      > **Low Risk**
      > Low risk CI-only change; main risk is over-aggressive cleanup
      (caches/artifacts) causing longer reruns or unexpected deletions on
      self-hosted runners.
      > 
      > **Overview**
      > Adds a new `scripts/ci-cleanup-macos.sh` post-job script to reclaim
      disk space on self-hosted macOS runners by deleting workspace build/test
      artifacts, pruning old Playwright browser installs, clearing npm
      cache/logs, and removing stale runner diagnostic logs.
      > 
      > Integrates the cleanup as an `if: always()` step after `build` and
      `e2e-tests` in `ci.yml` (guarded to self-hosted macOS) and after the
      deflake job in `claude-deflake-e2e.yml`.
      > 
      > <sup>Written by [Cursor
      Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
      756485ea0c30b9ba26800c168f182b3688bef6cc. This will update automatically
      on new commits. Configure
      [here](https://cursor.com/dashboard?tab=bugbot).</sup>
      <!-- /CURSOR_SUMMARY -->
      
      ---------
      Co-authored-by: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      c971fe82
    • Will Chen's avatar
      Add playwright env var settings allowed (#2616) · e1d93db6
      Will Chen 提交于
      #skip-bb
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2616"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      e1d93db6
    • wwwillchen-bot's avatar
      fix: use per-worker port for fake LLM server in parallel tests (#2557) · c337156d
      wwwillchen-bot 提交于
      ## Summary
      - Pass `fakeLlmPort` through `preLaunchHook` so each parallel worker
      uses its own fake LLM server instance
      - Dynamically generate webServer configs in `playwright.config.ts` based
      on parallelism setting
      - Allow fake-llm-server to accept port via command line argument
      (`--port=XXXX`)
      
      This ensures parallel Playwright tests don't conflict when accessing the
      fake LLM server.
      
      ## Test plan
      - [x] Lint checks pass
      - [x] All 784 unit tests pass
      - [ ] Run E2E tests in parallel to verify no port conflicts
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2557"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      <!-- This is an auto-generated description by cubic. -->
      ---
      ## Summary by cubic
      Fixes parallel E2E conflicts by running a dedicated fake LLM server per
      Playwright worker and passing its port through preLaunchHook, env vars,
      and app/test URLs so all requests hit the worker’s server.
      
      - **Bug Fixes**
      - Compute per-worker fakeLlmPort (FAKE_LLM_BASE_PORT + parallelIndex),
      expose via preLaunchHook, set FAKE_LLM_PORT, and pass into PageObject,
      Settings, GitHubConnector; Azure tests use it for TEST_AZURE_BASE_URL.
      - Use worker-scoped URLs for Azure, GitHub test APIs, Ollama, LM Studio,
      Engine, Gateway, and OpenAI provider; Electron GitHub/Vercel handlers
      read FAKE_LLM_PORT instead of hardcoded 3500.
      - Generate one webServer per worker with build+start to avoid startup
      races; health checks target each worker; reuse servers locally; extract
      FAKE_LLM_BASE_PORT to e2e-tests/helpers/test-ports.ts.
      - fake-llm-server accepts --port or PORT with NaN validation; docs
      updated with parallel port isolation and rebase workflow notes.
      
      <sup>Written for commit 407923e90ddc9cf4d9ec98ccc56849154d2ad932.
      Summary will update on new commits.</sup>
      
      <!-- End of auto-generated description by cubic. -->
      
      ---------
      Co-authored-by: 's avatarWill Chen <willchen90@gmail.com>
      Co-authored-by: 's avatarClaude Opus 4.5 <noreply@anthropic.com>
      Co-authored-by: 's avatarclaude[bot] <41898282+claude[bot]@users.noreply.github.com>
      c337156d
    • Will Chen's avatar
      use ai-bots env for draft-stale-prs (#2614) · a0a50774
      Will Chen 提交于
      #skip-bb
      a0a50774
    • wwwillchen-bot's avatar
      Improve E2E test resilience for logs_server and update snapshot (#2613) · 35ea8edb
      wwwillchen-bot 提交于
      ## Summary
      - Improve picker button wait reliability in logs_server.spec.ts using
      toPass() with visibility and enabled checks
      - Update local_agent_read_logs snapshot to use regex for dynamic log
      count matching
      
      ## Test plan
      - Run the affected E2E tests: `npx playwright test logs_server.spec.ts
      local_agent_read_logs.spec.ts`
      - Tests should pass consistently without timing-related flakiness
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2613"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      
      <!-- This is an auto-generated description by cubic. -->
      ---
      ## Summary by cubic
      Improve logs_server E2E stability and update a snapshot to handle
      dynamic log counts. We now poll with toPass until the picker button is
      visible and enabled, and the snapshot uses a regex (/LOGS Reading \d+
      logs/) instead of a fixed count.
      
      <sup>Written for commit 1810af01aee8f1862c36ded946adda4a60436b97.
      Summary will update on new commits.</sup>
      
      <!-- End of auto-generated description by cubic. -->
      Co-authored-by: 's avatarWill Chen <willchen90@gmail.com>
      Co-authored-by: 's avatarClaude Opus 4.5 <noreply@anthropic.com>
      35ea8edb
    • Will Chen's avatar
      Add /dyad:pr-push step to pr-fix skill (#2612) · 6ae812e5
      Will Chen 提交于
      ## Summary
      - The `/dyad:pr-fix` skill was missing a push step, so Claude would fix
      review comments and CI issues but never commit/push the changes back to
      the PR branch
      - Added `/dyad:pr-push` as an explicit step 3 in the skill (between fix
      steps and summary comment)
      - Simplified the workflow prompt in `pr-review-responder.yml` since the
      skill itself now handles the push
      
      ## Test plan
      - [ ] Trigger the PR Review Responder workflow on a PR with `cc:request`
      label and verify that changes are actually pushed
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2612"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      <!-- CURSOR_SUMMARY -->
      ---
      
      > [!NOTE]
      > **Low Risk**
      > Documentation/prompt-orchestration changes only; risk is limited to
      altering the automation flow if the new required `/dyad:pr-push` step
      behaves unexpectedly.
      > 
      > **Overview**
      > Updates the `/dyad:pr-fix` orchestration to **explicitly run
      `/dyad:pr-push` as a required step** before posting the final PR summary
      comment, ensuring fixes are actually committed and pushed back to the PR
      branch.
      > 
      > Simplifies the `pr-review-responder.yml` Claude prompt by removing
      redundant detailed rules and relying on the updated skill to execute
      end-to-end without skipping the push.
      > 
      > <sup>Written by [Cursor
      Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
      542b65bac4120de76a8759ce3cf3e2e021e4fb98. This will update automatically
      on new commits. Configure
      [here](https://cursor.com/dashboard?tab=bugbot).</sup>
      <!-- /CURSOR_SUMMARY -->
      
      <!-- This is an auto-generated description by cubic. -->
      ---
      ## Summary by cubic
      Add a required /dyad:pr-push step to the /dyad:pr-fix skill so fixes are
      committed and pushed to the PR branch. Simplifies the
      pr-review-responder workflow now that pushing is handled by the skill.
      
      - **Bug Fixes**
      - Added /dyad:pr-push as step 3 in pr-fix to commit, run lint/tests, and
      push to GitHub.
      - Simplified pr-review-responder.yml prompt to run pr-fix end-to-end
      without manual push checks.
      
      <sup>Written for commit 542b65bac4120de76a8759ce3cf3e2e021e4fb98.
      Summary will update on new commits.</sup>
      
      <!-- End of auto-generated description by cubic. -->
      Co-authored-by: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      6ae812e5
    • wwwillchen-bot's avatar
      Update E2E tests for UI label changes and editor interactions (#2611) · 86582d20
      wwwillchen-bot 提交于
      ## Summary
      - Update selectors for renamed UI elements ("Max Chat Turns in Context",
      "Build" mode, "Add Environment Variable" button)
      - Fix copy_app test to use more specific dialog and heading selectors
      for robustness
      - Refactor edit_code tests to use keyboard interactions instead of
      fill() for Monaco editor
      - Update problem button text patterns to match new "Fix N problem(s)"
      format
      - Update related test snapshots
      
      ## Test plan
      - [ ] Run `npm test` to verify all unit tests pass
      - [ ] Run E2E tests to verify the updated selectors work correctly
      - [ ] Verify the modified tests match the current UI state
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2611"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      
      <!-- This is an auto-generated description by cubic. -->
      ---
      ## Summary by cubic
      Updates E2E tests to match renamed UI labels and make Monaco editor
      edits reliable, reducing flakiness and keeping snapshots in sync.
      Improves selectors and expectations across affected specs.
      
      - **Bug Fixes**
      - Update selectors for renamed labels: “Max Chat Turns in Context”,
      “Build”, “Add Environment Variable”.
        - Match new “Fix N problem(s)” button text.
        - Use scoped dialog and heading selectors in copy_app.
        - Refresh snapshots to reflect current UI.
      
      - **Refactors**
      - Switch Monaco editor edits to keyboard interactions instead of fill().
        - Add auto-approve setup in edit_code tests for stability.
      
      <sup>Written for commit 0f1e771f52850e3a6b89286d22ade5a4ff6db606.
      Summary will update on new commits.</sup>
      
      <!-- End of auto-generated description by cubic. -->
      Co-authored-by: 's avatarWill Chen <willchen90@gmail.com>
      Co-authored-by: 's avatarClaude Opus 4.5 <noreply@anthropic.com>
      86582d20
    • Will Chen's avatar
      Replace deflake-e2e-recent-prs with deflake-e2e-recent-commits (#2607) · 50a72da9
      Will Chen 提交于
      ## Summary
      - Replaced `deflake-e2e-recent-prs` command with
      `deflake-e2e-recent-commits` that scans CI workflow runs on main instead
      of PR comments
      - Downloads the `html-report` artifact (`results.json`) from each CI run
      to extract flaky test data, which works for push events that don't post
      PR comments
      - Updated `claude-deflake-e2e.yml` workflow to use the new command
      
      ## Test plan
      - [ ] Trigger the `Claude Deflake E2E` workflow manually and verify it
      correctly scans recent main branch CI runs
      - [ ] Verify flaky tests are correctly parsed from `results.json`
      artifacts
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2607"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      <!-- CURSOR_SUMMARY -->
      ---
      
      > [!NOTE]
      > **Low Risk**
      > Low risk doc/workflow tweak that changes how the deflake automation
      sources flaky tests (GitHub Actions runs/artifacts) but does not touch
      production code or test logic.
      > 
      > **Overview**
      > Updates the deflake automation to **scan recent `main` CI workflow
      runs** (push events) instead of PR Playwright summary comments, by
      downloading each run’s `html-report` artifact and parsing `results.json`
      to detect retry-passed tests with prior failures/timeouts.
      > 
      > Adjusts the scheduled `Claude Deflake E2E` workflow to accept
      `commit_count`, grant `actions: read`, and invoke
      `/dyad:deflake-e2e-recent-commits` rather than the old PR-based command.
      > 
      > <sup>Written by [Cursor
      Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
      0da1e67da43e509577d5b8dc1f155779742d1529. This will update automatically
      on new commits. Configure
      [here](https://cursor.com/dashboard?tab=bugbot).</sup>
      <!-- /CURSOR_SUMMARY -->
      
      <!-- This is an auto-generated description by cubic. -->
      ---
      ## Summary by cubic
      Switched the deflake command to scan recent main CI runs and parse
      html-report results.json to find flaky E2E tests. Updated the Claude
      Deflake E2E workflow to use commit_count and added actions: read
      permission.
      
      - **Refactors**
      - List completed main push runs via gh api, fetch 3x commit_count, and
      filter to success/failure.
      - Download non-expired html-report artifacts; parse results.json with a
      Node.js script to detect flakes (final passed after
      fail/timedOut/interrupted).
      - Build "<spec_path.spec.ts> > Suite > Test" titles; group and rank by
      frequency; clean up artifacts.
        - Skip runs without artifacts; note 3-day artifact retention.
      
      - **Bug Fixes**
        - Updated command doc to reference the TodoWrite tool.
      
      <sup>Written for commit 0da1e67da43e509577d5b8dc1f155779742d1529.
      Summary will update on new commits.</sup>
      
      <!-- End of auto-generated description by cubic. -->
      
      ---------
      Co-authored-by: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      50a72da9
    • Will Chen's avatar
      ci: use 2 e2e shards for self-hosted Mac mini runners (#2606) · 9b9c059b
      Will Chen 提交于
      ## Summary
      - Update CI workflow to use 2 E2E test shards instead of 1 for
      self-hosted Mac mini runners (privileged authors)
      - This improves E2E test parallelism on self-hosted infrastructure
      
      ## Test plan
      - CI should run with 2 shards on self-hosted runners for privileged
      authors
      - Non-privileged authors still get 4 shards on GitHub-hosted runners
      (unchanged)
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2606"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      
      <!-- This is an auto-generated description by cubic. -->
      ---
      ## Summary by cubic
      Run E2E tests in 2 shards on self-hosted Mac mini (macOS ARM64) runners
      for privileged authors to improve parallelism and speed up CI.
      Non-privileged authors remain on GitHub-hosted runners with 4 shards;
      other CI settings are unchanged.
      
      <sup>Written for commit 972f36eb853a620a3f08ac2089d725768177beb7.
      Summary will update on new commits.</sup>
      
      <!-- End of auto-generated description by cubic. -->
      
      <!-- CURSOR_SUMMARY -->
      ---
      
      > [!NOTE]
      > **Low Risk**
      > Low risk workflow-only change; main impact is CI execution behavior
      (more parallel shards) and potential shard/merge configuration issues if
      assumptions about 1 shard were relied on.
      > 
      > **Overview**
      > In `.github/workflows/ci.yml`, increases **self-hosted
      privileged-author** Playwright E2E parallelism by changing the matrix
      from `1/1` to `2` shards (`e2e_shard=[1,2]`, `e2e_shard_total=[2]`).
      > 
      > GitHub-hosted macOS/Windows runs remain at `4` shards, and build/job
      wiring is otherwise unchanged.
      > 
      > <sup>Written by [Cursor
      Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
      972f36eb853a620a3f08ac2089d725768177beb7. This will update automatically
      on new commits. Configure
      [here](https://cursor.com/dashboard?tab=bugbot).</sup>
      <!-- /CURSOR_SUMMARY -->
      Co-authored-by: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      9b9c059b
    • Will Chen's avatar
      Add workflow to cancel Claude PR review after merge (#2609) · 135c408a
      Will Chen 提交于
      ## Summary
      - Adds a new GitHub Actions workflow that cancels in-progress/queued
      `claude-pr-review.yml` runs when a PR is merged
      - Mirrors the existing `cancel-ci-after-merge.yml` pattern, targeting
      the Claude PR review workflow instead of CI
      - Avoids wasting CI minutes on reviews for already-merged PRs
      
      ## Test plan
      - Verify the workflow file is valid YAML and matches the structure of
      `cancel-ci-after-merge.yml`
      - Merge a PR that has a running Claude PR review and confirm the review
      workflow is cancelled
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2609"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      <!-- CURSOR_SUMMARY -->
      ---
      
      > [!NOTE]
      > **Low Risk**
      > Low risk: adds an isolated GitHub Actions workflow that only cancels
      in-progress/queued runs for a specific workflow on PR merge, with no
      application code or data changes.
      > 
      > **Overview**
      > Adds a new `cancel-claude-pr-review-after-merge.yml` workflow that
      triggers when a PR is *closed and merged* and cancels any
      in-progress/queued `claude-pr-review.yml` runs associated with the PR’s
      head SHA.
      > 
      > The job queries multiple run statuses, deduplicates results, and
      issues `cancelWorkflowRun` calls with `actions: write` permission to
      avoid wasting runner time on already-merged PR reviews.
      > 
      > <sup>Written by [Cursor
      Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
      9faccb5308bd575e3ef638c6efb94818dc9964b4. This will update automatically
      on new commits. Configure
      [here](https://cursor.com/dashboard?tab=bugbot).</sup>
      <!-- /CURSOR_SUMMARY -->
      
      <!-- This is an auto-generated description by cubic. -->
      ---
      ## Summary by cubic
      Adds a GitHub Actions workflow that cancels Claude PR review runs after
      a PR is merged to save CI minutes. Mirrors the existing
      cancel-ci-after-merge workflow but targets claude-pr-review.yml.
      
      - **New Features**
      - New workflow triggers on merged PRs and cancels claude-pr-review.yml
      runs for the PR’s head SHA (in_progress/queued/pending/waiting) using
      file-path matching and dedup, including for forks.
      
      <sup>Written for commit 9faccb5308bd575e3ef638c6efb94818dc9964b4.
      Summary will update on new commits.</sup>
      
      <!-- End of auto-generated description by cubic. -->
      Co-authored-by: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      135c408a
    • Will Chen's avatar
      Use PR_RW_GITHUB_TOKEN for draft-stale-prs workflow (#2608) · e699d96a
      Will Chen 提交于
      ## Summary
      - The `draft-stale-prs` workflow was failing with "Resource not
      accessible by integration" when trying to convert fork PRs to draft via
      the GraphQL `convertPullRequestToDraft` mutation
      - The default `GITHUB_TOKEN` lacks the necessary cross-repo permissions
      for this operation
      - Switch to the `PR_RW_GITHUB_TOKEN` secret which has the required
      permissions
      
      #skip-bugbot
      
      ## Test plan
      - Trigger the workflow manually via `workflow_dispatch` and verify fork
      PRs are successfully converted to draft without "Resource not accessible
      by integration" errors
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2608"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      Co-authored-by: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      e699d96a
    • Will Chen's avatar
      Simplify Playwright summary to single re-run command (#2605) · 4aa7a011
      Will Chen 提交于
      ## Summary
      - Replace per-test `npm run e2e` commands in the Playwright PR comment
      with a single combined command listing all unique failing spec files
      - Remove unused `isSnapshotFailure` and `generateTestCommand` helper
      functions
      - Makes it easier to copy-paste and re-run all failures at once
      
      ## Test plan
      - Verify the generated PR comment format by inspecting the next CI run
      with test failures
      - The command section should show a single `npm run e2e` with
      backslash-joined spec file paths
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2605"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      
      <!-- This is an auto-generated description by cubic. -->
      ---
      ## Summary by cubic
      Simplified the Playwright PR comment to a single copy-paste command that
      re-runs all failing spec files at once. This reduces noise and speeds up
      local reproduction.
      
      - **Refactors**
      - Generate one command using backslash-joined unique failing spec paths;
      sanitize file paths.
      - Remove isSnapshotFailure and generateTestCommand; drop snapshot flags
      and error previews from the comment.
      
      <sup>Written for commit 9e24baa4782ab82cb93b7cbf3fa579063e269b51.
      Summary will update on new commits.</sup>
      
      <!-- End of auto-generated description by cubic. -->
      
      <!-- CURSOR_SUMMARY -->
      ---
      
      > [!NOTE]
      > **Low Risk**
      > Only changes CI comment output formatting/commands and removes unused
      helpers; no impact to test execution itself, but could slightly affect
      how developers re-run failures locally.
      > 
      > **Overview**
      > Simplifies the Playwright PR comment’s macOS re-run section to output
      a **single** `npm run e2e` command listing all *unique failing spec
      files*, instead of generating per-test `-g` commands.
      > 
      > Removes the snapshot-detection and per-test command helpers
      (`isSnapshotFailure`, `generateTestCommand`), dropping
      `--update-snapshots` suggestions and reducing comment noise.
      > 
      > <sup>Written by [Cursor
      Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
      9e24baa4782ab82cb93b7cbf3fa579063e269b51. This will update automatically
      on new commits. Configure
      [here](https://cursor.com/dashboard?tab=bugbot).</sup>
      <!-- /CURSOR_SUMMARY -->
      Co-authored-by: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      4aa7a011
    • wwwillchen-bot's avatar
      move ActionHeader from TitleBar to right side bar (#2553) · 05e5403f
      wwwillchen-bot 提交于
      ## Summary
      - Move the ActionHeader component from TitleBar into PreviewPanel where
      it logically belongs
      - Improve component organization by separating preview-related controls
      from the global title bar
      - Update ActionHeader styling to fit its new location with sidebar
      background
      
      ## Test plan
      - Verify the ActionHeader appears at the top of the PreviewPanel instead
      of in the title bar
      - Confirm the tab switching (Preview/Code/Console) functionality works
      correctly
      - Test the refresh and external link buttons work as expected
      - Verify the title bar still renders correctly with the spacer element
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2553"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      <!-- This is an auto-generated description by cubic. -->
      ---
      ## Summary by cubic
      Moved the preview action header into the PreviewPanel and added a right
      action sidebar for quick mode switching. Maintenance actions moved to a
      TitleBar “More” menu so controls are closer to their content.
      
      - New Features
      - RightActionSidebar on the chat page with buttons for Preview, Problems
      (with count), Code, Configure, Security, Publish.
      - TitleBar actions: Chat activity button and a “More” menu for Clean
      Rebuild and Clear Preview Data.
      
      - Refactors
      - Render ActionHeader at the top of PreviewPanel; remove it from
      TitleBar, drop useLocation, and add a spacer.
      - Polish styles for ActionHeader (px-2, sidebar background) and sidebar
      active/hover states.
      
      <sup>Written for commit 5cc7c53453f280024838a43fdd89a357abca3523.
      Summary will update on new commits.</sup>
      
      <!-- End of auto-generated description by cubic. -->
      
      ---------
      Co-authored-by: 's avatarWill Chen <willchen90@gmail.com>
      Co-authored-by: 's avatarClaude Opus 4.5 <noreply@anthropic.com>
      05e5403f
    • Will Chen's avatar
      fix(e2e): use correct page object sub-components in createGitConflict helper (#2604) · 552a705d
      Will Chen 提交于
      ## Summary
      - Fixed 4 TypeScript errors in `e2e-tests/git_collaboration.spec.ts`
      where the `createGitConflict` helper called
      `getTitleBarAppNameButton()`, `getCurrentAppPath()`, and `goToChatTab()`
      directly on `po` instead of through `po.appManagement` and
      `po.navigation`
      - Added PageObject sub-component pattern documentation to
      `rules/e2e-testing.md`
      
      ## Test plan
      - `npm run ts` passes with zero errors
      - All 784 unit tests pass
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2604"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      <!-- CURSOR_SUMMARY -->
      ---
      
      > [!NOTE]
      > **Low Risk**
      > E2E test refactor plus documentation only; no production logic
      changes, with minimal risk beyond potential test behavior differences if
      selectors were misrouted.
      > 
      > **Overview**
      > Updates `createGitConflict` in `e2e-tests/git_collaboration.spec.ts`
      to call UI helpers through the correct `PageObject` sub-components
      (e.g., `po.appManagement.*`, `po.navigation.*`) instead of nonexistent
      top-level `po` methods, resolving TypeScript errors.
      > 
      > Adds documentation to `rules/e2e-testing.md` describing the
      `PageObject` sub-component pattern and listing the primary
      sub-components to use in E2E tests.
      > 
      > <sup>Written by [Cursor
      Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
      c053dacf656833ad274881e97337f8a97c97f1ee. This will update automatically
      on new commits. Configure
      [here](https://cursor.com/dashboard?tab=bugbot).</sup>
      <!-- /CURSOR_SUMMARY -->
      
      <!-- This is an auto-generated description by cubic. -->
      ---
      ## Summary by cubic
      Fixed TypeScript errors in the createGitConflict e2e helper by using the
      correct PageObject sub-components (po.appManagement and po.navigation).
      Added docs in e2e-testing.md explaining the PageObject sub-component
      pattern to prevent calling methods directly on po.
      
      <sup>Written for commit c053dacf656833ad274881e97337f8a97c97f1ee.
      Summary will update on new commits.</sup>
      
      <!-- End of auto-generated description by cubic. -->
      Co-authored-by: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      552a705d
  2. 10 2月, 2026 25 次提交
    • Adekunle James Adeniji's avatar
      AI Conflict Resolver (#2240) · d70c8269
      Adekunle James Adeniji 提交于
      Solves part of #2207
      
      
      
      <!-- CURSOR_SUMMARY -->
      ---
      
      > [!NOTE]
      > Introduces an in-app merge conflict workflow with both AI-assisted and
      manual resolution, integrated into Git sync and branch merges.
      > 
      > - New `GithubConflictResolver` dialog: previews conflicting sections,
      "Auto-Resolve with AI" (with optional auto-approve) and "Accept Current
      Changes", and progresses through multi-file conflicts
      > - Integrated into `GitHubConnector` and `GithubBranchManager` to
      surface conflicts after failed push/merge, guide resolution, and then
      finalize via `ipc.github.completeMerge` (rebase-continue or merge
      commit)
      > - New IPC contracts/handlers: `github:get-conflicts`,
      `github:resolve-conflict` (writes/stages ours), `github:complete-merge`;
      plus improved conflict detection by checking conflicts directly on
      errors
      > - Enhanced error/rebase-state messaging and abort/continue flows;
      avoids relying on IPC-serialized error names
      > - E2E tests for AI and manual conflict resolution; fake LLM updated to
      emit conflict-fixing `dyad-write`
      > 
      > <sup>Written by [Cursor
      Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
      98b8aa07ef175a2806bbc0609b433279fbde78c8. This will update automatically
      on new commits. Configure
      [here](https://cursor.com/dashboard?tab=bugbot).</sup>
      <!-- /CURSOR_SUMMARY -->
      
      
      
      
      <!-- This is an auto-generated description by cubic. -->
      ---
      ## Summary by cubic
      Adds inline merge-conflict resolution with a chat-based flow and a
      cancel option. Conflict detection, streaming, and cancel behavior are
      more reliable; merges remain blocked until the repo is clean.
      
      - **New Features**
      - Inline conflict banner listing files, with “Resolve merge conflicts
      with AI” (opens a new chat, auto-starts streaming) and “Cancel sync”;
      buttons disable while resolving or cancelling.
      - New useResolveMergeConflictsWithAI hook that validates appId, guards
      rapid clicks, creates the chat, navigates, starts the stream, and
      refreshes chats/app on completion; integrated into GitHubConnector and
      GithubBranchManager and clears conflicts only after chat creation.
      - E2E tests for AI resolution and cancel flow; fake LLM supports new and
      legacy prompts; Electron IPC docs clarify stream start returns void and
      how to avoid duplicate streams.
      
      - **Bug Fixes**
      - Always fetch conflicts after failed sync/merge, not relying on
      serialized error names; clearer messages for rebase/merge states and
      when conflict checks fail.
      - Cancel sync only shows success when an abort actually occurs; clears
      conflicts and refreshes branches; buttons disable during cancellation.
      - Resets streaming state if stream setup or navigation fails; onError
      now refreshes chat list and app; e2e git commands quote filenames.
      
      <sup>Written for commit 8ec0dd605bdadbec9b64b64643c0010129c9735b.
      Summary will update on new commits.</sup>
      
      <!-- End of auto-generated description by cubic. -->
      
      
      
      
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2240">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      ---------
      Co-authored-by: 's avatarClaude Opus 4.5 <noreply@anthropic.com>
      Co-authored-by: 's avatarWill Chen <willchen90@gmail.com>
      d70c8269
    • Will Chen's avatar
      Add i18n internationalization support with language selector (#2450) · b1c4aa28
      Will Chen 提交于
      ## Summary
      - Set up i18n infrastructure using i18next with locale files for English
      (chat, common, errors, home, settings namespaces)
      - Add LanguageSelector component to the settings page for users to
      switch languages
      - Add language preference field to the app schema and integrate i18next
      provider in the app layout and renderer
      
      ## Test plan
      - Verify the app builds and starts without errors
      - Navigate to Settings and confirm the Language Selector is visible and
      functional
      - Confirm English translations load correctly across all namespaces
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2450">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      <!-- CURSOR_SUMMARY -->
      ---
      
      > [!NOTE]
      > **Medium Risk**
      > Broad UI text refactor plus new runtime language switching could
      surface missing keys, incorrect namespaces, or layout regressions,
      though changes are largely non-functional and localized to presentation.
      > 
      > **Overview**
      > Adds app-wide internationalization via `i18next`/`react-i18next`,
      including a new `src/i18n` initialization with bundled namespaces and
      locale resources.
      > 
      > Introduces a persisted `language` setting (validated by
      `LanguageSchema`) plus a new `LanguageSelector` UI, and syncs the active
      i18n language at startup in `RootLayout`.
      > 
      > Migrates many user-facing strings across chat, settings, integrations,
      dialogs, banners, and preview panel components to use `t()` translation
      keys (with interpolation/plurals) instead of hardcoded English, and adds
      an i18n design doc. Dependencies are updated in `package.json`/lockfile.
      > 
      > <sup>Written by [Cursor
      Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
      a996131500b0f99ea766036084972f9863aca81d. This will update automatically
      on new commits. Configure
      [here](https://cursor.com/dashboard?tab=bugbot).</sup>
      <!-- /CURSOR_SUMMARY -->
      
      <!-- This is an auto-generated description by cubic. -->
      ---
      ## Summary by cubic
      Add app-wide internationalization with i18next and a language selector
      in Settings. The chosen language persists and updates the UI instantly;
      ships with English, Simplified Chinese (zh-CN), and Brazilian Portuguese
      (pt-BR), aligned with the Linear issue, and migrates UI text across the
      app.
      
      - **New Features**
      - Initialize i18next/react-i18next with namespaces (common, settings,
      chat, home, errors) before render; sync to UserSettings.language on
      startup.
      - Add LanguageSelector in Settings → General showing only completed
      locales; saves validated values and switches UI language.
      - Include complete en, zh-CN, pt-BR translations, Intl-based
      date/number/relative-time helpers, and docs/i18n.md.
      
      - **Refactors**
        - Replace hardcoded strings with t() across 50+ components.
      - Validate settings.language via LanguageSchema.safeParse; defer
      changeLanguage to layout sync to avoid duplicates; add error handling
      for updateSettings; extract constants in formatRelativeTime.
      
      <sup>Written for commit b670b0489415ca966db1f70f0a1ad3111a455538.
      Summary will update on new commits.</sup>
      
      <!-- End of auto-generated description by cubic. -->
      
      ---------
      Co-authored-by: 's avatarClaude Opus 4.5 <noreply@anthropic.com>
      Co-authored-by: 's avatarclaude[bot] <41898282+claude[bot]@users.noreply.github.com>
      b1c4aa28
    • Will Chen's avatar
      Remove deprecated agent mode and consolidate with build mode (#2435) · a6baaef1
      Will Chen 提交于
      ## Summary
      - Remove "Build with MCP" option from chat mode selector dropdowns
      - Route build mode to MCP agent code path when MCP servers are enabled
      - Add MCP chip showing "N MCP" next to Build button when servers enabled
      - Show MCP tools picker in build mode when MCP servers are enabled
      - Skip deprecated agent mode in keyboard shortcut toggle cycle
      - Update e2e tests to use build mode instead of agent mode
      
      ## Test plan
      - [x] MCP e2e tests pass (verified locally)
      - [ ] Verify Build mode works normally without MCP servers configured
      - [ ] Configure an MCP server and verify the "N MCP" chip appears next
      to Build button
      - [ ] Verify clicking MCP tools picker shows enabled MCP servers
      - [ ] Verify sending a message in Build mode with MCP servers uses the
      agent code path
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2435">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      <!-- CURSOR_SUMMARY -->
      ---
      
      > [!NOTE]
      > **Medium Risk**
      > Changes the chat-mode UI and the main chat streaming branching so
      Build may enter the MCP/tooling code path when MCP servers are enabled;
      this can alter assistant behavior and tool-consent flows. Lockfile churn
      may also affect dependency installs across environments.
      > 
      > **Overview**
      > **Removes the user-facing “Build with MCP”/`agent` mode selection**
      and treats stored `agent` settings as **Build** for backwards
      compatibility.
      > 
      > **Build now conditionally enables MCP tooling**: the MCP tools picker
      appears in Build only when at least one MCP server is enabled, and the
      main streaming handler runs the MCP agent pre-pass only when Build has
      enabled MCP servers (or when legacy `agent` is set).
      > 
      > Adds a small **“N MCP” status chip** next to Build when MCP servers
      are enabled, updates the keyboard mode-toggle cycle to skip deprecated
      `agent`, updates MCP e2e tests to select Build, and includes a large
      `package-lock.json` metadata update (peer flag changes).
      > 
      > <sup>Written by [Cursor
      Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
      6338761b9e45313d399dd2f4873e5ef9a53ff36a. This will update automatically
      on new commits. Configure
      [here](https://cursor.com/dashboard?tab=bugbot).</sup>
      <!-- /CURSOR_SUMMARY -->
      
      <!-- This is an auto-generated description by cubic. -->
      ---
      ## Summary by cubic
      Removed the deprecated Agent mode by folding it into Build. Build now
      uses MCP tooling only when MCP servers are enabled; the UI shows an MCP
      count chip and tools picker, and old “agent” settings still work.
      
      - **Refactors**
      - Removed Agent from mode selectors; legacy “agent” appears as Build and
      the keyboard toggle skips it.
      - Build routes through the MCP agent path only when enabled MCP servers
      exist; otherwise behaves like normal Build.
      - Preserved compatibility for users with “agent” in settings and in the
      streaming path.
      - Updated E2E tests to use Build and aligned test_helper with the
      modular PageObject structure.
      
      - **New Features**
        - Added an “N MCP” chip next to Build when servers are enabled.
        - Show the MCP tools picker in Build when MCP servers are enabled.
      
      <sup>Written for commit 6338761b9e45313d399dd2f4873e5ef9a53ff36a.
      Summary will update on new commits.</sup>
      
      <!-- End of auto-generated description by cubic. -->
      
      ---------
      Co-authored-by: 's avatarClaude Opus 4.5 <noreply@anthropic.com>
      Co-authored-by: 's avatarclaude[bot] <41898282+claude[bot]@users.noreply.github.com>
      a6baaef1
    • Will Chen's avatar
      refactor(ci): simplify workflows by removing workflow_dispatch and using PAT for pushes (#2598) · 743672c3
      Will Chen 提交于
      ## Summary
      - Remove `workflow_dispatch` inputs from CI, BugBot, and Claude PR
      Review workflows since pushes made with `PR_CONTENTS_RW_GITHUB_TOKEN` (a
      PAT) now naturally trigger downstream workflows via `pull_request
      synchronize` events
      - Simplify checkout logic across all workflows by removing
      fork-resolution steps that were only needed for `workflow_dispatch`
      - Remove manual workflow re-triggering in `pr-review-responder.yml`
      since PAT-based pushes handle this automatically
      
      #skip-bugbot
      
      ## Test plan
      - Verify CI workflows trigger correctly on PR push events from fork PRs
      - Verify BugBot and Claude PR Review trigger on `pull_request_target`
      events
      - Verify `pr-review-responder` pushes with PAT correctly trigger
      downstream workflows without manual `workflow_dispatch` calls
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2598"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      <!-- This is an auto-generated description by cubic. -->
      ---
      ## Summary by cubic
      Streamlined GitHub Actions by removing workflow_dispatch paths and
      switching to PAT-based pushes so pull_request synchronize events
      naturally trigger CI, BugBot, and Claude review. This reduces custom
      logic and makes fork PRs behave consistently.
      
      - **Refactors**
      - Removed workflow_dispatch and pr_number inputs from CI, BugBot, and
      Claude PR Review.
      - Checkout now uses pull_request head repo/ref; dropped fork-resolution
      logic.
      - Rebase and pr-review-responder push with PR_CONTENTS_RW_GITHUB_TOKEN
      to emit real synchronize events.
        - BugBot comment now uses WWWILLCHEN_PR_RW_PAT.
      - Simplified concurrency groups; removed manual re-triggers in
      pr-review-responder.
      
      - **Migration**
      - Ensure secrets exist: PR_CONTENTS_RW_GITHUB_TOKEN (contents:
      read/write) and WWWILLCHEN_PR_RW_PAT.
      - Verify CI, BugBot, and Claude run on pull_request synchronize from
      fork PRs; no manual reruns needed.
      
      <sup>Written for commit b8950ec974c1c8b4ae52f1ff200fa0edc4b296d8.
      Summary will update on new commits.</sup>
      
      <!-- End of auto-generated description by cubic. -->
      
      ---------
      Co-authored-by: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      743672c3
    • Will Chen's avatar
      Create sub-agents which are supervised for claude workflows (#2597) · 36639651
      Will Chen 提交于
      #skip-bb
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2597"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      36639651
    • Will Chen's avatar
      fix: use PAT for label-rebase-prs to trigger rebase workflow (#2596) · 0506d50d
      Will Chen 提交于
      ## Summary
      - Labels added by `GITHUB_TOKEN` don't trigger `pull_request_target`
      events (GitHub limitation to prevent loops)
      - `label-rebase-prs.yml` was adding `cc:rebase` via the default token,
      so `claude-rebase.yml` never fired
      - Switch to `GITHUB_PR_RW_TOKEN` (fine-grained PAT with PR read/write)
      so label events trigger the rebase workflow
      - Added `environment: ai-bots` to access the secret
      - Documented the `GITHUB_TOKEN` workflow chaining gotcha in
      `rules/git-workflow.md`
      
      ## Test plan
      - Add `GITHUB_PR_RW_TOKEN` as a fine-grained PAT secret in the `ai-bots`
      environment (needs `Pull requests: Read and write` permission on
      `dyad-sh/dyad`)
      - Push to `main` while a conflicting PR exists from an allowed author —
      verify `cc:rebase` label is added AND `claude-rebase.yml` triggers
      
      #skip-bugbot
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2596"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      <!-- This is an auto-generated description by cubic. -->
      ---
      ## Summary by cubic
      Switch label-rebase-prs to use a fine-grained PAT (PR_RW_GITHUB_TOKEN)
      so adding cc:rebase triggers the claude-rebase pull_request_target
      workflow. Document the GITHUB_TOKEN workflow-chaining limitation and
      load the token from the ai-bots environment.
      
      - **Migration**
      - Add PR_RW_GITHUB_TOKEN as an environment secret in ai-bots
      (fine-grained PAT with Pull requests: Read and write on dyad-sh/dyad).
      
      <sup>Written for commit 2ff7d85a011aa53cff631f6490795ca4148f9f1c.
      Summary will update on new commits.</sup>
      
      <!-- End of auto-generated description by cubic. -->
      Co-authored-by: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      0506d50d
    • Will Chen's avatar
      fix: use stable artifact name for Playwright HTML report (#2595) · 9f347f29
      Will Chen 提交于
      ## Summary
      - Remove the `run_attempt` suffix from the `html-report` artifact name
      in CI and the downstream Playwright comment workflow
      - Use `overwrite: true` so re-runs replace the previous artifact in
      place instead of creating a differently-named one that downstream
      workflows can't find
      - Fixes the issue where re-running failed CI jobs produced
      `html-report--attempt-2.zip` but the comment workflow expected
      `html-report--attempt-1.zip`
      
      ## Test plan
      - Re-run a failed CI workflow and verify the Playwright comment workflow
      can still find and download the HTML report artifact
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2595"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      
      <!-- This is an auto-generated description by cubic. -->
      ---
      ## Summary by cubic
      Use a stable artifact name for the Playwright HTML report and enable
      overwrite so re-runs replace the same artifact. This fixes the comment
      workflow failing to download the report after CI re-runs.
      
      - **Bug Fixes**
        - CI uploads the report as "html-report" with overwrite: true.
      - Comment workflow downloads "html-report" instead of attempt-specific
      names.
      
      <sup>Written for commit 96e5dcee43b5f03f602d31111afbe9860964b280.
      Summary will update on new commits.</sup>
      
      <!-- End of auto-generated description by cubic. -->
      
      <!-- CURSOR_SUMMARY -->
      ---
      
      > [!NOTE]
      > **Low Risk**
      > Low risk workflow-only change that standardizes artifact naming and
      enables overwriting on reruns; main risk is misnaming would break the
      downstream report download.
      > 
      > **Overview**
      > Makes the Playwright HTML report artifact name stable across CI reruns
      by removing the `run_attempt` suffix in `ci.yml` and updating
      `playwright-comment.yml` to download the fixed `html-report` artifact.
      > 
      > Enables `overwrite: true` on the uploaded HTML report so reruns
      replace the prior artifact instead of creating a new name that the
      comment workflow can’t find.
      > 
      > <sup>Written by [Cursor
      Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
      96e5dcee43b5f03f602d31111afbe9860964b280. This will update automatically
      on new commits. Configure
      [here](https://cursor.com/dashboard?tab=bugbot).</sup>
      <!-- /CURSOR_SUMMARY -->
      Co-authored-by: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      9f347f29
    • Mohamed Aziz Mejri's avatar
      Adding a shortcut for zooming (#2562) · f04a83d0
      Mohamed Aziz Mejri 提交于
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2562"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      <!-- This is an auto-generated description by cubic. -->
      ---
      ## Summary by cubic
      Adds keyboard shortcuts for zooming (Ctrl/Cmd + =, -, 0) and ties zoom
      to user settings for consistent behavior across the app. Moves zoom
      handling from the Electron menu to a client-side React hook.
      
      - **New Features**
      - Added useZoomShortcuts to handle zoom in/out/reset and update
      settings.zoomLevel.
      - Supports levels 90, 100, 110, 125, 150 (default 100) on Mac (Cmd) and
      Windows/Linux (Ctrl).
      
      - **Refactors**
      - Centralized ZOOM_LEVELS and DEFAULT_ZOOM_LEVEL in schemas, derived
      from ZoomLevelSchema.options.
      - Removed Electron zoom roles and initialized the shortcut hook in
      RootLayout.
      - Prevent shortcuts from firing in inputs, textareas, and
      contenteditable elements.
      
      <sup>Written for commit cb368231e86d859a8e7397d237bb86e460ca7023.
      Summary will update on new commits.</sup>
      
      <!-- End of auto-generated description by cubic. -->
      
      ---------
      Co-authored-by: 's avatarClaude Opus 4.5 <noreply@anthropic.com>
      f04a83d0
    • wwwillchen-bot's avatar
      refactor(ProModeSelector): wrap build mode settings in accordion (#2555) · efcc2958
      wwwillchen-bot 提交于
      ## Summary
      - Refactored the ProModeSelector component to group build mode settings
      (Web Access, Turbo Edits, Smart Context) inside a collapsible accordion
      - Improves UI organization by reducing visual clutter in the popover
      
      ## Test plan
      - Open the Pro Mode selector in the app
      - Verify the "Build mode settings" accordion is present
      - Expand/collapse the accordion and verify all settings (Web Access,
      Turbo Edits, Smart Context) are accessible
      - Test toggling each setting within the accordion
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2555"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      <!-- This is an auto-generated description by cubic. -->
      ---
      ## Summary by cubic
      Grouped Pro build mode settings (Web Access, Turbo Edits, Smart Context)
      into a collapsible accordion in ProModeSelector to declutter the
      popover. No behavior changes; tests now expand the accordion before
      toggling these settings.
      
      - **Refactors**
      - Wrapped the three settings under a "Build mode settings" accordion
      with smoother height transitions using Base UI’s panel API.
      - Updated rules to clarify our Accordion uses Base UI (not Radix/shadcn)
      and added E2E guidance for accordion-wrapped settings.
      
      - **Bug Fixes**
      - E2E helper now expands the accordion before changing Smart Context or
      Turbo Edits.
      
      <sup>Written for commit 025d159d427e8f9c59372f71374da18a6420ff00.
      Summary will update on new commits.</sup>
      
      <!-- End of auto-generated description by cubic. -->
      
      ---------
      Co-authored-by: 's avatarWill Chen <willchen90@gmail.com>
      Co-authored-by: 's avatarClaude Opus 4.5 <noreply@anthropic.com>
      Co-authored-by: 's avatarclaude[bot] <41898282+claude[bot]@users.noreply.github.com>
      efcc2958
    • Will Chen's avatar
      Github workflows readme (#2594) · 1b64ee3f
      Will Chen 提交于
      #skip-bb
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2594"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      
      <!-- This is an auto-generated description by cubic. -->
      ---
      ## Summary by cubic
      Added a README in .github/workflows that explains all GitHub Actions:
      what they do, when they run, and what labels they set. It includes
      simple diagrams for issue/PR flows and a table covering each workflow’s
      purpose, triggers, and outputs to make CI/CD and automation easier to
      understand.
      
      <sup>Written for commit bb4105a1c27a74c22556ac71811c4e6e691e1f60.
      Summary will update on new commits.</sup>
      
      <!-- End of auto-generated description by cubic. -->
      1b64ee3f
    • Will Chen's avatar
      feat: add workflow to draft stale PRs after 7 days of inactivity (#2586) · d13e0738
      Will Chen 提交于
      ## Summary
      - Adds a new daily GitHub Actions workflow (`draft-stale-prs.yml`) that
      automatically converts open PRs to draft state when there has been no
      activity for 7 days
      - Checks four activity signals: last commit push, issue comments, review
      comments, and reopen events
      - Leaves a comment explaining why the PR was converted to draft
      
      ## Test plan
      - [ ] Trigger the workflow manually via `workflow_dispatch` and verify
      it runs without errors
      - [ ] Verify it skips PRs that are already in draft state
      - [ ] Verify it correctly identifies stale PRs with no activity in 7
      days
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2586"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      <!-- CURSOR_SUMMARY -->
      ---
      
      > [!NOTE]
      > **Low Risk**
      > CI/workflow-only change that affects PR state and adds comments; main
      risk is unintended drafting due to activity detection edge cases or
      API/rate-limit behavior.
      > 
      > **Overview**
      > Adds a new scheduled/manual GitHub Actions workflow
      (`draft-stale-prs.yml`) that scans open PRs and converts *non-draft* PRs
      to draft when there has been no activity for 7+ days.
      > 
      > The workflow computes “last activity” from the latest commit, non-bot
      issue comments, review comments, review submissions, and
      `reopened`/`ready_for_review` timeline events, then posts an explanatory
      comment after converting; it also caps processing to 30 PRs and aborts
      on rate-limit/permission errors.
      > 
      > <sup>Written by [Cursor
      Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
      c9fc2ae9527e48f4ab4452ce0f2ecb2c0eb5f2fa. This will update automatically
      on new commits. Configure
      [here](https://cursor.com/dashboard?tab=bugbot).</sup>
      <!-- /CURSOR_SUMMARY -->
      
      ---------
      Co-authored-by: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      d13e0738
    • Will Chen's avatar
      feat: add needs-human PR status labels and unified review marker (#2589) · 56c2b0fc
      Will Chen 提交于
      ## Summary
      - Add two new `needs-human:*` labels to triage PRs:
      `needs-human:review-issue` (PR needs attention) and
      `needs-human:final-check` (PR is green and ready for merge)
      - Create shared `scripts/pr-status-labeler.js` that determines the
      correct label based on CI conclusion + latest Dyadbot code review
      comment
      - Create new `pr-status-labeler.yml` workflow for PRs not managed by the
      cc:request retry loop
      - Update `pr-review-responder.yml` to apply needs-human labels at
      terminal states (cc:done, cc:failed, retries exhausted)
      - Unify review comment headers to "Dyadbot Code Review Summary" across
      both multi-agent and swarm review skills for reliable detection
      
      ## Test plan
      - [ ] Open a test PR with passing CI and clean review → verify
      `needs-human:final-check` label is added
      - [ ] Open a test PR with failing CI → verify `needs-human:review-issue`
      label is added
      - [ ] Verify PRs with `cc:request*` labels are skipped by the new
      `pr-status-labeler` workflow
      - [ ] Verify labels are mutually exclusive (adding one removes the
      other)
      - [ ] Verify review comments show the new "Dyadbot Code Review Summary"
      header
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2589"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      <!-- This is an auto-generated description by cubic. -->
      ---
      ## Summary by cubic
      Automatically labels PRs as needs-human:review-issue or
      needs-human:final-check based on CI and the latest Dyadbot review.
      Standardizes the review comment header to “Dyadbot Code Review Summary”
      and hardens detection with stale-review checks, pagination, and atomic
      label updates.
      
      - New Features
      - Added scripts/pr-status-labeler.js to choose labels using CI
      conclusion + latest “Dyadbot Code Review Summary”.
      - New pr-status-labeler.yml runs on CI completion; skips PRs with
      cc:request* or cc:pending; checks out the default branch for trusted
      scripts.
      - pr-review-responder.yml applies needs-human labels at terminal states
      and checks out the base repo so the shared script is always present.
      
      - Bug Fixes
      - Hardened review parsing: match only non-zero severities, allow
      LOW-only pass, default fail-closed, and verify bot author.
      - Paginate comment fetch and detect stale reviews by comparing review
      time to the latest commit.
      - Make label changes atomic with setLabels; ensureLabel now only
      swallows 422 errors.
      
      <sup>Written for commit 2fc253289e509cddbf6ed6202f4bce2435cbc791.
      Summary will update on new commits.</sup>
      
      <!-- End of auto-generated description by cubic. -->
      
      <!-- CURSOR_SUMMARY -->
      ---
      
      > [!NOTE]
      > **Medium Risk**
      > Touches GitHub Actions automation that edits PR labels based on CI and
      bot comments, so misclassification could affect review/merge triage.
      Changes are localized to workflows/scripts and are fail-closed when
      review format is unrecognized.
      > 
      > **Overview**
      > Adds automated PR status labeling via new `needs-human:review-issue`
      and `needs-human:final-check` labels, driven by CI conclusion plus the
      latest Dyadbot review summary comment.
      > 
      > Introduces shared `scripts/pr-status-labeler.js` and a new
      `pr-status-labeler.yml` workflow to apply these labels for PRs *not* in
      the `cc:request*` retry loop; updates `pr-review-responder.yml` to apply
      the same labeling at terminal states and when retries are exhausted
      (including a base-repo checkout so the script is available for fork
      PRs).
      > 
      > Standardizes the review summary header/footer text across multi-agent
      and swarm review outputs to `Dyadbot Code Review Summary` so the labeler
      can reliably detect and evaluate review cleanliness.
      > 
      > <sup>Written by [Cursor
      Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
      2fc253289e509cddbf6ed6202f4bce2435cbc791. This will update automatically
      on new commits. Configure
      [here](https://cursor.com/dashboard?tab=bugbot).</sup>
      <!-- /CURSOR_SUMMARY -->
      
      ---------
      Co-authored-by: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      56c2b0fc
    • wwwillchen-bot's avatar
      Add GitHub Actions workflow for auto-merging PRs (#2588) · 06d25a33
      wwwillchen-bot 提交于
      ## Summary
      - Adds a new GitHub Actions workflow (`merge-pr.yml`) that automatically
      merges PRs when CI passes
      - Only merges PRs authored by allowed users (wwwillchen, wwwillchen-bot)
      - Requires the "merge-when-ready" label to be present on the PR
      - Uses squash merge for a clean commit history
      
      ## Test plan
      - Verify the workflow file syntax is valid
      - Create a test PR with the "merge-when-ready" label and verify it
      auto-merges after CI passes
      - Verify PRs without the label or from non-allowed authors are not
      auto-merged
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2588"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      <!-- This is an auto-generated description by cubic. -->
      ---
      ## Summary by cubic
      Adds a GitHub Actions workflow that auto-merges PRs via squash after CI
      succeeds, gated by the "merge-when-ready" label and an allowed author
      list. Improves reliability with targeted PR lookup, pagination for
      checks, and explicit guards to avoid ambiguous or incomplete states.
      
      - **New Features**
      - Adds .github/workflows/merge-pr.yml triggered on CI workflow_run
      completion for pull_request events.
      - Finds the PR via workflow_run.pull_requests; refuses merge if multiple
      PRs are linked; fallback uses commit lookup with head_branch match and
      refuses merge if multiple open PRs; confirms the PR is open.
      - Validates all check suites with pagination; skips
      neutral/skipped/cancelled, the workflow’s own suite, and
      workflow_run-triggered suites; requires at least one successful suite;
      uses sha in merge to prevent race conditions; parses allowed authors
      from env robustly.
      
      <sup>Written for commit a007deffa6b3c8807833dcee702fa99179f9fe7e.
      Summary will update on new commits.</sup>
      
      <!-- End of auto-generated description by cubic. -->
      
      ---------
      Co-authored-by: 's avatarWill Chen <willchen90@gmail.com>
      Co-authored-by: 's avatarClaude Opus 4.5 <noreply@anthropic.com>
      06d25a33
    • wwwillchen-bot's avatar
      Add pr-screencast command and update claude settings (#2591) · 9afcf74a
      wwwillchen-bot 提交于
      ## Summary
      - Add new pr-screencast.md command for creating screencasts from PRs
      - Update .claude/settings.json with latest configuration
      
      ## Test plan
      - Verify the pr-screencast command is available in claude commands
      - Test the command functionality with a sample PR
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2591"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      <!-- This is an auto-generated description by cubic. -->
      ---
      ## Summary by cubic
      Adds a pr-screencast command that records a screenshot-based walkthrough
      for user-facing PRs and posts it as a new PR comment. Uses an assets
      branch for image hosting and updates Claude settings to allow Playwright
      tests and safe cleanup.
      
      - New Features
      - Adds .claude/commands/dyad/pr-screencast.md to detect the PR, skip
      non-user-facing changes, generate a temporary Playwright script to
      capture 2–4 screenshots, upload, post a walkthrough comment, then clean
      up (with up to 3 retries on failures).
      - Updates .claude/settings.json to allow npx playwright test and cleanup
      commands; fixes glob patterns and the test assertion, creates the
      screenshot dir inside the test, restricts rm paths, softens permission
      prompts, and removes unused GitHub release and ffmpeg permissions.
      
      <sup>Written for commit ed8bfa15f0da25f111fcd065b0d8d057c6e6691e.
      Summary will update on new commits.</sup>
      
      <!-- End of auto-generated description by cubic. -->
      
      ---------
      Co-authored-by: 's avatarWill Chen <willchen90@gmail.com>
      Co-authored-by: 's avatarClaude Opus 4.5 <noreply@anthropic.com>
      Co-authored-by: 's avatarclaude[bot] <41898282+claude[bot]@users.noreply.github.com>
      9afcf74a
    • Will Chen's avatar
      feat: add daily deflake-e2e-recent-prs skill and workflow (#2590) · 1e90ac6b
      Will Chen 提交于
      ## Summary
      - Add new `/dyad:deflake-e2e-recent-prs` command that automatically
      gathers flaky E2E tests from recent PR Playwright summary comments,
      ranks them by frequency, and deflakes them sequentially
      - Add `claude-deflake-e2e.yml` GitHub Actions workflow that runs daily
      at 2 AM PST on self-hosted macOS runners (with workflow_dispatch support
      for manual triggers)
      - Document the new command in `.claude/README.md`
      
      ## Test plan
      - Trigger the workflow manually via `gh workflow run
      claude-deflake-e2e.yml` and verify it correctly scans recent PRs for
      flaky tests and attempts to deflake them
      - Verify the cron schedule triggers at the expected time
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2590"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      <!-- CURSOR_SUMMARY -->
      ---
      
      > [!NOTE]
      > **Medium Risk**
      > Adds a scheduled GitHub Action with write permissions that can open
      PRs, so misconfiguration or prompt issues could create noisy/unintended
      changes; however it’s limited to CI/automation and test-only guidance.
      > 
      > **Overview**
      > Adds a new Claude slash command, `/dyad:deflake-e2e-recent-prs`, that
      scans recent PR comments for Playwright “Flaky Tests”, ranks them by
      frequency, and runs deflaking steps per spec (including guidance to
      disable retries via `PLAYWRIGHT_RETRIES=0`) before optionally opening a
      fix PR.
      > 
      > Introduces a scheduled/manual GitHub Actions workflow
      (`claude-deflake-e2e.yml`) that runs daily on self-hosted macOS ARM64,
      installs dependencies/browsers, and invokes the new command via
      `anthropics/claude-code-action`. Documentation is updated to list the
      new command and the existing `/dyad:deflake-e2e` instructions are
      tightened to always disable Playwright retries.
      > 
      > <sup>Written by [Cursor
      Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
      10b9158363c6b9ae9a3f3ba52ad118149fb9cbd3. This will update automatically
      on new commits. Configure
      [here](https://cursor.com/dashboard?tab=bugbot).</sup>
      <!-- /CURSOR_SUMMARY -->
      
      <!-- This is an auto-generated description by cubic. -->
      ---
      ## Summary by cubic
      Adds a new /dyad:deflake-e2e-recent-prs command that scans recent PRs
      for Playwright flake reports, ranks flaky tests, and deflakes them. Adds
      a daily GitHub Action that runs it at 10:00 UTC (2 AM PST / 3 AM PDT) on
      self‑hosted macOS ARM64 to keep E2E tests stable.
      
      - **New Features**
      - Command scans recent PRs (default 20), parses Playwright summary
      comments from github-actions[bot], ranks by frequency, and deflakes
      specs sequentially; can push fixes via /dyad:pr-push.
      - New claude-deflake-e2e.yml workflow supports manual dispatch with
      pr_count, sets up Node/pnpm, installs Chromium, builds the fake LLM
      server, and runs the command via anthropics/claude-code-action.
      
      - **Bug Fixes**
      - Fixed spec path handling (no double .spec.ts), added gh api
      --paginate, switched to generic PR search, clarified {owner}/{repo} vs
      <pr_number>, and noted DST in the cron comment.
      - Disabled Playwright automatic retries in all deflake steps to prevent
      false passes, including debug and snapshot update commands.
      
      <sup>Written for commit 10b9158363c6b9ae9a3f3ba52ad118149fb9cbd3.
      Summary will update on new commits.</sup>
      
      <!-- End of auto-generated description by cubic. -->
      
      ---------
      Co-authored-by: 's avatarClaude Opus 4.5 <noreply@anthropic.com>
      1e90ac6b
    • wwwillchen-bot's avatar
      refactor: expose PageObject component page objects publicly (#2582) · dcf06ece
      wwwillchen-bot 提交于
      ## Summary
      - Updated PageObject class to expose component page objects
      (chatActions, previewPanel, codeEditor, etc.) as public properties
      instead of private
      - Updated all e2e spec files to use explicit component access pattern
      (e.g., `po.chatActions.sendPrompt()` instead of `po.sendPrompt()`)
      - Makes the test code more modular and explicit about which component is
      being used
      
      ## Test plan
      - [x] All 784 unit tests pass
      - [x] TypeScript type checking passes
      - [x] Linting passes
      - [ ] E2E tests should be run via CI
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2582"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      <!-- This is an auto-generated description by cubic. -->
      ---
      ## Summary by cubic
      Refactored the e2e PageObject to expose component objects publicly and
      added delegated helpers (sendPrompt, importApp) for shorter calls. Tests
      now use explicit component access with shorthand for common actions,
      making code clearer and easier to maintain.
      
      - **Refactors**
      - Exposed component objects on PageObject (chatActions, previewPanel,
      codeEditor, modelPicker, settings, navigation, toastNotifications,
      appManagement, securityReview, agentConsent, githubConnector).
      - Added PageObject.sendPrompt() and PageObject.importApp() delegates;
      updated specs to use them for brevity.
      - Removed monolithic wrappers; no functional app changes—test-only
      refactor.
      
      - **Migration**
      - Use component methods directly (e.g.,
      po.previewPanel.selectPreviewMode(), po.settings.recordSettings(),
      po.toastNotifications.waitForToastWithText()).
      - Prefer po.sendPrompt() and po.importApp() for common actions; replace
      old PageObject methods with component or delegate equivalents.
      
      <sup>Written for commit 15cf1998d7f9b06e0fe6e53f8cc36f4f3c42e630.
      Summary will update on new commits.</sup>
      
      <!-- End of auto-generated description by cubic. -->
      
      ---------
      Co-authored-by: 's avatarWill Chen <willchen90@gmail.com>
      Co-authored-by: 's avatarClaude Opus 4.5 <noreply@anthropic.com>
      dcf06ece
    • Will Chen's avatar
      ci: auto-label conflicting PRs with cc:rebase on main push (#2587) · 0f8ee17d
      Will Chen 提交于
      ## Summary
      - Adds a new GitHub Actions workflow that runs on every push to `main`
      - Checks all open, non-draft PRs by `wwwillchen` and `wwwillchen-bot`
      for merge conflicts
      - Automatically adds the `cc:rebase` label to conflicting PRs, which
      triggers the existing `claude-rebase` workflow to auto-rebase them
      
      ## Test plan
      - [ ] Push to main and verify the workflow runs
      - [ ] Confirm PRs with merge conflicts get the `cc:rebase` label added
      - [ ] Confirm PRs that are already mergeable are skipped
      - [ ] Confirm PRs with existing `cc:rebase` or `cc:rebasing` labels are
      not re-labeled
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2587"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      <!-- CURSOR_SUMMARY -->
      ---
      
      > [!NOTE]
      > **Low Risk**
      > CI-only change that adds an automated labeling workflow; main risk is
      unintended label churn or extra API usage, not production code impact.
      > 
      > **Overview**
      > Adds a new GitHub Actions workflow (`label-rebase-prs.yml`) that runs
      on every push to `main` and iterates through open PRs from
      `wwwillchen`/`wwwillchen-bot`, skipping drafts.
      > 
      > For PRs whose `mergeable_state` is `dirty`, it auto-applies the
      `cc:rebase` label (with retries when mergeability is initially `null`)
      while avoiding PRs already labeled `cc:rebase`, `cc:rebasing`, or
      `cc:rebase-failed`, enabling the existing `cc:rebase`-triggered rebase
      automation to kick in.
      > 
      > <sup>Written by [Cursor
      Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
      6bb04a1103190000f1aa4e9d71c4bea7def321c6. This will update automatically
      on new commits. Configure
      [here](https://cursor.com/dashboard?tab=bugbot).</sup>
      <!-- /CURSOR_SUMMARY -->
      
      <!-- This is an auto-generated description by cubic. -->
      ---
      ## Summary by cubic
      Adds a workflow that runs on every push to main and auto-labels
      conflicting PRs with cc:rebase to trigger the existing auto-rebase job.
      Reduces manual rebase work and keeps bot/author PRs up to date.
      
      - **New Features**
      - Runs on push to main; scans open, non-draft PRs by wwwillchen and
      wwwillchen-bot.
      - Detects conflicts via mergeable_state: 'dirty' and adds cc:rebase;
      skips PRs already labeled cc:rebase, cc:rebasing, or cc:rebase-failed.
      - Retries mergeability up to 3 times with exponential backoff; uses a
      concurrency group and per-PR try/catch to avoid duplicate runs and job
      aborts.
      
      <sup>Written for commit 6bb04a1103190000f1aa4e9d71c4bea7def321c6.
      Summary will update on new commits.</sup>
      
      <!-- End of auto-generated description by cubic. -->
      
      ---------
      Co-authored-by: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      0f8ee17d
    • Will Chen's avatar
      fix: skip package-lock.json in pr-push unless package.json changed (#2585) · 88afa495
      Will Chen 提交于
      ## Summary
      - Update the `pr-push` command to never stage `package-lock.json` unless
      `package.json` has also been modified
      - If `package-lock.json` is dirty but `package.json` is not, the
      lockfile changes are discarded via `git checkout`
      - Prevents spurious lockfile diffs from polluting commits and PRs
      
      ## Test plan
      - Run `/dyad:pr-push` with a dirty `package-lock.json` but no changes to
      `package.json` — verify the lockfile is not committed
      - Run `/dyad:pr-push` with both `package.json` and `package-lock.json`
      modified — verify both are committed
      
      #skip-bugbot
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2585"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      
      <!-- This is an auto-generated description by cubic. -->
      ---
      ## Summary by cubic
      Update the pr-push command to skip staging package-lock.json unless
      package.json also changed. Prevents spurious lockfile diffs from local
      npm install and keeps commits and PRs clean.
      
      <sup>Written for commit dce6ac590eb28b9b46857075ece299bc4528a715.
      Summary will update on new commits.</sup>
      
      <!-- End of auto-generated description by cubic. -->
      Co-authored-by: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      88afa495
    • Will Chen's avatar
      ci: skip tests when only .claude/ or rules/ files changed (#2584) · edf798ad
      Will Chen 提交于
      ## Summary
      - Broadens the CI `check-changes` step to also skip tests when all
      changed files are in `rules/` (in addition to `.claude/`)
      - PRs that only modify agent rules or Claude config no longer trigger
      the full build + E2E test suite
      
      ## Test plan
      - Open a PR that only changes files in `rules/` — CI should skip tests
      - Open a PR that only changes files in `.claude/` — CI should still skip
      tests (existing behavior)
      - Open a PR that changes both `rules/` and source files — CI should run
      tests
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2584"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      
      <!-- This is an auto-generated description by cubic. -->
      ---
      ## Summary by cubic
      Update CI to skip tests when all changed files are in .claude/ or
      rules/, so config/rule-only PRs don’t run the full build and E2E suite.
      Also updates package-lock.json to version 0.36.0.
      
      <sup>Written for commit a29ca0ab88f5293b2c88ee2e96b270902f69623c.
      Summary will update on new commits.</sup>
      
      <!-- End of auto-generated description by cubic. -->
      
      <!-- CURSOR_SUMMARY -->
      ---
      
      > [!NOTE]
      > **Low Risk**
      > CI-only change that adjusts when tests run; main risk is accidentally
      skipping tests if path filters are too broad or mis-handle edge cases.
      > 
      > **Overview**
      > Broadens the CI change-detection logic so the `build` and `e2e-tests`
      jobs are skipped when a PR only touches configuration directories
      (`.claude/` *or* `rules/`), and updates logging/variable naming to
      reflect the new scope.
      > 
      > Updates `package-lock.json` to bump the project version from
      `0.36.0-beta.2` to `0.36.0`.
      > 
      > <sup>Written by [Cursor
      Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
      a29ca0ab88f5293b2c88ee2e96b270902f69623c. This will update automatically
      on new commits. Configure
      [here](https://cursor.com/dashboard?tab=bugbot).</sup>
      <!-- /CURSOR_SUMMARY -->
      Co-authored-by: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      edf798ad
    • Will Chen's avatar
      fix: configure push remote for fork PRs in claude-rebase workflow (#2583) · 1d524ff6
      Will Chen 提交于
      ## Summary
      - `claude-code-action` overwrites origin's fetch URL to point to the
      base repo (`dyad-sh/dyad`), causing the rebase workflow to push to
      upstream instead of the fork
      - Added a `Configure push remote for fork PRs` step (matching
      `pr-review-responder.yml`) that sets `pushurl` on origin to point to the
      fork repo
      - Added a learning to `rules/git-workflow.md` documenting this
      `claude-code-action` behavior
      
      ## Test plan
      - Apply `cc:rebase` label to a fork PR and verify the rebase pushes to
      the fork, not the base repo
      
      #skip-bugbot
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2583"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      
      <!-- This is an auto-generated description by cubic. -->
      ---
      ## Summary by cubic
      Ensure claude-rebase pushes to the contributor’s fork instead of the
      base repo by setting a push-only remote for fork PRs. Also documents
      this claude-code-action behavior in git workflow rules.
      
      - **Bug Fixes**
      - Add a “Configure push remote for fork PRs” step to claude-rebase.yml
      that sets origin’s pushurl to the PR head repo using GITHUB_TOKEN, so
      pushes go to the fork even if claude-code-action rewrites origin’s fetch
      URL; matches pr-review-responder.yml.
      
      <sup>Written for commit dbd6a1082657c8a162b137682e1f3c30df697e94.
      Summary will update on new commits.</sup>
      
      <!-- End of auto-generated description by cubic. -->
      Co-authored-by: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      1d524ff6
    • Will Chen's avatar
      feat: broaden safe pipe whitelist in gh permission hook (#2581) · 7fb395bf
      Will Chen 提交于
      ## Summary
      - Expanded the safe pipe destinations whitelist in the GitHub CLI
      permission hook to include common text-processing commands like
      `base64`, `cat`, `column`, `fmt`, `fold`, `paste`, `strings`, checksum
      utilities, and more
      - Previously, commands like `gh api ... | base64 -d` were blocked
      because `base64` wasn't in the narrow allowlist
      
      ## Test plan
      - [x] Verified `gh api
      repos/dyad-sh/dyad/contents/.github/workflows/closed-issue-comment.yml
      --jq '.content' 2>&1 | base64 -d` no longer blocked
      - [x] All 784 unit tests pass
      - [x] Lint and type checks pass
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2581"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      <!-- CURSOR_SUMMARY -->
      ---
      
      > [!NOTE]
      > **Medium Risk**
      > Expands the set of commands permitted in piped shell invocations,
      which could widen the attack surface if the whitelist includes tools
      with unexpected side effects; changes are contained to the permission
      hook and docs.
      > 
      > **Overview**
      > Broadens the `gh` permission hook’s allowed pipe destinations from a
      small set of utilities to a larger whitelist of common text-processing
      commands (e.g., `base64`, `cat`, `column`, `strings`, and checksum
      tools), so more `gh ... | <tool>` pipelines are auto-approved.
      > 
      > Updates `rules/git-workflow.md` to document using `gh api
      .../issues/{PR_NUMBER}/labels` as a workaround for `gh pr edit
      --add-label` failing due to the GraphQL Projects (classic) deprecation
      error.
      > 
      > <sup>Written by [Cursor
      Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
      775a7623ae7bd4b484cf09626f425aaa2912b8f1. This will update automatically
      on new commits. Configure
      [here](https://cursor.com/dashboard?tab=bugbot).</sup>
      <!-- /CURSOR_SUMMARY -->
      
      <!-- This is an auto-generated description by cubic. -->
      ---
      ## Summary by cubic
      Broadened the GitHub CLI permission hook’s safe pipe whitelist to
      include more text-processing commands (e.g., base64, column, strings,
      checksum tools), allowing gh ... | base64 -d. Clarified allowed-pipe
      wording in the hook and updated git-workflow docs to use the REST API
      for adding labels due to GraphQL “Projects (classic)” errors.
      
      <sup>Written for commit 08eb796e50730e1e0ed78f2a55b2c9addb8c38cd.
      Summary will update on new commits.</sup>
      
      <!-- End of auto-generated description by cubic. -->
      
      ---------
      Co-authored-by: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      7fb395bf
    • wwwillchen-bot's avatar
      refactor: modularize e2e test helpers into separate modules (#2556) · b2bf3bed
      wwwillchen-bot 提交于
      ## Summary
      - Split the monolithic `test_helper.ts` (~1700 lines) into focused
      modules for better maintainability
      - Created `constants.ts` for timeout constants
      - Created `fixtures.ts` for Playwright fixtures and test setup
      - Created `utils/` directory for utility functions (normalization,
      dump-prettifier)
      - Created `page-objects/` directory with component and dialog page
      objects
      
      ## Test plan
      - [x] All existing unit tests pass (784 tests)
      - [x] Lint and type checks pass
      - [ ] E2E tests should work with the refactored helpers (imports are
      re-exported from test_helper.ts for backward compatibility)
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2556"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      <!-- This is an auto-generated description by cubic. -->
      ---
      ## Summary by cubic
      Refactored e2e test helpers into modular page objects, fixtures, and
      utilities for easier maintenance and more deterministic snapshots. Added
      loop guards to prevent hangs in toast dismissal and the Context Files
      Picker; existing tests keep working via re-exports.
      
      - **Refactors**
      - Split test_helper.ts into constants.ts, fixtures.ts, utils/, and
      page-objects/ (components + dialogs); added a main PageObject that
      composes component page objects.
      - Introduced normalization and dump-prettifier utilities for stable
      snapshots.
      - Centralized CI-aware timeouts in constants.ts; added optional debug
      logging flag.
        - Kept test_helper.ts as a thin re-export for backward compatibility.
      - Updated TypeScript strict-mode docs with ES2020 target limitations on
      replaceAll.
      
      - **Bug Fixes**
        - Fixed importApp path resolution to use __dirname three levels up.
      - Switched git config calls to execFileSync to avoid command injection.
      - Corrected toast dismissal loop to click the first toast repeatedly
      until none remain; added maxAttempts=20 guard (and in Context Files
      Picker) to prevent hangs.
      - Derived the app executable name from appInfo instead of hardcoding
      dyad.exe.
      
      <sup>Written for commit 26329e6b1866fd31e1cba91e0b641fc04df30e8a.
      Summary will update on new commits.</sup>
      
      <!-- End of auto-generated description by cubic. -->
      
      ---------
      Co-authored-by: 's avatarWill Chen <willchen90@gmail.com>
      Co-authored-by: 's avatarClaude Opus 4.5 <noreply@anthropic.com>
      Co-authored-by: 's avatarclaude[bot] <41898282+claude[bot]@users.noreply.github.com>
      b2bf3bed
    • Will Chen's avatar
      fix: allow non-write users to trigger closed issue comment handler (#2578) · 99b2f74b
      Will Chen 提交于
      ## Summary
      - The `claude-code-action` requires write permissions on the triggering
      actor by default, but the closed issue comment workflow is designed to
      respond to **any** user commenting on a closed issue
      - Added `allowed_non_write_users: '*'` to bypass this check — safe
      because the workflow's permissions are tightly scoped (`issues: write`,
      `contents: read`) and Claude is restricted to only `gh issue reopen` and
      `gh issue comment`
      
      ## Test plan
      - Comment on a closed issue from a non-collaborator account and verify
      the workflow runs successfully instead of failing with "Actor does not
      have write permissions"
      
      #skip-bugbot
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2578"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      
      <!-- This is an auto-generated description by cubic. -->
      ---
      ## Summary by cubic
      Allow non-write users to trigger the closed-issue comment workflow by
      setting allowed_non_write_users: "*". This removes the write-permission
      block so any comment on a closed issue runs the workflow, while staying
      safe via scoped permissions and restricted tools (only gh issue
      reopen/comment).
      
      <sup>Written for commit 211887fea46b0e48c3f4bf7eeacba6b3a3b74b53.
      Summary will update on new commits.</sup>
      
      <!-- End of auto-generated description by cubic. -->
      Co-authored-by: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      99b2f74b
    • wwwillchen-bot's avatar
      feat: make Playwright retries configurable via env var (#2558) · a07fe7ce
      wwwillchen-bot 提交于
      ## Summary
      - Add PLAYWRIGHT_RETRIES env var support to allow different retry counts
      for different CI environments
      - Self-hosted macOS runners now use 1 retry (more reliable hardware)
      while GitHub-hosted runners use 2 retries
      - Refactors playwright.config.ts to read retries from environment
      variable with sensible defaults
      
      ## Test plan
      - Verify CI workflow sets PLAYWRIGHT_RETRIES appropriately for
      self-hosted vs GitHub-hosted runners
      - Run `npm test` to ensure all unit tests pass
      - E2E tests should respect the new retry configuration
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2558"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      
      
      <!-- This is an auto-generated description by cubic. -->
      ---
      ## Summary by cubic
      Make Playwright retries configurable via the PLAYWRIGHT_RETRIES env var
      to tune test stability across environments. Self-hosted macOS runners
      use 1 retry; GitHub-hosted runners use 2 (local stays 0 unless set).
      
      - **New Features**
        - Added PLAYWRIGHT_RETRIES with sensible defaults (CI 2, local 0).
      - CI sets retries per runner type: 1 for self-hosted macOS, 2 for
      GitHub-hosted.
      
      <sup>Written for commit 896a3dbcbb8278d5cedfbd27088466d780d05fd2.
      Summary will update on new commits.</sup>
      
      <!-- End of auto-generated description by cubic. -->
      Co-authored-by: 's avatarWill Chen <willchen90@gmail.com>
      Co-authored-by: 's avatarClaude Opus 4.5 <noreply@anthropic.com>
      a07fe7ce
    • Will Chen's avatar
      Bump to v0.36.0 (#2575) · fee46806
      Will Chen 提交于
      #skip-bb
      <!-- devin-review-badge-begin -->
      
      ---
      
      <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2575"
      target="_blank">
        <picture>
      <source media="(prefers-color-scheme: dark)"
      srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
      <img
      src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
      alt="Open with Devin">
        </picture>
      </a>
      <!-- devin-review-badge-end -->
      fee46806