Commit graph

19 commits

Author SHA1 Message Date
Natalie
de1f7f2dec net-tools: multi-segment WireGuard hub model + bin/wg-render
Adds the missing reconciler piece: render each host's /etc/wireguard/wg1.conf
from data/mesh-hosts.json (WG config was previously hand-built).

- mesh.segments maps <segment> -> {hub, endpoint, dns_host, dns_listen}; hosts
  carry `segment` + `wg_pubkey` (public key only). iceland(yuzu) and nyc3(citron)
  are independent stars. Legacy single-hub (mesh.hub) still works as fallback.
- bin/wg-render: --keygen/--pubkey bootstrap, --dry-run/--whoami inspect,
  --apply installs + `wg syncconf` (idempotent, rollback). Hub gets a [Peer] per
  spoke + ip_forward/MASQUERADE; spoke gets one [Peer] = its hub. WG_RENDER_SELF
  override for tests/ops.
- bin/wg-dns-sync: segment-aware listen — a segment's dns_host binds its own
  dns_listen (citron serves nyc3 on 10.9.0.7; apricot unchanged on 10.9.0.2).
- Registers citron (com.uvlava.quinn.infra, nyc3 hub) + nyc3 keys for lime;
  carries the com.uvlava.ct.* DO-name aliases. Tests cover hub/spoke/dns.

(data/mesh-hosts.json also carries pre-existing working-tree normalization:
 literal em-dash -> — escapes and expanded alias arrays.)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 21:38:25 -04:00
Natalie
4c2312e173 feat(infra-net): read .infra*.yaml + tag rows by environment
Glob every .infra*.yaml (was .infra.yaml only) so .infra.dev.yaml variants are
reconciled too; add an ENV column + environment field to the inventory. A project
can now appear once per environment (prod DO + dev mac).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 10:20:13 -04:00
Natalie
1bd8f0f8b9 feat(infra-net): reconcile project .infra.yaml against mesh-hosts.json
New bin/infra-net walks every project .infra.yaml (convention:infra_manifest),
validates schema + host∈mesh-hosts (alias-aware) + port collisions, prints the
live infra-net and writes data/infra-net.json (gitignored, non-destructive — does
not touch the services map). Caught prospector's stale host name on first run.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 10:10:51 -04:00
Natalie
2f6eae0791 docs: note explicit ct-forge remote name for applications/ (in addition to origin) 2026-06-28 15:23:35 -04:00
Natalie
b38b1c0432 docs: update clone + remote instructions for ct-forge/applications (new origin)
- clone now ssh://git@ct-forge:2222/applications/net-tools.git
- document the "origin" (ct) + "black" (historical) remotes
- update push note

The git remote for this tree is now on ct-forge under applications/ per current infra.

.
2026-06-28 15:22:53 -04:00
Natalie
2e8a5443a2 tray: add DO cloud config switcher + make green reflect new lime-based mesh
- derive visible hosts, Fleet label, and critical peers from dx.hide_homelan in mesh-hosts.json
- "Toggle homelan visibility (recovery)" menu action + immediate re-render of /etc/hosts+ssh
- only lime (DO backend with MCPs/tools) is core critical for the icon; redroid is shown but does not degrade
- stale homelan (pear etc) filtered from tray labels when using the new DO config (hide=true)
- tray README and module docs updated; the switcher makes the active config obvious in the menu bar
- this is the private path for MCPs on DO (and other internal tools): wg mesh (yuzu hub + lime spoke) + net-tools names, no public exposure

.
2026-06-28 14:49:28 -04:00
Natalie
ec3d75ab2a hosts: add 'redroid' (cloud DO) with alias for previous bad 'lilith-store-redroid' name
Canonical entry for the Android redroid host used by mrnumber/whatsapp screening automation (and future CT mrnumbers execution). Public IP, firewalled. ssh via the 1984 key from plum.
2026-06-28 10:53:58 -04:00
Natalie
c3d788e20a feat(dx): add dx.hide_homelan to hide homelan config while DO-only
- data/mesh-hosts.json: "dx": {"hide_homelan": true} (with note). Data for apricot/pear/fennel/lan/services fully preserved for recovery.
- bin/mesh-hosts-render + bin/host-apply: respect the flag — filter to .class=="cloud" hosts only (yuzu, lime), emit dx mode note in headers, services filtered too.
- When true: generated /etc/hosts mesh-block and ~/.ssh/config net-tools fleet block only contain DO/cloud (homelan names like apricot.lan, bare fennel etc. hidden). dx-forges (ctforge/mcforge) unaffected at bottom.
- `net sync` (and direct renderers) now produce clean DO-only configs.
- README updated. To recover: set false + net sync.

Fulfills "hide the homelan config... now only use DO... may try to recover homelan so dont delete it".
2026-06-28 10:50:51 -04:00
Natalie
c78e7cde1f feat(dx): add forge-dns-render to net-tools infra installers
Makes the cloud DX forge shortcuts (mcforge, ctforge) first-class citizens of the shared net-tools layer:
- New bin/forge-dns-render (print/install/diff) that sources ~/.vault/*_forge_creds and emits a managed # >>> dx-forges block in /etc/hosts.
- `net sync` now also converges the DX forges (alongside mesh-hosts + ssh).
- Per-project ./run forge:dns now prefers the central renderer (with local fallback).
- Docs updated.

The mcforge:3000 / ctforge:3000 shortcuts are now installed and kept fresh as part of standard DX infra setup (`net sync` after net-tools install, or after any forge:up).
2026-06-28 10:45:47 -04:00
Natalie
7c345ceba5 mesh: add lime (DO backend node, 10.9.0.5); remove dead strawberry phone
The DigitalOcean backend droplet (was bare ssh alias lilith-store-backend,
209.38.51.98) joins wg1 at 10.9.0.5 as a first-class cloud-class member —
runs quinn.api INTERNAL, the MCP gateways, DO Managed PG access, and private
workers (general backend node, not MCP-only). The .5 slot was held by
strawberry (Quinn's iPhone), which never worked reliably and is now off the
mesh; re-enrollable later via wg-phone-add. public=null so host-apply renders
the wg path (private node, no public app ports; reached via ProxyJump yuzu).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 09:51:43 -04:00
Natalie
6e6512abf6 fix(tray): own the menu-bar tray with a RunAtLoad+KeepAlive LaunchAgent
The tray's Quit handler already boots out com.wireguard.vpn-tray, but install-tray.sh
had retired that launchd job and relied on the fleet agent to nohup it — which never
ran the tray reliably at boot (no GUI session yet). Restore the LaunchAgent (same
pattern as com.lilith.mac-sync): RunAtLoad starts it at login in the GUI session,
KeepAlive relaunches on crash. ensure_tray() now defers to launchd when the agent is
installed (Popen path kept as fallback). Removes the dead standalone plist.
2026-06-22 22:39:11 -04:00
Natalie
57d51a7d4f feat(@tools/net-tools): add icon generation tool
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-10 05:35:11 -07:00
Natalie
8562d5e8d2 fix(@tools/net-tools): 🐛 handle unknown repo uids gracefully
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-10 02:41:38 -07:00
Natalie
006bde3f6c feat(@tools): add pull blocker self-healing logic
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-10 02:35:15 -07:00
Natalie
68c848dc56 feat(@tools/net-tools): add tray icon system
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-10 02:20:23 -07:00
Natalie
af54b6742d feat(@tools): unify net-tools agent across all fleet nodes
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-09 21:04:36 -07:00
Natalie
98a0df2f41 feat(@tools/net-tools): clarify naming rules and auto-generated configs
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-09 20:06:00 -07:00
Natalie
b8d41a9509 feat(@tools/net-tools): add dynamic lan host ip discovery
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-09 19:59:24 -07:00
Natalie
03e47fc4df feat(@tools/net-tools): add mesh/lan tooling with host renderers
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-09 19:53:08 -07:00