@kiyeonjeon21/datacontext 0.2.0 → 0.3.1
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/.cursorrules +12 -0
- package/.env.example +8 -0
- package/.github/workflows/ci.yml +21 -1
- package/.github/workflows/publish.yml +21 -1
- package/CHANGELOG.md +41 -0
- package/README.md +247 -239
- package/cursor-mcp-config.json.example +29 -0
- package/datacontext.db +0 -0
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +145 -0
- package/dist/api/server.js.map +1 -1
- package/dist/api/start-server.d.ts +10 -0
- package/dist/api/start-server.d.ts.map +1 -0
- package/dist/api/start-server.js +73 -0
- package/dist/api/start-server.js.map +1 -0
- package/dist/cli/index.js +462 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/context-service.d.ts +72 -0
- package/dist/core/context-service.d.ts.map +1 -1
- package/dist/core/context-service.js +132 -0
- package/dist/core/context-service.js.map +1 -1
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +5 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/llm-service.d.ts +141 -0
- package/dist/core/llm-service.d.ts.map +1 -0
- package/dist/core/llm-service.js +284 -0
- package/dist/core/llm-service.js.map +1 -0
- package/dist/knowledge/store.d.ts +56 -3
- package/dist/knowledge/store.d.ts.map +1 -1
- package/dist/knowledge/store.js +193 -7
- package/dist/knowledge/store.js.map +1 -1
- package/dist/knowledge/types.d.ts +43 -1
- package/dist/knowledge/types.d.ts.map +1 -1
- package/dist/knowledge/types.js.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +365 -0
- package/dist/mcp/tools.js.map +1 -1
- package/docs/API.md +173 -0
- package/docs/DEMO_SCRIPT.md +210 -0
- package/docs/MCP_TEST_GUIDE.md +414 -0
- package/docs/SYNC_GUIDE.md +242 -0
- package/package.json +4 -1
- package/src/api/server.ts +160 -0
- package/src/api/start-server.ts +78 -0
- package/src/cli/index.ts +534 -0
- package/src/core/context-service.ts +182 -0
- package/src/core/index.ts +7 -0
- package/src/core/llm-service.ts +359 -0
- package/src/knowledge/store.ts +232 -7
- package/src/knowledge/types.ts +45 -1
- package/src/mcp/tools.ts +415 -0
- package/test-glossary.yaml +55 -0
- package/test-mcp.db +0 -0
package/docs/API.md
CHANGED
|
@@ -460,6 +460,179 @@ GET /api/rules/candidates
|
|
|
460
460
|
|
|
461
461
|
---
|
|
462
462
|
|
|
463
|
+
## Glossary (Business Terms)
|
|
464
|
+
|
|
465
|
+
### List Terms
|
|
466
|
+
|
|
467
|
+
```
|
|
468
|
+
GET /api/terms?category=status&table=users
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
**Query Parameters:**
|
|
472
|
+
- `category` (optional) - Filter by category: `status`, `time`, `money`, `entity`, `metric`, `filter`, `custom`
|
|
473
|
+
- `table` (optional) - Filter by table name
|
|
474
|
+
|
|
475
|
+
**Response:**
|
|
476
|
+
```json
|
|
477
|
+
{
|
|
478
|
+
"count": 2,
|
|
479
|
+
"terms": [
|
|
480
|
+
{
|
|
481
|
+
"id": "1234567890-abc",
|
|
482
|
+
"term": "활성 사용자",
|
|
483
|
+
"synonyms": ["active user", "활성화된 사용자"],
|
|
484
|
+
"definition": "status 컬럼이 1인 사용자",
|
|
485
|
+
"sqlExpression": "status = 1",
|
|
486
|
+
"appliesTo": { "tables": ["users"] },
|
|
487
|
+
"category": "status",
|
|
488
|
+
"isActive": true
|
|
489
|
+
}
|
|
490
|
+
]
|
|
491
|
+
}
|
|
492
|
+
```
|
|
493
|
+
|
|
494
|
+
---
|
|
495
|
+
|
|
496
|
+
### Search Terms
|
|
497
|
+
|
|
498
|
+
```
|
|
499
|
+
GET /api/terms/search?q=활성
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
**Query Parameters:**
|
|
503
|
+
- `q` (required) - Search query
|
|
504
|
+
|
|
505
|
+
**Response:**
|
|
506
|
+
```json
|
|
507
|
+
{
|
|
508
|
+
"query": "활성",
|
|
509
|
+
"count": 1,
|
|
510
|
+
"terms": [...],
|
|
511
|
+
"suggestedConditions": ["status = 1"]
|
|
512
|
+
}
|
|
513
|
+
```
|
|
514
|
+
|
|
515
|
+
---
|
|
516
|
+
|
|
517
|
+
### Add Term (Manual)
|
|
518
|
+
|
|
519
|
+
```
|
|
520
|
+
POST /api/terms
|
|
521
|
+
```
|
|
522
|
+
|
|
523
|
+
**Request Body:**
|
|
524
|
+
```json
|
|
525
|
+
{
|
|
526
|
+
"term": "활성 사용자",
|
|
527
|
+
"definition": "status 컬럼이 1인 사용자",
|
|
528
|
+
"sql": "status = 1",
|
|
529
|
+
"synonyms": ["active user"],
|
|
530
|
+
"tables": ["users"],
|
|
531
|
+
"category": "status"
|
|
532
|
+
}
|
|
533
|
+
```
|
|
534
|
+
|
|
535
|
+
**Response:**
|
|
536
|
+
```json
|
|
537
|
+
{
|
|
538
|
+
"success": true,
|
|
539
|
+
"term": { ... }
|
|
540
|
+
}
|
|
541
|
+
```
|
|
542
|
+
|
|
543
|
+
---
|
|
544
|
+
|
|
545
|
+
### Generate Glossary (AI)
|
|
546
|
+
|
|
547
|
+
```
|
|
548
|
+
POST /api/terms/generate
|
|
549
|
+
```
|
|
550
|
+
|
|
551
|
+
Uses Claude API to automatically generate structured glossary entries from natural language.
|
|
552
|
+
|
|
553
|
+
**Request Body:**
|
|
554
|
+
```json
|
|
555
|
+
{
|
|
556
|
+
"terms": "활성 사용자 = status가 1인 사용자\n최근 주문 = 30일 이내 주문\nVIP = 주문 10건 이상"
|
|
557
|
+
}
|
|
558
|
+
```
|
|
559
|
+
|
|
560
|
+
**Response:**
|
|
561
|
+
```json
|
|
562
|
+
{
|
|
563
|
+
"success": true,
|
|
564
|
+
"generated": 3,
|
|
565
|
+
"terms": [
|
|
566
|
+
{
|
|
567
|
+
"term": "활성 사용자",
|
|
568
|
+
"definition": "status 컬럼이 1인 사용자",
|
|
569
|
+
"sqlExpression": "status = 1",
|
|
570
|
+
"category": "status",
|
|
571
|
+
"appliesTo": { "tables": ["users"] }
|
|
572
|
+
}
|
|
573
|
+
]
|
|
574
|
+
}
|
|
575
|
+
```
|
|
576
|
+
|
|
577
|
+
**Note:** Requires `ANTHROPIC_API_KEY` environment variable.
|
|
578
|
+
|
|
579
|
+
---
|
|
580
|
+
|
|
581
|
+
### Delete Term
|
|
582
|
+
|
|
583
|
+
```
|
|
584
|
+
DELETE /api/terms/:id
|
|
585
|
+
```
|
|
586
|
+
|
|
587
|
+
**Response:**
|
|
588
|
+
```json
|
|
589
|
+
{
|
|
590
|
+
"success": true,
|
|
591
|
+
"deleted": "1234567890-abc"
|
|
592
|
+
}
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
---
|
|
596
|
+
|
|
597
|
+
### Enhance Query
|
|
598
|
+
|
|
599
|
+
```
|
|
600
|
+
POST /api/terms/enhance
|
|
601
|
+
```
|
|
602
|
+
|
|
603
|
+
Enhance a natural language query by matching it against the business glossary.
|
|
604
|
+
Returns suggested SQL conditions based on matched terms.
|
|
605
|
+
|
|
606
|
+
**Request Body:**
|
|
607
|
+
```json
|
|
608
|
+
{
|
|
609
|
+
"query": "활성 사용자 중 최근 주문한 VIP 고객"
|
|
610
|
+
}
|
|
611
|
+
```
|
|
612
|
+
|
|
613
|
+
**Response:**
|
|
614
|
+
```json
|
|
615
|
+
{
|
|
616
|
+
"query": "활성 사용자 중 최근 주문한 VIP 고객",
|
|
617
|
+
"enhancedQuery": "활성 사용자 중 최근 주문한 VIP 고객",
|
|
618
|
+
"usedTerms": ["활성 사용자", "최근 주문", "VIP 고객"],
|
|
619
|
+
"suggestedConditions": [
|
|
620
|
+
"status = 1",
|
|
621
|
+
"order_date >= CURRENT_DATE - INTERVAL '30 days'",
|
|
622
|
+
"COUNT(order_id) >= 10"
|
|
623
|
+
],
|
|
624
|
+
"method": "ai"
|
|
625
|
+
}
|
|
626
|
+
```
|
|
627
|
+
|
|
628
|
+
**Notes:**
|
|
629
|
+
- Uses local term matching first (no API key required)
|
|
630
|
+
- Falls back to AI enhancement if `ANTHROPIC_API_KEY` is set
|
|
631
|
+
- `method` indicates whether local or AI matching was used
|
|
632
|
+
- Apply `suggestedConditions` to your SQL WHERE clause
|
|
633
|
+
|
|
634
|
+
---
|
|
635
|
+
|
|
463
636
|
## Error Responses
|
|
464
637
|
|
|
465
638
|
All error responses follow this format:
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
# DataContext Demo Script
|
|
2
|
+
|
|
3
|
+
이 문서는 DataContext의 핵심 기능을 보여주는 데모 시나리오입니다.
|
|
4
|
+
GIF/영상 제작 시 이 순서대로 진행하세요.
|
|
5
|
+
|
|
6
|
+
## 사전 준비
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
# 1. 테스트 DB 준비 (PostgreSQL)
|
|
10
|
+
psql -c "CREATE DATABASE demo_db"
|
|
11
|
+
psql demo_db -c "
|
|
12
|
+
CREATE TABLE users (
|
|
13
|
+
id SERIAL PRIMARY KEY,
|
|
14
|
+
email VARCHAR(255) NOT NULL,
|
|
15
|
+
name VARCHAR(100),
|
|
16
|
+
status INTEGER DEFAULT 1,
|
|
17
|
+
created_at TIMESTAMP DEFAULT NOW(),
|
|
18
|
+
deleted_at TIMESTAMP
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
CREATE TABLE orders (
|
|
22
|
+
id SERIAL PRIMARY KEY,
|
|
23
|
+
user_id INTEGER REFERENCES users(id),
|
|
24
|
+
total INTEGER NOT NULL, -- cents
|
|
25
|
+
status VARCHAR(20) DEFAULT 'pending',
|
|
26
|
+
created_at TIMESTAMP DEFAULT NOW()
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
-- Add comments
|
|
30
|
+
COMMENT ON TABLE users IS 'Core user accounts';
|
|
31
|
+
COMMENT ON COLUMN users.status IS '1=active, 0=inactive';
|
|
32
|
+
COMMENT ON COLUMN orders.total IS 'Order total in cents';
|
|
33
|
+
|
|
34
|
+
-- Insert sample data
|
|
35
|
+
INSERT INTO users (email, name, status) VALUES
|
|
36
|
+
('john@example.com', 'John Doe', 1),
|
|
37
|
+
('jane@example.com', 'Jane Smith', 1),
|
|
38
|
+
('bob@example.com', 'Bob Wilson', 0);
|
|
39
|
+
|
|
40
|
+
INSERT INTO orders (user_id, total, status) VALUES
|
|
41
|
+
(1, 5000, 'completed'),
|
|
42
|
+
(1, 15000, 'completed'),
|
|
43
|
+
(2, 25000, 'pending');
|
|
44
|
+
"
|
|
45
|
+
|
|
46
|
+
# 2. DataContext 서버 시작
|
|
47
|
+
npx @kiyeonjeon21/datacontext serve postgres://postgres:postgres@localhost:5432/demo_db --port 3000
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Demo 1: Cold Start → Auto-Harvest (30초)
|
|
53
|
+
|
|
54
|
+
**목표:** 처음 연결 시 자동으로 메타데이터를 수집하는 것을 보여줌
|
|
55
|
+
|
|
56
|
+
1. VS Code에서 DataContext Extension 열기
|
|
57
|
+
2. `Cmd+Shift+P` → "DataContext: Connect to Database"
|
|
58
|
+
3. `http://localhost:3000` 입력
|
|
59
|
+
4. 왼쪽 사이드바에 테이블 목록 표시됨
|
|
60
|
+
5. `Cmd+Shift+P` → "DataContext: Harvest Metadata"
|
|
61
|
+
6. "Harvested 2 tables, 2 descriptions" 메시지 표시
|
|
62
|
+
7. Knowledge 패널에 수집된 설명 표시
|
|
63
|
+
|
|
64
|
+
**녹화 포인트:**
|
|
65
|
+
- 연결 후 테이블이 나타나는 순간
|
|
66
|
+
- Harvest 후 Knowledge가 채워지는 순간
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Demo 2: SQL Autocomplete (30초)
|
|
71
|
+
|
|
72
|
+
**목표:** 스키마 인식 SQL 자동완성
|
|
73
|
+
|
|
74
|
+
1. 새 파일 생성: `query.sql`
|
|
75
|
+
2. `SEL` 입력 → SELECT 스니펫 선택
|
|
76
|
+
3. `FROM u` 입력 → `users` 테이블 자동완성
|
|
77
|
+
4. `users.` 입력 → 컬럼 목록 표시 (id, email, name, status...)
|
|
78
|
+
5. 완성된 쿼리:
|
|
79
|
+
```sql
|
|
80
|
+
SELECT users.id, users.email, users.status
|
|
81
|
+
FROM users
|
|
82
|
+
WHERE users.status = 1
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**녹화 포인트:**
|
|
86
|
+
- 테이블 이름 자동완성
|
|
87
|
+
- 컬럼 목록 (타입, PK 표시)
|
|
88
|
+
- JOIN 시 연관 테이블 제안
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Demo 3: Hover Descriptions (20초)
|
|
93
|
+
|
|
94
|
+
**목표:** 테이블/컬럼에 마우스 올리면 비즈니스 설명 표시
|
|
95
|
+
|
|
96
|
+
1. SQL 파일에서 `users` 테이블에 마우스 hover
|
|
97
|
+
2. "Core user accounts" 툴팁 표시
|
|
98
|
+
3. `orders.total`에 마우스 hover
|
|
99
|
+
4. "Order total in cents" 툴팁 표시
|
|
100
|
+
|
|
101
|
+
**녹화 포인트:**
|
|
102
|
+
- Hover 시 Markdown 포맷의 풍부한 툴팁
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Demo 4: AI Context (Cursor에서) (45초)
|
|
107
|
+
|
|
108
|
+
**목표:** AI가 비즈니스 컨텍스트를 이해하고 정확한 SQL 생성
|
|
109
|
+
|
|
110
|
+
1. Cursor에서 DataContext MCP 활성화
|
|
111
|
+
2. Agent 모드에서 질문:
|
|
112
|
+
> "활성 사용자 중 $100 이상 주문한 사람 조회해줘"
|
|
113
|
+
3. AI 응답:
|
|
114
|
+
```sql
|
|
115
|
+
SELECT u.*
|
|
116
|
+
FROM users u
|
|
117
|
+
JOIN orders o ON o.user_id = u.id
|
|
118
|
+
WHERE u.status = 1 -- Active users (from context)
|
|
119
|
+
AND u.deleted_at IS NULL -- Soft-delete (from business rule)
|
|
120
|
+
GROUP BY u.id
|
|
121
|
+
HAVING SUM(o.total) > 10000 -- $100 in cents (from context)
|
|
122
|
+
```
|
|
123
|
+
4. 컨텍스트 사용됨 표시 (table descriptions, business rules)
|
|
124
|
+
|
|
125
|
+
**녹화 포인트:**
|
|
126
|
+
- AI가 status=1이 "active"임을 아는 것
|
|
127
|
+
- AI가 total이 "cents"임을 아는 것
|
|
128
|
+
- 컨텍스트 참조 표시
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## Demo 5: Safety Guardrails (30초)
|
|
133
|
+
|
|
134
|
+
**목표:** 위험한 쿼리 차단
|
|
135
|
+
|
|
136
|
+
1. Cursor에서:
|
|
137
|
+
> "users 테이블 전체 삭제해줘"
|
|
138
|
+
2. AI가 DELETE 쿼리 시도
|
|
139
|
+
3. DataContext가 차단: "Read-only mode: DELETE statements are not allowed"
|
|
140
|
+
4. 또는:
|
|
141
|
+
> "전체 주문 데이터 조회해줘" (LIMIT 없이)
|
|
142
|
+
5. DataContext가 자동으로 LIMIT 1000 추가
|
|
143
|
+
|
|
144
|
+
**녹화 포인트:**
|
|
145
|
+
- 차단 메시지
|
|
146
|
+
- 자동 LIMIT 추가
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Demo 6: Learning Loop (30초)
|
|
151
|
+
|
|
152
|
+
**목표:** 피드백으로 학습
|
|
153
|
+
|
|
154
|
+
1. AI가 생성한 쿼리에 수정 필요
|
|
155
|
+
2. 사용자가 `AND created_at > '2024-01-01'` 추가
|
|
156
|
+
3. "Record Feedback" 실행
|
|
157
|
+
4. Metrics에서 correction rate 표시
|
|
158
|
+
5. 다음에 유사한 질문 시 AI가 날짜 필터 제안
|
|
159
|
+
|
|
160
|
+
**녹화 포인트:**
|
|
161
|
+
- 수정 전/후 SQL
|
|
162
|
+
- Metrics 화면
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## GIF 제작 도구
|
|
167
|
+
|
|
168
|
+
### 추천 도구
|
|
169
|
+
- **macOS**: Kap (https://getkap.co/) - 무료, 간단
|
|
170
|
+
- **Cross-platform**: ScreenToGif (Windows), Peek (Linux)
|
|
171
|
+
- **터미널**: asciinema (https://asciinema.org/)
|
|
172
|
+
|
|
173
|
+
### GIF 설정
|
|
174
|
+
- 해상도: 800x600 또는 1200x800
|
|
175
|
+
- FPS: 15-20
|
|
176
|
+
- 파일 크기: 2MB 이하 (GitHub 표시용)
|
|
177
|
+
- 루프: 무한 반복
|
|
178
|
+
|
|
179
|
+
### 파일명
|
|
180
|
+
- `demo-autocomplete.gif`
|
|
181
|
+
- `demo-harvest.gif`
|
|
182
|
+
- `demo-ai-context.gif`
|
|
183
|
+
- `demo-safety.gif`
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## 영상 제작 (Product Hunt/YouTube)
|
|
188
|
+
|
|
189
|
+
### 구성 (2분 이내)
|
|
190
|
+
1. **Intro (10초)**: 문제 제시 - "AI에게 매번 스키마 설명하기 지치셨나요?"
|
|
191
|
+
2. **Solution (10초)**: DataContext 소개
|
|
192
|
+
3. **Demo 1-4 (90초)**: 핵심 기능 시연
|
|
193
|
+
4. **Outro (10초)**: CTA - "지금 시작하세요"
|
|
194
|
+
|
|
195
|
+
### 배경음악
|
|
196
|
+
- 저작권 무료 음악 사용
|
|
197
|
+
- 볼륨 낮게 (나레이션보다 50% 낮게)
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## 스크린샷 체크리스트
|
|
202
|
+
|
|
203
|
+
README 및 마케팅용:
|
|
204
|
+
- [ ] VS Code Extension 사이드바 (테이블 목록)
|
|
205
|
+
- [ ] SQL 자동완성 드롭다운
|
|
206
|
+
- [ ] Hover 툴팁
|
|
207
|
+
- [ ] Knowledge 패널 (카테고리별)
|
|
208
|
+
- [ ] 터미널에서 서버 실행 화면
|
|
209
|
+
- [ ] Cursor에서 AI 응답 (컨텍스트 포함)
|
|
210
|
+
|