Conversation
Phase 1 완료 — xcodegen 기반 프로젝트 부트스트랩. - project.yml: macOS 26 / Swift 6 / GRDB 7.5.0 SPM, unsigned 배포를 위한 서명 비활성화 - Storefront/App: StorefrontApp(@main), AppState(@observable), RootView, Commands(⌘O/⌘R) - Storefront/Features/Welcome: Sky→Orange 그라디언트 로고 + 파일 열기 CTA - Assets.xcassets: AppPrimary(#5AA7E6), AppAccent(#FF9F5A), AppBackground 라이트/다크 세트 - StorefrontTests/SmokeTests: AppState 초기값 검증 - LICENSE(MIT), README 확장(Features/Install/Gatekeeper 우회/Build), Docs/PLAN.md & PROGRESS.md - .gitignore: *.xcodeproj(xcodegen 재생성), build/, .omc/, .DS_Store xcodebuild Debug 빌드 검증: BUILD SUCCEEDED
- project.yml: swift-composable-architecture 1.15.0 SPM 의존성 추가 - Storefront/Features/App: AppFeature(@Reducer, @ObservableState, BindableAction) + AppView(@bindable StoreOf<AppFeature>, .fileImporter) - Storefront/Features/Welcome: WelcomeView를 StoreOf<AppFeature> 기반으로 재작성 - Storefront/App/StorefrontApp: @main Scene에서 Store 초기화, Commands가 store.send 호출 - Storefront/App/AppState.swift, RootView.swift 제거 (TCA Feature로 대체) - StorefrontTests/SmokeTests: TestStore 기반 3개 테스트 (초기 상태 / open / fileImported) - Docs/PLAN.md, Docs/PROGRESS.md: TCA 구조 반영, Dependencies/ 폴더 및 @DependencyClient 계획 추가 - README: Architecture 섹션 추가, 첫 실행 시 매크로 Trust 안내 검증: xcodebuild -skipMacroValidation build → BUILD SUCCEEDED, TestStore 3개 통과
- Storefront/Core/Database/SchemaInspector: sqlite_master 조회, Tables/Views 구분, 행수 계산 (테이블명 quote-escape) - Storefront/Dependencies/DatabaseClient: actor 기반 DatabaseQueue 레지스트리, readonly GRDB 연결, @dependency(\.database) 등록 - Storefront/Features/Browser/BrowserFeature: @Reducer(State: databaseURL/tables/selectedTableID/isLoading/error, Action: onAppear/refreshRequested/tablesLoaded/failed/tableSelected) - Storefront/Features/Browser/BrowserView: NavigationSplitView 2-column, Sidebar에 Tables/Views 섹션 + 행수 배지, Detail에 Phase 3 플레이스홀더 - Storefront/Features/App/AppFeature: browser 자식 피처 추가, ifLet(\.browser) 합성, fileImported → Browser 전환, reloadMenu → refresh 전파 - Storefront/Features/App/AppView: store.scope로 Welcome/Browser 전환, .fileImporter → fileImported(URL) or fileImportFailed(String) - StorefrontTests: AppFeatureTests(3) + BrowserFeatureTests(3) — 총 6건 모두 통과, SmokeTests.swift 제거 검증: xcodebuild test → 6/6 pass. 수동 QA용 샘플 DB: /tmp/storefront-sample.sqlite
- Storefront/Core/Database/RowFetcher: PRAGMA table_info 기반 컬럼 조회, OFFSET/LIMIT 페이지네이션 (pageSize=200), DBValue enum (NULL/Int/Real/Text/BLOB) 매핑
- Storefront/Dependencies/DatabaseClient: page(url, table, offset, limit) 확장
- Storefront/Dependencies/FileWatcherClient: DispatchSource.makeFileSystemObjectSource 기반 AsyncStream<Void>. WAL 대응 (-wal, -shm 동시 감시), rename/delete 시 재부착
- Storefront/Features/Browser/BrowserFeature: currentPage/isLoadingRows/liveReloadToast 상태 추가, .onAppear/.fileChanged/.tableSelected/.refreshRequested Effect 조합, .cancellable(id:) + .merge, .run(AsyncStream) 파일 감시
- Storefront/Features/Browser/BrowserView: detail에 테이블명/rows/columns 헤더 + DynamicRowGrid, 상단 Capsule 토스트 ("변경 감지됨"), .task onAppear/onDisappear 생명주기
- Storefront/Features/Browser/DynamicRowGrid: 2D ScrollView + HStack 헤더/행, Zebra stripe, PK 키 아이콘, 타입 라벨, 숫자 우측정렬
- Storefront/UI/CellView: 타입별 색상 (null=italic gray, int/real=blue monospace 우측정렬, text=tooltip, blob=purple 0xHEX + bytes tooltip)
- StorefrontTests/BrowserFeatureTests: 4건 통과 (테이블+행 자동 로드 / 실패 전파 / 테이블 선택→행 로드 / fileChanged 토스트)
검증: 7/7 tests pass. 샘플 DB에 sqlite3 INSERT → 자동 새로고침 E2E 확인.
- Storefront/Core/Simulator: SimulatorTypes(SimulatorDevice/App/DatabaseFile) + SimulatorScanner(xcrun simctl list devices --json 파싱 + ~/Library/Developer/CoreSimulator/Devices/<UDID>/data/Containers/Data/Application/*/ 글로빙). MCMMetadataIdentifier로 번들ID, WAL/-shm 필터, 수정시간 정렬 - Storefront/Dependencies/SimulatorClient: Task.detached로 scan 실행, @dependency(\.simulator) 등록 - Storefront/Features/SimulatorPicker: SimulatorPickerFeature(@Reducer, 디바이스/앱 expansion 상태 관리), SimulatorPickerView(시트, DisclosureGroup 트리, Booted 표시, ByteCountFormatter, RelativeDateTimeFormatter) - Storefront/Features/App/AppFeature: simulatorPicker 자식 피처 추가, .simulatorButtonTapped → 시트 오픈, picker.databasePicked → fileImported(url) 전파 - Storefront/Features/App/AppView: .sheet로 SimulatorPickerView 표시 - Storefront/Features/Welcome/WelcomeView: "시뮬레이터" 버튼(⌘L) 추가, .dropDestination(for: URL.self) 드래그&드롭 구현 - StorefrontTests/SimulatorPickerFeatureTests: 3건 통과 (onAppear/toggleDevice/JSON 파싱) 검증: 10/10 tests pass. 수동 QA: 시뮬 부팅 → ⌘L → DB 선택 → 오픈 E2E.
- Storefront/Core/SwiftDataStore/SwiftDataDetector: Z_METADATA/Z_PRIMARYKEY/Z_MODELCACHE 2개 이상 존재 시 SwiftData로 판별, TableInfo.Classification(swiftDataEntity/swiftDataSystem/standard) 할당 - Storefront/Core/SwiftDataStore/SwiftDataDecoder: Z 접두어 테이블명 정규화 (ZTASK → Task), 컬럼명 정규화 (ZNAME → name, ZCREATEDAT → createdat), Z_PK/Z_ENT 등 시스템 컬럼은 유지 - Storefront/Core/Database/SchemaInspector: inspect(db) → DatabaseSchema(kind, tables) 통합, classify 호출로 분류 부여 - Storefront/Core/Database/RowFetcher: ColumnInfo.isSwiftDataEntity / displayName 추가 - Storefront/Dependencies/DatabaseClient: tables→inspect로 API 변경, page(url, table, offset, limit, isEntity) 시그니처 확장 - Storefront/Features/Browser/BrowserFeature: State에 databaseKind 추가, .schemaLoaded/.schemaFailedToLoad 액션, swiftDataSystem은 자동 선택 피함 - Storefront/Features/Browser/BrowserView: 사이드바 Entities/Tables/Views/System 섹션 분리, SwiftData 배지, 원본 테이블명 monospace 병기, TableRow 아이콘 분기 (leaf/gear/tablecells/eye) - Storefront/Features/Browser/DynamicRowGrid: GeometryReader로 가용 폭 측정 → 컬럼수 × 140pt ≤ 가용폭이면 flex 분배, 초과 시 horizontal scroll. LazyVStack + pinnedViews로 스크롤 시 헤더 고정. 컬럼 divider. 전체 폭 상단 정렬 - StorefrontTests/SwiftDataDecoderTests: 3건 통과 (테이블명/컬럼명 정규화, classify) - StorefrontTests/BrowserFeatureTests: 새 API 시그니처 반영 (inspect, page 6-arity) 검증: 13/13 tests pass. 실 SQLite + SwiftData 혼합 수동 QA.
Phase 6 — DMG 빌드 파이프라인
- scripts/ExportOptions.plist: method=mac-application, signingStyle=manual (서명 없음)
- scripts/build.sh: xcodebuild archive + exportArchive + ad-hoc codesign("-"). -skipMacroValidation/-skipPackagePluginValidation 포함
- scripts/make-dmg.sh: create-dmg(Applications 드롭존, 레이아웃 180/460) 우선, hdiutil UDZO fallback. PlistBuddy로 버전 추출
- scripts/make-icon.sh: Python Pillow로 Sky→Orange 그라디언트 + 라운드 마스크 + "S" 로고 1024px → sips로 AppIcon.appiconset 전 해상도 산출
- Makefile: help/setup/generate/build/test/archive/dmg/icon/clean 타겟
- 로컬 `make dmg` 검증 → build/Storefront-0.1.0.dmg 4.8MB 생성 완료
그리드 UX 개선
- DynamicRowGrid: ScrollView 내부 LazyVStack을 .topLeading 정렬 + maxHeight:.infinity alignment:.top으로 최상단 고정 (이전엔 짧은 데이터면 세로 가운데로 밀림)
- 행 셀을 HStack(CellView + Spacer)로 감싸 전체 좌측 정렬 — 숫자도 더 이상 오른쪽 정렬 아님
- CellView: INTEGER/REAL의 .frame(maxWidth: .infinity, alignment: .trailing) 제거. 색상/monospace는 유지
Phase 7 — GitHub Actions 워크플로우 - .github/workflows/build.yml: PR/push(paths-ignore: Docs/README/LICENSE)에서 macos-latest runner + xcodegen + make test/build. concurrency 취소, 25분 타임아웃 - .github/workflows/release.yml: on tags ['v*'] + workflow_dispatch. make test 게이트 → make dmg → softprops/action-gh-release@v2로 DMG + SHA256SUMS.txt 업로드. body에 Gatekeeper 우회 안내 포함, prerelease flag는 태그에 '-' 있으면 자동 - .github/ISSUE_TEMPLATE/bug_report.yml: macOS 버전 / Storefront 버전 / DB 종류 / 로그 필드 구성 그리드 최상단 고정 (이전 `.frame(maxHeight: .infinity)` 불충분) - ScrollView 컨텐츠의 LazyVStack에 `minHeight: geo.size.height` 추가 → 데이터 적을 때도 프레임이 뷰포트 전체 높이를 먹어서 .topLeading 정렬이 최상단을 보장. 이전엔 프레임이 intrinsic 높이였어서 ScrollView가 콘텐츠를 수직 센터로 배치했음.
- A. DMG (end users) — drag to Applications + 3 Gatekeeper bypass methods - B. Xcode clone + ⌘R (developers, fastest) - C. CLI via make build / make dmg - Makefile 명령 표, Architecture 한 섹션 요약 - 왜 Gatekeeper 경고 뜨는지 설명 (Apple Developer Program 비가입 오픈소스)
b5e5608 to
017ec66
Compare
macos-latest는 2026-04 기준 아직 macOS 15.7.4 러너를 가리키고 있어 앱의 macOS 26 deployment target과 불일치한다. xcodebuild test가 'My Mac'에서 SDK 버전 mismatch로 실패하므로 두 workflow 모두 macos-26으로 고정. before: xcodebuild: error: Cannot test target 'StorefrontTests' on 'My Mac': My Mac's macOS 15.7.4 doesn't match StorefrontTests's macOS 26.0 deployment target.
- DatabaseClient: replace Configuration.readonly with PRAGMA query_only. readonly=true denies writes to the -shm file, which is required for readers of WAL-mode databases; the switch fixes SQLITE_CANTOPEN (14) the moment journal_mode flips to WAL. - FileWatcherClient: watch the parent directory in addition to the existing sibling files so -wal/-shm files created after the DB is opened are picked up, and INSERTs in WAL mode (which only touch the -wal sidecar) surface to the UI as expected.
- make install: build Debug and copy into /Applications/Storefront.app for a one-command local install. - make star: opt-in GitHub star prompt that uses gh CLI when authenticated (silent PUT user/starred/REPO), otherwise falls back to opening the repo in the browser. - dmg and install targets now invoke star at the end.
- Add a Requirements table and a one-time Prerequisites block (Homebrew, Xcode 26+, xcodegen, optional gh). - Rewrite paths A/B/C in English and document the Xcode macro Trust & Enable prompt plus the `defaults write` fallback. - Refresh the Makefile targets table and include make install and make star.
- Docs/assets/hero.svg: Sky Blue → Sunset Orange gradient banner with the title and three capability chips (live reload, SwiftData aware, simulator auto-discovery). - README: top block becomes hero SVG + shields.io badges (release, build, license, macOS 26+, Swift 6, stars). Features rewritten as a two-column emoji grid. Architecture/Roadmap/Contributing/License sections translated and tightened; a centered footer invites stars.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
first release