23 Commits

Author SHA1 Message Date
songyc macbook
a9b7a6c5d2 polish(1.5-p13): 출시 전 최종 점검 — 1.5 추가 문자열 241건 전수 검수·번역 3건 수정·키워드 보강
1.4 기준 커밋 대비 카탈로그 추가 키 241건(IOS 170·위젯 35·워치 20·InfoPlist 2·워치위젯 14)
전수 번역 검수 + whats-new·프로모션·설명·신기능 팝업·도움말·스크린샷 세트 누락 점검:
- 워치·워치위젯 ja 용어 통일: 컴플리케이션 설정 설명 '表示する行動' → '表示するアクション'
  (용어 규칙 행동=アクション 위반 2곳 — 유일한 규칙 위반)
- 신기능 팝업 en 자연화: "tap it to act right away" → "tap it to run the action right away"
- keywords.txt 1.5 보강: ko +건강,수면,걸음(88자)·ja +ヘルスケア,睡眠(95자), 기존 무삭제
  (en은 97/100자로 여유 없어 유지 — ASC 각 로케일 키워드 란에 새로 붙여넣기 필요)
- 그 외 누락 0 확인: whats-new·설명·팝업 6항목·도움말(일기=전 기기, 건강=지원 기기 분기)
  모두 1.5 기능 인벤토리와 일치, 스크린샷 원본 57+합성 63장 완비, 인텐트 메타데이터
  'iPhone' 단어 금지 재확인, InfoPlist 건강 문구 3언어 확인

검증: 전 카탈로그 missing/stale 0, iOS Debug·Store·워치 빌드 그린, en 팝업 실렌더 확인.
빌드 번호 9 유지.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WtZwRRjbtM9pZJDM4FkTq6
2026-08-26 15:05:26 +09:00
songyc macbook
fb1b8e8607 fix(1.5): ASC 검증 ITMS-90626 — 인텐트 메타데이터에서 'iPhone' 제거, 빌드 3
- 앱 인텐트 설명·위젯 설명의 iPhone → '하루 다님 앱' (금칙 규칙 코드 주석 기록)
- 워치 카탈로그 2종 구 키 제거·신 키 en/ja 번역, missing/stale 0
- 화면 뷰 문구(빈 상태 안내 등)의 iPhone은 1.4부터 통과된 스캔 비대상이라 유지
- Debug/Store/워치 빌드 성공, CURRENT_PROJECT_VERSION 3

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WtZwRRjbtM9pZJDM4FkTq6
2026-08-22 08:34:49 +09:00
songyc macbook
9929e6631e feat(1.5-p4): 신기능 소개 팝업 + 도움말 전면 자연화·신규 주제 3개 + l10n 전량 완역
- WhatsNewView(버전당 1회·신규 설치 시드·온보딩 우선·全기기 업데이트 안내·-showWhatsNew)
- HelpView: 전 주제 ko 자연화(오타 '남긴 하지만'·번역투·'완료 보관함'→'완료된 목표' 정정,
  1.1 맥 일기 반영), 신규 주제 3개(행동 컴플리케이션·건강 보기·건강 다짐), 건강 그룹은
  지원 기기에서만 노출
- l10n: 4개 카탈로그 sync·en/ja 신규 208건+본문 재번역·용어 통일(Action/アクション·
  Quest/クエスト·Home/ホーム)·stale 43 청소 → 전 카탈로그 missing/stale 0,
  InfoPlist에 NSHealthShareUsageDescription 3언어
- 검증: Debug/Store/워치 빌드, 자가 검증 61·20·27·10 ALL PASS, ja 도움말 실렌더 확인

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WtZwRRjbtM9pZJDM4FkTq6
2026-08-22 06:28:11 +09:00
songyc macbook
92afa69f6d feat(1.5-p1): 워치 '행동 기록' 컴플리케이션 — 기간 옵트인·미니 행동 화면 딥링크
- WatchActionPeriod(하루/이번 주/이번 달/지난 7일/지난 30일) + WatchActionInfo에
  optional 기간 필드 3종(구버전 캐시 호환 — isFavorite 패턴)
- LocalPrefs.watchActions(uuid→기간 맵, 기기 로컬) + 전체 초기화 청소 목록 반영
- makeSnapshot: 옵트인 행동만 기간값 계산(rollingRange 재사용, StatSpan 무변경)
- 신규 ActionValueComplication(4패밀리·측정 중 노랑+타이머·유령 타이머 안전장치·
  빈 상태 안내·recommendations verbatim·widgetURL 딥링크)
