laminate-cli 0.1.0__tar.gz → 0.1.1__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.1/PKG-INFO +301 -0
- laminate_cli-0.1.1/README.md +288 -0
- laminate_cli-0.1.1/laminate_cli.egg-info/PKG-INFO +301 -0
- {laminate_cli-0.1.0 → laminate_cli-0.1.1}/pyproject.toml +1 -1
- 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 → laminate_cli-0.1.1}/LICENSE +0 -0
- {laminate_cli-0.1.0 → laminate_cli-0.1.1}/laminate/__init__.py +0 -0
- {laminate_cli-0.1.0 → laminate_cli-0.1.1}/laminate/categorize.py +0 -0
- {laminate_cli-0.1.0 → laminate_cli-0.1.1}/laminate/cli.py +0 -0
- {laminate_cli-0.1.0 → laminate_cli-0.1.1}/laminate/gitlog.py +0 -0
- {laminate_cli-0.1.0 → laminate_cli-0.1.1}/laminate/llm.py +0 -0
- {laminate_cli-0.1.0 → laminate_cli-0.1.1}/laminate/render.py +0 -0
- {laminate_cli-0.1.0 → laminate_cli-0.1.1}/laminate_cli.egg-info/SOURCES.txt +0 -0
- {laminate_cli-0.1.0 → laminate_cli-0.1.1}/laminate_cli.egg-info/dependency_links.txt +0 -0
- {laminate_cli-0.1.0 → laminate_cli-0.1.1}/laminate_cli.egg-info/entry_points.txt +0 -0
- {laminate_cli-0.1.0 → laminate_cli-0.1.1}/laminate_cli.egg-info/requires.txt +0 -0
- {laminate_cli-0.1.0 → laminate_cli-0.1.1}/laminate_cli.egg-info/top_level.txt +0 -0
- {laminate_cli-0.1.0 → laminate_cli-0.1.1}/setup.cfg +0 -0
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: laminate-cli
|
|
3
|
+
Version: 0.1.1
|
|
4
|
+
Summary: Generate release-ready changelogs from git history using a local LLM
|
|
5
|
+
Requires-Python: >=3.10
|
|
6
|
+
Description-Content-Type: text/markdown
|
|
7
|
+
License-File: LICENSE
|
|
8
|
+
Requires-Dist: llama-cpp-python
|
|
9
|
+
Requires-Dist: pydantic
|
|
10
|
+
Requires-Dist: typer
|
|
11
|
+
Requires-Dist: rich
|
|
12
|
+
Dynamic: license-file
|
|
13
|
+
|
|
14
|
+
<div style="text-align: center;">
|
|
15
|
+
<img src="assets/laminate-logo.svg" alt="Laminate Logo" width="200">
|
|
16
|
+
|
|
17
|
+
<h1>Laminate</h1>
|
|
18
|
+
|
|
19
|
+
<h4>
|
|
20
|
+
<a href="https://apleut.dev">My Website</a> ·
|
|
21
|
+
<a href="CHANGELOG.md">Changelog</a>
|
|
22
|
+
</h4>
|
|
23
|
+
|
|
24
|
+
<hr>
|
|
25
|
+
|
|
26
|
+
</div>
|
|
27
|
+
|
|
28
|
+
> [!WARNING]
|
|
29
|
+
> Laminate is in **early development**. Its output, CLI, and configuration may change between releases.
|
|
30
|
+
|
|
31
|
+
A CLI that turns your Git history into **release-ready changelogs using a local LLM**.
|
|
32
|
+
|
|
33
|
+
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.
|
|
34
|
+
|
|
35
|
+
## Features
|
|
36
|
+
|
|
37
|
+
* 🤖 **Local LLM processing** — your Git history stays on your machine
|
|
38
|
+
* 📝 **Release-ready Markdown** — generates structured changelogs
|
|
39
|
+
* 🗂️ **Automatic categorization** — sorts changes into standard changelog categories
|
|
40
|
+
* 🧩 **Related-commit grouping** — combines related commits into a single entry
|
|
41
|
+
* 📦 **Batch processing** — process large repositories without sending the entire history to the model at once
|
|
42
|
+
* 🔒 **No API keys required** — Laminate uses a local GGUF model through `llama-cpp-python`
|
|
43
|
+
* 🛠️ **Git-aware filtering** — filter commits by date or Git commit range
|
|
44
|
+
* 🚀 **Release support** — generate either an `[Unreleased]` section or a versioned release
|
|
45
|
+
|
|
46
|
+
## Installation
|
|
47
|
+
|
|
48
|
+
### PyPI
|
|
49
|
+
|
|
50
|
+
Install Laminate with pip:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
pip install laminate-cli
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
> **Note:** The PyPI package is named `laminate-cli`, while the command and Python package are named `laminate`.
|
|
57
|
+
|
|
58
|
+
### From source
|
|
59
|
+
|
|
60
|
+
Clone the repository and install it locally:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
git clone https://github.com/Apleut/Laminate.git
|
|
64
|
+
cd Laminate
|
|
65
|
+
pip install .
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
For development:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
pip install -e .
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Windows
|
|
75
|
+
|
|
76
|
+
`llama-cpp-python` may require a pre-built CPU wheel on Windows.
|
|
77
|
+
|
|
78
|
+
Install it first with:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
pip install llama-cpp-python --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cpu
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Then install Laminate:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
pip install .
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Model
|
|
91
|
+
|
|
92
|
+
Laminate runs a **local GGUF model** using [`llama-cpp-python`](https://github.com/abetlen/llama-cpp-python).
|
|
93
|
+
|
|
94
|
+
Place exactly one `.gguf` model file in:
|
|
95
|
+
|
|
96
|
+
```text
|
|
97
|
+
models/
|
|
98
|
+
└── your-model.gguf
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
[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.
|
|
102
|
+
|
|
103
|
+
Laminate automatically finds and loads the model when it runs.
|
|
104
|
+
|
|
105
|
+
If the `models/` directory does not exist, or contains zero or multiple `.gguf` files, Laminate will stop and explain what needs to be fixed.
|
|
106
|
+
|
|
107
|
+
The model is intentionally kept separate from the package because GGUF models can be large and have different licensing requirements.
|
|
108
|
+
|
|
109
|
+
## Usage
|
|
110
|
+
|
|
111
|
+
From inside a Git repository:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
laminate
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Laminate will read the repository's commit history, categorize the changes, and write the result to:
|
|
118
|
+
|
|
119
|
+
```text
|
|
120
|
+
CHANGELOG.md
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
For example:
|
|
124
|
+
|
|
125
|
+
```text
|
|
126
|
+
Reading commits from working directory...
|
|
127
|
+
Found 42 commits. Categorizing with the local model...
|
|
128
|
+
[categorize] processing batch 1/3 (20 commits)...
|
|
129
|
+
[categorize] processing batch 2/3 (20 commits)...
|
|
130
|
+
[categorize] processing batch 3/3 (2 commits)...
|
|
131
|
+
|
|
132
|
+
Done. Changelog written to CHANGELOG.md
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Options
|
|
136
|
+
|
|
137
|
+
### `--repo`
|
|
138
|
+
|
|
139
|
+
Specify the Git repository to read.
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
laminate --repo ./my-project
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Defaults to the current working directory.
|
|
146
|
+
|
|
147
|
+
### `--since`
|
|
148
|
+
|
|
149
|
+
Only include commits after a specific date.
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
laminate --since 2026-01-01
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### `--until`
|
|
156
|
+
|
|
157
|
+
Only include commits before a specific date.
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
laminate --until 2026-10-01
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### `--range`
|
|
164
|
+
|
|
165
|
+
Process a specific Git commit range.
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
laminate --range v1.0.0..v1.1.0
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
`--range` overrides `--since` and `--until`.
|
|
172
|
+
|
|
173
|
+
This is particularly useful when generating a changelog for a release.
|
|
174
|
+
|
|
175
|
+
### `--output`
|
|
176
|
+
|
|
177
|
+
Choose where the generated changelog should be written.
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
laminate --output RELEASE_NOTES.md
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
Defaults to:
|
|
184
|
+
|
|
185
|
+
```text
|
|
186
|
+
CHANGELOG.md
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### `--batch-size`
|
|
190
|
+
|
|
191
|
+
Control how many commits are sent to the model at once.
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
laminate --batch-size 25
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
Larger batches can provide more context to the model, while smaller batches can reduce the amount of context required for each request.
|
|
198
|
+
|
|
199
|
+
### `--release`
|
|
200
|
+
|
|
201
|
+
Generate a versioned release section instead of an `[Unreleased]` section.
|
|
202
|
+
|
|
203
|
+
```bash
|
|
204
|
+
laminate --release 1.1.0
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
The resulting header will look like:
|
|
208
|
+
|
|
209
|
+
```markdown
|
|
210
|
+
## [1.1.0] - 2026-10-03
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
Without `--release`, Laminate generates:
|
|
214
|
+
|
|
215
|
+
```markdown
|
|
216
|
+
## [Unreleased]
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
## Example
|
|
220
|
+
|
|
221
|
+
Suppose your repository contains commits like:
|
|
222
|
+
|
|
223
|
+
```text
|
|
224
|
+
Add user authentication
|
|
225
|
+
Fix crash when configuration is missing
|
|
226
|
+
Refactor authentication middleware
|
|
227
|
+
Remove deprecated login endpoint
|
|
228
|
+
Add password reset flow
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
Instead of producing one entry for every commit, Laminate can turn them into something like:
|
|
232
|
+
|
|
233
|
+
```markdown
|
|
234
|
+
# Changelog
|
|
235
|
+
|
|
236
|
+
All notable changes to this project will be documented in this file.
|
|
237
|
+
|
|
238
|
+
The format is based on Keep a Changelog
|
|
239
|
+
and this project adheres to Semantic Versioning.
|
|
240
|
+
|
|
241
|
+
## [Unreleased]
|
|
242
|
+
|
|
243
|
+
### Added
|
|
244
|
+
|
|
245
|
+
- Added user authentication and password reset functionality.
|
|
246
|
+
|
|
247
|
+
### Changed
|
|
248
|
+
|
|
249
|
+
- Refactored the authentication middleware.
|
|
250
|
+
|
|
251
|
+
### Removed
|
|
252
|
+
|
|
253
|
+
- Removed the deprecated login endpoint.
|
|
254
|
+
|
|
255
|
+
### Fixed
|
|
256
|
+
|
|
257
|
+
- Fixed a crash caused by missing configuration.
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
The exact output depends on the Git history and the model being used.
|
|
261
|
+
|
|
262
|
+
## Supported Categories
|
|
263
|
+
|
|
264
|
+
Laminate currently uses the standard Keep a Changelog categories:
|
|
265
|
+
|
|
266
|
+
* **Added**
|
|
267
|
+
* **Changed**
|
|
268
|
+
* **Deprecated**
|
|
269
|
+
* **Removed**
|
|
270
|
+
* **Fixed**
|
|
271
|
+
* **Security**
|
|
272
|
+
|
|
273
|
+
Categories that contain no changes are omitted from the final document.
|
|
274
|
+
|
|
275
|
+
## Privacy
|
|
276
|
+
|
|
277
|
+
Laminate is designed around **local processing**.
|
|
278
|
+
|
|
279
|
+
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.
|
|
280
|
+
|
|
281
|
+
The model you download and use is subject to its own license and terms.
|
|
282
|
+
|
|
283
|
+
## Contributing
|
|
284
|
+
|
|
285
|
+
Contributions, bug reports, and ideas are welcome.
|
|
286
|
+
|
|
287
|
+
If you find a problem with Laminate, please open an issue with:
|
|
288
|
+
|
|
289
|
+
* What you were trying to do
|
|
290
|
+
* The command you ran
|
|
291
|
+
* The relevant error message
|
|
292
|
+
* Your Python version
|
|
293
|
+
* Your operating system
|
|
294
|
+
|
|
295
|
+
Or email me at [me@apleut.dev](me@apleut.dev).
|
|
296
|
+
|
|
297
|
+
For changes to Laminate itself, pull requests are welcome.
|
|
298
|
+
|
|
299
|
+
## License
|
|
300
|
+
|
|
301
|
+
License information will be added before the first stable release.
|
|
@@ -0,0 +1,288 @@
|
|
|
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="CHANGELOG.md">Changelog</a>
|
|
9
|
+
</h4>
|
|
10
|
+
|
|
11
|
+
<hr>
|
|
12
|
+
|
|
13
|
+
</div>
|
|
14
|
+
|
|
15
|
+
> [!WARNING]
|
|
16
|
+
> Laminate is in **early development**. Its output, CLI, and configuration may change between releases.
|
|
17
|
+
|
|
18
|
+
A CLI that turns your Git history into **release-ready changelogs using a local LLM**.
|
|
19
|
+
|
|
20
|
+
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.
|
|
21
|
+
|
|
22
|
+
## Features
|
|
23
|
+
|
|
24
|
+
* 🤖 **Local LLM processing** — your Git history stays on your machine
|
|
25
|
+
* 📝 **Release-ready Markdown** — generates structured changelogs
|
|
26
|
+
* 🗂️ **Automatic categorization** — sorts changes into standard changelog categories
|
|
27
|
+
* 🧩 **Related-commit grouping** — combines related commits into a single entry
|
|
28
|
+
* 📦 **Batch processing** — process large repositories without sending the entire history to the model at once
|
|
29
|
+
* 🔒 **No API keys required** — Laminate uses a local GGUF model through `llama-cpp-python`
|
|
30
|
+
* 🛠️ **Git-aware filtering** — filter commits by date or Git commit range
|
|
31
|
+
* 🚀 **Release support** — generate either an `[Unreleased]` section or a versioned release
|
|
32
|
+
|
|
33
|
+
## Installation
|
|
34
|
+
|
|
35
|
+
### PyPI
|
|
36
|
+
|
|
37
|
+
Install Laminate with pip:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
pip install laminate-cli
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
> **Note:** The PyPI package is named `laminate-cli`, while the command and Python package are named `laminate`.
|
|
44
|
+
|
|
45
|
+
### From source
|
|
46
|
+
|
|
47
|
+
Clone the repository and install it locally:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
git clone https://github.com/Apleut/Laminate.git
|
|
51
|
+
cd Laminate
|
|
52
|
+
pip install .
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
For development:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
pip install -e .
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Windows
|
|
62
|
+
|
|
63
|
+
`llama-cpp-python` may require a pre-built CPU wheel on Windows.
|
|
64
|
+
|
|
65
|
+
Install it first with:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
pip install llama-cpp-python --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cpu
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Then install Laminate:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
pip install .
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Model
|
|
78
|
+
|
|
79
|
+
Laminate runs a **local GGUF model** using [`llama-cpp-python`](https://github.com/abetlen/llama-cpp-python).
|
|
80
|
+
|
|
81
|
+
Place exactly one `.gguf` model file in:
|
|
82
|
+
|
|
83
|
+
```text
|
|
84
|
+
models/
|
|
85
|
+
└── your-model.gguf
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
[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.
|
|
89
|
+
|
|
90
|
+
Laminate automatically finds and loads the model when it runs.
|
|
91
|
+
|
|
92
|
+
If the `models/` directory does not exist, or contains zero or multiple `.gguf` files, Laminate will stop and explain what needs to be fixed.
|
|
93
|
+
|
|
94
|
+
The model is intentionally kept separate from the package because GGUF models can be large and have different licensing requirements.
|
|
95
|
+
|
|
96
|
+
## Usage
|
|
97
|
+
|
|
98
|
+
From inside a Git repository:
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
laminate
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Laminate will read the repository's commit history, categorize the changes, and write the result to:
|
|
105
|
+
|
|
106
|
+
```text
|
|
107
|
+
CHANGELOG.md
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
For example:
|
|
111
|
+
|
|
112
|
+
```text
|
|
113
|
+
Reading commits from working directory...
|
|
114
|
+
Found 42 commits. Categorizing with the local model...
|
|
115
|
+
[categorize] processing batch 1/3 (20 commits)...
|
|
116
|
+
[categorize] processing batch 2/3 (20 commits)...
|
|
117
|
+
[categorize] processing batch 3/3 (2 commits)...
|
|
118
|
+
|
|
119
|
+
Done. Changelog written to CHANGELOG.md
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## Options
|
|
123
|
+
|
|
124
|
+
### `--repo`
|
|
125
|
+
|
|
126
|
+
Specify the Git repository to read.
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
laminate --repo ./my-project
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Defaults to the current working directory.
|
|
133
|
+
|
|
134
|
+
### `--since`
|
|
135
|
+
|
|
136
|
+
Only include commits after a specific date.
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
laminate --since 2026-01-01
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### `--until`
|
|
143
|
+
|
|
144
|
+
Only include commits before a specific date.
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
laminate --until 2026-10-01
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### `--range`
|
|
151
|
+
|
|
152
|
+
Process a specific Git commit range.
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
laminate --range v1.0.0..v1.1.0
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
`--range` overrides `--since` and `--until`.
|
|
159
|
+
|
|
160
|
+
This is particularly useful when generating a changelog for a release.
|
|
161
|
+
|
|
162
|
+
### `--output`
|
|
163
|
+
|
|
164
|
+
Choose where the generated changelog should be written.
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
laminate --output RELEASE_NOTES.md
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
Defaults to:
|
|
171
|
+
|
|
172
|
+
```text
|
|
173
|
+
CHANGELOG.md
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### `--batch-size`
|
|
177
|
+
|
|
178
|
+
Control how many commits are sent to the model at once.
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
laminate --batch-size 25
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
Larger batches can provide more context to the model, while smaller batches can reduce the amount of context required for each request.
|
|
185
|
+
|
|
186
|
+
### `--release`
|
|
187
|
+
|
|
188
|
+
Generate a versioned release section instead of an `[Unreleased]` section.
|
|
189
|
+
|
|
190
|
+
```bash
|
|
191
|
+
laminate --release 1.1.0
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
The resulting header will look like:
|
|
195
|
+
|
|
196
|
+
```markdown
|
|
197
|
+
## [1.1.0] - 2026-10-03
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
Without `--release`, Laminate generates:
|
|
201
|
+
|
|
202
|
+
```markdown
|
|
203
|
+
## [Unreleased]
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
## Example
|
|
207
|
+
|
|
208
|
+
Suppose your repository contains commits like:
|
|
209
|
+
|
|
210
|
+
```text
|
|
211
|
+
Add user authentication
|
|
212
|
+
Fix crash when configuration is missing
|
|
213
|
+
Refactor authentication middleware
|
|
214
|
+
Remove deprecated login endpoint
|
|
215
|
+
Add password reset flow
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
Instead of producing one entry for every commit, Laminate can turn them into something like:
|
|
219
|
+
|
|
220
|
+
```markdown
|
|
221
|
+
# Changelog
|
|
222
|
+
|
|
223
|
+
All notable changes to this project will be documented in this file.
|
|
224
|
+
|
|
225
|
+
The format is based on Keep a Changelog
|
|
226
|
+
and this project adheres to Semantic Versioning.
|
|
227
|
+
|
|
228
|
+
## [Unreleased]
|
|
229
|
+
|
|
230
|
+
### Added
|
|
231
|
+
|
|
232
|
+
- Added user authentication and password reset functionality.
|
|
233
|
+
|
|
234
|
+
### Changed
|
|
235
|
+
|
|
236
|
+
- Refactored the authentication middleware.
|
|
237
|
+
|
|
238
|
+
### Removed
|
|
239
|
+
|
|
240
|
+
- Removed the deprecated login endpoint.
|
|
241
|
+
|
|
242
|
+
### Fixed
|
|
243
|
+
|
|
244
|
+
- Fixed a crash caused by missing configuration.
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
The exact output depends on the Git history and the model being used.
|
|
248
|
+
|
|
249
|
+
## Supported Categories
|
|
250
|
+
|
|
251
|
+
Laminate currently uses the standard Keep a Changelog categories:
|
|
252
|
+
|
|
253
|
+
* **Added**
|
|
254
|
+
* **Changed**
|
|
255
|
+
* **Deprecated**
|
|
256
|
+
* **Removed**
|
|
257
|
+
* **Fixed**
|
|
258
|
+
* **Security**
|
|
259
|
+
|
|
260
|
+
Categories that contain no changes are omitted from the final document.
|
|
261
|
+
|
|
262
|
+
## Privacy
|
|
263
|
+
|
|
264
|
+
Laminate is designed around **local processing**.
|
|
265
|
+
|
|
266
|
+
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.
|
|
267
|
+
|
|
268
|
+
The model you download and use is subject to its own license and terms.
|
|
269
|
+
|
|
270
|
+
## Contributing
|
|
271
|
+
|
|
272
|
+
Contributions, bug reports, and ideas are welcome.
|
|
273
|
+
|
|
274
|
+
If you find a problem with Laminate, please open an issue with:
|
|
275
|
+
|
|
276
|
+
* What you were trying to do
|
|
277
|
+
* The command you ran
|
|
278
|
+
* The relevant error message
|
|
279
|
+
* Your Python version
|
|
280
|
+
* Your operating system
|
|
281
|
+
|
|
282
|
+
Or email me at [me@apleut.dev](me@apleut.dev).
|
|
283
|
+
|
|
284
|
+
For changes to Laminate itself, pull requests are welcome.
|
|
285
|
+
|
|
286
|
+
## License
|
|
287
|
+
|
|
288
|
+
License information will be added before the first stable release.
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: laminate-cli
|
|
3
|
+
Version: 0.1.1
|
|
4
|
+
Summary: Generate release-ready changelogs from git history using a local LLM
|
|
5
|
+
Requires-Python: >=3.10
|
|
6
|
+
Description-Content-Type: text/markdown
|
|
7
|
+
License-File: LICENSE
|
|
8
|
+
Requires-Dist: llama-cpp-python
|
|
9
|
+
Requires-Dist: pydantic
|
|
10
|
+
Requires-Dist: typer
|
|
11
|
+
Requires-Dist: rich
|
|
12
|
+
Dynamic: license-file
|
|
13
|
+
|
|
14
|
+
<div style="text-align: center;">
|
|
15
|
+
<img src="assets/laminate-logo.svg" alt="Laminate Logo" width="200">
|
|
16
|
+
|
|
17
|
+
<h1>Laminate</h1>
|
|
18
|
+
|
|
19
|
+
<h4>
|
|
20
|
+
<a href="https://apleut.dev">My Website</a> ·
|
|
21
|
+
<a href="CHANGELOG.md">Changelog</a>
|
|
22
|
+
</h4>
|
|
23
|
+
|
|
24
|
+
<hr>
|
|
25
|
+
|
|
26
|
+
</div>
|
|
27
|
+
|
|
28
|
+
> [!WARNING]
|
|
29
|
+
> Laminate is in **early development**. Its output, CLI, and configuration may change between releases.
|
|
30
|
+
|
|
31
|
+
A CLI that turns your Git history into **release-ready changelogs using a local LLM**.
|
|
32
|
+
|
|
33
|
+
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.
|
|
34
|
+
|
|
35
|
+
## Features
|
|
36
|
+
|
|
37
|
+
* 🤖 **Local LLM processing** — your Git history stays on your machine
|
|
38
|
+
* 📝 **Release-ready Markdown** — generates structured changelogs
|
|
39
|
+
* 🗂️ **Automatic categorization** — sorts changes into standard changelog categories
|
|
40
|
+
* 🧩 **Related-commit grouping** — combines related commits into a single entry
|
|
41
|
+
* 📦 **Batch processing** — process large repositories without sending the entire history to the model at once
|
|
42
|
+
* 🔒 **No API keys required** — Laminate uses a local GGUF model through `llama-cpp-python`
|
|
43
|
+
* 🛠️ **Git-aware filtering** — filter commits by date or Git commit range
|
|
44
|
+
* 🚀 **Release support** — generate either an `[Unreleased]` section or a versioned release
|
|
45
|
+
|
|
46
|
+
## Installation
|
|
47
|
+
|
|
48
|
+
### PyPI
|
|
49
|
+
|
|
50
|
+
Install Laminate with pip:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
pip install laminate-cli
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
> **Note:** The PyPI package is named `laminate-cli`, while the command and Python package are named `laminate`.
|
|
57
|
+
|
|
58
|
+
### From source
|
|
59
|
+
|
|
60
|
+
Clone the repository and install it locally:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
git clone https://github.com/Apleut/Laminate.git
|
|
64
|
+
cd Laminate
|
|
65
|
+
pip install .
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
For development:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
pip install -e .
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Windows
|
|
75
|
+
|
|
76
|
+
`llama-cpp-python` may require a pre-built CPU wheel on Windows.
|
|
77
|
+
|
|
78
|
+
Install it first with:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
pip install llama-cpp-python --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cpu
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Then install Laminate:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
pip install .
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Model
|
|
91
|
+
|
|
92
|
+
Laminate runs a **local GGUF model** using [`llama-cpp-python`](https://github.com/abetlen/llama-cpp-python).
|
|
93
|
+
|
|
94
|
+
Place exactly one `.gguf` model file in:
|
|
95
|
+
|
|
96
|
+
```text
|
|
97
|
+
models/
|
|
98
|
+
└── your-model.gguf
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
[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.
|
|
102
|
+
|
|
103
|
+
Laminate automatically finds and loads the model when it runs.
|
|
104
|
+
|
|
105
|
+
If the `models/` directory does not exist, or contains zero or multiple `.gguf` files, Laminate will stop and explain what needs to be fixed.
|
|
106
|
+
|
|
107
|
+
The model is intentionally kept separate from the package because GGUF models can be large and have different licensing requirements.
|
|
108
|
+
|
|
109
|
+
## Usage
|
|
110
|
+
|
|
111
|
+
From inside a Git repository:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
laminate
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Laminate will read the repository's commit history, categorize the changes, and write the result to:
|
|
118
|
+
|
|
119
|
+
```text
|
|
120
|
+
CHANGELOG.md
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
For example:
|
|
124
|
+
|
|
125
|
+
```text
|
|
126
|
+
Reading commits from working directory...
|
|
127
|
+
Found 42 commits. Categorizing with the local model...
|
|
128
|
+
[categorize] processing batch 1/3 (20 commits)...
|
|
129
|
+
[categorize] processing batch 2/3 (20 commits)...
|
|
130
|
+
[categorize] processing batch 3/3 (2 commits)...
|
|
131
|
+
|
|
132
|
+
Done. Changelog written to CHANGELOG.md
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Options
|
|
136
|
+
|
|
137
|
+
### `--repo`
|
|
138
|
+
|
|
139
|
+
Specify the Git repository to read.
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
laminate --repo ./my-project
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Defaults to the current working directory.
|
|
146
|
+
|
|
147
|
+
### `--since`
|
|
148
|
+
|
|
149
|
+
Only include commits after a specific date.
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
laminate --since 2026-01-01
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### `--until`
|
|
156
|
+
|
|
157
|
+
Only include commits before a specific date.
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
laminate --until 2026-10-01
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### `--range`
|
|
164
|
+
|
|
165
|
+
Process a specific Git commit range.
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
laminate --range v1.0.0..v1.1.0
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
`--range` overrides `--since` and `--until`.
|
|
172
|
+
|
|
173
|
+
This is particularly useful when generating a changelog for a release.
|
|
174
|
+
|
|
175
|
+
### `--output`
|
|
176
|
+
|
|
177
|
+
Choose where the generated changelog should be written.
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
laminate --output RELEASE_NOTES.md
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
Defaults to:
|
|
184
|
+
|
|
185
|
+
```text
|
|
186
|
+
CHANGELOG.md
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### `--batch-size`
|
|
190
|
+
|
|
191
|
+
Control how many commits are sent to the model at once.
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
laminate --batch-size 25
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
Larger batches can provide more context to the model, while smaller batches can reduce the amount of context required for each request.
|
|
198
|
+
|
|
199
|
+
### `--release`
|
|
200
|
+
|
|
201
|
+
Generate a versioned release section instead of an `[Unreleased]` section.
|
|
202
|
+
|
|
203
|
+
```bash
|
|
204
|
+
laminate --release 1.1.0
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
The resulting header will look like:
|
|
208
|
+
|
|
209
|
+
```markdown
|
|
210
|
+
## [1.1.0] - 2026-10-03
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
Without `--release`, Laminate generates:
|
|
214
|
+
|
|
215
|
+
```markdown
|
|
216
|
+
## [Unreleased]
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
## Example
|
|
220
|
+
|
|
221
|
+
Suppose your repository contains commits like:
|
|
222
|
+
|
|
223
|
+
```text
|
|
224
|
+
Add user authentication
|
|
225
|
+
Fix crash when configuration is missing
|
|
226
|
+
Refactor authentication middleware
|
|
227
|
+
Remove deprecated login endpoint
|
|
228
|
+
Add password reset flow
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
Instead of producing one entry for every commit, Laminate can turn them into something like:
|
|
232
|
+
|
|
233
|
+
```markdown
|
|
234
|
+
# Changelog
|
|
235
|
+
|
|
236
|
+
All notable changes to this project will be documented in this file.
|
|
237
|
+
|
|
238
|
+
The format is based on Keep a Changelog
|
|
239
|
+
and this project adheres to Semantic Versioning.
|
|
240
|
+
|
|
241
|
+
## [Unreleased]
|
|
242
|
+
|
|
243
|
+
### Added
|
|
244
|
+
|
|
245
|
+
- Added user authentication and password reset functionality.
|
|
246
|
+
|
|
247
|
+
### Changed
|
|
248
|
+
|
|
249
|
+
- Refactored the authentication middleware.
|
|
250
|
+
|
|
251
|
+
### Removed
|
|
252
|
+
|
|
253
|
+
- Removed the deprecated login endpoint.
|
|
254
|
+
|
|
255
|
+
### Fixed
|
|
256
|
+
|
|
257
|
+
- Fixed a crash caused by missing configuration.
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
The exact output depends on the Git history and the model being used.
|
|
261
|
+
|
|
262
|
+
## Supported Categories
|
|
263
|
+
|
|
264
|
+
Laminate currently uses the standard Keep a Changelog categories:
|
|
265
|
+
|
|
266
|
+
* **Added**
|
|
267
|
+
* **Changed**
|
|
268
|
+
* **Deprecated**
|
|
269
|
+
* **Removed**
|
|
270
|
+
* **Fixed**
|
|
271
|
+
* **Security**
|
|
272
|
+
|
|
273
|
+
Categories that contain no changes are omitted from the final document.
|
|
274
|
+
|
|
275
|
+
## Privacy
|
|
276
|
+
|
|
277
|
+
Laminate is designed around **local processing**.
|
|
278
|
+
|
|
279
|
+
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.
|
|
280
|
+
|
|
281
|
+
The model you download and use is subject to its own license and terms.
|
|
282
|
+
|
|
283
|
+
## Contributing
|
|
284
|
+
|
|
285
|
+
Contributions, bug reports, and ideas are welcome.
|
|
286
|
+
|
|
287
|
+
If you find a problem with Laminate, please open an issue with:
|
|
288
|
+
|
|
289
|
+
* What you were trying to do
|
|
290
|
+
* The command you ran
|
|
291
|
+
* The relevant error message
|
|
292
|
+
* Your Python version
|
|
293
|
+
* Your operating system
|
|
294
|
+
|
|
295
|
+
Or email me at [me@apleut.dev](me@apleut.dev).
|
|
296
|
+
|
|
297
|
+
For changes to Laminate itself, pull requests are welcome.
|
|
298
|
+
|
|
299
|
+
## License
|
|
300
|
+
|
|
301
|
+
License information will be added before the first stable release.
|
laminate_cli-0.1.0/PKG-INFO
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: laminate-cli
|
|
3
|
-
Version: 0.1.0
|
|
4
|
-
Summary: Generate release-ready changelogs from git history using a local LLM
|
|
5
|
-
Requires-Python: >=3.10
|
|
6
|
-
Description-Content-Type: text/markdown
|
|
7
|
-
License-File: LICENSE
|
|
8
|
-
Requires-Dist: llama-cpp-python
|
|
9
|
-
Requires-Dist: pydantic
|
|
10
|
-
Requires-Dist: typer
|
|
11
|
-
Requires-Dist: rich
|
|
12
|
-
Dynamic: license-file
|
|
13
|
-
|
|
14
|
-
<div style="text-align: center;">
|
|
15
|
-
<img src="assets/laminate-logo.svg" alt="Laminate Logo" width=200>
|
|
16
|
-
<h1>Laminate</h1>
|
|
17
|
-
<h4><a href="https://apleut.dev">My Website</a> - <a href="changelog.md">Changelog</a></h4>
|
|
18
|
-
<hr></hr>
|
|
19
|
-
</div>
|
|
20
|
-
|
|
21
|
-
> [!NOTE]
|
|
22
|
-
> Laminate is in **extremely early development.** Everything stated here is subject to change. If you want to contribute to Laminate, contact me via email at __me@apleut.dev__.
|
|
23
|
-
|
|
24
|
-
> [!WARNING]
|
|
25
|
-
> When installing requirements on Windows machines, make sure to install `llama-cpp-python` using this command first:
|
|
26
|
-
> `pip install llama-cpp-python --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cpu`
|
|
27
|
-
> Otherwise, the path lengths of the source code will be too long for Windows to handle, and it will raise an error.
|
|
28
|
-
|
|
29
|
-
A CLI to write release-ready changelogs for you using llama-cpp-python.
|
laminate_cli-0.1.0/README.md
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
<div style="text-align: center;">
|
|
2
|
-
<img src="assets/laminate-logo.svg" alt="Laminate Logo" width=200>
|
|
3
|
-
<h1>Laminate</h1>
|
|
4
|
-
<h4><a href="https://apleut.dev">My Website</a> - <a href="changelog.md">Changelog</a></h4>
|
|
5
|
-
<hr></hr>
|
|
6
|
-
</div>
|
|
7
|
-
|
|
8
|
-
> [!NOTE]
|
|
9
|
-
> Laminate is in **extremely early development.** Everything stated here is subject to change. If you want to contribute to Laminate, contact me via email at __me@apleut.dev__.
|
|
10
|
-
|
|
11
|
-
> [!WARNING]
|
|
12
|
-
> When installing requirements on Windows machines, make sure to install `llama-cpp-python` using this command first:
|
|
13
|
-
> `pip install llama-cpp-python --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cpu`
|
|
14
|
-
> Otherwise, the path lengths of the source code will be too long for Windows to handle, and it will raise an error.
|
|
15
|
-
|
|
16
|
-
A CLI to write release-ready changelogs for you using llama-cpp-python.
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: laminate-cli
|
|
3
|
-
Version: 0.1.0
|
|
4
|
-
Summary: Generate release-ready changelogs from git history using a local LLM
|
|
5
|
-
Requires-Python: >=3.10
|
|
6
|
-
Description-Content-Type: text/markdown
|
|
7
|
-
License-File: LICENSE
|
|
8
|
-
Requires-Dist: llama-cpp-python
|
|
9
|
-
Requires-Dist: pydantic
|
|
10
|
-
Requires-Dist: typer
|
|
11
|
-
Requires-Dist: rich
|
|
12
|
-
Dynamic: license-file
|
|
13
|
-
|
|
14
|
-
<div style="text-align: center;">
|
|
15
|
-
<img src="assets/laminate-logo.svg" alt="Laminate Logo" width=200>
|
|
16
|
-
<h1>Laminate</h1>
|
|
17
|
-
<h4><a href="https://apleut.dev">My Website</a> - <a href="changelog.md">Changelog</a></h4>
|
|
18
|
-
<hr></hr>
|
|
19
|
-
</div>
|
|
20
|
-
|
|
21
|
-
> [!NOTE]
|
|
22
|
-
> Laminate is in **extremely early development.** Everything stated here is subject to change. If you want to contribute to Laminate, contact me via email at __me@apleut.dev__.
|
|
23
|
-
|
|
24
|
-
> [!WARNING]
|
|
25
|
-
> When installing requirements on Windows machines, make sure to install `llama-cpp-python` using this command first:
|
|
26
|
-
> `pip install llama-cpp-python --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cpu`
|
|
27
|
-
> Otherwise, the path lengths of the source code will be too long for Windows to handle, and it will raise an error.
|
|
28
|
-
|
|
29
|
-
A CLI to write release-ready changelogs for you using llama-cpp-python.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|