@open330/kiwimu 0.7.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +189 -62
- package/package.json +1 -1
- package/src/build/renderer.ts +273 -32
- package/src/build/static/dynamic-qa.js +423 -0
- package/src/build/static/edit-page.js +58 -0
- package/src/build/static/peek-panel.css +201 -0
- package/src/build/static/peek-panel.js +470 -0
- package/src/build/static/search.js +30 -15
- package/src/build/static/style.css +821 -6
- package/src/build/templates.ts +757 -49
- package/src/config.ts +41 -3
- package/src/demo/sample-data.ts +75 -8
- package/src/demo/setup.ts +26 -7
- package/src/expand/llm.ts +2 -2
- package/src/index.ts +497 -64
- package/src/ingest/docx.ts +1 -1
- package/src/ingest/markdown.ts +21 -0
- package/src/ingest/pdf.ts +4 -2
- package/src/llm-client.ts +63 -69
- package/src/pipeline/citations.ts +107 -0
- package/src/pipeline/llm-chunker.ts +281 -128
- package/src/pipeline/standardizer.ts +41 -0
- package/src/server.ts +466 -33
- package/src/services/dynamic-qa.ts +190 -0
- package/src/services/embedding.ts +122 -0
- package/src/services/index-generator.ts +185 -0
- package/src/services/ingest.ts +84 -26
- package/src/services/lint.ts +249 -0
- package/src/services/promote.ts +150 -0
- package/src/store.test.ts +11 -0
- package/src/store.ts +652 -15
- package/src/utils.ts +30 -0
package/README.md
CHANGED
|
@@ -4,28 +4,63 @@
|
|
|
4
4
|
|
|
5
5
|
# Kiwi Mu
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
**Turn any textbook into your personal learning wiki**
|
|
8
8
|
|
|
9
|
-
전공책, PDF, 웹 콘텐츠를 넣으면 — LLM이
|
|
9
|
+
전공책, PDF, 웹 콘텐츠를 넣으면 — LLM이 자동으로 상호 링크된 학습 위키 + 퀴즈를 생성합니다.
|
|
10
10
|
|
|
11
|
+
[](https://www.npmjs.com/package/@open330/kiwimu)
|
|
11
12
|
[](https://bun.sh)
|
|
12
13
|
[](https://typescriptlang.org)
|
|
13
14
|
[](LICENSE)
|
|
14
15
|
|
|
16
|
+
<br>
|
|
17
|
+
|
|
18
|
+
<img src="https://github.com/Open330/kiwimu/raw/main/.context/marketing/demo.gif" alt="kiwimu v1.1 데모: 본문 드래그 → 질문 → 위키 페이지로 저장" width="720">
|
|
19
|
+
|
|
20
|
+
<br>
|
|
21
|
+
|
|
22
|
+
> **v1.1 — 위키는 만드는 게 아니라 자라는 거였다.**
|
|
23
|
+
> 본문 드래그 → 팝오버 질문 → AI 답변 → 한 번 클릭으로 정식 위키 페이지로 승격. ([상세 글](https://jiun.dev/posts/kiwimu-v1-1))
|
|
24
|
+
|
|
15
25
|
</div>
|
|
16
26
|
|
|
17
27
|
---
|
|
18
28
|
|
|
29
|
+
## What's new in v1.1
|
|
30
|
+
|
|
31
|
+
- 🔖 **출처 추적 (Provenance Tracking)** — 모든 AI 생성 문장에 인라인 인용 자동 부착, 출처 커버리지 행렬 제공
|
|
32
|
+
- 🧱 **스키마 레이어** — `kiwi.toml`의 5줄로 카테고리·용어·페이지 템플릿을 정의하면 LLM이 그 안에서만 작동
|
|
33
|
+
- 💬 **질문 → 위키 승격** — 본문 드래그 → 질문 → "위키에 저장" 한 번이면 정식 페이지. 중복 자동 감지
|
|
34
|
+
- 📑 **콘텐츠 카탈로그** — 자동 카테고리 분류 + 출처 커버리지 한눈 보기
|
|
35
|
+
- 📈 **활동 로그** — 페이지 생성·질문·프로모트·스키마 변경이 시간선으로 누적
|
|
36
|
+
- 👁️ **링크 미리보기 (Peek Panel)** — `/wiki/*` 링크 클릭 시 우측 슬라이드 패널로 미리보기, 확장 버튼으로 전체 이동. 너비 드래그 조절·다이어그램·인라인 편집·드래그 Q&A까지 패널 안에서 그대로 동작
|
|
37
|
+
- 🗂️ **트랙 그룹핑 (Track Grouping)** — `kiwi.toml` 설정으로 사이드바·인덱스를 자동 카테고리(트랙)별로 묶어서 표시
|
|
38
|
+
- 🔑 **인증 토큰 영속화** — 서버 재시작해도 쿠키 기반으로 인증 유지 (관리 페이지·동적 Q&A 한 번 로그인하면 끝)
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## 30초 데모 체험
|
|
43
|
+
|
|
44
|
+
API key 없이 바로 체험할 수 있습니다:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
mkdir my-wiki && cd my-wiki
|
|
48
|
+
bunx @open330/kiwimu init --demo
|
|
49
|
+
# → 양자역학 샘플 위키 + 학습 퀴즈가 즉시 생성됩니다
|
|
50
|
+
# → http://localhost:8000 에서 확인하세요
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
19
55
|
## Quickstart for Agents
|
|
20
56
|
|
|
21
57
|
<div><img src="https://quickstart-for-agents.vercel.app/api/header.svg?theme=claude-code&logo=kiwimu&title=Set+up+a+learning+wiki+from+any+textbook+or+URL&lang=Agents&font=mono&mascot=hat" width="100%" /></div>
|
|
22
58
|
|
|
23
59
|
```
|
|
24
|
-
git clone https://github.com/Open330/kiwimu.git && cd kiwimu && bun install
|
|
25
60
|
mkdir my-wiki && cd my-wiki
|
|
26
|
-
bunx kiwimu init
|
|
27
|
-
bunx kiwimu add "<YOUR_URL_OR_PDF>"
|
|
28
|
-
bunx kiwimu serve
|
|
61
|
+
bunx @open330/kiwimu init
|
|
62
|
+
bunx @open330/kiwimu add "<YOUR_URL_OR_PDF>"
|
|
63
|
+
bunx @open330/kiwimu serve
|
|
29
64
|
```
|
|
30
65
|
|
|
31
66
|
<div><img src="https://quickstart-for-agents.vercel.app/api/footer.svg?theme=claude-code&text=copy+this+prompt+%C2%B7+paste+into+your+agent+%C2%B7+get+a+learning+wiki&font=mono" width="100%" /></div>
|
|
@@ -40,27 +75,69 @@ Kiwi Mu는 LLM을 활용해 이 연결을 **자동으로** 만들어, 지식을
|
|
|
40
75
|
- **LLM 기반 문서 분석** — 챕터/섹션 구조를 보존한 원본 페이지 + 핵심 개념별 자동 생성 페이지
|
|
41
76
|
- **원본/개념 분리** — 📖 원본 문서와 📝 개념 문서를 시각적으로 구분
|
|
42
77
|
- **자동 상호 링크** — 원본↔개념 간 유기적 cross-link + 외부 참고 자료 (Wikipedia 등)
|
|
78
|
+
- **Dynamic Q&A** — 텍스트 드래그 → 팝오버 질문 → LLM이 새 개념 페이지 자동 생성 + 하이라이트 링크
|
|
79
|
+
- **웹 페이지 편집** — serve 모드에서 ✏️ 마크다운 편집
|
|
80
|
+
- **SM-2 간격 반복** — Anki 스타일 SRS (퀴즈 자동 생성 포함)
|
|
81
|
+
- **학습 대시보드** — 숙달도, 약한 개념, 복습 일정 시각화
|
|
82
|
+
- **MD 파일 + 디렉토리 일괄 인제스트** — `kiwimu add <directory>`로 .md 파일 일괄 처리
|
|
83
|
+
- **LaTeX 수식 렌더링** — KaTeX 기반 수학 수식 지원
|
|
84
|
+
- **Mermaid 다이어그램 지원** — Mermaid.js 기반 다이어그램 렌더링
|
|
43
85
|
- **지식 그래프** — D3.js 인터랙티브 그래프 (원본: 파란색, 개념: 초록색)
|
|
86
|
+
- **데모 모드** — API key 없이 `--demo`로 즉시 체험 (양자역학 + 자료구조)
|
|
87
|
+
- **다양한 파일 지원** — URL, PDF, DOCX, PPTX, PPT, DOC, KEY, RTF, **MD** (디렉토리 일괄 인제스트 지원)
|
|
88
|
+
- **4개 LLM 프로바이더** — Google Gemini, Azure OpenAI, OpenAI, Anthropic
|
|
89
|
+
- **다크 모드** — 시스템 테마에 자동 대응 (100% 커버리지)
|
|
90
|
+
- **모바일 지원** — 햄버거 메뉴 + 슬라이드 사이드바
|
|
91
|
+
- **접근성** — ARIA 속성, 검색 키보드 네비게이션
|
|
44
92
|
- **웹 UI** — 브라우저에서 문서 추가, 설정 변경, 빌드 실행
|
|
45
|
-
- **다양한 파일 지원** — URL, PDF, DOCX, PPTX, PPT, DOC, KEY
|
|
46
|
-
- **다중 LLM 프로바이더** — Google Gemini, Azure OpenAI, OpenAI, Anthropic
|
|
47
93
|
- **토큰 사용량 추적** — API 호출 수, 토큰, 예상 비용을 웹에서 확인
|
|
48
94
|
- **원클릭 배포** — GitHub Pages / Vercel
|
|
95
|
+
- **라이브 데모** — [kiwimu.internal.jiun.dev](https://kiwimu.internal.jiun.dev)
|
|
96
|
+
|
|
97
|
+
## vs. Alternatives
|
|
98
|
+
|
|
99
|
+
| Feature | Kiwi Mu | NotebookLM | Obsidian | Anki |
|
|
100
|
+
|---------|---------|------------|----------|------|
|
|
101
|
+
| Auto wiki from PDF | ✅ | ❌ | ❌ | ❌ |
|
|
102
|
+
| Knowledge graph | ✅ | ❌ | ✅ (plugin) | ❌ |
|
|
103
|
+
| Auto quiz generation | ✅ | ❌ | ❌ | ❌ (manual) |
|
|
104
|
+
| Spaced repetition | ✅ (basic) | ❌ | ❌ | ✅ |
|
|
105
|
+
| Self-hosted | ✅ | ❌ | ✅ | ✅ |
|
|
106
|
+
| One-click deploy | ✅ | ❌ | ❌ | ❌ |
|
|
107
|
+
| Open source | ✅ | ❌ | ❌ | ✅ |
|
|
108
|
+
| Free | ✅ | ✅ | Freemium | ✅ |
|
|
49
109
|
|
|
50
110
|
## Quick Start
|
|
51
111
|
|
|
52
112
|
### 설치
|
|
53
113
|
|
|
54
114
|
```bash
|
|
55
|
-
|
|
56
|
-
|
|
115
|
+
# npm/bunx로 바로 사용 (설치 불필요)
|
|
116
|
+
bunx @open330/kiwimu init
|
|
117
|
+
|
|
118
|
+
# 또는 글로벌 설치
|
|
119
|
+
bun add -g @open330/kiwimu
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### 데모 모드 (API key 불필요)
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
mkdir my-wiki && cd my-wiki
|
|
126
|
+
bunx @open330/kiwimu init --demo
|
|
57
127
|
```
|
|
58
128
|
|
|
129
|
+
양자역학 샘플 위키가 생성되어 바로 체험할 수 있습니다:
|
|
130
|
+
- 📖 원본 문서 + 📝 개념 페이지
|
|
131
|
+
- 🔗 자동 상호 링크
|
|
132
|
+
- 📊 지식 그래프
|
|
133
|
+
- 📝 학습 퀴즈
|
|
134
|
+
- 🎲 임의 문서 탐험
|
|
135
|
+
|
|
59
136
|
### 프로젝트 생성 (Interactive CLI)
|
|
60
137
|
|
|
61
138
|
```bash
|
|
62
139
|
mkdir my-wiki && cd my-wiki
|
|
63
|
-
bunx kiwimu init
|
|
140
|
+
bunx @open330/kiwimu init
|
|
64
141
|
```
|
|
65
142
|
|
|
66
143
|
Interactive 프롬프트가 실행됩니다:
|
|
@@ -78,7 +155,7 @@ Interactive 프롬프트가 실행됩니다:
|
|
|
78
155
|
│ ○ Anthropic Claude
|
|
79
156
|
|
|
80
157
|
◆ 모델명
|
|
81
|
-
│ gemini-
|
|
158
|
+
│ gemini-3.1-flash-lite-preview
|
|
82
159
|
|
|
83
160
|
◆ API Key
|
|
84
161
|
│ ••••••••••••
|
|
@@ -86,68 +163,79 @@ Interactive 프롬프트가 실행됩니다:
|
|
|
86
163
|
🥝 'Radio Astronomy Wiki' 위키가 생성되었습니다!
|
|
87
164
|
```
|
|
88
165
|
|
|
89
|
-
이름을 바로 지정할 수도 있습니다:
|
|
90
|
-
|
|
91
|
-
```bash
|
|
92
|
-
bunx kiwimu init "My Study Wiki"
|
|
93
|
-
```
|
|
94
|
-
|
|
95
166
|
### 문서 추가
|
|
96
167
|
|
|
97
168
|
```bash
|
|
98
169
|
# URL 추가
|
|
99
|
-
bunx kiwimu add "https://www.cv.nrao.edu/~sransom/web/Ch1.html"
|
|
170
|
+
bunx @open330/kiwimu add "https://www.cv.nrao.edu/~sransom/web/Ch1.html"
|
|
100
171
|
|
|
101
|
-
# PDF
|
|
102
|
-
bunx kiwimu add textbook.pdf
|
|
172
|
+
# 파일 추가 (PDF, DOCX, PPTX, DOC, PPT, KEY, RTF)
|
|
173
|
+
bunx @open330/kiwimu add textbook.pdf
|
|
174
|
+
bunx @open330/kiwimu add lecture.pptx
|
|
103
175
|
```
|
|
104
176
|
|
|
105
177
|
LLM이 문서를 분석하여:
|
|
106
178
|
1. 📖 **원본 페이지** — 원래 챕터/섹션 구조 보존
|
|
107
179
|
2. 📝 **개념 페이지** — 핵심 용어·정의·법칙 자동 생성
|
|
108
180
|
3. 🔗 **Cross-link** — 원본↔개념 간 유기적 연결
|
|
181
|
+
4. 📝 **퀴즈** — 개념별 학습 퀴즈 자동 생성
|
|
182
|
+
|
|
183
|
+
### 학습 퀴즈
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
# 터미널에서 퀴즈 풀기
|
|
187
|
+
bunx @open330/kiwimu quiz
|
|
188
|
+
|
|
189
|
+
# 문제 수 지정
|
|
190
|
+
bunx @open330/kiwimu quiz -n 10
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
웹에서도 `http://localhost:8000/quiz.html`에서 카드 플립 방식으로 퀴즈를 풀 수 있습니다.
|
|
194
|
+
|
|
195
|
+
### Dynamic Q&A
|
|
196
|
+
|
|
197
|
+
위키 페이지에서 이해가 안 되는 부분을 드래그하면, 팝오버가 나타나 LLM에게 질문할 수 있습니다.
|
|
198
|
+
|
|
199
|
+
1. **텍스트 드래그** — 궁금한 구절을 선택
|
|
200
|
+
2. **팝오버 질문** — "이게 뭐야?", 자유 질문, 또는 자동 생성 질문 선택
|
|
201
|
+
3. **새 개념 페이지 생성** — LLM이 답변을 새로운 개념 페이지로 자동 생성
|
|
202
|
+
4. **하이라이트 링크** — 드래그한 텍스트가 새 페이지로의 링크로 변환
|
|
203
|
+
|
|
204
|
+
`kiwimu serve` 모드에서 실시간으로 동작합니다. 학습 중 발생하는 궁금증을 즉시 해결하고, 위키가 유기적으로 확장됩니다.
|
|
109
205
|
|
|
110
206
|
### 빌드 및 서버
|
|
111
207
|
|
|
112
208
|
```bash
|
|
113
209
|
# 정적 사이트 빌드
|
|
114
|
-
bunx kiwimu build
|
|
210
|
+
bunx @open330/kiwimu build
|
|
115
211
|
|
|
116
212
|
# 로컬 서버 실행 (웹에서 문서 추가 가능)
|
|
117
|
-
bunx kiwimu serve
|
|
213
|
+
bunx @open330/kiwimu serve
|
|
118
214
|
# → http://localhost:8000
|
|
119
215
|
|
|
120
216
|
# 포트 변경
|
|
121
|
-
bunx kiwimu serve -p 3000
|
|
122
|
-
|
|
123
|
-
# 네트워크에 공개 (0.0.0.0)
|
|
124
|
-
bunx kiwimu serve --host 0.0.0.0
|
|
217
|
+
bunx @open330/kiwimu serve -p 3000
|
|
125
218
|
```
|
|
126
219
|
|
|
127
|
-
### 웹 UI에서 문서 추가
|
|
128
|
-
|
|
129
|
-
`kiwimu serve` 실행 후 http://localhost:8000 에서:
|
|
130
|
-
- **🔗 URL 탭** — URL 입력 후 추가
|
|
131
|
-
- **📄 파일 업로드 탭** — PDF, DOCX, PPTX 등 드래그앤드롭 업로드
|
|
132
|
-
- 진행 상태 실시간 표시, 완료 시 자동 새로고침
|
|
133
|
-
|
|
134
220
|
### 관리 페이지
|
|
135
221
|
|
|
136
|
-
|
|
222
|
+
`kiwimu serve` 실행 후 콘솔에 표시되는 관리 URL (`/manage?token=...`)로 접속:
|
|
137
223
|
- 위키 이름 변경
|
|
138
224
|
- LLM 프로바이더/모델/API Key 설정
|
|
139
225
|
- 토큰 사용량 및 예상 비용 확인
|
|
140
|
-
-
|
|
226
|
+
- 파일 업로드 (PDF, DOCX, PPTX 등)
|
|
227
|
+
- URL 추가
|
|
141
228
|
- 수동 빌드 실행
|
|
229
|
+
- 페르소나 관리
|
|
142
230
|
|
|
143
231
|
### 배포
|
|
144
232
|
|
|
145
233
|
```bash
|
|
146
234
|
# GitHub Pages (기본)
|
|
147
|
-
bunx kiwimu deploy
|
|
235
|
+
bunx @open330/kiwimu deploy
|
|
148
236
|
|
|
149
237
|
# Vercel
|
|
150
|
-
bunx kiwimu deploy --target vercel
|
|
238
|
+
bunx @open330/kiwimu deploy --target vercel
|
|
151
239
|
```
|
|
152
240
|
|
|
153
241
|
## Commands
|
|
@@ -155,10 +243,14 @@ bunx kiwimu deploy --target vercel
|
|
|
155
243
|
| 명령 | 설명 |
|
|
156
244
|
|------|------|
|
|
157
245
|
| `kiwimu init [name]` | 새 위키 프로젝트 생성 (interactive CLI) |
|
|
158
|
-
| `kiwimu
|
|
246
|
+
| `kiwimu init --demo` | 샘플 데이터로 즉시 체험 (API key 불필요) |
|
|
247
|
+
| `kiwimu add <source>` | URL 또는 파일 추가 (PDF, DOCX, PPTX, DOC, PPT, KEY, RTF, MD) |
|
|
248
|
+
| `kiwimu add <directory>` | 디렉토리 내 모든 .md 파일 일괄 인제스트 |
|
|
159
249
|
| `kiwimu build` | 정적 위키 사이트 빌드 |
|
|
160
|
-
| `kiwimu serve [-p port]
|
|
161
|
-
| `kiwimu
|
|
250
|
+
| `kiwimu serve [-p port]` | 웹 서버 실행 (문서 추가/관리 가능) |
|
|
251
|
+
| `kiwimu quiz [-n count]` | 터미널에서 학습 퀴즈 풀기 |
|
|
252
|
+
| `kiwimu expand [--provider]` | LLM으로 문서 내용 확장 (선택) |
|
|
253
|
+
| `kiwimu deploy [--target]` | GitHub Pages / Vercel에 배포 |
|
|
162
254
|
| `kiwimu status` | 현재 위키 상태 표시 |
|
|
163
255
|
|
|
164
256
|
## Supported File Formats
|
|
@@ -171,45 +263,71 @@ bunx kiwimu deploy --target vercel
|
|
|
171
263
|
| PPTX | ZIP/XML 파싱 |
|
|
172
264
|
| DOC / PPT / RTF | macOS textutil |
|
|
173
265
|
| KEY (Keynote) | 텍스트 추출 (제한적) |
|
|
266
|
+
| Markdown (.md) | 직접 텍스트 추출 (디렉토리 일괄 지원) |
|
|
174
267
|
|
|
175
268
|
## Supported LLM Providers
|
|
176
269
|
|
|
177
270
|
| 프로바이더 | 추천 모델 | 비고 |
|
|
178
271
|
|-----------|----------|------|
|
|
179
|
-
| **Google Gemini** | `gemini-
|
|
180
|
-
| Azure OpenAI | `gpt-5-nano` | Azure 구독 필요 |
|
|
181
|
-
| OpenAI | `gpt-
|
|
182
|
-
| Anthropic | `claude-sonnet-4-
|
|
272
|
+
| **Google Gemini** | `gemini-3.1-flash-lite-preview` | [무료 API key](https://aistudio.google.com/) |
|
|
273
|
+
| Azure OpenAI | `gpt-5.4-nano` | Azure 구독 필요 |
|
|
274
|
+
| OpenAI | `gpt-5.4` | API key 필요 |
|
|
275
|
+
| Anthropic | `claude-sonnet-4-6` | API key 필요 |
|
|
183
276
|
|
|
184
277
|
## Architecture
|
|
185
278
|
|
|
186
279
|
```
|
|
187
|
-
소스 (URL / PDF / DOCX / PPTX)
|
|
280
|
+
소스 (URL / PDF / DOCX / PPTX / DOC / PPT / KEY / RTF / MD)
|
|
188
281
|
↓
|
|
189
|
-
[ Ingest ]
|
|
282
|
+
[ Ingest ] ── Cheerio / pdf-parse / mammoth / jszip / textutil / MD 직접 추출
|
|
190
283
|
↓
|
|
191
|
-
[ Phase 1 ]
|
|
284
|
+
[ Phase 1 ] ── LLM: 원본 구조 추출 (📖 원본 페이지) — 병렬 처리 (concurrency=3)
|
|
192
285
|
↓
|
|
193
|
-
[ Phase 2 ]
|
|
286
|
+
[ Phase 2 ] ── LLM: 개념 추출 (📝 개념 페이지)
|
|
194
287
|
↓
|
|
195
|
-
[ Phase
|
|
288
|
+
[ Phase 2.5 ] ── LLM: 학습 퀴즈 자동 생성 (📝 퀴즈) — 병렬 처리
|
|
196
289
|
↓
|
|
197
|
-
[
|
|
290
|
+
[ Phase 3 ] ── [[wiki link]] 해석 + 원본↔개념 cross-link
|
|
198
291
|
↓
|
|
199
|
-
[
|
|
292
|
+
[ Build ] ── 정적 HTML (사이드바, KaTeX, Mermaid, 지식 그래프, 퀴즈, 다크 모드)
|
|
293
|
+
↓
|
|
294
|
+
[ Deploy ] ── GitHub Pages / Vercel
|
|
295
|
+
|
|
296
|
+
[ Dynamic Q&A ] ── 텍스트 드래그 → 팝오버 → LLM 질문 → 새 개념 페이지 생성 + 하이라이트 링크
|
|
297
|
+
(serve 모드에서 실시간 동작)
|
|
200
298
|
```
|
|
201
299
|
|
|
202
300
|
```
|
|
203
301
|
project-dir/
|
|
204
|
-
├── kiwi.toml
|
|
205
|
-
├── kiwi.db
|
|
206
|
-
├── uploads/
|
|
207
|
-
└── _site/
|
|
208
|
-
├── index.html
|
|
209
|
-
├── graph.html
|
|
210
|
-
├──
|
|
211
|
-
├──
|
|
302
|
+
├── kiwi.toml # 프로젝트 + LLM 설정
|
|
303
|
+
├── kiwi.db # SQLite (문서, 링크, 퀴즈, 사용량)
|
|
304
|
+
├── uploads/ # 업로드된 파일
|
|
305
|
+
└── _site/ # 빌드 결과
|
|
306
|
+
├── index.html # 홈 (문서 목록)
|
|
307
|
+
├── graph.html # 지식 그래프
|
|
308
|
+
├── quiz.html # 학습 퀴즈
|
|
309
|
+
├── dashboard.html # 학습 대시보드
|
|
310
|
+
├── wiki/ # 각 문서 페이지
|
|
311
|
+
│ └── random.html # 임의 문서
|
|
312
|
+
├── static/ # CSS, JS, 로고
|
|
313
|
+
│ ├── dynamic-qa.js # Dynamic Q&A (드래그→팝오버→질문)
|
|
314
|
+
│ └── edit-page.js # 웹 페이지 편집 모달
|
|
212
315
|
└── search-index.json
|
|
316
|
+
|
|
317
|
+
src/
|
|
318
|
+
├── services/
|
|
319
|
+
│ ├── dynamic-qa.ts # Dynamic Q&A 서버 로직
|
|
320
|
+
│ └── ingest.ts # 공유 인제스트 로직
|
|
321
|
+
├── ingest/
|
|
322
|
+
│ ├── markdown.ts # Markdown 파일 파싱 (디렉토리 일괄 지원)
|
|
323
|
+
│ ├── web.ts / pdf.ts / docx.ts / pptx.ts
|
|
324
|
+
│ └── ...
|
|
325
|
+
├── demo/
|
|
326
|
+
│ ├── sample-data.ts # 데모 샘플 데이터
|
|
327
|
+
│ └── setup.ts # 데모 초기화
|
|
328
|
+
└── build/static/
|
|
329
|
+
├── dynamic-qa.js # Dynamic Q&A 클라이언트
|
|
330
|
+
└── edit-page.js # 페이지 편집 클라이언트
|
|
213
331
|
```
|
|
214
332
|
|
|
215
333
|
## Tech Stack
|
|
@@ -220,11 +338,20 @@ project-dir/
|
|
|
220
338
|
- **Cheerio** — 웹 페이지 파싱
|
|
221
339
|
- **Mammoth** — DOCX 파싱
|
|
222
340
|
- **JSZip** — PPTX 파싱
|
|
223
|
-
- **Marked** — Markdown → HTML
|
|
341
|
+
- **Marked** + **sanitize-html** — Markdown → 안전한 HTML
|
|
224
342
|
- **D3.js** — 지식 그래프
|
|
225
|
-
- **KaTeX** — 수학 수식 렌더링
|
|
343
|
+
- **KaTeX** — LaTeX 수학 수식 렌더링
|
|
344
|
+
- **Mermaid.js** — 다이어그램 렌더링
|
|
226
345
|
- **gh-pages** — GitHub Pages 배포
|
|
227
346
|
|
|
347
|
+
## Security
|
|
348
|
+
|
|
349
|
+
- Bearer 토큰 인증 (serve 모드)
|
|
350
|
+
- SSRF 방지 (프라이빗 IP 차단, 리다이렉트 재검증)
|
|
351
|
+
- Path Traversal 방지 (resolve 검증)
|
|
352
|
+
- XSS 방지 (sanitize-html, CSP 헤더, escapeHtml)
|
|
353
|
+
- 파일 업로드 제한 (50MB)
|
|
354
|
+
|
|
228
355
|
## License
|
|
229
356
|
|
|
230
357
|
MIT
|