nixcfg/packages/pi/update.py
Harald Hoyer aa3bc3c457 feat(pi): package @earendil-works/pi-coding-agent as pi
Vendors the npm tarball + lockfile and wraps the `pi` binary with `fd` and
`ripgrep` on PATH. Also installs it on the m4 darwin host.

`buildNpmPackage` is pulled from `inputs.unstable` because nixos-25.11's
`prefetch-npm-deps-0.1.0` panics on cacache index entries that contain
either multiple lines or JSON values with embedded spaces (npm's
`accept: application/...; q=1.0, ...` headers). For this lockfile,
`@esbuild/netbsd-arm64` and `@rollup/rollup-linux-x64-musl` trigger
both conditions and `--map-cache` fails with `EOF while parsing a
string at line 1 column 369`. Fixed upstream in nixos-unstable, which
now uses `lines()` + `split_once('\t')`.
2026-05-13 16:34:38 +02:00

73 lines
1.8 KiB
Python
Executable file

#!/usr/bin/env nix
#! nix shell --inputs-from .# nixpkgs#python3 --command python3
"""Update script for pi package."""
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent.parent.parent / "scripts"))
from updater import (
calculate_dependency_hash,
calculate_url_hash,
extract_or_generate_lockfile,
fetch_npm_version,
load_hashes,
save_hashes,
should_update,
)
from updater.hash import DUMMY_SHA256_HASH
from updater.nix import NixCommandError
SCRIPT_DIR = Path(__file__).parent
HASHES_FILE = SCRIPT_DIR / "hashes.json"
NPM_PACKAGE = "@earendil-works/pi-coding-agent"
def main() -> None:
"""Update the pi package."""
data = load_hashes(HASHES_FILE)
current = data["version"]
latest = fetch_npm_version(NPM_PACKAGE)
print(f"Current: {current}, Latest: {latest}")
if not should_update(current, latest):
print("Already up to date")
return
tarball_url = (
f"https://registry.npmjs.org/{NPM_PACKAGE}/-/pi-coding-agent-{latest}.tgz"
)
print("Calculating source hash...")
source_hash = calculate_url_hash(tarball_url)
if not extract_or_generate_lockfile(tarball_url, SCRIPT_DIR / "package-lock.json"):
return
# Update hashes.json
data = {
"version": latest,
"sourceHash": source_hash,
"npmDepsHash": DUMMY_SHA256_HASH,
}
save_hashes(HASHES_FILE, data)
# Calculate npmDepsHash
try:
npm_deps_hash = calculate_dependency_hash(
".#pi", "npmDepsHash", HASHES_FILE, data
)
data["npmDepsHash"] = npm_deps_hash
save_hashes(HASHES_FILE, data)
except (ValueError, NixCommandError) as e:
print(f"Error: {e}")
return
print(f"Updated to {latest}")
if __name__ == "__main__":
main()