| 1 |
|
- |
# mountaineer-sysop — todo
|
| 2 |
|
- |
|
| 3 |
|
- |
Status: Pre-v0. MVP slice complete: `sysop info`, `sysop motd`, `sysop services`, `sysop storage`, `sysop wifi`, `sysop net` all run on host with mock-or-real backend auto-detection. Yambar producers ready for `svc`, `zfs`, `net`. First interactive subcommand (`wifi`) lands a masked password input. Active: TBD — natural next is `sysop id` (large) or pause sysop for overlay/installer work.
|
| 4 |
|
- |
|
| 5 |
|
- |
## Phase 1 — sysop-tui primitives (open items)
|
| 6 |
|
- |
|
| 7 |
|
- |
- [ ] Re-verify on a real Mountaineer system (foot terminal, Iosevka, flatwhite-configured 24-bit color). Host-side macOS eyeball passed; the values may still need tuning once foot/helix/zellij/yambar ship the matching theme
|
| 8 |
|
- |
- [ ] `Footer` right-align option (deferred until a subcommand needs a left status segment)
|
| 9 |
|
- |
- [ ] Help overlay primitive (`?` action classifies; no overlay renderer yet)
|
| 10 |
|
- |
|
| 11 |
|
- |
## Phase 2 — `sysop info` (open items)
|
| 12 |
|
- |
|
| 13 |
|
- |
- [ ] Version field on the detail screen (requires per-tool version queries — shell out to `<tool> --version`, parse, cache; defer until subprocess plumbing is settled)
|
| 14 |
|
- |
- [ ] Runtime override: layer `/etc/mountaineer/roles.toml` on top of the compiled-in defaults (principle 2 — operator can see/edit). Currently only `include_str!` source
|
| 15 |
|
- |
- [ ] Server vs Sysadmin profile filter — graphical-layer roles should be hidden in `--server` mode
|
| 16 |
|
- |
|
| 17 |
|
- |
## Phase 3 — `sysop motd` (open items)
|
| 18 |
|
- |
|
| 19 |
|
- |
- [ ] `/etc/profile.d/sysop-motd.sh` glue script — calls `sysop motd print` on login. Lives in **mountaineer-build apkovl-src**, not this repo
|
| 20 |
|
- |
- [ ] Tip set worth revisiting once more `sysop` verbs exist — currently 6, drawn from AESTHETICS
|
| 21 |
|
- |
- [ ] Decide whether `sysop motd print` should respect a "first-login-of-the-day" suppression to avoid tip spam in tmux-heavy sessions
|
| 22 |
|
- |
|
| 23 |
|
- |
## Phase 4 — `sysop services` (open items)
|
| 24 |
|
- |
|
| 25 |
|
- |
- [ ] Detail view per service: dependencies, log path, time-in-state. Needs `s6-svstat` shell-out
|
| 26 |
|
- |
- [ ] Enable / disable / restart verbs. Requires real s6-rc; can't be meaningfully mocked, gate on live-system testing
|
| 27 |
|
- |
- [ ] Reflect transient state from `s6-rc-update` runs (currently only Up/Down are derived from `s6-rc -a list` + `-d list`)
|
| 28 |
|
- |
- [ ] Backend mismatch indicator — if mock is active on what looks like a Mountaineer system, surface that as a fault
|
| 29 |
|
- |
|
| 30 |
|
- |
## Phase 6 — `sysop wifi` (open items)
|
| 31 |
|
- |
|
| 32 |
|
- |
- [ ] Pre-scan: `iwctl station wlan0 scan` + brief wait before `get-networks`, so the cache is fresh on first invocation
|
| 33 |
|
- |
- [ ] `r` to rescan from the list view (calls iwctl scan, waits, refreshes)
|
| 34 |
|
- |
- [ ] Auto-detect interface name (currently hardcoded `wlan0`); `iwctl device list` is the source
|
| 35 |
|
- |
- [ ] Enterprise (8021x) flow — out of scope for MVP, currently a no-op on Enter; needs identity + cert/PEAP plumbing
|
| 36 |
|
- |
- [ ] iwctl `get-networks` text parsing is fragile; verify on a real Mountaineer install and adjust. D-Bus interface is the upgrade path if the text format proves too noisy
|
| 37 |
|
- |
- [ ] Disconnect verb (`sysop wifi disconnect`)
|
| 38 |
|
- |
- [ ] Promote the password input to a `sysop-tui` primitive once a second consumer exists (probably `sysop id` for passphrase entry)
|
| 39 |
|
- |
|
| 40 |
|
- |
## Phase 5 — `sysop storage` (open items)
|
| 41 |
|
- |
|
| 42 |
|
- |
- [ ] Detail view: vdev tree, error counters (read/write/cksum), scrub progress. Needs `zpool status -P <name>` parsing
|
| 43 |
|
- |
- [ ] Dataset view: `zfs list` — separate verb (`sysop storage datasets`?) or filtered detail screen
|
| 44 |
|
- |
- [ ] Snapshot management — read-only first (list), write later
|
| 45 |
|
- |
- [ ] Scrub trigger verb. Same caveat as services enable/disable — gate on live system
|
| 46 |
|
- |
|
| 47 |
|
- |
## Phase 7 — `sysop net` (open items)
|
| 48 |
|
- |
|
| 49 |
|
- |
- [ ] SSID enrichment for wireless: read `/var/lib/iwd/` or `iwctl station <iface> show` to populate `ssid` on the real backend (mock already returns it)
|
| 50 |
|
- |
- [ ] Default route / gateway display (`ip -json route show default` parsing)
|
| 51 |
|
- |
- [ ] Resolver liveness check — show whether unbound is reachable on 127.0.0.1:53 (would also feed a future `sysop info resolver` detail screen)
|
| 52 |
|
- |
- [ ] Yambar `net` segment should reflect the active default-route interface, not just wired-first. Currently wired-first heuristic
|
| 53 |
|
- |
- [ ] Detail view: per-interface MAC, MTU, link speed (ethtool for wired)
|
| 54 |
|
- |
|
| 55 |
|
- |
## Deferred (post-MVP scaffolding)
|
| 56 |
|
- |
|
| 57 |
|
- |
- [ ] `sysop logs <service>` — lnav front
|
| 58 |
|
- |
- [ ] `sysop id` — identity subsystem (full design in `mountaineer/todo.md`)
|
| 59 |
|
- |
- [ ] `sysop upgrade`, `sysop wg`, `sysop notifications mute`, `sysop podman-s6`
|
| 60 |
|
- |
- [ ] Tab completion (bash/zsh/nushell)
|
| 61 |
|
- |
- [ ] Man pages (mdoc; generated from clap?)
|
| 62 |
|
- |
- [ ] CI / reproducible builds story
|
| 63 |
|
- |
- [ ] Release artifact shape (static-linked musl binary in Alpine apk)
|
| 64 |
|
- |
|
| 65 |
|
- |
## Key Paths
|
| 66 |
|
- |
|
| 67 |
|
- |
- `Cargo.toml` — workspace root
|
| 68 |
|
- |
- `crates/sysop/` — CLI binary
|
| 69 |
|
- |
- `crates/sysop-tui/` — shared TUI primitives (flatwhite, footer chrome, selection, reserved keys)
|
| 70 |
|
- |
- `../mountaineer/AESTHETICS.md` — committed aesthetic/UX picks the TUI must honor
|
| 71 |
|
- |
- `../mountaineer/MANIFESTO.md` — principles 1, 2, 14, 15 are the load-bearing ones for this repo
|
| 72 |
|
- |
- `../mountaineer/STACK.md` — role→tool mappings consumed by `sysop info`
|
| 73 |
|
- |
- `../mountaineer/todo.md` — wider Mountaineer state and the `sysop id` design
|
| 74 |
|
- |
- `/Users/max/Code/CONTRIBUTING.md` — cross-cutting rules
|