altair823 df56661f4f feat(diag): log resolved Ollama endpoint + surface health reason in banner
When the OllamaBanner appears, it was generic enough that the user
couldn't tell whether the env var was missing, the LAN host was
unreachable, the model was uninstalled, or DNS was failing. Log the
resolved endpoint at startup with a `fromEnv` flag so we can confirm
INKLING_OLLAMA_ENDPOINT was actually read, and render the underlying
health-check reason as a small subtitle under the banner copy.

The user-facing primary message still avoids the forbidden tone words
("실패"/"끊김"/"연속 실패"); the diagnostic line is technical and only
appears when status.reason is set.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 16:20:57 +09:00
2026-04-24 19:15:52 +00:00

Inkling

기록 습관이 없는 사람도 3초 안에 던지고, 로컬 AI가 정리하고, 나중에 업무 자산으로 회수할 수 있게 해주는 데스크톱 메모 앱이다. "메모 = 잊기 전에 머리에서 꺼내는 1회 행동"으로 행동 기준을 낮추고, 정리는 Ollama가 맡는다.

이 저장소는 슬라이스 v0.4 단계다 — 가장 얇은 종단 경로(Quick Capture → SQLite → 로컬 Ollama → Inbox)만 동작한다. 음성·검색·내보내기·온보딩·캘린더 트리거는 후속 spec의 범위.


상태

  • 버전: Slice v0.4
  • 플랫폼: Windows(dogfood 우선) + macOS(빌드 통과 수준)
  • 테스트: 단위 52/52, e2e smoke 1/1, typecheck/build 통과
  • 종료 조건: 본인 2주 dogfood 완주 + AI 결과 7/10 수용 + 크래시 0회 (spec §1.3)

사전 요구

항목 버전/메모
Node 24.15.0 (.nvmrc) — Volta 권장, nvm-windows도 가능
Visual Studio Build Tools 2022 + "Desktop development with C++" 워크로드 (better-sqlite3 빌드용)
Ollama LAN 서버에서 실행, gemma4:e4b 모델 pull (8.0B Q4_K_M, 효율 변형)
Git for Windows 최신

LAN Ollama 엔드포인트는 환경변수 INKLING_OLLAMA_ENDPOINT 로 주입한다.

INKLING_OLLAMA_ENDPOINT=http://192.168.0.47:11434

미설정 시 http://localhost:11434 로 폴백.


시작하기

# 1. 의존성 설치
npm install

# 2. 개발 모드 (electron-vite dev)
npm run dev

# 3. 프로덕션 빌드
npm run build

# 4. 빌드 결과 실행
npm start

전역 단축키: Ctrl+Shift+J (Windows) / Cmd+Shift+J (macOS). Quick Capture 창이 화면 중앙 상단에 뜬다. 한 줄 던지고 Ctrl+Enter 로 저장.


테스트

# 단위 테스트 (vitest)
npm test

# 통합 테스트 (실제 Ollama 호출, 게이트됨)
npm run test:integration

# e2e smoke 테스트 (Playwright + Electron)
npm run test:e2e

# 타입 체크
npm run typecheck

Native ABI 함정

better-sqlite3 는 두 가지 런타임에서 호출된다 — vitest(Node ABI)와 Electron(ABI 145). 한 번에 한 ABI 로만 빌드되므로 npm 스크립트가 자동으로 prebuild-install 을 돌린다.

  • pretest / pretest:integrationrebuild:node
  • pretest:e2e / prestart / predevrebuild:electron

새 native dep 을 추가하거나 Electron 메이저 버전을 올리면 package.jsonrebuild:* 스크립트도 갱신해야 한다.

ELECTRON_RUN_AS_NODE 함정

이 환경변수가 부모 셸에 살아있으면 Electron main-process 모듈 hook 이 비활성화돼 require('electron') 이 path string 만 반환한다. e2e 스펙에서 launch env 단계에 명시적으로 strip 한다. 새 main-launch 스크립트를 작성할 때도 동일 strip 필요.


아키텍처

