Commit Graph

438 Commits

Author SHA1 Message Date
th-kim0823
7b3450d0d5 feat(ui): Sidebar + NotebookList + NotebookCreateModal stub
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 10:47:07 +09:00
th-kim0823
53a1579266 feat(promotion): store promotionCandidates + accept/snooze/dismiss + settings 영속화
- SettingsService: promotion_dismissed_tags / promotion_snoozed_until_ms / sidebar_visible / sidebar_width 스키마 + getter/setter 추가
- NotebookRepository: getDefault() (created_at ASC LIMIT 1) 헬퍼 추가
- inboxApi: notebookRepo 옵션 dep + 5개 IPC 핸들러 (list-promotion-candidates / get-dismissed-tags / add-dismissed-tag / get-snoozed-until / set-snoozed-until)
- shared/types: PromotionCandidate 인터페이스 + InboxApi 5개 메서드 추가
- preload: 5개 ipcRenderer.invoke 패스스루
- store: promotionCandidates 상태 + loadPromotionCandidates / acceptPromotion / snoozePromotion / dismissPromotion 액션 + toTitleCase helper
- tests: store.promotion.test.ts 신설 (6개 케이스)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 10:44:52 +09:00
th-kim0823
9dfca6edf2 feat(store): notebooks state + actions (load/select/create/rename/delete/move/toggle)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 10:40:09 +09:00
th-kim0823
7aef46dc1a feat(ai): AiWorker — notebook_match 매치 시 자동 moveNote
- NotebookRepository.findByName(name) 추가 — COLLATE NOCASE case-insensitive 조회
- AiWorkerOptions.notebookRepo 옵션 추가 (optional Pick<NotebookRepository, ...>)
- processJob: generate 전 notebookRepo.list() → notebooks 배열 GenerateInput 에 주입
- processJob: updateAiResult 후 res.notebookMatch valid 이름이면 findByName + moveNote 호출
- main/index.ts: AiWorker 생성 시 notebookRepo 전달
- NotebookRepository.test.ts: findByName 3개 테스트 추가
- AiWorker.test.ts: notebook 매칭 describe 4개 테스트 추가 (총 45 테스트 통과)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 10:36:59 +09:00
th-kim0823
359d94e7e6 feat(ai): prompt 에 notebooks 목록 + schema 의 notebook_match 필드
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 10:34:11 +09:00
th-kim0823
14ab135425 fix(test): migrations user_version latest 7 → 8 (m008 추가 잔여 fix)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 10:30:15 +09:00
th-kim0823
b9fec25b9d feat(ipc): inboxApi list/search/counts 에 notebookId 옵션 + counts archived 제거
- InboxApi.listNotes / listByStatus / search signature 에 notebookId? 옵션 추가
- countsByStatus 반환 타입에서 archived 제거 (active/completed/trashed 만)
- inbox:list-by-status 핸들러: archived 수신 시 빈 배열 graceful fallback
- inbox:counts-by-status 핸들러: notebookId opts 추가, archived 키 제거
- store.ts: countsByStatus 결과 spread 시 archived:0 fallback (Task 15/16 까지 UI 보존)
- App.test.tsx: countsByStatus mock 에서 archived 제거 + 탭 count 기대값 보관(0) 으로 조정

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 10:28:49 +09:00
th-kim0823
a0e6bc53b2 feat(ipc): notebookApi — list/create/rename/setColor/delete/moveNote
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 10:23:38 +09:00
th-kim0823
4d070bb6c7 feat(notes): findPromotionCandidates — tag threshold default notebook 클러스터
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 10:20:41 +09:00
th-kim0823
d01cd5f350 feat(notes): list/listByStatus/countByStatus/search 에 notebookId 옵션
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 10:10:24 +09:00
th-kim0823
4c39a38ed5 feat(notes): notebook_id 필드 + create/upsert 시 default notebook 보장
Note.notebookId 필드 추가(required), NoteRepository.create/importNote/upsertFromSync INSERT 에
notebook_id 컬럼 포함 — 미지정 시 getDefaultNotebookId() 로 가장 오래된 notebook 자동 할당.
hydrate 에 notebookId 반환 추가. 관련 test fixture 5곳 notebookId 보강.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 10:06:44 +09:00
th-kim0823
caa4728e21 feat(notebook): NotebookRepository CRUD + noteCount + RESTRICT delete
- Notebook 인터페이스 src/shared/types.ts 에 추가 (noteCount = active 노트 수)
- NotebookRepository.ts 신설: list / findById / create / rename / setColor / delete / moveNote
- delete: FK RESTRICT 위반 → ok:false reason='has_notes', 미존재 → 'not_found'
- noteCount 서브쿼리: status='active' 만 카운트 (completed/trashed 제외)
- 테스트 10개 모두 통과, typecheck clean

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 09:58:24 +09:00
th-kim0823
7b943e2455 fix(db): m008 test — backfill + archived sweep 실제 검증 + name COLLATE NOCASE
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 09:54:41 +09:00
th-kim0823
c99795c9e4 feat(db): m008 — notebooks 테이블 + notes.notebook_id + archived 정리
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 09:47:23 +09:00
th-kim0823
b860187b37 docs(spec): m007 → m008 정정 (m007 이 FTS 로 이미 사용중)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 09:43:31 +09:00
th-kim0823
dbc0acbaf5 docs(plan): v0.4 notebooks + lifecycle implementation plan
20 task — m008 마이그레이션 → NotebookRepository → AI prompt + schema +
AiWorker 매칭 → store (notebooks + promotionCandidate) → Sidebar /
NotebookList / NotebookCreateModal / PromotionBanner → App 통합 (Cmd+B,
헤더 3탭, archived 제거) → search scope → CHANGELOG v0.4.0.