- 워치 미니 행동 화면(WatchActionDetailView) + NavigationPath 딥링크 착지
  (뒤로가기 한 번에 메인 복귀), 행동 편집기 애플워치 섹션(토글+기간)
- 검증 인자: -watchActions <N>·-actionShowEditor·-watchOpenActionDetail
- 검증: Debug/Store/워치(26.2·11.5) 빌드, 자가 검증 49·20·27·10 ALL PASS(26.5+18.5 심),
  시각 QA 5장. 신규 문구 l10n은 계획 §10 R6대로 도움말 단계에서 일괄
- CLAUDE.md: 시뮬레이터 세트 리셋 반영(신규 UUID)·검증 인자 추가

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WtZwRRjbtM9pZJDM4FkTq6
2026-08-22 05:18:42 +09:00
songyc macbook
5b526fa650 feat(compat): iOS 하한 18.0 인하 — 글라스 버블 머티리얼 폴백·사용자 심볼 안전 렌더·Release 인라이너 크래시 우회
- 배포 타깃 26.0→18.0 (앱·위젯. 워치 10.0 불변)
- RadialNavigationView: glassEffect 계열을 @available(iOS 26) 선언 격리 + 18 머티리얼 원 폴백 (배치·연출 동일)
- DiaryZoomContainer.Coordinator → 비제네릭 톱레벨 DiaryZoomCoordinator + AnyView 소거 (하한 18 Release wholemodule에서 swift-frontend SILPerformanceInliner 무한 재귀 크래시 실측·우회)
- Image(safeSymbol:)/SymbolCompat: 카탈로그의 상위 OS 전용 심볼(18 기준 3개)이 교차 기기에서 빈 아이콘이 되지 않게 사용자 심볼 렌더 48곳+워치 7곳 폴백
- -symbolAuditDump 검증 인자 추가, iOS 18.5 시뮬 QA(빌드·radial 폴백·일기 줌·progressSelfTest 49 ALL PASS)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NNxA172hNDRpDsJ2qztKPf
2026-08-11 16:31:40 +09:00
songyc macbook
6aad947fbc chore(project): 루트의 .entitlements 3개를 각 타깃 폴더로 이동
- Haru_Danim.entitlements → IOS/, Haru_DanimWidgets.entitlements → Widgets/,
  Haru_DanimWatchWidgetsExtension.entitlements → Haru_DanimWatchWidgets/
  (워치 앱은 원래 자기 폴더 안 — 그 전례대로 동기화 그룹에 두되 예외 등록 불필요)
- pbxproj: CODE_SIGN_ENTITLEMENTS 경로 갱신 + 루트 그룹의 개별 파일 참조 제거
- 검증: iOS Debug·Store·워치 3스킴 빌드 성공, Entitlements-Simulated에 전체 키
  (App Group·CloudKit·시리·푸시·keychain·iCloud KVS) 정상 반영, 번들 오염 없음, 앱 기동 확인
- CLAUDE.md §2.1 구조에 위치·삭제 금지 명시

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FVeduv1eNdXjk1ay4tSgBg
2026-07-30 21:47:07 +09:00
songyc macbook
ac40e14cfe feat(ux): UX 감사 반영 배치 — 시스템 테마·온보딩·일기 잠금·기간 비교 외
2026-07-23 사용성 감사(A그룹 5건 + 지시 추가분)를 한 번에 반영.

[테마] '시스템 설정 따름' 추가 + 기본값 light→system. "system"은 스킴을
  강제하지 않아(preferredColorScheme nil) 앱·위젯('앱 일치' 옵션,
  WidgetThemeOption.scheme: ColorScheme?)·DEBUG 위젯 미리보기까지
  시스템 라이트/다크를 그대로 따른다
[온보딩] 첫 실행 3장 소개(OnboardingView — 행동→목표·다짐→정리).
  데이터가 하나도 없고 본 적 없을 때만 1회(건너뛰기 포함 재표시 없음,
  onboarding.done), 시드·마케팅 촬영 플로우는 자동 건너뜀.
  설정 → 지원 '앱 소개 다시 보기'로 재열람
