Implement the non-UI foundation for limen so the repository has a working Go module, Nix package, config parsing, advisory state persistence, relative-time formatting, and a JSON-printing CLI.
Scope
Initialize go.mod as github.com/KofTwentyTwo/limen with Go 1.22 or newer.
Add flake.nix exposing packages.default via pkgs.buildGoModule.
Implement internal/config for hosts.json per docs/DESIGN.md §7.1 and §9.1.
Enforce the exact public error strings from §9.1.
Implement internal/state for state.json per §7.2, including advisory reads and atomic writes.
Implement internal/format relative-time strings per §8.5.
Add main.go with no UI: load config and state, then print both as JSON to stdout.
Include unit tests for every logic package and an end-to-end sample hosts.json exercise.
Out of scope
Bubble Tea or Lip Gloss.
Host probing.
SSH invocation.
syscall.Exec handoff.
Terminal rendering.
Acceptance criteria
go test -race ./... passes.
go vet ./... passes.
go build ./... passes.
CI is green.
PR targets develop.
## Goal
Implement the non-UI foundation for limen so the repository has a working Go module, Nix package, config parsing, advisory state persistence, relative-time formatting, and a JSON-printing CLI.
## Scope
- Initialize `go.mod` as `github.com/KofTwentyTwo/limen` with Go 1.22 or newer.
- Add `flake.nix` exposing `packages.default` via `pkgs.buildGoModule`.
- Implement `internal/config` for `hosts.json` per `docs/DESIGN.md` §7.1 and §9.1.
- Enforce the exact public error strings from §9.1.
- Implement `internal/state` for `state.json` per §7.2, including advisory reads and atomic writes.
- Implement `internal/format` relative-time strings per §8.5.
- Add `main.go` with no UI: load config and state, then print both as JSON to stdout.
- Include unit tests for every logic package and an end-to-end sample `hosts.json` exercise.
## Out of scope
- Bubble Tea or Lip Gloss.
- Host probing.
- SSH invocation.
- `syscall.Exec` handoff.
- Terminal rendering.
## Acceptance criteria
- `go test -race ./...` passes.
- `go vet ./...` passes.
- `go build ./...` passes.
- CI is green.
- PR targets `develop`.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Goal
Implement the non-UI foundation for limen so the repository has a working Go module, Nix package, config parsing, advisory state persistence, relative-time formatting, and a JSON-printing CLI.
Scope
go.modasgithub.com/KofTwentyTwo/limenwith Go 1.22 or newer.flake.nixexposingpackages.defaultviapkgs.buildGoModule.internal/configforhosts.jsonperdocs/DESIGN.md§7.1 and §9.1.internal/stateforstate.jsonper §7.2, including advisory reads and atomic writes.internal/formatrelative-time strings per §8.5.main.gowith no UI: load config and state, then print both as JSON to stdout.hosts.jsonexercise.Out of scope
syscall.Exechandoff.Acceptance criteria
go test -race ./...passes.go vet ./...passes.go build ./...passes.develop.