Files
n_signer/plans/tui_continuous_integration.md

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