cherrypick-interactive 1.13.3 โ†’ 1.13.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/README.md +33 -446
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -22,30 +22,6 @@ No manual `git log` diffing. No risky merges. No guesswork.
22
22
 
23
23
  ---
24
24
 
25
- ## ๐Ÿงญ What it does
26
-
27
- - ๐Ÿ” Finds commits in `dev` not present in `main`
28
- - ๐Ÿ—‚๏ธ Lets you select which commits to cherry-pick (or pick all)
29
- - ๐Ÿชœ Cherry-picks in the correct order (oldest โ†’ newest)
30
- - โš”๏ธ **Interactive conflict resolution wizard** with multiple strategies
31
- - ๐ŸŽฏ **Preserves exact commit messages** from squashed commits
32
- - ๐Ÿช„ Detects **semantic version bump** (`major`, `minor`, `patch`) from conventional commits
33
- - ๐Ÿงฉ Creates a `release/x.y.z` branch from `main`
34
- - ๐Ÿงพ Generates a Markdown changelog from commits
35
- - ๐Ÿ”— Links ticket IDs to your issue tracker (ClickUp, Jira, Linear, or custom)
36
- - ๐Ÿ–ฅ๏ธ Rich **TUI dashboard** with diff preview, search, and keyboard shortcuts
37
- - ๐Ÿค– **CI mode** for fully non-interactive pipeline execution
38
- - โ†ฉ๏ธ **Undo / rollback** with checkpoint-based session recovery
39
- - ๐Ÿ“‹ **Changelog preview** before cherry-pick with confirmation gate
40
- - โš ๏ธ **Dependency detection** warns when selected commits depend on unselected ones
41
- - ๐Ÿ’พ **Profiles** to save and reuse CLI flag combinations
42
- - ๐Ÿงฐ Optionally:
43
- - updates `package.json` version
44
- - commits and pushes it
45
- - opens a **GitHub PR** (draft or normal)
46
-
47
- ---
48
-
49
25
  ## ๐Ÿ“ฆ Installation
50
26
 
51
27
  ```bash
@@ -58,342 +34,47 @@ npm install -g cherrypick-interactive
58
34
 
59
35
  ## ๐Ÿš€ Quick Start
60
36
 
61
- ```bash
62
- cherrypick-interactive \
63
- --semantic-versioning \
64
- --version-file ./package.json \
65
- --create-release \
66
- --push-release \
67
- --draft-pr
68
- ```
69
-
70
- โœ… This will:
71
- 1. Fetch `origin/dev` and `origin/main`
72
- 2. List commits in `dev` missing from `main`
73
- 3. Let you select which to cherry-pick (TUI dashboard with diff preview)
74
- 4. Detect potential dependencies between commits
75
- 5. Show a changelog preview with version bump info
76
- 6. Compute the next version from commit messages
77
- 7. Create `release/<next-version>` from `main`
78
- 8. Cherry-pick the selected commits (with conflict resolution if needed)
79
- 9. Update your `package.json` version and commit it
80
- 10. Push the branch and open a **draft PR** on GitHub
81
-
82
- ---
83
-
84
- ## ๐Ÿงฉ Common Use Cases
85
-
86
- ### 1. Compare branches manually
87
-
88
37
  ```bash
89
38
  cherrypick-interactive
