cherry-pr-test

$npx mdskill add CherryHQ/cherry-studio/cherry-pr-test

Test Cherry Studio PRs by checking out, launching Electron, and running UI tests.

  • Solves the need to manually test pull requests in Cherry Studio.
  • Depends on gh CLI, agent-browser, pnpm, and Electron.
  • Selects a PR from user input or lists recent open PRs for choice.
  • Shows the test report to the user before posting it.

SKILL.md

.github/skills/cherry-pr-testView on GitHub ↗
---
name: cherry-pr-test
description: Test Cherry Studio PRs by checking out the branch, launching the Electron app in debug mode, and running interactive UI tests via CDP.
---

# Cherry Studio PR Test

Automated PR testing workflow for Cherry Studio. Checks out a PR, launches
the Electron app with Chrome DevTools Protocol, connects agent-browser, and
runs interactive UI + code review tests.

## Prerequisites

- `gh` CLI installed and authenticated
- `agent-browser` installed (for CDP-based UI testing)
- `pnpm` installed with project dependencies (`pnpm install`)

## Constraints

- Always kill existing Cherry Studio processes before launching a new instance.
- Never leave debug processes running after testing completes.
- Always switch back to the default branch after testing.
- Always show the test report to the user before posting it.

## Arguments

`$ARGUMENTS` may contain:
- A PR number (e.g., `13955`)
- A PR URL (e.g., `https://github.com/CherryHQ/cherry-studio/pull/13955`)
- Keywords like "latest", "recent" to pick a recent PR
- Empty — list recent PRs and let the user choose

## Workflow

### Phase 1: Select & Checkout PR

1. If no PR number given, list recent open PRs:
   ```bash
   gh pr list --repo CherryHQ/cherry-studio --state open --limit 10 \
     --json number,title,author,createdAt,headRefName,changedFiles \
     --template '{{range .}}#{{.number}} | {{.title}} | by {{.author.login}} | files: {{.changedFiles}}
   {{end}}'
   ```
2. Ask the user to pick one (or auto-pick if "latest"/"recent").
3. View PR details to understand what changed:
   ```bash
   gh pr view <NUMBER> --json title,body,headRefName,files
   ```
4. Checkout the PR branch:
   ```bash
   gh pr checkout <NUMBER>
   ```
5. Read the key changed files to understand the scope of changes.

### Phase 2+3: Static Analysis & Launch App (parallel)

Static analysis and app launch are independent — run them in parallel to save time.

#### Static Analysis (can run while app is starting)

1. **TypeScript typecheck** (catch type errors early):
   ```bash
   pnpm typecheck 2>&1 | grep -E "error TS|exited with code"
   ```
2. **Review blocked files**: Check if the PR modifies files with
   `@deprecated` / `V2 DATA&UI REFACTORING` headers. These files are blocked
   for feature changes until v2.0.0.
3. **Scan for common issues**:
   - Hardcoded strings (should use i18n)
   - `console.log` usage (should use `loggerService`)
   - Missing type annotations on new public interfaces

Record all findings for the final report.

#### Launch App

1. **Kill any existing Cherry Studio processes** (graceful SIGTERM first):
   ```bash
   pkill -f "cherry-studio.*Electron" 2>/dev/null
   pkill -f "electron-vite" 2>/dev/null
   lsof -ti :9222 | xargs kill 2>/dev/null
   lsof -ti :5173 | xargs kill 2>/dev/null
   sleep 3
   # Escalate to SIGKILL only if processes remain
   lsof -ti :9222 | xargs kill -9 2>/dev/null
   lsof -ti :5173 | xargs kill -9 2>/dev/null
   ```

2. **Start in debug mode** (includes `--remote-debugging-port=9222`):
   ```bash
   nohup pnpm debug > /tmp/cherry-debug.log 2>&1 &
   ```

3. **Wait for startup** (typically 20-30s):
   ```bash
   for i in $(seq 1 30); do
     lsof -i :9222 2>/dev/null | grep LISTEN && break
     sleep 2
   done
   ```

### Phase 4: Connect agent-browser

