Skip to main content

max / mountaineer-sysop

chore: move todo.md to private layer (gitignored)
Author: Max Johnson <me@maxj.phd> · 2026-06-05 00:22 UTC
Commit: d534621f90197687bca0a3ddfe80c03232bbacc6
Parent: 0612c94
2 files changed, +3 insertions, -74 deletions
M .gitignore +3
@@ -2,3 +2,6 @@
2 2 **/*.rs.bk
3 3 Cargo.lock.bak
4 4 .DS_Store
5 +
6 + # Private working files — live in _private/, synced via Syncthing
7 + todo.md
D docs/todo.md -74
@@ -1,74 +0,0 @@
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