logforge-gitlog 0.1.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.
- logforge_gitlog-0.1.0/.github/workflows/ci.yml +60 -0
- logforge_gitlog-0.1.0/.github/workflows/release.yml +76 -0
- logforge_gitlog-0.1.0/.gitignore +15 -0
- logforge_gitlog-0.1.0/.gitlog.toml.example +20 -0
- logforge_gitlog-0.1.0/CHANGELOG.md +20 -0
- logforge_gitlog-0.1.0/GITHUB_RELEASE_DRAFT.md +90 -0
- logforge_gitlog-0.1.0/LICENSE +21 -0
- logforge_gitlog-0.1.0/PKG-INFO +230 -0
- logforge_gitlog-0.1.0/README.md +173 -0
- logforge_gitlog-0.1.0/RELEASE_NOTES_v0.1.0.md +47 -0
- logforge_gitlog-0.1.0/docs/configuration.md +86 -0
- logforge_gitlog-0.1.0/docs/demo.svg +42 -0
- logforge_gitlog-0.1.0/docs/social_templates.md +49 -0
- logforge_gitlog-0.1.0/pyproject.toml +75 -0
- logforge_gitlog-0.1.0/release_pr.md +37 -0
- logforge_gitlog-0.1.0/src/gitlog/__init__.py +6 -0
- logforge_gitlog-0.1.0/src/gitlog/cli.py +303 -0
- logforge_gitlog-0.1.0/src/gitlog/config.py +109 -0
- logforge_gitlog-0.1.0/src/gitlog/core/__init__.py +1 -0
- logforge_gitlog-0.1.0/src/gitlog/core/classifier.py +206 -0
- logforge_gitlog-0.1.0/src/gitlog/core/generator.py +181 -0
- logforge_gitlog-0.1.0/src/gitlog/core/git.py +342 -0
- logforge_gitlog-0.1.0/src/gitlog/core/models.py +167 -0
- logforge_gitlog-0.1.0/src/gitlog/exceptions.py +27 -0
- logforge_gitlog-0.1.0/src/gitlog/providers/__init__.py +2 -0
- logforge_gitlog-0.1.0/src/gitlog/providers/anthropic.py +73 -0
- logforge_gitlog-0.1.0/src/gitlog/providers/base.py +32 -0
- logforge_gitlog-0.1.0/src/gitlog/providers/ollama.py +80 -0
- logforge_gitlog-0.1.0/src/gitlog/providers/openai.py +79 -0
- logforge_gitlog-0.1.0/src/gitlog/renderers/__init__.py +2 -0
- logforge_gitlog-0.1.0/src/gitlog/renderers/html.py +49 -0
- logforge_gitlog-0.1.0/src/gitlog/renderers/json.py +61 -0
- logforge_gitlog-0.1.0/src/gitlog/renderers/markdown.py +79 -0
- logforge_gitlog-0.1.0/src/gitlog/renderers/twitter.py +60 -0
- logforge_gitlog-0.1.0/src/gitlog/templates/changelog.md.j2 +21 -0
- logforge_gitlog-0.1.0/src/gitlog/templates/release_notes.md.j2 +23 -0
- logforge_gitlog-0.1.0/src/gitlog/templates/report.html.j2 +102 -0
- logforge_gitlog-0.1.0/tests/__init__.py +0 -0
- logforge_gitlog-0.1.0/tests/conftest.py +29 -0
- logforge_gitlog-0.1.0/tests/fixtures/__init__.py +0 -0
- logforge_gitlog-0.1.0/tests/fixtures/sample_commits.py +65 -0
- logforge_gitlog-0.1.0/tests/test_classifier.py +73 -0
- logforge_gitlog-0.1.0/tests/test_generator.py +67 -0
- logforge_gitlog-0.1.0/tests/test_git.py +62 -0
- logforge_gitlog-0.1.0/tests/test_renderers.py +92 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main, develop]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
lint-and-type-check:
|
|
11
|
+
name: Lint & Type Check
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
steps:
|
|
14
|
+
- uses: actions/checkout@v4
|
|
15
|
+
|
|
16
|
+
- name: Set up Python
|
|
17
|
+
uses: actions/setup-python@v5
|
|
18
|
+
with:
|
|
19
|
+
python-version: "3.11"
|
|
20
|
+
|
|
21
|
+
- name: Install uv
|
|
22
|
+
uses: astral-sh/setup-uv@v3
|
|
23
|
+
|
|
24
|
+
- name: Install dependencies
|
|
25
|
+
run: uv sync --extra dev
|
|
26
|
+
|
|
27
|
+
- name: Run ruff
|
|
28
|
+
run: uv run ruff check src/ tests/
|
|
29
|
+
|
|
30
|
+
- name: Run mypy
|
|
31
|
+
run: uv run mypy src/gitlog
|
|
32
|
+
|
|
33
|
+
test:
|
|
34
|
+
name: Test (Python ${{ matrix.python-version }})
|
|
35
|
+
runs-on: ubuntu-latest
|
|
36
|
+
strategy:
|
|
37
|
+
matrix:
|
|
38
|
+
python-version: ["3.11", "3.12"]
|
|
39
|
+
steps:
|
|
40
|
+
- uses: actions/checkout@v4
|
|
41
|
+
|
|
42
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
43
|
+
uses: actions/setup-python@v5
|
|
44
|
+
with:
|
|
45
|
+
python-version: ${{ matrix.python-version }}
|
|
46
|
+
|
|
47
|
+
- name: Install uv
|
|
48
|
+
uses: astral-sh/setup-uv@v3
|
|
49
|
+
|
|
50
|
+
- name: Install dependencies
|
|
51
|
+
run: uv sync --extra dev
|
|
52
|
+
|
|
53
|
+
- name: Run tests with coverage
|
|
54
|
+
run: uv run pytest --cov=src/gitlog --cov-report=xml --cov-report=term-missing
|
|
55
|
+
|
|
56
|
+
- name: Upload coverage
|
|
57
|
+
uses: codecov/codecov-action@v4
|
|
58
|
+
if: matrix.python-version == '3.11'
|
|
59
|
+
with:
|
|
60
|
+
file: ./coverage.xml
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "v*.*.*"
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: write
|
|
10
|
+
id-token: write
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
build-and-publish:
|
|
14
|
+
name: Build & Publish to PyPI
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
environment: pypi
|
|
17
|
+
steps:
|
|
18
|
+
- uses: actions/checkout@v4
|
|
19
|
+
with:
|
|
20
|
+
fetch-depth: 0
|
|
21
|
+
|
|
22
|
+
- name: Set up Python
|
|
23
|
+
uses: actions/setup-python@v5
|
|
24
|
+
with:
|
|
25
|
+
python-version: "3.11"
|
|
26
|
+
|
|
27
|
+
- name: Install uv
|
|
28
|
+
uses: astral-sh/setup-uv@v3
|
|
29
|
+
|
|
30
|
+
- name: Build package
|
|
31
|
+
run: uv build
|
|
32
|
+
|
|
33
|
+
- name: Publish to PyPI
|
|
34
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
35
|
+
|
|
36
|
+
generate-changelog:
|
|
37
|
+
name: Generate & Push Changelog
|
|
38
|
+
runs-on: ubuntu-latest
|
|
39
|
+
needs: build-and-publish
|
|
40
|
+
steps:
|
|
41
|
+
- uses: actions/checkout@v4
|
|
42
|
+
with:
|
|
43
|
+
fetch-depth: 0
|
|
44
|
+
token: ${{ secrets.GITHUB_TOKEN }}
|
|
45
|
+
|
|
46
|
+
- name: Set up Python
|
|
47
|
+
uses: actions/setup-python@v5
|
|
48
|
+
with:
|
|
49
|
+
python-version: "3.11"
|
|
50
|
+
|
|
51
|
+
- name: Install uv & gitlog
|
|
52
|
+
run: |
|
|
53
|
+
pip install uv
|
|
54
|
+
pip install .
|
|
55
|
+
|
|
56
|
+
- name: Generate Changelog
|
|
57
|
+
env:
|
|
58
|
+
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
|
|
59
|
+
GITLOG_PROJECT_DESCRIPTION: "AI-Powered Changelog & Release Notes Generator"
|
|
60
|
+
run: |
|
|
61
|
+
gitlog generate --since $(git describe --abbrev=0 HEAD~1 2>/dev/null || echo "") \
|
|
62
|
+
--format markdown --output CHANGELOG.md
|
|
63
|
+
|
|
64
|
+
- name: Commit updated CHANGELOG
|
|
65
|
+
run: |
|
|
66
|
+
git config user.name "github-actions[bot]"
|
|
67
|
+
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
68
|
+
git add CHANGELOG.md
|
|
69
|
+
git diff --staged --quiet || git commit -m "chore: update CHANGELOG for ${{ github.ref_name }}"
|
|
70
|
+
git push
|
|
71
|
+
|
|
72
|
+
- name: Create GitHub Release
|
|
73
|
+
uses: softprops/action-gh-release@v2
|
|
74
|
+
with:
|
|
75
|
+
body_path: CHANGELOG.md
|
|
76
|
+
generate_release_notes: false
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Example .gitlog.toml configuration
|
|
2
|
+
# Copy to .gitlog.toml and customise, or run: gitlog init
|
|
3
|
+
|
|
4
|
+
[gitlog]
|
|
5
|
+
llm_provider = "openai"
|
|
6
|
+
model = "gpt-4o-mini"
|
|
7
|
+
language = "en"
|
|
8
|
+
format = "markdown"
|
|
9
|
+
output_file = "CHANGELOG.md"
|
|
10
|
+
project_description = "A developer tool for..."
|
|
11
|
+
exclude_patterns = ["^chore\\(deps\\)", "^Merge branch"]
|
|
12
|
+
group_by_scope = true
|
|
13
|
+
max_commits_per_group = 20
|
|
14
|
+
|
|
15
|
+
[gitlog.prompts]
|
|
16
|
+
classify_system = ""
|
|
17
|
+
summarize_system = ""
|
|
18
|
+
|
|
19
|
+
[gitlog.github]
|
|
20
|
+
repo = "owner/repo"
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
5
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
|
+
|
|
7
|
+
> This changelog is maintained by **gitlog** — the tool itself.
|
|
8
|
+
|
|
9
|
+
## [Unreleased]
|
|
10
|
+
|
|
11
|
+
### ✨ Features
|
|
12
|
+
- Initial project scaffold with full CLI, LLM classifier, and multi-format renderers
|
|
13
|
+
- Two-layer commit classification: rule engine + LLM batch fallback
|
|
14
|
+
- Keep-a-Changelog Markdown renderer with multilingual support (en, zh-TW, zh-CN, ja)
|
|
15
|
+
- JSON renderer for programmatic consumption
|
|
16
|
+
- Self-contained HTML report with dark/light mode and version timeline
|
|
17
|
+
- Twitter/X release announcement generator
|
|
18
|
+
- `gitlog stats` ASCII bar chart for commit type distribution
|
|
19
|
+
- `gitlog init` interactive `.gitlog.toml` setup wizard
|
|
20
|
+
- GitHub Actions CI/CD with auto-changelog on release
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Release draft: v0.1.0 — LogForge (gitlog)
|
|
2
|
+
|
|
3
|
+
Tag: `v0.1.0`
|
|
4
|
+
|
|
5
|
+
Short description
|
|
6
|
+
-----------------
|
|
7
|
+
LogForge (CLI name: `gitlog`) — AI-powered changelog & release-notes generator.
|
|
8
|
+
|
|
9
|
+
Highlights
|
|
10
|
+
----------
|
|
11
|
+
- Robust `GitLogParser`: GitPython preferred with `git` subprocess fallback; test-friendly.
|
|
12
|
+
- Backwards-compatible pydantic models: accepts legacy fixture shapes (`author`/`date`).
|
|
13
|
+
- Renderers fixed: JSON/Markdown/Twitter outputs normalized and stable.
|
|
14
|
+
- UX/docs: Added a quick 5s demo (`docs/demo.svg`) and social post templates (`docs/social_templates.md`).
|
|
15
|
+
- Packaging: artifacts built (sdist + wheel). CLI remains `gitlog`, package name for PyPI: `logforge`.
|
|
16
|
+
|
|
17
|
+
Full release notes
|
|
18
|
+
------------------
|
|
19
|
+
See `RELEASE_NOTES_v0.1.0.md` for full details, changelog, and publish instructions.
|
|
20
|
+
|
|
21
|
+
Binary artifacts (local)
|
|
22
|
+
------------------------
|
|
23
|
+
Attach these artifacts to the GitHub Release as assets:
|
|
24
|
+
|
|
25
|
+
- `dist/logforge-0.1.0.tar.gz`
|
|
26
|
+
- `dist/logforge-0.1.0-py3-none-any.whl`
|
|
27
|
+
|
|
28
|
+
Installation notes
|
|
29
|
+
------------------
|
|
30
|
+
- Recommended (PyPI once published):
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
pip install logforge
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
- Install from GitHub (current recommendation until PyPI release):
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
pip install git+https://github.com/JToSound/LogForge.git
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Usage (quick)
|
|
43
|
+
-------------
|
|
44
|
+
```bash
|
|
45
|
+
gitlog generate
|
|
46
|
+
# or preview without writing
|
|
47
|
+
gitlog generate --dry-run
|
|
48
|
+
# tweet draft
|
|
49
|
+
gitlog tweet
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Publishing to PyPI (maintainer instructions)
|
|
53
|
+
--------------------------------------------
|
|
54
|
+
Option A — Upload manually (recommended):
|
|
55
|
+
1. Ensure artifacts are present in `dist/`.
|
|
56
|
+
2. Install twine: `python -m pip install --upgrade twine`.
|
|
57
|
+
3. Upload (example with env vars):
|
|
58
|
+
|
|
59
|
+
```powershell
|
|
60
|
+
$env:TWINE_USERNAME = "__token__"
|
|
61
|
+
$env:TWINE_PASSWORD = "<PASTE_YOUR_PYPI_TOKEN_HERE>"
|
|
62
|
+
python -m twine upload dist/*
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Option B — Let me upload now: reply with `upload now` and I will run `twine upload dist/*` using the token you provided.
|
|
66
|
+
|
|
67
|
+
Verification
|
|
68
|
+
------------
|
|
69
|
+
- After upload, check https://pypi.org/project/logforge/ and ensure the new version `0.1.0` appears.
|
|
70
|
+
- Optionally, install from PyPI in a fresh environment and run `gitlog --version` and `gitlog generate` on a small repo.
|
|
71
|
+
|
|
72
|
+
Draft release body (copy/paste ready)
|
|
73
|
+
------------------------------------
|
|
74
|
+
Title: v0.1.0 — LogForge
|
|
75
|
+
|
|
76
|
+
Body:
|
|
77
|
+
```
|
|
78
|
+
LogForge (gitlog) v0.1.0
|
|
79
|
+
|
|
80
|
+
This release introduces:
|
|
81
|
+
- Robust git parsing with GitPython/subprocess fallback
|
|
82
|
+
- Backwards-compatible models and multiple renderer fixes
|
|
83
|
+
- Quick animated demo and social templates for easy outreach
|
|
84
|
+
|
|
85
|
+
Artifacts: attached wheel and sdist (dist/*)
|
|
86
|
+
|
|
87
|
+
Installation: `pip install logforge` (or `pip install git+https://github.com/JToSound/LogForge.git`)
|
|
88
|
+
|
|
89
|
+
See full notes in the repository: RELEASE_NOTES_v0.1.0.md
|
|
90
|
+
```
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 gitlog contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: logforge-gitlog
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: AI-Powered Changelog & Release Notes Generator
|
|
5
|
+
Project-URL: Homepage, https://github.com/JToSound/LogForge
|
|
6
|
+
Project-URL: Repository, https://github.com/JToSound/LogForge
|
|
7
|
+
Project-URL: Changelog, https://github.com/JToSound/LogForge/blob/main/CHANGELOG.md
|
|
8
|
+
License: MIT License
|
|
9
|
+
|
|
10
|
+
Copyright (c) 2024 gitlog contributors
|
|
11
|
+
|
|
12
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
13
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
14
|
+
in the Software without restriction, including without limitation the rights
|
|
15
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
16
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
17
|
+
furnished to do so, subject to the following conditions:
|
|
18
|
+
|
|
19
|
+
The above copyright notice and this permission notice shall be included in all
|
|
20
|
+
copies or substantial portions of the Software.
|
|
21
|
+
|
|
22
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
23
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
24
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
25
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
26
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
27
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
28
|
+
SOFTWARE.
|
|
29
|
+
License-File: LICENSE
|
|
30
|
+
Keywords: ai,changelog,cli,git,release-notes
|
|
31
|
+
Classifier: Development Status :: 3 - Alpha
|
|
32
|
+
Classifier: Environment :: Console
|
|
33
|
+
Classifier: Intended Audience :: Developers
|
|
34
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
35
|
+
Classifier: Programming Language :: Python :: 3
|
|
36
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
37
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
38
|
+
Classifier: Topic :: Software Development :: Version Control :: Git
|
|
39
|
+
Requires-Python: >=3.11
|
|
40
|
+
Requires-Dist: gitpython>=3.1
|
|
41
|
+
Requires-Dist: jinja2>=3.1
|
|
42
|
+
Requires-Dist: litellm>=1.40
|
|
43
|
+
Requires-Dist: pydantic-settings>=2
|
|
44
|
+
Requires-Dist: pydantic>=2
|
|
45
|
+
Requires-Dist: rich>=13
|
|
46
|
+
Requires-Dist: tenacity>=8
|
|
47
|
+
Requires-Dist: tomli>=2; python_version < '3.11'
|
|
48
|
+
Requires-Dist: typer[all]>=0.12
|
|
49
|
+
Provides-Extra: dev
|
|
50
|
+
Requires-Dist: mypy>=1.10; extra == 'dev'
|
|
51
|
+
Requires-Dist: pytest-cov>=5; extra == 'dev'
|
|
52
|
+
Requires-Dist: pytest>=8; extra == 'dev'
|
|
53
|
+
Requires-Dist: respx>=0.21; extra == 'dev'
|
|
54
|
+
Requires-Dist: ruff>=0.4; extra == 'dev'
|
|
55
|
+
Requires-Dist: types-jinja2; extra == 'dev'
|
|
56
|
+
Description-Content-Type: text/markdown
|
|
57
|
+
|
|
58
|
+
<div align="center">
|
|
59
|
+
|
|
60
|
+
# LogForge — gitlog
|
|
61
|
+
|
|
62
|
+
**LogForge — AI-Powered Changelog & Release Notes Generator**
|
|
63
|
+
|
|
64
|
+
[](https://github.com/JToSound/LogForge/actions/workflows/ci.yml)
|
|
65
|
+
[](https://codecov.io/gh/JToSound/LogForge)
|
|
66
|
+
[](https://github.com/JToSound/LogForge/releases)
|
|
67
|
+
[](https://www.python.org/downloads/)
|
|
68
|
+
[](LICENSE)
|
|
69
|
+
|
|
70
|
+
One command. From git history to a human-readable, structured CHANGELOG.
|
|
71
|
+
Supports **multiple languages**, **multiple output formats**, and **any LLM**.
|
|
72
|
+
|
|
73
|
+
</div>
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Quick Start
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
# Install directly from GitHub (recommended until published to PyPI)
|
|
81
|
+
pip install git+https://github.com/JToSound/LogForge.git
|
|
82
|
+
cd your-repo
|
|
83
|
+
export OPENAI_API_KEY=sk-...
|
|
84
|
+
gitlog generate
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
That's it. Your `CHANGELOG.md` is ready. 🎉
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## 5s Demo
|
|
92
|
+
|
|
93
|
+
Below is a very short demo that shows `gitlog generate` producing a changelog in under 5 seconds on small repos.
|
|
94
|
+
|
|
95
|
+

|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Features
|
|
100
|
+
|
|
101
|
+
- 🤖 **Two-layer classification** — rule engine (zero API cost) + LLM batch fallback
|
|
102
|
+
- 🌍 **Multilingual output** — English, Traditional Chinese, Simplified Chinese, Japanese
|
|
103
|
+
- 📄 **Multiple formats** — Markdown (Keep-a-Changelog), JSON, HTML, Twitter drafts
|
|
104
|
+
- 🔗 **GitHub integration** — auto-generates PR/issue/commit links
|
|
105
|
+
- ⚡ **Batch LLM calls** — never call the LLM in a loop; respects token budgets
|
|
106
|
+
- 🔄 **Fallback chain** — LLM failure → rule engine, never interrupts the flow
|
|
107
|
+
- 🧩 **CI/CD ready** — GitHub Actions workflow included out of the box
|
|
108
|
+
- 🏠 **Local inference** — Ollama support for fully private generation
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Installation
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
# Recommended: with uv
|
|
116
|
+
uv tool install gitlog
|
|
117
|
+
|
|
118
|
+
# Or pip
|
|
119
|
+
pip install gitlog
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
**Requirements:** Python 3.11+, Git
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Usage
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
# Generate full CHANGELOG
|
|
130
|
+
gitlog generate
|
|
131
|
+
|
|
132
|
+
# From a specific version
|
|
133
|
+
gitlog generate --since v1.2.0
|
|
134
|
+
|
|
135
|
+
# HTML report
|
|
136
|
+
gitlog generate --format html
|
|
137
|
+
|
|
138
|
+
# Traditional Chinese output
|
|
139
|
+
gitlog generate --lang zh-TW
|
|
140
|
+
|
|
141
|
+
# Use a local Ollama model (no API key needed)
|
|
142
|
+
gitlog generate --model ollama/llama3
|
|
143
|
+
|
|
144
|
+
# Preview in terminal without writing a file
|
|
145
|
+
gitlog generate --dry-run
|
|
146
|
+
|
|
147
|
+
# Compare two versions
|
|
148
|
+
gitlog diff v1.0.0 v1.1.0
|
|
149
|
+
|
|
150
|
+
# Generate Twitter/X announcement
|
|
151
|
+
gitlog tweet
|
|
152
|
+
|
|
153
|
+
# ASCII commit statistics
|
|
154
|
+
gitlog stats
|
|
155
|
+
|
|
156
|
+
# Interactive setup
|
|
157
|
+
gitlog init
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## Configuration
|
|
163
|
+
|
|
164
|
+
Create a `.gitlog.toml` in your repo root (or run `gitlog init`):
|
|
165
|
+
|
|
166
|
+
```toml
|
|
167
|
+
[gitlog]
|
|
168
|
+
llm_provider = "openai"
|
|
169
|
+
model = "gpt-4o-mini"
|
|
170
|
+
language = "en"
|
|
171
|
+
format = "markdown"
|
|
172
|
+
output_file = "CHANGELOG.md"
|
|
173
|
+
project_description = "A developer tool for..."
|
|
174
|
+
exclude_patterns = ["^chore\\(deps\\)", "^Merge branch"]
|
|
175
|
+
group_by_scope = true
|
|
176
|
+
max_commits_per_group = 20
|
|
177
|
+
|
|
178
|
+
[gitlog.github]
|
|
179
|
+
repo = "owner/repo"
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### Full Configuration Reference
|
|
183
|
+
|
|
184
|
+
| Parameter | Default | Description |
|
|
185
|
+
|---|---|---|
|
|
186
|
+
| `llm_provider` | `openai` | LLM provider: `openai`, `anthropic`, `ollama` |
|
|
187
|
+
| `model` | `gpt-4o-mini` | Model identifier |
|
|
188
|
+
| `language` | `en` | Output language: `en`, `zh-TW`, `zh-CN`, `ja` |
|
|
189
|
+
| `format` | `markdown` | Output format: `markdown`, `json`, `html`, `twitter` |
|
|
190
|
+
| `output_file` | `CHANGELOG.md` | Output file path |
|
|
191
|
+
| `project_description` | `""` | Project context injected into LLM prompts |
|
|
192
|
+
| `exclude_patterns` | see default | Regex list of commit messages to skip |
|
|
193
|
+
| `group_by_scope` | `true` | Group commits by conventional commit scope |
|
|
194
|
+
| `max_commits_per_group` | `20` | Max commits shown per category per version |
|
|
195
|
+
| `github.repo` | `""` | `owner/repo` for generating clickable links |
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## GitHub Actions Integration
|
|
200
|
+
|
|
201
|
+
Add to your release workflow:
|
|
202
|
+
|
|
203
|
+
```yaml
|
|
204
|
+
- name: Generate Changelog
|
|
205
|
+
uses: JToSound/LogForge/.github/workflows/release.yml@main
|
|
206
|
+
env:
|
|
207
|
+
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
Or use the included `release.yml` which automatically:
|
|
211
|
+
1. Builds and publishes to PyPI on tag push
|
|
212
|
+
2. Generates the changelog using gitlog itself
|
|
213
|
+
3. Creates a GitHub Release with the generated notes
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## Supported LLM Providers
|
|
218
|
+
|
|
219
|
+
| Provider | Model Example | Env Var |
|
|
220
|
+
|---|---|---|
|
|
221
|
+
| OpenAI | `gpt-4o-mini` | `OPENAI_API_KEY` |
|
|
222
|
+
| Anthropic | `claude-3-5-haiku-20241022` | `ANTHROPIC_API_KEY` |
|
|
223
|
+
| Ollama (local) | `ollama/llama3` | *(none required)* |
|
|
224
|
+
| Gemini | `gemini/gemini-1.5-flash` | `GEMINI_API_KEY` |
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## License
|
|
229
|
+
|
|
230
|
+
MIT © gitlog contributors
|