code-agent: rework issue 8

Review-ID: 39
Previous-SHA: 925c107f9a
Plan-SHA256: 7ceaf8e0c832478852e3fde7d13d060cbb688be09c1b131deb5ccc32c85ed2ff
Bundle-SHA256: 29ce1ef1917864f79938459725201e6e74d67e21b1f817ac53d7b294eca8f1a2
This commit is contained in:
code-agent
2000-01-01 00:00:00 +00:00
parent 925c107f9a
commit 7bfe2b62f4
2 changed files with 247 additions and 190 deletions
+147 -97
View File
@@ -19,29 +19,29 @@
## 1. 목적
이 요구사항은 Python 3.11 이상에서 실행되는 Textual 기반 대화형 TUI 프로젝트의 스캐폴드, 패키징 메타데이터와 실행 진입점을 정의한다. 프로젝트가 표준 Python 패키지로 설치되고 지정된 콘솔 명령 또는 모듈 실행 방식으로 시작되는 상태를 보장한다. 대화 입력 처리와 응답 표시 동작은 별도 요구사항에서 관리하며 이 문서에서는 정본으로 정의하지 않는다.
이 요구사항은 Python 3.11 이상에서 실행되는 Textual 기반 대화형 TUI 프로젝트의 스캐폴드, 패키징 메타데이터와 실행 진입점을 정의한다. 프로젝트가 표준 Python 패키지로 설치되고 `chat-tui` 콘솔 명령 또는 `python -m chat_tui` 방식으로 시작되는 상태를 보장한다. 대화 입력 처리와 응답 표시 동작은 REQ-002에서 단일 정본으로 관리하며 이 문서에서는 정의하지 않는다.
기존 프로젝트 스캐폴드 요구사항의 정체성과 승인 이력은 유지한다. 기존 승인 상태와 승인 근거를 임의로 초안 상태로 되돌리거나 삭제하지 않으며, 이번 문서 정리는 프로젝트 스캐폴드와 실행 기반의 범위만 명확히 하는 변경으로 한정한다.
기존 REQ-001의 프로젝트 스캐폴드 정체성, 승인 상태, 승인 주체인 `spec-agent`, 승인 근거인 승인 댓글 923 및 디스커버리 승인 결과를 보존한다. 이번 정리는 승인 상태를 초안으로 되돌리거나 승인 근거를 삭제하지 않으며, 프로젝트 스캐폴드와 실행 기반의 범위만 명확히 하는 변경으로 한정한다.
## 2. 배경
프로젝트는 소스 코드를 `src` 레이아웃 아래에 두고 `chat_tui` 패키지로 제공한다. 패키징은 setuptools 빌드 백엔드를 사용하며 Python 3.11 이상을 실행 환경으로 요구한다. 런타임에는 Textual 0.47 이상 1.0 미만을 사용하고, 테스트용 선택 의존성으로 pytest 8.0 이상을 제공한다. 패키지 버전은 현재 0.1.0으로 관리한다.
프로젝트는 소스 코드를 `src` 레이아웃 아래에 두고 `chat_tui` 패키지로 제공한다. 패키징은 setuptools 빌드 백엔드를 사용하며 Python 3.11 이상을 실행 환경으로 요구한다. 런타임에는 Textual 0.47 이상 1.0 미만을 사용하고, 테스트용 선택 의존성으로 pytest 8.0 이상을 제공한다. 패키지 버전은 현재 `0.1.0`으로 관리한다.
패키지 설치와 실행 진입점은 대화 기능과 독립적으로 검증할 수 있는 프로젝트 기반 계약이다. 대화 입력 정규화, 메시지 누적, 고정 응답 선택과 표시, 빈 입력 처리, 입력창 초기화 및 종료 동작은 원본 이슈인 Gitea 이슈 #8의 재작업 범위에 따라 별도 대화 요구사항 문서에서 추적한다.
패키지 설치와 실행 진입점은 대화 기능과 독립적으로 검증할 수 있는 프로젝트 기반 계약이다. 대화 입력 정규화, 메시지 누적, 고정 응답 선택과 표시, 빈 입력 처리, 입력창 초기화 및 종료 동작은 원본 Gitea 이슈 #8의 재작업 범위에 따라 REQ-002에서 추적한다. REQ-002는 REQ-001의 실행 기반을 의존 대상으로 사용하지만, 패키징과 실행 진입점의 상세 계약을 중복 정의하지 않는다.
## 3. 범위
이 문서는 `src/chat_tui` Python 패키지의 기본 구조, 패키지 버전 공개, `pyproject.toml`의 빌드 시스템과 프로젝트 메타데이터, Python 및 런타임 의존성, 테스트 선택 의존성, `chat-tui` 콘솔 스크립트와 `python -m chat_tui` 모듈 실행 진입점을 포함한다. 소스 디렉터리를 패키지 탐색 대상으로 사용하는 설치 구조도 포함한다.
대화 입력 정규화, 메시지 누적, 고정 응답 선택 및 표시, 역할별 대화 표시, 빈 입력 처리, 입력창 초기화와 종료 단축키의 상세 동작 및 수용 기준은 포함하지 않는다. 해당 내용은 별도 대화 상호작용 요구사항에서 단일 정본으로 관리한다. 외부 API, LLM, 네트워크 서비스, 데이터베이스, 영속 저장소, 새 의존성, 배포 방식 또는 실행 환경 변경도 포함하지 않는다.
대화 입력 정규화, 메시지 누적, 고정 응답 선택 및 표시, 역할별 대화 표시, 빈 입력 처리, 입력창 초기화와 종료 단축키의 상세 동작 및 수용 기준은 포함하지 않는다. 해당 내용은 REQ-002에서 단일 정본으로 관리한다. 외부 API, LLM, 네트워크 서비스, 데이터베이스, 영속 저장소, 새 의존성, 배포 방식 또는 실행 환경 변경도 포함하지 않는다.
### 포함
Python 3.11 이상을 대상으로 하는 chat_tui 패키지의 프로젝트 구조, setuptools 패키징 설정, 런타임 의존성, 테스트 선택 의존성, 콘솔 스크립트 진입점과 python -m 실행 진입점을 다룬다.
Python 3.11 이상을 대상으로 하는 chat_tui 패키지의 src 기반 프로젝트 구조, setuptools 패키징 설정, 프로젝트 메타데이터, 런타임 및 선택적 테스트 의존성, chat-tui 콘솔 스크립트와 python -m chat_tui 실행 진입점을 포함한다. 기존 REQ-001의 승인 상태와 승인 주체 spec-agent, 승인 근거 승인 댓글 923 및 디스커버리 승인 결과를 보존한다.
### 제외
사용자 입력 정규화, 대화 메시지 누적, 고정 응답 선택 및 표시, 빈 입력 처리, 입력창 초기화, 종료 단축키를 포함한 대화 상호작용 동작은 다루지 않는다. 외부 API 연동, 영속성, 배포 환경 변경과 새 의존성 추가도 포함하지 않는다.
대화 입력 정규화, 메시지 누적, 고정 응답 선택 및 표시, 빈 입력 처리, 입력창 초기화, 종료 단축키를 포함한 대화 상호작용의 상세 동작과 수용 기준은 별도 REQ-002에서 관리한다. 외부 API, LLM, 네트워크 서비스, 데이터베이스, 영속 저장소, 새 의존성, 배포 방식 및 실행 환경 변경도 제외한다.
## 4. 용어와 기준
@@ -50,12 +50,13 @@ Python 3.11 이상을 대상으로 하는 chat_tui 패키지의 프로젝트 구
- 프로젝트 이름은 `gitea-agent-testbed`이고 Python 패키지 이름은 `chat_tui`이다.
- 소스 루트는 `src`이며 패키지 탐색 설정은 해당 루트를 기준으로 한다.
- 패키지 초기화 모듈은 패키지 버전 `0.1.0`을 공개한다.
- 모듈 실행 진입점은 애플리케이션 모듈의 공개 실행 함수를 호출한다.
- 모듈 실행 진입점은 애플리케이션 모듈의 공개 실행 함수인 `main`을 호출한다.
- 콘솔 스크립트 진입점은 `chat_tui.app:main`으로 연결한다.
- 빌드 백엔드는 setuptools를 사용하고 빌드 요구 버전은 68 이상이다.
- 테스트 설정은 `src`를 Python 경로에 포함하고 `tests` 디렉터리를 검색 대상으로 한다.
- 프로젝트 스캐폴드 설명은 실제 패키지 구조와 패키징 설정에 부합해야 한다.
- 대화 상호작용의 의미와 세부 검증 기준은 이 문서가 아니라 분리된 대화 요구사항을 기준으로 한다.
- 대화 상호작용의 의미와 세부 검증 기준은 REQ-002를 기준으로 하며 이 문서의 기준과 중복하지 않는다.
- 기존 REQ-001의 승인 상태와 승인 이력은 승인된 프로젝트 스캐폴드 범위의 기록으로 보존한다.
## 5. 요구사항
@@ -70,83 +71,82 @@ Python 3.11 이상을 대상으로 하는 chat_tui 패키지의 프로젝트 구
- 패키지 버전은 초기 스캐폴드 기준인 `0.1.0`을 일관되게 노출해야 한다.
- 패키징 및 실행 진입점 검증은 대화 기능의 상세 동작과 독립적으로 수행할 수 있어야 한다.
**Python 패키지 구조와 메타데이터**
프로젝트는 소스 디렉터리 기반의 `chat_tui` Python 패키지로 구성되어야 하며, 패키징 메타데이터에 프로젝트 이름, 버전 `0.1.0`, 설명, README 참조, Python 3.11 이상 실행 조건과 Textual 0.47 이상 1.0 미만의 런타임 의존성을 선언해야 한다. 패키지는 setuptools 빌드 백엔드와 소스 디렉터리 검색 설정을 사용해야 하며, 패키지 버전은 애플리케이션에서 조회할 수 있고 프로젝트 메타데이터와 일치해야 한다.
프로젝트는 소스 디렉터리 기반의 `chat_tui` Python 패키지로 구성되어야 하며, 패키징 메타데이터에 프로젝트 이름, 버전, 설명, Python 3.11 이상 실행 조건과 Textual 런타임 의존성을 선언해야 한다. 패키지는 setuptools 빌드 백엔드와 소스 디렉터리 검색 설정을 사용해야 하며, 패키지 버전은 애플리케이션에서 조회할 수 있어야 한다.
영향 범위는 Python 패키지 설치와 import 경계, 개발자와 패키지 설치 도구 및 실행 진입점에 한정된다. 영속성 변경과 마이그레이션은 없으며, Python 3.11 이상과 기존 패키지 이름을 유지한다. setuptools 기반 editable 설치가 가능해야 한다.
**모듈 실행 진입점**
프로젝트는 `python -m chat_tui` 명령으로 실행할 수 있어야 한다. 모듈 실행은 애플리케이션의 공개 실행 함수를 호출해야 하며, 패키지를 단순히 import하는 것만으로 애플리케이션을 시작해서는 안 된다.
영향 범위는 모듈 실행 계약과 Python 모듈 실행 환경에 한정된다. 영속성 변경과 마이그레이션은 없으며, 기존 모듈 실행 방식과 공개 실행 함수 연결을 유지한다. 패키지가 Python 모듈 검색 경로에 설치되어 있어야 한다.
**콘솔 스크립트 실행 진입점**
패키징 설정은 `chat-tui` 콘솔 명령을 애플리케이션 모듈의 공개 실행 함수에 연결해야 한다. 설치 후 사용자는 별도의 경로 지정이나 내부 모듈 호출 없이 해당 명령으로 TUI를 시작할 수 있어야 한다.
영향 범위는 설치 후 제공되는 콘솔 명령과 최종 사용자 및 운영 스크립트에 한정된다. 영속성 변경과 마이그레이션은 없으며, 프로젝트에서 정의한 콘솔 명령 이름과 실행 함수 연결을 유지한다. 패키지 설치 시 console script가 생성되어야 한다.
대화 입력, 응답, 메시지 표시와 종료 동작의 상세 요구사항 및 수용 기준은 이 문서에 중복해서 정의하지 않고 분리된 대화 요구사항에서 관리한다.
### REQ-001.01 — Python 패키지 구조와 메타데이터를 제공한다
프로젝트는 Python 3.11 이상에서 설치 및 실행 가능한 표준 Python 패키지 구조를 제공해야 한다. 소스 루트는 `src`이며 `src/chat_tui` 패키지를 배포 대상으로 포함해야 한다. setuptools 빌드 백엔드와 소스 디렉터리 패키지 검색 설정을 사용하고, 프로젝트 이름, 버전 `0.1.0`, 설명, README 참조, Python 최소 버전 및 Textual 0.47 이상 1.0 미만의 런타임 의존성을 패키징 메타데이터에 선언해야 한다. 테스트용 pytest 8.0 이상 의존성은 선택적으로 설치할 수 있어야 하며, 패키지 버전은 애플리케이션에서 조회할 수 있고 프로젝트 메타데이터와 일치해야 한다.
**영향 범위**
인터페이스: Python 패키지 설치와 import 경계에 영향을 준다. 영속성: 영향 없음. 후속 사용 주체: 개발자, 패키지 설치 도구와 실행 진입점. 마이그레이션: 필요 없음. 호환성: Python 3.11 이상, 프로젝트 이름, 패키지 이름과 버전 계약을 유지한다. 배포 전제 조건: setuptools 기반 설치와 `src` 패키지 탐색이 가능해야 한다.
### REQ-001.02 — 모듈 실행 진입점을 제공한다
프로젝트는 `python -m chat_tui` 명령으로 실행할 수 있어야 한다. 모듈 진입점은 애플리케이션의 공개 실행 함수인 `main`을 호출해야 하며, 패키지를 단순히 import하는 것만으로 애플리케이션을 시작해서는 안 된다. 실행 진입점은 설치된 패키지와 선언된 런타임 환경에서 동일한 애플리케이션 시작 흐름으로 연결되어야 한다.
**영향 범위**
인터페이스: `python -m chat_tui` 실행 계약에 영향을 준다. 영속성: 영향 없음. 후속 사용 주체: 개발자와 운영자가 사용하는 Python 모듈 실행 환경. 마이그레이션: 필요 없음. 호환성: 기존 모듈 실행 방식과 공개 실행 함수 연결을 유지한다. 배포 전제 조건: 패키지가 Python 모듈 검색 경로에 설치되어 있어야 한다.
### REQ-001.03 — 콘솔 스크립트 실행 진입점을 제공한다
프로젝트는 `python -m chat_tui` 명령으로 실행할 수 있어야 한다. 모듈 실행은 애플리케이션의 공개 실행 함수인 `main`을 호출해야 하며, 패키지를 단순히 import하는 것만으로 애플리케이션을 시작해서는 안 된다.
패키징 설정은 `chat-tui` 콘솔 명령을 `chat_tui.app:main`에 연결해야 한다. 설치 후 사용자는 별도의 경로 지정이나 내부 모듈 호출 없이 해당 명령으로 TUI를 시작할 수 있어야 하며, 콘솔 명령과 모듈 실행 명령은 동일한 애플리케이션 시작 동작을 호출해야 한다.
대화 입력, 응답, 메시지 표시와 종료 동작의 상세 요구사항 및 수용 기준은 REQ-002에서 관리한다. 이 문서에 이를 중복 기록하지 않으며, REQ-001의 승인 상태와 기존 승인 이력은 변경하지 않는다.
### REQ-001.01 — Python 패키지 구조와 메타데이터를 제공한다
프로젝트는 Python 3.11 이상에서 설치 및 실행 가능한 표준 Python 패키지 구조를 제공해야 한다. 소스 루트는 src이며 src/chat_tui 패키지를 배포 대상으로 포함해야 한다. setuptools 빌드 백엔드와 소스 디렉터리 패키지 검색 설정을 사용하고, 프로젝트 이름, 버전 0.1.0, 설명, README 참조, Python 최소 버전 및 Textual 0.47 이상 1.0 미만의 런타임 의존성을 패키징 메타데이터에 선언해야 한다. 테스트용 pytest 8.0 이상 의존성은 선택적으로 설치할 수 있어야 하며, 패키지 버전은 애플리케이션에서 조회할 수 있고 프로젝트 메타데이터와 일치해야 한다.
**영향 범위**
인터페이스: 설치 후 제공되는 `chat-tui` 콘솔 명령에 영향을 준다. 영속성: 영향 없음. 후속 사용 주체: 최종 사용자와 운영 스크립트. 마이그레이션: 필요 없음. 호환성: 프로젝트에서 정의한 콘솔 명령 이름과 실행 함수 연결을 유지한다. 배포 전제 조건: 패키지 설치 시 console script가 생성되어야 한다.
인터페이스: Python 패키지 설치와 import 경계에 영향을 준다. 영속성: 영향 없음. 후속 사용 주체: 개발자, 패키지 설치 도구와 실행 진입점. 마이그레이션: 필요 없음. 호환성: Python 3.11 이상, 프로젝트 이름, 패키지 이름과 버전 계약을 유지한다. 배포 전제 조건: setuptools 기반 설치와 src 패키지 탐색이 가능해야 한다.
### REQ-001.02 — 모듈 실행 진입점을 제공한다
프로젝트는 python -m chat_tui 명령으로 실행할 수 있어야 한다. 모듈 진입점은 애플리케이션의 공개 실행 함수인 main을 호출해야 하며, 패키지를 단순히 import하는 것만으로 애플리케이션을 시작해서는 안 된다. 실행 진입점은 설치된 패키지와 선언된 런타임 환경에서 동일한 애플리케이션 시작 흐름으로 연결되어야 한다.
**영향 범위**
인터페이스: python -m chat_tui 실행 계약에 영향을 준다. 영속성: 영향 없음. 후속 사용 주체: 개발자와 운영자가 사용하는 Python 모듈 실행 환경. 마이그레이션: 필요 없음. 호환성: 기존 모듈 실행 방식과 공개 실행 함수 연결을 유지한다. 배포 전제 조건: 패키지가 Python 모듈 검색 경로에 설치되어 있어야 한다.
### REQ-001.03 — 콘솔 스크립트 실행 진입점을 제공한다
패키징 설정은 chat-tui 콘솔 명령을 chat_tui.app:main에 연결해야 한다. 설치 후 사용자는 별도의 경로 지정이나 내부 모듈 호출 없이 해당 명령으로 TUI를 시작할 수 있어야 하며, 콘솔 명령과 모듈 실행 명령은 동일한 애플리케이션 시작 동작을 호출해야 한다.
**영향 범위**
인터페이스: 설치 후 제공되는 chat-tui 콘솔 명령에 영향을 준다. 영속성: 영향 없음. 후속 사용 주체: 최종 사용자와 운영 스크립트. 마이그레이션: 필요 없음. 호환성: 프로젝트에서 정의한 콘솔 명령 이름과 실행 함수 연결을 유지한다. 배포 전제 조건: 패키지 설치 시 console script가 생성되어야 한다.
### REQ-001.04 — 기존 승인 상태와 승인 근거를 보존한다
프로젝트 스캐affold 요구사항 문서는 기존 요구사항의 정체성과 승인 이력을 유지해야 한다. 기존 승인 상태는 approved로 보존하고, 승인 주체는 spec-agent로 명시하며, 승인 근거는 승인 댓글 923 및 디스커버리 승인 결과로 구조화하여 기록해야 한다. 문서 분리와 범위 정리만으로 승인 상태를 초안으로 되돌리거나 승인 근거를 삭제하거나 일반적인 서술로 대체해서는 안 된다. 실행되지 않은 검증은 특정 커밋의 실행 증거로 제시하지 않고 미기록 상태로 명확히 표시해야 한다.
**영향 범위**
인터페이스: 요구사항 문서의 승인 기록과 검증 추적성에 영향을 준다. 영속성: 문서 이력과 승인 메타데이터를 보존한다. 후속 사용 주체: 요구사항 검토자, 구현자와 승인 담당자. 마이그레이션: 기존 승인 기록을 삭제하지 않고 보존해야 한다. 호환성: 승인된 프로젝트 스캐폴드의 의미와 이력을 유지한다. 배포 전제 조건: 검증 증거가 실제 실행 상태와 일치해야 한다.
## 6. 제약과 불변조건
- 프로젝트는 Python 3.11 이상에서 실행되어야 한다.
- 패키지 구성은 `src` 기반 레이아웃을 유지하고 애플리케이션 패키지와 테스트 패키지의 책임을 분리해야 한다.
- 런타임 의존성은 호환되는 Textual 범위에서 관리하고 테스트 의존성은 선택적 설치 항목으로 제공해야 한다.
- 패키징 메타데이터, 공개 버전, 설명 및 지원 Python 버전은 서로 일관되어야 한다.
- 콘솔 실행 진입점과 모듈 실행 진입점은 동일한 애플리케이션 시작 함수를 호출해야 한다.
- 이 문서는 프로젝트 구조, 패키징 및 실행 진입점만 정본으로 관리하며 대화 상호작용의 상세 규칙과 인수 기준은 별도 요구사항 문서에서 관리한다.
- 외부 API, LLM, 데이터베이스, 영속 저장소 또는 추가 배포 환경을 도입하지 않는다.
- 기존 프로젝트 구조와 실행 계약을 사용하는 호출자는 별도 변환 없이 계속 사용할 수 있어야 한다.
- 패키지 구성은 `src` 기반 레이아웃을 유지하고 `src/chat_tui`를 배포 대상으로 포함해야 한다.
- 빌드 백엔드는 setuptools를 사용하며, 런타임 의존성은 Textual 0.47 이상 1.0 미만 범위로 관리해야 한다.
- 테스트 의존성은 제품 런타임 의존성과 분리된 선택 항목으로 제공하며 pytest 8.0 이상을 지정해야 한다.
- 프로젝트 메타데이터의 이름, 버전, 설명, README 참조, Python 최소 버전, 의존성 및 패키지 검색 설정은 서로 일치해야 한다.
- 패키지 공개 버전과 패키징 메타데이터의 버전은 `0.1.0`으로 일치해야 한다.
- `chat-tui` 콘솔 진입점과 `python -m chat_tui` 모듈 진입점은 동일한 공개 애플리케이션 시작 함수를 호출해야 한다.
- 패키지를 import하는 것만으로 애플리케이션이 시작되어서는 안 된다.
- 이 문서는 프로젝트 구조, 패키징 및 실행 진입점만 정본으로 관리한다. 입력 정규화, 메시지 누적, 고정 응답 선택과 표시, 빈 입력 처리, 입력창 초기화 및 종료 동작은 대화 상호작용 요구사항에서만 정본으로 관리한다.
- 대화 상호작용 요구사항은 이 문서가 제공하는 설치 및 실행 기반에 의존하지만, 이 문서의 스캐폴드 계약을 변경하지 않는다.
- 외부 API, LLM, 네트워크 서비스, 데이터베이스, 영속 저장소, 새 의존성, 배포 방식 또는 실행 환경을 추가하지 않는다.
## 7. 인수 기준
- Python 3.11 이상 환경에서 프로젝트를 설치하면 `src` 아래의 패키지와 선언된 런타임 의존성이 정상적으로 구성되어야 한다.
- 패키징 설정에 프로젝트 이름, 버전, 설명, README 참조, Python 최소 버전, Textual 의존성 및 소스 디렉터리 검색 설정이 포함되어야 한다.
- 테스트 선택 의존성을 별도로 설치할 수 있고 저장소의 테스트를 검색하여 실행할 수 있어야 한다.
- 설치된 `chat-tui` 명령은 애플리케이션의 공개 시작 함수를 호출해야 한다.
- `python -m chat_tui` 실행도 동일한 공개 시작 함수를 통해 애플리케이션을 시작해야 한다.
- 패키지에서 조회되는 공개 버전과 패키징 메타데이터의 버전은 일치해야 한다.
- 모듈을 단순히 import하는 것만으로 애플리케이션이 시작되어서는 안 된다.
- 패키징 설정에 명시되지 않은 외부 연동이나 추가 실행 전제 조건이 없어야 한다.
- 대화 입력과 응답 동작의 기존 회귀 검증은 별도 요구사항 문서의 범위에서 계속 확인되어야 하며, 이 문서에서는 해당 기준을 반복하지 않는다.
- 검증은 지원되는 Python 환경에서 패키지 설치, 공개 버전 조회, 모듈 실행 경로, 콘솔 실행 경로 및 테스트 검색 결과를 확인하는 방식으로 수행한다.
- Python 3.11 이상 환경에서 프로젝트를 설치하면 `src` 아래의 `chat_tui` 패키지가 정상적으로 검색되고 설치되어야 한다.
- 패키징 설정에는 프로젝트 이름, 버전 `0.1.0`, 설명, README 참조, Python 3.11 이상 조건, Textual 런타임 의존성 및 `src` 기반 패키지 검색 설정이 포함되어야 한다.
- 테스트 선택 의존성은 런타임 의존성과 별도로 설치할 수 있어야 하며 저장소 테스트를 검색하고 실행할 수 있어야 한다.
- 설치된 `chat-tui` 명령은 `chat_tui.app:main`에 연결되어 애플리케이션 시작 절차로 진입해야 한다.
- `python -m chat_tui` 실행은 콘솔 명령과 동일한 공개 시작 함수를 통해 애플리케이션을 시작해야 한다.
- `chat_tui`에서 조회되는 공개 버전과 패키징 메타데이터의 버전은 `0.1.0`으로 일치해야 한다.
- 패키지를 단순히 import하는 것만으로 TUI가 시작되어서는 안 된다.
- 설치 또는 실행에 필요한 메타데이터와 진입점이 누락되면 정상 동작으로 판정하지 않아야 한다.
- 프로젝트 스캐폴드 변경 후에도 대화 상호작용 요구사항에서 정본으로 관리하는 입력, 응답, 빈 입력, 입력창 초기화 및 종료 동작의 기존 회귀 검증이 유지되어야 한다.
- 검증은 패키지 설치, 메타데이터 조회, 모듈 실행 경로, 콘솔 실행 경로 및 테스트 검색 결과를 확인하는 방식으로 수행하며 실행하지 않은 검증은 통과로 판정하지 않는다.
### REQ-001.01-AC01 — 패키징 메타데이터가 프로젝트 계약과 일치한다
**판정 기준**
프로젝트 이름, 버전, 설명, README 참조, Python 3.11 이상 조건, Textual 런타임 의존성, pytest 선택 의존성 및 `src` 기반 패키지 검색 설정이 모두 선언되어 있으면 통과로 판정한다.
프로젝트 이름, 버전, 설명, README 참조, Python 3.11 이상 조건, Textual 런타임 의존성, pytest 선택 의존성 및 src 기반 패키지 검색 설정이 모두 선언되어 있으면 통과로 판정한다.
**검증**
`pyproject.toml`을 확인하고 Python 3.11 이상 환경에서 테스트 선택 사항을 포함한 설치를 수행하여 패키지와 선언된 의존성이 정상적으로 구성되는지 검증한다.
pyproject.toml을 확인하고 Python 3.11 이상 환경에서 테스트 선택 사항을 포함한 설치를 수행하여 패키지와 선언된 의존성이 정상적으로 구성되는지 검증한다.
**검증 분류**
@@ -160,11 +160,11 @@ Python 3.11 이상을 대상으로 하는 chat_tui 패키지의 프로젝트 구
**판정 기준**
`chat_tui` 패키지를 import했을 때 비어 있지 않은 버전 값이 제공되고 패키징 메타데이터의 `0.1.0`과 일치하면 통과로 판정한다.
chat_tui 패키지를 import했을 때 비어 있지 않은 버전 값이 제공되고 패키징 메타데이터의 0.1.0과 일치하면 통과로 판정한다.
**검증**
Python에서 `chat_tui.__version__`을 조회하고 프로젝트 메타데이터의 버전 선언과 비교한다.
Python에서 chat_tui.__version__을 조회하고 프로젝트 메타데이터의 버전 선언과 비교한다.
**검증 분류**
@@ -178,11 +178,11 @@ Python에서 `chat_tui.__version__`을 조회하고 프로젝트 메타데이터
**판정 기준**
설치된 패키지 환경에서 `python -m chat_tui`를 실행했을 때 공개 실행 함수를 통해 TUI가 시작되면 통과로 판정한다.
설치된 패키지 환경에서 python -m chat_tui를 실행했을 때 공개 실행 함수를 통해 TUI가 시작되면 통과로 판정한다.
**검증**
모듈 진입점이 애플리케이션의 공개 실행 함수를 직접 실행 조건에서 호출하는지 확인하고, 격리된 실행 환경에서 모듈 명령을 시작하여 초기 화면이 생성되는지 검증한다.
모듈 진입점이 애플리케이션의 공개 실행 함수를 실행 조건에서 호출하는지 확인하고, 격리된 실행 환경에서 모듈 명령을 시작하여 초기 화면이 생성되는지 검증한다.
**검증 분류**
@@ -196,11 +196,11 @@ Python에서 `chat_tui.__version__`을 조회하고 프로젝트 메타데이터
**판정 기준**
설치가 완료된 환경에서 `chat-tui` 명령이 실행 경로에 생성되고 애플리케이션을 시작하면 통과로 판정한다.
설치가 완료된 환경에서 chat-tui 명령이 실행 경로에 생성되고 애플리케이션을 시작하면 통과로 판정한다.
**검증**
패키지를 설치한 뒤 `chat-tui` 명령의 생성 여부와 연결된 실행 대상을 확인하고 명령을 실행하여 Textual 애플리케이션의 초기 상태가 표시되는지 검증한다.
패키지를 설치한 뒤 chat-tui 명령의 생성 여부와 연결된 실행 대상을 확인하고 명령을 실행하여 Textual 애플리케이션의 초기 상태가 표시되는지 검증한다.
**검증 분류**
@@ -210,43 +210,83 @@ Python에서 `chat_tui.__version__`을 조회하고 프로젝트 메타데이터
성공 시 콘솔 명령은 지정된 공개 실행 함수를 호출해야 한다. 명령 생성 과정에서 대화 상태나 사용자 입력이 변경되어서는 안 된다. 설치가 완료되지 않은 환경에서는 명령이 존재한다고 판정하지 않는다.
### REQ-001.04-AC01 — 기존 승인 기록을 구조적으로 보존한다
**판정 기준**
승인 상태가 approved이고 승인 주체가 spec-agent이며 승인 근거가 승인 댓글 923 및 디스커버리 승인 결과로 명시되어 있으면 통과로 판정한다.
**검증**
요구사항 문서의 승인 기록을 검토하여 상태, 주체 및 근거가 기존 기록과 동일하게 보존되었는지 확인한다.
**검증 분류**
수준: integration; 백엔드: 요구사항 문서와 승인 이력; 케이스: unchanged-state
**상태 불변조건**
기존 승인 상태를 draft로 변경하거나 승인 주체와 근거를 삭제해서는 안 된다. 승인 기록은 프로젝트 스캐폴드 범위 변경과 독립적으로 보존되어야 한다.
### REQ-001.04-AC02 — 실행되지 않은 검증을 실행 증거로 가장하지 않는다
**판정 기준**
검증을 실제로 실행하지 않은 경우 특정 커밋, 실행 시각 또는 성공 결과를 실행 증거로 기록하지 않고 미기록 또는 미실행 상태로 명확히 표시하면 통과로 판정한다.
**검증**
요구사항 문서의 테스트 추적성 계약을 검토하여 실행되지 않은 검증에 임의의 커밋 해시나 성공 결과가 연결되지 않았는지 확인한다.
**검증 분류**
수준: integration; 백엔드: 요구사항 추적성 기록; 케이스: unchanged-state
**상태 불변조건**
실행 증거는 실제 검증 결과와 일치해야 한다. 검증하지 않은 항목을 PASS로 기록하거나 현재 변경과 무관한 커밋을 실행 증거로 제시해서는 안 된다.
## 8. 오류 및 충돌 계약
- 패키지 설치에 필요한 메타데이터가 누락되거나 유효하지 않으면 설치를 성공으로 판정하지 않아야 하며 원인을 확인할 수 있는 오류를 반환해야 한다.
- 지원하지 않는 Python 버전에서는 설치 또는 실행을 정상 동작으로 간주하지 않는다.
- 콘솔 진입점이나 모듈 진입점이 애플리케이션 시작 함수를 찾지 못하면 실행은 실패해야 하며 부분적으로 초기화된 애플리케이션을 성공 상태로 남기지 않아야 한다.
- 의존성 버전 제약을 만족하지 못하는 환경에서는 호환되지 않는 런타임으로 자동 대체하거나 외부 서비스를 호출하지 않는다.
- 테스트 의존성 설치 실패는 제품 런타임 의존성의 정상 설치 실패와 구별되어야 한다.
- 설치 또는 실행 실패 시 생성된 부분 산출물이나 임시 상태를 정본 실행 상태로 취급하지 않는다.
- 패키징 변경으로 별도 대화 요구사항에서 보장하는 동작이나 종료 동작이 달라지면 스캐폴드 인수에 실패한 것으로 판정한다.
- 이 문서와 별도 대화 요구사항 사이에 계약 충돌이 발생하면 프로젝트 실행 기반은 이 문서가, 대화 상호작용은 별도 문서가 정본이며 어느 한쪽의 범위를 임의로 확장하지 않는다.
- 필수 패키징 메타데이터가 누락되거나 유효하지 않으면 설치를 성공으로 판정하지 않아야 하며 원인을 확인할 수 있는 오류를 반환해야 한다.
- 지원하지 않는 Python 버전이나 호환되지 않는 의존성 환경에서는 설치 또는 실행을 정상 동작으로 간주하지 않는다.
- 콘솔 진입점이나 모듈 진입점이 공개 시작 함수를 찾지 못하면 실행은 실패해야 하며 부분적으로 초기화된 애플리케이션을 성공 상태로 남기지 않아야 한다.
- 패키징 설정에 선언되지 않은 외부 연동이나 실행 전제를 자동으로 추가하지 않는다.
- 테스트 의존성 설치 실패는 제품 런타임 의존성의 설치 실패와 구별되어야 한다.
- 설치 또는 실행 실패로 생성된 부분 산출물이나 임시 상태를 정본 실행 상태로 취급하지 않는다.
- 패키징 또는 실행 진입점 변경으로 대화 상호작용 요구사항의 정본 동작이 달라지면 프로젝트 스캐폴드 인수를 충족한 것으로 판정하지 않는다.
- 프로젝트 스캐폴드와 대화 상호작용 사이에 충돌이 발생하면 프로젝트 구조, 패키징 및 실행 기반은 이 문서가 정본이며, 입력·응답·표시·입력창·종료 동작은 대화 상호작용 요구사항이 정본이다.
- 어느 문서도 다른 문서의 범위를 임의로 확장하거나 동일한 기능 규칙과 인수 기준을 중복 정의하지 않는다.
## 9. 데이터 및 인터페이스 계약
- 프로젝트 패키지의 정본 위치는 `src/chat_tui`이며 패키지 검색 기준은 `src`이다.
- 프로젝트 메타데이터는 프로젝트 이름, 버전, 설명, README 위치, 지원 Python 버전 및 런타임 의존성을 제공해야 한다.
- 프로젝트 메타데이터는 프로젝트 이름, 버전, 설명, README 위치, 지원 Python 버전 및 Textual 런타임 의존성을 제공해야 한다.
- 테스트 의존성은 별도 선택적 의존성 그룹으로 선언되어야 한다.
- 콘솔 인터페이스는 `chat-tui` 명령에서 애플리케이션의 `main` 실행 함수를 호출해야 한다.
- 콘솔 인터페이스는 `chat-tui` 명령에서 `chat_tui.app:main`을 호출해야 한다.
- 모듈 인터페이스는 `python -m chat_tui` 실행 시 패키지의 모듈 진입점에서 동일한 `main` 함수를 호출해야 한다.
- 패키지 공개 버전은 프로젝트 메타데이터의 버전과 일치해야 한다.
- 실행 진입점은 외부 입력을 별도 프로토콜이나 네트워크 인터페이스로 변환하지 않고 로컬 Textual 애플리케이션을 시작한다.
- 패키지 공개 버전은 프로젝트 메타데이터의 `0.1.0`과 일치해야 한다.
- 실행 진입점은 외부 프로토콜이나 네트워크 인터페이스로 변환하지 않고 로컬 Textual 애플리케이션을 시작해야 한다.
- 테스트 인터페이스는 표준 unittest 검색 방식으로 저장소 테스트를 실행할 수 있어야 하며 별도의 서비스나 데이터 저장소를 요구하지 않는다.
- 대화 메시지와 사용자 입력의 데이터 및 화면 인터페이스 계약은 별도 대화 요구사항 문서에서 정의하며 이 문서에서는 재정의하지 않는다.
- 대화 메시지, 사용자 입력, 고정 응답 목록, 역할별 표시, 입력창 상태 및 종료 키의 상세 데이터와 인터페이스 계약은 대화 상호작용 요구사항에서 정의하며 이 문서에서는 재정의하지 않는다.
## 10. 하위 호환성
- 기존의 `chat-tui` 콘솔 실행 방식은 유지되어야 한다.
- 기존의 `python -m chat_tui` 모듈 실행 방식은 유지되어야 한다.
- Python 3.11 이상 지원 조건과 현재 패키지 이름 및 공개 버전 계약은 유지되어야 한다.
- `src` 기반 패키지 검색과 애플리케이션 패키지의 공개 버전 노출 방식은 유지되어야 한다.
- Python 3.11 이상 지원 조건, 프로젝트 이름, 패키지 이름 `chat_tui` 및 공개 버전 `0.1.0` 계약은 유지되어야 한다.
- `src` 기반 패키지 검색과 패키지 공개 버전 노출 방식은 유지되어야 한다.
- 기존 README에 설명된 설치 및 실행 명령은 스캐폴드 정리 이후에도 유효해야 한다.
- 대화 입력, 응답 표시, 빈 입력 처리, 입력창 초기화 및 종료와 같은 상호작용 동작은 별도 대화 요구사항 문서의 정본으로 유지하며 이 문서에서 상세히 반복하지 않는다.
- 새 외부 의존성, 외부 연동, 배포 방식 또는 실행 환경을 추가하지 않는다.
- 스캐폴드 문서의 변경은 프로젝트 구조, 패키징 및 실행 진입점의 범위를 넘어 대화 동작의 의미를 변경해서는 안 된다.
- 대화 입력 정규화, 메시지 누적, 고정 응답 선택과 표시, 빈 입력 처리, 입력창 초기화 및 종료 동작은 대화 상호작용 요구사항의 정본으로 유지하며 이 문서에서 상세히 반복하지 않는다.
- 새 외부 의존성, 외부 연동, 영속성, 배포 방식 또는 실행 환경을 추가하지 않는다.
- 스캐폴드 문서의 변경은 프로젝트 구조, 패키징 및 실행 진입점의 범위를 넘어 대화 상호작용의 의미를 변경해서는 안 된다.
- 대화 상호작용 요구사항은 이 문서의 설치 및 실행 계약을 선행 조건으로 사용하되, 해당 계약을 별도로 복제하거나 변경해서는 안 된다.
## 11. 검증 계획
Python 3.11 이상 환경에서 패키지 설치와 메타데이터 정합성을 검증한다. 소스 디렉터리 기반 패키지 검색, 런타임 의존성, 선택적 테스트 의존성, 공개 버전이 선언된 계약과 일치하는지 확인한다. 모듈 실행과 콘솔 실행이 동일한 애플리케이션 시작 함수를 호출하는지 확인하고, 기존 저장소 테스트를 실행하여 대화 입력, 응답 표시, 빈 입력 무시, 입력창 초기화 및 종료 동작이 변경되지 않았는지 회귀 검증한다. 테스트 실행 결과와 설치 검증 결과는 실행한 커밋, 환경, 실행 시각 및 성공 여부를 별도 증거로 기록하며, 실행하지 않은 검증을 통과로 간주하지 않는다.
Python 3.11 이상 환경에서 패키지 설치와 메타데이터 정합성을 검증한다. 소스 디렉터리 기반 패키지 검색, 런타임 의존성, 선택적 테스트 의존성 및 공개 버전이 선언된 계약과 일치하는지 확인한다. 모듈 실행과 콘솔 실행이 동일한 애플리케이션 시작 함수를 호출하는지 확인하고, 기존 저장소 테스트를 실행하여 대화 동작이 변경되지 않았는지 회귀 검증한다. 실행하지 않은 검증은 통과로 간주하지 않는다.
검증 정의는 저장소의 패키징 설정 검토와 표준 unittest 검색을 대상으로 한다. 패키징 메타데이터, 공개 버전 조회, 모듈 실행 경로, 콘솔 실행 경로 및 테스트 검색 결과를 함께 확인한다. 현재 문서 작성 시점에는 검증을 실행하지 않았으므로 특정 커밋에 결합된 실행 증거와 성공 결과를 기록하지 않는다.
### 테스트 추적성 계약
@@ -259,8 +299,10 @@ Verifies:
- REQ-001.01-AC02
- REQ-001.02-AC01
- REQ-001.03-AC01
- REQ-001.04-AC01
- REQ-001.04-AC02
Test reference: pyproject.toml 설정 검토 및 python -m unittest discover -s tests -v
Automated: 기존 패키징 및 실행 진입점 검증 테스트를 사용한다.
Automated: 기존 패키징 및 실행 진입점 검증 테스트와 대화 동작 회귀 테스트를 사용한다.
```
실행 증거:
@@ -268,19 +310,23 @@ Automated: 기존 패키징 및 실행 진입점 검증 테스트를 사용한
```text
Test ID: TC-001-001
Requirement revision: REQ-001@0.1
Commit: d0ac7fc7bcfaf402bbda24776f051fa9992993e1
Environment: Python 3.11 이상, setuptools 기반 설치 환경
Commit: 검증 커밋 미기록
Environment: Python 3.11 이상 및 setuptools 기반 설치 환경
Result: 미실행
Executed at: 문서 작성 시점에는 실행 증거를 기록하지 않음
Executed at: 검증 실행 시각 미기록
```
## 12. 추적성
근거는 Gitea 이슈 #8의 요구사항 재작업 요청과 저장소의 프로젝트 메타데이터, 패키지 구조, 실행 진입점 선언 및 기존 테스트다. 이 문서는 프로젝트 스캐폴드, 패키징, 모듈 실행과 콘솔 실행 진입점만 추적한다. 입력 정규화, 메시지 누적, 고정 응답 선택과 표시, 빈 입력 무시, 입력창 초기화 및 종료 동작의 상세 규칙과 수용 기준은 분리된 대화 상호작용 문서에서만 추적한다. 두 문서는 실행 기반과 대화 동작의 선행 관계만 공유하며 동일한 기능 규칙이나 수용 기준을 반복하지 않는다. 기존 승인 이력은 승인 기록에 보존한다.
근거는 원본 Gitea 이슈의 요구사항 재작업 요청과 저장소의 프로젝트 메타데이터, 패키지 구조, 실행 진입점 선언 및 기존 테스트다. 이 문서는 프로젝트 스캐폴드, 패키징, 모듈 실행과 콘솔 실행 진입점만 추적한다. 입력 정규화, 메시지 누적, 고정 응답 선택과 표시, 빈 입력 무시, 입력창 초기화 및 종료 동작의 상세 규칙과 수용 기준은 분리된 대화 상호작용 문서에서만 추적한다.
두 문서는 실행 기반과 대화 동작의 선행 관계만 공유하며 동일한 기능 규칙이나 수용 기준을 반복하지 않는다. 프로젝트 스캐폴드의 승인 이력은 승인 기록에 보존하고, 대화 상호작용의 근거와 검증 연결은 분리된 문서에서 관리한다.
## 13. 확정된 결정
기존 프로젝트 스캐폴드의 의미와 승인 이력을 보존하고, 혼재되어 있던 대화 상호작용 요구사항과 수용 기준은 별도 문서로 분리한다. 이 문서의 정본 범위는 패키지 구조, 패키징 메타데이터와 두 실행 진입점으로 한정한다. 애플리케이션 코드, 테스트 동작, 고정 응답 문구, 입력 처리 순서, 사용자 인터페이스 동작, 외부 연동, 의존성, 배포 환경은 변경하지 않는다.
기존 프로젝트 스캐폴드의 의미와 승인 이력을 보존하고, 혼재되어 있던 대화 상호작용 요구사항과 수용 기준은 별도 문서로 분리한다. 이 문서의 정본 범위는 패키지 구조, 패키징 메타데이터와 두 실행 진입점으로 한정한다.
애플리케이션 코드, 테스트 동작, 고정 응답 문구, 입력 처리 순서, 사용자 인터페이스 동작, 외부 연동, 의존성, 배포 환경은 변경하지 않는다. 대화 동작의 상세 규칙과 수용 기준은 분리된 문서에서 단일 정본으로 관리한다.
## 14. 미결 사항
@@ -288,4 +334,8 @@ Executed at: 문서 작성 시점에는 실행 증거를 기록하지 않음
## 15. 승인 기록
상태는 승인이다. 기존 승인 주체인 spec-agent와 기존 승인 근거를 보존하며, 이번 문서 정리는 승인 상태를 초안으로 되돌리지 않는다. 승인된 프로젝트 스캐폴드 범위와 기존 승인 이력은 유지하고, 대화 상호작용을 별도 요구사항 문서로 분리한 변경만 추적한다.
상태: approved
승인 주체: spec-agent
승인 근거: 승인 댓글 923 및 디스커버리 승인 결과
기존 프로젝트 스캐폴드의 승인 상태와 승인 근거는 유지한다. 이번 문서 정리는 승인 상태를 초안으로 되돌리지 않으며, 승인된 프로젝트 스캐폴드 범위와 기존 승인 이력을 보존한 채 대화 상호작용을 별도 요구사항 문서로 분리한 변경만 추적한다.