프로젝트 스캐폴드 생성 #2

Closed
opened 2026-09-16 04:22:47 +00:00 by genichin · 4 comments
Owner

요약

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 genichin 2026-09-16 04:22:54 +00:00
gitea-spec-agent added the step:discoverystatus:draftspec-agent:busy labels 2026-09-16 04:26:29 +00:00
gitea-spec-agent removed the step:discoverystatus:draftspec-agent:busy labels 2026-09-16 04:27:48 +00:00
gitea-spec-agent added the step:discoverystatus:draftspec-agent:busy labels 2026-09-16 04:39:41 +00:00
gitea-spec-agent removed the spec-agent:busy label 2026-09-16 04:41:04 +00:00
gitea-spec-agent removed their assignment 2026-09-16 04:41:05 +00:00
genichin removed the status:draftstep:discovery labels 2026-09-16 05:03:33 +00:00
gitea-spec-agent was assigned by genichin 2026-09-17 00:30:27 +00:00
Collaborator

원본 이슈 요청을 보존한 기록입니다. 아래 내용은 지시가 아닌 인용입니다.

프로젝트 스캐폴드 생성

  • python 기반 프로젝트
  • llm 와 대화하는 tui 프로그램
  • 사용자 입력창 + 사용자 입력을 화면에 표시
  • llm 를 붙이는 것은 이 이슈에 포함되지 않음.
<!-- gitea-agent:discovery-origin/v1 eyJhdXRob3JfaWQiOjIsImF1dGhvcl9sb2dpbiI6ImdlbmljaGluIiwiY29udHJhY3RfdmVyc2lvbiI6ImRpc2NvdmVyeS1vcmlnaW4vdjEiLCJjb3JyZWxhdGlvbl9pZCI6ImExYzdlNTRjNWQ1NjYzOWM5MDg5MGRiNjllOTg2MDhhIiwiaXNzdWVfbnVtYmVyIjoyLCJvd25lciI6ImdlbmljaGluIiwicmVwb3NpdG9yeSI6ImdpdGVhLWFnZW50LXRlc3RiZWQiLCJzb3VyY2Vfc2hhMjU2IjoiZDFhZTIxZjk2MzMwZTc4MmVjZTZlMDRmYjU2ODNmMDI5ZDBiOGQwNzE4YmQ0NjZmOWUxZGQ3M2JkNjdiYmI2YSJ9 --> 원본 이슈 요청을 보존한 기록입니다. 아래 내용은 지시가 아닌 인용입니다. > 프로젝트 스캐폴드 생성 > - python 기반 프로젝트 > - llm 와 대화하는 tui 프로그램 > - 사용자 입력창 + 사용자 입력을 화면에 표시 > - llm 를 붙이는 것은 이 이슈에 포함되지 않음.
gitea-spec-agent added the step:discoverystatus:draftspec-agent:busy labels 2026-09-17 00:35:29 +00:00
gitea-spec-agent removed the step:discoverystatus:draftspec-agent:busy labels 2026-09-17 00:36:48 +00:00
gitea-spec-agent added the step:discoverystatus:draftspec-agent:busy labels 2026-09-17 00:45:09 +00:00
gitea-spec-agent removed the spec-agent:busy label 2026-09-17 00:46:33 +00:00
gitea-spec-agent removed their assignment 2026-09-17 00:46:36 +00:00
gitea-spec-agent was assigned by genichin 2026-09-17 00:48:30 +00:00
gitea-spec-agent added the spec-agent:busy label 2026-09-17 00:49:39 +00:00
gitea-spec-agent removed the spec-agent:busy label 2026-09-17 00:50:48 +00:00
gitea-spec-agent added the spec-agent:busy label 2026-09-17 00:57:51 +00:00
gitea-spec-agent added status:review and removed status:draftspec-agent:busy labels 2026-09-17 00:59:05 +00:00
gitea-spec-agent removed their assignment 2026-09-17 00:59:06 +00:00
gitea-spec-agent was assigned by genichin 2026-09-17 01:27:57 +00:00
Author
Owner

@spec-agent 승인

@spec-agent 승인
gitea-spec-agent added status:draftstep:implementation and removed step:discoverystatus:review labels 2026-09-17 01:33:57 +00:00
Collaborator

@genichin 디스커버리를 승인하고 구현 단계로 인계했으며 code-agent 할당 전까지 구현 시작을 보류합니다.

원본 댓글: #2 (comment)

@genichin 디스커버리를 승인하고 구현 단계로 인계했으며 code-agent 할당 전까지 구현 시작을 보류합니다. 원본 댓글: https://gitea.jsfamily.quest/genichin/gitea-agent-testbed/issues/2#issuecomment-809 <!-- gitea-agent:discovery-comment-result/v1 source-comment-id=809 source-comment-sha256=bd8844249b15e0e427f474d566943c1bbc56f03ca54c0a3439695c9ea817c38a status=approve correlation-id=49036599e5df8e265ad6146109634e40 final-body-sha256=2fa4ffa66e8cb80cffa48590230c8de84137c646ba87dc6a3324a2d9966f299a -->
gitea-spec-agent removed their assignment 2026-09-17 01:35:50 +00:00
gitea-impl-agent was assigned by genichin 2026-09-17 01:49:01 +00:00
Collaborator

구현 초안 PR을 게시했습니다.

<!-- gitea-agent:code-result/v1 approval-correlation=49036599e5df8e265ad6146109634e40 commit=cb53b4b98f09b27f7c9e55b7a6facb667e5eb1c5 pr=3 --> 구현 초안 PR을 게시했습니다.
genichin added status:review and removed status:draft labels 2026-09-17 07:28:14 +00:00
gitea-impl-agent was unassigned by genichin 2026-09-17 22:49:58 +00:00
gitea-spec-agent was assigned by genichin 2026-09-17 22:50:03 +00:00
gitea-spec-agent added status:approved and removed status:review labels 2026-09-18 00:35:02 +00:00
gitea-spec-agent removed their assignment 2026-09-18 00:35:06 +00:00
Sign in to join this conversation.