laminate-cli 0.1.0__tar.gz → 0.1.2__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.
- laminate_cli-0.1.2/LICENSE +7 -0
- laminate_cli-0.1.2/PKG-INFO +314 -0
- laminate_cli-0.1.2/README.md +290 -0
- laminate_cli-0.1.2/laminate_cli.egg-info/PKG-INFO +314 -0
- laminate_cli-0.1.2/pyproject.toml +45 -0
- laminate_cli-0.1.0/LICENSE +0 -674
- laminate_cli-0.1.0/PKG-INFO +0 -29
- laminate_cli-0.1.0/README.md +0 -16
- laminate_cli-0.1.0/laminate_cli.egg-info/PKG-INFO +0 -29
- laminate_cli-0.1.0/pyproject.toml +0 -23
- {laminate_cli-0.1.0 → laminate_cli-0.1.2}/laminate/__init__.py +0 -0
- {laminate_cli-0.1.0 → laminate_cli-0.1.2}/laminate/categorize.py +0 -0
- {laminate_cli-0.1.0 → laminate_cli-0.1.2}/laminate/cli.py +0 -0
- {laminate_cli-0.1.0 → laminate_cli-0.1.2}/laminate/gitlog.py +0 -0
- {laminate_cli-0.1.0 → laminate_cli-0.1.2}/laminate/llm.py +0 -0
- {laminate_cli-0.1.0 → laminate_cli-0.1.2}/laminate/render.py +0 -0
- {laminate_cli-0.1.0 → laminate_cli-0.1.2}/laminate_cli.egg-info/SOURCES.txt +0 -0
- {laminate_cli-0.1.0 → laminate_cli-0.1.2}/laminate_cli.egg-info/dependency_links.txt +0 -0
- {laminate_cli-0.1.0 → laminate_cli-0.1.2}/laminate_cli.egg-info/entry_points.txt +0 -0
- {laminate_cli-0.1.0 → laminate_cli-0.1.2}/laminate_cli.egg-info/requires.txt +0 -0
- {laminate_cli-0.1.0 → laminate_cli-0.1.2}/laminate_cli.egg-info/top_level.txt +0 -0
- {laminate_cli-0.1.0 → laminate_cli-0.1.2}/setup.cfg +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
Copyright © 2026 Apleut
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
4
|
+
|
|
5
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
6
|
+
|
|
7
|
+
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: laminate-cli
|
|
3
|
+
Version: 0.1.2
|
|
4
|
+
Summary: Generate release-ready changelogs from git history using a local LLM
|
|
5
|
+
Author-email: Apleut <me@apleut.dev>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://apleut.dev
|
|
8
|
+
Project-URL: Repository, https://github.com/Apleut/Laminate
|
|
9
|
+
Project-URL: Changelog, https://github.com/Apleut/Laminate/blob/main/CHANGELOG.md
|
|
10
|
+
Classifier: Development Status :: 3 - Alpha
|
|
11
|
+
Classifier: Environment :: Console
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Topic :: Software Development :: Documentation
|
|
15
|
+
Classifier: Topic :: Software Development :: Version Control :: Git
|
|
16
|
+
Requires-Python: >=3.10
|
|
17
|
+
Description-Content-Type: text/markdown
|
|
18
|
+
License-File: LICENSE
|
|
19
|
+
Requires-Dist: llama-cpp-python
|
|
20
|
+
Requires-Dist: pydantic
|
|
21
|
+
Requires-Dist: typer
|
|
22
|
+
Requires-Dist: rich
|
|
23
|
+
Dynamic: license-file
|
|
24
|
+
|
|
25
|
+
<div style="text-align: center;">
|
|
26
|
+
<img src="assets/laminate-logo.svg" alt="Laminate Logo" width="200">
|
|
27
|
+
|
|
28
|
+
<h1>Laminate</h1>
|
|
29
|
+
|
|
30
|
+
<h4>
|
|
31
|
+
<a href="https://apleut.dev">My Website</a> ·
|
|
32
|
+
<a href="https://github.com/Apleut/Laminate">GitHub</a> ·
|
|
33
|
+
<a href="https://github.com/Apleut/Laminate/blob/main/CHANGELOG.md">Changelog</a> ·
|
|
34
|
+
<a href="https://github.com/Apleut/Laminate/blob/main/LICENSE">License</a>
|
|
35
|
+
</h4>
|
|
36
|
+
|
|
37
|
+
<hr>
|
|
38
|
+
|
|
39
|
+
</div>
|
|
40
|
+
|
|
41
|
+
> [!WARNING]
|
|
42
|
+
> Laminate is in **early development**. Its output, CLI, and configuration may change between releases.
|
|
43
|
+
|
|
44
|
+
A CLI that turns your Git history into **release-ready changelogs using a local LLM**.
|
|
45
|
+
|
|
46
|
+
Instead of manually sorting hundreds of commits into `Added`, `Changed`, `Fixed`, and other categories, Laminate reads your Git history, interprets the changes, and generates a clean [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) compatible document.
|
|
47
|
+
|
|
48
|
+
## Features
|
|
49
|
+
|
|
50
|
+
* **Local LLM processing** — your Git history stays on your machine
|
|
51
|
+
* **Release-ready Markdown** — generates structured changelogs
|
|
52
|
+
* **Automatic categorization** — sorts changes into standard changelog categories
|
|
53
|
+
* **Related-commit grouping** — combines related commits into a single entry
|
|
54
|
+
* **No API keys required** — Laminate uses a local GGUF model through `llama-cpp-python`
|
|
55
|
+
* **Git-aware filtering** — filter commits by date or Git commit range
|
|
56
|
+
* **Release support** — generate either an `[Unreleased]` section or a versioned release
|
|
57
|
+
|
|
58
|
+
## Installation
|
|
59
|
+
|
|
60
|
+
### PyPI
|
|
61
|
+
|
|
62
|
+
Install Laminate with pip:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
pip install laminate-cli
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
> [!NOTE]
|
|
69
|
+
> The PyPI package is named `laminate-cli`, while the command and Python package are named `laminate`.
|
|
70
|
+
|
|
71
|
+
### From source
|
|
72
|
+
|
|
73
|
+
Clone the repository and install it locally:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
git clone https://github.com/Apleut/Laminate.git
|
|
77
|
+
cd Laminate
|
|
78
|
+
pip install .
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
For development:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
pip install -e .
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Windows
|
|
88
|
+
|
|
89
|
+
`llama-cpp-python` may require a pre-built CPU wheel on Windows.
|
|
90
|
+
|
|
91
|
+
Install it first with:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
pip install llama-cpp-python --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cpu
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Then install Laminate:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
pip install .
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Model
|
|
104
|
+
|
|
105
|
+
Laminate runs a **local GGUF model** using [`llama-cpp-python`](https://github.com/abetlen/llama-cpp-python).
|
|
106
|
+
|
|
107
|
+
Place exactly one `.gguf` model file in:
|
|
108
|
+
|
|
109
|
+
```text
|
|
110
|
+
models/
|
|
111
|
+
└── your-model.gguf
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
[Phi-4-mini-instruct](https://huggingface.co/unsloth/Phi-4-mini-instruct-GGUF) is a good pick, and is the model used for Laminate's development.
|
|
115
|
+
|
|
116
|
+
Laminate automatically finds and loads the model when it runs.
|
|
117
|
+
|
|
118
|
+
If the `models/` directory does not exist, or contains zero or multiple `.gguf` files, Laminate will stop and explain what needs to be fixed.
|
|
119
|
+
|
|
120
|
+
The model is intentionally kept separate from the package because GGUF models can be large and have different licensing requirements.
|
|
121
|
+
|
|
122
|
+
## Usage
|
|
123
|
+
|
|
124
|
+
From inside a Git repository:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
laminate
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Laminate will read the repository's commit history, categorize the changes, and write the result to:
|
|
131
|
+
|
|
132
|
+
```text
|
|
133
|
+
CHANGELOG.md
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
For example:
|
|
137
|
+
|
|
138
|
+
```text
|
|
139
|
+
Reading commits from working directory...
|
|
140
|
+
Found 42 commits. Categorizing with the local model...
|
|
141
|
+
[categorize] processing batch 1/3 (20 commits)...
|
|
142
|
+
[categorize] processing batch 2/3 (20 commits)...
|
|
143
|
+
[categorize] processing batch 3/3 (2 commits)...
|
|
144
|
+
|
|
145
|
+
Done. Changelog written to CHANGELOG.md
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Options
|
|
149
|
+
|
|
150
|
+
### `--repo`
|
|
151
|
+
|
|
152
|
+
Specify the Git repository to read.
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
laminate --repo ./my-project
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
Defaults to the current working directory.
|
|
159
|
+
|
|
160
|
+
### `--since`
|
|
161
|
+
|
|
162
|
+
Only include commits after a specific date.
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
laminate --since 2026-01-01
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### `--until`
|
|
169
|
+
|
|
170
|
+
Only include commits before a specific date.
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
laminate --until 2026-10-01
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### `--range`
|
|
177
|
+
|
|
178
|
+
Process a specific Git commit range.
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
laminate --range v1.0.0..v1.1.0
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
`--range` overrides `--since` and `--until`.
|
|
185
|
+
|
|
186
|
+
This is particularly useful when generating a changelog for a release.
|
|
187
|
+
|
|
188
|
+
### `--output`
|
|
189
|
+
|
|
190
|
+
Choose where the generated changelog should be written.
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
laminate --output RELEASE_NOTES.md
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
Defaults to:
|
|
197
|
+
|
|
198
|
+
```text
|
|
199
|
+
CHANGELOG.md
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### `--batch-size`
|
|
203
|
+
|
|
204
|
+
Control how many commits are sent to the model at once.
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
laminate --batch-size 25
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
Larger batches can provide more context to the model, while smaller batches can reduce the amount of context required for each request.
|
|
211
|
+
|
|
212
|
+
### `--release`
|
|
213
|
+
|
|
214
|
+
Generate a versioned release section instead of an `[Unreleased]` section.
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
laminate --release 1.1.0
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
The resulting header will look like:
|
|
221
|
+
|
|
222
|
+
```markdown
|
|
223
|
+
## [1.1.0] - 2026-10-03
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
Without `--release`, Laminate generates:
|
|
227
|
+
|
|
228
|
+
```markdown
|
|
229
|
+
## [Unreleased]
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
## Example
|
|
233
|
+
|
|
234
|
+
Suppose your repository contains commits like:
|
|
235
|
+
|
|
236
|
+
```text
|
|
237
|
+
Add user authentication
|
|
238
|
+
Fix crash when configuration is missing
|
|
239
|
+
Refactor authentication middleware
|
|
240
|
+
Remove deprecated login endpoint
|
|
241
|
+
Add password reset flow
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
Instead of producing one entry for every commit, Laminate can turn them into something like:
|
|
245
|
+
|
|
246
|
+
```markdown
|
|
247
|
+
# Changelog
|
|
248
|
+
|
|
249
|
+
All notable changes to this project will be documented in this file.
|
|
250
|
+
|
|
251
|
+
The format is based on Keep a Changelog
|
|
252
|
+
and this project adheres to Semantic Versioning.
|
|
253
|
+
|
|
254
|
+
## [Unreleased]
|
|
255
|
+
|
|
256
|
+
### Added
|
|
257
|
+
|
|
258
|
+
- Added user authentication and password reset functionality.
|
|
259
|
+
|
|
260
|
+
### Changed
|
|
261
|
+
|
|
262
|
+
- Refactored the authentication middleware.
|
|
263
|
+
|
|
264
|
+
### Removed
|
|
265
|
+
|
|
266
|
+
- Removed the deprecated login endpoint.
|
|
267
|
+
|
|
268
|
+
### Fixed
|
|
269
|
+
|
|
270
|
+
- Fixed a crash caused by missing configuration.
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
The exact output depends on the Git history and the model being used.
|
|
274
|
+
|
|
275
|
+
## Supported Categories
|
|
276
|
+
|
|
277
|
+
Laminate currently uses the standard Keep a Changelog categories:
|
|
278
|
+
|
|
279
|
+
* **Added**
|
|
280
|
+
* **Changed**
|
|
281
|
+
* **Deprecated**
|
|
282
|
+
* **Removed**
|
|
283
|
+
* **Fixed**
|
|
284
|
+
* **Security**
|
|
285
|
+
|
|
286
|
+
Categories that contain no changes are omitted from the final document.
|
|
287
|
+
|
|
288
|
+
## Privacy
|
|
289
|
+
|
|
290
|
+
Laminate is designed around **local processing**.
|
|
291
|
+
|
|
292
|
+
Your Git history is passed to the LLM running on your own machine. Laminate does not require an OpenAI, Anthropic, or other hosted AI API.
|
|
293
|
+
|
|
294
|
+
The model you download and use is subject to its own license and terms.
|
|
295
|
+
|
|
296
|
+
## Contributing
|
|
297
|
+
|
|
298
|
+
Contributions, bug reports, and ideas are welcome.
|
|
299
|
+
|
|
300
|
+
If you find a problem with Laminate, please open an issue with:
|
|
301
|
+
|
|
302
|
+
* What you were trying to do
|
|
303
|
+
* The command you ran
|
|
304
|
+
* The relevant error message
|
|
305
|
+
* Your Python version
|
|
306
|
+
* Your operating system
|
|
307
|
+
|
|
308
|
+
Or email me at [me@apleut.dev](me@apleut.dev).
|
|
309
|
+
|
|
310
|
+
For changes to Laminate itself, pull requests are welcome.
|
|
311
|
+
|
|
312
|
+
## License
|
|
313
|
+
|
|
314
|
+
License information will be added before the first stable release.
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
<div style="text-align: center;">
|
|
2
|
+
<img src="assets/laminate-logo.svg" alt="Laminate Logo" width="200">
|
|
3
|
+
|
|
4
|
+
<h1>Laminate</h1>
|
|
5
|
+
|
|
6
|
+
<h4>
|
|
7
|
+
<a href="https://apleut.dev">My Website</a> ·
|
|
8
|
+
<a href="https://github.com/Apleut/Laminate">GitHub</a> ·
|
|
9
|
+
<a href="https://github.com/Apleut/Laminate/blob/main/CHANGELOG.md">Changelog</a> ·
|
|
10
|
+
<a href="https://github.com/Apleut/Laminate/blob/main/LICENSE">License</a>
|
|
11
|
+
</h4>
|
|
12
|
+
|
|
13
|
+
<hr>
|
|
14
|
+
|
|
15
|
+
</div>
|
|
16
|
+
|
|
17
|
+
> [!WARNING]
|
|
18
|
+
> Laminate is in **early development**. Its output, CLI, and configuration may change between releases.
|
|
19
|
+
|
|
20
|
+
A CLI that turns your Git history into **release-ready changelogs using a local LLM**.
|
|
21
|
+
|
|
22
|
+
Instead of manually sorting hundreds of commits into `Added`, `Changed`, `Fixed`, and other categories, Laminate reads your Git history, interprets the changes, and generates a clean [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) compatible document.
|
|
23
|
+
|
|
24
|
+
## Features
|
|
25
|
+
|
|
26
|
+
* **Local LLM processing** — your Git history stays on your machine
|
|
27
|
+
* **Release-ready Markdown** — generates structured changelogs
|
|
28
|
+
* **Automatic categorization** — sorts changes into standard changelog categories
|
|
29
|
+
* **Related-commit grouping** — combines related commits into a single entry
|
|
30
|
+
* **No API keys required** — Laminate uses a local GGUF model through `llama-cpp-python`
|
|
31
|
+
* **Git-aware filtering** — filter commits by date or Git commit range
|
|
32
|
+
* **Release support** — generate either an `[Unreleased]` section or a versioned release
|
|
33
|
+
|
|
34
|
+
## Installation
|
|
35
|
+
|
|
36
|
+
### PyPI
|
|
37
|
+
|
|
38
|
+
Install Laminate with pip:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
pip install laminate-cli
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
> [!NOTE]
|
|
45
|
+
> The PyPI package is named `laminate-cli`, while the command and Python package are named `laminate`.
|
|
46
|
+
|
|
47
|
+
### From source
|
|
48
|
+
|
|
49
|
+
Clone the repository and install it locally:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
git clone https://github.com/Apleut/Laminate.git
|
|
53
|
+
cd Laminate
|
|
54
|
+
pip install .
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
For development:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
pip install -e .
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Windows
|
|
64
|
+
|
|
65
|
+
`llama-cpp-python` may require a pre-built CPU wheel on Windows.
|
|
66
|
+
|
|
67
|
+
Install it first with:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
pip install llama-cpp-python --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cpu
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Then install Laminate:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
pip install .
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Model
|
|
80
|
+
|
|
81
|
+
Laminate runs a **local GGUF model** using [`llama-cpp-python`](https://github.com/abetlen/llama-cpp-python).
|
|
82
|
+
|
|
83
|
+
Place exactly one `.gguf` model file in:
|
|
84
|
+
|
|
85
|
+
```text
|
|
86
|
+
models/
|
|
87
|
+
└── your-model.gguf
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
[Phi-4-mini-instruct](https://huggingface.co/unsloth/Phi-4-mini-instruct-GGUF) is a good pick, and is the model used for Laminate's development.
|
|
91
|
+
|
|
92
|
+
Laminate automatically finds and loads the model when it runs.
|
|
93
|
+
|
|
94
|
+
If the `models/` directory does not exist, or contains zero or multiple `.gguf` files, Laminate will stop and explain what needs to be fixed.
|
|
95
|
+
|
|
96
|
+
The model is intentionally kept separate from the package because GGUF models can be large and have different licensing requirements.
|
|
97
|
+
|
|
98
|
+
## Usage
|
|
99
|
+
|
|
100
|
+
From inside a Git repository:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
laminate
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Laminate will read the repository's commit history, categorize the changes, and write the result to:
|
|
107
|
+
|
|
108
|
+
```text
|
|
109
|
+
CHANGELOG.md
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
For example:
|
|
113
|
+
|
|
114
|
+
```text
|
|
115
|
+
Reading commits from working directory...
|
|
116
|
+
Found 42 commits. Categorizing with the local model...
|
|
117
|
+
[categorize] processing batch 1/3 (20 commits)...
|
|
118
|
+
[categorize] processing batch 2/3 (20 commits)...
|
|
119
|
+
[categorize] processing batch 3/3 (2 commits)...
|
|
120
|
+
|
|
121
|
+
Done. Changelog written to CHANGELOG.md
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## Options
|
|
125
|
+
|
|
126
|
+
### `--repo`
|
|
127
|
+
|
|
128
|
+
Specify the Git repository to read.
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
laminate --repo ./my-project
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Defaults to the current working directory.
|
|
135
|
+
|
|
136
|
+
### `--since`
|
|
137
|
+
|
|
138
|
+
Only include commits after a specific date.
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
laminate --since 2026-01-01
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### `--until`
|
|
145
|
+
|
|
146
|
+
Only include commits before a specific date.
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
laminate --until 2026-10-01
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### `--range`
|
|
153
|
+
|
|
154
|
+
Process a specific Git commit range.
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
laminate --range v1.0.0..v1.1.0
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
`--range` overrides `--since` and `--until`.
|
|
161
|
+
|
|
162
|
+
This is particularly useful when generating a changelog for a release.
|
|
163
|
+
|
|
164
|
+
### `--output`
|
|
165
|
+
|
|
166
|
+
Choose where the generated changelog should be written.
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
laminate --output RELEASE_NOTES.md
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Defaults to:
|
|
173
|
+
|
|
174
|
+
```text
|
|
175
|
+
CHANGELOG.md
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### `--batch-size`
|
|
179
|
+
|
|
180
|
+
Control how many commits are sent to the model at once.
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
laminate --batch-size 25
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
Larger batches can provide more context to the model, while smaller batches can reduce the amount of context required for each request.
|
|
187
|
+
|
|
188
|
+
### `--release`
|
|
189
|
+
|
|
190
|
+
Generate a versioned release section instead of an `[Unreleased]` section.
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
laminate --release 1.1.0
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
The resulting header will look like:
|
|
197
|
+
|
|
198
|
+
```markdown
|
|
199
|
+
## [1.1.0] - 2026-10-03
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
Without `--release`, Laminate generates:
|
|
203
|
+
|
|
204
|
+
```markdown
|
|
205
|
+
## [Unreleased]
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## Example
|
|
209
|
+
|
|
210
|
+
Suppose your repository contains commits like:
|
|
211
|
+
|
|
212
|
+
```text
|
|
213
|
+
Add user authentication
|
|
214
|
+
Fix crash when configuration is missing
|
|
215
|
+
Refactor authentication middleware
|
|
216
|
+
Remove deprecated login endpoint
|
|
217
|
+
Add password reset flow
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
Instead of producing one entry for every commit, Laminate can turn them into something like:
|
|
221
|
+
|
|
222
|
+
```markdown
|
|
223
|
+
# Changelog
|
|
224
|
+
|
|
225
|
+
All notable changes to this project will be documented in this file.
|
|
226
|
+
|
|
227
|
+
The format is based on Keep a Changelog
|
|
228
|
+
and this project adheres to Semantic Versioning.
|
|
229
|
+
|
|
230
|
+
## [Unreleased]
|
|
231
|
+
|
|
232
|
+
### Added
|
|
233
|
+
|
|
234
|
+
- Added user authentication and password reset functionality.
|
|
235
|
+
|
|
236
|
+
### Changed
|
|
237
|
+
|
|
238
|
+
- Refactored the authentication middleware.
|
|
239
|
+
|
|
240
|
+
### Removed
|
|
241
|
+
|
|
242
|
+
- Removed the deprecated login endpoint.
|
|
243
|
+
|
|
244
|
+
### Fixed
|
|
245
|
+
|
|
246
|
+
- Fixed a crash caused by missing configuration.
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
The exact output depends on the Git history and the model being used.
|
|
250
|
+
|
|
251
|
+
## Supported Categories
|
|
252
|
+
|
|
253
|
+
Laminate currently uses the standard Keep a Changelog categories:
|
|
254
|
+
|
|
255
|
+
* **Added**
|
|
256
|
+
* **Changed**
|
|
257
|
+
* **Deprecated**
|
|
258
|
+
* **Removed**
|
|
259
|
+
* **Fixed**
|
|
260
|
+
* **Security**
|
|
261
|
+
|
|
262
|
+
Categories that contain no changes are omitted from the final document.
|
|
263
|
+
|
|
264
|
+
## Privacy
|
|
265
|
+
|
|
266
|
+
Laminate is designed around **local processing**.
|
|
267
|
+
|
|
268
|
+
Your Git history is passed to the LLM running on your own machine. Laminate does not require an OpenAI, Anthropic, or other hosted AI API.
|
|
269
|
+
|
|
270
|
+
The model you download and use is subject to its own license and terms.
|
|
271
|
+
|
|
272
|
+
## Contributing
|
|
273
|
+
|
|
274
|
+
Contributions, bug reports, and ideas are welcome.
|
|
275
|
+
|
|
276
|
+
If you find a problem with Laminate, please open an issue with:
|
|
277
|
+
|
|
278
|
+
* What you were trying to do
|
|
279
|
+
* The command you ran
|
|
280
|
+
* The relevant error message
|
|
281
|
+
* Your Python version
|
|
282
|
+
* Your operating system
|
|
283
|
+
|
|
284
|
+
Or email me at [me@apleut.dev](me@apleut.dev).
|
|
285
|
+
|
|
286
|
+
For changes to Laminate itself, pull requests are welcome.
|
|
287
|
+
|
|
288
|
+
## License
|
|
289
|
+
|
|
290
|
+
License information will be added before the first stable release.
|