[일기 잠금] 설정 → 일기(iPad 전용 표시) 토글 — DiaryLock이
  .deviceOwnerAuthentication으로 Face ID/Touch ID/Optic ID+암호 폴백을
  기기별 분기 없이 처리. 일기 탭 진입 게이트(DiaryLockGateView),
  백그라운드 재잠금, 토글 변경 시 인증 요구, 잠글 수단 없는 기기는
  통과(영구 잠김 방지). NSFaceIDUsageDescription 추가(Info.plist+
  InfoPlist.xcstrings ko/en/ja)
[통계] 이전 기간 비교 카드(맨 위) — 총 시간·횟수를 어제/지난주/지난달과
  비교(▲▼%, 이전 기록 없으면 상태 문구). 이전 기간은 관계 기반
  Aggregator로 직접 집계, 필터 반영. 화면 전용(내보내기 미포함 의도)
[스플래시] 1.2→0.7초 단축 (하루에도 여러 번 여는 앱)
[워치] 행동 실행 탭 시 WKInterfaceDevice.play(.click) 햅틱 — 화면을
  안 보고 탭해도 접수 확인
[컴플리케이션] rectangular 빈 상태에 해결 안내("목표 편집에서
  '애플워치에서 보기'를 켜면 나타나요") — 옵트인 발견성 보완
[문구] 행동 편집기 꼬리표 색 규칙(여러 개면 가장 먼저 만든 꼬리표),
  새로고침 버튼 accessibilityHint

- 도움말 3주제 추가(새로고침 버튼·일기 잠금·이전 기간과 비교)
- 신규 문구 31키 en/ja 완역 + 워치 카탈로그 2키, missing/stale 0
- CLAUDE.md §6·§6.6·§6.7·§6.8·§10·§11·§14 갱신, DEBUG 인자
  -showOnboarding·-diaryLockScreen 추가
- 검증: Debug/워치/Store 빌드, 온보딩·설정·비교 카드·잠금 게이트·
  컴플리케이션 스크린샷

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 02:02:38 +09:00
songyc macbook
e6fc272908 fix(l10n): unify Japanese app name to "Haru Danim" in 10 leftover spots
- 워치 스크린샷 촬영 중 발견: 워치 앱 제목 ja가 옛 표기 'ハルダニム' — 과거 결정(전 타깃 ja 앱 이름 = 'Haru Danim', InfoPlist는 이미 통일)과 어긋남
- 전수 스캔으로 카탈로그 4곳 총 10건 통일: 워치 앱 제목, 워치 컴플리케이션 '하루 다님' 헤딩, 잠금화면 위젯 inline 문구 2종(IOS·위젯 카탈로그 각각), 시리·제어 센터 도움말 본문 3건 — AppShortcuts의 ${applicationName} 해석(Haru Danim)과도 일치하게 됨
- 검증: 전 카탈로그 'ハルダニム' 0건, ja 워치 스크린샷에서 'Haru Danim' 표기 확인, Debug·Store·워치 빌드 성공

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
2026-07-17 02:29:57 +09:00
songyc macbook
232e8c504d fix(watch): list every goal & quest in complication recommendations
- 페이스 편집기에 3번째 목표부터(다짐은 첫 목표의 2개까지만) 안 뜨던 원인 = recommendations()의 prefix(2) 하드캡 — 워치는 컴플리케이션 파라미터 편집 UI가 없어 추천 목록이 곧 선택지의 전부라, 캡에 걸린 목표·다짐은 페이스에 추가할 방법 자체가 없었음 (보고된 13개 = 현재현황 1 + 목표 2×3기간 + 다짐 2×3기간과 정확히 일치)
- 목표·다짐 달성률 둘 다 상한 제거: 진행 중 목표 전부 × 3기간, 다짐 전부 × 3기간 나열
- 워치 앱이 스냅숏을 적용할 때 invalidateConfigurationRecommendations() 호출 추가 — 이후 아이폰에서 목표를 새로 만들어도 시스템 임의 재조회를 기다리지 않고 목록에 자동 반영
- CLAUDE.md §11에 "추천 목록 = 선택지 전부, 상한 금지" 규칙 명시
- 검증: 워치·Debug·Store 3스킴 빌드 성공, 워치 심 -complicationPreview 렌더 정상 (추천 목록 자체는 페이스 편집 UI라 헤드리스 확인 불가 — 실기기 확인 필요)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
2026-07-16 05:33:15 +09:00
songyc macbook
fced5d1958 fix(l10n): localize widget/complication placeholder sample labels
- placeholder()의 생 한국어 리터럴 6곳을 String(localized:)로: ③다짐 링·④다짐 현황·잠금화면 위젯의 spanLabel "오늘"(기존 키 재사용), 워치 목표/다짐 달성률 "목표"/"하루"(기존 키 재사용), 워치 현재 현황 샘플 "독서"(워치위젯 카탈로그 신규 1키 — en Reading/ja 読書, iOS 위젯 카탈로그와 동일 값)
- placeholder는 갤러리/로딩 스켈레톤 전용 경로라 타임라인 예산·버튼 반응성·갱신 경로 무영향 — ①⑤ 위젯 placeholder가 이미 쓰던 패턴과 동일
- 검증: Debug·Store·워치 3스킴 빌드 성공, 전 카탈로그 missing/stale 0

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
2026-07-16 02:53:43 +09:00
songyc macbook
f05e6113a1 chore(release): privacy manifests for all 4 bundles + lower minimum OS to 26.0/10.0
유료 앱 출시 패키지 점검에서 발견한 두 가지 보완:

1) PrivacyInfo.xcprivacy 추가 (iOS 앱·위젯 확장·워치 앱·워치 위젯 확장) —
   required-reason API 선언(ITMS-91053 대응): UserDefaults 카테고리에
   CA92.1(앱 자체 설정) + 1C8F.1(App Group 공유), 수집 데이터·트래킹 없음
   (ASC '데이터 수집 안 함' 선택과 일치). 파일 타임스탬프·부팅 시간·디스크
   용량·키보드 목록 API는 전수 grep으로 미사용 확인. 앱 타깃이 위젯 폴더를,
   워치 앱 타깃이 워치위젯 폴더를 동기화(미리보기 화면용)하고 있어 매니페스트가
   이중 복사되던 충돌은 membershipException 2건으로 해소 — 번들마다 자기
   매니페스트 1개씩 포함됨을 빌드 산출물로 확인.

