git-cai-cli 0.13.5__tar.gz → 0.14.0__tar.gz

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 (96) hide show
  1. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/.linters/.pylintrc +4 -4
  2. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/PKG-INFO +55 -1
  3. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/README.md +54 -0
  4. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/docs/git-cai.txt +83 -1
  5. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/docs/man/git-cai.1 +116 -3
  6. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/src/git_cai_cli/_version.py +3 -3
  7. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/src/git_cai_cli/cli/cli.py +22 -0
  8. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/src/git_cai_cli/cli/helptext.py +3 -0
  9. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/src/git_cai_cli/cli/modes.py +33 -9
  10. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/src/git_cai_cli/core/config.py +2 -0
  11. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/src/git_cai_cli/core/gitutils.py +65 -0
  12. git_cai_cli-0.14.0/src/git_cai_cli/core/init.py +206 -0
  13. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/src/git_cai_cli/core/options.py +2 -0
  14. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/src/git_cai_cli/core/squash.py +18 -0
  15. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/src/git_cai_cli/core/validate.py +1 -0
  16. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/src/git_cai_cli/main.py +23 -0
  17. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/src/git_cai_cli.egg-info/PKG-INFO +55 -1
  18. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/src/git_cai_cli.egg-info/SOURCES.txt +4 -0
  19. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/tests/integration/test_modes_integration.py +2 -2
  20. git_cai_cli-0.14.0/tests/unit/test_init.py +199 -0
  21. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/tests/unit/test_modes.py +14 -14
  22. git_cai_cli-0.14.0/tests/unit/test_print.py +80 -0
  23. git_cai_cli-0.14.0/tests/unit/test_signoff.py +134 -0
  24. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/.caiignore +0 -0
  25. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/.gitattributes +0 -0
  26. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/.github/cd/.SRCINFO +0 -0
  27. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/.github/cd/PKGBUILD +0 -0
  28. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/.github/ci/_version.py +0 -0
  29. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/.github/ci/cai_config.ci.yml +0 -0
  30. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/.github/ci/tokens.ci.yml +0 -0
  31. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/.github/workflows/python-tests.yml +0 -0
  32. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/.github/workflows/release.yml +0 -0
  33. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/.github/workflows/release_aur.yml +0 -0
  34. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/.gitignore +0 -0
  35. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/.linters/.bandit.yml +0 -0
  36. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/.linters/.checkov.yml +0 -0
  37. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/.linters/.flake8 +0 -0
  38. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/.linters/.ls-lint.yml +0 -0
  39. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/.linters/.markdown-link-check.json +0 -0
  40. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/.linters/.markdownlint.json +0 -0
  41. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/.linters/.proselintrc +0 -0
  42. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/.linters/.yamllint.yml +0 -0
  43. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/.linters/check_git_branch_name.sh +0 -0
  44. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/.linters/lychee.toml +0 -0
  45. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/.linters/pyrightconfig.json +0 -0
  46. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/.markdownlintignore +0 -0
  47. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/.mega-linter.yml +0 -0
  48. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/.semgrepignore +0 -0
  49. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/.trivyignore +0 -0
  50. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/CLAUDE.md +0 -0
  51. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/LICENSE +0 -0
  52. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/Makefile +0 -0
  53. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/cai_config.yml +0 -0
  54. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/pyproject.toml +0 -0
  55. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/setup.cfg +0 -0
  56. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/src/git_cai_cli/__init__.py +0 -0
  57. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/src/git_cai_cli/cli/__init__.py +0 -0
  58. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/src/git_cai_cli/core/__init__.py +0 -0
  59. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/src/git_cai_cli/core/completion.py +0 -0
  60. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/src/git_cai_cli/core/editors.py +0 -0
  61. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/src/git_cai_cli/core/languages.py +0 -0
  62. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/src/git_cai_cli/core/llm.py +0 -0
  63. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/src/git_cai_cli/core/pr.py +0 -0
  64. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/src/git_cai_cli/core/prompts_fallback.py +0 -0
  65. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/src/git_cai_cli/core/spinner.py +0 -0
  66. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/src/git_cai_cli/core/stats.py +0 -0
  67. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/src/git_cai_cli.egg-info/dependency_links.txt +0 -0
  68. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/src/git_cai_cli.egg-info/entry_points.txt +0 -0
  69. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/src/git_cai_cli.egg-info/requires.txt +0 -0
  70. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/src/git_cai_cli.egg-info/top_level.txt +0 -0
  71. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/tests/conftest.py +0 -0
  72. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/tests/integration/test_cli_integration.py +0 -0
  73. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/tests/integration/test_config_integration.py +0 -0
  74. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/tests/integration/test_gitutils_integration.py +0 -0
  75. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/tests/integration/test_options_integration.py +0 -0
  76. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/tests/integration/test_pr_integration.py +0 -0
  77. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/tests/integration/test_squash_integration.py +0 -0
  78. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/tests/unit/test_amend.py +0 -0
  79. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/tests/unit/test_branch_context.py +0 -0
  80. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/tests/unit/test_cli.py +0 -0
  81. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/tests/unit/test_completion.py +0 -0
  82. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/tests/unit/test_config.py +0 -0
  83. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/tests/unit/test_conventional.py +0 -0
  84. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/tests/unit/test_gitutils.py +0 -0
  85. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/tests/unit/test_helptext.py +0 -0
  86. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/tests/unit/test_llm.py +0 -0
  87. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/tests/unit/test_main.py +0 -0
  88. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/tests/unit/test_options.py +0 -0
  89. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/tests/unit/test_pr.py +0 -0
  90. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/tests/unit/test_prompt_loading.py +0 -0
  91. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/tests/unit/test_set_config.py +0 -0
  92. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/tests/unit/test_spinner.py +0 -0
  93. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/tests/unit/test_squash.py +0 -0
  94. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/tests/unit/test_stats.py +0 -0
  95. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/tests/unit/test_validate.py +0 -0
  96. {git_cai_cli-0.13.5 → git_cai_cli-0.14.0}/uv.lock +0 -0