90
39
  ```
91
40
 
92
- Lists commits in `origin/dev` that aren't in `origin/main`, filtered by the last week.
93
-
94
- ### 2. Cherry-pick all missing commits automatically
95
-
96
- ```bash
97
- cherrypick-interactive --all-yes
98
- ```
99
-
100
- ### 3. Preview changes without applying them
101
-
102
- ```bash
103
- cherrypick-interactive --dry-run
104
- ```
105
-
106
- ### 4. Filter commits by pattern
107
-
108
- ```bash
109
- cherrypick-interactive --ignore-commits "^chore\(deps\)|^ci:"
110
- ```
111
-
112
- Excludes commits starting with `chore(deps)` or `ci:` from the selection list.
113
-
114
- ### 5. Ignore certain commits from semantic versioning
115
-
116
- ```bash
117
- cherrypick-interactive --ignore-semver "bump|dependencies"
118
- ```
119
-
120
- Treats commits containing "bump" or "dependencies" as chores (no version bump).
121
-
122
- ### 6. Use a saved profile
123
-
124
- ```bash
125
- # Save your flags once
126
- cherrypick-interactive --save-profile hotfix --dev origin/develop --main origin/release --since "2 weeks ago"
127
-
128
- # Reuse anytime
129
- cherrypick-interactive --profile hotfix
130
- ```
131
-
132
- ### 7. Run in CI/CD pipeline
133
-
134
- ```bash
135
- cherrypick-interactive --ci --conflict-strategy theirs --format json > result.json
136
- ```
137
-
138
- ### 8. Link ticket IDs in changelog
139
-
140
- ```bash
141
- cherrypick-interactive --tracker clickup --tracker-url "https://app.clickup.com/t/{{id}}"
142
- ```
143
-
144
- ### 9. Undo the last cherry-pick session
145
-
146
- ```bash
147
- cherrypick-interactive --undo
148
- ```
149
-
150
- ---
151
-
152
- ## โš™๏ธ Options
153
-
154
- ### Cherry-pick options
155
-
156
- | Flag | Description | Default |
157
- |------|--------------|----------|
158
- | `--dev` | Source branch (commits to copy) | `origin/dev` |
159
- | `--main` | Target branch (commits already merged here will be skipped) | `origin/main` |
160
- | `--since` | Git time window filter (e.g. `"2 weeks ago"`) | `1 week ago` |
161
- | `--no-fetch` | Skip `git fetch --prune` | `false` |
162
- | `--all-yes` | Cherry-pick all missing commits without prompt | `false` |
163
- | `--ignore-commits` | Comma-separated regex patterns to exclude commits | โ€” |
164
-
165
- ### Version options
166
-
167
- | Flag | Description | Default |
168
- |------|--------------|----------|
169
- | `--semantic-versioning` | Detect semantic version bump from commits | `true` |
170
- | `--current-version` | Current version (if not reading from file) | โ€” |
171
- | `--version-file` | Path to `package.json` (to read & update version) | `./package.json` |
172
- | `--version-commit-message` | Template for version bump commit | `chore(release): bump version to {{version}}` |
173
- | `--ignore-semver` | Comma-separated regex patterns to ignore for semver | โ€” |
174
-
175
- ### Release options
176
-
177
- | Flag | Description | Default |
178
- |------|--------------|----------|
179
- | `--create-release` | Create `release/x.y.z` branch from `main` | `true` |
180
- | `--push-release` | Push release branch to origin | `true` |
181
- | `--draft-pr` | Create the GitHub PR as a draft | `false` |
182
-
183
- ### CI options
184
-
185
- | Flag | Description | Default |
186
- |------|--------------|----------|
187
- | `--ci` | Enable fully non-interactive mode | `false` |
188
- | `--conflict-strategy` | How to handle conflicts: `fail`, `ours`, `theirs`, `skip` | `fail` |
189
- | `--format` | Output format: `text` or `json` | `text` |
190
- | `--dependency-strategy` | How to handle dependencies: `warn`, `fail`, `ignore` | `warn` |
191
-
192
- ### Tracker options
193
-
194
- | Flag | Description | Default |
195
- |------|--------------|----------|
196
- | `--tracker` | Built-in preset: `clickup`, `jira`, `linear` | โ€” |
197
- | `--ticket-pattern` | Custom regex to capture ticket ID (one capture group) | โ€” |
198
- | `--tracker-url` | URL template with `{{id}}` placeholder | โ€” |
199
-
200
- ### Profile options
201
-
202
- | Flag | Description | Default |
203
- |------|--------------|----------|
204
- | `--profile` | Load a named profile from `.cherrypickrc.json` | โ€” |
205
- | `--save-profile` | Save current CLI flags as a named profile | โ€” |
206
- | `--list-profiles` | List available profiles and exit | `false` |
207
-
208
- ### Session options
209
-
210
- | Flag | Description | Default |
211
- |------|--------------|----------|
212
- | `--undo` | Reset release branch to pre-cherry-pick state | `false` |
213
-
214
- ### UI options
215
-
216
- | Flag | Description | Default |
217
- |------|--------------|----------|
218
- | `--no-tui` | Disable TUI dashboard, use simple checkbox instead | `false` |
219
- | `--dry-run` | Show what would happen without applying changes | `false` |
220
-
221
- ---
222
-
223
- ## ๐Ÿง  How Semantic Versioning Works
224
-
225
- The tool analyzes commit messages using **Conventional Commits**:
226
-
227
- | Prefix | Example | Bump |
228
- |---------|----------|------|
229
- | `BREAKING CHANGE:` | `feat(auth): BREAKING CHANGE: require MFA` | **major** |
230
- | `feat:` | `feat(ui): add dark mode` | **minor** |
231
- | `fix:` / `perf:` | `fix(api): correct pagination offset` | **patch** |
232
-
233
- Use `--ignore-semver` to treat certain commits as chores:
234
-
235
- ```bash
236
- cherrypick-interactive --ignore-semver "^chore\(deps\)|bump|merge"
237
- ```
238
-
239
- ---
240
-
241
- ## โš”๏ธ Interactive Conflict Resolution
242
-
243
- When cherry-picking encounters conflicts, the tool provides an **interactive wizard**:
244
-
245
- ### Conflict Resolution Options:
246
-
247
- **Per-file resolution:**
248
- - **Use ours** โ€” Keep the current branch's version
249
- - **Use theirs** โ€” Accept the cherry-picked commit's version
250
- - **Open in editor** โ€” Manually resolve conflicts in your editor
251
- - **Show diff** โ€” View the conflicting changes
252
- - **Mark resolved** โ€” Stage the file as-is
253
-
254
- **Bulk actions:**
255
- - **Use ours for ALL** โ€” Apply current branch's version to all conflicts
256
- - **Use theirs for ALL** โ€” Accept cherry-picked version for all conflicts
257
- - **Stage ALL** โ€” Mark all files as resolved
258
- - **Launch mergetool** โ€” Use Git's configured merge tool
259
-
260
- In CI mode, `--conflict-strategy` handles conflicts automatically (`ours`, `theirs`, `skip`, or `fail`).
261
-
262
- ---
263
-
264
- ## ๐Ÿ–ฅ๏ธ TUI Dashboard
265
-
266
- The commit selection screen features a rich terminal UI:
267
-
268
- - **Arrow keys / j/k** โ€” Navigate commits
269
- - **Space** โ€” Toggle selection
270
- - **a / n** โ€” Select all / deselect all
271
- - **/** โ€” Search/filter commits by message
272
- - **d** โ€” Full diff overlay (Esc to return)
273
- - **p** โ€” Toggle preview pane
274
- - **Enter** โ€” Confirm selection
275
- - **q** โ€” Quit (with confirmation if commits are selected)
276
-
277
- Each commit shows its hash, subject, and relative date. Selected commits are highlighted in green.
278
-
279
- Falls back to simple `inquirer` checkbox on: Windows, small terminals, CI, or with `--no-tui`.
280
-
281
- ---
282
-
283
- ## ๐Ÿ’พ Profiles
284
-
285
- Save and reuse CLI flag combinations:
286
-
287
- ```bash
288
- # Save
289
- cherrypick-interactive --save-profile hotfix --dev origin/develop --main origin/release --since "2 weeks ago"
290
-
291
- # Use
292
- cherrypick-interactive --profile hotfix
293
-
294
- # Override a single flag
295
- cherrypick-interactive --profile hotfix --since "3 days ago"
296
-
297
- # List all profiles
298
- cherrypick-interactive --list-profiles
299
- ```
300
-
301
- Config stored in `.cherrypickrc.json`:
302
-
303
- ```json
304
- {
305
- "profiles": {
306
- "hotfix": {
307
- "dev": "origin/develop",
308
- "main": "origin/release",
309
- "since": "2 weeks ago"
310
- }
311
- },
312
- "tracker": {
313
- "ticket-pattern": "#([a-z0-9]+)",
314
- "tracker-url": "https://app.clickup.com/t/{{id}}"
315
- }
316
- }
317
- ```
318
-
319
- ---
320
-
321
- ## ๐Ÿ”— Tracker Integration
322
-
323
- Link ticket IDs in your changelog to your issue tracker:
41
+ That's it. Compares `origin/dev` vs `origin/main` for the last week and lets you pick interactively.
324
42
 
325
- ```bash
326
- # Built-in presets
327
- cherrypick-interactive --tracker clickup --tracker-url "https://app.clickup.com/t/{{id}}"
328
- cherrypick-interactive --tracker jira --tracker-url "https://team.atlassian.net/browse/{{id}}"
329
- cherrypick-interactive --tracker linear --tracker-url "https://linear.app/my-team/issue/{{id}}"
330
-
331
- # Custom pattern
332
- cherrypick-interactive --ticket-pattern "#([a-z0-9]+)" --tracker-url "https://app.clickup.com/t/{{id}}"
333
- ```
334
-
335
- Commit `#86c8w62wx - Fix login bug` becomes `[#86c8w62wx](https://app.clickup.com/t/86c8w62wx) - Fix login bug` in the changelog.
43
+ For a full release workflow, see the [Quick Start guide](docs/quick-start.md).
336
44
 
