14 Commits (6fe8a74e59ef49e3543d1031d2b85d4f686e596d)

Author SHA1 Message Date
I Luk Kim 6fe8a74e59 test+chore: 테스트 인프라·E2E 스펙·개발 문서 갱신
- 테스트 헬퍼(_factories·_fake_llm)·conftest 정비, phase18 고급기능 테스트 추가,
  federation/multiuser/risk/nl_parser/export 갱신, 폐기 시드 테스트 제거
- playwright E2E 스펙 전반 갱신, dev/phase-16-real-mail 문서 추가

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2 months ago
I Luk Kim 10fcaec080 feat(ui): 작업·인박스·설정/연동 UI + 전역 다이얼로그
- 설정→연동(계정 추가 메뉴·커넥터 목록·메일/LLM 탭), 작업 칸반·상세·댓글,
  인박스 캡처/분류 개선
- 전역 Dialog(confirm/alert) 컴포넌트로 system alert/confirm 대체
- 작업 라우팅 [[...slug]], 공용 lib(api/auth/nav/types 등)·스타일 갱신, 관련 테스트

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2 months ago
I Luk Kim ebba607f49 feat(calendar): 실연동 일정·반복(recurrence)·일정 에디터·드래그/뷰 개선
- Google/Outlook 캘린더 실연동 라우터, 회의 머티리얼라이즈 갱신
- 반복 일정·RSVP·알림, EvEditor(생성/편집) 추가, 월/주/일 뷰·미니캘린더 개선
- 라우팅 [[...slug]], 관련 테스트(api_calendar·phase16·views)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2 months ago
I Luk Kim 9db9ed7242 feat(mail): 집중/기타 분류·아리 정리(비서 다이제스트)·실폴더 + 버그 수정
- 집중/기타: Gmail 기본(primary)+Outlook focused=집중, 프로모션/소셜/업데이트+
  Outlook other=기타. 사이드바 실폴더 미러·받은편지함 탭(집중/기타 안읽음 카운트)
- 아리 정리: 기준 시각 이후 '도착한' 새 메일 기준(읽음 여부 무관 — 폰서 먼저 읽어도
  정리). LLM 배치 분석으로 할 일·일정·답장 카드화. baseline 응답 count
- 버그 수정: ① 처음 보는 폴더 클릭 시 트리 닫힘 → useMail keepPreviousData
  ② 12:28 도착 메일이 아리 정리에 안 뜸(read=1) → 도착 기준으로 전환
  ③ 기타 안읽음 미표시 → MailAccountOut.others + 탭 카운트
- HTML 본문 렌더(MailHtmlBody, 샌드박스 iframe), 라우팅 [[...slug]]

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2 months ago
I Luk Kim c5cf6816f8 feat(core): 모델·설정·DB·마이그레이션·워커·LLM 시드 갱신
- models/schemas 확장(메일 본문 HTML·received_at·폴더·inference, 발송 메일 등)
  마이그레이션 p17~p22 추가
- db.py WAL+busy_timeout(동시 sync 잠금 방지), config/runtime_config 정리
- llm(ollama/provider) 실모델 경로 정비, 워커 트리거·시드(seed/seed_mail) 갱신

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2 months ago
I Luk Kim e0937a7064 refactor(connectors): 실연동 중심 커넥터 구조 개편(Gmail·Outlook·Google/Outlook 캘린더)
- mock 커넥터 제거, provider별 real 커넥터로 정리(mail: real_gmail·real_outlook·
  outbound, calendar: real_google·real_outlook·recurrence)
- 통합 OAuth(oauth.py)·레지스트리·정규화(normalize) 갱신
- 커넥터 swap/sync 멱등 테스트 정리, contract·oauth_mock 갱신

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2 months ago
I Luk Kim 08ae47f4aa chore: 라이프OS 광역 기능 제거(agents·rag·life·research·trip·errand)
MVP 범위를 메일·일정·작업 중심으로 좁히며 사용하지 않는 서브시스템 일괄 제거.
- 백엔드: agents/·rag/, finance/health/knowledge/chat 커넥터, life/research/trip
  라우터·시드·서비스·errand 워커 잡, 관련 테스트
- 프론트: life/research/trip/errand 페이지·컴포넌트·훅·api·스타일·스펙·테스트

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2 months ago
I Luk Kim a7f830b420 feat: 포스트-MVP(phase 7~15) + 설정 페이지 전체 구현
자율성 코어(결재함·자동화), 일정·회의, 메일·알림, 리서치·여행(에이전트+RAG),
라이프 케어, 여정·하루마감, 외부 커넥터(mock→real), 능동 에이전트·멀티모달,
프로덕션 하드닝(인증/멀티유저·관측·운영·배포물)까지 phase 7~15 구현.