@@ -66,18 +66,18 @@ check-protected-access-in-special-methods=no
66
66
  # Don’t warn about protected attr access in dunder methods
67
67
 
68
68
  [DESIGN]
69
- max-args=20 # Max arguments per function
69
+ max-args=25 # Max arguments per function
70
70
  max-attributes=12 # Max attributes per class
71
71
  max-branches=30 # Max branches per function
72
- max-locals=60 # Max locals per function
72
+ max-locals=65 # Max locals per function
73
73
  max-returns=10 # Max return statements per function
74
- max-statements=100 # Max total statements per function
74
+ max-statements=120 # Max total statements per function
75
75
  max-public-methods=20 # Max public methods per class
76
76
  min-public-methods=1 # Min public methods per class
77
77
  max-nested-blocks=15 # Max nesting depth
78
78
  max-bool-expr=15 # Max boolean subexpressions in a condition
79
79
  max-parents=7 # Max base classes per class
80
- max-positional-arguments=20 # Max positional arguments per function
80
+ max-positional-arguments=25 # Max positional arguments per function
81
81
 
82
82
  [EXCEPTIONS]
83
83
  overgeneral-exceptions=builtins.BaseException,builtins.Exception
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: git-cai-cli
3
- Version: 0.13.5
3
+ Version: 0.14.0
4
4
  Summary: Use LLM to create git commit messages
5
5
  Author-email: Thorsten Foltz <thorsten.foltz@live.com>
6
6
  License-Expression: MIT
@@ -77,9 +77,12 @@ Currently supported providers:
77
77
  - Seamless integration with Git
78
78
  - Supports multiple LLM providers and models
79
79
  - Global configuration with per-repository overrides
80
+ - Interactive `--init` wizard for first-time setup (provider, token, language, style)
80
81
  - Repository-specific language, style, and model selection
81
82
  - Amend the last commit message with a regenerated one
82
83
  - Conventional Commits format support
84
+ - `Signed-off-by:` (DCO) trailer support via `--signoff`
85
+ - `--print` mode that emits the generated message to stdout for scripting
83
86
  - Change configuration from the command line
84
87
  - Optional commit squashing with automatic summary generation (all, last N, or up to a specific commit)
85
88
  - Pull Request description generator (`--PR`) that summarizes the commits between the current branch and its base
@@ -144,6 +147,19 @@ The syntax is identical to `.gitignore`.
144
147
 
145
148
  ## Configuration
146
149
 
150
+ The fastest way to get started is the interactive wizard:
151
+
152
+ ```sh
153
+ git cai --init # or: git cai -I
154
+ ```
155
+
156
+ It asks for a default provider, language, style, and emoji preference,
157
+ then collects the API key (input is hidden while you type). The wizard
158
+ writes `~/.config/cai/cai_config.yml` and, for providers that need one,
159
+ `~/.config/cai/tokens.yml` with mode `0600`. Existing entries for other
160
+ providers in `tokens.yml` are preserved. `--init` only writes home-scope
161
+ files — use `-g` / `--generate-config` to bootstrap a repo-level config.
162
+
147
163
  On first execution, cai automatically creates the base configuration in your home directory.
148
164
 
149
165
  - Global configuration:
