Add a localhost-only web console so VM and image management no longer depends on the CLI for every inspection and lifecycle action. Wire bangerd up to a configurable web listener, expose dashboard and async image-build state through the daemon, and serve CSRF-protected HTML pages with host-path picking, VM/image detail views, logs, ports, and progress polling for long-running operations. Keep the browser path aligned with the existing sudo and host-owned artifact model: surface sudo readiness, print the web URL in daemon status, and document the new workflow. Polish the UI with resource usage cards, clearer clickable affordances, cancel paths, confirmation prompts, image-name links, and HTTP port links. Validation: GOCACHE=/tmp/banger-gocache go test ./...
6.4 KiB
6.4 KiB
Repository Guidelines
Project Structure & Module Organization
cmd/bangerandcmd/bangerdare the primary user-facing entrypoints.internal/contains the daemon, CLI, RPC, storage, Firecracker, and system integration code.- The VM lifecycle is now organized around daemon capabilities plus a structured guest-config builder. New host-integrated VM features should plug into that Go path instead of adding more one-off branches through
internal/daemon/vm.go. customize.sh,make-rootfs.sh, andinteractive.shremain as manual rootfs/customization helpers; normal VM lifecycle, NAT,.vmDNS, and daemon-driven image builds are handled by the Go control plane.- Source checkouts use a generated
./runtime/bundle for Firecracker, kernels, modules, rootfs images, and helper copies. Bundle defaults come from./runtime/bundle.jsonwhen present. Those runtime artifacts are not meant to be tracked directly in Git. - The daemon keeps state under XDG directories rather than the old repo-local
state/layout.
Build, Test, and Development Commands
make buildbuilds./banger,./bangerd, and the bundled./runtime/banger-vsock-agentguest helper.make bench-createbenchmarksvm createand first-SSH readiness on the current host.make runtime-bundlebootstraps./runtime/from the archive referenced byRUNTIME_MANIFEST; the checked-inruntime-bundle.tomlis only a template.make void-kerneldownloads and stages a Voidlinux6.12kernel under./runtime/void-kernel, including extractedvmlinux, rawvmlinuz, a matching generatedinitramfs, config, and matching modules.make rootfs-voidbuilds an experimental local-onlyx86_64-glibcVoid rootfs plus work-seed under./runtime/; it prefers staged./runtime/void-kernelmodules when present, but does not replace the default Debian path or teachbanger image buildabout Void.make verify-voidregistersvoid-expand runs the normal smoke test against that image.bangervalidates required host tools per command and reports actionable missing-tool errors; do not assume one workstation's package set../banger vm create --name testboxcreates and starts a VM../banger vm createnow blocks until the guest reaches the daemon's default readiness checks and shows live progress stages on TTY stderr while it waits../banger vm ssh testboxconnects to a running guest using the runtime bundle SSH key and reminds the user if the VM is still running when the session exits../banger vm stop testboxstops a VM while preserving its disks../banger vm stop vm-a vm-b vm-cand./banger vm set --nat web-1 web-2are supported; multi-VM lifecycle andsetactions fan out concurrently through the CLI../banger doctorreports runtime bundle, host tool, feature, and image-build readiness from the same Go checks used by the daemon../banger image register --name local --rootfs /abs/path/rootfs.ext4creates or updates an unmanaged image record without changing the default image config; use it for experimental guest iteration paths such as Void.bangerdnow also serves a localhost web UI onhttp://127.0.0.1:7777by default unlessweb_listen_addr = ""disables it; the UI uses server-rendered templates, polls async VM/image operations, and keeps image path selection on the host via a server-side file picker.make testrunsgo test ./...../verify.shruns the smoke test for the Go VM workflow.
Coding Style & Naming Conventions
- Go code should stay small, direct, and standard-library-first unless there is a clear reason otherwise.
- Shell helpers use Bash with
set -euo pipefail; keep remaining shell scripts strict and explicit. - Prefer lowercase filenames with short descriptive names.
- Use
gofmtfor Go formatting; no extra formatter is configured for shell files.
Testing Guidelines
- Primary automated coverage is
go test ./.... - Manual verification for VM lifecycle changes:
./banger vm create, confirm SSH access, then stop/delete the VM. - For host-integration changes, run
./banger doctoras a quick readiness check before the live VM smoke. - The web UI follows the same sudo model as the CLI path: bangerd stays unprivileged and privileged writes only work when
sudo -vis already warm or sudo is passwordless. - Rebuilt images now include
mise,opencode, a host-reachable defaultopencodeserver service on guest TCP port4096,tmux-resurrect/tmux-continuumdefaults forroot, and thebanger-vsock-agentservice used by the SSH reminder and guest health-check path; if you change guest provisioning, document whether users need to rebuild./runtime/rootfs-docker.ext4or another base image to pick it up. - The experimental Void rootfs path now includes the repo's basic dev baseline plus Docker and Compose, alongside boot, SSH, a guest network bootstrap sourced from the kernel
ip=cmdline, the vsock HTTP health agent, pinnedmiseplusopencodeforroot, the default host-reachableopencodeserver service on guest TCP port4096, abashroot shell while leaving/bin/shalone, and the/rootwork-seed. When./runtime/void-kernel/exists, the Void image registration path expects a complete staged Void kernel, initramfs, and modules tree and pointsvoid-expat it. Keep further baked-in tooling deliberate and user-driven. - Rebuilt images also emit a
work-seed.ext4sidecar used to speed up future VM creates. Older managed images may take one slower create to refresh seeded SSH access before they rejoin the fast path. If you touch/rootprovisioning, verify both the rootfs and the work-seed output. - The daemon may keep idle TAP devices in a pool for faster creates. Smoke tests should treat
tap-pool-*devices as reusable capacity, not cleanup leaks. - If you add a new operational workflow, document how to exercise it in
README.md. - For NAT changes, verify both guest outbound access and host rule cleanup, for example with
./verify.sh --nat.
Commit & Pull Request Guidelines
- Git history uses short, imperative subjects.
- Prefer a real commit body when the change affects lifecycle behavior, storage semantics, or host integration.
- PRs should call out runtime requirements, migration impact, and any host-side verification performed.
Security & Configuration Tips
- The VM workflow requires
sudoand/dev/kvmaccess; do not commit secrets. id_ed25519lives inside the runtime bundle; rotate or replace it before publishing a shared bundle.