Skip to content

release: 0.7.2 - #65

Merged
lorem-dev merged 4 commits into
mainfrom
release/0.7.2
Sep 9, 2026
Merged

release: 0.7.2#65
lorem-dev merged 4 commits into
mainfrom
release/0.7.2

Conversation

@lorem-dev

Copy link
Copy Markdown
Owner

Release 0.7.2. Carries the accumulated develop work to main for tagging.

Linux CLI: a static musl build, chosen by the host's glibc

The prebuilt *-linux-gnu CLI is linked on the release runner (ubuntu-22.04,
glibc 2.35). A newer glibc runs older binaries but not the reverse, so on an
older distribution the binary exits with libc.so.6: version `GLIBC_2.34' not found before reaching main() -- the install looks successful and nothing
runs.

Releases now also carry a statically linked musl archive per architecture,
published alongside the glibc ones so pinned installs keep resolving the asset
name they already know. It costs one extra cargo build and no new tooling:
every crate in the CLI's tree is pure Rust with no -sys dependency.

scripts/install.sh reads the host's glibc and picks between them, with
SKILLKEEPER_LIBC=gnu|musl to override.

The desktop app is unaffected and keeps the glibc 2.35 floor: it links the
distribution's WebKitGTK and so cannot be static. That floor is now stated in
the docs, which it was not before.

Release safety added along the way

  • CI builds the x64 musl target and cross-checks arm64, so the first musl link
    never happens on a tag, where a failure stops publish and the tag has to be
    deleted and re-cut.
  • The publish job fails if any of the eight CLI archives is missing. Previously
    upload-artifact was set to warn and the staging step only rejected duplicate
    basenames, so a skipped archive step would have published a release with a
    hole in it.
  • A new check-glibc-floor skill keeps the floor consistent across the
    workflow, the installer, the docs and the download labels, and is part of
    pre-release-check.

Verification

  • Full gate green: prettier, eslint, 1084 JS tests, 1440 Rust tests,
    cargo fmt --check, check-version v0.7.2, no generated-artifact drift.
  • cargo check passes for both x86_64-unknown-linux-musl and
    aarch64-unknown-linux-musl.
  • scripts/install.sh exercised across 42 combinations of OS, architecture and
    glibc version under stubbed uname/getconf/ldd; the eight published
    assets exactly cover the six the shell installer can request plus the two the
    PowerShell installer requests. Clean under sh -n and dash -n.
  • Not verifiable off a Linux host: the final musl link. The new CI leg covers
    it before any tag.

lorem-dev and others added 4 commits September 9, 2026 09:17
chore: back-merge main into develop
* build: silence the ts-rs serde-attribute warning

Every `cargo clippy` run printed "failed to parse serde attribute".
`McpParameter::options` uses `deserialize_with` (see `mcp::model::de_options`)
to accept a YAML mapping as well as a list, and ts-rs has no concept of that
attribute, so it warns and skips it.

Skipping is the right thing: the field always SERIALIZES back as a plain list,
so the emitted `Array<McpOption>` is correct. The warning reported a decision
that was already right, on every run.

Nothing is lost by silencing it. The generated bindings are committed and CI
diffs them ("Fail on stale generated artifacts"), so if ts-rs ever emits a
different shape for this field the build fails with an error rather than a
warning nobody reads. Verified the bindings are byte-identical with the feature
on.

* refactor: move span keying out of the DescriptionText component

`pnpm lint` reported one warning for as long as this file has existed:
`react-refresh/only-export-components`, because `spansToKeyedParts` was
exported from a file that also exports a component.

The export was not gratuitous. Renderer tests here are node-only -- no jsdom,
no testing-library -- so a component cannot be unit tested, and the keying
rule (position-based, so two identical link spans stay distinct) has to live
where a test can reach it. The fix is to put it in its own module rather than
to stop testing it, which is the same split
`features/skillInstall/lib/installSelection.ts` already uses.

`DescriptionSpan` moves with it: the type is data the function transforms, not
part of the component's API, and the folder barrel now sources it from its
owner. Other layers were already importing their own `DescriptionSpan` from
`@/services/bridge`, so nothing outside this folder changes.

`pnpm lint` now reports nothing at all.
The prebuilt *-linux-gnu CLI is linked on the release runner (ubuntu-22.04,
glibc 2.35) and a newer glibc runs older binaries but not the reverse, so on
an older distribution it exits with "libc.so.6: version `GLIBC_2.34' not
found" before reaching main(). Releases now also carry a statically linked
musl archive per architecture, which depends on no system libc; this costs one
extra cargo build and no new tooling, since every crate in the CLI's tree is
pure Rust with no -sys dependency.

install.sh reads the host's glibc and picks between the two, falling back to
the gnu archive only on an HTTP error (an older release has no musl asset) and
never on a transport failure, which would otherwise misreport a flaky network
as a missing asset. A binary that cannot start now names the remedy and exits
non-zero instead of reporting success.

CI builds x86_64 musl and cross-checks aarch64 so the first musl link never
happens on a tag, and the publish job fails if any of the eight CLI archives
is absent rather than shipping a release with a hole in it. The new
check-glibc-floor skill keeps the floor consistent across the workflow, the
installer, the docs and the download labels, and is part of pre-release-check.

The desktop app is unaffected and keeps the glibc 2.35 floor: it links the
distribution's WebKitGTK and so cannot be static.
@lorem-dev
lorem-dev merged commit d736fa9 into main Sep 9, 2026
8 checks passed
@lorem-dev
lorem-dev deleted the release/0.7.2 branch September 9, 2026 11:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant