- Keep hub port powered through fiber id + PCIe prompts; power off after.
- Ctrl-C saves fiber_map.json, turns off current port, exits 130; handle during PCIe.
- Remote calibrate: set step_powered only when SSH on succeeds; skip step if remote
ON failed (was incorrectly treating failed ON as powered).
- power() returns False when hubs cannot connect; CLI on/off exits 1 so SSH sees failures.
- remote_hub_port_power: merge stdout+stderr for diagnostics; ssh_forward_capture uses stdin=DEVNULL.
- Warn when calibrate_remotes yields zero remote steps; clarify remote_ssh.env.example.
Made-with: Cursor
Add optional fiber_ports.pcie (board_serial, sfp_serial) and PCIe column in
panel/fiber status. During panel calibrate, prompt to pick known H3 cards 1–6
and SFP lane 1–4 from adnacom_pcie_catalog, or manual/clear/keep.
HUB_MANAGER_CALIBRATE_REMOTES in remote_ssh.env merges into calibrate SSH
hosts so one panel calibrate run can cover local and remotes without repeating
--ssh. Document in remote_ssh.env.example and help.
Made-with: Cursor
Move AcronameManager, CLI, fiber map I/O, USB probe, remote SSH, and path
configuration into hubmgr/. hub_manager.py only configures map paths next to
the script and delegates to hubmgr.cli.main. Clarify remote_ssh.env.example
for Pi-side paths. Add fiber_map and panel_map example presets.
Made-with: Cursor
Support USBHub2x4 and USBHub3p discovery with correct downstream port counts,
patch-panel mapping via panel_map.json, lazy brainstem import and diagnostics,
SSH forwarding with optional remote_ssh.env defaults, and requirements.txt
for brainstem. Ignore local panel_map.json, remote_ssh.env, and __pycache__.
Made-with: Cursor