PR #68 머지 (b8b3236). 머지 후 spec status 갱신.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
59 lines
1.6 KiB
Markdown
59 lines
1.6 KiB
Markdown
---
|
|
phase: P9
|
|
component: kebab-tui
|
|
task_id: p9-fb-09
|
|
title: "External editor return — terminal restore + force redraw"
|
|
status: completed
|
|
depends_on: []
|
|
unblocks: []
|
|
contract_source: ../../docs/superpowers/specs/2026-04-27-kebab-final-form-design.md
|
|
contract_sections: [§10 UX]
|
|
source_feedback: p9-dogfooding-feedback.md item 7
|
|
---
|
|
|
|
# p9-fb-09 — Editor return restore
|
|
|
|
## Goal
|
|
|
|
`g` (search), `o` (citation jump 후속) 으로 vim/code 띄우고 종료 후 TUI 화면이 깨지는 버그 수정.
|
|
|
|
## Allowed dependencies
|
|
|
|
- 기존 kebab-tui deps.
|
|
|
|
## Public surface
|
|
|
|
`kebab-tui::run` 내부에 `with_external_program(|term| -> Result<()> { ... })` helper. spawn 직전 / 종료 후 terminal 상태 toggle.
|
|
|
|
## Behavior contract
|
|
|
|
spawn 직전:
|
|
1. `terminal.show_cursor()`
|
|
2. `terminal.backend_mut().execute(LeaveAlternateScreen)?`
|
|
3. `disable_raw_mode()?`
|
|
|
|
child wait 후:
|
|
1. `enable_raw_mode()?`
|
|
2. `EnterAlternateScreen`
|
|
3. `terminal.clear()?` — 강제 redraw
|
|
4. main loop 의 `force_redraw_next_frame: bool` flag set → 다음 draw 가 dirty rect 무시 전체 그림.
|
|
|
|
## Test plan
|
|
|
|
수동 테스트 (단위 테스트 어려움 — terminal io 의존). 하지만 helper 의 sequence 자체는 mock backend 로 검증 가능.
|
|
|
|
| kind | description |
|
|
|------|-------------|
|
|
| unit | mock backend 의 호출 sequence 검증 (Leave → spawn → Enter → Clear) |
|
|
|
|
## DoD
|
|
|
|
- [ ] `cargo test -p kebab-tui` 통과
|
|
- [ ] 도그푸딩: `g` 누르고 `:q` 후 화면 정상 redraw 확인
|
|
- [ ] 같은 helper 가 p9-fb-20 의 citation jump 에도 사용
|
|
|
|
## Out of scope
|
|
|
|
- editor 종료 코드 처리 (실패해도 TUI 복귀)
|
|
- editor stdin 전달 (현재 path 만)
|