@@ -241,6 +257,7 @@ git cai -g
241
257
  - `pr_prompt_file` – optional path to a custom Markdown prompt for `--PR` (falls back to `~/.config/cai/pr_prompt.md`, then a built-in default)
242
258
  - `stats` – opt in to local-only usage analytics (per-run row in a SQLite DB at `~/.local/share/git-cai/stats.db`); default `false`.
243
259
  No diff content, commit messages, or file paths are stored — only metadata (provider, model, kind, repo name, token counts, latency, settings)
260
+ - `signoff` – append a `Signed-off-by:` trailer (built from git `user.name` / `user.email`) to every commit message; default `false`
244
261
 
245
262
  ---
246
263
 
@@ -259,11 +276,14 @@ In addition to `git cai`, the following options are available:
259
276
  - `-g`, `--generate-config` – generate the default `cai_config.yml` in the current directory
260
277
  - `-H`, `--set-home` – set a config value in home config (`key=value`), always targets `~/.config/cai/`
261
278
  - `-h`, `--help` – show help and available commands
279
+ - `-I`, `--init` – interactive setup wizard (writes home config and tokens.yml)
262
280
  - `-i`, `--install-completion` – install shell completion for bash, zsh, or fish
263
281
  - `-l`, `--list` – list available information. Valid types: `config`, `editor`, `language`, `model`, `path`, `provider`, `style`
264
282
  - `-m`, `--model` – override the model for this invocation (requires `-P`)
283
+ - `-o`, `--signoff` / `--no-signoff` – append a `Signed-off-by:` trailer (uses git `user.name` / `user.email`); applies to commit, amend, and squash modes
265
284
  - `-P`, `--provider` – override the LLM provider for this invocation
266
285
  - `-p`, `--generate-prompts` – generate default `commit_prompt.md` and `squash_prompt.md` in the current directory (for customization)
286
+ - `--print` – print the generated commit message to stdout and exit without committing (commit/amend modes only; mutually exclusive with `-c`)
267
287
  - `-q`, `--sql true|false` – override stats writing for this run (wins over the persisted `stats` config)
268
288
  - `-z`, `--stats` – show local-only usage analytics (commits/squashes/PRs per provider, tokens, average latency)
269
289
  - `--since YYYY-MM-DD` – filter `--stats` to events on or after this date
@@ -383,6 +403,40 @@ git cai --stats --reset-stats # wipe all rows
383
403
 
384
404
  Rows are split by `kind` (`commit`, `amend`, `squash`, `pr`) and capture provider, model, repo name, token counts, real LLM latency, and a snapshot of the active settings (language, style, emoji, temperature, prompt file).
385
405
 
406
+ ### DCO sign-off
407
+
408
+ Projects that require Developer Certificate of Origin sign-off (Linux
409
+ kernel, many CNCF projects) can have cai append the trailer
410
+ automatically:
411
+
412
+ ```sh
413
+ git cai --signoff # one-off
414
+ git cai -o -A # short flag, with amend
415
+ git cai -S signoff=true # enable persistently in the repo config
416
+ ```
417
+
418
+ The trailer is built from your git `user.name` and `user.email`. When
419
+ the message already ends in a trailer block (e.g. an existing
420
+ `Co-authored-by:` or another `Signed-off-by:` line), the new sign-off
421
+ is appended to that block without an extra blank line. Re-running with
422
+ `--signoff` on a message that already carries the same trailer is a
423
+ no-op.
424
+
425
+ ### Print-only output (no commit)
426
+
427
+ `--print` generates the commit message and writes it to stdout instead
428
+ of opening the editor or committing. Useful for scripting:
429
+
430
+ ```sh
431
+ MSG=$(git cai --print)
432
+ git cai --print --conventional --signoff
433
+ ```
434
+
435
+ Diagnostic output (spinner, `--time`, `--debug`) goes to stderr, so the
436
+ command substitution above captures only the message. Limited to commit
437
+ and amend modes. Mutually exclusive with `-c` / `--crazy` (which
438
+ commits immediately).
439
+
386
440
  ### Changing configuration from the CLI
387
441
 
388
442
  Instead of editing YAML files manually, use `--set` or `--set-home` to update config values.
@@ -47,9 +47,12 @@ Currently supported providers:
47
47
  - Seamless integration with Git
48
48
  - Supports multiple LLM providers and models
49
49
  - Global configuration with per-repository overrides
50
+ - Interactive `--init` wizard for first-time setup (provider, token, language, style)
50
51
  - Repository-specific language, style, and model selection
51
52
  - Amend the last commit message with a regenerated one
52
53
  - Conventional Commits format support
54
+ - `Signed-off-by:` (DCO) trailer support via `--signoff`
55
+ - `--print` mode that emits the generated message to stdout for scripting
53
56
  - Change configuration from the command line