각 task TDD step (실패 test → 구현 → 통과 → commit). 모든 step 에 실제
code block 포함, placeholder 없음.

sync (Cut E) 와의 frontmatter notebook 통합은 본 plan 에서 deferred —
v0.4 본체 머지 후 별도 작업.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 17:56:16 +09:00
th-kim0823
ce27f7c500 docs(spec): v0.4 — Notebooks + Lifecycle Simplification design
기존 v0.3.2 Cut G design (사이드바 + notebook 카테고리) 을 v0.4 로 승격하면서
lifecycle 단순화 (archived 제거) + AI × Notebook 통합 (자동 fit 매칭 + tag 기반
promotion 제안) 을 함께 다룸. dogfood 19일 데이터 (archived 0건 / mlx-ops tag
6건이 사실상 컨텍스트 그룹 역할) 가 묶음 변경의 근거.

핵심 결정:
- notebook 모델 = 옵션 B (단일 DB + notebook_id), 다중 profile 옵션 A 는 v0.5+ 보류
- lifecycle 3분기 — active/completed/trashed, archived 제거 (마이그레이션 시 completed 로 합침)
- AI autonomy = 제안 + 1-click 수락 (새 notebook 자동 생성 X, fit 매칭만 자동 배치)
- promotion trigger = tag 3건 이상 default notebook 누적 (v0.4 first release 는 rule only)
- 사이드바 default hidden, Cmd+B / Ctrl+B 토글

선행 Cut G design (`2026-05-09-v032-cut-g-design.md`) 상단에 deprecate 노트 추가.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 17:38:04 +09:00
th-kim0823
7418eb9363 docs(changelog): v0.3.14 force re-tag dogfood fixes 7건 반영
기존 v0.3.14 'AI 처리 fail 원인 가시화' 노트 위에 force re-tag 로 묶인
후속 변경 (capture / cmd 안내 / macOS / notes 재처리 / expiry / sync /
settings 풀어쓰기) section 을 prepend. 새 minor 안 늘리는 패턴 유지.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
v0.3.14
2026-05-14 14:29:26 +09:00
th-kim0823
906e9b6f7d feat(settings): SectionIntro 설명 paragraph + SyncHelpModal 풀어쓰기
dogfood: 설정 페이지의 각 section 이 너무 단답형이고 도움말 텍스트도
기술 용어 (rebase, fast-forward, NTP) 위주라 불친절.

- 공통 SectionIntro 컴포넌트 신설 (12px gray paragraph, margin-bottom 12).
- 6 section (AI 제공자 / Vision / 자동실행 / 백업 / 동기화 / 정보) 상단에
  "이게 뭐고 왜 필요한지" 1-2 문장 안내 추가. 톤은 담백 + 업무적 (존댓말,
  Inkling 1인칭).
- SyncHelpModal section 1, 2, 3 의 기술 용어를 사용자 언어로 풀어쓰기.
  "fetch + rebase" → "원격 변경 먼저 받아오기", "NTP" → "기기 시각 어긋남",
  "non-fast-forward push 거부" → "업로드 거부 시 자동 재시도" 등.