337
45
  ---
338
46
 
339
- ## ๐Ÿค– CI Mode
340
-
341
- Run fully non-interactive in CI/CD pipelines:
342
-
343
- ```bash
344
- cherrypick-interactive --ci --conflict-strategy theirs --format json > result.json
345
- ```
346
-
347
- **Exit codes:**
348
-
349
- | Code | Meaning |
350
- |------|---------|
351
- | `0` | Success |
352
- | `1` | Conflict (with `--conflict-strategy fail`) |
353
- | `2` | No commits found |
354
- | `3` | Auth / push error |
355
- | `4` | Dependency issue (with `--dependency-strategy fail`) |
356
-
357
- **JSON output** goes to stdout, all logs go to stderr. Colors auto-disabled in JSON mode.
358
-
359
- ---
360
-
361
- ## โ†ฉ๏ธ Undo / Rollback
362
-
363
- Made a mistake? Roll back the entire cherry-pick session:
364
-
365
- ```bash
366
- cherrypick-interactive --undo
367
- ```
47
+ ## ๐Ÿงญ What it does
368
48
 
369
- - Checkpoint saved automatically before each session
370
- - Validates branch integrity before reset (ancestor check + divergence detection)
371
- - Uses `--force-with-lease` (not `--force`)
372
- - Option to re-open commit selection after undo
49
+ - ๐Ÿ” Finds commits in `dev` not present in `main`
50
+ - ๐Ÿ—‚๏ธ Lets you select which commits to cherry-pick (or pick all)
51
+ - ๐Ÿชœ Cherry-picks in the correct order (oldest โ†’ newest)
52
+ - โš”๏ธ [**Interactive conflict resolution wizard**](docs/conflict-resolution.md)
53
+ - ๐ŸŽฏ **Preserves exact commit messages** from squashed commits
54
+ - ๐Ÿช„ Detects [**semantic version bump**](docs/semantic-versioning.md) from conventional commits
55
+ - ๐Ÿงฉ Creates a `release/x.y.z` branch from `main`
56
+ - ๐Ÿงพ Generates a Markdown changelog with [**ticket linking**](docs/tracker-integration.md)
57
+ - ๐Ÿ–ฅ๏ธ Rich [**TUI dashboard**](docs/tui-dashboard.md) with diff preview, search, and keyboard shortcuts
58
+ - ๐Ÿค– [**CI mode**](docs/ci-mode.md) for fully non-interactive pipeline execution
59
+ - โ†ฉ๏ธ [**Undo / rollback**](docs/undo-rollback.md) with checkpoint-based session recovery
60
+ - ๐Ÿ’พ [**Profiles**](docs/profiles.md) to save and reuse CLI flag combinations
373
61
 
