gitbasher 4.1.0 → 5.0.1

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 (4) hide show
  1. package/CHANGELOG.md +101 -0
  2. package/README.md +111 -37
  3. package/dist/gitb +2856 -843
  4. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -2,6 +2,107 @@
2
2
 
3
3
  All notable changes to gitbasher are generated automatically by [semantic-release](https://github.com/semantic-release/semantic-release) from [Conventional Commits](https://www.conventionalcommits.org/) on `main`. The project follows [Semantic Versioning](https://semver.org/).
4
4
 
5
+ ## [5.0.1](https://github.com/maxbolgarin/gitbasher/compare/v5.0.0...v5.0.1) (2026-07-03)
6
+
7
+ ### 🐛 Bug Fixes
8
+
9
+ * **base:** render embedded colors in the main help instead of literal escapes ([95ffbc6](https://github.com/maxbolgarin/gitbasher/commit/95ffbc62fab836ea97f9de2bd3c542b5ae659f9a))
10
+ * **push:** widen the transfer quiet window so ordinary pushes stay silent ([fcccb6b](https://github.com/maxbolgarin/gitbasher/commit/fcccb6b8cd941c9e721d9c392d45f351ca4aa924))
11
+
12
+ ### 🛠 Build System
13
+
14
+ * **deps:** pin conventional-changelog-conventionalcommits to v8 ([b9163f8](https://github.com/maxbolgarin/gitbasher/commit/b9163f8c859e1cb35bbb08a57ce69a374005d3ea))
15
+
16
+ ## [5.0.0](https://github.com/maxbolgarin/gitbasher/compare/v4.1.0...v5.0.0) (2026-07-03)
17
+
18
+ ### ⚠ BREAKING CHANGES
19
+
20
+ * unknown commands and unknown modes now exit non-zero
21
+ (previously 0). Destructive prompts (force-delete, drop, remove, undo,
22
+ reset, delete-all, accept-theirs/ours, squash apply) require an
23
+ explicit "y": Enter declines and closed stdin aborts instead of
24
+ auto-confirming. Piped or redirected `gitb log` prints the plain log
25
+ instead of interactive browser pages, and all output is uncolored when
26
+ stdout is not a terminal (NO_COLOR is honored). jq is required for AI
27
+ features. Path inputs containing control characters are rejected
28
+ instead of silently rewritten, and `../` in worktree/clone paths is
29
+ honored instead of stripped.
30
+
31
+ ### 🚀 Features
32
+
33
+ * **log:** add ai mode summarizing commit ranges ([469d7c1](https://github.com/maxbolgarin/gitbasher/commit/469d7c16274e31bab9959c3802f12847871a41aa))
34
+ * **completion:** add all, dump and ai modes to log completion ([e7435e3](https://github.com/maxbolgarin/gitbasher/commit/e7435e3b37b656ea87b22afff4c6fa5871192ec8))
35
+ * **log:** add commit list renderer with decorations, truncation and unpushed markers ([783cb8e](https://github.com/maxbolgarin/gitbasher/commit/783cb8e15291669a0d41f01b13092f9978e9501d))
36
+ * add diff command and AI-powered feature grouping for commits ([c725be6](https://github.com/maxbolgarin/gitbasher/commit/c725be642515e58045e38896535fa7a979a0c8e3))
37
+ * **ai:** add ollama host configuration, model id validation, and provider smoke check functionality ([b7c4e20](https://github.com/maxbolgarin/gitbasher/commit/b7c4e2085268eda01aa8cbc7a3d6c795ef2b8c79))
38
+ * **merge:** add push modifier to merge command for automatic post-merge pushing ([ceb38c6](https://github.com/maxbolgarin/gitbasher/commit/ceb38c6fd798c5335598fdf7f2cbba3cdf7ef9d1))
39
+ * **rebase:** add push modifier to rebase command for post-rebase force-pushing ([1a4fa38](https://github.com/maxbolgarin/gitbasher/commit/1a4fa38662806fa6b936e78b248db031799f1a11))
40
+ * **completion:** add push options to merge and rebase commands ([37d6df5](https://github.com/maxbolgarin/gitbasher/commit/37d6df5d33f587513d30037e9ffcab86c0f9e38c))
41
+ * **fetch:** add top-level fetch command with prune mode ([7f981ef](https://github.com/maxbolgarin/gitbasher/commit/7f981ef77ca5a9cc9bfe7b567b8ed60972130139))
42
+ * **log:** make an interactive commit browser the default log view ([c033bac](https://github.com/maxbolgarin/gitbasher/commit/c033bac2c29d2994228eb60997136fc87000782b))
43
+ * **branch:** offer to push new branches to the remote ([e74cfdb](https://github.com/maxbolgarin/gitbasher/commit/e74cfdb86c952b1cea66ca395601227ae62552e8))
44
+ * **commit:** order split commits by scope dependency ([96f7518](https://github.com/maxbolgarin/gitbasher/commit/96f7518d9af2a9451fd11cb11be8db655f78fe88))
45
+ * reliability overhaul - safe prompts, honest exit codes, true bash 3.2 support ([645970f](https://github.com/maxbolgarin/gitbasher/commit/645970fdc75bb7a8a6d917d1653c0a977ad2572e))
46
+ * **status:** show upstream, stash, in-progress state and grouped changes ([e3f23b3](https://github.com/maxbolgarin/gitbasher/commit/e3f23b33e73b051db7eaaf647870e363a5d12dd9))
47
+ * **push:** stream live progress and warn before large pushes ([a1f3f33](https://github.com/maxbolgarin/gitbasher/commit/a1f3f33a0074badd07633a1ed61338bdc31724e9))
48
+ * **log:** support smart positional arguments (count, path, ref, message search) ([be9f1ee](https://github.com/maxbolgarin/gitbasher/commit/be9f1eed3e3efa64bdd60c6b446b1fdc476e75fc))
49
+
50
+ ### 🐛 Bug Fixes
51
+
52
+ * **common:** assemble multi-byte keys correctly under bash 3.2 ([0b65802](https://github.com/maxbolgarin/gitbasher/commit/0b65802130da7335b98fb4c8752c570564827472))
53
+ * **branch:** exact-name list filtering and plumbing-based cleanup parsers ([9c6b2b0](https://github.com/maxbolgarin/gitbasher/commit/9c6b2b05f039f9b4d6d8a3f17867805fe754e361))
54
+ * **common:** exit non-zero on error paths instead of status 0 ([f2b6330](https://github.com/maxbolgarin/gitbasher/commit/f2b6330db148eacce6b5ecf4c9bdc84c32704031))
55
+ * **install): working --help and fish advice; test(infra:** honest harness ([4f1bbe8](https://github.com/maxbolgarin/gitbasher/commit/4f1bbe8acc64f939d7d32c845677a0b09aeb695e))
56
+ * **worktree:** honest path handling and a usable path mode ([7a9ea79](https://github.com/maxbolgarin/gitbasher/commit/7a9ea7920f9caa1ff4a2f6b0c1bdea1c60d5662b))
57
+ * **tag:** honest remote deletes, robust delete-all, clean tag drafts ([98f4ec0](https://github.com/maxbolgarin/gitbasher/commit/98f4ec01041b0fa5ee96ef04bc520d4d79af5ae0))
58
+ * **stash): pathspec-based select; fix(undo): honest guards; fix(cherry:** live state detection ([52d27fb](https://github.com/maxbolgarin/gitbasher/commit/52d27fbf1e08703d51b5df16137145ec9c9ad4ca))
59
+ * **init:** make environment probes locale-proof and respect user config ([1ecee30](https://github.com/maxbolgarin/gitbasher/commit/1ecee30aaae2e7c8b08a4aaf90584d0f6ba13811))
60
+ * **commit:** make the atomic-split flow safe with real-world repos ([19b52d3](https://github.com/maxbolgarin/gitbasher/commit/19b52d37e1fb08ff1f92b058a6e092e958cedd1c))
61
+ * **common:** never auto-confirm prompts on EOF; kill input spin loops ([f46fed6](https://github.com/maxbolgarin/gitbasher/commit/f46fed63b6560932a3ed24cd1c959162e40a1d3d))
62
+ * **wip:** never destroy WIP on restore failure; safer discovery ([be8674e](https://github.com/maxbolgarin/gitbasher/commit/be8674ea4e105fa8d410eb0cd272dfac6b3a3fce))
63
+ * **base:** pass all arguments to merge and rebase scripts ([91a40b6](https://github.com/maxbolgarin/gitbasher/commit/91a40b6a3e7ece803b1c5c0d6c641568db8ada3e))
64
+ * **base:** quote dispatch args, clean --version, document init/version ([d2b57ee](https://github.com/maxbolgarin/gitbasher/commit/d2b57ee7337b7d23f15bca7093898c7c311a7368))
65
+ * **completion:** re-sync all three shells with the real dispatch surface ([e7fb34b](https://github.com/maxbolgarin/gitbasher/commit/e7fb34bc6ba2da539548704992461da1a91fd532))
66
+ * real bash 3.2 runtime gaps in colors and read timeouts ([78f2eb2](https://github.com/maxbolgarin/gitbasher/commit/78f2eb20c717139a0bf53207fcbf6925a27844af))
67
+ * **merge:** reconcile divergent branches in pre-merge/rebase pull ([5f98352](https://github.com/maxbolgarin/gitbasher/commit/5f9835241e4a26514f6ed2ab9a14d8b51ef1720b))
68
+ * **build:** released bundle emits byte-identical artifacts to dev runs ([85aa24e](https://github.com/maxbolgarin/gitbasher/commit/85aa24e48813510c9707970bc37deed6fa11529d))
69
+ * **hook:** resolve hooks like git does; working templates and honest modes ([a889c1d](https://github.com/maxbolgarin/gitbasher/commit/a889c1d08e2706de20557c92d7d6bc6deb2f59c5))
70
+ * **rebase:** restore exact pre-pull state on abort; safer conflict loop ([65e9b4b](https://github.com/maxbolgarin/gitbasher/commit/65e9b4b529872db7a430160ee15a459afbeb33ac))
71
+ * **push:** show transfer progress only when a push or fetch runs long ([74a3d0c](https://github.com/maxbolgarin/gitbasher/commit/74a3d0c33ebef36b7ef4d27c32f8295defa709f9))
72
+ * **log:** stop dropping rows on macOS, guard non-TTY use, sanitize output ([d61e5cd](https://github.com/maxbolgarin/gitbasher/commit/d61e5cd0467b036b31e5b8b74917ee1cfe024d0c))
73
+ * **commit:** strip model reasoning preamble from AI commit messages ([0d61206](https://github.com/maxbolgarin/gitbasher/commit/0d61206a9738d4ca3c657cc156778a2ff772bb92))
74
+ * **ai:** trap safety, honest error handling, robust proxy/key management ([5bf3b1c](https://github.com/maxbolgarin/gitbasher/commit/5bf3b1cf3e24e925bb9fbfb59fadb6bed3bdc31d))
75
+ * **commit:** treat Enter as No at atomic-split (y/N) prompt ([e86bd0b](https://github.com/maxbolgarin/gitbasher/commit/e86bd0b19b9b907f5dfe748d64fd3228ee96a6f8))
76
+ * **merge:** unblock conflict resolution, stop arg shifts, honest checks ([5871ce3](https://github.com/maxbolgarin/gitbasher/commit/5871ce3202c4ff572f64f8ddfc8fb53d41037dbb))
77
+ * **squash:** work on bash 3.2, refuse merge ranges before the AI call ([1ce4ad2](https://github.com/maxbolgarin/gitbasher/commit/1ce4ad225a5c8cdfe7f076fdaa8ebe1d66d38436))
78
+ * **config:** working delete menu, safe writes, honest validation ([14ef2b8](https://github.com/maxbolgarin/gitbasher/commit/14ef2b86573930a407f88502f0099438e1909273))
79
+
80
+ ### 📚 Documentation
81
+
82
+ * align README/FAQ/ARCHITECTURE with actual behavior ([9670681](https://github.com/maxbolgarin/gitbasher/commit/9670681b020c4c9ae252d4f2c26bdd3f00f29fa6))
83
+ * **log:** document the interactive browser, smart args and ai summary ([28c7957](https://github.com/maxbolgarin/gitbasher/commit/28c7957b2613a70456bc105fbd935e741faff588))
84
+ * **faq:** explain undo operation semantics and undo vs reset ([88dc9e4](https://github.com/maxbolgarin/gitbasher/commit/88dc9e46841f6592434e4eeeb27fb5897ec991c3))
85
+ * fix accuracy drift across README, FAQ, ARCHITECTURE, site and comments ([7f00931](https://github.com/maxbolgarin/gitbasher/commit/7f0093181812e9a2d9749368f941e47e6bb89560))
86
+ * use v5.0.0 in version-pin examples ([89d980c](https://github.com/maxbolgarin/gitbasher/commit/89d980cdfa34912b5ef8a95d49273ff3ac77a5ce))
87
+
88
+ ### 📦 Code Refactoring
89
+
90
+ * make gitbasher run on bash 3.2 ([f575b05](https://github.com/maxbolgarin/gitbasher/commit/f575b055ed0813a965fd9d2b104d80f13ec142b6))
91
+ * make merged scope-dependency ordering bash 3.2 compatible ([746b9cd](https://github.com/maxbolgarin/gitbasher/commit/746b9cd96a74cb29394bfa41ad7671c4faf9c9c8))
92
+ * **diff:** move print_ai_summary to common.sh for cross-command reuse ([e1153e3](https://github.com/maxbolgarin/gitbasher/commit/e1153e39033e5fd9a526b90df6dab015e8132d4b))
93
+
94
+ ### 🚨 Tests
95
+
96
+ * add 6 test suites for clone, commit splitting, and validation logic ([ec91278](https://github.com/maxbolgarin/gitbasher/commit/ec912787a8088a10fb07b76e0280c63ad567af98))
97
+ * add tests for ollama AI configuration and merge/rebase push modifiers ([4e35b3a](https://github.com/maxbolgarin/gitbasher/commit/4e35b3adbcfb0df8df4fcc694d377c4539415ddf))
98
+ * keep [@test](https://github.com/test) descriptions ASCII for bash 3.2 (bats name mangling) ([2ef48a7](https://github.com/maxbolgarin/gitbasher/commit/2ef48a79ef43f9dfb3b7b3ae65cb8d0736a9a031))
99
+ * make test code bash 3.2 compatible ([b7b81fa](https://github.com/maxbolgarin/gitbasher/commit/b7b81fab2b38cf0eb31a3d1906abab9c87a99beb))
100
+ * replace non-ASCII dash in test name that breaks bats under bash 3.2 ([6ac525b](https://github.com/maxbolgarin/gitbasher/commit/6ac525b2c788bac35fd9c941e714a14efec0482e))
101
+
102
+ ### ⚙️ Continuous Integration
103
+
104
+ * add Docker bash:3.2 syntax + shim self-test job ([e6ec1e2](https://github.com/maxbolgarin/gitbasher/commit/e6ec1e273110b150244a4df375bb654b86f51dec))
105
+
5
106
  ## [4.1.0](https://github.com/maxbolgarin/gitbasher/compare/v4.0.0...v4.1.0) (2026-05-29)
6
107
 
7
108
  ### 🚀 Features
package/README.md CHANGED
@@ -111,7 +111,7 @@ Every command has a short alias (`gitb c`, `gitb p`, `gitb pu`, `gitb b`, `gitb
111
111
  - **AI commit messages** — `gitb c ai` writes the message from your diff. OpenRouter (Gemini/Claude/GPT/…), OpenAI direct, or **fully local via Ollama** — no key, no network, no data leaves your machine.
112
112
  - **Safer git** — push/pull detect conflicts up front, `undo` rolls back commit/amend/merge/rebase/stash, `reset` is interactive with a preview.
113
113
  - **Whole workflows, not just commands** — `sync`, `wip`, `branch newd`, `merge to-main`, `squash` chain the steps you'd otherwise do by hand.
114
- - **One file, no deps** — pure bash. Drop the binary anywhere on `PATH` and go. **115+ BATS tests** cover sanitization, git ops, and branch logic.
114
+ - **One file, no deps** — pure bash for every git operation; only the AI features need `jq` and `curl`. Drop the binary anywhere on `PATH` and go. **870+ BATS tests** cover sanitization, git ops, and branch logic.
115
115
 
116
116
  <p align="center">
117
117
  <img src=".github/push.gif" width="640" alt="gitb push demo" />
@@ -124,19 +124,19 @@ Every command has a short alias (`gitb c`, `gitb p`, `gitb pu`, `gitb b`, `gitb
124
124
  | Group | Commands | What you get |
125
125
  |-------|----------|--------------|
126
126
  | **Commit** | `commit` (`c`), `edit` (`ed`) | Interactive conventional commits, fast-mode, AI messages, atomic split, fixup, amend, revert; `gitb edit` reworks the last commit message, picks any commit to reword, or renames the current branch |
127
- | **Sync remote** | `push` (`p`), `pull` (`pu`), `sync` (`sy`) | Safe push (with force/list), smart pull (rebase / merge / ff), one-shot rebase-on-main with optional force-push |
127
+ | **Sync remote** | `push` (`p`), `pull` (`pu`), `fetch` (`fe`), `sync` (`sy`) | Safe push (with force/list), smart pull (rebase / merge / ff), fetch-only with prune, one-shot rebase-on-main with optional force-push |
128
128
  | **Branches** | `branch` (`b`), `prev` (`-`) | List / switch / create-from-current / create-from-updated-main / delete (orphaned, merged, gone) / recent / previous / checkout-tag |
129
129
  | **Integration** | `merge` (`m`), `rebase` (`r`), `squash` (`sq`), `cherry` (`ch`) | Merge into current / into main / from remote · rebase onto main / interactive / autosquash / fastautosquash / pull-commits · AI-driven squash of branch commits into changelog-ready history · cherry-pick by hash, range, or interactive |
130
130
  | **Tags & releases** | `tag` (`t`) | Lightweight, annotated, from-commit, push, push-all, delete, delete-all, list, fetch-remote |
131
131
  | **Save & rollback** | `wip` (`up`/`down`), `undo` (`un`), `reset` (`res`), `stash` (`st`) | Save WIP via stash / branch / worktree (auto-detected on restore) · undo last commit/amend/merge/rebase/stash · interactive reset · full stash menu |
132
132
  | **Worktrees** | `worktree` (`wt`) | Add / list / remove / move / lock / prune git worktrees, with new branch from current/main or from existing/remote branches |
133
- | **Inspect** | `status` (`s`), `log` (`l`), `reflog` (`rl`), `last-commit` (`lc`), `last-ref` (`lr`) | Pretty repo status, multi-mode log + search, reflog viewer, quick last-commit / last-ref summary |
133
+ | **Inspect** | `status` (`s`), `diff` (`d`), `log` (`l`), `reflog` (`rl`), `last-commit` (`lc`), `last-ref` (`lr`) | Pretty repo status, overview-first diffs with a file picker + AI summary, multi-mode log + search, reflog viewer, quick last-commit / last-ref summary |
134
134
  | **Hooks** | `hook` (`ho`) | List / create from templates / edit / toggle / remove / test / show — for every git hook |
135
135
  | **Repo setup** | `init` (`i`), `origin` (`or`, `o`, `remote`) | `git init` from gitbasher · add/change/rename/remove the remote origin |
136
136
  | **Config** | `config` (`cfg`) | User, default branch, separator, editor, ticket prefix, scopes, AI provider/key/model, proxy, completion |
137
137
  | **Lifecycle** | `update` (`up`), `uninstall` (`uns`) | Self-update from latest GitHub release · one-shot uninstall (config + binary) |
138
138
 
139
- Total: **24 top-level commands**, **60+ aliases**, **100+ modes**.
139
+ Total: **31 top-level commands**, **60+ aliases**, **100+ modes**.
140
140
 
141
141
  ---
142
142
 
@@ -168,9 +168,9 @@ gitb sync merge # use merge instead of rebase
168
168
  ### Save WIP across machines / branches
169
169
  ```bash
170
170
  gitb wip up # stash changes + push backup to origin/wip/<branch>
171
- # … on another machine …
172
- gitb pull # fetch the wip/<branch>
173
- gitb wip down # pop the wip stash and remove the remote backup
171
+ # … on another machine: fetch the backup branch and restore it manually …
172
+ git fetch origin wip/<branch>
173
+ git merge --squash --no-commit origin/wip/<branch>
174
174
  ```
175
175
 
176
176
  ### Hotfix
@@ -311,6 +311,7 @@ git config gitbasher.ai-base-url http://my-gateway:4000/v1/chat/completions
311
311
  | [`edit`](#gitb-edit) | `ed` `ee` | Rewrite the last commit message, reword an older commit, or rename the current branch |
312
312
  | [`push`](#gitb-push) | `p` `ps` `pus` | Push with conflict handling, force, or list-only |
313
313
  | [`pull`](#gitb-pull) | `pu` `pl` `pul` | Smart pull: rebase / merge / ff / fetch-only / interactive / dry-run |
314
+ | [`fetch`](#gitb-fetch) | `fe` | Fetch without merging: current branch, all remotes, or prune |
314
315
  | [`branch`](#gitb-branch) | `b` `br` `bran` | Switch / list / create / delete / recent / gone / checkout-tag |
315
316
  | [`tag`](#gitb-tag) | `t` `tg` | Create, push, list, delete tags (lightweight & annotated) |
316
317
  | [`merge`](#gitb-merge) | `m` `me` | Merge into current, into main, or from remote |
@@ -326,9 +327,13 @@ git config gitbasher.ai-base-url http://my-gateway:4000/v1/chat/completions
326
327
  | [`hook`](#gitb-hook) | `ho` `hk` | Manage git hooks: list, create, edit, toggle, remove, test, show |
327
328
  | [`origin`](#gitb-origin) | `or` `o` `remote` | Add, change, rename, or remove the remote origin |
328
329
  | [`init`](#gitb-init) | `i` | `git init` + optional origin setup prompt |
330
+ | `clone` | `cl` `clo` | Clone a repository and set up gitbasher in it |
331
+ | `update` | `up` `upd` | Self-update gitb to the latest release |
332
+ | [`uninstall`](#uninstall) | `uns` `uni` | Remove the binary and `gitbasher.*` config keys |
329
333
  | [`config`](#gitb-config) | `cf` `cfg` `conf` | Configure user, branch, AI, scopes, ticket prefix, etc. |
330
- | [`log`](#gitb-log) | `l` `lg` | Pretty log: current, branch, compare, search |
334
+ | [`log`](#gitb-log) | `l` `lg` | Interactive commit browser; also branch, compare, search, and full-dump modes |
331
335
  | [`status`](#info-commands) | `s` | Repo status and changed files |
336
+ | [`diff`](#gitb-diff) | `d` `di` | Overview-first diffs: staged, all, branch, commit, AI summary |
332
337
  | [`reflog`](#info-commands) | `rl` `rlg` | Pretty reflog |
333
338
  | [`last-commit`](#info-commands) | `lc` `lastc` | Show the last commit |
334
339
  | [`last-ref`](#info-commands) | `lr` `lastr` | Show the last reference |
@@ -355,6 +360,7 @@ gitb commit <combined> # compact form: ff, aifp, fastsp, ...
355
360
  | `amend` | `a` `am` | Add changes into the last commit (no message edit) |
356
361
  | `revert` | `rev` | Revert a commit (`git revert --no-edit`) |
357
362
  | `ff` | | Ultrafast: `ai + split + fast` with no prompts (use `ffp` to also push) |
363
+ | `sff` | `ffst` | Like `ff` but on already-staged files (no `git add .`); use `sffp` to also push |
358
364
  | `help` | `h` `--help` `-h` | Show inline help |
359
365
 
360
366
  **Modifiers** — stack with an action, any order.
@@ -378,10 +384,11 @@ gitb commit <combined> # compact form: ff, aifp, fastsp, ...
378
384
  | `gitb commit fast` | `git add .` then enter a message |
379
385
  | `gitb commit ai fast push` | AI message + add all + commit + push |
380
386
  | `gitb commit aifp` | Same as above (compact form) |
381
- | `gitb commit ai split push` | AI groups staged files into commits, then push |
387
+ | `gitb commit ai split push` | AI groups staged files into commits by feature, then push |
382
388
  | `gitb commit fixup push` | Pick an older commit, fixup it, then push |
383
389
  | `gitb commit amend fast` | Add all current changes into the last commit |
384
390
  | `gitb commit ff` | Full auto: AI splits and writes everything |
391
+ | `gitb commit sffp` | Full auto on already-staged files: AI splits, writes, pushes |
385
392
 
386
393
  **How modes combine**
387
394
  - Word order doesn't matter: `ai fast push` == `push fast ai` == `aifp`.
@@ -429,10 +436,12 @@ Notes:
429
436
  | `<empty>` | | Show commits, push with conflict handling |
430
437
  | `yes` | `y` | Push without confirmation |
431
438
  | `force` | `f` | Force push (use after rebase/amend) |
432
- | `list` | `log` `l` | List unpushed commits only |
439
+ | `list` | `log` `l` | List unpushed commits + estimated push size and large-file warnings |
433
440
 
434
441
  </details>
435
442
 
443
+ Quick pushes stay clean — git's live progress bar appears only when a transfer runs long (same for `pull`/`fetch`). gitbasher also estimates the transfer size first, warning you before you push a stray non-code object (e.g. a build artifact or dataset). Tune the threshold with `gitb cfg push-size` (default 50 MB, `0` disables).
444
+
436
445
  ### `gitb pull`
437
446
 
438
447
  <details>
@@ -443,7 +452,7 @@ Notes:
443
452
  | `<empty>` | | Smart pull (strategy picker) |
444
453
  | `fetch` | `fe` | Fetch only |
445
454
  | `all` | `fa` | Fetch all branches |
446
- | `upd` | `u` | Update remote refs / prune |
455
+ | `upd` | `u` | Update remote refs (`git remote update`) |
447
456
  | `ffonly` | `ff` | Fast-forward only |
448
457
  | `merge` | `m` | Always create merge commit |
449
458
  | `rebase` | `r` | Rebase current onto remote |
@@ -452,6 +461,19 @@ Notes:
452
461
 
453
462
  </details>
454
463
 
464
+ ### `gitb fetch`
465
+
466
+ <details>
467
+ <summary>All fetch modes</summary>
468
+
469
+ | Mode | Aliases | Description |
470
+ |------|---------|-------------|
471
+ | `<empty>` | | Fetch the current branch without merging |
472
+ | `all` | `a` `fa` | Fetch every remote branch without merging |
473
+ | `prune` | `p` `pr` | Fetch and drop branches deleted on the remote |
474
+
475
+ </details>
476
+
455
477
  ### `gitb branch`
456
478
 
457
479
  <details>
@@ -464,8 +486,8 @@ Notes:
464
486
  | `remote` | `re` `r` | Fetch and switch to a remote branch |
465
487
  | `main` | `def` `m` | Quick-switch to default branch |
466
488
  | `tag` | `t` | Checkout to a specific tag |
467
- | `new` | `n` `c` | Create branch from current |
468
- | `newd` | `nd` `cd` | Switch to main, pull, branch off |
489
+ | `new` | `n` `c` | Create branch from current (offers to push it to the remote) |
490
+ | `newd` | `nd` `cd` | Switch to main, pull, branch off (offers to push it to the remote) |
469
491
  | `delete` | `del` `d` | Delete branches (orphaned, merged, or selected) |
470
492
  | `prev` | `p` `-` | Switch to previous branch (`cd -`) |
471
493
  | `recent` | `rc` | Pick from recently checked-out branches |
@@ -504,6 +526,7 @@ Notes:
504
526
  | `main` | `master` `m` | Merge default branch into current |
505
527
  | `to-main` | `to-master` `tm` | Switch to main, merge current branch in |
506
528
  | `remote` | `r` | Fetch + select a remote branch to merge |
529
+ | `push` | `p` | Push the branch after a successful merge (combine with any mode) |
507
530
 
508
531
  </details>
509
532
 
@@ -520,6 +543,7 @@ Notes:
520
543
  | `autosquash` | `a` `s` `ia` | Interactive rebase with `--autosquash` |
521
544
  | `fastautosquash` | `fast` `sf` `f` | Autosquash without interaction |
522
545
  | `pull` | `p` | Take commits from selected branch into current |
546
+ | `push` | | Force-push the branch after a successful rebase (combine with any mode) |
523
547
 
524
548
  </details>
525
549
 
@@ -677,7 +701,7 @@ long-running reviews, or comparing branches side-by-side.
677
701
  | `<empty>` | | Show existing worktrees + interactive menu |
678
702
  | `list` | `l` `ls` | List all worktrees with branch and lock state |
679
703
  | `add` | `a` `new` `n` `c` | Create worktree with a new branch from current `HEAD` |
680
- | `addd` | `ad` `nd` `cd` | Fetch, then create worktree with new branch from default branch |
704
+ | `addd` | `ad` `nd` | Fetch, then create worktree with new branch from default branch |
681
705
  | `addb` | `ab` `from` `b` | Create worktree from an existing local branch |
682
706
  | `addr` | `ar` `remote` `r` | Fetch + create worktree tracking a remote branch |
683
707
  | `remove` | `rm` `del` `d` | Pick a worktree to remove (force-prompt on dirty trees) |
@@ -685,7 +709,9 @@ long-running reviews, or comparing branches side-by-side.
685
709
  | `lock` | | Lock a worktree (with optional reason) |
686
710
  | `unlock` | `ul` | Unlock a worktree |
687
711
  | `prune` | `pr` `p` | Clean up stale worktree records (dry-run preview first) |
688
- | `path` | `cd` `switch` `sw` | Print the path to a chosen worktree (use with `cd $(...)`) |
712
+ | `manage` | `m` | Pick a worktree, then move / lock / unlock / delete it |
713
+ | `goto` | `go` `g` `cd` `switch` | Open a subshell inside a chosen worktree |
714
+ | `path` | `sw` | Print the path to a chosen worktree (use with `cd $(...)`) |
689
715
 
690
716
  </details>
691
717
 
@@ -697,8 +723,8 @@ gitb wt remove # interactive removal (with force prompt if dirty)
697
723
  cd "$(gitb wt path)" # cd into a chosen worktree
698
724
  ```
699
725
 
700
- By default new worktrees are created at `../<repo>-<branch>`. Override the
701
- parent directory globally or per-repo:
726
+ By default new worktrees are created at `<repo_root>/.worktree/<branch>` (slashes
727
+ in the branch name become dashes). Override the base directory globally or per-repo:
702
728
 
703
729
  ```bash
704
730
  git config --global gitbasher.worktreebase ~/code/worktrees
@@ -713,9 +739,11 @@ git config --global gitbasher.worktreebase ~/code/worktrees
713
739
  |------|---------|-------------|
714
740
  | `<empty>` | | Interactive action menu |
715
741
  | `list` | `l` | All hooks with status |
742
+ | `select` | `sel` | Browse hook types with descriptions |
716
743
  | `create` | `new` `c` | New hook from templates |
717
744
  | `edit` | `e` | Edit existing hook |
718
- | `toggle` | `t` | Enable/disable hook |
745
+ | `toggle` | `t` | Enable/disable hook (`enable` / `disable` force that state) |
746
+ | `install` | `samples` | Install all available sample hooks |
719
747
  | `remove` | `rm` `r` | Delete hook(s) |
720
748
  | `test` | `run` `check` | Test hook execution |
721
749
  | `show` | `cat` `view` `s` | Display hook contents |
@@ -754,8 +782,8 @@ without a remote, rename the repo on GitHub/GitLab, or move it to a new host.
754
782
 
755
783
  </details>
756
784
 
757
- Each mutating mode accepts an optional URL/name as a second argument to skip
758
- the interactive prompt:
785
+ The `set`, `change`, and `rename` modes accept an optional URL/name as a second
786
+ argument to skip the interactive prompt:
759
787
 
760
788
  ```bash
761
789
  gitb origin # show remotes
@@ -775,7 +803,7 @@ gitb origin remove # delete the remote
775
803
  | `<empty>` | | Show current configuration |
776
804
  | `user` | `u` `name` `email` | Set name and email |
777
805
  | `default` | `def` `d` `b` `main` | Set default branch |
778
- | `separator` | `sep` `s` | Branch-name separator |
806
+ | `separator` | `sep` | Branch-name separator |
779
807
  | `editor` | `ed` `e` | Commit-message editor |
780
808
  | `ticket` | `ti` `t` `jira` | Ticket prefix for commits/branches |
781
809
  | `scopes` | `sc` `s` | Common scopes |
@@ -783,6 +811,9 @@ gitb origin remove # delete the remote
783
811
  | `provider` | `prov` | AI provider (openrouter, openai, ollama) |
784
812
  | `model` | `m` | Default AI model |
785
813
  | `proxy` | `prx` `p` | HTTP proxy for AI calls |
814
+ | `history` | `hist` | How many recent commits to include in AI prompts |
815
+ | `diff` | `payload` | AI diff payload size (line and character caps) |
816
+ | `push-size` | `ps` `pushsize` | Warn before pushing more than N MB (0 disables) |
786
817
  | `completion` | `comp` | Install / uninstall bash & zsh tab completion |
787
818
  | `delete` | `unset` `del` | Remove global config |
788
819
 
@@ -790,20 +821,50 @@ gitb origin remove # delete the remote
790
821
 
791
822
  ### `gitb log`
792
823
 
793
- <details>
794
- <summary>All log modes</summary>
824
+ An interactive commit browser instead of a wall of text. Bare `gitb log` shows a paginated, numbered commit list (with branch/tag decorations and `↑` on unpushed commits) — pick a number to open the commit and act on it: view the diff or stat, copy the hash, revert, cherry-pick, fix up staged changes into it, or restore a single file from it.
795
825
 
796
826
  | Mode | Aliases | Description |
797
827
  |------|---------|-------------|
798
- | `<empty>` | | Pretty log for current branch |
828
+ | _(none)_ | | Interactive commit browser for the current branch |
829
+ | `all` | `dump` | Classic full log dump through the pager |
799
830
  | `branch` | `b` | Pick a branch to log |
800
831
  | `compare` | `comp` `c` | Compare two branches |
801
832
  | `search` | `s` | Search commits |
833
+ | `ai` | | Summarize a commit range in plain English (needs `gitb cfg ai`) |
834
+ | `help` | `h` | Show inline help |
835
+
836
+ Anything else after `gitb log` is resolved automatically:
837
+
838
+ ```bash
839
+ gitb log 20 # browse the last 20 commits
840
+ gitb log scripts/gitb.sh # browse one file's history (follows renames)
841
+ gitb log main..feature # browse a range (plain refs work too)
842
+ gitb log broken teapot # search commit messages for the phrase
843
+ ```
844
+
845
+ `gitb log ai` summarizes what happened since the last tag; `gitb log ai 30`, `gitb log ai unpushed` and `gitb log ai main..feature` narrow the range. Page size is configurable: `git config gitbasher.log-count 30`.
846
+
847
+ <details>
848
+ <summary>Search sub-modes</summary>
802
849
 
803
850
  **Search sub-modes:** `message`/`msg`/`m`, `author`/`a`, `file`/`f`, `content`/`pickaxe`/`p`, `date`/`d`, `hash`/`commit`/`h`.
804
851
 
805
852
  </details>
806
853
 
854
+ ### `gitb diff`
855
+
856
+ Overview-first diffs built for the gitbasher workflow — no flag memorization. Bare `gitb diff` shows a colorized stat of your uncommitted changes, then lets you pick a file to view its full patch.
857
+
858
+ | Mode | Aliases | Description |
859
+ |------|---------|-------------|
860
+ | _(none)_ | | Stat overview of uncommitted changes, then pick a file to view its full patch |
861
+ | `staged` | `s` `cached` | Show staged changes (`git diff --cached`) |
862
+ | `all` | `a` | Show all uncommitted changes — staged **and** unstaged (`git diff HEAD`) |
863
+ | `branch` | `b` | Compare the current branch against another, chosen interactively |
864
+ | `commit` | `c` | Show a chosen commit's diff, chosen interactively |
865
+ | `ai` | | Summarize uncommitted changes in plain English (needs `gitb cfg ai`) |
866
+ | `help` | `h` | Show inline help |
867
+
807
868
  ### Info commands
808
869
 
809
870
  | Command | Aliases | Description |
@@ -824,15 +885,26 @@ gitb origin remove # delete the remote
824
885
  | `user.name` / `user.email` | `gitb cfg user` | Your identity |
825
886
  | `gitbasher.branch` | `gitb cfg default` | Default branch (`main`, `master`, …) |
826
887
  | `gitbasher.sep` | `gitb cfg separator` | Branch-name separator (`/`, `-`, …) |
827
- | `gitbasher.editor` | `gitb cfg editor` | Editor for messages |
888
+ | `core.editor` | `gitb cfg editor` | Editor for messages |
828
889
  | `gitbasher.ticket` | `gitb cfg ticket` | Ticket prefix (`PROJ-`) |
829
890
  | `gitbasher.scopes` | `gitb cfg scopes` | Suggested commit scopes |
830
- | `gitbasher.ai-api-key` | `gitb cfg ai` | AI provider API key (or `GITB_AI_API_KEY` env) |
891
+ | `gitbasher.ai-api-key-<provider>` | `gitb cfg ai` | Per-provider AI API key (or `GITB_AI_API_KEY_<PROVIDER>` env); legacy `gitbasher.ai-api-key` is read as a fallback |
831
892
  | `gitbasher.ai-provider` | `gitb cfg provider` | `openrouter` (default), `openai`, or `ollama` |
832
893
  | `gitbasher.ai-base-url` | `git config` | Custom OpenAI-compatible endpoint (LiteLLM, vLLM, remote Ollama) |
833
894
  | `gitbasher.ai-model[-task]` | `gitb cfg model` | AI model overrides (per provider) |
834
- | `gitbasher.proxy` | `gitb cfg proxy` | HTTP proxy for AI calls |
835
- | `gitbasher.worktreebase` | `git config gitbasher.worktreebase <dir>` | Parent directory for new worktrees (defaults to `..`) |
895
+ | `gitbasher.ai-proxy` | `gitb cfg proxy` | HTTP proxy for AI calls |
896
+ | `gitbasher.ai-ollama-host` | `git config gitbasher.ai-ollama-host <url>` | Ollama server URL (default `http://localhost:11434`) |
897
+ | `gitbasher.ai-timeout` | `git config gitbasher.ai-timeout <seconds>` | AI request timeout in seconds (default `60`, `300` for ollama) |
898
+ | `gitbasher.ai-diff-limit` | `gitb cfg diff` | Diff lines sent to AI (default `300`) |
899
+ | `gitbasher.ai-diff-max-chars` | `gitb cfg diff` | Character cap on the diff sent to AI (default `20000`) |
900
+ | `gitbasher.ai-commit-history-limit` | `gitb cfg history` | Recent commits included in AI prompts (default `10`) |
901
+ | `gitbasher.push-warn-size` | `gitb cfg push-size` | Warn before pushing more than N MB (default `50`, `0` disables) |
902
+ | `gitbasher.worktreebase` | `git config gitbasher.worktreebase <dir>` | Base directory for new worktrees (default `.worktree` under the repo root) |
903
+ | `gitbasher.commit-auto-split` | `git config gitbasher.commit-auto-split <ask\|always\|never>` | Offer to split a commit per scope (default `ask`) |
904
+ | `gitbasher.commit-max-split-groups` | `git config gitbasher.commit-max-split-groups <2..20>` | Cap on split commits per run (default `7`) |
905
+ | `gitbasher.commit-split-order` | `git config gitbasher.commit-split-order <auto\|alpha>` | Order split commits by dependency (`auto`, default) or alphabetically (`alpha`) |
906
+ | `gitbasher.commit-ai-grouping` | `git config gitbasher.commit-ai-grouping <never\|auto\|always>` | AI feature grouping for commit splits (default `auto`) |
907
+ | `gitbasher.log-count` | `git config gitbasher.log-count <n>` | Commits per page in the `gitb log` browser (default `20`) |
836
908
 
837
909
  **Clear gitbasher config** (per-repo settings live with the repo and disappear with it):
838
910
  ```bash
@@ -868,7 +940,7 @@ GITB_DIR=/opt/bin curl -fsSL https://raw.githubusercontent.com/maxbolgarin/gitba
868
940
 
869
941
  ### Pin a release
870
942
  ```bash
871
- GITB_VERSION=v3.10.2 curl -fsSL https://raw.githubusercontent.com/maxbolgarin/gitbasher/main/install.sh | bash
943
+ GITB_VERSION=v5.0.0 curl -fsSL https://raw.githubusercontent.com/maxbolgarin/gitbasher/main/install.sh | bash
872
944
  ```
873
945
 
874
946
  ## Uninstall
@@ -925,9 +997,10 @@ gitb cfg proxy # in restricted regions
925
997
 
926
998
  If `gitb commit ai` hangs, returns `connection refused`, or times out:
927
999
 
1000
+ - **jq missing** — all AI features require `jq` (check with `command -v jq`; install via `brew install jq` / `apt install jq`). Without it every AI command aborts with an install hint.
928
1001
  - **Network reachability** — test the provider directly: `curl -fsSL https://api.openai.com/v1/models -H "Authorization: Bearer $OPENAI_API_KEY"` (or the equivalent for OpenRouter/Ollama). If that fails, gitbasher will too.
929
1002
  - **Corporate proxy / restricted region** — `gitb cfg proxy` accepts `host:port` or `protocol://host:port`. Verify with `curl -x "$proxy" https://api.openai.com`.
930
- - **Local Ollama** — confirm the daemon is running (`curl http://localhost:11434/api/tags`). The default model must be pulled first (`ollama pull llama3`).
1003
+ - **Local Ollama** — confirm the daemon is running (`curl http://localhost:11434/api/tags`). The default model must be pulled first (`ollama pull qwen3:8b`).
931
1004
  - **Stale or rotated key** — `gitb cfg ai` re-prompts; prefer the env-var path (`export GITB_AI_API_KEY_OPENAI=...`) over `git config` so a leaked repo doesn't carry the secret.
932
1005
  </details>
933
1006
 
@@ -949,9 +1022,9 @@ Per-repo settings live in `.git/config` and need write access to that file (`chm
949
1022
  <details>
950
1023
  <summary><b>"Bad substitution" or bash errors</b></summary>
951
1024
 
952
- `bash --version` must be 4.0+.
1025
+ `bash --version` must be 3.2+ — the version macOS ships as `/bin/bash` — so this is rare.
953
1026
 
954
- - macOS: `brew install bash` (and optionally make it default: `sudo sh -c 'echo /opt/homebrew/bin/bash >> /etc/shells' && chsh -s /opt/homebrew/bin/bash`)
1027
+ - macOS: already ships bash 3.2; gitbasher runs on it natively (a newer bash via `brew install bash` only improves in-place line editing of prefilled prompts)
955
1028
  - Ubuntu/Debian: `sudo apt update && sudo apt install --only-upgrade bash`
956
1029
  </details>
957
1030
 
@@ -960,9 +1033,11 @@ Per-repo settings live in `.git/config` and need write access to that file (`chm
960
1033
 
961
1034
  | OS | Bash | Git | Install |
962
1035
  |----|------|-----|---------|
963
- | Linux | 4.0+ | 2.23+ | `apt install bash git` |
964
- | macOS | 4.0+ | 2.23+ | `brew install bash git` |
1036
+ | Linux | 3.2+ | 2.23+ | `apt install bash git` |
1037
+ | macOS | 3.2+ (system) | 2.23+ | `brew install git` |
965
1038
  | Windows | WSL | WSL | `wsl --install` then Linux steps |
1039
+
1040
+ AI features additionally require `jq` (`brew install jq` / `apt install jq`); core git commands don't.
966
1041
  </details>
967
1042
 
968
1043
  <details>
@@ -979,7 +1054,7 @@ Per-repo settings live in `.git/config` and need write access to that file (`chm
979
1054
  | `Another git process seems to be running ... index.lock` | gitbasher detects this at startup and prompts to remove the stale lock |
980
1055
  | `error: pathspec '<branch>' did not match any file(s) known to git` | `gitb pull` to fetch, or `gitb b new <branch>` to create a fresh branch with a conventional name |
981
1056
  | `fatal: detached HEAD` after checkout | gitbasher warns before destructive ops in detached HEAD; use `gitb b` to switch to a real branch first |
982
- | `gpg: signing failed` on commit | export `GPG_TTY=$(tty)` or run `gitb config` to disable signing per-repo |
1057
+ | `gpg: signing failed` on commit | export `GPG_TTY=$(tty)` or run `git config commit.gpgsign false` to disable signing per-repo |
983
1058
 
984
1059
  If you hit a confusing git error not listed here, run the same flow with `git` directly first — gitbasher passes git's stderr through unchanged, so the underlying message is the source of truth.
985
1060
  </details>
@@ -991,7 +1066,6 @@ If you hit a confusing git error not listed here, run the same flow with `git` d
991
1066
  npm uninstall -g gitbasher # if installed via npm
992
1067
  sudo rm /usr/local/bin/gitb # if installed system-wide
993
1068
  rm -f ~/.local/bin/gitb # if installed per-user
994
- rm -rf ~/.gitbasher # remove config (optional)
995
1069
  ```
996
1070
  </details>
997
1071
 
@@ -1005,7 +1079,7 @@ PRs welcome. See [CONTRIBUTING.md](./CONTRIBUTING.md) for the dev setup, BATS te
1005
1079
 
1006
1080
  ```bash
1007
1081
  make build # rebuild dist/gitb
1008
- make test # run all 115+ tests
1082
+ make test # run all 870+ tests
1009
1083
  make test-file FILE=test_sanitization.bats
1010
1084
  ```
1011
1085