102 lines
3.5 KiB
Markdown
102 lines
3.5 KiB
Markdown
# tui_continuous integration plan for n_signer
|
|
|
|
## Goal
|
|
|
|
Adopt the `tui_continuous` style from `/home/user/lt/aesthetics` with minimal-risk restructuring:
|
|
|
|
- keep caller-owned poll loop and line-input model
|
|
- avoid ncurses/event-loop inversion
|
|
- preserve non-interactive behavior and test compatibility
|
|
|
|
## Scope
|
|
|
|
### 1) Vendor and wire library
|
|
|
|
- Vendor `tui_continuous.c/.h` into this repository under a stable path (planned: `resources/tui_continuous/`).
|
|
- Add include path and source wiring to:
|
|
- `Makefile` dev build
|
|
- targets that link `src/main.c` (notably integration path)
|
|
- static build flow (`build_static.sh`, Alpine musl path)
|
|
|
|
### 2) Main-screen TUI adapter in `src/main.c`
|
|
|
|
- Introduce a small adapter layer that owns:
|
|
- persistent `TuiFrame` (`app_name=nsigner`, `app_version=NSIGNER_VERSION`, breadcrumb)
|
|
- hotkey menu definitions matching existing behavior (`q/x`, `l`, `r`, `A`)
|
|
- status text composition (`locked/unlocked`, words, socket, derived, auto-approve)
|
|
|
|
### 3) Replace legacy `render_status()` with `tui_continuous`
|
|
|
|
- Use `tui_render_screen()` for top framing/menu/status strip.
|
|
- Render roles with `tui_render_table()` using columns:
|
|
- role name
|
|
- purpose
|
|
- curve
|
|
- selector
|
|
- Render activity log (latest first) via `tui_print()`.
|
|
- Keep prompt anchoring stable with `tui_anchor_prompt()`.
|
|
|
|
### 4) Resize behavior
|
|
|
|
- Install SIGWINCH handler with `tui_install_resize_handler()` before unix interactive loop.
|
|
- On each poll tick, if `tui_resize_pending()` is set, repaint current view.
|
|
|
|
### 5) Approval flow refactor (`src/server.c` + `src/main.c`)
|
|
|
|
- Add server approval callback API in `server.c`:
|
|
- callback typedef
|
|
- registration function (`server_set_approval_cb(...)`)
|
|
- compact request payload struct (caller/method/role/purpose/derivation + optional peer display)
|
|
- Keep default callback behavior equivalent to existing stdio prompt output for non-TUI and tests.
|
|
- In `main.c` unix interactive mode, register a TUI-aware callback that:
|
|
- paints an approval content screen
|
|
- shows `[y]/[n]/[e]/[a]` options
|
|
- reads line input (fgets-compatible behavior)
|
|
- returns policy decision enums
|
|
- repaints main status screen after decision
|
|
|
|
### 6) Mnemonic prompt styling
|
|
|
|
- Keep `fgets` input path intact for paste reliability.
|
|
- Re-style startup and lock/reunlock prompts using `tui_render_content_screen()` + `tui_print()`.
|
|
|
|
### 7) Output safety boundaries
|
|
|
|
- Keep machine-readable output untouched (client JSON-RPC responses remain raw).
|
|
- Restrict style updates for non-interactive surfaces to human-facing usage/banner text only.
|
|
|
|
### 8) Validation
|
|
|
|
- Run/build validation for:
|
|
- normal dev build
|
|
- static build flow
|
|
- existing prompt-related test paths (`NSIGNER_TEST_FORCE_PROMPT`, `NSIGNER_TEST_NONINTERACTIVE_PROMPT`)
|
|
- Manual visual checks:
|
|
- narrow/normal/wide terminal widths
|
|
- live resize behavior
|
|
- approval prompt arriving during idle and proper redraw afterwards
|
|
|
|
### 9) Documentation updates
|
|
|
|
- Update `README.md` and security docs where relevant to mention:
|
|
- adopted TUI style source (`aesthetics/TUI.md`)
|
|
- vendored `tui_continuous` component/version
|
|
|
|
## Execution order
|
|
|
|
1. Vendor library and wire build
|
|
2. Implement main screen adapter + rendering
|
|
3. Add resize repaint
|
|
4. Refactor approval callback plumbing
|
|
5. Add TUI approval view in main
|
|
6. Re-style mnemonic prompts
|
|
7. Validate tests/builds + manual UX checks
|
|
8. Update docs
|
|
|
|
## Non-goals
|
|
|
|
- No ncurses integration
|
|
- No event loop ownership changes
|
|
- No changes to transport semantics (`unix`, `stdio`, `qrexec`, `tcp`)
|
|
- No machine-readable output format changes
|