시각/레이아웃은 그대로 유지 — 텍스트 변경만.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 13:12:23 +09:00
th-kim0823
2b5ba8a50e fix(sync): manifest.exported_at 제거 — no-op push 회피
dogfood: 노트 변경이 0건이어도 자동 sync 가 매번 commit + push 를 생성.
원인은 manifest.json 의 exported_at timestamp 가 매 export 마다 갱신되어
git diff 가 항상 1줄 발생.

해결: composeManifest 의 exportedAt 입력 제거 + 출력 JSON 에서 필드 삭제.
이 필드는 ImportService 가 read 하지 않고 UI 표시도 없는 cosmetic 정보였음.
이제 노트 변경 있을 때만 commit/push 가 일어난다.

회귀 테스트: 같은 input 으로 두 번 호출 시 stable 출력 invariant 추가.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 13:12:08 +09:00
th-kim0823
3c731cc754 feat(expiry): inbox 만 대상 + 오늘 당일 포함 + 헤딩/라벨/메모 바로가기
dogfood: 마감 알림이 (1) 완료/보관 status 노트도 포함하고 (2) 오늘 당일
마감 메모는 빠져 있어 사용자 불편.

NoteRepository.findExpiredCandidates 변경:
- due_date < today → <=today (오늘 당일 포함)
- status='active' 필터 추가 (inbox 만, completed/archived/trashed 제외)
- ORDER BY due_date DESC → 오늘 → 어제 → 그저께 순

ExpiryBanner UX:
- 헤딩 분리 카운트 "오늘 마감 X · 지난 Y" (한 쪽만이면 단독 표시)
- 노트 옆 due_date → 상대 라벨 ([오늘] / [N일 지남]) + hover tooltip 으로
  원본 ISO 날짜 노출
- 노트 제목 클릭 → note-{id} 로 smooth scroll (RecallBanner 와 동일 패턴).
  checkbox 와 분리하기 위해 label → div + button 으로 구조 변경.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 13:11:58 +09:00
th-kim0823
352457189e feat(notes): 원문 편집/이력 복원 시 AI 재처리
dogfood: 사용자가 노트 본문 수정해도 기존 AI 제목/요약이 그대로 남는 문제.
NoteRepository.markAiPendingForReprocess 추가 — done/failed/pending 노트를
pending 으로 reset + pending_jobs 재투입. disabled 는 사용자가 명시적으로
비활성화한 상태라 존중하여 no-op.

inboxApi 의 update-raw-text / restore-revision 핸들러가 raw 갱신 후 위
헬퍼 + worker.enqueue + pushNoteUpdated 호출. NoteCard.saveRaw 는 optimistic
으로 aiStatus='pending' 즉시 반영 → UI 가 "Inkling이 정리하는 중…" 즉시
표시, 백엔드 push 로 자동 sync. updateAiResult 의 user-edit 가드가 사용자가
직접 편집한 title/summary 는 새 AI 결과로 덮어쓰지 않으므로 안전.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 13:11:38 +09:00
th-kim0823
a68feae20e fix(macos): hidden autostart dock indicator + 자동실행 mismatch false positive
두 macOS 한정 버그 묶음:

1. autostart --hidden 으로 spawn 시 quickCapture (NSPanel) 만 떠 있어
   dock running indicator (점) 가 표출 안 됨 — NSPanel 은 NSApp main window
   로 register 안 됨. inboxWindow 를 hidden 상태로 미리 create + ready-to-show
   시점에 showInactive → hide trick 으로 NSApp 에 register, 사용자 화면
   깜빡임 없이 dock 점 켜짐.

2. SettingsPage 의 자동실행 mismatch 경고가 macOS 에서 false positive.
   macOS 13+ 의 SMAppService API 가 args 옵션 무시 + unsigned/Electron
   앱에 대해 executableWillLaunchAtLogin 을 자주 false 로 반환 → 정상 등록
   상태에서도 경고 떠 있음. AutostartDiagnostic 결과에 platform 필드 추가,
   willLaunch 신호는 win32 에서만 mismatch 판정에 사용.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 13:11:17 +09:00
th-kim0823
64935d943c chore(ux): macOS 사용자 위해 Cmd 키 hint 안내
renderer 두 곳의 단축키 안내 텍스트가 'Ctrl+...' hardcoded 였음. 사용자에게
보여지는 hint 만 platform-aware 로 분기 (navigator.platform 검사) — Mac
에서는 'Cmd+Shift+J', 'Cmd+Enter' 로 표시.

main 의 globalShortcut accelerator 는 이미 platform 별 분기되어 있어 별개
영향 없음. UI 안내만 일치시키는 변경.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 13:11:03 +09:00
th-kim0823
9cf6cafab2 fix(capture): blur-on-hide 제거 — esc/cmd+enter 까지 창 유지
dogfood: 사용자가 quickCapture 띄운 채로 다른 창 클릭 시 즉시 hide 되어
저장/취소 의도를 명확히 표시하기 전에 사라지는 현상. blur 핸들러 제거 →
ESC (취소) / Cmd+Enter (저장) 누를 때까지 창 유지. alwaysOnTop +
screen-saver level 이라 다른 앱 위에 떠 있음.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 13:10:52 +09:00
th-kim0823
d3bc972783 fix(vision): 본문 빈 + 이미지 only 케이스 AI 호출 skip
gemma4:26b 등 vision 모델이 본문 없는 이미지 단독 입력을 의미 있게 처리 못 함
(여러 prompt 시도에도 빈 응답). 모델 한계 수용:

- AiWorker 가 rawText.trim()==='' && media.length>0 detect 시 vision call skip
- 자동 placeholder: '첨부 이미지' / '첨부 이미지 N장' + summary
- ai_provider='image-only-skip' (디버그성 식별자)
- NoteCard 노란 배너 제거 (사용자가 한계 수용, placeholder 자체로 충분)
- 사용자는 EditableField 로 제목/요약 직접 편집 가능

cold-start timeout / parseJsonLoose fallback / schema coerce 부담 모두 skip.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 15:28:58 +09:00
th-kim0823
30b14d2b74 fix(vision): 본문 빈 케이스에 one-shot 예시 추가
gemma4:26b 가 본문 없이 이미지만 받으면 null 반환하는 한계 우회.
prompt 강화 + null 금지 명시 만으로 부족. one-shot 예시 (강아지/화이트보드)
2개로 모델이 입출력 구조 따라가도록 유도.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 14:56:43 +09:00
th-kim0823
431b35a72a fix(vision): graceful fallback 배너 문구 정밀화
설정 다 한 사용자도 본문 없이 이미지만 첨부하면 placeholder 떨어지는 케이스 잦음
(gemma4:26b 등 vision 모델의 본문 없는 이미지 처리 한계).

배너가 "설정 확인" 권유 → 사용자 혼란.
"본문 없이 이미지만 첨부한 경우 일부 vision 모델이 빈 응답" + "본문 추가 또는 직접 수정"
으로 변경. 실제 원인 명시.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 14:51:40 +09:00
th-kim0823
e34f036f20 fix(vision): graceful fallback 가시화 + 진단 로그
이전 fix 후에도 사용자가 "(첨부 메모)" placeholder 만 보이면 왜 fail 한지 모름.
가능성 큰 원인: vision_model 미설정 → text-only path → 본문 빈 응답.

- AiWorker: ai.vision.decide 로그 추가 — visionActive / visionModelConfigured /
  mediaCount / mediaStorePresent. logs/main.log 에서 진단 가능.
- NoteCard: ai_status='done' + title='(첨부 메모)' + media 있을 때 노란 banner.
  "vision 모델 설정 확인 + 직접 편집" 안내.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 14:44:41 +09:00
th-kim0823
c616555d7d fix(vision): repetition loop 대응 + parseJsonLoose graceful fallback
gemma4:26b 가 "기기기기..." repetition loop 에 빠져 num_predict cap 도달 →
JSON truncate → unparseable. 두 가지 fix:

- Ollama body 에 repeat_penalty: 1.15 추가 (token repetition 억제)
- parseJsonLoose fail 시 throw 대신 {} 반환 → schema graceful coerce 가
  placeholder title/summary 채움. raw_text 는 보존 → 사용자 데이터 무손실.
- coerceNullable 가 undefined 도 처리 (빈 객체 케이스).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 14:39:54 +09:00
th-kim0823
218868206b fix(schema): null/empty title/summary 를 placeholder 로 coerce
gemma4:26b 가 본문 빈 케이스에 title=null/summary=null 반환 → schema throw.
prompt 강화로 부족. schema 단계에서 graceful coerce:
- null/empty title → '(첨부 메모)'
- null/empty summary → '내용을 자동으로 정리하지 못했습니다.'
- 영어 title → '(첨부 메모)' (이전엔 throw)
- malformed/empty due_date → null (이전엔 throw)

