code-agent: implement issue 4
Approval-Correlation: 0543bb321a84cb936bc0ac4988615840
Plan-SHA256: 437a85f68d151ed4db780511812834041cfec5e7cf021fb77e238d5a6196e6fb
Base-SHA: 256be64ac7
This commit is contained in:
+36
-10
@@ -1,13 +1,39 @@
|
||||
# 실행 흐름
|
||||
# 런타임 흐름
|
||||
|
||||
## tui-input-loop
|
||||
## 정상 입력 시나리오
|
||||
|
||||
1. `chat-tui` 또는 `python -m chat_tui`가 `main()`을 호출한다.
|
||||
2. `ChatApp`이 Textual 이벤트 루프를 시작하고 화면을 구성한다.
|
||||
3. 입력창에 포커스를 둔 뒤 사용자의 입력을 기다린다.
|
||||
4. 사용자가 Enter를 누르면 `Input.Submitted` 이벤트를 처리한다.
|
||||
5. 비어 있지 않은 입력을 세션 목록에 추가하고 같은 값을 대화 영역의 새 `Label`로 마운트한다.
|
||||
6. 입력창을 비우고 대화 영역을 마지막 항목으로 스크롤한 뒤 다시 입력을 기다린다.
|
||||
7. 사용자가 `Escape` 또는 `Ctrl+Q`를 누르면 Textual 종료 동작을 호출한다.
|
||||
1. 애플리케이션이 `#user-input`에 포커스를 둔다.
|
||||
2. 사용자가 입력하고 Enter를 누른다.
|
||||
3. `Input.Submitted` 이벤트에서 입력값을 `strip()`한다.
|
||||
4. 입력창 값을 즉시 빈 문자열로 초기화한다.
|
||||
5. `trim` 결과가 유효하면 사용자 메시지를 세션 상태에 기록한다.
|
||||
6. `random.choice(RESPONSE_MESSAGES)`가 고정 응답 하나를 선택한다.
|
||||
7. 선택 응답을 세션 상태에 기록한다.
|
||||
8. 대화 영역에 사용자 메시지 `Label`을 추가한다.
|
||||
9. 사용자 메시지 바로 뒤에 응답 `Label`을 추가한다.
|
||||
10. 대화 영역을 마지막 항목으로 스크롤한다.
|
||||
|
||||
이 흐름에는 LLM 호출이나 외부 네트워크 요청이 없다. 애플리케이션 종료 뒤 세션 목록과 화면 항목은 보존되지 않는다.
|
||||
여러 번 제출하면 각 사용자 메시지와 응답 쌍이 제출 순서대로 누적된다.
|
||||
|
||||
## 공백 입력 시나리오
|
||||
|
||||
1. 사용자가 공백만 포함한 값을 제출한다.
|
||||
2. 입력값을 `strip()`한다.
|
||||
3. 결과가 빈 문자열임을 확인한다.
|
||||
4. 입력창은 비우되 상태, 난수 선택 결과 및 대화 영역은 변경하지 않는다.
|
||||
|
||||
## 종료 시나리오
|
||||
|
||||
- `Escape`를 누르면 기존 종료 바인딩이 실행된다.
|
||||
- `Ctrl+Q`를 누르면 기존 종료 바인딩이 실행된다.
|
||||
- 두 동작 모두 `quit` 액션을 통해 애플리케이션 종료를 요청한다.
|
||||
|
||||
## 검증 시나리오
|
||||
|
||||
자동 테스트는 결정 가능한 `random.choice` 결과를 사용해 다음을 확인한다.
|
||||
|
||||
- 입력 `trim` 결과가 사용자 메시지로 저장되고 표시되는지
|
||||
- 사용자 메시지 다음에 응답이 표시되는지
|
||||
- 공백 입력에서 `random.choice`가 호출되지 않는지
|
||||
- 입력창이 제출 후 비워지는지
|
||||
- 기존 종료 동작이 유지되는지
|
||||
|
||||
Reference in New Issue
Block a user