altair823
9a1f0e269a
feat(v030): ImportService.applySyncFromDir + frontmatter status/dueDate/moveReason round-trip
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-10 03:33:48 +09:00
altair823
bbfd0cccda
feat(v030): NoteRepository.upsertFromSync — sync 전용 3 분기 upsert + single write path
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-10 03:27:49 +09:00
altair823
dba64c546f
feat(v030): GitClient — fetch/rebaseOnto/rebaseAbort/hasUncommittedChanges/listConflicts
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-10 03:23:00 +09:00
altair823
662abdb508
docs(plan): v0.3.0 Cut E — 양방향 git sync (spec 정정: 단위 608, ImportService.run 활용, 'sync' enum 미도입, both deferred)
2026-05-10 03:19:16 +09:00
2e9a82face
Merge pull request 'v0.2.11 Cut D — FTS5 search + 회고 view (F19 A+D)' ( #29 ) from worktree-v0211-cut-d-fts5-review into main
...
Reviewed-on: #29
v0.2.11
2026-05-09 15:52:16 +00:00
altair823
735d5494f2
fix(v0211): importNote 가 rebuildFtsTagsForNote 호출 (final review fix)
...
final code review 발견: F5 import path 가 note_tags INSERT 후 notes_fts.tags 갱신
안 해서 import 한 노트의 tag 가 keyword 검색에서 매칭 안 되는 회귀.
Cut C 의 importNote capture revision 누락 패턴과 동일 — single write path
정책 (Cut D 도입) 의 강제 검사 누락. importNote transaction 끝에서 호출하도록
fix + 회귀 test 2건 (insert path / fork path) 추가.
NoteRepository 안 note_tags INSERT path 는 updateAiResult / updateUserAiFields /
importNote 3곳, 셋 다 rebuildFtsTagsForNote 호출 보장 — invariant 회복.
2026-05-10 00:46:58 +09:00
altair823
5801a98a00
chore(release): v0.2.11 — Cut D (FTS5 search + 회고 view)
...
- F19 promoted (✅ v0.2.11 Cut D — A+D 옵션)
- version 0.2.10 → 0.2.11 (package.json + package-lock.json)
- 단위 569 → 606 (m007 6 + tags sync 2 + ftsHelpers 7 + search 6 + reviewAggregate 5 + IPC 3 + store 3 + SearchBox 2 + ReviewView 3 = 37 신규)
- typecheck 0 errors
2026-05-10 00:41:42 +09:00
altair823
9feb712c60
feat(v0211): ReviewView — 일/주/월 회고 + 헤더 dropdown 진입점
2026-05-10 00:39:36 +09:00
altair823
be125b8ace
feat(v0211): SearchBox + 헤더 mount + inbox 결과 렌더 분기
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-10 00:35:34 +09:00
altair823
f5e43133be
feat(v0211): store — search + reviewData state + actions + view enum 확장
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-10 00:31:53 +09:00
altair823
143684ce8a
feat(v0211): InboxApi.search + reviewAggregate (types + IPC + preload)
2026-05-10 00:27:43 +09:00
altair823
e60a2a23c8
feat(v0211): ftsHelpers + NoteRepository.search + reviewAggregate
...
- ftsHelpers: sanitizeFtsQuery (FTS5 special char escape) + computeCutoff (period → KST 자정)
- search: notes_fts MATCH + status filter + rank order + sanitize + 빈 query → []
- reviewAggregate: period 별 totalCount/recentNotes(50)/tagCounts(DESC)/dueProgress(passed/pending)
2026-05-10 00:24:24 +09:00
altair823
726d155d04
feat(v0211): rebuildFtsTagsForNote 헬퍼 + tags 변경 path 통합 (single write)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-10 00:19:14 +09:00
altair823
19edeab7b1
feat(v0211): m007 migration — notes_fts FTS5 + trigger 3 + backfill
2026-05-10 00:16:35 +09:00
altair823
1104a8c666
docs(plan): v0.2.11 Cut D — FTS5 search + 회고 view (spec m006→m007 정정 + ai_title/ai_summary + note_tags JOIN)
2026-05-10 00:11:12 +09:00
c4e7536086
Merge pull request 'v0.2.10 Cut C — raw_text 가변 + revision history (F20)' ( #28 ) from worktree-v0210-cut-c-raw-text-revisions into main
...
Reviewed-on: #28
v0.2.10
2026-05-09 14:52:26 +00:00
altair823
39b8d1e728
fix(v0210): importNote 가 capture revision 을 함께 INSERT (final review fix)
...
final code review 발견: F5 import 후 first user edit 시 import 시점 본문이
note_revisions 에 없어 history 에서 사라지는 회귀. importNote transaction 안
INSERT 추가 (createdAt = edited_at).
부수 작업: ImportNoteInput / importNote 의 "raw_text invariant guard" 주석을
v0.2.10 의 'fork-on-id-collision (sync determinism)' 정확한 의미로 갱신.
테스트 +2 — insert path / fork path 모두 capture revision 검증.
2026-05-09 20:59:37 +09:00
altair823
e32223d28c
chore(release): v0.2.10 — Cut C (raw_text 가변 + revision history)
...
- F20 promoted (✅ v0.2.10 Cut C)
- version 0.2.9 → 0.2.10 (package.json + package-lock.json)
- 단위 548 → 567 (m006 5 + create rev 1 + repo 6 + IPC 4 + NoteCard 1 + Modal 2 + findById 회귀 1)
- typecheck 0 errors
2026-05-09 20:53:18 +09:00
altair823
81fbacb21e
feat(v0210): RevisionHistoryModal — 이력 목록 + 회수 confirm + chain 보존
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-09 20:51:13 +09:00
altair823
ff1a015226
feat(v0210): NoteCard 원문 영역 편집 UI (textarea + 저장/취소 + updateRawText)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-09 20:47:51 +09:00
altair823
b4c2d85b26
feat(v0210): inbox:{update-raw-text,list-revisions,restore-revision} IPC
2026-05-09 20:44:52 +09:00
altair823
7541d3c9e4
feat(v0210): NoteRepository revision API + NoteRevision type + InboxApi 시그니처
...
- updateRawText: raw_text 갱신 + user revision INSERT (atomic)
- listRevisions: edited_at DESC 순 hydrate
- restoreRevision: 옛 raw_text 를 새 user revision 으로 복원 (chain 보존)
- shared/types: NoteRevision + InboxApi 3 메서드 (updateRawText/listRevisions/restoreRevision)
- preload: 3 IPC stub 추가 (inbox:update-raw-text / inbox:list-revisions / inbox:restore-revision)
2026-05-09 20:41:17 +09:00
altair823
18deee5900
feat(v0210): NoteRepository.create 가 capture revision 을 함께 INSERT
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-09 20:36:09 +09:00
altair823
76c23457ee
feat(v0210): m006 migration — note_revisions 테이블 + capture backfill
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-09 20:32:32 +09:00
altair823
88ce78d860
docs(plan): v0.2.10 Cut C plan + spec m005→m006 정정 (Cut B 가 m005 선점)
2026-05-09 20:28:02 +09:00
altair823
07e61bc9e1
docs(plan): v0.2.9 Cut B implementation plan
...
17 task / 9 phase:
- Phase 1 (T1-2): m004 schema (status/status_changed_at/move_reason) + NoteRepository.setStatus/listByStatus + restoreNote 재구현
- Phase 2 (T3): ai_status 'disabled' enum + CaptureService aiEnabled 분기 (skip pending_jobs)
- Phase 3 (T4-5): useInbox view enum 4탭 + 헤더 4탭 UI + listByStatus IPC
- Phase 4 (T6-8): NoteCard 액션 메뉴 + MoveStatusModal (사유 입력 + 4 status 버튼) + setStatus IPC
- Phase 5 (T9-10): classifyStatus AI prompt + ai:classify-status IPC + AI 추천 UI
- Phase 6 (T11-12): OnboardingWizard 3 옵션 + 설치 가이드 + App.tsx 첫 launch 분기
- Phase 7 (T13-14): NoteCard ai_status='disabled' fallback (raw_text 첫 줄) + Banner ai_enabled=false 비활성 + HealthChecker polling 중단
- Phase 8 (T15-16): AiProviderSection AI 자동 처리 토글 + requeueDisabled (ON 전환 후 처리 버튼)
- Phase 9 (T17): 회귀 + dogfood F17/F18/F23 promoted + version 0.2.9 bump
선행 spec: 2026-05-09-v029-cut-b-design.md.
단위 472 → 약 510 (+38) 목표.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-09 17:59:00 +09:00
d59e8388b6
Merge pull request 'v0.2.9 Cut B — status 4분기 + 사유 + Ollama-less (F17/F18/F23)' ( #27 ) from worktree-v029-cut-b-status-reason-ailess into main
...
Reviewed-on: #27
v0.2.9
2026-05-09 08:43:10 +00:00
altair823
3fab44b466
chore(v029): final review minor cleanup — statusLabelWithParticle + initialTarget drop
...
- 한국어 조사 분기: '보관로/휴지통로/활성로' → '보관으로/휴지통으로/활성으로'
('완료로' 만 받침 X). 받침 jongseong 검사 helper.
- MoveStatusModal 의 unused initialTarget prop 제거 + caller (NoteCard) 정리
548/548 + typecheck 0 유지.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-09 16:46:55 +09:00
altair823
f42d03f70c
fix(v029): e2e smoke test 가 OnboardingWizard dismiss 후 inbox 진입
...
Task 11-12 의 wizard 가 첫 launch e2e 환경 차단 — "나중에 설정" 클릭으로
wizard dismiss 후 inbox 헤더/empty state 검증. 회귀 1/1 pass.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-09 16:42:14 +09:00
altair823
ba08190722
chore(release): v0.2.9 — Cut B (status 4분기 + 사유 + Ollama-less)
2026-05-09 16:40:06 +09:00
altair823
6070562358
feat(v029): NoteRepository.requeueDisabled + countByAiStatus + AiProviderSection 처리 버튼
2026-05-09 16:35:53 +09:00
altair823
c21fca57dd
feat(v029): AiProviderSection AI 자동 처리 토글 + OFF 시 안내문
2026-05-09 16:31:24 +09:00
altair823
49fbed050a
feat(v029): Banner + HealthChecker ai_enabled=false 시 비활성 (store ai_enabled field)
2026-05-09 16:25:24 +09:00
altair823
bc67dea2c8
feat(v029): NoteCard ai_status='disabled' fallback (raw_text 첫 줄 + summary/tags hide)
2026-05-09 16:25:17 +09:00
altair823
c65d6c810e
feat(v029): settings:* IPC (ai-enabled/onboarding-completed/get) + App.tsx 첫 launch 분기
2026-05-09 16:18:27 +09:00
altair823
d2c7bf1b39
feat(v029): OnboardingWizard 3 옵션 + 설치 가이드 link
2026-05-09 16:18:19 +09:00
altair823
d3150976d4
feat(v029): classifyStatus AI prompt + ai:classify-status 정식 구현 (Task 8 stub 대체)
...
- src/main/ai/classifyStatus.ts: prompt + JSON parse + 안전 fallback (archived).
- InferenceProvider.generateRaw 추가 (optional) + LocalOllamaProvider 구현
(Ollama /api/generate format:'json' 으로 raw JSON 응답 반환).
- inboxApi 의 ai:classify-status 핸들러를 stub 에서 정식 호출로 교체
(deps.repo.findById + deps.providerHolder.get + classifyStatus()).
- 신규 테스트 7건 (classifyStatus 단위) + IPC 3건 (note 없음 / AI throw / 정상).
- 회귀: 513 → 522 통과.
2026-05-09 16:09:33 +09:00
altair823
495c3d12a2
feat(v029): NoteCard 이동 메뉴 (status 4분기 dropdown)
...
Cut B Task 6 — 모든 view 공통 "이동 ▾" dropdown.
- 기존 휴지통/삭제 버튼 위치에 dropdown 추가 (모든 mode 공통)
- 현재 status 외 3개 목적지만 표시 (active 노트 → 완료/보관/휴지통)
- 메뉴 항목 클릭 → MoveStatusModal(initialTarget) 열기
- onMoved → local 상태 갱신 + onUpdated + (status 변경 시) onDeleted (list 제거)
- trash mode 의 영구 삭제/복구 버튼은 보존 (휴지통 단독 액션)
- 사용되지 않게 된 handleDelete 제거 (deleteNote 는 capture path 만)
- NoteCard 메뉴 단위 테스트 2건 (메뉴 표시 / 클릭 → modal → setStatus)
2026-05-09 16:03:40 +09:00
altair823
9eb7abc831
feat(v029): MoveStatusModal — 사유 입력 + 4 status 버튼 + AI 자동 분류 placeholder
...
Cut B Task 7 — NoteCard 메뉴가 여는 modal.
- 사유 textarea (선택) + 활성/완료/보관/휴지통 버튼 (옮기기 즉시 setStatus + onMoved)
- 빈 사유 → null reason 전달 (trim 처리)
- AI 자동 분류 버튼 → classifyStatus(stub) 호출 + 추천 표시 + 확정 버튼
- statusLabel helper export (NoteCard 메뉴에서 재사용)
- 4 단위 테스트 (render / 버튼 클릭 / AI 추천 흐름 / 빈 사유 null)
2026-05-09 16:00:51 +09:00
altair823
d4dce9bf34
feat(v029): inbox:set-status + ai:classify-status (stub) IPC
...
Cut B Task 8 — Modal/NoteCard 메뉴 path 의 IPC backbone.
- inbox:set-status: id + status + reason → repo.setStatus, invalid status 거부
- ai:classify-status: stub (Task 9 에서 Ollama provider 호출로 정식 구현)
- types.ts InboxApi.setStatus / classifyStatus 시그니처 + preload wire-up
- 4 단위 테스트 (valid/null reason/invalid status/stub shape)
2026-05-09 15:59:43 +09:00
altair823
92375edc31
feat(v029): 헤더 4탭 (Inbox/완료/보관/휴지통) + count badge
...
- App.tsx: 기존 2탭 (Inbox/휴지통) → 4탭. setView/counts 사용.
- onNavigate 도 setView 로 위임 (mirror state 동기 갱신).
- App.test: 4탭 렌더 + 클릭 → setView('completed') + aria-pressed (3 cases).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-09 15:51:59 +09:00
altair823
606ac94976
feat(v029): useInbox view enum + counts + setView + listByStatus/countsByStatus IPC
...
- store.ts: view enum ('inbox'|'completed'|'archived'|'trash'|'settings') + counts +
setView + loadByView. setShowSettings delegates to setView (mirror).
- types.ts + preload + ipc/inboxApi: listByStatus + countsByStatus IPC.
- NoteRepository.countByStatus 신규.
- store.view.test (5) + NoteRepository.countByStatus test (1).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-09 15:51:51 +09:00
altair823
fd839f6afe
feat(v029): ai_status 'disabled' enum + CaptureService ai_enabled 분기 (skip pending_jobs)
...
- AiStatus enum 'disabled' 추가 — settings.ai_enabled=false 일 때 새 노트의 초기 status.
- m005 migration: ai_status CHECK 제약을 ('pending','done','failed','disabled') 로 relax.
SQLite 가 ALTER COLUMN CHECK 미지원 → table recreate (notes_new INSERT SELECT DROP RENAME).
기존 인덱스 (idx_notes_created_at, idx_notes_ai_status, idx_notes_deleted_at) 재생성.
- SettingsService schema 에 ai_enabled / onboarding_completed (optional) 추가 +
isAiEnabled / setAiEnabled / isOnboardingCompleted / setOnboardingCompleted accessor.
기본 fallback (ai_enabled=true, onboarding_completed=false) — 기존 settings.json 무영향.
- NoteRepository.create 가 optional aiStatus 받도록 — 'pending' 외 값일 때 pending_jobs skip.
기존 caller (rawText 만 전달) 무영향.
- CaptureService deps 에 settings (좁은 AiEnabledSource 인터페이스) 추가.
submit() 가 ai_enabled 조회 → false 면 ai_status='disabled' insert + enqueue skip.
settings 미주입 시 기존 동작 (항상 enabled) 보존 — 테스트 케이스 무영향.
- main/index.ts wiring: settings: settingsSvc 주입.
Tests: 489 → 494 (CaptureService ai_enabled 2건 + m005 migration 3건). typecheck 0.
2026-05-09 15:43:01 +09:00
altair823
facbf54025
feat(v029): NoteRepository.setStatus + listByStatus + restoreNote 재구현
...
- NoteStatus 타입 추가 ('active'/'completed'/'archived'/'trashed')
- Note interface 에 status / statusChangedAt / moveReason 필드 추가
- setStatus(id, status, reason, now?) — 단일 transaction 으로 status + move_reason +
status_changed_at + updated_at 갱신. status='trashed' ↔ deleted_at 동기화
(backward compat). 그 외 status 는 deleted_at NULL.
- listByStatus(status, opts) — status 별 필터 + ORDER BY COALESCE(status_changed_at,
created_at) DESC. limit cap 200.
- hydrate 에 status / statusChangedAt / moveReason 매핑 추가. 미설정 row 는 'active' fallback.
- restoreNote 재구현 — setStatus('active', null) 로 status + deleted_at 동기화 +
v0.2.6 #10 round 1 fix (ai_status='failed'/'pending' → pending_jobs 재투입) 보존.
- 기존 테스트 fixture 5건에 새 필드 추가 (NoteCard, store.expired/recall/tagFilter/trash).
- 신규 테스트 11건 (setStatus + listByStatus + restoreNote 회귀).
2026-05-09 15:33:49 +09:00
altair823
06a1caf2bd
feat(v029): m004 마이그레이션 — status/status_changed_at/move_reason 컬럼
...
- notes 테이블 ADD COLUMN status (DEFAULT 'active'), status_changed_at, move_reason
- deleted_at != NULL 노트 → status='trashed' + status_changed_at=deleted_at 로 backfill
- index.ts registry 에 m004 추가 (runMigrations 자동 적용)
- migrations.test.ts user_version assertion 4 로 갱신
2026-05-09 15:27:15 +09:00
altair823
7d2b8c95ec
docs(v028+): F17~F25 dogfood + roadmap + Cut A~G specs + Cut A plan
...
v0.2.7 release 후 dogfood 9건 누적 (F17~F25) 정리:
- F17 휴지통 의미 분기 / F18 사유 입력 / F19 recall / F20 raw_text 가변
- F21 다기기 sync / F22 이미지 렌더링 (이미 v0.2.8 promoted) / F23 Ollama-less
- F24 멀티모달 vision / F25 사이드바 + 저장소
추가:
- v0.2.8+ roadmap: 7 cut 분할 (A~G), 12주 시간선, dependency graph
- Cut A~G design specs (각 cut 별 design 결정 + schema + UI + 테스트 전략)
- Cut A implementation plan (이미 v0.2.8 머지로 실행 완료, 참고 보존)
PR #26 머지 후 main 에 doc commits rebase 안 되어 manual merge 진행:
- F22 entry 는 origin/main 의 promoted 형태 우선
- 신규 9 파일 (specs/plan/roadmap) 은 origin/main 에 없는 파일
- "다음 항목 자리" 안내 F23 → F26 갱신
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-09 15:09:02 +09:00
b20473a593
Merge pull request 'v0.2.8 Cut A — 이미지 렌더링 + 앱 아이콘 (F22 + chore)' ( #26 ) from worktree-v028-cut-a-image-icon into main
...
Reviewed-on: #26
v0.2.8
2026-05-09 05:57:09 +00:00
altair823
6db449f86d
chore(v028): final review minor 3건 cleanup
...
- inklingMedia.ts:39 no-op replace 제거 + 명료한 host+pathname 결합 코멘트
- inbox:open-media 빈 relPath 명시적 거절 (typeof + length 검사)
- NoteCard <img> alt="" decorative 의도 코멘트
472/472 + typecheck 0 유지.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-09 14:27:42 +09:00
altair823
29259eef32
chore(release): v0.2.8 — Cut A (이미지 렌더링 + 앱 아이콘)
2026-05-09 14:23:51 +09:00
altair823
4d4dac5523
chore(v028): 앱 아이콘 (assets/icon.svg → ICO/ICNS/PNG) + electron-builder config
...
- electron-icon-builder + sharp devDep 추가
- assets/icon.svg → build/icon.{ico,icns,png} 산출 + git 추적
- electron-icon-builder 가 SVG 직접 input 안 받음 (Jimp MIME 에러) — sharp 로 SVG → PNG 1024 변환 후 input
- scripts/svg-to-png.mjs (sharp 사용 SVG→PNG) + scripts/finalize-icons.mjs (build/icons/ → build/ 정규 위치 정리)
- package.json build.{win,mac,linux}.icon 키 추가
- .gitignore: build/icons/ 와 build/icon-source.png (중간 산출물) 무시, build/icon.* 는 추적
- typecheck 0 errors + 472/472 단위 통과 유지 (회귀 없음)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-09 14:19:28 +09:00