changelog generator & diff tool
stormlightlabs.github.io/git-storm/
changelog
changeset
markdown
golang
git
storm — Project Guide#
Internal operations and release workflow
This document outlines:
- The release lifecycle
- CLI integration into development workflows
- Distribution setup for major package managers
Lifecycle#
Local Development#
-
Edit and test locally:
go run ./cmd/storm unreleased add --type fixed --summary "Fix diff rendering" go run ./cmd/storm unreleased list go run ./cmd/storm unreleased review -
Each
.changes/*.mdentry represents one meaningful change.
2. Preparing a Release#
-
Generate and review
storm generate v1.2.0 HEAD --interactive- Opens a Bubble Tea UI for categorization.
- Outputs candidate
.changes/files if confirmed.
-
Verify unreleased notes
storm unreleased list -
Promote to changelog
storm release --version 1.3.0This:
- Merges
.changes/*.mdintoCHANGELOG.md - Inserts the date
- Clears
.changes/ - (Optional) creates an annotated Git tag
- Merges
-
Commit and tag
git add CHANGELOG.md git commit -m "Release 1.3.0" git tag -a v1.3.0 -m "Release 1.3.0"
Validation#
Before pushing:
go test ./...
go run ./cmd/storm release --dry-run
Once satisfied:
git push origin main --tags
CLI Integration in Workflows#
storm is meant to sit between git log and CHANGELOG.md.
Use it at the end of development cycles or integrate it into CI pipelines.
Example integrations#
Local Workflow#
- Add a new
.changesfile per PR or major commit. - Review unreleased entries before each merge to
main. - Run
storm releasewhen preparing a new version.
Automated Release Job (CI)#
Example pseudo-pipeline (GitHub Actions / Drone / Woodpecker):
steps:
- name: Compute next version
run: |
NEXT=$(storm bump --bump patch)
echo "::set-output name=version::$NEXT"
- name: Generate changelog
run: |
go install ./cmd/storm
storm release --version ${{ steps.bump.outputs.version }} --toolchain package.json
- name: Tag and push
run: |
git add CHANGELOG.md
git commit -m "Release ${{ steps.bump.outputs.version }}"
git tag -a v${{ steps.bump.outputs.version }} -m "Release ${{ steps.bump.outputs.version }}"
git push origin main --tags
Integration with other tools#
- Taskfile / Justfile: add
releaserecipe callingstorm release. - GoReleaser: run
storm releaseinbefore.hooks. - Custom TUI tools: embed
internal/changesetandchangelogpackages directly.
Packaging & Distribution#
Homebrew (macOS / Linux)#
Create a tap repo#
Make a repo: github.com/stormlightlabs/homebrew-tap.
Formula template (storm.rb)#
class Gostorm < Formula
desc "Git-aware changelog manager with TUI review"
homepage "https://github.com/stormlightlabs/git-storm"
version "1.3.0"
url "https://github.com/stormlightlabs/git-storm/archive/refs/tags/v1.3.0.tar.gz"
sha256 "<insert_sha256_here>"
license "MIT"
depends_on "go" => :build
def install
system "go", "build", *std_go_args, "./cmd/storm"
end
test do
system "#{bin}/storm", "--help"
end
end
Update formula on each release#
Automate with goreleaser:
brews:
- tap: stormlightlabs/homebrew-tap
name: storm
folder: Formula
commit_author:
name: Owais Jamil
email: owais@example.com
Chocolatey (Windows)#
Create package skeleton#
tools/
chocolateyinstall.ps1
VERIFICATION.txt
storm.nuspec
chocolateyinstall.ps1#
$ErrorActionPreference = 'Stop'
$toolsDir = "$(Split-Path -Parent $MyInvocation.MyCommand.Definition)"
$url = 'https://github.com/stormlightlabs/git-storm/releases/download/v1.3.0/storm_1.3.0_windows_amd64.zip'
Install-ChocolateyZipPackage 'storm' $url $toolsDir
.nuspec#
<package>
<metadata>
<id>storm</id>
<version>1.3.0</version>
<authors>Owais Jamil</authors>
<description>Git-aware changelog manager with TUI review</description>
<licenseUrl>https://opensource.org/licenses/MIT</licenseUrl>
<projectUrl>https://github.com/stormlightlabs/git-storm</projectUrl>
</metadata>
</package>
Build & push#
choco pack
choco push storm.1.3.0.nupkg --source https://push.chocolatey.org/
AUR#
Create PKGBUILD#
pkgname=storm
pkgver=1.3.0
pkgrel=1
pkgdesc="Git-aware changelog manager with TUI review"
arch=('x86_64')
url="https://github.com/stormlightlabs/git-storm"
license=('MIT')
depends=('git' 'go')
source=("$url/archive/refs/tags/v${pkgver}.tar.gz")
sha256sums=('SKIP')
build() {
cd "$srcdir/storm-$pkgver"
go build -o storm ./cmd/storm
}
package() {
install -Dm755 storm "$pkgdir/usr/bin/storm"
}
Submit#
Clone AUR repo:
git clone ssh://aur@aur.archlinux.org/storm.git
cp PKGBUILD storm/
cd storm
makepkg --printsrcinfo > .SRCINFO
git add .
git commit -m "Add storm v1.3.0"
git push
Summary#
| Step | Action | Output |
|---|---|---|
| 1 | storm generate v1.2.0 HEAD --interactive |
Draft unreleased notes |
| 2 | storm release --version 1.3.0 |
Updated CHANGELOG.md |
| 3 | git tag -a v1.3.0 |
Annotated release tag |
| 4 | goreleaser release --clean |
Builds + publishes binaries |
| 5 | Update tap / choco / AUR formulas | Public distribution |
Maintenance Notes#
- Keep
.changes/entries atomic and descriptive. - Avoid retroactive changelog edits outside releases.
- Tag every release in Git with an exact semantic version (
vX.Y.Z). - Ensure TUI remains optional (disable automatically in CI).
- Treat changelog generation as a testable unit — not a side effect.