Skip to content

v1.0.0: The format goes to version 1

Choose a tag to compare

@github-actions github-actions released this 05 Sep 03:46
· 19 commits to main since this release
0121abf

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 generated packslip.toml for 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 an exec argv or a repo path is left untouched. The Action's resources: 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=FORMAT flag and a matching formats input 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 create now infers format = "raw" for a bare executable whose name ends in a dotted version, such as mise-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 no format field at all, leaving a consumer nothing to go on. (#59, @jdx)
  • An archive resource 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 an asset or repo source. Naming a bare artifact from an archive entry 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/v1 predicate 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 $id naming their published URL. (#62, @jdx)

Changed

  • The GitHub Action's attest input gains a third mode, link. It writes the provenance links 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, so link needs no attestations: write permission. It belongs only in a workflow that really does attest every file it publishes, since an unattested artifact would leave a dead link. An unrecognized attest value now fails the step instead of being silently treated as false. (#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_artifact skips it — so this is enforced in the spec, the JSON schema, validate (which now names the offending artifact), and packslip create (which refuses to write one and names the two ways out: set --format or leave the file out of artifacts). Broad artifacts globs that previously swept up non-installable files such as .dylib/.dll FFI 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 with default-features = false. (#62, @jdx)

Full Changelog: v0.3.1...v1.0.0