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.
@@ -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.