Python 3.11 이상과 pyproject.toml을 기반으로 Textual 대화형 TUI의 초기 스캐폴드를 구축한다.
문제
대화형 TUI의 실행 구조와 사용자 입력 제출, 입력 누적 표시, 종료 동작을 구현하고 검증할 수 있는 기준이 필요하다.
포함 범위
Python 3.11 이상 프로젝트 스캐폴드 생성
표준 pyproject.toml 기반 의존성 관리
Textual 기반 TUI 실행 진입점 구성
사용자 입력창 제공
제출된 사용자 입력을 대화 영역에 누적 표시
입력 표시와 종료 동작의 자동 테스트 포함
기본 프로젝트 구조와 실행 흐름 문서화
제외 범위
LLM 연동
LLM API 호출
대화 응답 생성
인증 및 외부 서비스 연동
고급 대화 기록 저장
실제 대화 기록의 영구 저장
제약 조건
Python 3.11 이상을 지원한다.
표준 pyproject.toml로 프로젝트 의존성을 관리한다.
Textual을 TUI 프레임워크로 사용한다.
LLM 연동과 외부 API 호출은 구현하지 않는다.
제출된 사용자 입력을 대화 영역에 누적 표시한다.
입력 표시와 종료 동작을 자동 테스트로 검증한다.
확인 가능한 기존 저장소 트리와 요구사항 정본이 없으므로 관련 정본 문서를 새로 작성한다.
확정된 결정
OQ-001: 사용할 TUI 프레임워크를 무엇으로 정할 것인가? → Textual 사용OQ-001-C01 — 구조화된 위젯과 확장성을 얻지만 의존성과 학습 비용이 증가한다.
OQ-002: 지원할 Python 버전과 의존성 관리 방식을 무엇으로 정할 것인가? → Python 3.11 이상과 표준 pyproject.toml 사용OQ-002-C01 — 현대적인 표준 구성을 사용하지만 구형 실행 환경은 지원하지 않는다.
OQ-003: 사용자 입력을 화면에 표시하는 방식을 어떻게 정의할 것인가? → 제출된 입력을 대화 영역에 누적 표시OQ-003-C01 — 대화형 사용성을 제공하지만 화면 상태와 기록 관리가 필요하다.
OQ-004: 초기 스캐폴드의 테스트 범위를 어디까지 포함할 것인가? → 입력 표시와 종료 동작의 자동 테스트 포함OQ-004-C01 — 핵심 동작을 회귀 검증할 수 있지만 TUI 테스트 격리 작업이 필요하다.
저장소 근거
없음.
문서 영향 및 산출물
requirement / create
대상: docs/requirements/req-001_project-scaffold.md
섹션 ID: 없음
독자: 개발자와 검토자
핵심 내용: Python 3.11 이상 프로젝트 스캐폴드, Textual 기반 TUI 실행, 사용자 입력창, 제출된 입력의 대화 영역 누적 표시, 입력 표시와 종료 동작 자동 테스트, LLM 연동 제외
검증: 스캐폴드 실행과 입력 누적 표시 및 종료 동작을 자동 테스트로 검증하고 요구사항의 범위와 수용 기준을 대조한다.
근거: 확정된 기술 선택과 상호작용 및 테스트 범위를 정본 요구사항으로 정의해야 한다.
data-model / create
대상: docs/data-model.md
섹션 ID: input-display-state
독자: 개발자와 테스트 작성자
핵심 내용: 현재 입력 상태, 제출된 입력 목록, 대화 영역 표시 상태, 세션 내 기록 경계, 영구 저장 제외
검증: 입력 제출마다 대화 영역에 항목이 누적되고 세션 종료 후 영구 저장되지 않는지 구현과 자동 테스트를 대조한다.
근거: 제출된 입력을 누적 표시하기 위한 세션 내 상태 모델과 영구 저장 경계를 명확히 해야 한다.
interface-contract / create
대상: docs/interface-contract.md
섹션 ID: tui-input-display
독자: 개발자와 테스트 작성자
핵심 내용: Textual TUI 입력 인터페이스, 입력 제출 동작, 대화 영역 누적 표시, 종료 동작, LLM 연동 경계
검증: 사용자가 입력을 제출하면 동일한 입력이 대화 영역에 누적되고 종료 동작이 정상 처리되는지 실행 테스트로 확인한다.
근거: 확정된 Textual 사용과 입력 표시 및 종료 동작의 사용자 인터페이스 계약을 명확히 해야 한다.
project-structure / create
대상: docs/project-structure.md
섹션 ID: python-tui-layout
독자: 개발자
핵심 내용: Python 3.11 이상 패키지 구조, Textual 애플리케이션 모듈, 실행 진입점, 테스트 위치, pyproject.toml 의존성 관리
검증: 문서의 패키지와 진입점 및 테스트 위치가 구현된 디렉터리 구조와 일치하고 pyproject.toml에 확정 의존성이 선언되는지 확인한다.
근거: 기존 구조가 확인되지 않은 초기 프로젝트에서 확정된 Python 및 Textual 구성을 반영한 레이아웃을 정의해야 한다.
runtime-flow / create
대상: docs/runtime-flow.md
섹션 ID: tui-input-loop
독자: 개발자와 테스트 작성자
핵심 내용: Textual 애플리케이션 시작, 입력 대기, 입력 제출, 대화 영역 누적 표시, 반복 처리, 종료
검증: 프로그램 시작부터 입력 제출과 누적 표시 및 종료까지의 흐름을 자동 테스트로 검증한다.
근거: LLM 호출 없이 입력을 세션 내 대화 영역에 누적 표시하는 확정 실행 흐름을 문서화해야 한다.
미해결 질문
없음.
<!-- gitea-agent:discovery-draft/v2 -->
<!-- gitea-agent:discovery-state/v8 eyJjb25maXJtZWRfZGVjaXNpb25zIjpbeyJjaG9pY2VfZGVzY3JpcHRpb24iOiLqtazsobDtmZTrkJwg7JyE7KCv6rO8IO2ZleyepeyEseydhCDslrvsp4Drp4wg7J2Y7KG07ISx6rO8IO2VmeyKtSDruYTsmqnsnbQg7Kad6rCA7ZWc64ukLiIsImNob2ljZV9pZCI6Ik9RLTAwMS1DMDEiLCJjaG9pY2VfbGFiZWwiOiJUZXh0dWFsIOyCrOyaqSIsImlkIjoiT1EtMDAxIiwicXVlc3Rpb24iOiLsgqzsmqntlaAgVFVJIO2UhOugiOyehOybjO2BrOulvCDrrLTsl4fsnLzroZwg7KCV7ZWgIOqyg+yduOqwgD8ifSx7ImNob2ljZV9kZXNjcmlwdGlvbiI6Iu2YhOuMgOyggeyduCDtkZzspIAg6rWs7ISx7J2EIOyCrOyaqe2VmOyngOunjCDqtaztmJUg7Iuk7ZaJIO2ZmOqyveydgCDsp4Dsm5DtlZjsp4Ag7JWK64qU64ukLiIsImNob2ljZV9pZCI6Ik9RLTAwMi1DMDEiLCJjaG9pY2VfbGFiZWwiOiJQeXRob24gMy4xMSDsnbTsg4Hqs7wg7ZGc7KSAIHB5cHJvamVjdC50b21sIOyCrOyaqSIsImlkIjoiT1EtMDAyIiwicXVlc3Rpb24iOiLsp4Dsm5DtlaAgUHl0aG9uIOuyhOyghOqzvCDsnZjsobTshLEg6rSA66asIOuwqeyLneydhCDrrLTsl4fsnLzroZwg7KCV7ZWgIOqyg+yduOqwgD8ifSx7ImNob2ljZV9kZXNjcmlwdGlvbiI6IuuMgO2ZlO2YlSDsgqzsmqnshLHsnYQg7KCc6rO17ZWY7KeA66eMIO2ZlOuptCDsg4Htg5zsmYAg6riw66GdIOq0gOumrOqwgCDtlYTsmpTtlZjri6QuIiwiY2hvaWNlX2lkIjoiT1EtMDAzLUMwMSIsImNob2ljZV9sYWJlbCI6IuygnOy2nOuQnCDsnoXroKXsnYQg64yA7ZmUIOyYgeyXreyXkCDriITsoIEg7ZGc7IucIiwiaWQiOiJPUS0wMDMiLCJxdWVzdGlvbiI6IuyCrOyaqeyekCDsnoXroKXsnYQg7ZmU66m07JeQIO2RnOyLnO2VmOuKlCDrsKnsi53snYQg7Ja065a76rKMIOygleydmO2VoCDqsoPsnbjqsIA/In0seyJjaG9pY2VfZGVzY3JpcHRpb24iOiLtlbXsi6wg64+Z7J6R7J2EIO2ajOq3gCDqsoDspp3tlaAg7IiYIOyeiOyngOunjCBUVUkg7YWM7Iqk7Yq4IOqyqeumrCDsnpHsl4XsnbQg7ZWE7JqU7ZWY64ukLiIsImNob2ljZV9pZCI6Ik9RLTAwNC1DMDEiLCJjaG9pY2VfbGFiZWwiOiLsnoXroKUg7ZGc7Iuc7JmAIOyiheujjCDrj5nsnpHsnZgg7J6Q64+ZIO2FjOyKpO2KuCDtj6ztlagiLCJpZCI6Ik9RLTAwNCIsInF1ZXN0aW9uIjoi7LSI6riwIOyKpOy6kO2PtOuTnOydmCDthYzsiqTtirgg67KU7JyE66W8IOyWtOuUlOq5jOyngCDtj6ztlajtlaAg6rKD7J246rCAPyJ9XSwiY29uc3RyYWludHMiOlsiUHl0aG9uIDMuMTEg7J207IOB7J2EIOyngOybkO2VnOuLpC4iLCLtkZzspIAgcHlwcm9qZWN0LnRvbWzroZwg7ZSE66Gc7KCd7Yq4IOydmOyhtOyEseydhCDqtIDrpqztlZzri6QuIiwiVGV4dHVhbOydhCBUVUkg7ZSE66CI7J6E7JuM7YGs66GcIOyCrOyaqe2VnOuLpC4iLCJMTE0g7Jew64+Z6rO8IOyZuOu2gCBBUEkg7Zi47Lac7J2AIOq1rO2YhO2VmOyngCDslYrripTri6QuIiwi7KCc7Lac65CcIOyCrOyaqeyekCDsnoXroKXsnYQg64yA7ZmUIOyYgeyXreyXkCDriITsoIEg7ZGc7Iuc7ZWc64ukLiIsIuyeheugpSDtkZzsi5zsmYAg7KKF66OMIOuPmeyekeydhCDsnpDrj5kg7YWM7Iqk7Yq466GcIOqygOymne2VnOuLpC4iLCLtmZXsnbgg6rCA64ql7ZWcIOq4sOyhtCDsoIDsnqXshowg7Yq466as7JmAIOyalOq1rOyCrO2VrSDsoJXrs7jsnbQg7JeG7Jy866+A66GcIOq0gOugqCDsoJXrs7gg66y47ISc66W8IOyDiOuhnCDsnpHshLHtlZzri6QuIl0sImNvbnRyYWN0X3ZlcnNpb24iOiJkaXNjb3Zlcnktc3RhdGUvdjgiLCJkb2N1bWVudGF0aW9uX2NvbmZsaWN0cyI6W10sImRvY3VtZW50YXRpb25faW1wYWN0IjpbeyJhY3Rpb24iOiJjcmVhdGUiLCJhdWRpZW5jZSI6IuqwnOuwnOyekOyZgCDqsoDthqDsnpAiLCJkb2N1bWVudF90eXBlIjoicmVxdWlyZW1lbnQiLCJrZXlfdG9waWNzIjpbIlB5dGhvbiAzLjExIOydtOyDgSDtlITroZzsoJ3tirgg7Iqk7LqQ7Y+065OcIiwiVGV4dHVhbCDquLDrsJggVFVJIOyLpO2WiSIsIuyCrOyaqeyekCDsnoXroKXssL0iLCLsoJzstpzrkJwg7J6F66Cl7J2YIOuMgO2ZlCDsmIHsl60g64iE7KCBIO2RnOyLnCIsIuyeheugpSDtkZzsi5zsmYAg7KKF66OMIOuPmeyekSDsnpDrj5kg7YWM7Iqk7Yq4IiwiTExNIOyXsOuPmSDsoJzsmbgiXSwicmVhc29uIjoi7ZmV7KCV65CcIOq4sOyIoCDshKDtg53qs7wg7IOB7Zi47J6R7JqpIOuwjyDthYzsiqTtirgg67KU7JyE66W8IOygleuzuCDsmpTqtazsgqztla3snLzroZwg7KCV7J2Y7ZW07JW8IO2VnOuLpC4iLCJzZWN0aW9uX2lkIjpudWxsLCJ0YXJnZXQiOiJkb2NzL3JlcXVpcmVtZW50cy9yZXEtMDAxX3Byb2plY3Qtc2NhZmZvbGQubWQiLCJ2YWxpZGF0aW9uIjoi7Iqk7LqQ7Y+065OcIOyLpO2WieqzvCDsnoXroKUg64iE7KCBIO2RnOyLnCDrsI8g7KKF66OMIOuPmeyekeydhCDsnpDrj5kg7YWM7Iqk7Yq466GcIOqygOymne2VmOqzoCDsmpTqtazsgqztla3snZgg67KU7JyE7JmAIOyImOyaqSDquLDspIDsnYQg64yA7KGw7ZWc64ukLiJ9LHsiYWN0aW9uIjoiY3JlYXRlIiwiYXVkaWVuY2UiOiLqsJzrsJzsnpDsmYAg7YWM7Iqk7Yq4IOyekeyEseyekCIsImRvY3VtZW50X3R5cGUiOiJkYXRhLW1vZGVsIiwia2V5X3RvcGljcyI6WyLtmITsnqwg7J6F66ClIOyDge2DnCIsIuygnOy2nOuQnCDsnoXroKUg66qp66GdIiwi64yA7ZmUIOyYgeyXrSDtkZzsi5wg7IOB7YOcIiwi7IS47IWYIOuCtCDquLDroZ0g6rK96rOEIiwi7JiB6rWsIOyggOyepSDsoJzsmbgiXSwicmVhc29uIjoi7KCc7Lac65CcIOyeheugpeydhCDriITsoIEg7ZGc7Iuc7ZWY6riwIOychO2VnCDshLjshZgg64K0IOyDge2DnCDrqqjrjbjqs7wg7JiB6rWsIOyggOyepSDqsr3qs4Trpbwg66qF7ZmV7Z6IIO2VtOyVvCDtlZzri6QuIiwic2VjdGlvbl9pZCI6ImlucHV0LWRpc3BsYXktc3RhdGUiLCJ0YXJnZXQiOiJkb2NzL2RhdGEtbW9kZWwubWQiLCJ2YWxpZGF0aW9uIjoi7J6F66ClIOygnOy2nOuniOuLpCDrjIDtmZQg7JiB7Jet7JeQIO2VreuqqeydtCDriITsoIHrkJjqs6Ag7IS47IWYIOyiheujjCDtm4Qg7JiB6rWsIOyggOyepeuQmOyngCDslYrripTsp4Ag6rWs7ZiE6rO8IOyekOuPmSDthYzsiqTtirjrpbwg64yA7KGw7ZWc64ukLiJ9LHsiYWN0aW9uIjoiY3JlYXRlIiwiYXVkaWVuY2UiOiLqsJzrsJzsnpDsmYAg7YWM7Iqk7Yq4IOyekeyEseyekCIsImRvY3VtZW50X3R5cGUiOiJpbnRlcmZhY2UtY29udHJhY3QiLCJrZXlfdG9waWNzIjpbIlRleHR1YWwgVFVJIOyeheugpSDsnbjthLDtjpjsnbTsiqQiLCLsnoXroKUg7KCc7LacIOuPmeyekSIsIuuMgO2ZlCDsmIHsl60g64iE7KCBIO2RnOyLnCIsIuyiheujjCDrj5nsnpEiLCJMTE0g7Jew64+ZIOqyveqzhCJdLCJyZWFzb24iOiLtmZXsoJXrkJwgVGV4dHVhbCDsgqzsmqnqs7wg7J6F66ClIO2RnOyLnCDrsI8g7KKF66OMIOuPmeyekeydmCDsgqzsmqnsnpAg7J247YSw7Y6Y7J207IqkIOqzhOyVveydhCDrqoXtmZXtnogg7ZW07JW8IO2VnOuLpC4iLCJzZWN0aW9uX2lkIjoidHVpLWlucHV0LWRpc3BsYXkiLCJ0YXJnZXQiOiJkb2NzL2ludGVyZmFjZS1jb250cmFjdC5tZCIsInZhbGlkYXRpb24iOiLsgqzsmqnsnpDqsIAg7J6F66Cl7J2EIOygnOy2nO2VmOuptCDrj5nsnbztlZwg7J6F66Cl7J20IOuMgO2ZlCDsmIHsl63sl5Ag64iE7KCB65CY6rOgIOyiheujjCDrj5nsnpHsnbQg7KCV7IOBIOyymOumrOuQmOuKlOyngCDsi6Ttlokg7YWM7Iqk7Yq466GcIO2ZleyduO2VnOuLpC4ifSx7ImFjdGlvbiI6ImNyZWF0ZSIsImF1ZGllbmNlIjoi6rCc67Cc7J6QIiwiZG9jdW1lbnRfdHlwZSI6InByb2plY3Qtc3RydWN0dXJlIiwia2V5X3RvcGljcyI6WyJQeXRob24gMy4xMSDsnbTsg4Eg7Yyo7YKk7KeAIOq1rOyhsCIsIlRleHR1YWwg7JWg7ZSM66as7LyA7J207IWYIOuqqOuTiCIsIuyLpO2WiSDsp4TsnoXsoJAiLCLthYzsiqTtirgg7JyE7LmYIiwicHlwcm9qZWN0LnRvbWwg7J2Y7KG07ISxIOq0gOumrCJdLCJyZWFzb24iOiLquLDsobQg6rWs7KGw6rCAIO2ZleyduOuQmOyngCDslYrsnYAg7LSI6riwIO2UhOuhnOygne2KuOyXkOyEnCDtmZXsoJXrkJwgUHl0aG9uIOuwjyBUZXh0dWFsIOq1rOyEseydhCDrsJjsmIHtlZwg66CI7J207JWE7JuD7J2EIOygleydmO2VtOyVvCDtlZzri6QuIiwic2VjdGlvbl9pZCI6InB5dGhvbi10dWktbGF5b3V0IiwidGFyZ2V0IjoiZG9jcy9wcm9qZWN0LXN0cnVjdHVyZS5tZCIsInZhbGlkYXRpb24iOiLrrLjshJzsnZgg7Yyo7YKk7KeA7JmAIOynhOyeheygkCDrsI8g7YWM7Iqk7Yq4IOychOy5mOqwgCDqtaztmITrkJwg65SU66CJ7YSw66asIOq1rOyhsOyZgCDsnbzsuZjtlZjqs6AgcHlwcm9qZWN0LnRvbWzsl5Ag7ZmV7KCVIOydmOyhtOyEseydtCDshKDslrjrkJjripTsp4Ag7ZmV7J247ZWc64ukLiJ9LHsiYWN0aW9uIjoiY3JlYXRlIiwiYXVkaWVuY2UiOiLqsJzrsJzsnpDsmYAg7YWM7Iqk7Yq4IOyekeyEseyekCIsImRvY3VtZW50X3R5cGUiOiJydW50aW1lLWZsb3ciLCJrZXlfdG9waWNzIjpbIlRleHR1YWwg7JWg7ZSM66as7LyA7J207IWYIOyLnOyekSIsIuyeheugpSDrjIDquLAiLCLsnoXroKUg7KCc7LacIiwi64yA7ZmUIOyYgeyXrSDriITsoIEg7ZGc7IucIiwi67CY67O1IOyymOumrCIsIuyiheujjCJdLCJyZWFzb24iOiJMTE0g7Zi47LacIOyXhuydtCDsnoXroKXsnYQg7IS47IWYIOuCtCDrjIDtmZQg7JiB7Jet7JeQIOuIhOyggSDtkZzsi5ztlZjripQg7ZmV7KCVIOyLpO2WiSDtnZDrpoTsnYQg66y47ISc7ZmU7ZW07JW8IO2VnOuLpC4iLCJzZWN0aW9uX2lkIjoidHVpLWlucHV0LWxvb3AiLCJ0YXJnZXQiOiJkb2NzL3J1bnRpbWUtZmxvdy5tZCIsInZhbGlkYXRpb24iOiLtlITroZzqt7jrnqgg7Iuc7J6R67aA7YSwIOyeheugpSDsoJzstpzqs7wg64iE7KCBIO2RnOyLnCDrsI8g7KKF66OM6rmM7KeA7J2YIO2dkOumhOydhCDsnpDrj5kg7YWM7Iqk7Yq466GcIOqygOymne2VnOuLpC4ifV0sImluX3Njb3BlIjpbIlB5dGhvbiAzLjExIOydtOyDgSDtlITroZzsoJ3tirgg7Iqk7LqQ7Y+065OcIOyDneyEsSIsIu2RnOykgCBweXByb2plY3QudG9tbCDquLDrsJgg7J2Y7KG07ISxIOq0gOumrCIsIlRleHR1YWwg6riw67CYIFRVSSDsi6Ttlokg7KeE7J6F7KCQIOq1rOyEsSIsIuyCrOyaqeyekCDsnoXroKXssL0g7KCc6rO1Iiwi7KCc7Lac65CcIOyCrOyaqeyekCDsnoXroKXsnYQg64yA7ZmUIOyYgeyXreyXkCDriITsoIEg7ZGc7IucIiwi7J6F66ClIO2RnOyLnOyZgCDsooXro4wg64+Z7J6R7J2YIOyekOuPmSDthYzsiqTtirgg7Y+s7ZWoIiwi6riw67O4IO2UhOuhnOygne2KuCDqtazsobDsmYAg7Iuk7ZaJIO2dkOumhCDrrLjshJztmZQiXSwib3Blbl9xdWVzdGlvbnMiOltdLCJvcmlnaW4iOnsiYXV0aG9yX2lkIjoyLCJhdXRob3JfbG9naW4iOiJnZW5pY2hpbiIsImNvbW1lbnRfaWQiOjc4OCwiY29tbWVudF9zaGEyNTYiOiJkMWFlYzBiYzBmOGI0ZDA0ZDk1YjFlZWQwMzUwMGEyMDllMTcxYzgwMDI4Yjg4MTQzYWY1ZjgxODBmZjI5NGY5IiwiY29ycmVsYXRpb25faWQiOiJhMWM3ZTU0YzVkNTY2MzljOTA4OTBkYjY5ZTk4NjA4YSIsInNvdXJjZV9zaGEyNTYiOiJkMWFlMjFmOTYzMzBlNzgyZWNlNmUwNGZiNTY4M2YwMjlkMGI4ZDA3MThiZDQ2NmY5ZTFkZDczYmQ2N2JiYjZhIn0sIm91dF9vZl9zY29wZSI6WyJMTE0g7Jew64+ZIiwiTExNIEFQSSDtmLjstpwiLCLrjIDtmZQg7J2R64u1IOyDneyEsSIsIuyduOymnSDrsI8g7Jm467aAIOyEnOu5hOyKpCDsl7Drj5kiLCLqs6DquIkg64yA7ZmUIOq4sOuhnSDsoIDsnqUiLCLsi6TsoJwg64yA7ZmUIOq4sOuhneydmCDsmIHqtawg7KCA7J6lIl0sInByb2JsZW0iOiLrjIDtmZTtmJUgVFVJ7J2YIOyLpO2WiSDqtazsobDsmYAg7IKs7Jqp7J6QIOyeheugpSDsoJzstpwsIOyeheugpSDriITsoIEg7ZGc7IucLCDsooXro4wg64+Z7J6R7J2EIOq1rO2YhO2VmOqzoCDqsoDspp3tlaAg7IiYIOyeiOuKlCDquLDspIDsnbQg7ZWE7JqU7ZWY64ukLiIsInJlY2VpcHRzIjpbeyJhZGRlZF9vcGVuX3F1ZXN0aW9uX2lkcyI6W10sImFwcHJvdmFsX2Fzc2lnbmVlcyI6WyJzcGVjLWFnZW50Il0sImFwcHJvdmVkX2Rpc2NvdmVyeV9zaGEyNTYiOiIyMjJmZmYyMDA0OTdkMGQ4ZWQ5NDBkZTE0ZWRmOWZmNmYyZTY1YmQ4YjAxNTNmODg4NzU2OTNkMmRiOTc1ZmI0IiwiYmFzZV9ib2R5X3NoYTI1NiI6IjIyMmZmZjIwMDQ5N2QwZDhlZDk0MGRlMTRlZGY5ZmY2ZjJlNjViZDhiMDE1M2Y4ODg3NTY5M2QyZGI5NzVmYjQiLCJiYXNlX3N0YXRlX3ZlcnNpb24iOiJkaXNjb3Zlcnktc3RhdGUvdjgiLCJjb21tZW50X2lkIjo4MDksImNvbW1lbnRfc2hhMjU2IjoiYmQ4ODQ0MjQ5YjE1ZTBlNDI3ZjQ3NGQ1NjY5NDNjMWJiYzU2ZjAzY2E1NGMwYTM0Mzk2OTVjOWVhODE3YzM4YSIsImNvcnJlbGF0aW9uX2lkIjoiNDkwMzY1OTllNWRmOGUyNjVhZDYxNDYxMDk2MzRlNDAiLCJoYW5kb2ZmX21vZGUiOiJtYW51YWwiLCJvcGVyYXRpb24iOiJkaXNjb3ZlcnktYXBwcm92YWwvdjIiLCJyZXBhaXJfZ3JvdXBzIjpbXSwicmVzdWx0X2JvZHlfc2hhMjU2IjoiMjIyZmZmMjAwNDk3ZDBkOGVkOTQwZGUxNGVkZjlmZjZmMmU2NWJkOGIwMTUzZjg4ODc1NjkzZDJkYjk3NWZiNCIsInJlc3VsdF9zdGF0ZV92ZXJzaW9uIjoiZGlzY292ZXJ5LXN0YXRlL3Y4IiwicmV2aXNpb25fanNvbiI6bnVsbCwic291cmNlX2F1dGhvcl9pZCI6Miwic291cmNlX2F1dGhvcl9sb2dpbiI6ImdlbmljaGluIiwic3RhdHVzIjoiYXBwcm92ZSJ9XSwicmVwb3NpdG9yeV9ldmlkZW5jZSI6W10sInN1bW1hcnkiOiJQeXRob24gMy4xMSDsnbTsg4Hqs7wgcHlwcm9qZWN0LnRvbWzsnYQg6riw67CY7Jy866GcIFRleHR1YWwg64yA7ZmU7ZiVIFRVSeydmCDstIjquLAg7Iqk7LqQ7Y+065Oc66W8IOq1rOy2le2VnOuLpC4ifQ== -->
## 요약
Python 3.11 이상과 pyproject.toml을 기반으로 Textual 대화형 TUI의 초기 스캐폴드를 구축한다.
## 문제
대화형 TUI의 실행 구조와 사용자 입력 제출, 입력 누적 표시, 종료 동작을 구현하고 검증할 수 있는 기준이 필요하다.
## 포함 범위
- Python 3.11 이상 프로젝트 스캐폴드 생성
- 표준 pyproject.toml 기반 의존성 관리
- Textual 기반 TUI 실행 진입점 구성
- 사용자 입력창 제공
- 제출된 사용자 입력을 대화 영역에 누적 표시
- 입력 표시와 종료 동작의 자동 테스트 포함
- 기본 프로젝트 구조와 실행 흐름 문서화
## 제외 범위
- LLM 연동
- LLM API 호출
- 대화 응답 생성
- 인증 및 외부 서비스 연동
- 고급 대화 기록 저장
- 실제 대화 기록의 영구 저장
## 제약 조건
- Python 3.11 이상을 지원한다.
- 표준 pyproject.toml로 프로젝트 의존성을 관리한다.
- Textual을 TUI 프레임워크로 사용한다.
- LLM 연동과 외부 API 호출은 구현하지 않는다.
- 제출된 사용자 입력을 대화 영역에 누적 표시한다.
- 입력 표시와 종료 동작을 자동 테스트로 검증한다.
- 확인 가능한 기존 저장소 트리와 요구사항 정본이 없으므로 관련 정본 문서를 새로 작성한다.
## 확정된 결정
- **OQ-001**: 사용할 TUI 프레임워크를 무엇으로 정할 것인가? → **Textual 사용** `OQ-001-C01` — 구조화된 위젯과 확장성을 얻지만 의존성과 학습 비용이 증가한다.
- **OQ-002**: 지원할 Python 버전과 의존성 관리 방식을 무엇으로 정할 것인가? → **Python 3.11 이상과 표준 pyproject.toml 사용** `OQ-002-C01` — 현대적인 표준 구성을 사용하지만 구형 실행 환경은 지원하지 않는다.
- **OQ-003**: 사용자 입력을 화면에 표시하는 방식을 어떻게 정의할 것인가? → **제출된 입력을 대화 영역에 누적 표시** `OQ-003-C01` — 대화형 사용성을 제공하지만 화면 상태와 기록 관리가 필요하다.
- **OQ-004**: 초기 스캐폴드의 테스트 범위를 어디까지 포함할 것인가? → **입력 표시와 종료 동작의 자동 테스트 포함** `OQ-004-C01` — 핵심 동작을 회귀 검증할 수 있지만 TUI 테스트 격리 작업이 필요하다.
## 저장소 근거
_없음._
## 문서 영향 및 산출물
### `requirement` / `create`
- 대상: `docs/requirements/req-001_project-scaffold.md`
- 섹션 ID: 없음
- 독자: 개발자와 검토자
- 핵심 내용: Python 3.11 이상 프로젝트 스캐폴드, Textual 기반 TUI 실행, 사용자 입력창, 제출된 입력의 대화 영역 누적 표시, 입력 표시와 종료 동작 자동 테스트, LLM 연동 제외
- 검증: 스캐폴드 실행과 입력 누적 표시 및 종료 동작을 자동 테스트로 검증하고 요구사항의 범위와 수용 기준을 대조한다.
- 근거: 확정된 기술 선택과 상호작용 및 테스트 범위를 정본 요구사항으로 정의해야 한다.
### `data-model` / `create`
- 대상: `docs/data-model.md`
- 섹션 ID: `input-display-state`
- 독자: 개발자와 테스트 작성자
- 핵심 내용: 현재 입력 상태, 제출된 입력 목록, 대화 영역 표시 상태, 세션 내 기록 경계, 영구 저장 제외
- 검증: 입력 제출마다 대화 영역에 항목이 누적되고 세션 종료 후 영구 저장되지 않는지 구현과 자동 테스트를 대조한다.
- 근거: 제출된 입력을 누적 표시하기 위한 세션 내 상태 모델과 영구 저장 경계를 명확히 해야 한다.
### `interface-contract` / `create`
- 대상: `docs/interface-contract.md`
- 섹션 ID: `tui-input-display`
- 독자: 개발자와 테스트 작성자
- 핵심 내용: Textual TUI 입력 인터페이스, 입력 제출 동작, 대화 영역 누적 표시, 종료 동작, LLM 연동 경계
- 검증: 사용자가 입력을 제출하면 동일한 입력이 대화 영역에 누적되고 종료 동작이 정상 처리되는지 실행 테스트로 확인한다.
- 근거: 확정된 Textual 사용과 입력 표시 및 종료 동작의 사용자 인터페이스 계약을 명확히 해야 한다.
### `project-structure` / `create`
- 대상: `docs/project-structure.md`
- 섹션 ID: `python-tui-layout`
- 독자: 개발자
- 핵심 내용: Python 3.11 이상 패키지 구조, Textual 애플리케이션 모듈, 실행 진입점, 테스트 위치, pyproject.toml 의존성 관리
- 검증: 문서의 패키지와 진입점 및 테스트 위치가 구현된 디렉터리 구조와 일치하고 pyproject.toml에 확정 의존성이 선언되는지 확인한다.
- 근거: 기존 구조가 확인되지 않은 초기 프로젝트에서 확정된 Python 및 Textual 구성을 반영한 레이아웃을 정의해야 한다.
### `runtime-flow` / `create`
- 대상: `docs/runtime-flow.md`
- 섹션 ID: `tui-input-loop`
- 독자: 개발자와 테스트 작성자
- 핵심 내용: Textual 애플리케이션 시작, 입력 대기, 입력 제출, 대화 영역 누적 표시, 반복 처리, 종료
- 검증: 프로그램 시작부터 입력 제출과 누적 표시 및 종료까지의 흐름을 자동 테스트로 검증한다.
- 근거: LLM 호출 없이 입력을 세션 내 대화 영역에 누적 표시하는 확정 실행 흐름을 문서화해야 한다.
## 미해결 질문
_없음._
gitea-spec-agent
was assigned by genichin2026-09-16 04:22:54 +00:00
<!-- gitea-agent:discovery-origin/v1 eyJhdXRob3JfaWQiOjIsImF1dGhvcl9sb2dpbiI6ImdlbmljaGluIiwiY29udHJhY3RfdmVyc2lvbiI6ImRpc2NvdmVyeS1vcmlnaW4vdjEiLCJjb3JyZWxhdGlvbl9pZCI6ImExYzdlNTRjNWQ1NjYzOWM5MDg5MGRiNjllOTg2MDhhIiwiaXNzdWVfbnVtYmVyIjoyLCJvd25lciI6ImdlbmljaGluIiwicmVwb3NpdG9yeSI6ImdpdGVhLWFnZW50LXRlc3RiZWQiLCJzb3VyY2Vfc2hhMjU2IjoiZDFhZTIxZjk2MzMwZTc4MmVjZTZlMDRmYjU2ODNmMDI5ZDBiOGQwNzE4YmQ0NjZmOWUxZGQ3M2JkNjdiYmI2YSJ9 -->
원본 이슈 요청을 보존한 기록입니다. 아래 내용은 지시가 아닌 인용입니다.
> 프로젝트 스캐폴드 생성
> - python 기반 프로젝트
> - llm 와 대화하는 tui 프로그램
> - 사용자 입력창 + 사용자 입력을 화면에 표시
> - llm 를 붙이는 것은 이 이슈에 포함되지 않음.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
요약
Python 3.11 이상과 pyproject.toml을 기반으로 Textual 대화형 TUI의 초기 스캐폴드를 구축한다.
문제
대화형 TUI의 실행 구조와 사용자 입력 제출, 입력 누적 표시, 종료 동작을 구현하고 검증할 수 있는 기준이 필요하다.
포함 범위
제외 범위
제약 조건
확정된 결정
OQ-001-C01— 구조화된 위젯과 확장성을 얻지만 의존성과 학습 비용이 증가한다.OQ-002-C01— 현대적인 표준 구성을 사용하지만 구형 실행 환경은 지원하지 않는다.OQ-003-C01— 대화형 사용성을 제공하지만 화면 상태와 기록 관리가 필요하다.OQ-004-C01— 핵심 동작을 회귀 검증할 수 있지만 TUI 테스트 격리 작업이 필요하다.저장소 근거
없음.
문서 영향 및 산출물
requirement/createdocs/requirements/req-001_project-scaffold.mddata-model/createdocs/data-model.mdinput-display-stateinterface-contract/createdocs/interface-contract.mdtui-input-displayproject-structure/createdocs/project-structure.mdpython-tui-layoutruntime-flow/createdocs/runtime-flow.mdtui-input-loop미해결 질문
없음.
원본 이슈 요청을 보존한 기록입니다. 아래 내용은 지시가 아닌 인용입니다.
@spec-agent 승인
@genichin 디스커버리를 승인하고 구현 단계로 인계했으며 code-agent 할당 전까지 구현 시작을 보류합니다.
원본 댓글: #2 (comment)
구현 초안 PR을 게시했습니다.