You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
- 백엔드: 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 | |
|---|---|---|
| .github/workflows | 2 months ago | |
| backend | 2 months ago | |
| design-reference | 2 months ago | |
| dev | 2 months ago | |
| frontend | 2 months ago | |
| scripts | 2 months ago | |
| .gitignore | 2 months ago | |
| Makefile | 2 months ago | |
| README.md | 2 months ago | |
README.md
아리(Ari) — AI Life OS
일·삶을 한곳에서 관리하는 한국어 AI 개인비서 아리의 MVP. 핵심 철학: "적을 때는 분류하지 않는다 — 분류·배치·자동화는 아리가." 사용자는 읽고 탭 한 번, 나머지는 아리가 합니다.
MVP 3페이지 — 작업(/tasks) · 인박스(/inbox) · 대시보드(/dashboard). 나머지 10개 내비 항목은 "준비 중" 플레이스홀더(내비 일관성 유지).
workspace/
├─ frontend/ Next.js 16 (App Router, TypeScript) · next-themes · SWR · Vitest · Playwright
├─ backend/ FastAPI · SQLite(SQLModel·Alembic) · Ollama 추상화(모델 비종속, heuristic 폴백)
├─ dev/ 개발 문서 (overview.md + phase-0~6)
└─ design-reference/ 원본 프로토타입 (픽셀 충실 재현 기준)
스택
| 레이어 | 선택 |
|---|---|
| 프론트엔드 | Next.js(App Router) + React 19 + TypeScript, 순수 CSS 변수 토큰, next-themes 테마 |
| 백엔드 | Python + FastAPI + SQLite(SQLModel + Alembic) |
| LLM | 로컬 Ollama + LLMProvider 추상화(모델 비종속, OLLAMA_MODEL 주입). 미가용 시 HeuristicProvider 폴백 |
| 테스트 | pytest(백엔드) / Vitest·Playwright·axe(프론트) |
빠른 시작
0) 사전 설치
Node ≥ 20 · pnpm · Python ≥ 3.11 · uv · (선택) Ollama
1) 의존성 + 환경변수 + 시드
make install # frontend(pnpm) + backend(uv) 의존성
cp backend/.env.example backend/.env # 필요 시 OLLAMA_MODEL 등 수정
cp frontend/.env.local.example frontend/.env.local
cd backend && uv run alembic upgrade head && uv run python -m app.seed && cd ..
2) (선택) Ollama — 모델 비종속
ollama serve &
ollama pull <설치할_모델> # backend/.env 의 OLLAMA_MODEL 과 일치시킬 것 (특정 모델 강제 아님)
Ollama가 없거나 느리면 자동으로 규칙 기반(HeuristicProvider)으로 분류가 계속됩니다.
LLM_PROVIDER=heuristic로 강제할 수도 있습니다(테스트·오프라인).
3) 실행
make dev # backend :8000 + frontend :3000 (또는 scripts/dev.sh)
# http://localhost:3000 → / 는 /dashboard 로 리다이렉트
4) 스모크 / 테스트
make health # /api/health, /api/llm/health
make test # pytest + vitest
make lint # ruff + eslint
# E2E (백엔드는 리셋 허용 + heuristic 으로 기동해야 federation/a11y/responsive 전부 통과)
ARI_ALLOW_TEST_RESET=1 LLM_PROVIDER=heuristic uv run --directory backend uvicorn app.main:app --port 8000 &
cd frontend && pnpm exec playwright test
시드 초기화(데모 리셋)
cd backend && rm -f ari.db && uv run alembic upgrade head && uv run python -m app.seed
# 또는 E2E용(가드): ARI_ALLOW_TEST_RESET=1 로 기동 후
curl -X POST http://localhost:8000/api/_test/reset
환경변수
| 변수 | 위치 | 기본값 | 설명 |
|---|---|---|---|
OLLAMA_HOST |
backend .env |
http://localhost:11434 |
Ollama HTTP 엔드포인트 |
OLLAMA_MODEL |
backend .env |
(설치 모델 주입) | 분류용 모델명 — 비종속(env로만 지정) |
LLM_PROVIDER |
backend env | auto |
auto|ollama|heuristic (테스트/E2E는 heuristic) |
LLM_TIMEOUT |
backend env | 30 |
분류 1건 타임아웃(초). 초과 시 heuristic 폴백 |
DATABASE_URL |
backend .env |
sqlite:///./ari.db |
DB 경로 |
FRONTEND_ORIGIN |
backend .env |
http://localhost:3000 |
CORS 허용 출처(콤마구분) |
ARI_ALLOW_TEST_RESET |
backend env | (미설정) | 1이면 /api/_test/reset 허용(E2E 전용, 운영 403) |
NEXT_PUBLIC_API_BASE |
frontend .env.local |
http://localhost:8000 |
프론트가 호출할 백엔드 베이스 |
연합(federation) 흐름 — MVP의 핵심
- 인박스에 한 줄 적기 → 아리가 즉시 작업/일정/아이디어 + 업무/개인 + 행선지 프로젝트로 분류.
- 확인(탭 한 번) → 실제
task로 실체화(materialized_task_id연결). - 작업 페이지의
개인 › 여행 — 한국에 등장 — 개인 일도 숨기지 않고 업무 작업과 같은 트리에서 필터로만 구분. - 작업 데이터로 리스크 레이더(지연·쏠림·의존성)가 자동 재계산, 대시보드가 작업/인박스/결재함을 집계.
데모 스크립트(약 3분)
- 대시보드 진입 — 아침 브리핑/일정/할 일/목표/결재함·인박스 요약.
- 인박스에서
다음 주에 한국 놀러가는 비행기 티켓 사기캡처 → 자동 분류(작업/개인 › 여행 — 한국 + 이유). - "좋아요, 그렇게 해줘" → 실체화.
- 작업 → 개인 필터 → 여행 — 한국에 등장(개인도 숨기지 않음).
- 업무 필터 → 리스크 레이더 "분기 리포트가 오늘 마감인데 진행 중".
- 대시보드 복귀 → 요약 반영.
문서
개발 문서 진입점은 dev/overview.md. 빌드 순서: phase-0 → phase-1 → phase-2 → (phase-3 작업 → phase-4 인박스 → phase-5 대시보드) → phase-6 통합.