2) 배포 타깃 하향: iOS/iPadOS 26.5 → 26.0 (리퀴드 글라스 glassEffect가 26.0
   하한이라 그 이상 낮출 수 없음), watchOS 26.0 → 10.0. 컴파일러 availability
   검사가 오류 0건으로 통과 = 해당 버전 지원 보증. 검증: Debug·Store·워치 스킴
   빌드 성공, MinimumOSVersion 각인(26.0/10.0) 확인, watchOS 11.5 시뮬레이터
   실기동(기존 최소치로는 설치 불가였던 OS) + 26.2 시뮬레이터 실기동, 아이폰
   시뮬레이터 부팅 확인. Series 4·5·SE(1세대) 등 watchOS 10~11 워치 사용자와
   iOS 26.0~26.4 기기가 지원 범위에 들어옴.

CLAUDE.md §1에 최소 OS와 매니페스트 완비 상태 기록.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
2026-07-15 19:05:09 +09:00
songyc macbook
f70e6a1c06 fix(goal,watch,diary): judge goals as of their end date + watch l10n + template render polish
전체 재분석에서 확정한 4건 + 양식 개선 2건:

1) 목표 자동 판정 기준 시점 (핵심 수정)
   기존에는 판정이 "실행되는 시점의 현재 주기" 기준이라, 종료일
   며칠 뒤에 앱을 열면 목표 기간 밖의 데이터로 달성/미달성이
   갈렸다. 이제 자동 판정(evaluateIfEnded)은 **종료일이 속한
   논리적 하루의 마지막 순간**(judgmentReference) 기준 — 늦게
   실행해도, 종료일을 과거로 고쳐도 종료일까지의 기록으로 판정.
   (하루 시작 시간 설정으로 기준이 미래가 되는 경우 now로 상한)
   수동 종료는 종료일 없는 목표 전용이므로 기존대로 "지금" 기준.
   목표 편집 시 종료일 변경 처리: 진행 중 목표는 저장 즉시 판정,
   완료된 목표의 종료일을 바꾸면 '진행 중'으로 재개 후 재판정
   (미래/없음 → 진행 중 복귀, 다른 과거 날짜 → 그 시점 기준 재판정).
   검증: -endGoalYesterday로 어제 종료 → 종료일 기준 '달성' 판정 확인.

