wharfy 0.19.0 — hand your local credentials to CI

Hand your local credentials to CI

wharfy auth <kind> --print resolves a stored credential the same way wharfy resolves it when it runs, and writes it to stdout.

wharfy auth fury --print | gh secret set PACKAGE_REPO_TOKEN

A value you pull out of the keychain by hand is not always the value wharfy uses — it can still be wrapped. Register that in CI and you get a silent 401, with nothing to tell you whether the token is wrong or the account name is.

wharfy secrets names the tools your runner needs

Tokens are not enough. If the build tool is missing on the runner, the job fails anyway — so secrets prints what to install, too.

$ wharfy secrets
tools wharfy shells out to (they must be on PATH wherever wharfy runs):
  ✗ goreleaser               cross-compile, archive and package the Go build path — build / release / publish shell out to it (BYO inputs, prebuilt: / bundle:, do not need it)
    go install github.com/goreleaser/goreleaser/v2@latest   # or: uses: goreleaser/goreleaser-action@v6 with: {install-only: true}

If you ship a binary you bring yourself (prebuilt: / bundle:), you do not need goreleaser — and secrets takes that into account.

publish catches apt/rpm packages that nobody can install yet

An upload can succeed and still leave your users unable to install. The response is 200, so from your side nothing looks wrong.

what happens how it looks
A hosted repo takes a few minutes to regenerate its index 404 for a while. It fixes itself.
fury treats a package it receives as private by default Never installable, until you flip it to public in the dashboard.

publish now reads the public index right after it writes, and warns with pkg_not_indexed if that version is not there. The upload itself succeeded, so it is not a failure.

verify says the same thing: when an apt/rpm package is missing, the first explanation is “waiting on the index, or still private” — not “broken”.

verify works without local records

verify used to start from the record of what you published (.wharfy/state.json). That record is generated locally, so it reaches neither another job nor a fresh clone. A workflow that checks out and runs verify saw most channels fall through to skipped, and checked almost nothing.

Now the version to verify falls through a chain:

order source
1 --version <v>, named explicitly
2 the publish record for that channel
3 the channel itself (the latest GitHub Release)
4 the most recent git tag

No local record, or a HEAD that has moved past the tag — the version you shipped still gets verified.

$ wharfy verify
✓ verified homebrew; partial releases, script, goinstall, apt, rpm; skipped scoop

Fixed

Getting it

brew upgrade wharfy / scoop update wharfy / go install github.com/ShiroDoromoto/wharfy/cmd/wharfy@latest. On Linux, from the apt / yum repo.