Repository navigation
feat(project): declare a repository's VMs in stoat.toml - #69
Conversation
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Reconcile named a fully-dropped recipe in UnsetParams, but by then Update had already removed it from Recipes, so manifestForVM refused it with ErrRecipeNotApplicable. Update now clears a dropped recipe's params and secrets itself, and removedParams skips a recipe no longer in the declaration since Update already covers it. Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
Signed-off-by: NovusEdge <novusedge0@gmail.com>
|
Important Draft PR not reviewedDraft PRs are not automatically reviewed by default.
To automatically review draft PRs, update your CodeRabbit configuration: reviews:
auto_review:
drafts: trueThanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
Live check at e1fdf97 on a temp project, cloud mode, 2048 MiB, 2 CPUs. Debian 13: Ubuntu 24.04: the same project with |
What changed
stoat.tomldeclares a repository's VMs.git clonethenstoat upbuilds them.internal/projectloads and validates the file in Reject mode, keeps declaration order, resolves shares inside the project afterEvalSymlinks, and reads the project's secrets.core.SpecFor,core.Diffandcore.Reconcileturn a declaration into a VM and keep it matching.imageanddiskare immutable; a change errors and namesstoat rm <key>.cpus,ramandsharesreportneeds_restart. Reconcile unsets params and secrets a declaration drops, and is a no-op on disk when nothing changed.vm.tomlrecords the project and its shares; qemu, apkovl, cloud-init and sshx mount every share.stoat initwrites the annotated sample;stoat statusreports state, health and drift.up,down,apply,waitandrmact on every declared VM in declaration order when given no argument. A bareupreconciles every declaration before it starts any.lsgains a project column and--project;newrefuses inside a project unless--global.project_*tools.Why
Spec
docs/specs/2026-09-04-project-file-design.md. A contributor should get the maintainer's VMs from the repository.Tests run
go build ./... && go test ./... && golangci-lint run ./...clean at the tip, rebased onto main after feat(mcp): serve MCP from the stoat binary #68.disknever reconciling; a bareupskipping later declarations after the first failure; params and secrets of a dropped recipe failing the update.stoat init, a barestoat up,statuswith drift,ls --project, thenewrefusal, project shares mounted over 9p in the guest, a baredownandrm. Evidence in the comment below.Deviations from the plan, all reviewed
confirmandqemu.Argssignatures were stale; main's won.Args.Projectcollided with mcp-go'smcp install --projectflag, renamed toArgs.InstallProject.upreconciles every declaration before any start. The plan's inline code reconciled inside the fan-out, which left later declarations uncreated after a first boot failure.tomlxReject mode now treats keys nested under amap[string]anyfield as known, pinned by tests; six remote-recipe fixtures moved from an unknown[vm]table to[project].