diff --git a/docs/superpowers/specs/2026-04-25-dogfood-feedback.md b/docs/superpowers/specs/2026-04-25-dogfood-feedback.md index d609da9..ca357e2 100644 --- a/docs/superpowers/specs/2026-04-25-dogfood-feedback.md +++ b/docs/superpowers/specs/2026-04-25-dogfood-feedback.md @@ -24,7 +24,9 @@ --- -## F1. Due Date μΆ”μΆœ (πŸ”¬ drafting) +## F1. Due Date μΆ”μΆœ (πŸš€ promoted) + +**μ§„ν–‰ μƒνƒœ:** πŸš€ promoted β†’ `docs/superpowers/specs/2026-04-26-f1-due-date.md` **발견:** 2026-04-25 dogfood μ‹œμž‘ 직전 사고 μ‹€ν—˜. diff --git a/docs/superpowers/specs/2026-04-26-f1-due-date.md b/docs/superpowers/specs/2026-04-26-f1-due-date.md new file mode 100644 index 0000000..dc8d67f --- /dev/null +++ b/docs/superpowers/specs/2026-04-26-f1-due-date.md @@ -0,0 +1,50 @@ +# F1 Due Date Spec (Promoted) + +**Extracted from:** `2026-04-25-dogfood-feedback.md` F1 +**Plan:** `docs/superpowers/plans/2026-04-26-f1-due-date.md` +**Status:** πŸš€ promoted β€” implemented 2026-04-26 + +## κ²°μ • (mini-brainstorm κ²°κ³Ό) + +| κ²°μ • ν•­λͺ© | κ°’ | κ·Όκ±° | +|----------|-----|------| +| λ§€μΉ­ μš°μ„ μˆœμœ„ | κ·œμΉ™ νŒŒμ„œ μš°μ„  β†’ AI 응닡 폴백 | 결정둠적 λ§€μΉ­ μš°μ„  | +| λͺ¨ν˜Έ ν‘œν˜„ (월말, 주말, 퇴근 μ „) | κ·œμΉ™μ€ medium confidence + iso=null, AI μœ„μž„ | false positive νšŒν”Ό | +| 라벨 슬둯 | NoteCard 의 summary 와 tags 사이 인라인 (`πŸ“… YYYY-MM-DD`) | μ‹œκ° λ…Έμ΄μ¦ˆ μ΅œμ†Œ | +| 만료 ν‘œμ‹œ | νšŒμƒ‰ + μ·¨μ†Œμ„  (라벨만, λ³Έλ¬Έ λ¬΄μˆ˜μ •) | slice Β§1.1 μΉ΄ν”Ό μ •μ±… | +| μ‚¬μš©μž νŽΈμ§‘ | HTML date input, 클릭 β†’ νŽΈμ§‘ | ν‘œμ€€ UX | +| μ‹œκ° λ‹¨μœ„ / 음λ ₯ / 반볡 일정 | 미지원 | F1 Β§Out | +| 만료 μžλ™ 처리 | μ—†μŒ (μ‹œκ°λ§Œ) | dogfood ν›„ κ²°μ • | +| 별도 λ·° / μ •λ ¬ | μ—†μŒ | 후속 | +| Migration v2 backfill | NULL κΈ°λ³Έ | λΉ„νŒŒκ΄΄ | +| Pre-migration snapshot | `.pre-v.bak` (F6-L1 follow-up #4) | λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 결함 회수 | + +## λ²”μœ„ (PR μ•ˆμ— 포함됨) + +- `src/main/db/migrations/m002_due_date.ts` (μ‹ κ·œ) +- `src/main/db/migrations/index.ts` μˆ˜μ • (`latestVersion` μΆ”κ°€, m002 등둝) +- `src/main/db/index.ts` μˆ˜μ • (pre-migration μŠ€λƒ…μƒ· β€” F6-L1 후속 #4 반영) +- `src/main/services/dueDateParser.ts` (μ‹ κ·œ, 14 κ·œμΉ™) +- `src/main/ai/schema.ts` μˆ˜μ • (`due_date` ν•„λ“œ μΆ”κ°€, AiResponse ν™•μž₯) +- `src/main/ai/prompt.ts` μˆ˜μ • (`PROMPT_VERSION = 2`, `todayKst` 인자) +- `src/main/ai/InferenceProvider.ts` μˆ˜μ • (`GenerateInput.todayKst`) +- `src/main/ai/LocalOllamaProvider.ts` μˆ˜μ • (todayKst 패슀) +- `src/main/ai/AiWorker.ts` μˆ˜μ • (parseDueDate + AI 병합 + `now()` μ£Όμž…) +- `src/main/repository/NoteRepository.ts` μˆ˜μ • (`updateAiResult.dueDate?`, `setDueDate`, hydrate) +- `src/main/ipc/inboxApi.ts` μˆ˜μ • (`inbox:setDueDate` ν•Έλ“€λŸ¬) +- `src/preload/index.ts` μˆ˜μ • (`setDueDate` expose) +- `src/shared/types.ts` μˆ˜μ • (`Note.dueDate`, `Note.dueDateEditedByUser`, `InboxApi.setDueDate`) +- `src/renderer/inbox/components/NoteCard.tsx` μˆ˜μ • (`DueDateBadge` μ»΄ν¬λ„ŒνŠΈ + onSave) +- ν…ŒμŠ€νŠΈ μ‹ κ·œ/ν™•μž₯: migrations, parser, schema, repo, AiWorker β€” μ•½ +44 λ‹¨μœ„ ν…ŒμŠ€νŠΈ + +## 후속 (별 spec λ˜λŠ” 후속 ν•­λͺ© 후보) + +- 별도 due λ·° / μ •λ ¬ / ν•„ν„° +- 만료 μžλ™ 처리 (μžλ™ done λ˜λŠ” μžλ™ μ•Œλ¦Ό) +- μ‹œκ° λ‹¨μœ„ (μ˜€ν›„ 3μ‹œ, 23:30 λ“±) 처리 +- 음λ ₯ / 절기 +- 반볡 일정 (λ§€μ£Ό μ›”μš”μΌ, λ§€μ›” 1일 λ“±) +- μ™ΈλΆ€ μΊ˜λ¦°λ” 연동 (Google / Apple Calendar) +- 닀쀑 λ§€μΉ­ 처리 (ν˜„μž¬λŠ” first-match-wins; κ°€μž₯ κ°€κΉŒμš΄ / κ°€μž₯ λͺ…ν™•ν•œ λ“± μ˜΅μ…˜) +- AI λ§€μΉ­ confidence ν‘œμ‹œ (medium 일 λ•Œ μ‚¬μš©μžμ—κ²Œ "ν™•μ‹€ν•˜μ§€ μ•ŠμŒ" 힌트) +- μ‹œκ° ν‘œμ‹œ μ˜΅μ…˜ (D-day μΉ΄μš΄ν„° λ“±)