- Nix 72.3%
- JavaScript 14%
- Rust 11.4%
- Shell 1.9%
- Just 0.4%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| overlays | ||
| packages | ||
| scripts | ||
| .gitignore | ||
| flake.lock | ||
| flake.nix | ||
| justfile | ||
| README.md | ||
jkpkgs
Personal binary packages for AI/LLM tools.
Package lifecycle
The standard flow for adding or updating a package:
- Add
packages/<name>/package.nixand version/hash metadata. - Add the package output; derive checks from the package set.
- Register update metadata in dotman.
- Stage new files before Git-backed Nix evaluation.
- Run
just checkandjust build [name...]. - Commit and push jkpkgs.
- Use the existing dotman propagation workflow.
- Verify the active profile, not only
./result.
Notes:
just buildwith no names builds all current-system packages.dotman jkpkgs checkanddotman jkpkgs listare fully offline; onlydotman jkpkgs updatetouches the network.- An update may move several package versions at once — check the commit contents before propagating.
- Active dotfiles paths live under
~/dev/dotfiles-personal, not~/dev/dotfiles.
Herdr source lifecycle
Herdr is source-backed: the package builds from the upstream
herdrdev/herdr source (pinned by the herdr flake input in
flake.lock) with the explicit local patch queue under
packages/herdr/patches applied on top. Source packages carry no release
hashes — the flake lock pins the exact upstream source, unlike the
hash-pinned binary and npm packages.
To change Herdr locally, edit the patch queue (or package.nix), verify
with nix build .#herdr, then commit, push, and propagate as usual.
The jkpkgs-refresh timer invokes dotman jkpkgs update --package-only
for the automated refresh. The source updater compares the evaluated
package version against the upstream release tag, updates the herdr
flake input, and builds/evaluates the patched package. If the new source
version does not match the release
tag, or the patches or build fail to evaluate, the updater stops before
any PR is created. On success it stages only the flake.lock change and
proposes it through the same reviewed Forgejo PR and Buildbot path as
other updates. Consumer lock propagation and host deployment remain a
separate, manual workflow.
Common commands
just check
just build
nix build .#pi
Pi fast-track workflow
Use this when pi needs a model metadata update before the normal automated update cycle has reached navi.
Normal released update
Prefer this whenever @earendil-works/pi-coding-agent is already published on npm.
- Check whether npm already has the version you need:
npm view @earendil-works/pi-coding-agent version - Update
packages/pi/package.jsonand regenerate its lockfile:npm --prefix packages/pi install @earendil-works/pi-coding-agent@<version> --package-lock-only --ignore-scripts - Update
packages/pi/hashes.json:version= the npm package versionnpmDepsHash= the hash reported by a failednix build .#pi, if it changed
- Verify the package:
cd ~/dev/jkpkgs nix build .#pi ./result/bin/pi --version ./result/bin/pi --list-models | grep '<model-or-family>' just check - Commit and push jkpkgs.
- Activate it on navi through dotfiles:
cd ~/dev/dotfiles-personal dotman flake update jkpkgs dotman deploy --local - Verify the active profile, not just
~/dev/jkpkgs/result:hash -r command -v pi readlink -f "$(command -v pi)" pi --version pi --list-models | grep '<model-or-family>'
Emergency unreleased acceleration
Use this only when upstream pi has the needed change on GitHub but npm has not published it yet.
First consider a local-only override in ~/.pi/agent/models.json. That is fastest and avoids package drift if only one machine needs the model.
If the packaged pi must carry the change:
- Find the upstream commit and issue/PR that contains the metadata.
- Prefer backporting the upstream generated metadata over hand-editing one line. Pi model support commonly touches generator source, generated provider catalogs, tests, and changelogs.
- Make the temporary nature obvious:
- version like
0.80.3-unstable-YYYY-MM-DD, or - a clearly named backport script with the upstream commit URL in a comment
- version like
- Add a build-time assertion that the expected model exists.
- Verify the package and active profile using the same commands as the normal update.
- Commit and push jkpkgs, then update/deploy dotfiles.
Do not mark the work done because ./result/bin/pi works. The user-visible binary is the one from the active profile (command -v pi).
Returning pi to normal releases
When npm publishes a pi release containing the temporary backport:
- Remove any temporary patch, source pin, or backport script.
- Set
packages/pi/package.jsonto the released@earendil-works/pi-coding-agentversion. - Regenerate
packages/pi/package-lock.jsonwith: npm --prefix packages/pi install @earendil-works/pi-coding-agent@ --package-lock-only --ignore-scripts - Set
packages/pi/hashes.json.versionto the real release version, with nounstablesuffix. - Refresh
npmDepsHashfromnix build .#piif needed. - Check that no temporary backport remains:
The model name may still appear only if it is part of the released package data, not a local patch.rg 'unstable|backport|gpt-5\.6|temporary' packages/pi - Verify and deploy through dotfiles as usual.
GPT-5.6 verification example
This is the checklist used for the GPT-5.6 fast-track incident:
hash -r
command -v pi
readlink -f "$(command -v pi)"
pi --version
pi --list-models | grep 'gpt-5\.6'
pi --print --no-tools --no-session --model openai-codex/gpt-5.6-sol 'Respond with exactly: hello world'
Expected final prompt output:
hello world