2-Layer 하이브리드 시스템:
- Layer 1 (Fetcher): 30분마다 MS Graph API로 메일/Teams 수집 →
inbox/JSON 저장 (AI 비용 없음) - Layer 2 (Processor): 매일 07:00 inbox 전체를 Claude CLI 1회 호출로 종합 업무 리포트 생성 →
daily/{date}.md+index.json - Archiver:
ARCHIVE_AFTER_MONTHS이전 데이터를archive/로 이동
workstream-kb/
├── scripts/
│ ├── fetcher.mjs # Layer 1 진입점
│ ├── processor.mjs # Layer 2 진입점
│ ├── archiver.mjs # 데이터 아카이브
│ ├── lib/
│ │ ├── config.mjs # 중앙 설정 (.env 기반)
│ │ ├── token-manager.mjs
│ │ ├── graph-client.mjs
│ │ ├── mail-fetcher.mjs
│ │ ├── teams-fetcher.mjs
│ │ ├── sync-state.mjs
│ │ ├── dedup.mjs
│ │ └── logger.mjs
│ └── prompts/
│ └── daily-report.md # 일일 리포트 프롬프트 템플릿
├── config/ # launchd plist, slash commands
├── .state/ # sync-state, processed-ids (gitignored)
├── inbox/ # raw JSON staging (gitignored)
├── daily/ # 일일 종합 리포트 (gitignored)
├── archive/ # 6개월 이후 아카이브 (gitignored)
│ └── daily/
├── index.json # 검색 인덱스 (gitignored)
└── .env # 환경 설정 (gitignored, .env.example 참조)
- ES modules (import/export), Node.js 20+
scripts/lib/config.mjs에서 모든 설정 중앙 관리 — 하드코딩 금지- Atomic file write 패턴: tmpPath에 쓰고 renameSync
- 개별 항목 실패는 전체를 중단하지 않음 (graceful degradation)
| Export | 용도 |
|---|---|
DATA_START_DATE |
데이터 수집 시작일 (이전 데이터 fetch 차단) |
ARCHIVE_AFTER_MONTHS |
N개월 후 archive/ 이동 |
INITIAL_FETCH_DAYS |
첫 실행 시 며칠 전까지 fetch |
KB_ROOT |
workstream-kb 루트 경로 |
DAILY_DIR |
일일 리포트 저장 디렉토리 |
MY_DISPLAY_NAME |
본인 표시 이름 (액션 아이템 구분용) |
- fetcher는
DATA_START_DATE(기본 2026-02-01) 이전 데이터를 가져오지 않음 ARCHIVE_AFTER_MONTHS(기본 6) 개월 지난 데이터는archive/로 이동index.json경로는 archiver가 자동 업데이트
cd scripts && npm install # 의존성 설치
node scripts/fetcher.mjs # 메일/Teams 수집
node scripts/processor.mjs # 일일 종합 리포트 생성
node scripts/archiver.mjs # 아카이브 실행KB 문서를 브라우저에서 확인할 수 있는 로컬 뷰어:
cd scripts && npm run viewer # localhost:3000 시작
cd scripts && npm run sidebar # _sidebar.md만 재생성index.html: Docsify SPA (CDN 로드, 빌드 불필요)_sidebar.md:scripts/generate-sidebar.mjs로 자동 생성 (gitignored)- 검색 플러그인 내장, front-matter 자동 숨김, 다크/라이트 테마 지원
MS365 MCP Server (~/.config/ms-365-mcp/)의 토큰 캐시를 공유. 별도 OAuth 불필요.