1. **Connect**:
   ```bash
   agent-browser connect 9222
   ```
   If `connect` fails, fall back to websocket URL from logs:
   ```bash
   WS_URL=$(grep "DevTools listening" /tmp/cherry-debug.log | sed 's/.*ws:/ws:/')
   agent-browser --cdp "$WS_URL" navigate http://localhost:5173
   ```

2. **Verify connection and identify the main page**:
   ```bash
   agent-browser tab
   ```
   You should see the main Cherry Studio page at `http://localhost:5173/`.
   If multiple tabs are listed, use `agent-browser tab <N>` to select the main one.

3. **Handle first-launch scenarios**:
   - **V2 Data Migration Wizard**: On the v2 branch (or fresh dev data), the app
     may show a migration wizard (`/migrationV2.html`) before the main UI.
     Click through: 介绍(下一步) → 备份(我已备份,开始迁移) → 迁移(确定) → 完成(重启应用).
     After "重启应用", kill and relaunch the app (the restart button doesn't work in dev mode).
   - **Splash screen**: Wait up to 30s for the splash to dismiss.

4. **Create screenshot directory** for this PR:
   ```bash
   mkdir -p /tmp/pr-<NUMBER>
   ```
   Use this directory for all screenshots: `/tmp/pr-<NUMBER>/<descriptive-name>.png`

### Phase 5: Interactive UI Testing

Based on the PR's changed files, navigate to the relevant pages and test.
Use your judgement to decide what to test — the PR description and changed files
should guide your testing strategy.

#### General Approach

1. Take a screenshot of the current state
2. Use `agent-browser snapshot -i` to discover interactive elements
3. Interact with elements (click, fill, drag, etc.)
4. Screenshot and verify the result
5. Verify state changes if relevant (via `agent-browser eval`)

#### Key Testing Points

- **UI renders correctly**: New components appear in the right place
- **Interactions work**: Toggles, inputs, buttons all function
- **State persistence**: Changes survive across page navigations
- **Theme compatibility**: Test in both light and dark modes
- **Layout modes**: If sidebar/layout is involved, test at different sizes
- **i18n**: Switch language and verify new strings appear correctly
- **Edge cases**: Boundary conditions, rapid toggling, empty states

### Phase 6: Cleanup

After testing:

1. **Kill all Cherry Studio processes** (graceful SIGTERM first):
   ```bash
   pkill -f "cherry-studio.*Electron" 2>/dev/null
   pkill -f "electron-vite" 2>/dev/null
   lsof -ti :9222 | xargs kill 2>/dev/null
   lsof -ti :5173 | xargs kill 2>/dev/null
   sleep 3
   lsof -ti :9222 | xargs kill -9 2>/dev/null
   lsof -ti :5173 | xargs kill -9 2>/dev/null
   ```

2. **Switch back to the default branch**:
   ```bash
   default_branch=$(git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's@^refs/remotes/origin/@@')
   git checkout "${default_branch:-main}"
   ```

### Phase 7: Test Report

Generate a structured report with screenshots. Save the report as
`/tmp/pr-<NUMBER>/report.md` alongside the screenshots.

```markdown
# PR #<NUMBER> 测试报告

**PR 标题**: <title>
**作者**: @<author>
**分支**: <branch>
**修改文件数**: <count>

## 静态分析

| 检查项 | 结果 | 说明 |
|--------|------|------|
| TypeScript 类型检查 | ✅/❌ | ... |
| 受阻文件检查 | ✅/⚠️ | ... |
| console.log 使用 | ✅/❌ | ... |

## UI 测试

### <Test Case Name>
<description of what was tested and the result>
![screenshot](<filename>.png)

## 发现的问题
(if any)

## 结论
- 问题总数:N
- 建议:APPROVE / REQUEST_CHANGES / COMMENT
```

If the user requests, copy the report directory to a more accessible location
(e.g., Desktop) for sharing.

## Troubleshooting

### Port 9222 not listening after startup

The `pnpm debug` script passes `--remote-debugging-port=9222` to Electron.
If not working:
- Check logs: `tail -50 /tmp/cherry-debug.log`
- Kill by port: `lsof -ti :9222 | xargs kill -9`
- Verify electron-vite is running: `ps aux | grep electron-vite`

### agent-browser connect fails

Use direct websocket URL:
```bash
WS_URL=$(grep "DevTools listening" /tmp/cherry-debug.log | grep 9222 | sed 's/.*\(ws:\/\/[^ ]*\)/\1/')
agent-browser --cdp "$WS_URL" tab
```

### agent-browser target jumps to wrong page

Electron apps have multiple CDP targets (main window + webviews for mini-apps).
If `agent-browser` connects to a webview instead of the main page:
```bash
# List all targets
agent-browser tab
# Switch to the main page (usually tab 0, URL contains localhost:5173)
agent-browser tab 0
```
After opening/closing mini-apps, always verify you're on the right target
with `agent-browser tab`.

### V2 Data Migration Wizard

On the v2 branch, the app may show a data migration wizard on first launch.
This is **not a bug** — it's expected when dev data hasn't been migrated yet.
Click through the wizard steps, then restart the app manually (kill + relaunch).
The wizard only appears once; subsequent launches go straight to the main UI.

### App stuck on splash screen

Wait longer (up to 30s on first launch). The app needs to:
- Build and serve renderer via Vite dev server (port 5173)
- Run database migrations
- Initialize services (MCP, etc.)

### Empty CDP target list

After connecting, if `agent-browser tab` shows only `about:blank`:
```bash
agent-browser navigate http://localhost:5173
sleep 10
agent-browser tab
```

More from CherryHQ/cherry-studio

SkillDescription
cherry-assistant-guideCherry Studio 产品知识库、源码路径索引、故障排查和页面导航。当用户询问 Cherry Studio 的功能、配置、报错、使用方法时触发。也适用于用户提到 provider、模型、知识库、Agent、MCP、OpenClaw、PDF、快捷短语等关键词的场景。
create-skillCreate a new skill in the current repository. Use when the user wants to create/add a new skill, or mentions creating a skill from scratch. This skill follows the workflow defined in .agents/skills/README.md and helps scaffold, validate, and sync new skills.
demand-first-reviewUse when reviewing a PR, API, IPC channel, endpoint, parameter, type, config, or architectural extension point that adds or expands shared surface area, especially when consumers are absent, exports are unused or speculative, existing consumers are hack-heavy, forward compatibility is claimed, or multiple similar APIs may express one demand.
faq-collector将成功解决的用户问题收录到 FAQ 知识库。问题解决后自动判断是否收录。也可以在用户说"收录到 FAQ"、"记录这个问题"、"add to FAQ"时手动触发。
find-skillsHelps users discover and install agent skills when they ask questions like "how do I do X", "find a skill for X", "is there a skill that can...", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill.
gh-create-issueUse when user wants to create a GitHub issue for the current repository. Must read and follow the repository's issue template format.
gh-create-prCreate or update GitHub pull requests using the repository-required workflow and template compliance. Use when asked to create/open/update a PR so the assistant reads `.github/pull_request_template.md`, fills every template section, preserves markdown structure exactly, and marks missing data as N/A or None instead of skipping sections.
gh-pr-reviewAutomated Cherry Studio review for local branches, PRs, commits, files, architecture docs, and repository skills. Use for code or documentation reviews that need project-specific naming, main/renderer/shared placement and dependency rules, IpcApi and DataApi boundaries, lifecycle/service ownership, renderer hooks, React/UI conventions, and tests. Supports single-agent review with interactive fix selection or multi-agent reviewer-verifier review with risk-based auto-fix. To diagnose gaps in the skill after a review session, run `/gh-pr-review diag`.
issue-reporter帮助用户提交 Bug Report 或 Feature Request。支持 GitHub Issue(有账户)和本地存档(无账户)两种模式。当诊断发现是代码 Bug 时主动提议,或当用户说"帮我提 issue"、"这是个 bug"、"我想要这个功能"、"submit a bug"、"feature request"时触发。
prepare-releasePrepare a new release by collecting commits, generating bilingual release notes, updating version files, and creating a release branch with PR. Use when asked to prepare/create a release, bump version, or run `/prepare-release`.