feat(journey): CLI + TUI learning timeline (/journey) - #55555
Conversation
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`).
tonydwb
left a comment
There was a problem hiding this comment.
Code Review Summary
Verdict: Comment — High surface area (17 files, +2192 additions)
This PR adds a new /journey CLI + TUI learning timeline feature with a terminal star-map renderer (881 lines). The implementation is well-documented and the renderer design is thoughtful (braille subpixel rendering, orbital chart layout, magnitude gradients).
However, at 17 files and 2192 additions this is a significant new feature that would benefit from a more focused review. The renderer alone is a substantial piece of code with complex geometry and color math.
Observations
- The star-map renderer (
learning_graph_render.py) is 881 lines of pure stdlib-only code — impressive self-contained implementation - Color math (HSL/RGB conversions, age gradients) is correctly ported from the desktop
geometry.ts/color.ts - The braille subpixel rendering approach is creative and well-suited for terminal output
- TUI integration looks clean with proper async rendering
Suggestion
- Consider whether the renderer should live in a separate module/package given its size and independence from the core agent
Reviewed by Hermes Agent
tonydwb
left a comment
There was a problem hiding this comment.
Code Review Summary
Verdict: Comment — high surface area (2192 additions, 17 files), needs human review.
This PR adds a CLI + TUI learning timeline feature (/journey) with a terminal star map renderer. The new module learning_graph_render.py (881 lines) ports the desktop app's GPU radial constellation design to a terminal rendition using Braille subpixel rendering.
Observations
- The star map renderer is substantial (881 lines) and implements complex terminal graphics
- Multiple new modules and integration points across the codebase
- The Braille subpixel rendering approach is interesting but needs human review for edge cases
- Feature appears well-designed with proper separation of concerns
Reviewed by Hermes Agent
Skill nodes carry no body in the learning_graph payload, so opening one dead-ended on "No additional detail recorded yet." Gate Enter/→ to nodes with body (memories), mark those rows with a › affordance, and only show the "open" hint when the selected row is drillable.
Collapse the two-step slice list → detail page into one scrollable tree: each timeline slice is a parent header with its skills + memories nested under ├─/└─ branch chars, ordered oldest → newest (children now sorted chronologically in the renderer). One cursor walks the whole tree; Enter still opens a memory's body. Drops the separate detail mode.
Add a non-selectable spacer row before each slice (except the first) so
groups breathe — the CSS `group + group { margin-top }` equivalent. The
gap counts toward the scroll window but cursor navigation skips it.
The renderer kept a braille canvas, char-field scene, star-glyph/orbital helpers, and seed/links params from earlier visual iterations that the final timeline bar chart never uses. Remove them (~190 lines), simplify the empty-state placeholder, and refresh the module + RPC docstrings to describe what actually ships.
Memories are the only drillable rows, so give them the primary "clickable" ink and demote skills (dead-ends) to the muted complement — previously the non-openable skills wore the link-looking primary color. Flipped in both the TUI and CLI palettes for parity.
…ph-cli-tui feat(journey): CLI + TUI learning timeline (/journey)
…ph-cli-tui feat(journey): CLI + TUI learning timeline (/journey)
…ph-cli-tui feat(journey): CLI + TUI learning timeline (/journey)
…ph-cli-tui feat(journey): CLI + TUI learning timeline (/journey)
…ph-cli-tui feat(journey): CLI + TUI learning timeline (/journey)
Summary
Brings the merged desktop Memory Graph / Star Map (#55226) to the terminal as
/journey— learned skills + memories on a timeline — for both the CLI and the TUI. Both surfaces share one size-aware Python renderer (agent/learning_graph_render.py) over the existingagent/learning_graphAPI. CLI/TUI only — no desktop changes. (mainonly has the desktop panel + a dashboard REST endpoint; there was no terminal surface for this.)TUI
/journeyoverlay├─/└─branch chars, oldest → newest. One cursor walks the whole tree.Enter/→opens aScrollBoxpage; skills are dead-ends and aren't openable (marked, and the hint adapts). No more "nothing to see here" pages./agentsparity. Static chart overview on top; full-rowinverseselection; footer pinned to the bottom via the same flex shell.CLI
hermes journey(aliaseslearning,memory-graph) — static timeline plus--play/--revealscrubber and--json. Also available as/journeyinside the interactive CLI.Colors / DRY
OverlayScrollbarinto its own module, now shared withagentsOverlay; both lists run through one table-drivenListRow.seed/linksparams) left from earlier visual iterations.Test plan
scripts/run_tests.sh tests/agent/test_learning_graph_render.py(16 passed) — renderer behavior contracts.ui-tuinpm run typecheck+npm run lintclean (pre-existinguseSessionLifecyclewarnings only).npx vitest run src/__tests__/journeyCommand.test.ts(3 passed) —/journeyresolves by name + aliases, opens overlay, survives soft reset.ruff check .clean (the prior CI fail was auv tool installtimeout, not a violation).hermes journey/--play, and/journeyin the TUI (tree nav, drill memory, gap spacing).