feat(journey): CLI + TUI learning timeline (/journey)

Terminal rendition of the desktop Star Map / Memory Graph: learned skills
and memories on a timeline, shared by `hermes journey` and the TUI
`/journey` overlay via one size-aware Python renderer
(agent/learning_graph_render.py).

- TUI overlay mirrors /agents: static chart overview + selectable slice
  list → slice detail → single skill/memory body, with the shared
  inverse-row selection treatment and a pinned footer.
- Reuse primitives: extract OverlayScrollbar into its own module (now
  shared with agentsOverlay), scroll the item body via ScrollBox, and
  unify both lists through one table-driven ListRow.
- No animation/playback in the TUI — pure data; the renderer's reveal
  scrubber stays available in the CLI (`--play`, `--reveal`).
This commit is contained in:
Brooklyn Nicholson 2026-06-30 04:43:47 -05:00
parent 1d495cfbbf
commit e971dc1e9d
17 changed files with 2192 additions and 87 deletions

16
cli.py
View file

@ -8485,6 +8485,22 @@ class HermesCLI(CLIAgentSetupMixin, CLICommandsMixin):
self._handle_stop_command()
elif canonical == "agents":
self._handle_agents_command()
elif canonical == "journey":
try:
import argparse
import shlex
from hermes_cli.journey import register_cli as _register_journey_cli
parser = argparse.ArgumentParser(prog="/journey", add_help=False)
_register_journey_cli(parser)
argv = shlex.split(cmd_original.split(None, 1)[1]) if len(cmd_original.split(None, 1)) > 1 else []
args = parser.parse_args(argv)
args.func(args)
except SystemExit:
pass
except Exception as exc:
_cprint(f" /journey failed: {exc}")
elif canonical == "background":
self._handle_background_command(cmd_original)
elif canonical == "queue":