CI build pipeline feeder for the numan official registry — implements the binary-delivery half of numan #30.
Default branch: main (aligned with numan-registry; client stays on master).
numan installs plugins from signed, hash-pinned binary artifacts (a plugin
install bails if sha256 is missing). Many popular Nushell plugins still ship
source-only — no prebuilt release binaries — so users would need a full Rust
toolchain to install them.
This repo closes that gap for selected plugins: it cross-compiles from immutable
upstream commits (with tags retained for human-facing provenance), packages one
archive per target, and publishes them as GitHub release assets.
numan-registry
then pins those URLs and signs the index with the official trust root.
Plugins that already publish compliant upstream release assets can be ingested
directly into numan-registry without a stop here. For the live catalog × Nu
matrix, see
docs/catalog-compat.md
in the registry. For demand-ranked candidates not yet built, see
docs/backlog.json here.
- This repo builds and hosts binaries only. It never holds signing keys.
- Signing stays in
numan-registry(production.yml+ the Ed25519 trust root). - Every hash is computed at intake by
numan-registry'sadd-package.pyfrom the uploaded asset — never hand-typed here. - Provenance (upstream repo + full commit + tag) is pinned in
manifest.jsonand each release. - Release tags and assets are immutable. The publishing workflow refuses an existing release; changed bytes require a new package version or explicit build revision. New releases are assembled and verified as run-owned drafts, then made public only after the complete asset set is confirmed.
Vulnerability reporting and scope: SECURITY.md.
| Path | Purpose |
|---|---|
manifest.json |
active[] = plugins built now; build matrix + target→runner map |
docs/backlog.json |
Demand-ranked plugin candidates (statuses, Nu deps per tag) |
docs/roadmap.md |
Repo-local build/handoff plan (points at consolidated 1.0 roadmap) |
Registry catalog-compat.md |
Master list of live official packages × Nu constraints |
.github/workflows/build.yml |
manual matrix build → package → release → emit spec |
.github/workflows/repo-safety.yml |
required manifest, test, archive, spec, and workflow checks |
.pre-commit-config.yaml |
local JSON format + README/backlog consistency hooks |
scripts/package_plugin.py |
normalize a built binary into a .tar.gz/.zip |
scripts/gen_spec.py |
emit a numan-registry kind:binary spec (no sha256) |
scripts/release_transaction.py |
claim, verify, finalize, or clean up an owned draft release |
x86_64/aarch64 Linux (gnu), x86_64/aarch64 macOS, x86_64 Windows.
Linux aarch64 cross-compiles via taiki-e/setup-cross-toolchain-action; the
rest build on native runners.
- Add the plugin to
manifest.jsonactive[](repo, immutable upstreamsource_commit, human-facing tag, bin, Nu version compat). - Run the build-plugins workflow manually with a non-empty
only=package list. It verifies every tag-to-commit mapping, builds all expected targets, refuses pre-existing releases/assets, publishes<name>-<version>, and uploads aspec-<name>.jsonartifact. Pushes and pull requests cannot publish. - Drop
spec-<name>.jsonintonuman-registry/specs/, runpython scripts/add-package.py --spec … --writethere (computes every sha256, merges + schema-validates the index). - Lifecycle-prove on a clean
NUMAN_ROOT(search → info → install → activate → doctor → list → remove → gc) on each target OS against a real Nu binary. - Open the registry PR; staging signs ephemerally, production signs with the trust root and publishes.
cptpiepmatz/nu-plugin-highlight@v1.4.16+0.114.1→nu_plugin_highlight1.4.16fdncred/nu_plugin_regex@v0.23.0→nu_plugin_regex0.23.0idanarye/nu_plugin_skim@v0.29.1→nu_plugin_skim0.29.1FMotalleb/nu_plugin_desktop_notifications@v0.114.1→nu_plugin_desktop_notifications0.114.1FMotalleb/nu_plugin_port_extension@v0.114.1→nu_plugin_port_extension0.114.1fdncred/nu_plugin_file@v0.26.0→nu_plugin_file0.26.0Yethal/nu_plugin_hcl@0.114.1→nu_plugin_hcl0.114.1FMotalleb/nu_plugin_image@v0.112.2→nu_plugin_image0.112.2drbrain/nu_plugin_prometheus@v0.12.0→nu_plugin_prometheus0.12.0fdncred/nu_plugin_emoji@v0.23.0→nu_plugin_emoji0.23.0fdncred/nu_plugin_json_path@v0.24.0→nu_plugin_json_path0.24.0fdncred/nu_plugin_parquet@v0.24.0→nu_plugin_parquet0.24.0Kissaki/nu_plugin_bson@v26.1140.0→nu_plugin_bson26.1140.0fnuttens/nu_plugin_hmac@0.27.0→nu_plugin_hmac0.27.0fdncred/nu_plugin_jwalk@v0.26.0→nu_plugin_jwalk0.26.0fdncred/nu_plugin_strutils@v0.22.0→nu_plugin_strutils0.22.0fdncred/nu_plugin_query_git@v0.24.0→nu_plugin_query_git0.24.0lizclipse/nu_plugin_ulid@v0.23.0→nu_plugin_ulid0.23.0rhino-linux/nu_plugin_nutext@0.6.2→nu_plugin_nutext0.6.2
These plugins are in manifest.json but have not yet been built by CI. They will
move to "Currently active" once the build succeeds and verified_with is populated.
dead10ck/nu_plugin_dns@v4.0.11→nu_plugin_dns4.0.11 (bumped from v4.0.10/Nu 0.113)tonythethompson/nu_plugin_qr_maker@v1.2.0→nu_plugin_qr_maker1.2.0 (fork: bumped from Nu 0.94)tonythethompson/nu_plugin_explore@v0.114.1→nu_plugin_explore0.114.1 (fork: bumped from Nu 0.102)
Generated specs include the schema's source block with the immutable upstream
commit in source.rev. Registry intake must preserve that provenance in the
signed index and independently download and hash every release asset.
Local checks mirror CI:
python3 scripts/format_json.py --check
python3 scripts/check_repo_consistency.py
python3 -m unittest discover -s scripts -p "test_*.py" -v
python3 scripts/validate_manifest.py --verify-upstreamOptional: pip install pre-commit && pre-commit install to run the
JSON format and consistency hooks on commit.
Reviewers follow REVIEW.md for severity labels, trust-boundary
invariants, and the review checklist.
See SECURITY.md for how to report issues in this build pipeline. Signed-index and client issues go to numan-registry and numan.