mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2026-07-03 12:27:41 +08:00
<!-- 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>
232 lines
8.3 KiB
YAML
232 lines
8.3 KiB
YAML
name: GitHub Issue Tracker with Feishu Notification
|
||
|
||
on:
|
||
issues:
|
||
types: [opened]
|
||
schedule:
|
||
# Run every day at 8:30 Beijing Time (00:30 UTC)
|
||
- cron: "30 0 * * *"
|
||
workflow_dispatch:
|
||
|
||
jobs:
|
||
process-new-issue:
|
||
if: github.event_name == 'issues'
|
||
runs-on: ubuntu-latest
|
||
permissions:
|
||
issues: write
|
||
contents: read
|
||
id-token: write
|
||
|
||
steps:
|
||
- name: Checkout repository
|
||
uses: actions/checkout@v6
|
||
|
||
- name: Check Beijing Time
|
||
id: check_time
|
||
run: |
|
||
# Get current time in Beijing timezone (UTC+8)
|
||
BEIJING_HOUR=$(TZ='Asia/Shanghai' date +%H)
|
||
BEIJING_MINUTE=$(TZ='Asia/Shanghai' date +%M)
|
||
|
||
echo "Beijing Time: ${BEIJING_HOUR}:${BEIJING_MINUTE}"
|
||
|
||
# Check if time is between 00:00 and 08:30
|
||
if [ $BEIJING_HOUR -lt 8 ] || ([ $BEIJING_HOUR -eq 8 ] && [ $BEIJING_MINUTE -le 30 ]); then
|
||
echo "should_delay=true" >> $GITHUB_OUTPUT
|
||
echo "⏰ Issue created during quiet hours (00:00-08:30 Beijing Time)"
|
||
echo "Will schedule notification for 08:30"
|
||
else
|
||
echo "should_delay=false" >> $GITHUB_OUTPUT
|
||
echo "✅ Issue created during active hours, will notify immediately"
|
||
fi
|
||
|
||
- name: Add pending label if in quiet hours
|
||
if: steps.check_time.outputs.should_delay == 'true'
|
||
uses: actions/github-script@v8
|
||
with:
|
||
script: |
|
||
github.rest.issues.addLabels({
|
||
owner: context.repo.owner,
|
||
repo: context.repo.repo,
|
||
issue_number: context.issue.number,
|
||
labels: ['pending-feishu-notification']
|
||
});
|
||
|
||
- name: Setup Node.js
|
||
if: steps.check_time.outputs.should_delay == 'false'
|
||
uses: actions/setup-node@v6
|
||
with:
|
||
node-version-file: '.node-version'
|
||
|
||
- name: Install pnpm
|
||
uses: pnpm/action-setup@v4
|
||
|
||
- name: Get pnpm store directory
|
||
id: pnpm-cache
|
||
shell: bash
|
||
run: echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_OUTPUT
|
||
|
||
- name: Cache pnpm dependencies
|
||
uses: actions/cache@v5
|
||
with:
|
||
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
|
||
key: ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }}
|
||
restore-keys: |
|
||
${{ runner.os }}-pnpm-
|
||
|
||
- name: Install dependencies
|
||
if: steps.check_time.outputs.should_delay == 'false'
|
||
run: pnpm install
|
||
|
||
- name: Process issue with Claude
|
||
if: steps.check_time.outputs.should_delay == 'false'
|
||
uses: anthropics/claude-code-action@v1
|
||
with:
|
||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||
allowed_non_write_users: "*"
|
||
anthropic_api_key: ${{ secrets.CLAUDE_TRANSLATOR_APIKEY }}
|
||
claude_args: "--allowed-tools Bash(gh issue:*),Bash(pnpm tsx scripts/feishu-notify.ts*)"
|
||
prompt: |
|
||
你是一个GitHub Issue自动化处理助手。请完成以下任务:
|
||
|
||
## 当前Issue信息
|
||
- Issue编号:#${{ github.event.issue.number }}
|
||
- 标题:${{ github.event.issue.title }}
|
||
- 作者:${{ github.event.issue.user.login }}
|
||
- URL:${{ github.event.issue.html_url }}
|
||
- 标签:${{ join(github.event.issue.labels.*.name, ', ') }}
|
||
|
||
### Issue body
|
||
|
||
`````md
|
||
${{ github.event.issue.body }}
|
||
`````
|
||
|
||
## 任务步骤
|
||
|
||
1. **分析并总结issue**
|
||
用中文(简体)提供简洁的总结(2-3句话),包括:
|
||
- 问题的主要内容
|
||
- 核心诉求
|
||
- 重要的技术细节
|
||
|
||
2. **发送飞书通知**
|
||
使用CLI工具发送飞书通知,参考以下示例:
|
||
```bash
|
||
pnpm tsx scripts/feishu-notify.ts issue \
|
||
-u "${{ github.event.issue.html_url }}" \
|
||
-n "${{ github.event.issue.number }}" \
|
||
-t "${{ github.event.issue.title }}" \
|
||
-a "${{ github.event.issue.user.login }}" \
|
||
-l "${{ join(github.event.issue.labels.*.name, ',') }}" \
|
||
-m "<你生成的中文总结>"
|
||
```
|
||
|
||
## 注意事项
|
||
- 总结必须使用简体中文
|
||
- 命令行参数需要正确转义特殊字符
|
||
- 如果issue内容为空,也要提供一个简短的说明
|
||
|
||
请开始执行任务!
|
||
env:
|
||
ANTHROPIC_BASE_URL: ${{ secrets.CLAUDE_TRANSLATOR_BASEURL }}
|
||
FEISHU_WEBHOOK_URL: ${{ secrets.FEISHU_WEBHOOK_URL }}
|
||
FEISHU_WEBHOOK_SECRET: ${{ secrets.FEISHU_WEBHOOK_SECRET }}
|
||
|
||
process-pending-issues:
|
||
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
|
||
runs-on: ubuntu-latest
|
||
permissions:
|
||
issues: write
|
||
contents: read
|
||
id-token: write
|
||
|
||
steps:
|
||
- name: Checkout repository
|
||
uses: actions/checkout@v6
|
||
|
||
- name: Setup Node.js
|
||
uses: actions/setup-node@v6
|
||
with:
|
||
node-version-file: '.node-version'
|
||
|
||
- name: Install pnpm
|
||
uses: pnpm/action-setup@v4
|
||
|
||
- name: Get pnpm store directory
|
||
id: pnpm-cache
|
||
shell: bash
|
||
run: echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_OUTPUT
|
||
|
||
- name: Cache pnpm dependencies
|
||
uses: actions/cache@v5
|
||
with:
|
||
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
|
||
key: ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }}
|
||
restore-keys: |
|
||
${{ runner.os }}-pnpm-
|
||
|
||
- name: Install dependencies
|
||
run: pnpm install
|
||
|
||
- name: Process pending issues with Claude
|
||
uses: anthropics/claude-code-action@v1
|
||
with:
|
||
anthropic_api_key: ${{ secrets.CLAUDE_TRANSLATOR_APIKEY }}
|
||
allowed_non_write_users: "*"
|
||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||
claude_args: "--allowed-tools Bash(gh issue:*),Bash(gh api:*),Bash(pnpm tsx scripts/feishu-notify.ts*)"
|
||
prompt: |
|
||
你是一个GitHub Issue自动化处理助手。请完成以下任务:
|
||
|
||
## 任务说明
|
||
处理所有待发送飞书通知的GitHub Issues(标记为 `pending-feishu-notification` 的issues)
|
||
|
||
## 步骤
|
||
|
||
1. **获取待处理的issues**
|
||
使用以下命令获取所有带 `pending-feishu-notification` 标签的issues:
|
||
```bash
|
||
gh api repos/${{ github.repository }}/issues?labels=pending-feishu-notification&state=open
|
||
```
|
||
|
||
2. **总结每个issue**
|
||
对于每个找到的issue,用中文提供简洁的总结(2-3句话),包括:
|
||
- 问题的主要内容
|
||
- 核心诉求
|
||
- 重要的技术细节
|
||
|
||
3. **发送飞书通知**
|
||
使用CLI工具发送飞书通知,参考以下示例:
|
||
```bash
|
||
pnpm tsx scripts/feishu-notify.ts issue \
|
||
-u "<issue的html_url>" \
|
||
-n "<issue编号>" \
|
||
-t "<issue标题>" \
|
||
-a "<issue作者>" \
|
||
-l "<逗号分隔的标签列表,排除pending-feishu-notification>" \
|
||
-m "<你生成的中文总结>"
|
||
```
|
||
|
||
4. **移除标签**
|
||
成功发送后,使用以下命令移除 `pending-feishu-notification` 标签:
|
||
```bash
|
||
gh api -X DELETE repos/${{ github.repository }}/issues/<issue编号>/labels/pending-feishu-notification
|
||
```
|
||
|
||
## 环境变量
|
||
- Repository: ${{ github.repository }}
|
||
- Feishu webhook URL和密钥已在环境变量中配置好
|
||
|
||
## 注意事项
|
||
- 如果没有待处理的issues,输出提示信息后直接结束
|
||
- 处理多个issues时,每个issue之间等待2-3秒,避免API限流
|
||
- 如果某个issue处理失败,继续处理下一个,不要中断整个流程
|
||
- 所有总结必须使用中文(简体中文)
|
||
|
||
请开始执行任务!
|
||
env:
|
||
ANTHROPIC_BASE_URL: ${{ secrets.CLAUDE_TRANSLATOR_BASEURL }}
|
||
FEISHU_WEBHOOK_URL: ${{ secrets.FEISHU_WEBHOOK_URL }}
|
||
FEISHU_WEBHOOK_SECRET: ${{ secrets.FEISHU_WEBHOOK_SECRET }}
|