2) 워치 컴플리케이션 지역화 2건
   - 다짐 달성률 rectangular의 기간 라벨("하루/주간/월간")이 String
     파라미터라 미추출 → en/ja에서 한국어 노출 → String(localized:)
   - 빈 상태 문구("목표 없음"/"다짐 없음") 동일 문제 → 추출 + 워치
     앱/워치 위젯 카탈로그에 en/ja 번역 추가 (타깃별 stringsdata로
     sync — 카탈로그 오염 없음, 전 카탈로그 missing 0)

3) 배포 체크리스트: CloudKit 프로덕션 스키마 배포 항목을 CLAUDE.md
   §1에 추가 (DiaryTemplate 등 새 레코드 타입은 출시 전 대시보드
   Deploy Schema to Production 필수)

4) 일기 양식 렌더 개선
   - 첫 렌더 비동기화: 저장된 썸네일을 플레이스홀더로 즉시 깔고
     본 렌더(2×)를 백그라운드로 — 복잡한 벡터 PDF도 페이지 넘김이
     걸리지 않음
   - 비활성 페이지 고해상도 강등: 화면 밖 페이지는 래스터를 2×로
     상한(allowsHighResolution) — TabView가 이웃 페이지를 유지해도
     양식 여러 장의 메모리 사용을 절약, 활성 복귀 시 원래 배율 복원
   검증: 양식 페이지 2× 프로그램 줌에서 점 노트 선명(회귀 없음),
   시드 필기 페이지 획 유지 확인.

빌드: Debug·Store·워치 스킴 모두 성공. 도움말(목표 판정 문구
갱신 — 종료일 기준·재판정 규칙 안내)과 CLAUDE.md §4.3 갱신,
문구 수정 stale 1건 삭제 및 ko/en/ja 번역 완료.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
2026-07-14 19:44:02 +09:00
songyc macbook
8818578758 feat(widget,watch): instant tap feedback + stale complication timer guard
체감 개선 2건 (사용자 리포트 기반):

1) 홈 위젯 버튼의 '안 눌렸나?' 문제 — ①행동 실행·③다짐 진행률
   위젯의 변하는 값(누적·퍼센트·링)에 invalidatableContent() 적용.
   탭 즉시 해당 값이 '갱신 중' 표시로 바뀌어, 새 타임라인 도착
   (1~3초, WidgetKit 구조상 단축 불가) 전에도 탭 접수가 보인다
   → 중복 탭으로 횟수가 여러 번 올라가는 문제 방지.

2) 워치 컴플리케이션 유령 타이머 — 종료 푸시가 유실되면 '측정 중'
   타이머가 무한히 흐르던 문제. 스냅숏 generatedAt 기준 2시간
   (runningTrustInterval)을 넘긴 '측정 중'은 '새로고침 필요' 표시로
   강등. 워치 앱을 열면 즉시 복구되고 진짜 장시간 측정도 다음
   스냅숏에 타이머가 돌아온다 (데이터 무영향).

검증: 위젯 미리보기 레이아웃 무영향 확인, 워치 미리보기에 강등
샘플 행 추가(-complicationScrollTo stale)로 원형/사각형 렌더링 확인.
새 문자열 4개 워치 앱·워치 위젯 카탈로그 ko/en/ja 번역.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
2026-07-14 13:01:05 +09:00
songyc macbook
939406ac74 feat(brand): logo v4 — walker on a clock planet, with light/dark/tinted icon variants
콘셉트 전면 재디자인: 하루라는 행성(시계)이 화면 아래를 채우고 그 위를
사람이 걸어간다. 시계는 링+3/6/9 눈금+10:10 골드 바늘, 사람 뒤로 링을
따라 남은 발자국, 소프트 섀도로 입체감.