src/
  main/              Electron main process
    db/              SQLite + 마이그레이션
    repository/      NoteRepository (CRUD + edited-flag overwrite guard)
    services/        Capture, Continuity, Hotkey, Intent, Notification, MediaStore, MediaGc, HealthChecker
    ai/              InferenceProvider 인터페이스 + LocalOllamaProvider + AiWorker (3-attempt backoff)
    ipc/             contextBridge용 IPC 핸들러
    windows/         Inbox + QuickCapture BrowserWindow 팩토리
    tray.ts          Tray 아이콘 + 메뉴
    paths.ts         프로필 디렉터리 해석
    logger.ts        electron-log 래퍼 (raw_text 절대 미기록)
  preload/           contextBridge로 typed API expose
  renderer/
    inbox/           React 19 + Zustand 스토어
    quickcapture/    React 19, frameless 640x280
  shared/
    types.ts         IPC 계약 타입
    intentPrompts.ts 의미 한 줄 회전 카피 4종
tests/
  unit/              vitest, 52 cases
  integration/       Ollama golden test (게이트됨)
  e2e/               Playwright smoke
docs/
  superpowers/specs/    설계 문서
  superpowers/plans/    구현 계획
  superpowers/strategy/ 심리학·dogfooding 전략
  handoff/              세션 간 핸드오프
inkling.md         원본 제품 브리프 v1.4

핵심 흐름은 Capture → Clarify → Capitalize 3단계 (Strategy §2). 슬라이스에서는 Capture + Clarify 만 다루고 Capitalize(Confluence 내보내기·주간 회고) 는 후속.


Load-bearing 불변 (재논의 금지)

이 규칙들은 spec, 테스트, 코드 곳곳에 박혀 있다. 변경하려면 spec v0.4 §3.3 부터 다시 검토.

  1. raw_text 는 불변. update method 없음. 추가 금지.
  2. AI 재실행은 user-edited 필드를 덮어쓰지 않는다. *_edited_by_user 컬럼 + CASE WHEN 가드.
  3. IntentBanner 는 노트당 정확히 1회. intent_prompted_at IS NULL 이 게이트. setIntent · dismissIntent 둘 다 게이트 닫음.
  4. 로그에 본문 금지. raw_text / ai_title / ai_summary / user_intent 내용 절대 미기록. ID, 길이, 해시 prefix 만.
  5. "실패", "끊김", "연속 실패" 단어는 모든 UI 문자열에서 금지. 회복 친화 톤이 강제.
  6. 네이티브 알림은 submit 을 절대 막지 않는다. 권한 거부 = silent fallback. 캡처는 계속 동작.
  7. 버전은 정확 pin (^ 금지). package.json 갱신 시 spec §7.2 와 동시 업데이트.

Quick Capture 제약

  • 단일 입력창, 텍스트 + 클립보드 이미지만.
  • 제목·태그·폴더 선택 강요 안 함 (Strategy §2.1).
  • 저장 직후 OS 네이티브 토스트 1개 (회전 카피 4종).
  • AI 처리는 비동기 — 저장은 즉시, 정리는 백그라운드.

Inbox 제약

  • 날짜 내림차순 리스트, 같은 ms 동기화 시 id DESC 보조 정렬.
  • AI 필드(제목·요약) 는 인라인 편집 가능. 편집 시 *_edited_by_user=1 셋 → 이후 AI 재실행은 해당 필드 보존.
  • 원문은 read-only.
  • AI 가 생성한 필드 옆에 회색 "AI" 라벨. 사용자 편집 시 라벨 사라짐 ("내 메모" 정체성 표시).
  • "의미 한 줄" 배너는 AI done 직후 1회만, skip 시 해당 카드에선 다시 안 뜸.
  • Weekly Continuity 배지: 7건/주 (KST 월~일). 0/7 도 "이번 주 한 줄이면 시작입니다".

문서

문서 경로 용도
제품 브리프 inkling.md 원본 v1.4, 전체 비전
심리학 전략 docs/superpowers/strategy/strategy.md 행동 변화 모델, 회복 친화 스트릭
Dogfooding 전략 docs/superpowers/strategy/dogfood-strategy.md 2주 자기 dogfood 운영안
슬라이스 설계 docs/superpowers/specs/2026-04-24-inkling-vertical-slice-design.md v0.4 spec, 부하 전달 결정의 출처
구현 계획 docs/superpowers/plans/2026-04-24-inkling-vertical-slice.md 33-task TDD 플랜
핸드오프 docs/handoff/2026-04-25-linux-to-windows.md Linux→Windows 전환 메모

라이선스

비공개. 본인 dogfood + 10인 사내 베타까지의 스코프.

Description
No description provided
Readme 7.3 MiB
2026-05-15 06:35:49 +00:00
Languages
TypeScript 99.6%
HTML 0.3%
JavaScript 0.1%