| name | cherry-pick-pro |
| description | Cherry-pick commits from chatbox-pro repo to the open chatbox repo, handling mobile-only files, package name differences, and other repo-specific exclusions. |
| user_invocable | true |
| read_when | ["Cherry-picking from pro to open repo","Syncing pro commits to open source repo","Releasing open source version"] |
Cherry Pick Pro
Cherry-pick commits from the chatbox-pro repo (pro remote) to the open chatbox repo, filtering out mobile-only changes and adjusting for repo differences.
Usage
/cherry-pick-pro [from_commit] [to_commit]
from_commit: (optional) A pro/main commit hash to start from (exclusive). Must be a commit on pro/main, not an open-repo commit — see step 2. Defaults to auto-detecting the last synced pro commit.
to_commit: (optional) The commit hash to end at (inclusive). Defaults to pro/main HEAD.
Workflow
1. Sync remotes first
git fetch pro
git fetch origin
⚠️ Tag pollution: git fetch pro also fetches pro's tags (e.g. vX.Y.Z created on pro's release branch). These local tags point at pro commits, not open repo commits. Never push them as-is — see step 8.
2. Identify commits to cherry-pick
⚠️ The range bound must be a pro/main commit. The open repo and pro/main share no history (cherry-picks create new SHAs), so an open-repo commit hash as the lower bound makes A..pro/main return all of pro's history, not the increment.
Find the last synced pro commit by reading the cherry picked from pro commit <hash> footer that step 5 writes into each open-repo commit, then list pro commits after it:
last=$(git log --grep="cherry picked from pro commit" -1 --pretty=%B HEAD \
| grep -oE 'pro commit [0-9a-f]+' | awk '{print $3}')
git log "$last"..pro/main --oneline --reverse
If no footer is found (first-ever sync), pass from_commit explicitly.
3. Analyze each commit
For each commit, check the files it touches:
git diff-tree --no-commit-id --name-only -r <commit>
4. Cherry-pick rules
Files/directories to SKIP (delete if conflict):
android/ - mobile-only, not in open repo
ios/ - mobile-only, not in open repo
capacitor.config.ts - mobile config
.github/ - open repo has no CI; workflow/config differs (see step 8)
CLAUDE.md, AGENTS.md - pro-specific AI config
.cursorrules - pro-specific
.claude/ - pro-specific skills/config (including this skill itself), never sync to open repo
Package name differences:
- Pro uses:
xyz.chatboxapp.app
- Open uses:
xyz.chatboxapp.ce
- When resolving conflicts in
package.json or release/app/package.json, always keep the open repo name (xyz.chatboxapp.ce)
Pro-only dependencies to remove if added:
@playwright/test - pro testing only
playwright - pro testing only
@ruguoapp/jk-analytics - pro analytics only
pnpm-lock.yaml:
- Will almost always conflict. Accept either side, then run
pnpm install --no-frozen-lockfile at the end to regenerate.
5. Cherry-pick process
For each commit:
- Try
git cherry-pick <hash> directly first
- If conflicts occur, use
--no-commit and resolve:
- Remove mobile-only files with
git rm
- Fix package name conflicts (keep
ce)
- Remove pro-only dependencies
- Accept either side for
pnpm-lock.yaml
- Commit with original message +
(cherry picked from pro commit <hash>) note
6. Finalize
After all cherry-picks:
pnpm install --no-frozen-lockfile
git add pnpm-lock.yaml
git commit -m "chore: regenerate pnpm-lock.yaml for open repo"
7. Verify
git log --oneline <start>..HEAD
pnpm install
8. Release (if syncing a version release)
The open repo has no CI workflows — releases are manual:
- Push the sync branch to
origin/main
- Re-create the version tag on the open repo's commit. The local tag fetched from pro points at a pro commit — pushing it would leak pro's commit history into the open repo:
git tag -d vX.Y.Z
git tag vX.Y.Z <open-repo-head>
git push origin vX.Y.Z
- Create the GitHub Release manually (no binary assets; notes = changelog + install links, copy format from the previous release):
gh release view vX.Y.(Z-1) --json body --jq '.body'
gh release create vX.Y.Z --title "vX.Y.Z" --latest --notes "..."
Version bump convention: only release/app/package.json gets the new version; root package.json stays 0.0.1 in the open repo.
Example
/cherry-pick-pro
This will auto-detect the last release on the current branch and cherry-pick all newer commits from pro/main.