The former v2 branch has merged into main, making the old "main is frozen,
submit to v2" guidance backwards. Update all contributor-facing entry points
to the current model: main is the active v2 development line; v1 maintenance
fixes target the v1 branch.
- CLAUDE.md: add a v2 "Current state" callout and a branch-targeting
Operational Rule (the AI-facing context).
- gh-create-pr skill: route v1 maintenance PRs to base v1.
- PR template: replace the stale hidden comment with a visible branch
callout and add a branch checklist item.
- CONTRIBUTING.md / docs/guides/contributing.md: rewrite the branch strategy
section to the new model.
- docs/guides/branching-strategy.md: add a current-model note and fix the PR
target guideline.
Move all renderer source from src/renderer/src/* up one level to
src/renderer/*, removing the redundant nested src directory.
- Update path aliases (@renderer, @types, @logger, @data) and TanStack
Router paths in electron.vite.config.ts; update tsconfig.{json,web,node}
path mappings and include globs.
- Fix Vite root-relative script paths in the 8 renderer HTML entries.
- Update cross-process relative imports in main/preload (language,
apiServer models, preload index) to drop the /src segment.
- Switch renderer test imports of the logger mock to the @test-mocks alias.
- Update hardcoded renderer paths in scripts and their fixtures, lint
configs (eslint/oxlint/biome), CODEOWNERS, docs, and the data-classify tool.
- Convert deep (../../+) relative imports within the renderer to the
@renderer alias (69 files, 108 imports); keep single-level relatives.
- Fix doc links broken by the move and correct one pre-existing broken
link in naming-conventions.md.
packages/shared was never a real pnpm workspace package (no package.json); it was referenced only through the @shared TypeScript path alias. Relocate it under src/ via git mv (143 files, detected as pure renames).
Repoint the @shared alias and include globs to src/shared across electron.vite.config.ts, tsconfig.{json,node,web}.json and vitest.config.ts; update scripts/check-custom-exts.ts, scripts/update-languages.ts, the eslint.config.mjs generated-file globs, the data-classify generator output targets, .github/CODEOWNERS path rules, and CLAUDE.md/docs/source-comment references.
The @shared alias name is unchanged, so all 1403 @shared/* import sites resolve without modification. Verified with typecheck:node, typecheck:web and the full test suite (700 files, 9739 tests passing).
Normalise the bundle id casing from com.cherryai.CherryStudio to
com.cherryai.cherrystudio so it follows the dominant lowercase
convention used by modern AI tools (Anthropic Claude, OpenAI Codex,
Raycast, Docker) and the reverse-DNS norm. macOS LaunchServices is
case-insensitive, so this is a no-op on existing installs - bundle-id
bound state stays as it was after 4439d3b28, and no new breaking-changes
entry is needed.
Touches the same five definition points as the original rebrand
(electron-builder appId, notarize appBundleId, AppUserModelID, selection
self-detection, preview workflow replaceAll/appId) plus the
breaking-changes doc body. The doc's historical commit-subject reference
for 4439d3b28 deliberately retains its original PascalCase to remain a
faithful quote of that commit's subject.
Rename the app bundle id from com.kangfenmao.CherryStudio to
com.cherryai.CherryStudio at every definition point: electron-builder
appId (packaging source of truth), macOS notarization appBundleId,
Windows AppUserModelID, and the selection self-detection allowlist.
Daily preview builds now use com.cherryai.CherryStudio.preview (a distinct
channel id rather than a case-only variant that macOS would treat as the
same app); the workflow replaceAll search strings are updated to the new
id so the preview identity patch keeps matching.
Incidental cleanups bundled in:
- Drop the unused MAIN_VITE_BUNDLE_ID env override; env.d.ts now declares
the actually-used MAIN_VITE_CHERRYAI_CLIENT_SECRET instead of leaning on
vite/client's any index signature.
- Remove the stale @kangfenmao/keyv-storage from pnpm.onlyBuiltDependencies.
- SearchService: use @main/core/platform isDev over electron-toolkit is.dev.
### What this PR does
Before this PR:
The GitCode release sync job ran on `ubuntu-latest` after the signed
Windows build completed.
After this PR:
The GitCode release sync job runs on the `self-hosted` `windows-signing`
runner so the upload path can be retried from the hosted signing
environment.
<!-- (optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)`
format, will close the issue(s) when PR gets merged)*: -->
Fixes # N/A
### Why we need it and why it was done in this way
The following tradeoffs were made:
This keeps the workflow logic unchanged and only changes runner
placement for the second job.
The following alternatives were considered:
Keeping `ubuntu-latest` was considered, but the latest GitCode sync
failure needs a runner-environment comparison.
Links to places where the discussion took place: N/A
### Breaking changes
None.
If this PR introduces breaking changes, please describe the changes and
the impact on users.
### Special notes for your reviewer
This is a CI-only change intended to test whether the GitCode release
creation and upload failure is specific to GitHub-hosted runner
networking.
### Checklist
This checklist is not enforcing, but it's a reminder of items that could
be relevant to every PR.
Approvers are expected to review this list.
- [x] PR: The PR description is expressive enough and will help future
contributors
- [x] Code: [Write code that humans can
understand](https://en.wikiquote.org/wiki/Martin_Fowler#code-for-humans)
and [Keep it simple](https://en.wikipedia.org/wiki/KISS_principle)
- [ ] Refactor: You have [left the code cleaner than you found it (Boy
Scout
Rule)](https://learning.oreilly.com/library/view/97-things-every/9780596809515/ch08.html)
- [x] Upgrade: Impact of this change on upgrade flows was considered and
addressed if required
- [ ] Documentation: A [user-guide update](https://docs.cherry-ai.com)
was considered and is present (link) or not required. Check this only
when the PR introduces or changes a user-facing feature or behavior.
- [x] Self-review: I have reviewed my own code (e.g., via
[`/gh-pr-review`](/.claude/skills/gh-pr-review/SKILL.md), `gh pr diff`,
or GitHub UI) before requesting review from others
### Release note
<!-- Write your release note:
1. Enter your extended release note in the below block. If the PR
requires additional action from users switching to the new release,
include the string "action required".
2. If no release note is required, just write "NONE".
3. Only include user-facing changes (new features, bug fixes visible to
users, UI changes, behavior changes). For CI, maintenance, internal
refactoring, build tooling, or other non-user-facing work, write "NONE".
-->
```release-note
NONE
```
Signed-off-by: zhibisora <73344387+zhibisora@users.noreply.github.com>
<!-- Template from
https://github.com/kubevirt/kubevirt/blob/main/.github/PULL_REQUEST_TEMPLATE.md?-->
<!-- Thanks for sending a pull request! Here are some tips for you:
1. Consider creating this PR as draft:
https://github.com/CherryHQ/cherry-studio/blob/main/CONTRIBUTING.md
-->
<!--
🚨 Branch Strategy Change (Effective April 3, 2026) 🚨
The `main` branch is now under CODE FREEZE.
- main branch: Only accepts critical bug fixes via `hotfix/*` branches.
Fix PRs must be minimal in scope and must not include any refactoring
code.
- v2 branch: All new features, refactoring, and optimizations should be
submitted to the `v2` branch.
If you are submitting a bug fix to main, please ensure your PR is from a
`hotfix/*` branch.
-->
### What this PR does
Before this PR:
GitCode release sync builds signed Windows artifacts and uploads them to
GitCode in one self-hosted Windows signing job. If the signing runner
has unreliable outbound network connectivity, the GitCode release
creation or asset upload can fail after the signed artifacts were
already built. The workflow also has no dry-run mode for validating a
manual release sync.
After this PR:
The workflow builds signed Windows artifacts on the Windows signing
runner, uploads them as a short-lived GitHub Actions artifact, then
performs GitCode release creation and asset upload from `ubuntu-latest`.
Manual dispatch supports a `dry_run` mode that previews the release
payload and upload file list without creating the GitCode release.
Windows code signing also retries timestamping across multiple timestamp
servers before failing.
<!-- (optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)`
format, will close the issue(s) when PR gets merged)*: -->
Fixes # None
### Why we need it and why it was done in this way
The following tradeoffs were made:
The release sync now uses an intermediate GitHub Actions artifact to
pass signed Windows files from the signing runner to the Ubuntu sync
job. This adds one artifact upload/download step, but keeps certificate
access constrained to the signing runner while moving GitCode API
traffic to a more reliable hosted runner.
The following alternatives were considered:
Keeping GitCode sync on the signing runner was simpler, but it leaves
release sync vulnerable to transient network failures on that runner.
Retrying only the GitCode upload would not address timestamp-server
flakiness during Windows signing, so this PR also adds timestamp server
fallback and retry support in `scripts/win-sign.js`.
Links to places where the discussion took place: N/A
### Breaking changes
None.
### Special notes for your reviewer
Validation performed:
- `pnpm format`
- `pnpm lint` (passed with one pre-existing unrelated React hook warning
in
`src/renderer/src/pages/settings/ProviderSettings/ModelList/ManageModelsPopup.tsx`)
- `pnpm test`
- Parsed `.github/workflows/sync-to-gitcode.yml` with the repository
`yaml` package
`actionlint` was attempted, but the npm package named `actionlint` does
not expose a binary and this environment does not have Go installed to
run the upstream Go tool directly.
### Checklist
This checklist is not enforcing, but it's a reminder of items that could
be relevant to every PR.
Approvers are expected to review this list.
- [x] PR: The PR description is expressive enough and will help future
contributors
- [x] Code: [Write code that humans can
understand](https://en.wikiquote.org/wiki/Martin_Fowler#code-for-humans)
and [Keep it simple](https://en.wikipedia.org/wiki/KISS_principle)
- [ ] Refactor: You have [left the code cleaner than you found it (Boy
Scout
Rule)](https://learning.oreilly.com/library/view/97-things-every/9780596809515/ch08.html)
- [x] Upgrade: Impact of this change on upgrade flows was considered and
addressed if required
- [ ] Documentation: A [user-guide update](https://docs.cherry-ai.com)
was considered and is present (link) or not required. Check this only
when the PR introduces or changes a user-facing feature or behavior.
- [x] Self-review: I have reviewed my own code (e.g., via
[`/gh-pr-review`](/.claude/skills/gh-pr-review/SKILL.md), `gh pr diff`,
or GitHub UI) before requesting review from others
### Release note
<!-- Write your release note:
1. Enter your extended release note in the below block. If the PR
requires additional action from users switching to the new release,
include the string "action required".
2. If no release note is required, just write "NONE".
3. Only include user-facing changes (new features, bug fixes visible to
users, UI changes, behavior changes). For CI, maintenance, internal
refactoring, build tooling, or other non-user-facing work, write "NONE".
-->
```release-note
NONE
```
Signed-off-by: zhibisora <73344387+zhibisora@users.noreply.github.com>
### What this PR does
Before this PR:
Tailwind canonical class suggestions such as `w-[420px] -> w-105` had to
be fixed manually, and the PR style reminder workflow only reported
newly introduced legacy renderer CSS variables.
After this PR:
Adds `pnpm styles:canonical <path>` to rewrite static Tailwind class
strings to their canonical Tailwind v4 forms. The PR style reminders
workflow now comments on both newly introduced legacy CSS variables and
Tailwind canonical class suggestions.
<!-- (optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)`
format, will close the issue(s) when PR gets merged)*: -->
Fixes #
### Why we need it and why it was done in this way
The following tradeoffs were made:
The canonical class fixer is conservative: it only rewrites static JSX
`class` / `className` strings and static `cn(...)` string inputs,
leaving dynamic template literals untouched. It uses Tailwind's own
design system canonicalization instead of maintaining a manual mapping
table.
The following alternatives were considered:
A regex-only implementation was avoided because Tailwind
canonicalization depends on Tailwind v4 parsing and theme behavior. A
separate PR workflow comment was also avoided so the style reminders
comment remains the single bot comment.
Links to places where the discussion took place: N/A
### Breaking changes
None.
### Special notes for your reviewer
Compatibility aliases and legacy marker/env fallback were removed; the
PR workflow now uses the `style-reminders` script, marker, and output
naming.
Validation performed:
- `pnpm test:scripts --
scripts/__tests__/check-pr-style-reminders.test.ts
scripts/__tests__/fix-tailwind-canonical-classes.test.ts`
- `pnpm build:check`
- `git diff --check`
### Checklist
This checklist is not enforcing, but it's a reminder of items that could
be relevant to every PR.
Approvers are expected to review this list.
- [x] PR: The PR description is expressive enough and will help future
contributors
- [x] Code: [Write code that humans can
understand](https://en.wikiquote.org/wiki/Martin_Fowler#code-for-humans)
and [Keep it simple](https://en.wikipedia.org/wiki/KISS_principle)
- [x] Refactor: You have [left the code cleaner than you found it (Boy
Scout
Rule)](https://learning.oreilly.com/library/view/97-things-every/9780596809515/ch08.html)
- [x] Upgrade: Impact of this change on upgrade flows was considered and
addressed if required
- [ ] Documentation: A [user-guide update](https://docs.cherry-ai.com)
was considered and is present (link) or not required. Check this only
when the PR introduces or changes a user-facing feature or behavior.
- [x] Self-review: I have reviewed my own code (e.g., via
[`/gh-pr-review`](/.claude/skills/gh-pr-review/SKILL.md), `gh pr diff`,
or GitHub UI) before requesting review from others
### Release note
<!-- Write your release note:
1. Enter your extended release note in the below block. If the PR
requires additional action from users switching to the new release,
include the string "action required".
2. If no release note is required, just write "NONE".
3. Only include user-facing changes (new features, bug fixes visible to
users, UI changes, behavior changes). For CI, maintenance, internal
refactoring, build tooling, or other non-user-facing work, write "NONE".
-->
```release-note
NONE
```
---------
Signed-off-by: kangfenmao <kangfenmao@qq.com>
Add v2 to push.branches so pushes to v2 trigger independent CI runs
using clean v2 code. Remove the `|| github.head_ref == 'v2'` override
from basic-checks that forced CI on the draft PR #10162 (v2→main),
which caused checkout to merge v2 into main and fail.
### What this PR does
Before this PR:
The nightly build for `ubuntu-latest` fails because the Linux build step
is missing required native dependencies (`libevdev-dev`, `libxtst-dev`,
`libx11-dev`, `libxfixes-dev`, `libwayland-dev`). The `selection-hook`
native module fails to compile with `fatal error: X11/XKBlib.h: No such
file or directory`.
After this PR:
Restores the missing `apt-get install` packages so the Linux nightly
build compiles successfully.
### Why we need it and why it was done in this way
The dependencies were accidentally removed from the nightly build
workflow. This restores them to match the release workflow.
### Breaking changes
None.
### Special notes for your reviewer
CI-only change. No application code is modified.
### Checklist
- [x] PR: The PR description is expressive enough and will help future
contributors
- [x] Code: [Write code that humans can
understand](https://en.wikiquote.org/wiki/Martin_Fowler#code-for-humans)
and [Keep it simple](https://en.wikipedia.org/wiki/KISS_principle)
- [x] Refactor: You have [left the code cleaner than you found it (Boy
Scout
Rule)](https://learning.oreilly.com/library/view/97-things-every/9780596809515/ch08.html)
- [x] Upgrade: Impact of this change on upgrade flows was considered and
addressed if required
- [ ] Documentation: A [user-guide update](https://docs.cherry-ai.com)
was considered and is present (link) or not required. Check this only
when the PR introduces or changes a user-facing feature or behavior.
- [ ] Self-review: I have reviewed my own code (e.g., via
[`/gh-pr-review`](/.claude/skills/gh-pr-review/SKILL.md), `gh pr diff`,
or GitHub UI) before requesting review from others
### Release note
```release-note
NONE
```
Signed-off-by: kangfenmao <kangfenmao@qq.com>
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to main, this PR will
be updated.
# Releases
## @cherrystudio/ai-core@2.0.0
### Major Changes
- [#12235](https://github.com/CherryHQ/cherry-studio/pull/12235)
[`1c0a5a9`](1c0a5a95fa)
Thanks [@DeJeune](https://github.com/DeJeune)! - Migrate to AI SDK v6 -
complete rewrite of provider and middleware architecture
- **BREAKING**: Remove all legacy API clients, middleware pipeline, and
barrel `index.ts`
- **Image generation**: Migrate to native AI SDK
`generateImage`/`editImage`, remove legacy image middleware
- **Embedding**: Migrate to AI SDK `embedMany`, remove legacy embedding
clients
- **Model listing**: Refactor `ModelListService` to Strategy Registry
pattern, consolidate schema files
- **OpenRouter image**: Native image endpoint support via
`@openrouter/ai-sdk-provider` 2.3.3
- **GitHub Copilot**: Simplify extension by removing `ProviderV2` cast
and `wrapProvider`
- **Rename**: `index_new.ts` → `AiProvider.ts`, `ModelListService.ts` →
`listModels.ts`
### Patch Changes
- [#13787](https://github.com/CherryHQ/cherry-studio/pull/13787)
[`6b4c928`](6b4c928056)
Thanks [@EurFelux](https://github.com/EurFelux)! - Add missing
@openrouter/ai-sdk-provider dependency to fix package build
- [#12783](https://github.com/CherryHQ/cherry-studio/pull/12783)
[`336176b`](336176be08)
Thanks [@EurFelux](https://github.com/EurFelux)! - Baseline release for
previously unmanaged package changes while introducing changesets-based
publishing
- Updated dependencies
\[[`336176b`](336176be08)]:
- @cherrystudio/ai-sdk-provider@0.1.6
## @cherrystudio/ai-sdk-provider@0.1.6
### Patch Changes
- [#12783](https://github.com/CherryHQ/cherry-studio/pull/12783)
[`336176b`](336176be08)
Thanks [@EurFelux](https://github.com/EurFelux)! - Baseline release for
previously unmanaged package changes while introducing changesets-based
publishing
## @cherrystudio/extension-table-plus@3.0.12
### Patch Changes
- [#13840](https://github.com/CherryHQ/cherry-studio/pull/13840)
[`ae13786`](ae13786b55)
Thanks [@EurFelux](https://github.com/EurFelux)! - Add local
tsconfig.json to fix dts build failure in packages:build
- [#13817](https://github.com/CherryHQ/cherry-studio/pull/13817)
[`7c2610b`](7c2610b1e3)
Thanks [@EurFelux](https://github.com/EurFelux)! - Remove reference to
non-existent tsconfig.build.json to fix CI build failure
- [#12783](https://github.com/CherryHQ/cherry-studio/pull/12783)
[`336176b`](336176be08)
Thanks [@EurFelux](https://github.com/EurFelux)! - Baseline release for
previously unmanaged package changes while introducing changesets-based
publishing
---------
Signed-off-by: icarus <eurfelux@gmail.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: icarus <eurfelux@gmail.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Merge main branch changes including CherryClaw agent system (#13359),
new settings routes (skills, channels, scheduled-tasks), and various
fixes. Adapted merged code to v2 architecture:
- Migrated new routes to TanStack Router (file-based routing)
- Migrated TasksSettings from react-router-dom/Redux to TanStack Router/CacheService
- Migrated baseCallbacks.ts from Redux dispatch to StreamingService
- Added agent bootstrap initialization to v2 entry point
- Replaced antd Switch with @cherrystudio/ui Switch in AgentModal
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: suyao <sy20010504@gmail.com>
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to main, this PR will
be updated.
# Releases
## @cherrystudio/ai-core@2.0.0
### Major Changes
- [#12235](https://github.com/CherryHQ/cherry-studio/pull/12235)
[`1c0a5a9`](1c0a5a95fa)
Thanks [@DeJeune](https://github.com/DeJeune)! - Migrate to AI SDK v6 -
complete rewrite of provider and middleware architecture
- **BREAKING**: Remove all legacy API clients, middleware pipeline, and
barrel `index.ts`
- **Image generation**: Migrate to native AI SDK
`generateImage`/`editImage`, remove legacy image middleware
- **Embedding**: Migrate to AI SDK `embedMany`, remove legacy embedding
clients
- **Model listing**: Refactor `ModelListService` to Strategy Registry
pattern, consolidate schema files
- **OpenRouter image**: Native image endpoint support via
`@openrouter/ai-sdk-provider` 2.3.3
- **GitHub Copilot**: Simplify extension by removing `ProviderV2` cast
and `wrapProvider`
- **Rename**: `index_new.ts` → `AiProvider.ts`, `ModelListService.ts` →
`listModels.ts`
### Patch Changes
- [#13787](https://github.com/CherryHQ/cherry-studio/pull/13787)
[`6b4c928`](6b4c928056)
Thanks [@EurFelux](https://github.com/EurFelux)! - Add missing
@openrouter/ai-sdk-provider dependency to fix package build
- [#12783](https://github.com/CherryHQ/cherry-studio/pull/12783)
[`336176b`](336176be08)
Thanks [@EurFelux](https://github.com/EurFelux)! - Baseline release for
previously unmanaged package changes while introducing changesets-based
publishing
- Updated dependencies
\[[`336176b`](336176be08)]:
- @cherrystudio/ai-sdk-provider@0.1.6
## @cherrystudio/ai-sdk-provider@0.1.6
### Patch Changes
- [#12783](https://github.com/CherryHQ/cherry-studio/pull/12783)
[`336176b`](336176be08)
Thanks [@EurFelux](https://github.com/EurFelux)! - Baseline release for
previously unmanaged package changes while introducing changesets-based
publishing
## @cherrystudio/extension-table-plus@3.0.12
### Patch Changes
- [#13840](https://github.com/CherryHQ/cherry-studio/pull/13840)
[`ae13786`](ae13786b55)
Thanks [@EurFelux](https://github.com/EurFelux)! - Add local
tsconfig.json to fix dts build failure in packages:build
- [#13817](https://github.com/CherryHQ/cherry-studio/pull/13817)
[`7c2610b`](7c2610b1e3)
Thanks [@EurFelux](https://github.com/EurFelux)! - Remove reference to
non-existent tsconfig.build.json to fix CI build failure
- [#12783](https://github.com/CherryHQ/cherry-studio/pull/12783)
[`336176b`](336176be08)
Thanks [@EurFelux](https://github.com/EurFelux)! - Baseline release for
previously unmanaged package changes while introducing changesets-based
publishing
---------
Signed-off-by: icarus <eurfelux@gmail.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: icarus <eurfelux@gmail.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
### What this PR does
Before this PR:
The `release-packages` workflow triggered on **any** file change under
`packages/**`, including internal packages (`shared`, `mcp-trace`, `ui`)
that are not managed by changesets and never published to npm.
After this PR:
The workflow only triggers on changes to the three changeset-managed
packages: `packages/aiCore/**`, `packages/ai-sdk-provider/**`, and
`packages/extension-table-plus/**`.
### Why we need it and why it was done in this way
Only `@cherrystudio/ai-core`, `@cherrystudio/ai-sdk-provider`, and
`@cherrystudio/extension-table-plus` have `package.json` with versions
and are published via changesets. The other directories under
`packages/` (`shared`, `mcp-trace`, `ui`) are internal modules with no
`package.json` — changes to them should not trigger the release
workflow.
The fix simply narrows the `paths` filter to explicitly list the three
publishable packages instead of using a wildcard.
### Breaking changes
None.
### Checklist
- [x] PR: The PR description is expressive enough and will help future
contributors
- [x] Code: [Write code that humans can
understand](https://en.wikiquote.org/wiki/Martin_Fowler#code-for-humans)
and [Keep it simple](https://en.wikipedia.org/wiki/KISS_principle)
- [x] Refactor: You have [left the code cleaner than you found it (Boy
Scout
Rule)](https://learning.oreilly.com/library/view/97-things-every/9780596809515/ch08.html)
- [x] Upgrade: Impact of this change on upgrade flows was considered and
addressed if required
- [ ] Documentation: N/A — CI-only change, no user-facing impact
- [x] Self-review: I have reviewed my own code before requesting review
from others
### Release note
```release-note
NONE
```
Signed-off-by: icarus <eurfelux@gmail.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
## Summary
- Install `libevdev-dev`, `libxtst-dev`, `libx11-dev`, `libxfixes-dev`,
and `libwayland-dev` in the Linux release build step so the
`selection-hook` native module compiles successfully.
## Test plan
- [ ] Trigger a Linux-only release build via `workflow_dispatch` and
verify it completes without native module compilation errors.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Signed-off-by: suyao <sy20010504@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
### What this PR does
Before this PR:
The `release.yml` workflow triggers on `pull_request_target` with
`opened` and `synchronize` event types. Every commit pushed to a release
PR (e.g. editing release notes in `electron-builder.yml`) re-triggers
the full 3-platform release build (macOS + Windows + Linux), wasting
significant CI resources.
After this PR:
The workflow only triggers when the release PR is **merged** into
`main`, not on every push. This is achieved by:
1. Changing `pull_request_target` types from `opened`/`synchronize` to
`closed`
2. Adding `github.event.pull_request.merged == true` to the job
condition
Fixes #
### Why we need it and why it was done in this way
The following tradeoffs were made:
- Release builds no longer run during PR review phase. If a pre-merge
test build is needed, `workflow_dispatch` can be used manually.
The following alternatives were considered:
- **Remove `synchronize` only (keep `opened`)**: Would still trigger on
PR creation but not subsequent pushes. However, this loses automation on
merge.
- **Path filtering**: `pull_request_target` doesn't support `paths`
filter, would require a separate job to check changed files — more
complex for the same result.
- **Label-based triggering**: Adds manual steps, defeats automation
purpose.
### Breaking changes
None. The `tag push` and `workflow_dispatch` triggers remain unchanged.
The only behavioral change is that release builds now happen on merge
instead of on PR open/push.
### Special notes for your reviewer
- The `workflow_dispatch` trigger still allows manual release builds at
any time
- The `push: tags: v*.*.*` trigger is unaffected
- The removed `head.repo.full_name == github.repository` check is
redundant since `merged == true` already implies the PR was accepted
### Checklist
- [x] PR: The PR description is expressive enough and will help future
contributors
- [x] Code: [Write code that humans can
understand](https://en.wikiquote.org/wiki/Martin_Fowler#code-for-humans)
and [Keep it simple](https://en.wikipedia.org/wiki/KISS_principle)
- [x] Refactor: You have [left the code cleaner than you found it (Boy
Scout
Rule)](https://learning.oreilly.com/library/view/97-things-every/9780596809515/ch08.html)
- [x] Upgrade: Impact of this change on upgrade flows was considered and
addressed if required
- [ ] Documentation: A [user-guide update](https://docs.cherry-ai.com)
was considered and is present (link) or not required. Check this only
when the PR introduces or changes a user-facing feature or behavior.
- [x] Self-review: I have reviewed my own code (e.g., via
[`/gh-pr-review`](/.claude/skills/gh-pr-review/SKILL.md), `gh pr diff`,
or GitHub UI) before requesting review from others
### Release note
```release-note
NONE
```
---------
Signed-off-by: suyao <sy20010504@gmail.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>