Skip to content

chore(release): 0.3.0 release pipeline, CI, and version gate - #16

Merged
alleneubank merged 2 commits into
mainfrom
chore/release-0.3.0
Aug 21, 2026
Merged

alleneubank merged 2 commits into
mainfrom
chore/release-0.3.0

Conversation

@alleneubank

Copy link
Copy Markdown
Owner

The last tag (v0.2.11) predates PR #14 (Zig 0.16 migration, 9 security fixes, feature parity) and PR #15 (pi package) — none of that work is published. The four version manifests had also drifted apart (0.2.10 vs 0.2.11), and nothing in the repo would have caught it.

What this adds

scripts/check-versions.sh — fail-closed gate over package.json, .claude-plugin/plugin.json, npm/*/package.json, and the wrapper's optionalDependencies pins. Observed red against the real drift before the bump:

npm/linear-cli/package.json: 0.2.11 != 0.2.10
npm/linear-cli optionalDependencies['@0xbigboss/linear-cli-darwin-arm64']: 0.2.11 != 0.2.10
FAIL: manifests disagree

.github/workflows/ci.yml — the repo had no CI at all, only a tag-triggered release. Runs zig fmt --check, the unit suite, the version gate, and the npm cross-compile targets (never exercised by zig build test, so a target-specific break only showed up at release time).

release.yml — now cuts a GitHub release with per-platform tarballs (linear-<version>-<os>-<arch>.tar.gz + .sha256; macOS and Linux on both arches, Linux static musl) alongside the existing npm publish. Naming mirrors zmx and alleneubank/agent-statusline, which is the shape mise's github: backend resolves per platform — this is what lets the tool be fleet-tracked via mise instead of hand-installed.

Three defects fixed in the existing workflow while there:

  • fetch-depth: 0build.zig derives --version from git describe --tags, so a shallow clone made published binaries report a bare commit hash.
  • The version gate runs before publishing, not after.
  • chmod +x after download-artifact, which does not preserve the mode — the packaged binary has to stay executable for the npm wrapper.

DocsCHANGELOG.md for 0.3.0, a README Install section (npm / mise / direct download / source), the stale -Drelease-safe build flag corrected to -Doptimize=ReleaseSafe, repo URLs moved to the current owner (npm scope stays @0xbigboss), and the release contract recorded in CLAUDE.md.

Version

0.3.0 rather than a patch: the unreleased work removes --api-key, changes the defaults of auth show, issue view, and gql, and redefines search --fields.

Verification

  • zig fmt --check build.zig src — clean
  • zig build test — pass
  • ./scripts/check-versions.sh --expect 0.3.0 — pass (and red before the bump)
  • All four release tarballs built and unpacked locally: macOS arm64 binary runs, Linux assets confirmed statically linked, tarball root holds one linear

The last tag (v0.2.11) predates the Zig 0.16 migration, the credential
security audit, and the command-surface expansion, and the four version
manifests had already drifted apart (0.2.10 vs 0.2.11). Nothing published
those commits and nothing would have caught the drift.

- scripts/check-versions.sh: fail-closed gate over package.json,
  .claude-plugin/plugin.json, npm/*/package.json and the wrapper's
  optionalDependencies pins. Observed red against the real 0.2.10/0.2.11
  drift before the bump.
- Bump all manifests to 0.3.0. The tag stays the source of truth for the
  binary: build.zig derives --version from `git describe --tags`.
- .github/workflows/ci.yml: the repo had no CI at all. fmt check, unit
  suite, the npm cross-compile targets (never exercised by `zig build
  test`, so a target break only showed up at release time), and the
  version gate.
- release.yml: adds per-platform GitHub release tarballs
  (linear-<version>-<os>-<arch>.tar.gz + .sha256, macOS/Linux on both
  arches, Linux static musl) so mise's github: backend can track this
  tool across the fleet. Runs the version gate before publishing rather
  than after, sets fetch-depth: 0 so the published binary reports the tag
  instead of a bare hash, and restores the executable bit that
  upload-artifact drops.
- CHANGELOG.md for 0.3.0, README Install section, and repo URLs moved to
  the current owner (npm scope stays @0xbigboss).

Verified: zig fmt --check, zig build test, check-versions --expect 0.3.0,
and all four release tarballs built and unpacked locally (macOS arm64
binary runs; Linux assets statically linked).
The new CI caught it on its first run: `zig build test` has never been
able to compile on Linux. src/tests/main.zig calls libc setenv/unsetenv
and rebuilds its view of the environment from `std.c.environ` — the 0.16
migration's answer to `main` receiving a stale `envp` snapshot — but the
test module never declared a libc dependency. macOS links libSystem
implicitly, so every local run passed and the gap stayed invisible until
a Linux runner tried it.

`.link_libc = true` on the test root module only. The exe stays libc-free.

src/commands/auth.zig carried an unused `@cImport(termios.h)` left over
from the migration. `@cImport` is lazily evaluated, so it never forced a
libc dependency on the exe — which is exactly why nothing complained.
Removed rather than left as a latent one on a stdlib-only project.

Verified: `zig build test` passes on macOS, and the test binary now
compiles for x86_64-linux-musl and x86_64-linux-gnu (the run step fails
only because the host cannot execute Linux binaries; before this change
it failed at compile with "dependency on libc must be explicitly
specified").
@alleneubank
alleneubank merged commit 5784e8a into main Aug 21, 2026
2 checks passed
@alleneubank
alleneubank deleted the chore/release-0.3.0 branch August 21, 2026 15:49
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