374
62
  ---
375
63
 
376
- ## ๐Ÿงน Why This Helps
64
+ ## ๐Ÿ“– Documentation
377
65
 
378
- If your team:
379
- - Rebases or cherry-picks from `dev` โ†’ `main`
380
- - Uses temporary release branches
381
- - Works with squashed commits
382
- - Needs to handle merge conflicts gracefully
383
- - Tracks semantic versions via commits
384
-
385
- โ€ฆthis CLI saves time and reduces errors.
386
- It automates a tedious, error-prone manual process into a single command that behaves like `yarn upgrade-interactive`, but for Git commits.
387
-
388
- **Special features:**
389
- - โœ… Preserves exact commit messages (critical for squashed commits)
390
- - โœ… Interactive conflict resolution without leaving the terminal
391
- - โœ… Smart pattern-based filtering for commits and version detection
392
- - โœ… Automatic changelog generation with ticket linking
393
- - โœ… TUI dashboard with diff preview and keyboard shortcuts
394
- - โœ… CI mode with structured JSON output and distinct exit codes
395
- - โœ… Undo/rollback with safety checks
396
- - โœ… Reusable profiles for common workflows
66
+ | Topic | Description |
67
+ |-------|-------------|
68
+ | [๐Ÿš€ Quick Start](docs/quick-start.md) | Getting started, full workflow, custom branches |
69
+ | [๐Ÿงฉ Common Use Cases](docs/common-use-cases.md) | Filtering, profiles, CI, tracker, undo, and more |
70
+ | [โš™๏ธ All Options](docs/options.md) | Complete reference for all CLI flags |
71
+ | [โš”๏ธ Conflict Resolution](docs/conflict-resolution.md) | Per-file and bulk resolution, CI strategies |
72
+ | [๐Ÿง  Semantic Versioning](docs/semantic-versioning.md) | Conventional commits, version sources, ignore patterns |
73
+ | [๐Ÿ–ฅ๏ธ TUI Dashboard](docs/tui-dashboard.md) | Keyboard shortcuts, diff preview, search, fallback |
74
+ | [๐Ÿ’พ Profiles](docs/profiles.md) | Save/load/list profiles, config file, CI usage |
75
+ | [๐Ÿ”— Tracker Integration](docs/tracker-integration.md) | ClickUp, Jira, Linear presets, custom patterns |
76
+ | [๐Ÿค– CI Mode](docs/ci-mode.md) | Exit codes, JSON output, GitHub Actions example |
77
+ | [โ†ฉ๏ธ Undo / Rollback](docs/undo-rollback.md) | Checkpoint system, safety checks, limitations |
397
78
 
398
79
  ---
399
80
 
@@ -402,59 +83,6 @@ It automates a tedious, error-prone manual process into a single command that be
402
83
  - Node.js โ‰ฅ 20
403
84
  - Git โ‰ฅ 2.0
404
85
  - **GitHub CLI (`gh`)** โ€” *Optional, only required if using `--push-release`*
405
- - Install from: https://cli.github.com/
406
- - The tool will check if `gh` is installed and offer to continue without it
407
- - A clean working directory (no uncommitted changes)
408
-
409
- ---
410
-
411
- ## ๐ŸŽฏ Best Practices
412
-
413
- ### 1. Use `--ignore-commits` to filter noise
414
-
415
- ```bash
416
- cherrypick-interactive --ignore-commits "^ci:|^chore\(deps\):|Merge branch"
417
- ```
418
-
419
- Exclude CI updates, dependency bumps, and merge commits from selection.
420
-
421
- ### 2. Use `--ignore-semver` for version accuracy
422
-
423
- ```bash
424
- cherrypick-interactive --ignore-semver "bump|dependencies|merge"
425
- ```
426
-
427
- Prevent certain commits from affecting semantic version calculation.
428
-
429
- ### 3. Always use `--draft-pr` for review
430
-
431
- ```bash
432
- cherrypick-interactive --draft-pr
433
- ```
434
-
435
- Creates draft PRs so your team can review before merging.
436
-
437
- ### 4. Test with `--dry-run` first
438
-
439
- ```bash
440
- cherrypick-interactive --dry-run
441
- ```
442
-
443
- See what would happen without making any changes.
444
-
445
- ### 5. Save your workflow as a profile
446
-
447
- ```bash
448
- cherrypick-interactive --save-profile release --dev origin/dev --main origin/main --since "1 month ago" --draft-pr
449
- ```
450
-
451
- Then just run `cherrypick-interactive --profile release` every time.
452
-
453
- ---
454
-
455
- ## ๐Ÿงพ License
456
-
457
- **MIT** โ€” free to use, modify, and distribute.
458
86
 
