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) Apro/maincommit hash to start from (exclusive). Must be a commit onpro/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 topro/mainHEAD.
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 synced pro commit (the lower bound)
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 # commits to pick
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 repoios/- mobile-only, not in open repocapacitor.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.jsonorrelease/app/package.json, always keep the open repo name (xyz.chatboxapp.ce)
Pro-only dependencies to remove if added:
@playwright/test- pro testing onlyplaywright- 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-lockfileat the end to regenerate.
5. Cherry-pick process
For each commit:
- Try
git cherry-pick <hash>directly first - If conflicts occur, use
--no-commitand 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
- Remove mobile-only files with
- Commit with original message +
(cherry picked from pro commit <hash>)note
6. Finalize
After all cherry-picks:
pnpm install --no-frozen-lockfile # regenerate lockfile
git add pnpm-lock.yaml
git commit -m "chore: regenerate pnpm-lock.yaml for open repo"
7. Verify
git log --oneline <start>..HEAD # review all new commits
pnpm install # ensure deps resolve
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 # delete pro's tag fetched in step 1 git tag vX.Y.Z <open-repo-head> # re-create on open repo commit 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' # get template 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.