iOS 아이콘 외형 3종(에셋 카탈로그 luminosity 변형):
- 라이트: 웜 화이트 배경 + 초록 시계 + 검정 사람 + 골드 바늘
- 다크: 딥 그린 그라데이션 배경 + 웜 화이트 드로잉 (기존 톤 유지)
- 틴티드: 투명 배경 + 그레이스케일 (시스템이 틴트 적용)
스플래시 로고도 라이트/다크 변형 제공(테마 따라 자동 전환), 워치·워치
위젯은 다크 단일(외형 변형 미지원 플랫폼).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
2026-07-13 14:30:01 +09:00
songyc macbook
209042575e feat(brand): logo v3 — person walking toward the clock of their day
시계와 사람을 포함해 슬로건('당신의 하루에 다녀가다')과 앱 콘셉트(시간
추적)를 직접 표현: 우상단 웜 화이트 시계 링(골드 10:10 바늘) + 그곳을
향해 걷는 웜 화이트 픽토그램 + 지나온 발자국 점 2개. 색 구성은 유지.
iOS·워치·워치 위젯 아이콘과 스플래시 로고 일괄 교체.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
2026-07-13 05:57:11 +09:00
songyc macbook
921eb4bccf feat(brand): redesign logo around the slogan — footsteps visiting the sun of your day
'당신의 하루에 다녀가다'를 직접 표현: 골드 해(하루)를 향해 대각선으로
걸어가는 웜 화이트 발자국 캡슐 3개(멀수록 작아지는 깊이감) + 은은한 링.
기존 색 구성(딥 그린 그라데이션/웜 화이트/머스터드 골드) 유지.
iOS·워치·워치 위젯 앱 아이콘과 스플래시 로고에 일괄 적용.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
2026-07-13 03:47:12 +09:00
songyc macbook
8c803d4d6e feat(brand): new geometric logo — day ring + footsteps, applied to all app icons and splash
- DesignAssets/AppLogo.svg 벡터 원본 (하루=열린 링, 지금=골드 점, 다님=발자국 캡슐 2개)
- iOS·워치 앱·워치 위젯 AppIcon + 스플래시 AppLogo 전부 교체 (기존 플레이스홀더 삭제)
- CoreGraphics 렌더로 불투명(알파 없음) 1024px PNG 생성 — 앱 아이콘 알파 채널 이슈 해소

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
2026-07-13 03:02:00 +09:00
songyc macbook
5c3017aeaa fix(l10n): complete ko/en/ja coverage — sync catalogs, translate 123 strings, localize stats titles and filter sheet
- 카탈로그 4종 xcstringstool sync + stale 키 64개 제거
- 버블 메뉴·위젯 5종·이미지 내보내기 신규 문자열 en/ja 전량 번역
- StatsTabView 카드 제목·RecordFilterSheet 제목이 String 파라미터라 미현지화되던 것을 LocalizedStringKey로 수정
- HistoryView 필터 칩 문자열 String(localized:) 누락 수정
- 위젯 익스텐션 InfoPlist.xcstrings 신설(표시 이름 현지화), iOS에 사진 권한 문구 ko/en/ja 추가, 워치 ja 앱 이름 'Haru Danim'으로 통일

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
2026-07-13 02:24:28 +09:00
songyc macbook
081c388f00 fix: 워치-라이브 액티비티 동기화, 앱 이름 띄어쓰기, 차트 라벨 겹침, 위젯 '선택 안 함' 옵션
라이브 액티비티(다이내믹 아일랜드) 워치 연동:
- 워치 실행 명령이 세션 활성화 전이거나 sendMessage 실패 시 유실되던 문제를
  transferUserInfo 큐 폴백으로 보강 (iPhone didReceiveUserInfo 수신 처리 추가)
- 큐로 지연 도착한 실행 명령이 엉뚱한 토글을 일으키지 않도록 5분 유효 시간 부여
- 백그라운드에서 Live Activity 시작이 거부되면 pendingStartRetry로 기억했다가
  앱 포그라운드 복귀(scenePhase active) 시 재시도 + DB 상태 재동기화
- WatchSync 진단용 os_log(notice) 추가, DEBUG -autoRunFirstAction 검증 훅 추가
- 시뮬레이터 검증: 워치 시작 → 아이폰 세션 시작 + 다이내믹 아일랜드 생성,
  워치 종료 → 세션 종료 + 아일랜드 소멸 확인 (큐 폴백 채널은 시뮬레이터
  transferUserInfo 한계로 실기기 확인 필요)

앱 이름 전역 띄어쓰기 ('하루다님' → '하루 다님'):
- pbxproj CFBundleDisplayName 6곳, InfoPlist.xcstrings 3개(ko), 스플래시(ContentView),
  워치 내비게이션 타이틀, 컴플리케이션 문구, 문자열 카탈로그 키 일괄 변경
- 워치 카탈로그 영문 값 HaruDanim → Haru Danim 통일

통계 위젯 X축 라벨 겹침 방지:
- 날짜 축 포인트가 7개를 초과하면(한 달·일별 등) 라벨을 숨기고 눈금만 표시

