Releases: jdx/packslip
Release list
v1.0.0: The format goes to version 1
packslip declares its manifest format stable at version 1 and cuts the CLI and GitHub Action to 1.0.0. The rest of this release is a batch of fixes and small CLI additions found while wiring packslip into the release runs of the jdx.dev CLIs. packslip remains a work-in-progress proposal with only experimental mise support; version 1 fixes the field meanings, names, vocabularies, and selection rules that consumers rely on, but "version 1" of the format and the crate's semver are different numbers, and a future version 2 would be its own predicate type published alongside this one rather than a break of anything signed under release/v1.
Added
-
Platform scoping for
packslip create --resource, so a release with a per-platform layout no longer needs a generatedpackslip.tomlfor a one-line difference. The scope goes after the kind head as@os,@os/arch, or@os/arch/libc; the@is only split off the closed grammar of the kind, so an@inside anexecargv or arepopath is left untouched. The Action'sresources:lines pass through unchanged, so this works there with no new input. (#64, @jdx)packslip create --resource 'man@linux=archive:share/man/man1/tool.1' packslip create --resource 'completion/zsh@darwin/aarch64=archive:share/zsh/site-functions/_tool'
-
A
--format FILENAME=FORMATflag and a matchingformatsinput on the Action, so a vendor can name an artifact's file type without a manifest when inference cannot read it from the name. The value stays open, so a vendor may declare a type this specification does not name. (#65, @jdx) -
A
tests/conformance/suite of plain-JSON cases covering artifact selection, resource selection, tag parsing, and statement validity, for other implementations (mise's consumer being the immediate reader) to test against. (#62, @jdx)
Fixed
packslip createnow infersformat = "raw"for a bare executable whose name ends in a dotted version, such asmise-v2026.9.1-linux-x64. Previously the version tail was mistaken for an extension, no known format matched, and the bare artifact landed in the manifest with noformatfield at all, leaving a consumer nothing to go on. (#59, @jdx)- An
archiveresource source no longer applies to a bare-format artifact (raw,gz,xz,zst,bz2). An archive entry names a path inside the selected artifact, but a bare artifact has no paths inside it, so a consumer that picked the bare executable was being told to hunt for a file inside the binary. The same resource can still reach a bare artifact through anassetorreposource. Naming a bare artifact from anarchiveentry is now its own document error rather than being misreported as a platform-scope problem. This lets a project that ships both tarballs and a bare executable per platform collapse many hand-named entries into a single unscoped one. (#63, @jdx) - The
packslip.dev/releases/v1predicate URL, written into every signed release list, previously 404'd; it is now an alias onto the specification, and the generated JSON schemas now carry an$idnaming their published URL. (#62, @jdx)
Changed
- The GitHub Action's
attestinput gains a third mode,link. It writes theprovenancelinks onto the manifest without re-attesting, for workflows where the build jobs already attested each artifact — the stronger claim, since the attestation is made by the job that did the build. GitHub serves an artifact's provenance at the same URL whoever attested it, solinkneeds noattestations: writepermission. It belongs only in a workflow that really does attest every file it publishes, since an unattested artifact would leave a dead link. An unrecognizedattestvalue now fails the step instead of being silently treated asfalse. (#60, @jdx)
Breaking Changes
- Every artifact in a signed release must now declare a
format. An artifact with no format is unselectable by construction —select_artifactskips it — so this is enforced in the spec, the JSON schema,validate(which now names the offending artifact), andpackslip create(which refuses to write one and names the two ways out: set--formator leave the file out ofartifacts). Broadartifactsglobs that previously swept up non-installable files such as.dylib/.dllFFI libraries or C headers will now fail at create time until those files are excluded or given a format. (#65, @jdx) - The format is declared stable at version 1, and the CLI and Action move to 1.0.0. From this release the Rust API is covered by the crate's semver and checked by
semver_check; a verify-only consumer takes the crate withdefault-features = false. (#62, @jdx)
Full Changelog: v0.3.1...v1.0.0
v0.3.1: Slim verify-only builds via optional Cargo features
A small release that makes the packslip crate's CLI, generator, and signing paths optional Cargo features, so verify-only consumers can pull in a much slimmer dependency graph. packslip remains a work-in-progress proposal with only experimental mise support; the release/v1 format and CLI may still change.
Changed
-
The crate is now split into additive Cargo features, all on by default, so the
packslipbinary and existing dependents are unaffected. A consumer that only verifies a manifest can take the crate withdefault-features = false, dropping the archive readers, the ELF/Mach-O/PE decoder, the Fulcio/OIDC and minisign signing path, the JSON Schema generator, and the CLI — roughly seventy fewer crates in the dependency graph. (#57, @jdx)cargo add packslip --no-default-features
With defaults off you keep the statement types,
verify,verify_release_list,select_artifact, andselect_resources. Available features:Feature Adds cli(default)The packslipbinary; implies the rest.createBuild a statement from built artifacts; implies archive,linkage,sign.archiveRead tar and zip archives to resolve declared executable paths. linkageDerive requires.libsfrom ELF, Mach-O, and PE executables.signSign statements, keylessly through Fulcio or with a minisign key. manifestRead a packslip.toml.schemaStatement::schema()andReleaseListStatement::schema().
Full Changelog: v0.3.0...v0.3.1
v0.3.0: Discovery, resources, host requirements, and a hardened release path
packslip v0.3.0 is a large, format-shaping release for the draft release/v1 proposal. It defines how consumers discover and order releases, expands what a signed manifest can describe beyond executables, records what a release needs from the host, and hardens the CLI, GitHub Action, and release pipeline. packslip remains a work-in-progress proposal with only experimental mise support, and this release changes the version 1 format and CLI incompatibly.
Highlights
- Discovery and ordering are now specified: releases are found through GitHub tag discovery or a signed release list, and versions are ranked by semver precedence derived from the
versionstring rather than separate signed fields or list order. - A manifest can describe far more than binaries: resources (completions, man pages, usage CLI specs, agent skills, desktop/icon/app entries), host requirements (shared libraries and required commands), open
extensionsfor vendor- and consumer-defined data, and per-platform/per-artifact scoping. - The release path is finished end to end: notarized macOS arm64, a native Windows arm64 build, crates.io publishing via Trusted Publishing, an attested CLI spec shipped with each release, and a GitHub Action that can run a caller-supplied CLI.
Added
- Release discovery and required release lists. A GitHub tag names a release's version (
v?<version>, optionally after a monorepo subpath or the repo name), so consumers can enumerate versions with a single API call. Projects off a forge publish a signedreleases/v1list at.well-known/packslip/<path>.json; a forge project may commit a supplementary signed list to yank or flag releases. Third-party publishers (registries, mirrors, scanners) can publish per-vendor lists carryingevidenceand the vendor'stag, trusted per host. (#27, ec657a1 by @jdx) - Explicit artifact selection. Selection is a defined algorithm — absent
os/arch/libcmatch any host, unlabelled artifacts are the default, most specific match wins, then the consumer's format preference, and a tie is a vendor error — exported asselect_artifact. New formatsgz,xz,zst,bz2, andtarare recognized, and a.exeis treated as a program unless its name says setup or install. (#27 by @jdx) - A
resourceslist describing what a release ships beyond executables:completion,man,cli-spec(usage format),skill,desktop,icon, andapp, each with exactly one verifiable source (archive,asset,repo, orexec), plus ausageCLI spec so consumers can derive completions, man pages, and docs without running vendor code at install time. Unknown kinds are allowed and ignored. Author viapackslip create --resource KIND[/QUALIFIER]=SOURCE:VALUE(repeatable) or the Action'sresourcesinput. (#5, #33, #37, #41 by @jdx) - Resource scoping. Resources can be scoped by
os/arch/libcfor platform-specific layouts, and further scoped to one exact artifact filename, ranked ahead of platform-only entries. (#43 by @jdx) - Host requirements. Artifacts can declare what the host must already provide, in OS-resolved names rather than package names:
requires.libs(shared libraries the binaries load, populated bycreateopening archives and parsing ELF/Mach-O/PE headers, with the C runtime baseline filtered out) andrequires.bin(required commands via--require bin:NAME[@MIN]). Use--no-libsto skip opening archives;verifyandcreateprint per-artifact requirements. (#32 by @jdx) extensionsobjects on the release predicate, each artifact and resource, and the release list and its entries, for vendor- (by domain) and consumer- (by name) defined JSON that never collides with a future field. Set release-level values withpackslip create --extension NAME=JSONor the Action'sextensionsinput. (#26 by @jdx)- Vendor-selected latest version. An optional signed release-list
latestpointer lets a vendor recommend a specific version (for example, ship 3.0.0 while recommending 2.8.4). Set it withpackslip releases --latest VERSION; resolution falls back to the GitHub latest pointer, then highest eligible semver. (#46 by @jdx) - TOML release manifests.
packslip create --manifest release.tomldescribes per-artifact executables, formats, requirements, variants, portability, and scoped resources; CLI flags override it and positional artifacts merge with it.--bin toolis resolved to its real path inside an archive using pure-Rust decoders, and--provenance FILENAME=URL/releases --evidence URL=KIND[=DETAIL]are supported. (#27 by @jdx) - A generated CLI reference published on packslip.dev, kept in sync with the CLI via usage. (#15 by @jdx)
- macOS arm64 releases are now signed and notarized, and a native Windows arm64 build ships (replacing
darwin-x64, which Rosetta 2 covers); crates.io publishing moved to Trusted Publishing. (#54 by @jdx) - Each release now publishes
packslip.usage.kdlas an attested asset and includes it as a verifiedcli-specresource in the signed manifest. (#45 by @jdx) - The GitHub Action can run a caller-supplied packslip binary via
packslip-path(a path or a name on PATH), skipping the download and its attestation check — useful on platforms packslip does not ship or on restricted runners. A binary the action did not download is not verified; the job vouches for it. (#55 by @jdx)
Fixed
createrefuses two different assets that share a file name instead of silently collapsing them and giving a later resource the wrong digest. (#17 by @jdx)- Android detection now recognizes the
armv7-linux-androideabitriple, which was previously misrecorded aslinux/gnu. (#31 by @jdx) - The Windows install path in the Action unpacks release zips so
packslip.exelands on PATH. (#55 by @jdx)
Changed
- The GitHub Action and CLI are now versioned in lockstep. For the current 0.x line, use
jdx/packslip@v0; the formerv1alias no longer advances on 0.x releases. The explicitpackslip-versionoverride remains available. (#49 by @jdx)
Breaking Changes
- Versions must be semver 2.0.0 (calver such as
2026.9.1qualifies);create,releases, andverifyreject anything else. Theprerelease,channel, andversion_orderfields are removed from the predicates: a prerelease is a version with a prerelease part, the channel is derived from it, and consumers always rank by semver precedence rather than list order. The corresponding--prerelease,--channel, and--version-orderflags and Action inputs are gone;verifystill reports prerelease and channel, derived at read time. (#18 by @jdx) - The
supersedesfield and--supersedesflag are removed. Rollback protection lives in the signed release list'ssequence. Documents that still carry the field remain parseable, butcreateno longer emits it. (#16 by @jdx) - The top-level
sbomfield and--sbomflag are removed; an SBOM is now a resource kind with a digested source. A bare-format artifact'sbinmust be the artifact's own file. (#27 by @jdx) - The Action drops the
sbomURL input and keys provenance by file name. (#27 by @jdx)
New Contributors
Full Changelog: v0.2.0...v0.3.0
v0.2.0
v0.1.0
Full Changelog: https://github.com/jdx/packslip/commits/v0.1.0