설정 페이지(/settings) — 좌측 6탭(계정·메일·연결·AI/LLM·외관·데이터/보안):
- LLM 연결 실시간 편집·적용(app_setting 테이블 + runtime_config 인메모리 오버레이),
  연결 테스트(Ollama /api/tags 모델 목록), 보조 프로바이더 읽기전용 표시
- 메일/연결 커넥터 관리, 프로필 편집(PATCH /me), 데이터 ZIP 내보내기, API 토큰 발급/폐기
- env 관리 ops 설정은 읽기전용(가짜 토글 금지)

기타: placeholder→실제 페이지 승격, Shell 풀스크린 /login 전환, stale 테스트 정리.
검증: backend pytest 282 / 마이그레이션 왕복, frontend vitest 177 / build / lint clean, E2E settings 7/7(a11y 0).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2 months ago
Claude b3d21f17d2 chore: Makefile→justfile + 개발 포트 unique화(31300/31800)
- Makefile 삭제 → justfile. `just run dev`(둘 다) / `just run fe` / `just run be`
  + install/test/e2e/lint/format/health/seed/migrate/clean 레시피
- 개발 포트를 흔한 dev 포트(3000/5173/8000/8080)와 충돌 없는 31xxx 대역으로:
  프론트 :3000→:31300, 백엔드 :8000→:31800. 전 참조 일괄 변경
  (package.json/next.config/lib api 기본값/playwright config·fixture/.env*.example/
   config.py FRONTEND_ORIGIN/scripts/dev.sh/CI/README)
- E2E 견고화: inbox/tasks/dashboard spec 에 beforeAll(resetSeed) 추가 →
  직렬 전체 실행에서 앞 spec 의 캡처 누적과 격리(결정성↑, 전체 39 e2e 29.7s)

검증(새 포트): 백엔드 pytest 63 · 프론트 vitest 69 · playwright 39 전부 통과,
tsc/eslint/ruff clean, build OK. 라이브: :31300↔:31800 CORS·SSR fetch·/ 리다이렉트 정상,
`just health`/`just run` 동작, 옛 포트 참조 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2 months ago
Claude c4e86e06ec Phase 6: 통합 · 연합 흐름 · QA & MVP 수용 기준
- 백엔드: test_federation(캡처→분류→확인→tasks 등장→risks 재계산→dashboard 집계,
  confirm 멱등, k1 done 후 지연위험 소멸) + test_nplus1(tree≤6/dashboard≤12 쿼리 예산)
  + /api/_test/reset(ARI_ALLOW_TEST_RESET 가드) + confirm 멱등 가드
- 프론트 E2E: federation.spec(7단계 사용자 여정) + a11y.spec(3페이지 라이트/다크/키보드,
  color-contrast 제외) + responsive.spec(모바일/태블릿/데스크톱 가로스크롤 0) + seed-reset fixture
- tokens.test(토큰 HEX/px 회귀)
- 반응형 보정: 모바일에서 .ttoolbar/.pagehead 줄바꿈 + 검색창 가변폭(가로 스크롤 제거)
- README 한 장 실행법/데모 스크립트, scripts/dev.sh, frontend/.env.local.example, CI 워크플로

최종 검증(전 phase 누적):
- 백엔드 pytest 63 passed, ruff clean
- 프론트 vitest 69 passed, tsc/eslint clean, build OK
- Playwright E2E 39 passed(연합/a11y/반응형/shell/tasks/inbox/dashboard) — axe 위반 0
- 라이브: Ollama 분류 동작(모델 비종속) + heuristic 폴백, 전 엔드포인트 200, 콘솔 에러 0
- 소스 TODO/FIXME 0

MVP 완료: 작업·인박스·대시보드 3페이지 + 연합 end-to-end.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2 months ago
Claude 09ed8497f3 Phase 5: 대시보드(Dashboard) 페이지
- 히어로 브리핑(브리핑 노트 HTML 강조 + 추천 칩 3 + 자연어 명령 입력)
- 자연어 명령 → POST capture → 토스트 → /inbox 이동
- 결재함 요약(high-risk 3건, "47분 아껴드렸어요", 대기 N건, 준비중 CTA)
- 인박스 요약(최근 3건, kind별 아이콘, /inbox CTA)
- 오늘 일정(4건·"곧" 배지·accent 바·sched-note) / 할 일(상위 5·"지금" focus·우선순위)
  / 목표(진행 막대·progressbar aria)
