Captures the cut-and-publish workflow currently encoded only in scripts/publish-banger-release.sh and the CHANGELOG patterns. Covers: - Release artefacts + R2 paths + the install.sh-at-bucket-root contract. - Trust model recap (cosign pubkey pinned in both verify_signature.go and scripts/install.sh; drift check enforced by the publish script). - Pre-flight checklist: green smoke, CHANGELOG entry with the right Keep-a-Changelog headings, link-table bump, explicit callout when unit files changed (banger update swaps binaries, not units). - Cut order: publish first, tag after, verify from a clean machine. - Verification-release rule: any fix to runUpdate / unit templates / helper-daemon restart sequencing requires an immediate no-op +1 release so a host on the buggy version can update to it and observe the fix live with the new binary in the driver seat. v0.1.3 and v0.1.5 are the existing examples. - Patch vs minor: minor = exposed API/contract change (vsock guest- agent protocol, CLI flag removal, RPC shape, non-forward-compatible store schema); everything else is patch. - Sibling catalogs: kernel + golden-image entries are go:embed-ed, so they piggyback on the next banger release. - Mid-release recovery for signature drift, partial rclone, re-cut, and bad-tag cleanup (never reuse a version). AGENTS.md gets a one-liner pointer so the maintainer guide surfaces the runbook without duplicating it. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4.1 KiB
4.1 KiB
Repository Guidelines
Always run make build before commit.
Project Structure
cmd/banger,cmd/bangerd, andcmd/banger-vsock-agentare the three binaries. The first two are user-facing; the third is a companion that ships inside each guest VM.internal/contains the daemon, CLI, RPC, storage, Firecracker integration, and guest helpers.internal/daemon/is the composition root; pure helpers live in its subpackages (opstate,dmsnap,fcproc,imagemgr,workspace). Seeinternal/daemon/ARCHITECTURE.md.internal/imagecat/andinternal/kernelcat/embed the image + kernel catalogs.images/golden/is the Dockerfile for thedebian-bookwormcatalog entry.scripts/contains manual helper workflows for rootfs, kernel, and bundle preparation.build/bin/is the canonical source-checkout build output.build/manual/is the canonical source-checkout location for manual rootfs/kernel artifacts.
Build and Test
make buildbuilds./build/bin/banger,./build/bin/bangerd, and./build/bin/banger-vsock-agent.make testrunsgo test ./....make lintrunsgofmt -l,go vet ./..., andshellcheck --severity=erroronscripts/*.sh. Run before commits../build/bin/banger doctorchecks host readiness../build/bin/banger vm runis the primary user-facing entry point — auto-pulls the default image + kernel from the catalogs if missing../build/bin/banger image pull <name>uses the bundle catalog (fast) when<name>is a catalog entry, or falls through to the OCI path for arbitrary registry refs. Seedocs/image-catalog.mdanddocs/oci-import.md../build/bin/banger image register ...registers an unmanaged host-side image stack../build/bin/banger image promote <image>copies an unmanaged image into daemon-owned managed artifacts.scripts/make-generic-kernel.shbuilds a Firecracker-optimized vmlinux from upstream sources.scripts/publish-kernel.sh <name>publishes it to the kernel catalog.scripts/publish-golden-image.shrebuilds + publishes the golden image bundle and patches the image catalog.scripts/publish-banger-release.sh <vX.Y.Z>cuts a banger release. Full runbook indocs/release-process.md.
Image Model
- Managed images own the full boot set: rootfs, optional work-seed, kernel, optional initrd, and optional modules.
- The image catalog ships pre-built bundles.
vm runauto-pulls the default catalog entry;image pull <name>can be invoked explicitly. default_image_namedefaults todebian-bookworm. On miss, the daemon auto-pulls fromimagecatbefore surfacing "not found".- Kernel references follow the same auto-pull pattern against
kernelcat.
Config
- Config lives at
~/.config/banger/config.toml. - Firecracker comes from
PATHby default, orfirecracker_bin. - SSH uses
ssh_key_pathor an auto-managed default key at~/.local/state/banger/ssh/id_ed25519.
Coding Style
- Prefer small, direct Go code and standard library solutions.
- Keep shell scripts strict with
set -euo pipefail. - Use
gofmtfor Go formatting. - When a CLI accepts either an inline string or a file input, always prefer the file-based form.
- For shell commands and AI/LLM tooling, prefer passing files as input whenever the CLI allows it.
- Create temporary files as needed to follow the file-first rule.
- Examples: use
git commit -F <file>instead ofgit commit -m <message>, and use prompt files instead of inline prompt strings when invoking LLM CLIs.
Testing Guidance
- Primary automated coverage is
go test ./...(wired throughmake test). make coverageruns the suite with-coverpkg=./...and prints per-package averages plus a total;make coverage-htmlwrites a browsable report tocoverage.html;make coverage-totalprints just the total (for scripts/CI).- For lifecycle changes, smoke-test with
vm runend-to-end (covers create + start + boot + ssh). - If guest provisioning changes, document whether existing images must be rebuilt or recreated.
Security
- Do not commit secrets.
- VM workflows require
sudoand/dev/kvm. - The default SSH key is local configuration, not a checked-in runtime artifact.