-
Notifications
You must be signed in to change notification settings - Fork 0
Roadmap
M0 · Foundation
Config parser, discovery, target matrix, deterministic archive writers,
SHA256SUMS, letsgo build, plan --explain.
Plus the reproducibility test suite — same commit built twice on one machine,
then built on Linux and macOS runners and compared byte for byte. This is the
project's go/no-go gate. If cross-machine reproduction can't be made to work,
verify can't ship, and without verify this is just a smaller GoReleaser. We
find that out first, before building anything on top of it.
M1 · The release path
letsgo plan with configuration gates and the smoke test. Changelog. GitHub
release creation and asset upload with resume. Manifest. Stable source archive.
Module proxy warm-up. --snapshot. letsgo release.
M2 · Verification
letsgo verify. OIDC provenance attestation. Build cache. The govulncheck and
apidiff gates, plus the API-derived changelog section that falls out of the
latter.
M3 · Adoption
A migration guide rather than a converter. letsgo diff, size budgets, a
generated install.sh that carries its own digests, and Homebrew tap generation
pointed at our own reproducible archives.
At the end of M3 letsgo can replace GoReleaser for the repos it targets, and does several things GoReleaser cannot.
M4 · Container images
Multi-arch OCI images built from the binaries we already have: a deterministic
tar layer, a JSON config, and a push over the registry API. No daemon, no buildx,
no Dockerfile. The image digest goes in the manifest, so verify covers it
exactly as it covers an archive. This reverses a non-goal, which is explained in
Design.
M5 · Shipped
letsgo yank — automating Go's retract directive, including
the part people get wrong, that a retraction only takes effect once published in
a later tag. A reproducible CycloneDX SBOM. An embeddable
selfupdate package, so any binary released with letsgo gets
verified self-update for free — and letsgo update, which is that package
pointed at letsgo. A reusable GitHub Action — this was listed
as out of scope originally, which was about this repository rather than about
the idea: the Action is packaging rather than tooling, so it lives in
its own repository.
M6 · Trust after the fact Everything about a release that isn't finished the day it ships.
-
letsgo doctor— a read-only, offline diagnosis of tools and repository state. -
letsgo audit— re-checking published releases against today's vulnerability database, with results appended toaudit.jsonon the release. - The checksum database cross-check —
sum.golang.orgchecked against the source archive before any asset is attached, as a feature you can disable or require. -
Feature toggles —
disable/require, the catalogue, andletsgo features, which the other M6–M8 work is built on. -
Prerelease channels and
letsgo promote— RC tags,foo@next, floating Docker tags,update --channel, and promoting an RC to stable from the CLI or the GitHub UI. - The "what shipped" section in release notes, and
letsgo diff --format md|json.
M7 · Scale and editors Letting letsgo work on more than one machine and more than one module.
-
Monorepo releases — scoped tags, the
moduledirective, and a release title that names the module. -
Global config and the plugin store —
config.mod, the directive set, flag-over-env-over-global-over-default precedence, and a content-addressed plugin store so two repositories can pin two versions of one plugin on one machine. -
Editor support —
letsgo lsp,fmt -,--jsonoutput everywhere a tool needs it, and theletsgo-vscodeextension. -
Plugin-aware core — the public SDK,
letsgo/manifest, first-party plugins publishing their own tap files, andletsgo plugin installreplacing thecurl | tarrecipe.
M8 · Reviewable releases
plan and apply — a saved, digest-only plan that apply
rebuilds and checks itself against before any write, so a release can be agreed
to before it happens and an approval gate can sit between the two. Yank plans.
plan --format md for a job summary. The exported letsgo/plan package and the
letsgo-tfplan companion for tools that already read Terraform plans.
Still not here: GitLab and Gitea. The forge interface exists so a second forge is an addition rather than a rewrite, but nothing has been built against it yet.
M8's plan/apply work has been promoted to a stable release, and the VS Code extension is published to the Marketplace and Open VSX — both install exactly as described on Editor-Support and Plan-Apply.
-
Should the extension prefer a repository-pinned letsgo version — a
letsgoline inletsgo.mod, or whatever letsgo-action's workflow pins — over whatever is onPATH? The version shapes the archive layout, so a mismatch shows a plan CI would not produce. - Own activity-bar icon, or a section in the Explorer? The module view is a section in the Explorer today; it earns its own container only if a monorepo with enough modules makes that section feel cramped.
-
Snapshot version scheme.
<last-tag>-next+<short-sha>needs to sort correctly under semver against both its neighbours.
Two commitments that constrain future features more than they enable them:
The config surface should shrink over time, not grow. If a repo needs a new
config option, the first question is whether we could have inferred it. A growing
config file is the failure mode we're specifically trying to avoid, and every
option added is a small admission that inference wasn't good enough. Global
config is the one addition that cuts the other way on purpose —
it exists because machine-specific settings had nowhere honest to go but
letsgo.mod, and it earns its place by being checked, not just documented:
nothing that changes a release is allowed in it.
New gates are welcome; new publishing targets mostly aren't. Checks that catch a class of mistake Go lets you make silently are exactly on-thesis. Another packaging backend is how a focused tool becomes an unfocused one — and GoReleaser already occupies that ground well.
Start here
Releasing
Checking
Extending
Running it
About