- 벤토 그리드(.board 4열) + cardin 진입 애니메이션 + 스켈레톤/빈/에러
- dashboard.css(dash.css+approve.css 이식), DashUser/Weather/... 타입, SWR useDashboard
- 백엔드 보정: EventOut 에 id 추가(React key), task_summary 최상위 미완료 상위 5건으로 제한

검증: 백엔드 pytest 54, 프론트 vitest 49, dashboard e2e 6 + a11y 2,
tsc/eslint/ruff clean, build OK. 라이브 시각 확인(히어로/요약/일정/할일/목표), 콘솔 에러 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2 months ago
Claude d2d7c17ad3 Phase 3: 작업(Tasks) 페이지
- 폴더 트리 사이드바(업무/개인/즐겨찾기) + 무한중첩 프로젝트 + 인라인 새 프로젝트
- 칸반(5컬럼)/리스트 2뷰 + 작업 카드(태그·담당·마감임박·우선순위·진행률·위임칩)
- 상세 드로어(DetailPanel): 리치노트·댓글·하위작업 드릴다운·메타 편집·삭제
  + Auto-Scaffolding(미리보기→적용) + 위임 추천(suggestCollaborator)
- 리스크 레이더(업무 스코프, **굵게→<b> 파서, CTA로 드로어 열기)
- SWR 서버 연동(tree/tasks/risks), 낙관적 mutate, UI상태 ari.tasks.* localStorage 영속
- tasks.css 픽셀 이식, lib/cx.ts, lib/tasks/{api,store,tree}, lib/types 확장
- 백엔드: PATCH 작업 순환참조(self/후손 parent) 400 가드 추가

검증: 백엔드 pytest 46, 프론트 vitest 32, playwright e2e 19(shell+tasks+a11y),
tsc/eslint clean, build OK. axe: color-contrast(레퍼런스 액센트 팔레트)만 제외, 나머지 0.
라이브 시각 확인: 사이드바/칸반/리스크레이더/드로어/scaffold/위임 충실 재현.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2 months ago
Claude 1cd1d10243 Phase 2: 백엔드 데이터모델·시드·REST API·Ollama 추상화
- models.py: 11개 SQLModel 테이블(person/folder/project/task/task_comment/
  inbox_item/inbox_classification/event/approval/goal/briefing), FK·enum·무한중첩 자기참조
- schemas.py: 전 I/O 스키마(types.ts 1:1, snake_case, 재귀 ProjectNode/TaskNode)
- seed.py: 지우의 한 주(REF 4파일 그대로) — 5인/2폴더/14프로젝트/45작업/4인박스/대시보드
- Alembic: init schema 마이그레이션(+sqlmodel import), base↔head 왕복 검증
- 라우터 6종: people/tree(폴더·프로젝트 CRUD·pin)/tasks(CRUD·댓글·scaffold·risks)/
  inbox(capture·reclassify·confirm 연합·dismiss)/dashboard(집계)/llm
- services: risk.py(지연/쏠림/의존, TODAY=8), scaffold.py(정규식 4템플릿), classification.py
- LLM 추상화: provider/ollama(format=json, think=false→수초 응답, 모델 비종속)/heuristic 폴백/prompts
- inbox confirm = federation(task 실체화 + materialized_task_id)

검증: pytest 38 passed, ruff clean, 마이그레이션 왕복 OK,
시드 카운트 일치, 골든 분류 4케이스 통과(heuristic),
라이브: Ollama 분류 동작(model:ollama:qwen3.6, 13s) + 폴백 동작, 전 엔드포인트 정상

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2 months ago
Claude 9075b7d1ba Phase 0: 모노레포 스캐폴딩 & 개발환경
- frontend/ (Next.js 16 App Router + TS): layout/폰트, / → /dashboard 리다이렉트,
  styles/tokens.css·globals.css, lib/api.ts·types.ts, vitest 스모크, /api rewrites
- backend/ (FastAPI + SQLite + Ollama): config/db, /api/health, /api/llm/health
  (Ollama on/off 양쪽 200), CORS, alembic init, pytest 2건
- 루트 Makefile/.gitignore/README

검증: pytest 2 passed, vitest 1 passed, ruff/eslint clean, next build OK,
/ → /dashboard 리다이렉트(Playwright), health 200, Ollama reachable, CORS 200

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2 months ago