raw_text 는 호출자가 보존하므로 사용자 데이터 손실 없음.
사용자가 후에 NoteCard 에서 직접 편집 가능.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 14:24:20 +09:00
th-kim0823
b2be29bd33 fix(vision): 본문 빈 케이스 prompt 강화 — null title/summary 회귀
gemma4:26b 가 본문 없이 이미지만 있을 때 title=null/summary=null 반환.
prompt 가 "(이미지만 있음)" 만 던지는 게 신호 약함. 본문 비었으면
이미지 내용으로 한국어 채우라고 명시 + "null 반환 금지" 규칙 추가.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 14:15:18 +09:00
th-kim0823
4266376b23 chore(release): v0.3.14 — AI fail 원인 가시화
- NoteCard: failed 노트에 <details> "원인 보기" 접힘 섹션 추가.
  ai_error 전체 노출 (wrap + word-break).
- AiWorker: markAiFailed 시 [reason] provider prefix 추가.
  사용자가 timeout/schema/other 카테고리 + 모델명 즉시 식별.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 14:07:53 +09:00
th-kim0823
bd71bba2da chore(release): v0.3.13 — vision generate timeout 120s → 300s
gemma4:26b (25B MoE + vision encoder 550M) 등 대형 vision 모델의
cold-start 가 60-180s 소요. 기본 120s timeout 으로 첫 호출 fail 빈번.
vision path 에 한해 Math.max(timeoutMs, 300_000) — text-only 영향 없음.

gemma4:26b 가 Text+Image 양 modality 지원 검증 완료
(blog.google/gemma-4, ollama.com/library/gemma4:26b).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
v0.3.13
2026-05-12 13:39:11 +09:00
th-kim0823
713553a038 chore(release): v0.3.12 — vision AI 응답 robust parse
vision model 의 markdown fence / prose 섞인 응답에서 JSON 추출 fallback.
prompt 에 title 한국어 / kebab tags / JSON-only 출력 명시 강화.

- LocalOllamaProvider: parseJsonLoose 헬퍼 (첫 { ~ 마지막 } 추출)
- visionPrompt: 4 규칙 + markdown fence 금지 명시
- 단위 +2 (fence 추출 + prose 추출)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
v0.3.12
2026-05-12 13:32:12 +09:00
th-kim0823
d3cf018f62 chore(release): v0.3.11 — CSP img-src hotfix (paste + media render)
양쪽 창의 CSP 가 img-src 부적합:
- quickcapture/index.html: img-src 미지정 → blob: 차단 → paste thumbnail 안 보임
- inbox/index.html: img-src 에 inkling-media: 누락 → 저장된 노트 이미지 안 보임

v0.3.0 이후 잠재적 회귀. 사용자 dogfood 발견.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
v0.3.11
2026-05-12 13:26:46 +09:00
th-kim0823
f676c1638e chore(release): v0.3.10 — macOS fullscreen QuickCapture fix
macOS fullscreen Space 위에 QuickCapture 띄우기. 이전엔 핫키 누를 때 강제 Space 전환.

quickCaptureWindow.ts darwin 분기 추가:
- type: 'panel' (fullscreen floating)
- setAlwaysOnTop(true, 'screen-saver') (가장 높은 level)
- setVisibleOnAllWorkspaces(true, visibleOnFullScreen: true)

Windows / Linux 동작 변경 없음.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
v0.3.10
2026-05-12 13:22:12 +09:00
th-kim0823
2e69f598bc chore(release): v0.3.9 — AI 흐름 unblock UI + FTS5 escape
audit edge case 3건:
- pending 노트 "건너뛰기" 버튼 (cancelPending: pending → disabled + jobs DELETE)
- failed 노트 per-note "재시도" 버튼 (retryOneFailed: failed → pending + enqueue)
- FTS5 sanitize regex 확장 (backtick/dash/caret 추가)

동시 편집 race 는 EditableField guard 가 이미 처리 (수정 불필요).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
v0.3.9
2026-05-11 17:43:46 +09:00
th-kim0823
014c06e1f0 chore(release): v0.3.8 — UX hole 일괄 hotfix 8건
전수 audit 후 핵심 root fix 3 + edge cases 5:

ROOT
- inbox:set-status IPC 가 pushNoteUpdated emit (이전엔 stale → 호출처별 refreshMeta 필요)
- upsertNote 가 current view status 인식 (이전엔 잘못된 status 노트 잔류)
- store async 함수 try/catch (이전엔 IPC fail 시 무한 loading)

