@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.
Files changed (55) hide show
  1. package/.cursorrules +12 -0
  2. package/.env.example +8 -0
  3. package/.github/workflows/ci.yml +21 -1
  4. package/.github/workflows/publish.yml +21 -1
  5. package/CHANGELOG.md +41 -0
  6. package/README.md +247 -239
  7. package/cursor-mcp-config.json.example +29 -0
  8. package/datacontext.db +0 -0
  9. package/dist/api/server.d.ts.map +1 -1
  10. package/dist/api/server.js +145 -0
  11. package/dist/api/server.js.map +1 -1
  12. package/dist/api/start-server.d.ts +10 -0
  13. package/dist/api/start-server.d.ts.map +1 -0
  14. package/dist/api/start-server.js +73 -0
  15. package/dist/api/start-server.js.map +1 -0
  16. package/dist/cli/index.js +462 -0
  17. package/dist/cli/index.js.map +1 -1
  18. package/dist/core/context-service.d.ts +72 -0
  19. package/dist/core/context-service.d.ts.map +1 -1
  20. package/dist/core/context-service.js +132 -0
  21. package/dist/core/context-service.js.map +1 -1
  22. package/dist/core/index.d.ts +2 -0
  23. package/dist/core/index.d.ts.map +1 -1
  24. package/dist/core/index.js +5 -1
  25. package/dist/core/index.js.map +1 -1
  26. package/dist/core/llm-service.d.ts +141 -0
  27. package/dist/core/llm-service.d.ts.map +1 -0
  28. package/dist/core/llm-service.js +284 -0
  29. package/dist/core/llm-service.js.map +1 -0
  30. package/dist/knowledge/store.d.ts +56 -3
  31. package/dist/knowledge/store.d.ts.map +1 -1
  32. package/dist/knowledge/store.js +193 -7
  33. package/dist/knowledge/store.js.map +1 -1
  34. package/dist/knowledge/types.d.ts +43 -1
  35. package/dist/knowledge/types.d.ts.map +1 -1
  36. package/dist/knowledge/types.js.map +1 -1
  37. package/dist/mcp/tools.d.ts.map +1 -1
  38. package/dist/mcp/tools.js +365 -0
  39. package/dist/mcp/tools.js.map +1 -1
  40. package/docs/API.md +173 -0
  41. package/docs/DEMO_SCRIPT.md +210 -0
  42. package/docs/MCP_TEST_GUIDE.md +414 -0
  43. package/docs/SYNC_GUIDE.md +242 -0
  44. package/package.json +4 -1
  45. package/src/api/server.ts +160 -0
  46. package/src/api/start-server.ts +78 -0
  47. package/src/cli/index.ts +534 -0
  48. package/src/core/context-service.ts +182 -0
  49. package/src/core/index.ts +7 -0
  50. package/src/core/llm-service.ts +359 -0
  51. package/src/knowledge/store.ts +232 -7
  52. package/src/knowledge/types.ts +45 -1
  53. package/src/mcp/tools.ts +415 -0
  54. package/test-glossary.yaml +55 -0
  55. 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
+