위젯 설정 '선택 안 함' 옵션:
- Action/Goal/Quest 엔티티에 zero-UUID 센티널 추가, 제안 목록 최상단 노출
- 2·3번째 슬롯 선택을 되돌릴 수 있고, 위젯 조회 단계에서 자연스럽게 걸러짐
- ko/en/ja 번역 추가 (None / 選択しない)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
2026-07-10 21:47:42 +09:00
songyc macbook
c0c59af0ac fix(watch): 컴플리케이션 페이스 목록 미노출 수정 + 워치 앱 이름 다국어화
- 컴플리케이션이 페이스 편집 목록에 아예 안 나오던 원인: 추천 구성
  (recommendations)의 description에 문자열 보간을 사용해 WidgetKit이
  "Formatted text for AppIntentRecommendation is not supported" assertion으로
  익스텐션을 즉사시킴 → 시스템이 위젯 목록 조회 자체를 실패
  → Text(verbatim:)으로 교체. 시뮬레이터 chronod 로그로 3종 kind
  (HaruWatchStatus/GoalRate/QuestRate) 정상 등록 확인 (크래시 0)
- 추천 구성을 캐시된 목표/다짐 기반으로 개선 (모든 파라미터 채움)
- 워치 앱·워치 위젯 익스텐션 표시 이름 현지화: InfoPlist.xcstrings 추가
  (ko 하루다님 / en Haru Danim / ja ハルダニム)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
2026-07-10 15:42:37 +09:00
songyc macbook
a6c040cd6a feat(i18n): 전체 UI 다국어 지원 (한국어·영어·일본어)
- 언어 설정 실적용: 변경 시 AppleLanguages 오버라이드 저장, 재시작 안내 footer
- 자동 추출되지 않던 일반 문자열(탭 이름, 픽커 라벨, 상태 뱃지, 포매터,
  삼항 문구, 심볼 카테고리 등)을 String(localized:)로 전환
- 위젯·워치 앱·컴플리케이션 타깃에 Localizable.xcstrings 신설
  (중복 리소스 방지 pbxproj 예외 추가), xcstringstool sync로 키 추출
- 4개 카탈로그 전체 키(고유 430개)에 en/ja 번역 주입
- 영어의 긴 횟수 단위("times")가 잘리지 않도록 모음 탭 셀 축소 허용
- 검증: -AppleLanguages "(en)"/"(ja)"로 모음 탭·설정 화면 확인

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
2026-07-10 15:03:24 +09:00
songyc macbook
0cdb566ad5 fix(watch): 컴플리케이션이 워치 앱을 열지 않아도 갱신되도록 수정
- 워치 앱 시작(App.init) 시점에 WCSession 활성화: 백그라운드로 깨어나
  스냅숏을 받을 수 있도록 델리게이트를 미리 설정
- iPhone이 transferCurrentComplicationUserInfo 전용 채널로도 스냅숏 전송
  (전송 예산 고려: 측정 상태 변화 또는 30분 경과 시에만)
- 워치 didReceiveUserInfo 수신 → 캐시 저장 + 컴플리케이션 타임라인 갱신
- ComplicationStore.defaults 단일 인스턴스화

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
2026-07-10 14:44:48 +09:00
songyc macbook
1758cc3a25 feat(complications): 워치 페이스 컴플리케이션 3종 (CLAUDE.md §9.2)
- 현재 현황: 측정 중 대표 행동 + 실시간 타이머 + 추가 측정 +N(없으면 생략),
  미측정 시 '실행 중 아님'
- 목표 달성률: 목표·기간(하루/주간/월간) 선택, 원형 게이지/진행바/인라인
- 다짐 달성률: rectangular는 세 기간 모두 표기, '이하 유지(한도형)' 다짐은
  게이지 대신 한도 안/초과 상태로 별도 표현
- accessoryCircular/Rectangular/Inline/Corner 지원 + 페이스 갤러리 추천(recommendations)
- 워치 앱이 캐시한 스냅숏 사용, 갱신 시 reloadTimelines로 실시간 리프레시
- pbxproj: WatchShared 3개 타깃 연결, 위젯·컴플리케이션 뷰를 앱 타깃에도 포함
  (DEBUG 미리보기용, @main 제외), WATCHOS_DEPLOYMENT_TARGET 26.0
- DEBUG 미리보기: -complicationPreview YES, -complicationScroll YES

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
2026-07-10 09:00:15 +09:00