54
57
  - Optional commit squashing with automatic summary generation (all, last N, or up to a specific commit)
55
58
  - Pull Request description generator (`--PR`) that summarizes the commits between the current branch and its base
@@ -114,6 +117,19 @@ The syntax is identical to `.gitignore`.
114
117
 
115
118
  ## Configuration
116
119
 
120
+ The fastest way to get started is the interactive wizard:
121
+
122
+ ```sh
123
+ git cai --init # or: git cai -I
124
+ ```
125
+
126
+ It asks for a default provider, language, style, and emoji preference,
127
+ then collects the API key (input is hidden while you type). The wizard
128
+ writes `~/.config/cai/cai_config.yml` and, for providers that need one,
129
+ `~/.config/cai/tokens.yml` with mode `0600`. Existing entries for other
130
+ providers in `tokens.yml` are preserved. `--init` only writes home-scope
131
+ files — use `-g` / `--generate-config` to bootstrap a repo-level config.
132
+
117
133
  On first execution, cai automatically creates the base configuration in your home directory.
118
134
 
119
135
  - Global configuration:
@@ -211,6 +227,7 @@ git cai -g
211
227
  - `pr_prompt_file` – optional path to a custom Markdown prompt for `--PR` (falls back to `~/.config/cai/pr_prompt.md`, then a built-in default)
212
228
  - `stats` – opt in to local-only usage analytics (per-run row in a SQLite DB at `~/.local/share/git-cai/stats.db`); default `false`.
213
229
  No diff content, commit messages, or file paths are stored — only metadata (provider, model, kind, repo name, token counts, latency, settings)
230
+ - `signoff` – append a `Signed-off-by:` trailer (built from git `user.name` / `user.email`) to every commit message; default `false`
214
231
 
215
232
  ---
216
233
 
@@ -229,11 +246,14 @@ In addition to `git cai`, the following options are available:
229
246
  - `-g`, `--generate-config` – generate the default `cai_config.yml` in the current directory
230
247
  - `-H`, `--set-home` – set a config value in home config (`key=value`), always targets `~/.config/cai/`
231
248
  - `-h`, `--help` – show help and available commands
249
+ - `-I`, `--init` – interactive setup wizard (writes home config and tokens.yml)
232
250
  - `-i`, `--install-completion` – install shell completion for bash, zsh, or fish
233
251
  - `-l`, `--list` – list available information. Valid types: `config`, `editor`, `language`, `model`, `path`, `provider`, `style`
234
252
  - `-m`, `--model` – override the model for this invocation (requires `-P`)
253
+ - `-o`, `--signoff` / `--no-signoff` – append a `Signed-off-by:` trailer (uses git `user.name` / `user.email`); applies to commit, amend, and squash modes
235
254
  - `-P`, `--provider` – override the LLM provider for this invocation
236
255
  - `-p`, `--generate-prompts` – generate default `commit_prompt.md` and `squash_prompt.md` in the current directory (for customization)
256
+ - `--print` – print the generated commit message to stdout and exit without committing (commit/amend modes only; mutually exclusive with `-c`)
237
257
  - `-q`, `--sql true|false` – override stats writing for this run (wins over the persisted `stats` config)
238
258
  - `-z`, `--stats` – show local-only usage analytics (commits/squashes/PRs per provider, tokens, average latency)
239
259
  - `--since YYYY-MM-DD` – filter `--stats` to events on or after this date
@@ -353,6 +373,40 @@ git cai --stats --reset-stats # wipe all rows
353
373
 
354
374
  Rows are split by `kind` (`commit`, `amend`, `squash`, `pr`) and capture provider, model, repo name, token counts, real LLM latency, and a snapshot of the active settings (language, style, emoji, temperature, prompt file).
355
375
 
376
+ ### DCO sign-off
377
+
378
+ Projects that require Developer Certificate of Origin sign-off (Linux
379
+ kernel, many CNCF projects) can have cai append the trailer
380
+ automatically:
381
+
382
+ ```sh
383
+ git cai --signoff # one-off
384
+ git cai -o -A # short flag, with amend
385
+ git cai -S signoff=true # enable persistently in the repo config
386
+ ```
387
+
388
+ The trailer is built from your git `user.name` and `user.email`. When
389
+ the message already ends in a trailer block (e.g. an existing
390
+ `Co-authored-by:` or another `Signed-off-by:` line), the new sign-off
391
+ is appended to that block without an extra blank line. Re-running with
392
+ `--signoff` on a message that already carries the same trailer is a
393
+ no-op.
394
+
395
+ ### Print-only output (no commit)
396
+
397
+ `--print` generates the commit message and writes it to stdout instead
398
+ of opening the editor or committing. Useful for scripting:
399
+
400
+ ```sh
401
+ MSG=$(git cai --print)
402
+ git cai --print --conventional --signoff
403
+ ```
404
+
405
+ Diagnostic output (spinner, `--time`, `--debug`) goes to stderr, so the
406
+ command substitution above captures only the message. Limited to commit
407
+ and amend modes. Mutually exclusive with `-c` / `--crazy` (which
408
+ commits immediately).
409
+
356
410
  ### Changing configuration from the CLI