459
87
  ---
460
88
 
@@ -462,56 +90,15 @@ Then just run `cherrypick-interactive --profile release` every time.
462
90
 
463
91
  1. Clone the repo
464
92
  2. Install dependencies: `yarn install`
465
- 3. Run locally:
466
- ```bash
467
- node cli.js --dry-run
468
- ```
469
- 4. Run tests:
470
- ```bash
471
- yarn test
472
- ```
473
- 5. Test edge cases before submitting PRs:
474
- - Squashed commits with conflicts
475
- - Empty cherry-picks
476
- - Multiple conflict resolutions
477
- 6. Please follow Conventional Commits for your changes.
93
+ 3. Run locally: `node cli.js --dry-run`
94
+ 4. Run tests: `yarn test`
95
+ 5. Follow Conventional Commits for your changes.
478
96
 
479
97
  ---
480
98
 
481
- ## ๐Ÿ› Troubleshooting
482
-
483
- ### "GitHub CLI (gh) is not installed"
484
- The tool automatically checks for `gh` CLI when using `--push-release`. If not found, you'll be prompted to:
485
- - Install it from https://cli.github.com/ and try again
486
- - Or continue without creating a PR (the release branch will still be pushed)
487
-
488
- You can also run without `--push-release` to skip PR creation entirely:
489
- ```bash
490
- cherrypick-interactive --create-release --no-push-release
491
- ```
492
-
493
- ### "Cherry-pick has conflicts"
494
- Use the interactive wizard to resolve conflicts file-by-file or in bulk. In CI, use `--conflict-strategy`.
495
-
496
- ### "Commit message changed after conflict resolution"
497
- This issue has been fixed! The tool now preserves the original commit message using `git commit -C <hash>`.
498
-
499
- ### "Version not detected correctly"
500
- Use `--ignore-semver` to exclude commits that shouldn't affect versioning:
501
- ```bash
502
- cherrypick-interactive --ignore-semver "bump|chore\(deps\)"
503
- ```
504
-
505
- ### "Too many commits to review"
506
- Use `--ignore-commits` to filter out noise, or adjust `--since` to a shorter time window:
507
- ```bash
508
- cherrypick-interactive --since "3 days ago" --ignore-commits "^ci:|^docs:"
509
- ```
99
+ ## ๐Ÿงพ License
510
100
 
511
- ### "Want to undo a cherry-pick session"
512
- ```bash
513
- cherrypick-interactive --undo
514
- ```
101
+ **MIT** โ€” free to use, modify, and distribute.
515
102
 
516
103
  ---
517
104
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cherrypick-interactive",
3
- "version": "1.13.3",
3
+ "version": "1.13.5",
4
4
  "description": "Interactively cherry-pick commits that are in dev but not in main, using subject-based comparison.",
5
5
  "main": "cli.js",
6
6
  "bin": "cli.js",