Commit Graph

274 Commits

Author SHA1 Message Date
SuYao
f7ceb47462 fix(ci): only trigger release build on PR merge, not on every push (#13512)
### 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>
2026-03-16 22:17:39 +08:00
Phantom
fe0678a206 chore: migrate .claude/skills to directory symlinks (#13486)
### What this PR does

Before this PR:

`.claude/skills/<name>/SKILL.md` files were **copied** from
`.agents/skills/<name>/SKILL.md` via `pnpm skills:sync`. A dedicated
`skills-check-windows` CI job ran on `windows-latest` to verify
cross-platform file-copy compatibility.

After this PR:

`.claude/skills/<name>` entries are **directory symlinks** pointing to
`../../.agents/skills/<name>`, following the Single Source of Truth
(SSoT) principle. The Windows-specific CI job is removed; Windows
developers are expected to enable symlink support.

### Why we need it and why it was done in this way

The following tradeoffs were made:

- Windows developers must now manually enable symlink support (Developer
Mode + `git config --global core.symlinks true`). This is acceptable
because:
1. The existing `AGENTS.md` is already a symlink, so Windows
compatibility was never fully enforced.
2. Symlinks eliminate the need for file-copy synchronization, reducing
maintenance complexity.
3. Contributors are expected to have sufficient technical capability to
configure their environments.

The following alternatives were considered:

- Keeping file-copy sync: rejected because it duplicates content and
requires extra CI to verify consistency.

### Breaking changes

Windows developers who clone without symlink support enabled will get
plain text files instead of symlinks. They must:
1. Enable Developer Mode or grant `SeCreateSymbolicLinkPrivilege`
2. Run `git config --global core.symlinks true`
3. Re-clone or run `pnpm skills:sync`

### Special notes for your reviewer

- The `.github/workflows/ci.yml` diff includes minor quote-style changes
(`'` → `"`) from the YAML formatter — these are cosmetic only.

### 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
- [x] 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: icarus <eurfelux@gmail.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 08:46:46 +08:00
SuYao
2a92aebc4f docs: add DeJeune as code owner for core data paths (#13414)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 18:05:13 +08:00
fullex
2104e234af Merge 'main' into v2 2026-03-12 02:20:13 -07:00
SuYao
87a8c6a118 docs: add DeJeune as v2 data layer code owner (#13412)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 15:40:32 +08:00
Phantom
c663a872bb docs: update issue templates to use type instead of label (#13407) 2026-03-12 13:33:00 +08:00
SuYao
ba2cc43e92 ci: pin claude-code-action to v1.0.66 in prepare-release (#13229)
### What this PR does

Before this PR: The `prepare-release.yml` workflow uses
`anthropics/claude-code-action@v1`, which tracks the latest v1 release
and may introduce unexpected breaking changes.

After this PR: The action is pinned to
`anthropics/claude-code-action@v1.0.66` for deterministic CI behavior.

### Why we need it and why it was done in this way

The `prepare-release` workflow failed in [this
run](https://github.com/CherryHQ/cherry-studio/actions/runs/22706296259/job/65834731056).
Pinning to a known-good version (`v1.0.66`) prevents future breakage
from upstream action updates.

The following tradeoffs were made: N/A

The following alternatives were considered: N/A

### Breaking changes

None

### Special notes for your reviewer

N/A

### Checklist

- [x] PR: The PR description is expressive enough and will help future
contributors
- [x] Code: Write code that humans can understand and Keep it simple
- [x] Refactor: You have left the code cleaner than you found it (Boy
Scout Rule)
- [ ] Upgrade: Impact of this change on upgrade flows was considered and
addressed if required
- [ ] Documentation: Not required — CI-only change
- [x] Self-review: I have reviewed my own code before requesting review
from others

```release-note
NONE
```

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 15:34:18 +08:00
dependabot[bot]
5d369d08cd ci(deps): bump actions/upload-artifact from 6 to 7 (#13119)
Bumps
[actions/upload-artifact](https://github.com/actions/upload-artifact)
from 6 to 7.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/actions/upload-artifact/releases">actions/upload-artifact's
releases</a>.</em></p>
<blockquote>
<h2>v7.0.0</h2>
<h2>v7 What's new</h2>
<h3>Direct Uploads</h3>
<p>Adds support for uploading single files directly (unzipped). Callers
can set the new <code>archive</code> parameter to <code>false</code> to
skip zipping the file during upload. Right now, we only support single
files. The action will fail if the glob passed resolves to multiple
files. The <code>name</code> parameter is also ignored with this
setting. Instead, the name of the artifact will be the name of the
uploaded file.</p>
<h3>ESM</h3>
<p>To support new versions of the <code>@actions/*</code> packages,
we've upgraded the package to ESM.</p>
<h2>What's Changed</h2>
<ul>
<li>Add proxy integration test by <a
href="https://github.com/Link"><code>@​Link</code></a>- in <a
href="https://redirect.github.com/actions/upload-artifact/pull/754">actions/upload-artifact#754</a></li>
<li>Upgrade the module to ESM and bump dependencies by <a
href="https://github.com/danwkennedy"><code>@​danwkennedy</code></a> in
<a
href="https://redirect.github.com/actions/upload-artifact/pull/762">actions/upload-artifact#762</a></li>
<li>Support direct file uploads by <a
href="https://github.com/danwkennedy"><code>@​danwkennedy</code></a> in
<a
href="https://redirect.github.com/actions/upload-artifact/pull/764">actions/upload-artifact#764</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/Link"><code>@​Link</code></a>- made
their first contribution in <a
href="https://redirect.github.com/actions/upload-artifact/pull/754">actions/upload-artifact#754</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/upload-artifact/compare/v6...v7.0.0">https://github.com/actions/upload-artifact/compare/v6...v7.0.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="bbbca2ddaa"><code>bbbca2d</code></a>
Support direct file uploads (<a
href="https://redirect.github.com/actions/upload-artifact/issues/764">#764</a>)</li>
<li><a
href="589182c5a4"><code>589182c</code></a>
Upgrade the module to ESM and bump dependencies (<a
href="https://redirect.github.com/actions/upload-artifact/issues/762">#762</a>)</li>
<li><a
href="47309c993a"><code>47309c9</code></a>
Merge pull request <a
href="https://redirect.github.com/actions/upload-artifact/issues/754">#754</a>
from actions/Link-/add-proxy-integration-tests</li>
<li><a
href="02a8460834"><code>02a8460</code></a>
Add proxy integration test</li>
<li>See full diff in <a
href="https://github.com/actions/upload-artifact/compare/v6...v7">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/upload-artifact&package-manager=github_actions&previous-version=6&new-version=7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-05 13:18:10 +08:00
dependabot[bot]
076ddd5a09 ci(deps): bump actions/github-script from 7 to 8 (#13120)
Bumps [actions/github-script](https://github.com/actions/github-script)
from 7 to 8.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/actions/github-script/releases">actions/github-script's
releases</a>.</em></p>
<blockquote>
<h2>v8.0.0</h2>
<h2>What's Changed</h2>
<ul>
<li>Update Node.js version support to 24.x by <a
href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/637">actions/github-script#637</a></li>
<li>README for updating actions/github-script from v7 to v8 by <a
href="https://github.com/sneha-krip"><code>@​sneha-krip</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/653">actions/github-script#653</a></li>
</ul>
<h2>⚠️ Minimum Compatible Runner Version</h2>
<p><strong>v2.327.1</strong><br />
<a
href="https://github.com/actions/runner/releases/tag/v2.327.1">Release
Notes</a></p>
<p>Make sure your runner is updated to this version or newer to use this
release.</p>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a>
made their first contribution in <a
href="https://redirect.github.com/actions/github-script/pull/637">actions/github-script#637</a></li>
<li><a
href="https://github.com/sneha-krip"><code>@​sneha-krip</code></a> made
their first contribution in <a
href="https://redirect.github.com/actions/github-script/pull/653">actions/github-script#653</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/github-script/compare/v7.1.0...v8.0.0">https://github.com/actions/github-script/compare/v7.1.0...v8.0.0</a></p>
<h2>v7.1.0</h2>
<h2>What's Changed</h2>
<ul>
<li>Upgrade husky to v9 by <a
href="https://github.com/benelan"><code>@​benelan</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/482">actions/github-script#482</a></li>
<li>Add workflow file for publishing releases to immutable action
package by <a
href="https://github.com/Jcambass"><code>@​Jcambass</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/485">actions/github-script#485</a></li>
<li>Upgrade IA Publish by <a
href="https://github.com/Jcambass"><code>@​Jcambass</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/486">actions/github-script#486</a></li>
<li>Fix workflow status badges by <a
href="https://github.com/joshmgross"><code>@​joshmgross</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/497">actions/github-script#497</a></li>
<li>Update usage of <code>actions/upload-artifact</code> by <a
href="https://github.com/joshmgross"><code>@​joshmgross</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/512">actions/github-script#512</a></li>
<li>Clear up package name confusion by <a
href="https://github.com/joshmgross"><code>@​joshmgross</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/514">actions/github-script#514</a></li>
<li>Update dependencies with <code>npm audit fix</code> by <a
href="https://github.com/joshmgross"><code>@​joshmgross</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/515">actions/github-script#515</a></li>
<li>Specify that the used script is JavaScript by <a
href="https://github.com/timotk"><code>@​timotk</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/478">actions/github-script#478</a></li>
<li>chore: Add Dependabot for NPM and Actions by <a
href="https://github.com/nschonni"><code>@​nschonni</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/472">actions/github-script#472</a></li>
<li>Define <code>permissions</code> in workflows and update actions by
<a href="https://github.com/joshmgross"><code>@​joshmgross</code></a> in
<a
href="https://redirect.github.com/actions/github-script/pull/531">actions/github-script#531</a></li>
<li>chore: Add Dependabot for .github/actions/install-dependencies by <a
href="https://github.com/nschonni"><code>@​nschonni</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/532">actions/github-script#532</a></li>
<li>chore: Remove .vscode settings by <a
href="https://github.com/nschonni"><code>@​nschonni</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/533">actions/github-script#533</a></li>
<li>ci: Use github/setup-licensed by <a
href="https://github.com/nschonni"><code>@​nschonni</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/473">actions/github-script#473</a></li>
<li>make octokit instance available as octokit on top of github, to make
it easier to seamlessly copy examples from GitHub rest api or octokit
documentations by <a
href="https://github.com/iamstarkov"><code>@​iamstarkov</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/508">actions/github-script#508</a></li>
<li>Remove <code>octokit</code> README updates for v7 by <a
href="https://github.com/joshmgross"><code>@​joshmgross</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/557">actions/github-script#557</a></li>
<li>docs: add &quot;exec&quot; usage examples by <a
href="https://github.com/neilime"><code>@​neilime</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/546">actions/github-script#546</a></li>
<li>Bump ruby/setup-ruby from 1.213.0 to 1.222.0 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/actions/github-script/pull/563">actions/github-script#563</a></li>
<li>Bump ruby/setup-ruby from 1.222.0 to 1.229.0 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/actions/github-script/pull/575">actions/github-script#575</a></li>
<li>Clearly document passing inputs to the <code>script</code> by <a
href="https://github.com/joshmgross"><code>@​joshmgross</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/603">actions/github-script#603</a></li>
<li>Update README.md by <a
href="https://github.com/nebuk89"><code>@​nebuk89</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/610">actions/github-script#610</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/benelan"><code>@​benelan</code></a> made
their first contribution in <a
href="https://redirect.github.com/actions/github-script/pull/482">actions/github-script#482</a></li>
<li><a href="https://github.com/Jcambass"><code>@​Jcambass</code></a>
made their first contribution in <a
href="https://redirect.github.com/actions/github-script/pull/485">actions/github-script#485</a></li>
<li><a href="https://github.com/timotk"><code>@​timotk</code></a> made
their first contribution in <a
href="https://redirect.github.com/actions/github-script/pull/478">actions/github-script#478</a></li>
<li><a
href="https://github.com/iamstarkov"><code>@​iamstarkov</code></a> made
their first contribution in <a
href="https://redirect.github.com/actions/github-script/pull/508">actions/github-script#508</a></li>
<li><a href="https://github.com/neilime"><code>@​neilime</code></a> made
their first contribution in <a
href="https://redirect.github.com/actions/github-script/pull/546">actions/github-script#546</a></li>
<li><a href="https://github.com/nebuk89"><code>@​nebuk89</code></a> made
their first contribution in <a
href="https://redirect.github.com/actions/github-script/pull/610">actions/github-script#610</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/github-script/compare/v7...v7.1.0">https://github.com/actions/github-script/compare/v7...v7.1.0</a></p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="ed597411d8"><code>ed59741</code></a>
Merge pull request <a
href="https://redirect.github.com/actions/github-script/issues/653">#653</a>
from actions/sneha-krip/readme-for-v8</li>
<li><a
href="2dc352e4ba"><code>2dc352e</code></a>
Bold minimum Actions Runner version in README</li>
<li><a
href="01e118c8d0"><code>01e118c</code></a>
Update README for Node 24 runtime requirements</li>
<li><a
href="8b222ac82e"><code>8b222ac</code></a>
Apply suggestion from <a
href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a></li>
<li><a
href="adc0eeac99"><code>adc0eea</code></a>
README for updating actions/github-script from v7 to v8</li>
<li><a
href="20fe497b3f"><code>20fe497</code></a>
Merge pull request <a
href="https://redirect.github.com/actions/github-script/issues/637">#637</a>
from actions/node24</li>
<li><a
href="e7b7f222b1"><code>e7b7f22</code></a>
update licenses</li>
<li><a
href="2c81ba05f3"><code>2c81ba0</code></a>
Update Node.js version support to 24.x</li>
<li>See full diff in <a
href="https://github.com/actions/github-script/compare/v7...v8">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/github-script&package-manager=github_actions&previous-version=7&new-version=8)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-05 13:17:39 +08:00
Phantom
c66ecee286 fix(ci): prevent edited events from creating skipped CI runs (#13170)
### What this PR does

Before this PR:
Editing a PR's title or body triggers the `edited` event in the CI
workflow. Although job-level `if` conditions skip execution, GitHub
still creates a new workflow run with "skipped" status. Since GitHub UI
shows the latest run, this hides the real CI results from the previous
`opened`/`synchronize` run.

After this PR:
- Removed `edited` from CI workflow trigger types, so title/body edits
no longer create skipped CI runs
- Added a lightweight separate workflow (`ci-rerun-on-base-change.yml`)
that listens for `edited` events and re-runs the latest CI run only when
the PR's base branch is changed

Fixes #13150 (follow-up)

### Why we need it and why it was done in this way

The following tradeoffs were made:
- Splitting into two workflows is slightly more complex than a single
workflow, but it completely eliminates the "skipped run covering real
results" problem since the re-run workflow has a different workflow name
and does not affect the main CI status display

The following alternatives were considered:
- Simply removing `edited` without a re-run workflow — would lose CI
re-trigger on base branch changes, which was a known issue before #13150
- Keeping `edited` with job-level `if` — the current approach that
causes the problem we're fixing

### Breaking changes

None

### Special notes for your reviewer

- The re-run workflow uses `actions/github-script` to call
`reRunWorkflow` API, which re-runs the existing CI run in-place rather
than creating a new one
- The workflow requires `actions: write` permission to trigger re-runs
- The `branches` list in the new workflow mirrors the main CI workflow
to stay in sync

### Checklist

- [x] PR: The PR description is expressive enough and will help future
contributors
- [x] Code: Write code that humans can understand and Keep it simple
- [x] Refactor: You have left the code cleaner than you found it (Boy
Scout Rule)
- [ ] Upgrade: Impact of this change on upgrade flows was considered and
addressed if required
- [ ] Documentation: A user-guide update was considered and is present
(link) or not required.
- [x] Self-review: I have reviewed my own code before requesting review
from others

### Release note

```release-note
NONE
```

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 22:45:10 +08:00
Phantom
7f24cd0a01 fix: move OpenAPI spec generation to build time (#13207)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 19:27:08 +08:00
SuYao
b52825761b fix(ci): correct node-version-file path in update-app-upgrade-config workflow (#13190)
### What this PR does

Before this PR: The `update-app-upgrade-config` workflow fails with `The
specified node version file at: .node-version does not exist` on every
release.

After this PR: The workflow correctly references `main/.node-version`
since the default branch is checked out into the `main/` subdirectory.

Fixes the failure in
https://github.com/CherryHQ/cherry-studio/actions/runs/22653172953

### Why we need it and why it was done in this way

The workflow uses `actions/checkout` with `path: main`, which places the
repo contents in a `main/` subdirectory. However, `setup-node` with
`node-version-file: '.node-version'` looks in the workspace root where
the file doesn't exist.

The following tradeoffs were made: N/A

The following alternatives were considered: N/A

### Breaking changes

None

### Special notes for your reviewer

Single-line path fix. Can be verified by re-running the failed workflow
after merge.

### 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
```

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 11:40:40 +08:00
亢奋猫
8e37615cc3 chore: release v1.7.23 (#13180)
### What this PR does

This is a release PR for **Cherry Studio v1.7.23**.

**Changes included:**
- Bump version from 1.7.22 to 1.7.23
- Update release notes with user-facing bug fixes

### Release Notes

<!--LANG:en-->
Cherry Studio 1.7.23 - Bug Fixes

🐛 Bug Fixes
- [Selection] Fix app crash on Windows when closing action window
- [MiniApp] Fix settings state synchronization and region filter
consistency
- [Plugin Browser] Make detail modal text selectable and improve search
experience
- [Tools] Fix approval card not showing for builtin and provider tools

### Included Commits

- fix(Selection): prevent Windows crash when closing transparent action
window (#13177)
- fix(renderer): synchronize miniapp settings state and respect region
filter (#13166)
- fix: improve plugin browser UX with three small fixes (#13153)
- fix: show approval card for builtin and provider tools (#13154)
- fix: support esc to close modal (#13159)
- fix: open external editor in new window instead of reusing existing
one (#13160)
- fix: render directory Select options with optionRender (#13152)
- refactor: replace static pnpm patch with postinstall script for
claude-agent-sdk (#13139)
- feat: add dev-only message data inspection button (#13142)
- docs: add review workflow to CLAUDE.md (#13145)
- chore(deps): upgrade @uiw/codemirror packages to 4.25.7 (#13149)
- fix(ci): skip CI on PR body/title edits, only re-run on base branch
changes (#13150)

### Review Checklist

- [ ] Review generated release notes in `electron-builder.yml`
- [ ] Verify version bump in `package.json`
- [ ] CI passes
- [ ] Merge to trigger release build

### Release note

```release-note
Cherry Studio 1.7.23 - Bug Fixes

🐛 Bug Fixes
- [Selection] Fix app crash on Windows when closing action window
- [MiniApp] Fix settings state synchronization and region filter consistency
- [Plugin Browser] Make detail modal text selectable and improve search experience
- [Tools] Fix approval card not showing for builtin and provider tools
```

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: suyao <sy20010504@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 11:05:31 +08:00
Phantom
7f00841d1e chore: Improve Claude translator workflow logic and clarity (#13175)
### What this PR does

Before this PR:
The Claude translator workflow had ambiguous skip conditions. For
example, it didn't explicitly state when to skip already-translated or
already-English content, and the catch-all rule was vaguely worded as
"doesn't need any processing."

After this PR:
The translator workflow now has clearer, more explicit logic:
- Explicitly skips when translated content already matches the original.
- Explicitly skips when the content is already in English.
- The catch-all rule now reads "doesn't match any of the above cases,
skip the task."
- Consistent punctuation (semicolons) across all rule items.

### Why we need it and why it was done in this way

We noticed that the translator workflow would sometimes unnecessarily
re-translate content that was already in English. The root cause was
ambiguous skip conditions in the prompt — the workflow lacked an
explicit instruction to skip when the content is already English,
causing Claude to "translate" English into English redundantly.

This PR makes all skip conditions explicit to prevent such unnecessary
translations and reduce wasted API calls.

The following tradeoffs were made: N/A

The following alternatives were considered: N/A

### Breaking changes

None.

### Special notes for your reviewer

This is a prompt-level change only — no code logic is affected. The
workflow behavior should be functionally equivalent but with clearer
instructions for the Claude model.

### 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
```
2026-03-03 22:51:22 +08:00
Phantom
043886943b fix(ci): skip CI on PR body/title edits, only re-run on base branch changes (#13150)
### What this PR does

Before this PR:
The `edited` type on `pull_request` triggers CI on **any** PR edit,
including body and title changes. This was introduced in #12847 to
re-trigger CI when the base branch changes.

After this PR:
CI only re-triggers on `edited` events when the **base branch** actually
changes (`github.event.changes.base != null`). Editing the PR body or
title no longer triggers unnecessary CI runs.

### Why we need it and why it was done in this way

The following tradeoffs were made:
Using `github.event.changes.base != null` is a lightweight,
well-documented GitHub Actions approach that requires no additional API
calls or external actions.

The following alternatives were considered:
- Removing `edited` entirely: Would revert the base-branch-change fix
from #12847.
- Using a separate workflow with `pull_request_target`: Overly complex
for this use case.

### Breaking changes

None.

### Special notes for your reviewer

- The condition `github.event.action != 'edited' ||
github.event.changes.base != null` is added to 3 jobs: `changes`,
`basic-checks`, and `skills-check-windows`.
- `general-test` and `render-test` are indirectly covered via their
`needs: changes` dependency — if `changes` is skipped, these jobs are
also skipped.
- `notify` depends on all upstream jobs, so it is also covered.

### 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
```

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 13:58:48 +08:00
亢奋猫
2da1fe167c chore: release v1.7.22 (#13128)
### What this PR does

Before this PR:

This is a release PR for version 1.7.22.

After this PR:

- Version bumped from 1.7.21 to 1.7.22
- Release notes updated in `electron-builder.yml`

### Included Changes

**🐛 Bug Fixes**
- [Models] Fix qwen3.5-flash thinking budget configuration by correcting
regex typo
- [Ollama] Fix reasoning order in stream responses
- [Notes] Fix export failure when restoring from cloud backup without
opening Notes page first
- [Chat] Abort translation API call when closing message translation
- [Chat] Disable translate button when message sending is disabled
- [Agent] Clear attached files after sending message in agent session
input bar
- [Export] Filter hidden elements when exporting messages as images
- [Settings] Remove extra divider in settings page

**🔒 Security**
- [MCP] Upgrade @modelcontextprotocol/sdk to 1.27.1 to fix security
vulnerability (GHSA-8r9q-7v3j-jr4g)

Fixes #

### Why we need it and why it was done in this way

This is an automated release PR that collects user-facing bug fixes and
a security update since v1.7.21.

The following tradeoffs were made:

N/A - Release PR

The following alternatives were considered:

N/A

Links to places where the discussion took place: N/A

### Breaking changes

None.

### Special notes for your reviewer

Please verify:
- [ ] Review generated release notes in `electron-builder.yml`
- [ ] Verify version bump in `package.json`
- [ ] CI passes
- [ ] Merge to trigger release build

### 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
Cherry Studio 1.7.22 - Bug Fixes & Improvements

Bug Fixes:
- [Models] Fix qwen3.5-flash thinking budget configuration by correcting regex typo
- [Ollama] Fix reasoning order in stream responses
- [Notes] Fix export failure when restoring from cloud backup without opening Notes page first
- [Chat] Abort translation API call when closing message translation
- [Chat] Disable translate button when message sending is disabled
- [Agent] Clear attached files after sending message in agent session input bar
- [Export] Filter hidden elements when exporting messages as images
- [Settings] Remove extra divider in settings page

Security:
- [MCP] Upgrade @modelcontextprotocol/sdk to 1.27.1 to fix security vulnerability (GHSA-8r9q-7v3j-jr4g)
```

---------

Co-authored-by: suyao <sy20010504@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 23:20:54 +08:00
fullex
afa4f4f709 Merge remote-tracking branch 'origin/main' into v2
# Conflicts:
#	src/renderer/src/pages/settings/MCPSettings/McpSettings.tsx
2026-03-01 22:41:43 +08:00
dependabot[bot]
191e985aaf ci(deps): bump actions/download-artifact from 5 to 8 (#13121)
Bumps
[actions/download-artifact](https://github.com/actions/download-artifact)
from 5 to 8.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/actions/download-artifact/releases">actions/download-artifact's
releases</a>.</em></p>
<blockquote>
<h2>v8.0.0</h2>
<h2>v8 - What's new</h2>
<h3>Direct downloads</h3>
<p>To support direct uploads in <code>actions/upload-artifact</code>,
the action will no longer attempt to unzip all downloaded files.
Instead, the action checks the <code>Content-Type</code> header ahead of
unzipping and skips non-zipped files. Callers wishing to download a
zipped file as-is can also set the new <code>skip-decompress</code>
parameter to <code>false</code>.</p>
<h3>Enforced checks (breaking)</h3>
<p>A previous release introduced digest checks on the download. If a
download hash didn't match the expected hash from the server, the action
would log a warning. Callers can now configure the behavior on mismatch
with the <code>digest-mismatch</code> parameter. To be secure by
default, we are now defaulting the behavior to <code>error</code> which
will fail the workflow run.</p>
<h3>ESM</h3>
<p>To support new versions of the @actions/* packages, we've upgraded
the package to ESM.</p>
<h2>What's Changed</h2>
<ul>
<li>Don't attempt to un-zip non-zipped downloads by <a
href="https://github.com/danwkennedy"><code>@​danwkennedy</code></a> in
<a
href="https://redirect.github.com/actions/download-artifact/pull/460">actions/download-artifact#460</a></li>
<li>Add a setting to specify what to do on hash mismatch and default it
to <code>error</code> by <a
href="https://github.com/danwkennedy"><code>@​danwkennedy</code></a> in
<a
href="https://redirect.github.com/actions/download-artifact/pull/461">actions/download-artifact#461</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/download-artifact/compare/v7...v8.0.0">https://github.com/actions/download-artifact/compare/v7...v8.0.0</a></p>
<h2>v7.0.0</h2>
<h2>v7 - What's new</h2>
<blockquote>
<p>[!IMPORTANT]
actions/download-artifact@v7 now runs on Node.js 24 (<code>runs.using:
node24</code>) and requires a minimum Actions Runner version of 2.327.1.
If you are using self-hosted runners, ensure they are updated before
upgrading.</p>
</blockquote>
<h3>Node.js 24</h3>
<p>This release updates the runtime to Node.js 24. v6 had preliminary
support for Node 24, however this action was by default still running on
Node.js 20. Now this action by default will run on Node.js 24.</p>
<h2>What's Changed</h2>
<ul>
<li>Update GHES guidance to include reference to Node 20 version by <a
href="https://github.com/patrikpolyak"><code>@​patrikpolyak</code></a>
in <a
href="https://redirect.github.com/actions/download-artifact/pull/440">actions/download-artifact#440</a></li>
<li>Download Artifact Node24 support by <a
href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a> in <a
href="https://redirect.github.com/actions/download-artifact/pull/415">actions/download-artifact#415</a></li>
<li>fix: update <code>@​actions/artifact</code> to fix Node.js 24
punycode deprecation by <a
href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a> in <a
href="https://redirect.github.com/actions/download-artifact/pull/451">actions/download-artifact#451</a></li>
<li>prepare release v7.0.0 for Node.js 24 support by <a
href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a> in <a
href="https://redirect.github.com/actions/download-artifact/pull/452">actions/download-artifact#452</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/patrikpolyak"><code>@​patrikpolyak</code></a>
made their first contribution in <a
href="https://redirect.github.com/actions/download-artifact/pull/440">actions/download-artifact#440</a></li>
<li><a href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a>
made their first contribution in <a
href="https://redirect.github.com/actions/download-artifact/pull/415">actions/download-artifact#415</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/download-artifact/compare/v6.0.0...v7.0.0">https://github.com/actions/download-artifact/compare/v6.0.0...v7.0.0</a></p>
<h2>v6.0.0</h2>
<h2>What's Changed</h2>
<p><strong>BREAKING CHANGE:</strong> this update supports Node
<code>v24.x</code>. This is not a breaking change per-se but we're
treating it as such.</p>
<ul>
<li>Update README for download-artifact v5 changes by <a
href="https://github.com/yacaovsnc"><code>@​yacaovsnc</code></a> in <a
href="https://redirect.github.com/actions/download-artifact/pull/417">actions/download-artifact#417</a></li>
<li>Update README with artifact extraction details by <a
href="https://github.com/yacaovsnc"><code>@​yacaovsnc</code></a> in <a
href="https://redirect.github.com/actions/download-artifact/pull/424">actions/download-artifact#424</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="70fc10c6e5"><code>70fc10c</code></a>
Merge pull request <a
href="https://redirect.github.com/actions/download-artifact/issues/461">#461</a>
from actions/danwkennedy/digest-mismatch-behavior</li>
<li><a
href="f258da9a50"><code>f258da9</code></a>
Add change docs</li>
<li><a
href="ccc058e5fb"><code>ccc058e</code></a>
Fix linting issues</li>
<li><a
href="bd7976ba57"><code>bd7976b</code></a>
Add a setting to specify what to do on hash mismatch and default it to
<code>error</code></li>
<li><a
href="ac21fcf45e"><code>ac21fcf</code></a>
Merge pull request <a
href="https://redirect.github.com/actions/download-artifact/issues/460">#460</a>
from actions/danwkennedy/download-no-unzip</li>
<li><a
href="15999bff51"><code>15999bf</code></a>
Add note about package bumps</li>
<li><a
href="974686ed50"><code>974686e</code></a>
Bump the version to <code>v8</code> and add release notes</li>
<li><a
href="fbe48b1d27"><code>fbe48b1</code></a>
Update test names to make it clearer what they do</li>
<li><a
href="96bf374a61"><code>96bf374</code></a>
One more test fix</li>
<li><a
href="b8c4819ef5"><code>b8c4819</code></a>
Fix skip decompress test</li>
<li>Additional commits viewable in <a
href="https://github.com/actions/download-artifact/compare/v5...v8">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/download-artifact&package-manager=github_actions&previous-version=5&new-version=8)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-01 18:40:40 +08:00
Konv Suu
20648a3047 ci: skip on forks (#13110) 2026-02-28 14:20:00 +08:00
fullex
f668fce4f2 merge main into v2 2026-02-28 10:11:18 +08:00
Phantom
ef14219a21 chore: use node-version-file for CI workflows (#13076)
<!-- 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
-->

<!--

⚠️ Important: Redux/IndexedDB Data-Changing Feature PRs Temporarily On
Hold ⚠️

Please note: For our current development cycle, we are not accepting
feature Pull Requests that introduce changes to Redux data models or
IndexedDB schemas.

While we value your contributions, PRs of this nature will be blocked
without merge. We welcome all other contributions (bug fixes, perf
enhancements, docs, etc.). Thank you!

Once version 2.0.0 is released, we will resume reviewing feature PRs.

-->

### What this PR does

Before this PR:
- CI workflows hardcoded `node-version: 22`
- `.node-version` and `.nvmrc` files were at version 22

After this PR:
- All CI workflows read Node version from `.node-version` file using
`node-version-file: '.node-version'`
- `.node-version` and `.nvmrc` updated to `24.11.1` to match Electron
runtime version

<!-- (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 project recently updated Node.js requirement to 24.11.1 in
package.json, but the CI workflows were still hardcoded to use Node 22,
causing warning. This change makes the CI workflows automatically use
the Node version defined in `.node-version` file, ensuring consistency
between local development and CI environments.

The following tradeoffs were made:
- Using `.node-version` instead of reading from `package.json` directly
- simpler and more compatible with GitHub Actions

The following alternatives were considered:

Links to places where the discussion took place: <!-- optional: slack,
other GH issue, mailinglist, ... -->

### Breaking changes

<!-- optional -->

If this PR introduces breaking changes, please describe the changes and
the impact on users.

### Special notes for your reviewer

<!-- optional -->

### 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
- [x] 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
```

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 23:49:58 +08:00
SuYao
d7e5c23d00 docs: add self-review checklist item to PR template (#13067)
<!-- 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
-->

### What this PR does

Before this PR: The PR checklist had no reminder for authors to
self-review their code before requesting review.

After this PR: A new "Self-review" checklist item reminds PR authors to
review their own code using `/gh-pr-review`, `gh pr diff`, or the GitHub
UI before requesting review from others.

### Why we need it and why it was done in this way

Self-review catches obvious issues before reviewer time is spent,
improving review efficiency.

The following tradeoffs were made: N/A

The following alternatives were considered: N/A

Links to places where the discussion took place: N/A

### Breaking changes

None

### Special notes for your reviewer

The link to `/gh-pr-review` points to the skill definition at
`/.claude/skills/gh-pr-review/SKILL.md`.

### 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)
- [ ] 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
```

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 14:32:18 +08:00
SuYao
fe32407a39 docs: add user-facing change guidance for release notes and docs checkbox (#13041)
### What this PR does

Before this PR:
The `gh-create-pr` skill had no guidance on when to write a release note
vs `NONE`, or when to check the Documentation checkbox. The PR template
also lacked explicit guidance on release note scope.

After this PR:
- A lookup table is added to the skill so the model can match change
types to the correct release note and documentation checkbox behavior.
- The PR template is updated to clarify that only user-facing changes
belong in release notes, and the documentation checkbox should only be
checked for user-facing features/behavior changes.

### Why we need it and why it was done in this way

The following tradeoffs were made:
A concise example table was chosen over verbose text rules, following
the "concise examples over verbose explanations" principle from the
skill-creator guide. This makes it easier for the model to pattern-match
rather than reason about abstract rules.

The following alternatives were considered:
- Separate detailed text descriptions for release note and documentation
rules — rejected as harder for the model to follow consistently.
- Keeping guidance only in the skill without updating the PR template —
rejected to keep both in sync for human contributors as well.

### Breaking changes

None.

### Special notes for your reviewer

This is a docs/config-only change. No application code is affected.

### Checklist

- [x] PR: The PR description is expressive enough and will help future
contributors
- [ ] 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)
- [ ] 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.

### Release note

```release-note
NONE
```

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 19:37:45 +08:00
SuYao
6fa53a7a56 ci: add PR description check workflow (#13035)
<!-- 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
-->

### What this PR does

Before this PR:
There is no automated check to ensure PR authors fill in the required
sections of the PR template. PRs can be submitted with empty or
default-only descriptions.

After this PR:
A GitHub Actions workflow automatically validates that PR descriptions
include actual content in the required sections (`What this PR does`,
`Why we need it`, `release-note`). It also reminds authors to review
their description when new commits are pushed.

<!-- (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 PR template exists to maintain quality and consistency in
contributions, but without automated enforcement, authors may forget or
skip filling it in. This workflow provides immediate feedback via check
status and comments.

The implementation uses `actions/github-script@v7` with inline
JavaScript to keep everything in a single file without external
dependencies. HTML comment markers (`<!-- pr-description-check -->`,
`<!-- pr-sync-reminder -->`) are used to track and update bot comments,
avoiding duplicate noise.

The following tradeoffs were made:
- Inline script vs. external action: chose inline to minimize
maintenance overhead and keep the logic visible in one place.

The following alternatives were considered:
- A dedicated GitHub App or external action for template checking —
rejected as overkill for this scope.

### Breaking changes

N/A

### Special notes for your reviewer

- The workflow runs on `opened`, `edited`, `synchronize`, and
`ready_for_review` events for branches `main`, `develop`, and `v2`,
matching the existing `ci.yml` pattern.
- Draft PRs are skipped.
- The `notify-sync` job only runs on `synchronize` events and shows the
latest 3 commit messages.

### 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)
- [ ] 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. You want a
user-guide update if it's a user facing feature.

### Release note

```release-note
NONE
```

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 18:49:23 +08:00
SuYao
847ecfe947 ci: skip tests when PR has no code changes (#13034)
### What this PR does

Before this PR:
All three CI matrix tasks (`basic-checks`, `general-test`,
`render-test`) ran on every PR regardless of what files changed.

After this PR:
- Tests are skipped on PRs that only modify non-code files (e.g., docs,
CI configs, markdown). `basic-checks` (lint, format, typecheck, i18n,
skills) always runs.
- `general-test` and `render-test` are split into independent jobs with
granular path filters:
- `src/main/**`, `src/preload/**`, `scripts/**` → only triggers
`general-test`
  - `src/renderer/**` → only triggers `render-test`
  - `packages/**`, `tests/**`, config/dependency files → triggers both

### Why we need it and why it was done in this way

Non-code PRs (documentation updates, CI workflow changes, maintenance
files) do not need test suites to run, saving CI minutes and reducing
feedback latency. Granular filtering further reduces waste — a
renderer-only change no longer waits for main process tests and vice
versa.

The following tradeoffs were made:
- Tests always run on `push` to `main` and `workflow_dispatch` for
safety, even if the change is non-code.
- `packages/**` changes trigger both test jobs since packages may be
consumed by either process.

The following alternatives were considered:
- Using `paths` / `paths-ignore` on the workflow trigger level, but that
would skip the entire workflow including `basic-checks`.
- Keeping a single `tests` matrix job, but separate jobs allow job-level
`if` conditions for independent skipping and clearer GitHub UI feedback.

### Breaking changes

None.

### Special notes for your reviewer

- Uses `dorny/paths-filter@v3` for change detection with three filter
groups: `main`, `renderer`, `shared`.
- The `changes` job is lightweight (checkout + filter only, no `pnpm
install`).
- The `notify` job dependencies updated from `[ci,
skills-check-windows]` to `[basic-checks, general-test, render-test,
skills-check-windows]`.
- `tests/**` is included in the `shared` filter so test-only PRs still
trigger test jobs.

### 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. You want a
user-guide update if it's a user facing feature.

### Release note

```release-note
NONE
```

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 14:29:14 +08:00
Phantom
a030bd9895 fix: correct claude_args format for prepare-release workflow (#13012)
### What this PR does

Fixes the `claude_args` format in the prepare-release workflow.

Before this PR:

```yaml
claude_args: '--allowed-tools Bash(git:*),Bash(gh pr create:*),Bash(gh pr view:*),Bash(cat:*),Edit,Read,Write,Glob,Grep'
```

After this PR:

```yaml
claude_args: '--allowed-tools "Bash(git:*),Bash(gh pr create:*),Bash(gh pr view:*),Bash(cat:*),Edit,Read,Write,Glob,Grep"'
```

Reference: https://code.claude.com/docs/en/cli-reference#cli-flags

### Why we need it and why it was done in this way

The original format without quotes was not being parsed correctly by
Claude Code Action. The YAML string was being interpreted incorrectly,
causing the subtool patterns to be lost. Adding quotes around the entire
tools list ensures proper parsing.

The following tradeoffs were made:

- Using comma-separated format (both comma and space are supported per
docs)

The following alternatives were considered:

- Using space-separated format (also valid but keeping original comma
style)

### Breaking changes

None.

### Special notes for your reviewer

This fix enables the prepare-release workflow to successfully execute
`git push` and `gh pr create` commands. The workflow ran successfully
but the git operations were being silently skipped due to permission
format issues.

### Checklist

- [x] PR: The PR description is expressive enough and will help future
contributors
- [x] Code: Write code that humans can understand and Keep it simple
- [x] Refactor: You have left the code cleaner than you found it
- [x] Upgrade: Impact of this change on upgrade flows was considered and
addressed if required
- [x] Documentation: A user-guide update was considered and is present
(link) or not required

### Release note

```release-note
NONE
```

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 20:08:06 +08:00
Phantom
b8e12a2455 feat: Add agent skills (create-skill, gh-create-issue) and improve existing skill workflow (#13004)
<!-- 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
-->

<!--

⚠️ Important: Redux/IndexedDB Data-Changing Feature PRs Temporarily On
Hold ⚠️

Please note: For our current development cycle, we are not accepting
feature Pull Requests that introduce changes to Redux data models or
IndexedDB schemas.

While we value your contributions, PRs of this nature will be blocked
without merge. We welcome all other contributions (bug fixes, perf
enhancements, docs, etc.). Thank you!

Once version 2.0.0 is released, we will resume reviewing feature PRs.

-->

### What this PR does

Before this PR:
- No skill existed for creating new agent skills (multi-agent shared
skills)
- No skill existed for creating GitHub issues with templates
- gh-create-pr skill had an incomplete workflow

After this PR:
- Added `create-skill` skill for scaffolding new skills following
`.agents/skills/README.md` workflow
- Added `gh-create-issue` skill for creating GitHub issues following
repository's issue template format
- Updated `prepare-release` workflow to use `gh-create-pr` skill instead
of manual PR creation
- Updated `gh-create-pr` skill with improved workflow:
  - Check and push branch to remote before creating PR
  - Determine base branch (support official repo and fork scenarios)
  - Create temp file first, then preview
  - Show temp file path in preview for user reference
- Support skipping preview/confirmation when user explicitly indicates
(e.g., automation workflows)

### Why we need it and why it was done in this way

The following tradeoffs were made:
- Created skills follow the existing skill structure and naming
conventions
- Skills support skipping preview/confirmation for automation workflows
- Updated prepare-release workflow to use skills consistently
- Temp file workflow allows users to edit content directly before
confirmation

The following alternatives were considered:
- Manual PR/issue creation without skill automation

Links to places where the discussion took place: <!-- optional: slack,
other GH issue, mailinglist, ... -->
N/A

### Breaking changes

<!-- optional -->

None

### Special notes for your reviewer

<!-- optional -->

N/A

### 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
- [x] Documentation: A [user-guide update](https://docs.cherry-ai.com)
was considered and is present (link) or not required. You want a
user-guide update if it's a user facing feature.

### 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".
-->

```release-note
NONE
```
2026-02-24 20:01:04 +08:00
SuYao
0989f9b820 feat(ci): add prepare-release skill for automated release workflow (#12958)
<!-- 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
-->

<!--

⚠️ Important: Redux/IndexedDB Data-Changing Feature PRs Temporarily On
Hold ⚠️

Please note: For our current development cycle, we are not accepting
feature Pull Requests that introduce changes to Redux data models or
IndexedDB schemas.

While we value your contributions, PRs of this nature will be blocked
without merge. We welcome all other contributions (bug fixes, perf
enhancements, docs, etc.). Thank you!

Once version 2.0.0 is released, we will resume reviewing feature PRs.

-->

### What this PR does

Before this PR:

Releases had to be prepared manually — collecting commits, writing
bilingual release notes, updating version files, creating branches and
PRs by hand.

After this PR:

A new `prepare-release` skill automates the entire release workflow:
commit collection, bilingual release note generation, version file
updates, and release branch/PR creation. It can be invoked interactively
via `/prepare-release` or automatically via a `workflow_dispatch` GitHub
Actions workflow.

<!-- (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:

The skill is duplicated in both `.agents/skills/` and `.claude/skills/`
to support both project-level and user-level skill discovery. The GitHub
Actions workflow uses `claude-code-action` to run the skill in CI,
skipping the interactive confirmation step since the user explicitly
triggers it via `workflow_dispatch`.

The following alternatives were considered:

A shell script was considered but would lack the flexibility of
AI-driven commit categorization and bilingual release note generation.

Links to places where the discussion took place: N/A

### Breaking changes

<!-- optional -->

None.

### Special notes for your reviewer

<!-- optional -->

- The skill delegates PR creation to the `gh-create-pr` skill (or its
SKILL.md fallback) per CLAUDE.md requirements.
- The `workflow_dispatch` trigger already requires repository write
access, so no additional permission restrictions were added.
- The two SKILL.md files (`.agents/skills/` and `.claude/skills/`)
should be kept in sync.

### 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)
- [ ] 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. You want a
user-guide update if it's a user facing feature.

### 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".
-->

```release-note
NONE
```

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 14:41:00 +08:00
Phantom
e61e1bb672 feat: Optimize PR workflow with on-demand skill loading and project-level skills management (#12943)
### What this PR does

Before this PR:
- CLAUDE.md contained detailed PR workflow instructions that were loaded
in every agent session, consuming unnecessary tokens
- No unified project-level skills management mechanism; adding public
skills lacked standardization
- No automated checks to prevent non-compliant skills from being merged
- Team members had no convenient way to share skills with each other

After this PR:
- Simplified PR instructions in CLAUDE.md, now loaded on-demand via the
`gh-create-pr` skill
- Introduced project-level skills management (`.agents/skills/`
directory + `public-skills.txt` whitelist)
- Added `scripts/skills-sync.ts` and `scripts/skills-check.ts` for
automated management
- Integrated skills validation into CI to prevent non-whitelisted skills
from being merged
- **Teams can now easily share skills through the project-level
mechanism**, with `skills-sync.ts` automatically syncing skills to all
team members' local environments, streamlining onboarding and avoiding
duplicated configuration efforts
- **Optimized PR creation workflow**: `gh-create-pr` skill enforces
English PR body writing and displays the draft to users for review
before creation, ensuring quality and compliance

Fixes #

### Why we need it and why it was done in this way

The following tradeoffs were made:
- Moved PR workflow from CLAUDE.md to a skill, sacrificing immediate
visibility for token efficiency
- **Introduced whitelist mechanism (`public-skills.txt`) instead of
auto-scanning all files**: Allows developers to freely use private
project-level skills in the `.agents/skills/` directory (e.g.,
team-internal skills, personal customizations). Only skills added to the
whitelist are tracked by git and submitted. This ensures standardization
for shared skills while preserving development flexibility
- Skills exist in both `.agents/skills/` (project-level, shareable) and
`.claude/skills/` (local, private)
- **Symlink only SKILL.md files instead of entire directories**: On some
Windows/restricted filesystems, symlinks may fail or be treated as
regular files. If an entire directory is symlinked, failure results in a
regular file instead of a directory, causing complete skill failure
that's hard to diagnose. Symlinking only SKILL.md allows quick detection
when symlinks fail (file content displays directly or errors), reducing
troubleshooting costs

The following alternatives were considered:
- Keeping PR instructions in CLAUDE.md with collapsible blocks, but this
still consumes context tokens
- Using git hooks for pre-commit checks, but CI checks are more reliable
and don't block local development

Links to places where the discussion took place: N/A

### Breaking changes

None

### Special notes for your reviewer

- `gh-create-pr` skill fully implements the project's PR workflow
requirements (read template → display body → confirm → create)
- `skills-check.ts` validates: 1) tracked skills are in the whitelist;
2) whitelist skills have corresponding files
- Process for adding new public skills: 1) create skill files; 2) add to
`public-skills.txt`; 3) CI auto-validation
- `.claude/skills/` added to `.gitignore` for private skills

### 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
is present (link) or not required. You want a user-guide update if it's
a user facing feature.
- [ ] Documentation: A user-guide update was considered and is present
(link) or not required. You want a user-guide update if it's a user
facing feature.

### Release note

```release-note
Optimize PR workflow by moving instructions to on-demand skill; introduce project-level skills management with automated validation
```
2026-02-17 00:37:32 +08:00
Phantom
ca7c85139d feat: change auto-i18n workflow to run daily instead of weekly (#12899)
### What this PR does

Before this PR:
- Auto i18n workflow runs weekly on Sundays at 00:00 UTC
- Workflow name was "Auto I18N Weekly"

After this PR:
- Auto i18n workflow runs daily at 00:00 UTC
- Workflow name is "Auto I18N Daily"

### Why we need it and why it was done in this way

The following tradeoffs were made:
- More frequent syncs mean more PR noise, but translations stay more
up-to-date

The following alternatives were considered:
- Keeping weekly schedule: translations may lag behind source changes
- Running on weekdays only: skipped in favor of daily for simplicity

### Breaking changes

None

### Special notes for your reviewer

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
- [x] Documentation: A [user-guide update](https://docs.cherry-ai.com)
was considered and is present (link) or not required. You want a
user-guide update if it's a user facing feature.

### Release note

```release-note
Change auto-i18n workflow schedule from weekly to daily for more frequent translation synchronization.
```

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 00:26:50 +08:00
kangfenmao
f9fab3df8a chore: remove obsolete delete-branch workflow from GitHub Actions
This commit deletes the `delete-branch.yml` workflow file, which was responsible for automatically deleting merged branches. The removal is part of a cleanup effort to streamline CI/CD processes and eliminate unused configurations.
2026-02-12 11:02:14 +08:00
George·Dong
b2e572aa14 ci: split CI into matrix and add notifier job (#12864)
### What this PR does

Before this PR:
- CI ran as a single build job serially, missing shared project tests
and sending notifications from the same job.

After this PR:
- Split CI into a parallel matrix that runs lint, typecheck, and
targeted test tasks (test-main, test-renderer, test-other).
- Added a test script for the shared project.
- Added a separate notifier job that runs on CI failure (on pushes to
main) to send Feishu notifications with a prepared environment.

Fixes #

### Why we need it and why it was done in this way

- Reduce total CI runtime by running independent checks in parallel via
a matrix.
- Improve failure visibility and reliability of notifications by
isolating notification logic in its own job.
- Ensure shared project tests are executed as part of CI.

### Breaking changes

- None

### Special notes for your reviewer

- The notifier runs only on CI failure for pushes to main.
2026-02-11 23:05:02 +08:00
fullex
6bf5356d1b Merge main into v2 2026-02-11 20:44:46 +08:00
亢奋猫
4e64c433cc ci: trigger release build on PR from release branches (#12876)
### What this PR does

Before this PR:
- Release builds are only triggered when pushing tags (v*.*.*)

After this PR:
- Release builds can also be triggered when creating/updating PRs from
`release/v*` branches to `main`
- This allows testing release builds before tagging

### Why we need it and why it was done in this way

This change enables the team to:
1. Create a `release/vX.X.X` branch and open a PR to `main`
2. Automatically trigger release builds for testing
3. Download and test the build artifacts before officially tagging and
releasing

The following tradeoffs were made:
- Added conditional logic to distinguish between PR builds and tag
builds
- Version is extracted from branch name for PR builds (e.g.,
`release/v1.0.0` → `v1.0.0`)

### Breaking changes

None. Tag-based releases continue to work as before.

### Checklist

- [x] PR: The PR description is expressive enough and will help future
contributors
- [x] Code: Write code that humans can understand and Keep it simple

### Release note

```release-note
NONE
```
2026-02-11 17:44:31 +08:00
Phantom
b4f2e31c98 fix(ci): trigger CI when PR base branch is changed (#12847)
* fix(ci): trigger CI when PR base branch is changed

Add `edited` event type to the pull_request trigger so that CI runs
when a PR's base branch is switched, preventing unverified commits
from being merged into main.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor: Reorder imports in KnowledgeVideos component

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 13:36:01 +08:00
fullex
072dd67a87 merge main into v2 2026-02-09 13:02:41 +08:00
Phantom
7b985bf474 ci: run CI on main branch push (#12738)
* ci: run CI on main branch push and rename workflow

- Rename pr-ci.yml to ci.yml
- Rename workflow from "Pull Request CI" to "CI"
- Add push trigger for main branch
- Rename PRCI env variable to CI
- Fix if condition to support push/workflow_dispatch events

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* ci: add Feishu notification on main branch CI failure

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix(tests): add ipcRenderer.invoke mock to renderer setup

- Updated the renderer setup test file to include a mock for ipcRenderer.invoke, resolving it to undefined for improved test reliability.

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: kangfenmao <kangfenmao@qq.com>
2026-02-06 10:07:18 +08:00
dependabot[bot]
5fa5861ba0 ci(deps): bump actions/cache from 4 to 5 (#12668)
Bumps [actions/cache](https://github.com/actions/cache) from 4 to 5.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-04 16:19:50 +08:00
dependabot[bot]
285455d79d ci(deps): bump actions/upload-artifact from 5 to 6 (#12669)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 5 to 6.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-04 15:41:06 +08:00
fullex
481bf6daa3 Merge branch 'main' of github.com:CherryHQ/cherry-studio into v2
# Conflicts:
#	package.json
#	pnpm-lock.yaml
#	src/main/services/WindowService.ts
#	src/main/utils/language.ts
#	src/renderer/src/components/RichEditor/extensions/code-block-shiki/CodeBlockNodeView.tsx
#	src/renderer/src/components/__tests__/__snapshots__/InputEmbeddingDimension.test.tsx.snap
#	src/renderer/src/hooks/useMinappPopup.ts
#	src/renderer/src/hooks/useMinapps.ts
#	src/renderer/src/pages/home/Messages/Tools/MessageMcpTool.tsx
#	src/renderer/src/pages/home/Tabs/components/AddButton.tsx
#	src/renderer/src/pages/home/Tabs/components/AgentItem.tsx
#	src/renderer/src/pages/home/Tabs/components/AssistantItem.tsx
#	src/renderer/src/pages/minapps/MiniappSettings/MiniAppSettings.tsx
#	src/renderer/src/pages/paintings/components/DynamicFormRender.tsx
#	src/renderer/src/pages/paintings/components/ImageUploader.tsx
#	src/renderer/src/pages/settings/DocProcessSettings/PreprocessProviderSettings.tsx
#	src/renderer/src/pages/settings/MCPSettings/McpPrompt.tsx
#	src/renderer/src/pages/settings/MCPSettings/McpTool.tsx
#	src/renderer/src/pages/settings/MCPSettings/index.tsx
#	src/renderer/src/services/messageStreaming/callbacks/toolCallbacks.ts
#	src/renderer/src/windows/selection/action/components/ActionTranslate.tsx
2026-01-30 01:12:28 +08:00
kangfenmao
dd73d3d309 feat(release): add platform input for release workflow and adjust OS matrix based on input
- Introduced a new input parameter 'platform' to specify the build platform (all, windows, mac, linux).
- Updated the job strategy matrix to dynamically select OS based on the provided platform input, enhancing flexibility in the release process.
2026-01-25 16:57:18 +08:00
SuYao
5c013cdb63 feat(i18n): add hardcoded string detection script and CI check (#12547)
* feat(i18n): clean hardcoded ui string add ci

* fix(i18n): update snap

* fix: test

* fix(i18n): update plurals

* chore: revert other branch change

* refactor: use ast detect hardcoded string

* chore: typo error

* feat(i18n): add webview app

* chore(i18n): update i18n

* fix: pr comment

* chore: distinguish label and labelKey

* refactor: align v2 desgin
2026-01-24 18:19:38 +08:00
fullex
ad37f0991a merge main into v2 2026-01-10 00:39:06 +08:00
Phantom
864eda68fb ci(workflows): fix pnpm installation and improve issue tracker (#12388)
* ci(workflows): add pnpm caching to improve build performance

Cache pnpm dependencies to reduce installation time in CI workflows

* ci(github-actions): change claude-code-action version to v1

* ci(workflows): improve issue tracker formatting

Format issue body as markdown code block for better readability in workflow output

* ci(workflows): unify claude-code-action version to v1 for both jobs

Changed process-pending-issues job from @main to @v1 to maintain consistency across all jobs and avoid potential version conflicts.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* fix(workflows): remove --help from allowed-tools to avoid upstream parsing bug

The `--help` flags in claude_args were being incorrectly parsed as actual
command-line arguments by claude-code-action, causing JSON parsing errors
("Unexpected identifier 'Usage'").

Switched to wildcard pattern `pnpm tsx scripts/feishu-notify.ts*` which:
- Allows all feishu-notify.ts commands including --help
- Avoids triggering the upstream argument parsing bug
- Simplifies the allowed-tools configuration

This addresses the root cause identified by Anthropic engineers.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* fix(workflows): remove --help references from prompts

Remove `--help` references from prompts to avoid potential parsing issues.
The example commands are already comprehensive enough without needing to
mention the help flag.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-09 20:47:39 +08:00
Phantom
76cc196667 ci(workflows): add Feishu notification for workflow failures (#12375)
* ci(workflows): add feishu notification for failed sync jobs

Add Feishu webhook notification when sync-to-gitcode workflow fails or is cancelled. The notification includes tag name, status and run URL for quick debugging.

* ci(workflow): add feishu notification for failed or cancelled jobs
2026-01-09 11:35:17 +08:00
Phantom
2a1722bb52 fix(workflows): add pnpm installing and caching (#12374) 2026-01-08 17:42:59 +08:00
Phantom
43a48a4a38 feat(scripts): migrate feishu-notify to TypeScript CLI tool with subcommands (#12371)
* build: add commander package as dependency

* refactor(scripts): migrate feishu-notify to TypeScript with CLI interface

- Convert JavaScript implementation to TypeScript with proper type definitions
- Add CLI interface using commander for better usability
- Improve error handling and input validation
- Add version management and subcommand support

* ci(workflows): update feishu notification command and add pnpm install step

Update the feishu notification command to use CLI tool with proper arguments instead of direct node script execution
Add pnpm install step to ensure dependencies are available before running the workflow

* docs: add feishu notification script documentation

Add Chinese and English documentation for the feishu-notify.ts CLI tool

* feat(notify): add generic send command to feishu-notify

Add a new 'send' subcommand to send simple notifications to Feishu with customizable title, description and header color. This provides a more flexible way to send notifications without being tied to specific business logic like the existing 'issue' command.

The implementation includes:
- New send command handler and options interface
- Simple card creation function
- Zod schema for header color validation
- Documentation updates in both Chinese and English
2026-01-08 16:55:46 +08:00
defi-failure
1d07e89e38 fix: remove blockmap handling after differentialPackage disabled (#12351) 2026-01-07 22:48:31 +08:00
fullex
cd778f3574 Merge branch 'main' of github.com:CherryHQ/cherry-studio into v2 2026-01-07 21:02:43 +08:00
kangfenmao
8d56bf80dd chore: update GitHub Actions workflow to enable corepack for pnpm installation
Replaced the pnpm action setup with a corepack enable command to streamline dependency management in the workflow.
2026-01-07 18:46:07 +08:00