357
411
 
358
412
  Instead of editing YAML files manually, use `--set` or `--set-home` to update config values.
@@ -15,11 +15,14 @@ SYNOPSIS
15
15
  [-F | --full-files | --no-full-files] [-f PATH | --files PATH]
16
16
  [-g | --generate-config]
17
17
  [-H KEY=VALUE | --set-home KEY=VALUE] [-h | --help]
18
+ [-I | --init]
18
19
  [-i | --install-completion]
19
20
  [-l [config|editor|language|model|path|provider|style] |
20
21
  --list [config|editor|language|model|path|provider|style]]
21
22
  [-m MODEL | --model MODEL]
23
+ [-o | --signoff | --no-signoff]
22
24
  [-P PROVIDER | --provider PROVIDER] [-p | --generate-prompts]
25
+ [--print]
23
26
  [-r | --PR] [--base BRANCH]
24
27
  [-S KEY=VALUE | --set KEY=VALUE]
25
28
  [-s [N|HASH] | --squash [N|HASH]]
@@ -46,7 +49,16 @@ git-cai behaves like `git commit`, but with the commit message pre-filled:
46
49
 
47
50
  SETUP
48
51
  -----
49
- First run / configuration:
52
+ Guided setup (recommended):
53
+
54
+ - Run `git cai --init` (or `-I`). The interactive wizard asks for a
55
+ default provider, language, style, and emoji preference, then
56
+ collects the API key (hidden input). It writes
57
+ `~/.config/cai/cai_config.yml` and, for providers that need one,
58
+ `~/.config/cai/tokens.yml` with mode `0600`. Existing token entries
59
+ for other providers are preserved.
60
+
61
+ First run / configuration (manual):
50
62
 
51
63
  - Run `git cai` once. If no config exists yet, git-cai creates:
52
64
  `~/.config/cai/cai_config.yml` (global config) and ensures default prompt files exist:
@@ -248,6 +260,28 @@ git cai -H groq.model=llama-3.3-70b
248
260
  Show a summary of available flags and usage information. When a manual page
249
261
  is installed, the full manual is opened instead.
250
262
 
263
+ -I, --init::
264
+ Run the interactive setup wizard. Bootstraps the home-scope
265
+ configuration only: writes `~/.config/cai/cai_config.yml` and (for
266
+ providers that require one) `~/.config/cai/tokens.yml` with mode
267
+ `0600`.
268
+ +
269
+ The wizard asks for a default provider, language, commit-message
270
+ style, whether to use emoji, and — for providers other than `ollama`
271
+ — the API key. Input for the API key is hidden while you type.
272
+ +
273
+ If `~/.config/cai/cai_config.yml` already exists, the wizard prompts
274
+ before overwriting it. Existing entries in `tokens.yml` for other
275
+ providers are preserved; only the chosen provider's key is updated.
276
+ +
277
+ For repository-level configuration use `-g`/`--generate-config`
278
+ instead — `--init` only writes home-scope files.
279
+ +
280
+ ----
281
+ git cai --init
282
+ git cai -I
283
+ ----
284
+
251
285
  -i, --install-completion::
252
286
  Install shell completion for `git cai`. Supports bash, zsh, and fish.
253
287
  Completions cover all flags and provider names for `--provider`.
@@ -286,6 +320,33 @@ git cai -P anthropic -m claude-haiku-4-5
286
320
  git cai -P ollama -m mistral
287
321
  ----
288
322
 
323
+ -o, --signoff / --no-signoff::
324
+ Append a `Signed-off-by:` trailer to the generated commit message
325
+ using your configured git `user.name` and `user.email`. Applies in
326
+ COMMIT, AMEND, and SQUASH modes.
327
+ +
328
+ If the message body already ends in a trailer block (e.g. an existing
329
+ `Co-authored-by:` or `Signed-off-by:` line) the new sign-off is added
330
+ to that block without an extra blank line. A duplicate trailer for the
331
+ same identity is detected and skipped, so re-running with
332
+ `--signoff` on a message that already carries one is a no-op.
333
+ +
334
+ Use `--no-signoff` to explicitly disable for the current run when the
335
+ persisted config has `signoff: true`. To enable permanently:
336
+ +
337
+ ----
338
+ git cai -S signoff=true
339
+ ----
340
+ +
341
+ Errors out if either git `user.name` or `user.email` is empty.
342
+ +
343
+ ----
344
+ git cai --signoff
345
+ git cai -o -c
346
+ git cai -A --signoff
347
+ git cai -s --signoff
348
+ ----
349
+
289
350
  -P, --provider PROVIDER::
