# Step 0: CMake Project Scaffold ## 읽어야 할 파일 먼저 아래 파일을 모두 읽고 저장소 계약을 파악하라. - `/AGENTS.md` - `/docs/PRD.md` - `/docs/ARCHITECTURE.md` - `/docs/ADR.md` - `/docs/HARNESS.md` - `/docs/superpowers/plans/2026-07-29-fesa-phase-1.md` - `/.harness/config.example.json` ## 작업 C++20/MSVC x64 프로젝트의 최소 실행 가능한 build/test 뼈대를 만든다. - `CMakeLists.txt`, `CMakePresets.json`, `cmake/FesaDependencies.cmake`, `.harness/config.json`, `tests/CMakeLists.txt`를 만든다. - 실제 target은 `fesa_core` 정적 라이브러리와 `fesa` CLI 두 개만 만든다. - `include/fesa/core/version.hpp`, `src/fesa/core/version.cpp`, `src/fesa/cli/main.cpp`에 다음 계약을 구현한다. ```cpp namespace fesa { [[nodiscard]] std::string_view version() noexcept; } ``` - CLI는 이 step에서 `fesa --version`만 처리한다. - 먼저 `VersionCommand` CTest를 등록해 실패를 확인한 뒤 최소 구현한다. - `windows-debug`, `windows-release` configure/build/test preset을 정의한다. - build 산출물은 `out/build/` 아래에만 둔다. - MSVC가 아니거나 x64가 아니면 configure 단계에서 명확히 실패시킨다. ## Acceptance Criteria ```powershell uv run --with pytest python -m pytest -v -rs cmake --preset windows-debug cmake --build --preset windows-debug ctest --preset windows-debug -R VersionCommand --output-on-failure ctest --preset windows-debug --output-on-failure ``` `fesa --version`은 비어 있지 않은 FESA 버전을 출력하고 종료 코드 0을 반환해야 한다. CTest는 0개가 아니어야 한다. ## 검증 절차 1. 테스트가 구현 전 실패하는 것을 확인한다. 2. Acceptance Criteria 명령을 새로 실행한다. 3. MSVC/C++20/x64와 산출물 경로를 확인한다. 4. 성공 시 index의 step을 `completed`로 바꾸고 생성 파일을 summary에 기록한다. 5. 도구가 없으면 자동 설치하지 말고 `blocked`와 정확한 누락 항목을 기록한다. ## 금지사항 - 외부 패키지를 다운로드하지 마라. 이유: 사전 설치 의존성 정책을 위반한다. - MKL, TBB, HDF5 기능을 구현하지 마라. 이유: 다음 step의 독립 범위다. - 빈 미래 모듈을 만들지 마라. 이유: Phase 1 최소 실체화 원칙을 위반한다.