All checks were successful
joule-moq-remote host agent / joule-moq-remote · does this change touch it (pull_request) Successful in 6s
joule-moq-room room service / joule-moq-room · does this change touch it (pull_request) Successful in 8s
joule-moq-web browser client / joule-moq-web · does this change touch it (pull_request) Successful in 6s
standards workspaces build + test / which workspaces this change touches (pull_request) Successful in 8s
wai-audit collector and player integration / does this change touch it (pull_request) Successful in 7s
WAI operation catalogue / does this change touch it (pull_request) Successful in 7s
wai-app and Create / wai-app · does this change touch it (pull_request) Successful in 15s
WAI breaking changes and the conformance runner / WAI breaking · does this change touch WAI (pull_request) Successful in 14s
WAI conformance / does this change touch it (pull_request) Successful in 5s
WAI examples / WAI examples · does this change touch them (pull_request) Successful in 7s
wai-fleet service / does this change touch it (pull_request) Successful in 5s
WAI energy receipts / does this change touch it (pull_request) Successful in 18s
WAI JPEG-AI whole decode (pinned inputs, required) / does this change touch it (pull_request) Successful in 8s
wai-key-proxy / does this change touch it (pull_request) Successful in 8s
wai-ledger service / does this change touch it (pull_request) Successful in 5s
wai-pack / wai-pack · does this change touch it (pull_request) Successful in 8s
wai-quantum docs, course and locales / does this change touch it (pull_request) Successful in 6s
wai-ops-gpu integer operators on GPUs / does this change touch it (pull_request) Successful in 9s
WAI neural sink gates / does this change touch it (pull_request) Successful in 19s
wai-quantum for JavaScript / does this change touch it (pull_request) Successful in 7s
wai-quantum WebGPU member / does this change touch it (pull_request) Successful in 6s
wai-quantum studio and desktop / does this change touch it (pull_request) Successful in 10s
wai-sink-android native sink library / does this change touch it (pull_request) Successful in 7s
WAI mbt2018_mean integer decode (regenerated vectors) / does this change touch it (pull_request) Successful in 11s
wai-web reach builds / wai-web reach · does this change touch it (pull_request) Successful in 7s
wai-web wasm32 / does this change touch it (pull_request) Successful in 8s
WAI Studio / does this change touch it (pull_request) Successful in 11s
wai-sink-swift native sink package / does this change touch it (pull_request) Successful in 17s
joule-code conformance gate / joule-moq-relay, every target (pull_request) Successful in 3m4s
joule-code conformance gate / Build + round-trip C1-C4 vectors (pull_request) Successful in 3m16s
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (pull_request) Successful in 2m5s
joule-code conformance gate / joule-moq-ingest, every target (pull_request) Successful in 5m8s
WAI conformance / fast integer kernels, every x86_64 kernel set (AVX-512 silicon) (pull_request) Successful in 3m22s
joule-code conformance gate / joule-moq-relay, its own energy on a counter (macos) (pull_request) Successful in 36s
wai-app and Create / wai-app · tests, clippy, the line language's verifier (linux) (pull_request) Successful in 35s
wai-audit collector and player integration / collector · linux (pull_request) Successful in 1m8s
wai-quantum WebGPU member / member · DX12 and Vulkan (cbio-windows) (pull_request) Successful in 12m1s
WAI breaking changes and the conformance runner / WAI breaking and conform · their tests, and the independent verifiers through wai conform · linux (pull_request) Successful in 2m42s
WAI conformance / cross-arch byte-equality · linux (pull_request) Successful in 27s
WAI breaking changes and the conformance runner / WAI breaking · wire, record and API against main · linux (pull_request) Successful in 3m10s
WAI conformance / faces from keypoints under wasm32-wasip2 (wasmtime) (pull_request) Successful in 1m42s
WAI operation catalogue / the catalogue and every door · linux (pull_request) Successful in 6m13s
WAI conformance / quantum core and corpus under wasm32-wasip2 (wasmtime) (pull_request) Successful in 4m14s
wai-quantum WebGPU member / member · integrated GPU, Vulkan (framework-128gb) (pull_request) Successful in 10m34s
wai-fleet service / service · linux (pull_request) Successful in 2m26s
wai-ledger service / service · linux (pull_request) Successful in 2m2s
wai-key-proxy / proxy · linux (pull_request) Successful in 2m59s
wai-pack / wai-pack · linux (pull_request) Successful in 2m5s
wai-quantum docs, course and locales / the Studio's words in every locale · linux (pull_request) Successful in 26s
wai-quantum docs, course and locales / the course and the command line's languages · linux (pull_request) Successful in 2m45s
wai-quantum WebGPU member / member · GPU, Vulkan (jetson-hub) (pull_request) Successful in 22m31s
WAI JPEG-AI whole decode (pinned inputs, required) / fetch pinned JPEG-AI inputs → whole decode + pixel hash, required (pull_request) Successful in 7m26s
WAI neural sink gates / model-free refusals of the neural sink (pull_request) Successful in 2m2s
WAI examples / WAI examples · portable · linux (pull_request) Successful in 9m31s
WAI neural sink gates / the exact JPEG-AI decoder reports its path (pinned inputs, required) (pull_request) Successful in 2m52s
wai-quantum WebGPU member / member · GPU, Vulkan (thor) (pull_request) Successful in 24m59s
wai-quantum WebGPU member / member · software Vulkan (linux) (pull_request) Successful in 2m16s
wai-quantum for JavaScript / javascript · linux (pull_request) Successful in 3m47s
wai-quantum WebGPU member / shader checks · browser build · wasip2 inertness (pull_request) Successful in 3m57s
wai-quantum studio and desktop / studio · browser (pull_request) Successful in 3m53s
wai-web reach builds / wai-web reach builds · the package of record, every output as recorded (pull_request) Successful in 2m57s
WAI Studio / the catalogue's actions, the unit tests and the core · linux (pull_request) Successful in 1m6s
wai-ops-gpu integer operators on GPUs / builds · no adapter is not a pass (linux) (pull_request) Successful in 8m6s
wai-quantum studio and desktop / desktop app · windows (pull_request) Successful in 9m36s
WAI energy receipts / energy receipts · linux (pull_request) Successful in 14m34s
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Successful in 6m37s
wai-web reach builds / wai-web reach builds · this tree's wai-web, every rung on its engine line (pull_request) Successful in 5m30s
WAI conformance / cargo-class corpora · linux (pull_request) Successful in 19m54s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 5m27s
wai-quantum studio and desktop / desktop app · linux (pull_request) Successful in 12m3s
WAI Studio / Studio in WebKit · linux (pull_request) Successful in 10m30s
wai-quantum docs, course and locales / every command and snippet in the docs · linux (pull_request) Successful in 22m30s
joule-moq-remote host agent / joule-moq-remote, every target (macos) (pull_request) Successful in 1m2s
wai-audit collector and player integration / collector, player integration and the browser end to end · macos (pull_request) Successful in 1m52s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 12m16s
joule-moq-remote host agent / joule-moq-remote, every target (linux-arm64) (pull_request) Successful in 1m20s
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (pull_request) Successful in 17m11s
WAI conformance / cross-arch byte-equality · macos (pull_request) Successful in 30s
WAI conformance / codec wrappers · fuzz smoke, text decode limits, C entry points, provenance, the semantic path (pull_request) Successful in 1m10s
joule-moq-room room service / joule-moq-room, every target (pull_request) Successful in 3m54s
wai-app and Create / wai-app · Create, browser end-to-end (macos) (pull_request) Successful in 7m52s
wai-fleet service / service · macos (pull_request) Successful in 43s
WAI conformance / v2 vocabulary · manifests validate as stated (pull_request) Successful in 30s
standards workspaces build + test / joule-code-rs (joule-code/joule-code-rs, joule-code-rs, linux-arm64, true) (pull_request) Successful in 6m52s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 9m7s
wai-ledger service / service · macos (pull_request) Successful in 1m26s
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (pull_request) Successful in 17s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 20m26s
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Successful in 43s
wai-pack / wai-pack · macos (pull_request) Successful in 4m19s
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Successful in 2m38s
WAI conformance / each feature of the independent verifiers' steps compiles alone (pull_request) Successful in 13m34s
wai-quantum WebGPU member / member · Metal (macos) (pull_request) Successful in 3m26s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 19m27s
wai-quantum WebGPU member / member · browser WebGPU (macos) (pull_request) Successful in 2m5s
WAI examples / WAI examples · the archive, the readiness check, the browser and Apple · macos (pull_request) Successful in 23m32s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 2m27s
WAI examples / WAI examples · android-app · linux-arm64 (pull_request) Successful in 7m32s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 37s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 19s
wai-ops-gpu integer operators on GPUs / Metal GPU and browser WebGPU (macos) (pull_request) Successful in 11m58s
wai-quantum studio and desktop / desktop app · macos (pull_request) Successful in 5m11s
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (pull_request) Successful in 7m35s
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (pull_request) Successful in 3m25s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 7m20s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 12m0s
WAI Studio / Studio in Chromium and Firefox · macos (pull_request) Successful in 10m54s
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (pull_request) Successful in 17m29s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 1h30m12s
The change of wai/toolchain-fixes (69f88e62f..074658780, 21 commits), on the fix branch: its changelog entries as files of wai/changes/, its wai-conformance.yml edits as step files, corpus files and test tags, and every other file as the branch has it. - b04013914 holdings: the registry lists WHD1, the record's magic (§4.1) - a184abb87 catalogue: upscale and tonemap are recorded in N3's verb list, and the doors' check knows them - 8db31a778 wai mcp: MCP 2026-07-28, the stateless revision, beside the three initialize negotiates - 052830194 wai.json: $schema, wai and name, and the schema of version 1 committed beside the reader - 163fc2017 wai create: every template carries an AGENTS.md - fe9b26fbc joule-moq-room: the example names the relay's WebSocket port, 4480, and one test holds every port - 359b5ba9d quickstart: the archive carries WAI Studio, wai-ingest and wai-quantum - 6334d88c8 joule-moq-room: the port table holds every daemon's default, and the listeners off until set - d38610de6 wai.json: the two workflows that hold the schema to its reader run when the schema changes - 179df52b7 catalogue: the two verbs joined the list after wai 0.4.0, not in toolchain 0.3.0 - 971cf5862 wai.json: a file of a later version is refused as that version before any member it adds - 1a59a39f7 wai.json: the reader takes a whole number however it is written, and the tests run the name pattern - d752fd9b4 wai.json: the release waits for the schema to be served, and version 1 is fixed by the first release that writes it - c213ed9db wai mcp: -32022 names as supported only the revisions a request may name, never the one asked for - 99b800f29 wai mcp: initialize negotiates 2025-11-25, the last revision with a handshake - e33021c3f catalogue: the near-synonym list is held in every text that states it, and the doors' check knows up - b99bb70be catalogue: the changelog records the near-synonym list held with the verb list - a0beb2163 quickstart: the wai formula and manifest depend on wai-quantum's own instead of installing a second copy - 0e5084031 quickstart: Studio's build leaves the checkout as it found it, and the examples workflow runs clean-machine.sh - 4cc4ae3d7 joule-moq-room: the port test reads the gateway's example with the gateway's own reader, and starts the gateway from it - 074658780 quickstart: the changelog names where Studio's build goes, not where it went before it shipped Co-Authored-By: Claude Opus 5.5 <[email protected]>
120 lines
4.7 KiB
Python
120 lines
4.7 KiB
Python
"""The package managers' entries for a release of the WAI command line, from the SHA-256 files
|
|
attached to it:
|
|
|
|
python3 wai/quickstart/formulae.py <version> <tag> <forge-api> <owner/repo> <public-url> <out-dir>
|
|
|
|
Writes <out-dir>/wai.rb (a Homebrew formula for macOS and Linux) and <out-dir>/wai.json (a
|
|
Scoop manifest for Windows). A platform whose archive is not attached is left out, and stderr
|
|
says so; with none at all, it fails. Each archive holds bin/ and share/wai/ (web/, the room
|
|
client, and studio/, WAI Studio), kept side by side as `wai dev` expects them.
|
|
|
|
Both install every binary of the archive but wai-quantum, and depend on wai-quantum's own
|
|
formula and manifest (wai/wai-quantum-cli/release/formulae.py) instead: the archive carries it
|
|
for install.sh, while a package manager that installed it twice, once in each package, would
|
|
have two packages claim one command (Homebrew refuses the second link, and Scoop's two shims
|
|
overwrite each other). wai/quickstart/test/formulae_test.py holds this to build.sh.
|
|
"""
|
|
|
|
import json
|
|
import os
|
|
import pathlib
|
|
import sys
|
|
import urllib.request
|
|
|
|
version, tag, api, repo, public, out = sys.argv[1:7]
|
|
token = os.environ.get("FORGE_TOKEN", "")
|
|
headers = {"User-Agent": "wai-release"}
|
|
if token:
|
|
headers["Authorization"] = f"token {token}"
|
|
web = api.rsplit("/api/v1", 1)[0]
|
|
|
|
|
|
def get(url):
|
|
with urllib.request.urlopen(urllib.request.Request(url, headers=headers), timeout=60) as r:
|
|
return r.read()
|
|
|
|
|
|
release = json.loads(get(f"{api}/repos/{repo}/releases/tags/{tag}"))
|
|
assets = {a["name"]: a for a in release.get("assets", [])}
|
|
|
|
|
|
def digest(archive):
|
|
if archive not in assets or archive + ".sha256" not in assets:
|
|
print(f"note: {archive} is not attached; left out", file=sys.stderr)
|
|
return None
|
|
return get(f"{web}/{repo}/releases/download/{tag}/{archive}.sha256").decode().split()[0]
|
|
|
|
|
|
def url(archive):
|
|
return f"{public}/releases/download/{tag}/{archive}"
|
|
|
|
|
|
DESC = "WAI, an open media standard: its command line, and a local relay and room service"
|
|
# The archive's binaries the two install (build.sh packs these and wai-quantum).
|
|
BINS = ["wai", "wai-relay", "wai-room", "wai-ingest", "wai-remote-host", "wai-pack"]
|
|
# wai-quantum's own formula, in this tap, and its own manifest, in this bucket.
|
|
QUANTUM_FORMULA = "transaction-science/tap/wai-quantum"
|
|
QUANTUM_MANIFEST = "wai-quantum"
|
|
HOME = "https://wai.transaction.science/docs/quickstart/"
|
|
targets = {
|
|
("macos", "arm"): "aarch64-apple-darwin",
|
|
("macos", "intel"): "x86_64-apple-darwin",
|
|
("linux", "arm"): "aarch64-unknown-linux-musl",
|
|
("linux", "intel"): "x86_64-unknown-linux-musl",
|
|
}
|
|
blocks = {}
|
|
for (os_name, cpu), triple in targets.items():
|
|
archive = f"wai-{version}-{triple}.tar.gz"
|
|
sha = digest(archive)
|
|
if sha:
|
|
blocks.setdefault(os_name, []).append(f' on_{cpu} do\n url "{url(archive)}"\n sha256 "{sha}"\n end\n')
|
|
win = f"wai-{version}-x86_64-pc-windows-msvc"
|
|
win_sha = digest(win + ".zip")
|
|
if not blocks and not win_sha:
|
|
sys.exit("no archive is attached to the release")
|
|
|
|
formula = f'''class Wai < Formula
|
|
desc "{DESC}"
|
|
homepage "{HOME}"
|
|
version "{version}"
|
|
license "Apache-2.0"
|
|
'''
|
|
for os_name in ("macos", "linux"):
|
|
if os_name in blocks:
|
|
formula += f" on_{os_name} do\n" + "".join(blocks[os_name]) + " end\n"
|
|
installs = ", ".join(f'"bin/{b}"' for b in BINS)
|
|
formula += f'''
|
|
# The quantum command line is a formula of its own: one copy, whichever is installed first.
|
|
depends_on "{QUANTUM_FORMULA}"
|
|
|
|
def install
|
|
# bin/ and share/wai/ side by side: `wai dev` finds the relay, the room service, the room
|
|
# client and WAI Studio beside its own binary. The archive's bin/wai-quantum is install.sh's;
|
|
# here it is the dependency's.
|
|
bin.install {installs}
|
|
(share/"wai").install "share/wai/web", "share/wai/studio"
|
|
end
|
|
'''
|
|
formula += '''
|
|
test do
|
|
assert_match "video-room", shell_output("#{bin}/wai create --list")
|
|
assert_match "delivered-verified", shell_output("#{bin}/wai hello #{testpath}/hello")
|
|
assert_match "verified", shell_output("#{bin}/wai verify #{testpath}/hello")
|
|
end
|
|
end
|
|
'''
|
|
pathlib.Path(out, "wai.rb").write_text(formula)
|
|
|
|
if win_sha:
|
|
manifest = {
|
|
"version": version,
|
|
"description": DESC,
|
|
"homepage": HOME,
|
|
"license": "Apache-2.0",
|
|
"architecture": {"64bit": {"url": url(win + ".zip"), "hash": win_sha, "extract_dir": win}},
|
|
# The zip's bin\\wai-quantum.exe is left to the dependency's own manifest and shim.
|
|
"depends": QUANTUM_MANIFEST,
|
|
"bin": [f"bin\\{b}.exe" for b in BINS],
|
|
}
|
|
pathlib.Path(out, "wai.json").write_text(json.dumps(manifest, indent=2) + "\n")
|
|
print(f"wrote the formula{' and the manifest' if win_sha else ''} for wai {version}")
|