EDGE
- restoreNote 가 status='active' 도 갱신
- upsertNote trash 판정 deletedAt → status='trashed'
- Modal Escape dismiss 통일 (5개 modal)
- OnboardingWizard IPC fail fallback (try/catch + skip)
- MoveStatusModal overlay 클릭 close

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
v0.3.8
2026-05-11 16:50:10 +09:00
th-kim0823
4216d42d7c chore(release): v0.3.7 — 이동 modal currentStatus 필터 (Inbox 복원 path)
MoveStatusModal 이 완료/보관/휴지통 3 button hardcode 라
완료/보관/휴지통 노트가 inbox 로 돌아오는 path 가 없던 버그 fix.
currentStatus prop 으로 4 status 중 current 제외 동적 render.
'활성' label 도 헤더 탭과 일치하도록 'Inbox' 로 통일.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
v0.3.7
2026-05-11 16:25:38 +09:00
th-kim0823
e2058cfdbe chore(release): v0.3.6 — 이동 modal 복원 (v0.3.5 의도 정정)
v0.3.5 의 이동 dropdown 단순화가 사용자 의도와 어긋남.
사용자는 dropdown 의 목적지 중복 (modal 도 목적지 묻기) 만 거슬렸지,
사유 입력 + AI 자동 분류 + 수동 status 선택을 한 곳에서 처리하는 modal 은
보존해야 하는 핵심 UX 였음. 단일 "이동" 버튼 → MoveStatusModal path 로 정정.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
v0.3.6
2026-05-11 11:16:14 +09:00
th-kim0823
2c6bfebb5b chore(release): v0.3.5 — dogfood UX hotfix 7건
v0.3.4 까지 누적된 dogfood UX 결함 hotfix.
사용자 직접 보고 3건 (inbox 재진입, 회고 탈출, 이동 modal 중복) + 동반 갭 4건
(count stale, 필터 잔류, 초기 로드 불일치, 배너 컨텍스트 누수).
데이터/마이그레이션 변경 없음 (스키마 v8).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
v0.3.5
2026-05-11 10:47:04 +09:00
altair823
e815289b2a chore: gitignore .claude/worktrees + .claude/settings.local.json
Claude Code 로컬 worktree 와 사용자별 권한 override 파일 무시.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 00:09:47 +09:00
altair823
b35b644fe8 chore(release): v0.3.4 — sync 도움말 cut
PR #33 머지. SyncHelpModal + ConflictModal inline + README 통합 도움말.
v0.3.0 Cut E dogfood gap fill. 데이터/마이그레이션 변경 없음 (스키마 v8 그대로).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
v0.3.4
2026-05-11 00:02:33 +09:00
f2db82b6d6 Merge pull request 'sync 도움말 — SyncHelpModal + ConflictModal inline + README 동기화 섹션 재작성' (#33) from worktree-v034-sync-help into main
Reviewed-on: #33
2026-05-10 14:59:05 +00:00
altair823
9d6f5bfacc refactor(sync-help): ConflictModal — SyncHelpAnchor import 로 literal duplicate 제거
PR #33 회차 1 review 반영. 두 파일 sibling 인데 anchor union 두 곳 정의 →
import type 1줄로 단일 source of truth. 향후 anchor 추가 시 두 파일 동시
수정 누락 risk + TS 가 catch 하지 않던 silent drift risk 제거.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 23:56:26 +09:00
altair823
d686c661ba chore: package-lock.json version 0.3.1 → 0.3.3 catch-up
v0.3.3 hotfix 시 package.json 만 bump 됐고 lockfile 미동기화.
v0.3.4 진입 시 npm install 로 자동 동기화됨. cleanup commit.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 23:52:05 +09:00
altair823
dca1def87c docs: README 동기화 섹션 Cut E 반영 — 양방향 sync + ConflictModal + Silent risk + Troubleshoot 2026-05-10 23:41:56 +09:00
altair823
8cd6382902 fix(sync-help): SyncSection 도움말 버튼 busy 중 disable 해제
리뷰 minor 반영. busy (저장/테스트/sync 진행) 시 정확히 사용자가
도움말이 가장 필요한 시점이라 disable 회수. read-only 컴포넌트라
race risk 0.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 23:40:16 +09:00
altair823
a5e1c1de35 feat(sync-help): SyncSection 도움말 버튼 + SyncHelpModal mount + ConflictModal onOpenHelp wiring 2026-05-10 23:36:07 +09:00