- Go 94.8%
- Shell 2.6%
- Just 2.6%
| .just | ||
| .woodpecker | ||
| internal | ||
| scripts | ||
| .gitignore | ||
| CHANGELOG.md | ||
| config.example.toml | ||
| go.mod | ||
| go.sum | ||
| justfile | ||
| main.go | ||
| README.md | ||
wrangle
Manage the vlv app suite from one place. wrangle multiplexes build and release
commands over the apps in its registry, derives each release version from
conventional commits, and propagates the house-style release scripts so they
stop drifting copy-by-copy across repos.
It exists because every app carried a byte-identical scripts/changelog.sh and a
near-identical scripts/release-note.sh plus the same changelog/release
justfile recipes. wrangle owns that logic once: the changelog/release/version
logic lives here in Go, and wrangle init stamps the one script CI still
needs (release-note.sh) into each app from a single template.
Registry
wrangle manages exactly the apps listed in ~/.config/wrangle/config.toml
(honors $XDG_CONFIG_HOME; override with --config). An app is opted in by
name, not by sitting in a scanned directory. See config.example.toml.
workspace = "~/dev/vlv" # apps live at <workspace>/<name>
apps = ["dymo", "jira", "skiff", "todo", "..."]
Commands
| Command | What it does |
|---|---|
wrangle list (ls) |
Table of apps: version, clean/dirty, drift, path |
wrangle release [app…] |
Derive the next version from commits, write the changelog, commit, tag (and --push) |
wrangle changelog [app…] |
Write the next CHANGELOG.md section only |
wrangle build [app…] |
go build with the version stamped in |
wrangle install [app…] |
Build and install the app's binary via its just install recipe |
wrangle init [app…] |
Stamp scripts/release-note.sh + a delegating justfile fragment |
Selecting apps:
- Named:
wrangle release skiff todo - All:
wrangle release --all - Inferred: with no app, run inside an app's checkout and wrangle picks it —
so
just release(which delegates here) works from any app directory.
Flags come before positional app names (
wrangle release --dry-run skiff, not… skiff --dry-run) — the shared CLI framework stops flag parsing at the first positional, as everywhere in the suite.
Version derivation
The bump is read from the conventional commits since the last vX.Y.Z tag:
- a breaking change (
feat!:,<type>!:) → major - a
feat:→ minor - anything else (fix, docs, chore, …) → patch
- no commits since the tag → nothing to release (skipped under
--all)
Pre-1.0 (a v0.x tag) follows the 0.x convention so an app never auto-jumps to
1.0.0: a breaking change bumps the minor and everything else the
patch. Override any of this with --major / --minor / --patch, or pin an
exact version with --version v1.4.0. Use --dry-run to preview.
By default a release stays local — the changelog commit and tag are created
but not published, and wrangle prints the git push command. Pass --push to
push the current branch and the new tag to origin once tagging succeeds. If the
push fails, the commit and tag remain locally and wrangle reports the retry
command, so a release is never half-applied.
To push on every release without typing the flag, set push = true in the
registry (or push = false under a [app.<name>] table to opt one app out). An
explicit --push / --push=false on the command line always wins over the
config default.
install
wrangle install <app> runs the app's house-style just install recipe —
building the app and copying its binary onto PATH (per-platform, via just). It
is a thin multiplexer over just install so wrangle install --all installs the
whole suite in one go.
init
wrangle init <app> writes, from wrangle's embedded templates:
scripts/release-note.sh— the CI script, made generic (it derives the host andowner/repofromorigin, so it is identical across every app)..just/wrangle.just— a fragment whosechangelog/releaserecipes delegate to wrangle, imported into the app'sjustfile.
With --prune it also retires what those replace: the inline changelog/
release recipes in the justfile and the superseded scripts/changelog.sh.
Re-running init is idempotent; wrangle list flags any app whose
release-note.sh has drifted from the template.