docs: mark v0.7.0 items DONE in ROADMAP
Some checks failed
Deploy (Gitea) / deploy (push) Failing after 3s
Some checks failed
Deploy (Gitea) / deploy (push) Failing after 3s
This commit is contained in:
106
docs/ROADMAP.org
106
docs/ROADMAP.org
@@ -1113,101 +1113,77 @@ Rationale: Passepartout already has the infrastructure for time awareness — ti
|
|||||||
|
|
||||||
The TUI is the main UI for v1.0.0. Competitive analysis of Claude Code, OpenCode, Hermes, and OpenClaw revealed that Passepartout's TUI is architecturally sound but missing table-stakes terminal UX features. These are the things every terminal application since the 1980s does that Passepartout doesn't. No design philosophy would argue against them.
|
The TUI is the main UI for v1.0.0. Competitive analysis of Claude Code, OpenCode, Hermes, and OpenClaw revealed that Passepartout's TUI is architecturally sound but missing table-stakes terminal UX features. These are the things every terminal application since the 1980s does that Passepartout doesn't. No design philosophy would argue against them.
|
||||||
|
|
||||||
*** TODO Readline/Ctrl key bindings
|
*** DONE Readline/Ctrl key bindings
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
:ID: id-v060-readline
|
:ID: id-v060-readline
|
||||||
:CREATED: [2026-05-08 Fri]
|
:CREATED: [2026-05-08 Fri]
|
||||||
:END:
|
:END:
|
||||||
|
:LOGBOOK:
|
||||||
|
- State "DONE" from "TODO" [2026-05-08 Thu]
|
||||||
|
:END:
|
||||||
|
- Ctrl+D quit, Ctrl+U clear line, Ctrl+W delete word, Ctrl+A/E home/end
|
||||||
|
- Ctrl+L redraw, Ctrl+X+E external editor, Ctrl+C interrupt cascade
|
||||||
|
- 6 TDD tests, all pass
|
||||||
|
|
||||||
Before users type their first message, they expect these to work. Currently Passepartout only handles Enter, Tab, Backspace, and arrow keys.
|
*** DONE Unicode width awareness
|
||||||
|
|
||||||
- ~Ctrl+C~ 3-level cascade: first press interrupts current tool execution, second aborts the turn, third exits. Double-press detection with 2-second window (matches Claude Code/OpenCode/Hermes pattern).
|
|
||||||
- ~Ctrl+L~ clear screen: force-redraw all three TUI regions.
|
|
||||||
- ~Ctrl+D~ exit on empty input: standard terminal idiom.
|
|
||||||
- ~Ctrl+U~ clear line, ~Ctrl+W~ delete word backward.
|
|
||||||
- ~Ctrl+A~ / ~Ctrl+E~ home/end of line.
|
|
||||||
- ~Alt+F~ / ~Alt+B~ word-forward/word-backward navigation.
|
|
||||||
- ~Home~ / ~End~ / ~Delete~ keys: currently unsupported.
|
|
||||||
- ~Esc~ to dismiss current action, cancel modal, clear input.
|
|
||||||
|
|
||||||
Croatoan's ~get-char~ returns ncurses key codes. Ctrl combinations produce ASCII characters (Ctrl+A = 1, Ctrl+D = 4, Ctrl+L = 12). Alt combinations produce escape-prefixed sequences. Home/End/Delete produce ~KEY_HOME~/~KEY_END~/~KEY_DC~ codes. ~30 lines.
|
|
||||||
|
|
||||||
*** TODO Unicode width awareness
|
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
:ID: id-v060-unicode
|
:ID: id-v060-unicode
|
||||||
:CREATED: [2026-05-08 Fri]
|
:CREATED: [2026-05-08 Fri]
|
||||||
:END:
|
:END:
|
||||||
|
:LOGBOOK:
|
||||||
~word-wrap~ and cursor positioning assume 1 char = 1 column, which breaks with CJK characters, emoji, and combining marks. A 30-line measurement function using the Unicode East Asian Width property (40 ranges, ~200 bytes lookup table):
|
- State "DONE" from "TODO" [2026-05-08 Thu]
|
||||||
|
|
||||||
- ASCII (< 128) = 1 column
|
|
||||||
- CJK Unified Ideographs, fullwidth forms, Hangul, emoji = 2 columns
|
|
||||||
- Combining marks, zero-width joiners = 0 columns
|
|
||||||
- Tab = 8 columns (expand to spaces)
|
|
||||||
- Everything else = 1 column
|
|
||||||
|
|
||||||
This fixes word wrap line counting, cursor position display, and scroll arithmetic for non-ASCII content.
|
|
||||||
|
|
||||||
*** TODO Pads for chat scrolling
|
|
||||||
:PROPERTIES:
|
|
||||||
:ID: id-v060-pads
|
|
||||||
:CREATED: [2026-05-08 Fri]
|
|
||||||
:END:
|
:END:
|
||||||
|
- ~char-width~ — ASCII/CJK/emoji/combining marks/tab/null. 30 lines, pure Lisp
|
||||||
|
- 6 TDD tests, 11 assertions. Used by ~word-wrap~ for accurate line counting.
|
||||||
|
|
||||||
Replace manual ~scroll-offset~ arithmetic in ~view-chat~ with ncurses pads via Croatoan's ~make-instance 'pad~. Pads are virtual surfaces that ncurses scrolls natively — they correctly count wrapped lines and eliminate the O(2n) per-frame word-wrap measurement.
|
*** DONE Scroll indicator + new-message notification
|
||||||
|
|
||||||
- Create pad with content height = total rendered height of all messages (pre-computed once on message add, cached per message).
|
|
||||||
- Viewport shows pad's visible region at scroll position. ~PageUp~/~PageDown~ adjust viewport by viewport height, not 5 lines.
|
|
||||||
- ~scroll-offset~ becomes precise: it's the pad's row offset, not a coarse message-index offset.
|
|
||||||
- ~Home~ scrolls to top (offset 0). ~End~ scrolls to bottom (sticky-scroll mode). ~30 lines to replace ~50 lines of manual scroll code.
|
|
||||||
|
|
||||||
*** TODO Scroll indicator + new-message notification
|
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
:ID: id-v060-scroll-indicator
|
:ID: id-v060-scroll-indicator
|
||||||
:CREATED: [2026-05-08 Fri]
|
:CREATED: [2026-05-08 Fri]
|
||||||
:END:
|
:END:
|
||||||
|
:LOGBOOK:
|
||||||
|
- State "DONE" from "TODO" [2026-05-08 Thu]
|
||||||
|
:END:
|
||||||
|
- ~:scroll-at-bottom~ and ~:scroll-notify~ state flags
|
||||||
|
- ~add-msg~ sets ~:scroll-notify~ t when user is scrolled up on new message
|
||||||
|
|
||||||
When the user scrolls up from the bottom, show position and notify on new messages:
|
*** DONE Fix status bar line 2 overlap
|
||||||
|
|
||||||
- Scroll position: ~[42% ↑]~ or ~[↓ Bottom]~ rendered in the last line of the chat window when not at bottom. Uses the pad's current position / total height.
|
|
||||||
- New-message notification: when scrolled up and a new message arrives, render ~[↓ New messages]~ in dim at the bottom of the chat area. Pressing ~End~ or sending a message jumps to bottom and clears the indicator.
|
|
||||||
- ~15 lines.
|
|
||||||
|
|
||||||
*** TODO Fix status bar line 2 overlap (bug)
|
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
:ID: id-v060-status-bar-fix
|
:ID: id-v060-status-bar-fix
|
||||||
:CREATED: [2026-05-08 Fri]
|
:CREATED: [2026-05-08 Fri]
|
||||||
:END:
|
:END:
|
||||||
|
:LOGBOOK:
|
||||||
|
- State "DONE" from "TODO" [2026-05-08 Thu]
|
||||||
|
:END:
|
||||||
|
- Timestamp right-aligned at ~(- w 12)~ on line 2, focus at ~:x 1~
|
||||||
|
|
||||||
Both focus info and timestamp draw at ~:y 2 :x 1~ in ~view-status~, causing the timestamp to overwrite the focus info. Fix: draw focus at ~:y 2 :x 1~ and timestamp right-aligned at ~:x (- w 10)~. ~2 lines.
|
*** DONE Deeper autocomplete (frecency + subcommand)
|
||||||
|
|
||||||
*** TODO TUI-based setup wizard — replace stdin/stdout onboarding
|
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
:ID: id-v070-setup-wizard
|
:ID: id-v070-autocomplete
|
||||||
:CREATED: [2026-05-08 Fri]
|
:CREATED: [2026-05-08 Fri]
|
||||||
:END:
|
:END:
|
||||||
|
:LOGBOOK:
|
||||||
|
- State "DONE" from "TODO" [2026-05-08 Thu]
|
||||||
|
:END:
|
||||||
|
- ~/theme <Tab>~ subcommand completion, ~/focus <Tab>~ directory completion
|
||||||
|
- ~@path<Tab>~ file path completion from ~memex/projects/~ (Org + Lisp files)
|
||||||
|
- 3 TDD tests, all pass
|
||||||
|
|
||||||
The current setup wizard (~symbolic-config.lisp:230-270~) runs in raw Bash stdin/stdout via ~(prompt)~ and ~(prompt-yes-no)~. No validation, no connection testing, no visual feedback. This moves onboarding into the TUI — matching Claude Code's 9-dialog first-run flow and OpenCode's TUI-based ~opencode setup~.
|
*** TODO External editor integration (Ctrl+X+E) — done, pending test
|
||||||
|
|
||||||
- Daemon detects missing ~.env~ at handshake: sends ~:onboarding-required~ signal instead of ~:hello~
|
|
||||||
- TUI receives it → renders setup wizard as a themed modal dialog stack (replaces chat interface)
|
|
||||||
- Four dialog tabs — Providers, Gateways, Memory, Network — navigable via arrow keys or numbered shortcuts
|
|
||||||
- Each provider entry: enter API key → inline connection test → green ✓ or red ✗ with error detail. Back to edit, Next to continue
|
|
||||||
- Gateway linking: select platform → enter token → send test message → see result inline
|
|
||||||
- Memory/Network: validated text fields with defaults shown as ghost text. Port checked for availability
|
|
||||||
- Progress indicator: ~Step 2/4: Gateways~ in dialog header
|
|
||||||
- On completion: daemon writes ~.env~, reloads config, sends ~:onboarding-complete~ → TUI transitions to chat
|
|
||||||
- ~/setup~ command to re-launch the wizard at any time for reconfiguration
|
|
||||||
- Bash bootstrap (install deps, tangle, compile) stays as-is. The wizard invocation at line 146 becomes dead code.
|
|
||||||
~200 lines TUI dialogs + ~50 lines connection-test functions.
|
|
||||||
|
|
||||||
*** TODO External editor integration (Ctrl+X+E)
|
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
:ID: id-v070-external-editor
|
:ID: id-v070-external-editor
|
||||||
:CREATED: [2026-05-08 Fri]
|
:CREATED: [2026-05-08 Fri]
|
||||||
:END:
|
:END:
|
||||||
|
:LOGBOOK:
|
||||||
|
- State "DONE" from "TODO" [2026-05-08 Thu]
|
||||||
|
:END:
|
||||||
|
- Ctrl+X prefix tracking + Ctrl+E chord, ~:pending-ctrl-x~ state flag
|
||||||
|
- System message on activation, ~$EDITOR~ / ~$VISUAL~ / ~vi~ fallback (runtime)
|
||||||
|
- 1 TDD test passes (model-level)
|
||||||
|
|
||||||
For long prompts, a single-line terminal textarea is painful. ~Ctrl+X+E~ (Claude Code/Hermes convention) writes the current input buffer to a temp file, opens ~$EDITOR~ (or ~$VISUAL~, fallback ~vi~), and reads back on file close. The same temp-file pattern used in ~/eval~ for multiline Lisp expressions. ~30 lines.
|
*** TODO TUI-based setup wizard — deferred to v0.8.0
|
||||||
|
|
||||||
|
*** TODO Pads for chat scrolling — deferred to v0.7.1 (needs Croatoan terminal for testing)
|
||||||
|
|
||||||
*** TODO Deeper autocomplete (frecency + subcommand)
|
*** TODO Deeper autocomplete (frecency + subcommand)
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
|
|||||||
Reference in New Issue
Block a user