290
351
  Override the LLM provider for this invocation. The model and temperature
291
352
  from the configuration for that provider are used unless `--model` is also
@@ -310,6 +371,27 @@ overwrites.
310
371
  git cai -p
311
372
  ----
312
373
 
374
+ --print::
375
+ Generate the commit message, print it to stdout, and exit without
376
+ opening the editor and without committing. Useful for scripting:
377
+ +
378
+ ----
379
+ MSG=$(git cai --print)
380
+ ----
381
+ +
382
+ Composes with `--conventional`, `--signoff`, `--branch`, `--context`,
383
+ `--provider`, `--model`, and the other modifiers — the printed output
384
+ reflects every modifier as if you were committing.
385
+ +
386
+ Limited to COMMIT and AMEND modes. Mutually exclusive with `--crazy`
387
+ (the two flags are contradictory: `--crazy` commits immediately,
388
+ `--print` does not commit at all).
389
+ +
390
+ Diagnostic output (the spinner, `--time` measurements, `--debug` logs)
391
+ goes to stderr, so command substitution captures only the message.
392
+ Stats recording is unaffected — generations made with `--print` are
393
+ still recorded when stats are enabled.
394
+
313
395
  -q, --sql VALUE::
314
396
  Per-invocation override for `stats.enabled`. VALUE is `true` or `false`
315
397
  (also accepts `yes/no`, `on/off`, `1/0`). Wins over the persisted config
@@ -2,12 +2,12 @@
2
2
  .\" Title: git-cai
3
3
  .\" Author: Thorsten Foltz
4
4
  .\" Generator: Asciidoctor 2.0.26
5
- .\" Date: 2026-05-12
5
+ .\" Date: 2026-05-25
6
6
  .\" Manual: \ \&
7
7
  .\" Source: \ \&
8
8
  .\" Language: English
9
9
  .\"
