No description
  • Go 94.8%
  • Shell 2.6%
  • Just 2.6%
Find a file
Viktor Varland 7f46a819bf
All checks were successful
ci/woodpecker/push/build Pipeline was successful
ci/woodpecker/tag/release Pipeline was successful
docs: changelog for v0.1.0
2026-06-26 09:22:01 +02:00
.just feat!: repurpose install to install binaries, move provisioning to init 2026-06-26 09:20:09 +02:00
.woodpecker ci: add woodpecker build and release pipelines 2026-06-25 10:40:55 +02:00
internal feat!: repurpose install to install binaries, move provisioning to init 2026-06-26 09:20:09 +02:00
scripts feat!: repurpose install to install binaries, move provisioning to init 2026-06-26 09:20:09 +02:00
.gitignore feat: wrangle, an app manager for the vlv suite 2026-06-25 09:19:35 +02:00
CHANGELOG.md docs: changelog for v0.1.0 2026-06-26 09:22:01 +02:00
config.example.toml feat: manage libraries via a libs config key 2026-06-25 11:31:59 +02:00
go.mod feat: wrangle, an app manager for the vlv suite 2026-06-25 09:19:35 +02:00
go.sum feat: wrangle, an app manager for the vlv suite 2026-06-25 09:19:35 +02:00
justfile feat!: repurpose install to install binaries, move provisioning to init 2026-06-26 09:20:09 +02:00
main.go feat!: repurpose install to install binaries, move provisioning to init 2026-06-26 09:20:09 +02:00
README.md feat!: repurpose install to install binaries, move provisioning to init 2026-06-26 09:20:09 +02:00

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 and owner/repo from origin, so it is identical across every app).
  • .just/wrangle.just — a fragment whose changelog/release recipes delegate to wrangle, imported into the app's justfile.

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.