10
- .TH "GIT\-CAI" "1" "2026-05-12" "\ \&" "\ \&"
10
+ .TH "GIT\-CAI" "1" "2026-05-25" "\ \&" "\ \&"
11
11
  .ie \n(.g .ds Aq \(aq
12
12
  .el .ds Aq '
13
13
  .ss \n[.ss] 0
@@ -37,11 +37,14 @@ git-cai \- AI\-powered commit message generator
37
37
  [\-F | \-\-full\-files | \-\-no\-full\-files] [\-f PATH | \-\-files PATH]
38
38
  [\-g | \-\-generate\-config]
39
39
  [\-H KEY=VALUE | \-\-set\-home KEY=VALUE] [\-h | \-\-help]
40
+ [\-I | \-\-init]
40
41
  [\-i | \-\-install\-completion]
41
42
  [\-l [config|editor|language|model|path|provider|style] |
42
43
  \-\-list [config|editor|language|model|path|provider|style]]
43
44
  [\-m MODEL | \-\-model MODEL]
45
+ [\-o | \-\-signoff | \-\-no\-signoff]
44
46
  [\-P PROVIDER | \-\-provider PROVIDER] [\-p | \-\-generate\-prompts]
47
+ [\-\-print]
45
48
  [\-r | \-\-PR] [\-\-base BRANCH]
46
49
  [\-S KEY=VALUE | \-\-set KEY=VALUE]
47
50
  [\-s [N|HASH] | \-\-squash [N|HASH]]
@@ -96,7 +99,25 @@ It opens your configured Git editor so you can review/edit before committing.
96
99
  .RE
97
100
  .SH "SETUP"
98
101
  .sp
99
- First run / configuration:
102
+ Guided setup (recommended):
103
+ .sp
104
+ .RS 4
105
+ .ie n \{\
106
+ \h'-04'\(bu\h'+03'\c
107
+ .\}
108
+ .el \{\
109
+ . sp -1
110
+ . IP \(bu 2.3
111
+ .\}
112
+ Run \f(CRgit cai \-\-init\fP (or \f(CR\-I\fP). The interactive wizard asks for a
113
+ default provider, language, style, and emoji preference, then
114
+ collects the API key (hidden input). It writes
115
+ \f(CR~/.config/cai/cai_config.yml\fP and, for providers that need one,
116
+ \f(CR~/.config/cai/tokens.yml\fP with mode \f(CR0600\fP. Existing token entries
117
+ for other providers are preserved.
118
+ .RE
119
+ .sp
120
+ First run / configuration (manual):
100
121
  .sp
101
122
  .RS 4
102
123
  .ie n \{\
@@ -442,6 +463,34 @@ Show a summary of available flags and usage information. When a manual page
442
463
  is installed, the full manual is opened instead.
443
464
  .RE
444
465
  .sp
466
+ \-I, \-\-init
467
+ .RS 4
468
+ Run the interactive setup wizard. Bootstraps the home\-scope
469
+ configuration only: writes \f(CR~/.config/cai/cai_config.yml\fP and (for
470
+ providers that require one) \f(CR~/.config/cai/tokens.yml\fP with mode
471
+ \f(CR0600\fP.
472
+ .sp
473
+ The wizard asks for a default provider, language, commit\-message
474
+ style, whether to use emoji, and — for providers other than \f(CRollama\fP
475
+ — the API key. Input for the API key is hidden while you type.
476
+ .sp
477
+ If \f(CR~/.config/cai/cai_config.yml\fP already exists, the wizard prompts
478
+ before overwriting it. Existing entries in \f(CRtokens.yml\fP for other
479
+ providers are preserved; only the chosen provider\(cqs key is updated.
480
+ .sp
481
+ For repository\-level configuration use \f(CR\-g\fP/\f(CR\-\-generate\-config\fP
482
+ instead — \f(CR\-\-init\fP only writes home\-scope files.
483
+ .sp
484
+ .if n .RS 4
485
+ .nf
486
+ .fam C
487
+ git cai \-\-init
488
+ git cai \-I
489
+ .fam
490
+ .fi
491
+ .if n .RE
492
+ .RE
493
+ .sp
445
494
  \-i, \-\-install\-completion
446
495
  .RS 4
447
496
  Install shell completion for \f(CRgit cai\fP. Supports bash, zsh, and fish.
@@ -498,6 +547,43 @@ git cai \-P ollama \-m mistral
498
547
  .if n .RE
499
548
  .RE
500
549
  .sp
550
+ \-o, \-\-signoff / \-\-no\-signoff
551
+ .RS 4
552
+ Append a \f(CRSigned\-off\-by:\fP trailer to the generated commit message
553
+ using your configured git \f(CRuser.name\fP and \f(CRuser.email\fP. Applies in
554
+ COMMIT, AMEND, and SQUASH modes.
555
+ .sp
556
+ If the message body already ends in a trailer block (e.g. an existing
557
+ \f(CRCo\-authored\-by:\fP or \f(CRSigned\-off\-by:\fP line) the new sign\-off is added
558
+ to that block without an extra blank line. A duplicate trailer for the
559
+ same identity is detected and skipped, so re\-running with
560
+ \f(CR\-\-signoff\fP on a message that already carries one is a no\-op.
561
+ .sp
562
+ Use \f(CR\-\-no\-signoff\fP to explicitly disable for the current run when the
563
+ persisted config has \f(CRsignoff: true\fP. To enable permanently:
564
+ .sp
565
+ .if n .RS 4
566
+ .nf
567
+ .fam C
568
+ git cai \-S signoff=true
569
+ .fam
570
+ .fi
571
+ .if n .RE
572
+ .sp
573
+ Errors out if either git \f(CRuser.name\fP or \f(CRuser.email\fP is empty.
574
+ .sp
575
+ .if n .RS 4
576
+ .nf
577
+ .fam C
578
+ git cai \-\-signoff
579
+ git cai \-o \-c
580
+ git cai \-A \-\-signoff
581
+ git cai \-s \-\-signoff
582
+ .fam
583
+ .fi
584
+ .if n .RE
585
+ .RE
586
+ .sp
501
587
  \-P, \-\-provider PROVIDER
502
588
  .RS 4
503
589
  Override the LLM provider for this invocation. The model and temperature
@@ -534,6 +620,33 @@ git cai \-p
534
620
  .if n .RE
535
621
  .RE
536
622
  .sp
623
+ \-\-print
624
+ .RS 4
625
+ Generate the commit message, print it to stdout, and exit without
626
+ opening the editor and without committing. Useful for scripting:
627
+ .sp
628
+ .if n .RS 4
629
+ .nf
630
+ .fam C
631
+ MSG=$(git cai \-\-print)
632
+ .fam
633
+ .fi
634
+ .if n .RE
635
+ .sp
636
+ Composes with \f(CR\-\-conventional\fP, \f(CR\-\-signoff\fP, \f(CR\-\-branch\fP, \f(CR\-\-context\fP,
637
+ \f(CR\-\-provider\fP, \f(CR\-\-model\fP, and the other modifiers — the printed output
638
+ reflects every modifier as if you were committing.
639
+ .sp
640
+ Limited to COMMIT and AMEND modes. Mutually exclusive with \f(CR\-\-crazy\fP
641
+ (the two flags are contradictory: \f(CR\-\-crazy\fP commits immediately,
642
+ \f(CR\-\-print\fP does not commit at all).
643
+ .sp
644
+ Diagnostic output (the spinner, \f(CR\-\-time\fP measurements, \f(CR\-\-debug\fP logs)
645
+ goes to stderr, so command substitution captures only the message.
646
+ Stats recording is unaffected — generations made with \f(CR\-\-print\fP are
647
+ still recorded when stats are enabled.
648
+ .RE
649
+ .sp
537
650
  \-q, \-\-sql VALUE
538
651
  .RS 4
539
652
  Per\-invocation override for \f(CRstats.enabled\fP. VALUE is \f(CRtrue\fP or \f(CRfalse\fP
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '0.13.5'
22
- __version_tuple__ = version_tuple = (0, 13, 5)
21
+ __version__ = version = '0.14.0'
22
+ __version_tuple__ = version_tuple = (0, 14, 0)
23
23
 
24
- __commit_id__ = commit_id = 'g310dca5e3'
24
+ __commit_id__ = commit_id = 'ge467c3583'
@@ -162,6 +162,23 @@ def callback( # pylint: disable=too-many-arguments,too-many-positional-argument
162
162
  "--reset-stats",
163
163
  help="Delete all rows from the local stats DB.",
164
164
  ),
165
+ init: bool = typer.Option(
166
+ False,
167
+ "--init",
168
+ "-I",
169
+ help="Interactive setup wizard: writes ~/.config/cai/cai_config.yml and tokens.yml.",
170
+ ),
171
+ signoff: bool | None = typer.Option(
172
+ None,
173
+ "--signoff/--no-signoff",
174
+ "-o",
175
+ help="Append a `Signed-off-by:` trailer using git user.name/user.email. Use --no-signoff to disable when the persisted config has it enabled.",
176
+ ),
177
+ print_only: bool = typer.Option(
178
+ False,
179
+ "--print",
180
+ help="Generate the commit message, print it to stdout, and exit without committing.",
181
+ ),
165
182
  ):
166
183
  """
167
184
  CLI entry point for git-cai-cli.
@@ -183,6 +200,7 @@ def callback( # pylint: disable=too-many-arguments,too-many-positional-argument
183
200
 
184
201
  mode = resolve_mode(
185
202
  amend=amend,
203
+ init=init,
186
204
  list_flag=list_flag,
187
205
  pr=pr,
188
206
  squash=squash,
@@ -212,6 +230,8 @@ def callback( # pylint: disable=too-many-arguments,too-many-positional-argument
212
230
  time_flag=time_flag,
213
231
  context=context,
214
232
  files=files,
233
+ print_only=print_only,
234
+ crazy=crazy,
215
235
  )
216
236
 
217
237
  if generate_config:
@@ -289,6 +309,8 @@ def callback( # pylint: disable=too-many-arguments,too-many-positional-argument
289
309
  stats_since=stats_since,
290
310
  stats_json=stats_json,
291
311
  stats_reset=stats_reset,
312
+ signoff=signoff,
313
+ print_only=print_only,
292
314
  )
293
315
 
294
316
 
@@ -26,12 +26,15 @@ Flags:
26
26
  -g, --generate-config Generate default cai_config.yml in the current directory
27
27
  -H, --set-home KEY=VALUE Set a config value in home config (~/.config/cai/)
28
28
  -h, --help Show this help message or opens manual
29
+ -I, --init Interactive setup wizard (writes home config and tokens.yml)
29
30
  -i, --install-completion Install shell completion for git-cai
30
31
  -l, --list [TYPE] List information. TYPE: config, editor, language,
31
32
  model, path, provider, style
32
33
  -m, --model NAME Override model for this invocation (requires --provider)
34
+ -o, --signoff Append a `Signed-off-by:` trailer (git user.name / user.email)
33
35
  -P, --provider NAME Override LLM provider for this invocation
34
36
  -p, --generate-prompts Generate default commit/squash/full_files/pr prompt files
37
+ --print Print the generated commit message to stdout and exit (no commit)
35
38
  -q, --sql true|false Override stats writing for this run (wins over config)
36
39
  -r, --PR Generate a Pull Request description from the commits on this branch
37
40
  --base BRANCH Base branch for --PR (overrides auto-detection)