@thinkdata/cli 0.2.2 → 0.3.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.
Files changed (53) hide show
  1. package/README.md +119 -0
  2. package/dist/bin/thinkdata.js +12 -0
  3. package/dist/bin/thinkdata.js.map +1 -1
  4. package/dist/cli.js +52450 -0
  5. package/dist/commands/auth.js +1 -1
  6. package/dist/commands/auth.js.map +1 -1
  7. package/dist/commands/compare.js +1 -1
  8. package/dist/commands/compare.js.map +1 -1
  9. package/dist/commands/extract.d.ts +2 -0
  10. package/dist/commands/extract.d.ts.map +1 -1
  11. package/dist/commands/extract.js +57 -4
  12. package/dist/commands/extract.js.map +1 -1
  13. package/dist/commands/mcp.d.ts +8 -0
  14. package/dist/commands/mcp.d.ts.map +1 -0
  15. package/dist/commands/mcp.js +91 -0
  16. package/dist/commands/mcp.js.map +1 -0
  17. package/dist/commands/serve.js +7 -7
  18. package/dist/commands/serve.js.map +1 -1
  19. package/dist/extractors/index.d.ts +15 -2
  20. package/dist/extractors/index.d.ts.map +1 -1
  21. package/dist/extractors/index.js +46 -10
  22. package/dist/extractors/index.js.map +1 -1
  23. package/dist/extractors/mssql.d.ts.map +1 -1
  24. package/dist/extractors/mssql.js +3 -0
  25. package/dist/extractors/mssql.js.map +1 -1
  26. package/dist/extractors/mysql.d.ts.map +1 -1
  27. package/dist/extractors/mysql.js +3 -1
  28. package/dist/extractors/mysql.js.map +1 -1
  29. package/dist/extractors/oracle.d.ts.map +1 -1
  30. package/dist/extractors/oracle.js +3 -0
  31. package/dist/extractors/oracle.js.map +1 -1
  32. package/dist/extractors/postgres.d.ts.map +1 -1
  33. package/dist/extractors/postgres.js +39 -24
  34. package/dist/extractors/postgres.js.map +1 -1
  35. package/dist/mcp/client.d.ts +104 -0
  36. package/dist/mcp/client.d.ts.map +1 -0
  37. package/dist/mcp/client.js +103 -0
  38. package/dist/mcp/client.js.map +1 -0
  39. package/dist/mcp/resources.d.ts +12 -0
  40. package/dist/mcp/resources.d.ts.map +1 -0
  41. package/dist/mcp/resources.js +113 -0
  42. package/dist/mcp/resources.js.map +1 -0
  43. package/dist/mcp/toolManifest.d.ts +20 -0
  44. package/dist/mcp/toolManifest.d.ts.map +1 -0
  45. package/dist/mcp/toolManifest.js +38 -0
  46. package/dist/mcp/toolManifest.js.map +1 -0
  47. package/dist/mcp/tools.d.ts +4 -0
  48. package/dist/mcp/tools.d.ts.map +1 -0
  49. package/dist/mcp/tools.js +652 -0
  50. package/dist/mcp/tools.js.map +1 -0
  51. package/dist/types.d.ts +6 -0
  52. package/dist/types.d.ts.map +1 -1
  53. package/package.json +19 -10
package/README.md ADDED
@@ -0,0 +1,119 @@
1
+ # @thinkdata/cli
2
+
3
+ > ThinkERD CLI — 데이터베이스 스키마를 ERD로 가져오고, AI 에이전트에 연결한다
4
+
5
+ 하나의 도구에 네 가지 모드가 있습니다.
6
+
7
+ | 명령 | 하는 일 |
8
+ |---|---|
9
+ | `mcp` | **MCP 서버**로 동작 — Claude Code·Cursor 등이 ERD를 조회 |
10
+ | `extract` | DB 스키마를 뽑아 **ERD에 반영** |
11
+ | `compare` | DB와 ERD 모델의 **차이 비교** |
12
+ | `serve` | 브라우저(ThinkERD 웹)용 로컬 에이전트 |
13
+
14
+ `mcp`와 `extract`가 짝입니다 — **읽기**는 MCP로, **쓰기**는 extract로. 둘이 같은
15
+ 패키지에 있어 설치가 한 번이면 끝납니다.
16
+
17
+ ## 사전 준비
18
+
19
+ ThinkERD 앱 메뉴 → **Settings → Developer & API** 에서 Personal Access Token(PAT)을
20
+ 발급합니다. Pro 이상 플랜에서 가능하며, 스키마를 반영하려면 `write` 스코프가 필요합니다.
21
+
22
+ 스코프는 **필요한 만큼만** 주십시오. 워크스페이스를 지정해 발급하면 그 밖의 리소스는
23
+ 조회되지 않습니다.
24
+
25
+ ## MCP 연결
26
+
27
+ `.mcp.json`(Claude Code) 또는 각 IDE의 설정 파일에 넣습니다.
28
+
29
+ ```json
30
+ {
31
+ "mcpServers": {
32
+ "thinkerd": {
33
+ "command": "npx",
34
+ "args": ["-y", "@thinkdata/cli", "mcp", "--api-url", "https://api.thinkerd.io"]
35
+ }
36
+ }
37
+ }
38
+ ```
39
+
40
+ | IDE | 설정 파일 |
41
+ |---|---|
42
+ | Claude Code | 레포 루트 `.mcp.json` (또는 `claude mcp add`) |
43
+ | Cursor | `~/.cursor/mcp.json` |
44
+ | Windsurf | `~/.codeium/windsurf/mcp_config.json` |
45
+ | Claude Desktop | `~/Library/Application Support/Claude/claude_desktop_config.json` |
46
+
47
+ > ⚠️ **Claude Code의 `.mcp.json`은 대개 커밋됩니다.** 위 예시가 `--token`을 빼고 있는
48
+ > 이유입니다 — 토큰은 `THINKERD_TOKEN` 환경변수로 넘기십시오. 설정 파일에 평문으로
49
+ > 적으면 저장소 이력에 남습니다.
50
+ >
51
+ > Claude Code는 Claude Desktop의 설정 파일을 **읽지 않습니다.** 이름이 비슷해
52
+ > 그쪽 경로를 따라가는 경우가 있는데, JSON 형식은 같아도 파일이 다릅니다.
53
+
54
+ 종전의 `@thinkdata/mcp-server` 도 계속 동작합니다(별칭). 다만 그쪽은 MCP만 있고
55
+ `extract`가 없어, 새로 설정한다면 이 패키지를 쓰는 편이 낫습니다.
56
+
57
+ ## 스키마를 ERD에 반영
58
+
59
+ ```bash
60
+ npx @thinkdata/cli extract "postgresql://user:pass@host:5432/db" \
61
+ --diagram <다이어그램ID> --pat thkd_...
62
+ ```
63
+
64
+ **병합입니다.** 캔버스 좌표·색·주제영역은 보존하고 컬럼과 관계만 갱신합니다.
65
+ DB에서 사라진 엔터티는 지우지 않고 세어서 알려 줍니다 — 설계 중인 테이블이 ERD에
66
+ 먼저 그려져 있을 수 있기 때문입니다.
67
+
68
+ **다이어그램 ID 찾는 곳**: 탐색기에서 다이어그램 우클릭 → **Properties** →
69
+ Identification Information → ID (복사 아이콘). 주소창에는 나오지 않습니다.
70
+
71
+ `--diagram` 없이 실행하면 브라우저가 폴링해 가는 종전 경로로 동작합니다.
72
+
73
+ ### 마이그레이션 훅에 붙이기
74
+
75
+ 스키마가 바뀔 때마다 ERD가 따라오게 하려면 마이그레이션 뒤에 겁니다.
76
+
77
+ ```json
78
+ {
79
+ "scripts": {
80
+ "db:migrate": "drizzle-kit migrate && npm run erd:sync",
81
+ "erd:sync": "thinkdata extract $DATABASE_URL --diagram $THINKERD_DIAGRAM_ID --pat $THINKERD_PAT"
82
+ }
83
+ }
84
+ ```
85
+
86
+ ## DB 드라이버는 선택 설치입니다
87
+
88
+ `pg`·`mysql2`·`oracledb`·`mssql` 은 `optionalDependencies` 이고 **실제로 그 DB에
89
+ 접속할 때만** 로드됩니다. MCP만 쓰는 경우 드라이버가 없어도 됩니다.
90
+
91
+ 설치되지 않은 드라이버를 쓰려 하면 무엇을 깔아야 하는지 알려 줍니다.
92
+
93
+ ## 명령 목록
94
+
95
+ ```
96
+ thinkdata mcp [--api-url <url>] [--token <pat>] [--dev]
97
+ thinkdata extract <connection-string> [--diagram <id>] [--pat <token>] [--schema <name>]
98
+ thinkdata compare <connection-string> [--project <id>] [--pat <token>]
99
+ thinkdata serve [--port 3100]
100
+ thinkdata login [token]
101
+ thinkdata whoami
102
+ ```
103
+
104
+ ## 환경변수
105
+
106
+ | 변수 | 설명 | 기본값 |
107
+ |---|---|---|
108
+ | `THINKERD_API_URL` | ThinkERD API URL | `https://api.thinkerd.io` |
109
+ | `THINKERD_TOKEN` | Personal Access Token | — |
110
+
111
+ ## 보안
112
+
113
+ - 토큰은 SHA-256 해시로만 서버에 저장됩니다
114
+ - 워크스페이스/프로젝트 단위로 접근 범위를 제한할 수 있습니다
115
+ - 토큰 만료일을 설정할 수 있습니다 (기본 90일)
116
+
117
+ ## 라이선스
118
+
119
+ MIT
@@ -13,6 +13,7 @@ import { extractCommand } from '../commands/extract.js';
13
13
  import { compareCommand } from '../commands/compare.js';
14
14
  import { serveCommand } from '../commands/serve.js';
15
15
  import { loginCommand, whoamiCommand } from '../commands/auth.js';
16
+ import { mcpCommand } from '../commands/mcp.js';
16
17
  const program = new Command();
17
18
  program
18
19
  .name('thinkdata')
@@ -32,6 +33,7 @@ program
32
33
  .option('--ssl', 'Enable SSL connection')
33
34
  .option('--token <token>', 'ThinkERD transfer token (one-time)')
34
35
  .option('--pat <pat>', 'Personal Access Token for automation (thkd_...)')
36
+ .option('--diagram <id>', 'Apply directly to this ThinkERD diagram (no browser; requires --pat)')
35
37
  .option('-o, --output <file>', 'Save to JSON file instead of sending')
36
38
  .option('-i, --interactive', 'Interactive wizard mode')
37
39
  .action(extractCommand);
@@ -51,6 +53,16 @@ program
51
53
  .option('-p, --port <port>', 'Port number (default: 3100)', parseInt)
52
54
  .action(serveCommand);
53
55
  // ── auth 명령 ──
56
+ // ── mcp 명령 ──
57
+ // stdio 트랜스포트라 stdout 은 프로토콜 채널이다. 이 명령의 안내는 전부 stderr 로 나간다.
58
+ program
59
+ .command('mcp')
60
+ .description('Run the MCP server over stdio (for Claude Code, Cursor, Windsurf, ...)')
61
+ .option('--api-url <url>', 'ThinkERD API URL')
62
+ .option('--token <pat>', 'Personal Access Token (or set THINKERD_TOKEN)')
63
+ .option('--dev', 'Local development — read the token the server wrote to .dev-mcp-token')
64
+ .action(mcpCommand);
65
+ // ── auth 명령 ──
54
66
  program
55
67
  .command('login [token]')
56
68
  .description('Login to ThinkERD using a Personal Access Token')
@@ -1 +1 @@
1
- {"version":3,"file":"thinkdata.js","sourceRoot":"","sources":["../../src/bin/thinkdata.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAElE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACF,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,wEAAwE,CAAC;KACrF,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,mBAAmB;AACnB,OAAO;KACF,OAAO,CAAC,6BAA6B,CAAC;KACtC,WAAW,CAAC,gEAAgE,CAAC;KAC7E,MAAM,CAAC,mBAAmB,EAAE,6BAA6B,CAAC;KAC1D,MAAM,CAAC,mBAAmB,EAAE,eAAe,CAAC;KAC5C,MAAM,CAAC,mBAAmB,EAAE,eAAe,EAAE,QAAQ,CAAC;KACtD,MAAM,CAAC,qBAAqB,EAAE,eAAe,CAAC;KAC9C,MAAM,CAAC,mBAAmB,EAAE,eAAe,CAAC;KAC5C,MAAM,CAAC,yBAAyB,EAAE,8CAA8C,CAAC;KACjF,MAAM,CAAC,uBAAuB,EAAE,iCAAiC,CAAC;KAClE,MAAM,CAAC,OAAO,EAAE,uBAAuB,CAAC;KACxC,MAAM,CAAC,iBAAiB,EAAE,oCAAoC,CAAC;KAC/D,MAAM,CAAC,aAAa,EAAE,iDAAiD,CAAC;KACxE,MAAM,CAAC,qBAAqB,EAAE,sCAAsC,CAAC;KACrE,MAAM,CAAC,mBAAmB,EAAE,yBAAyB,CAAC;KACtD,MAAM,CAAC,cAAc,CAAC,CAAC;AAE5B,mBAAmB;AACnB,OAAO;KACF,OAAO,CAAC,6BAA6B,CAAC;KACtC,WAAW,CAAC,6CAA6C,CAAC;KAC1D,MAAM,CAAC,iBAAiB,EAAE,oCAAoC,CAAC;KAC/D,MAAM,CAAC,aAAa,EAAE,iDAAiD,CAAC;KACxE,MAAM,CAAC,gBAAgB,EAAE,qBAAqB,CAAC;KAC/C,MAAM,CAAC,mBAAmB,EAAE,oCAAoC,CAAC;KACjE,MAAM,CAAC,cAAc,CAAC,CAAC;AAE5B,4BAA4B;AAC5B,OAAO;KACF,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,0EAA0E,CAAC;KACvF,MAAM,CAAC,mBAAmB,EAAE,6BAA6B,EAAE,QAAQ,CAAC;KACpE,MAAM,CAAC,YAAY,CAAC,CAAC;AAE1B,gBAAgB;AAChB,OAAO;KACF,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,iDAAiD,CAAC;KAC9D,MAAM,CAAC,YAAY,CAAC,CAAC;AAE1B,OAAO;KACF,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,aAAa,CAAC,CAAC;AAE3B,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"thinkdata.js","sourceRoot":"","sources":["../../src/bin/thinkdata.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACF,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,wEAAwE,CAAC;KACrF,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,mBAAmB;AACnB,OAAO;KACF,OAAO,CAAC,6BAA6B,CAAC;KACtC,WAAW,CAAC,gEAAgE,CAAC;KAC7E,MAAM,CAAC,mBAAmB,EAAE,6BAA6B,CAAC;KAC1D,MAAM,CAAC,mBAAmB,EAAE,eAAe,CAAC;KAC5C,MAAM,CAAC,mBAAmB,EAAE,eAAe,EAAE,QAAQ,CAAC;KACtD,MAAM,CAAC,qBAAqB,EAAE,eAAe,CAAC;KAC9C,MAAM,CAAC,mBAAmB,EAAE,eAAe,CAAC;KAC5C,MAAM,CAAC,yBAAyB,EAAE,8CAA8C,CAAC;KACjF,MAAM,CAAC,uBAAuB,EAAE,iCAAiC,CAAC;KAClE,MAAM,CAAC,OAAO,EAAE,uBAAuB,CAAC;KACxC,MAAM,CAAC,iBAAiB,EAAE,oCAAoC,CAAC;KAC/D,MAAM,CAAC,aAAa,EAAE,iDAAiD,CAAC;KACxE,MAAM,CAAC,gBAAgB,EAAE,sEAAsE,CAAC;KAChG,MAAM,CAAC,qBAAqB,EAAE,sCAAsC,CAAC;KACrE,MAAM,CAAC,mBAAmB,EAAE,yBAAyB,CAAC;KACtD,MAAM,CAAC,cAAc,CAAC,CAAC;AAE5B,mBAAmB;AACnB,OAAO;KACF,OAAO,CAAC,6BAA6B,CAAC;KACtC,WAAW,CAAC,6CAA6C,CAAC;KAC1D,MAAM,CAAC,iBAAiB,EAAE,oCAAoC,CAAC;KAC/D,MAAM,CAAC,aAAa,EAAE,iDAAiD,CAAC;KACxE,MAAM,CAAC,gBAAgB,EAAE,qBAAqB,CAAC;KAC/C,MAAM,CAAC,mBAAmB,EAAE,oCAAoC,CAAC;KACjE,MAAM,CAAC,cAAc,CAAC,CAAC;AAE5B,4BAA4B;AAC5B,OAAO;KACF,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,0EAA0E,CAAC;KACvF,MAAM,CAAC,mBAAmB,EAAE,6BAA6B,EAAE,QAAQ,CAAC;KACpE,MAAM,CAAC,YAAY,CAAC,CAAC;AAE1B,gBAAgB;AAChB,eAAe;AACf,8DAA8D;AAC9D,OAAO;KACF,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,wEAAwE,CAAC;KACrF,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;KAC7C,MAAM,CAAC,eAAe,EAAE,+CAA+C,CAAC;KACxE,MAAM,CAAC,OAAO,EAAE,uEAAuE,CAAC;KACxF,MAAM,CAAC,UAAU,CAAC,CAAC;AAExB,gBAAgB;AAChB,OAAO;KACF,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,iDAAiD,CAAC;KAC9D,MAAM,CAAC,YAAY,CAAC,CAAC;AAE1B,OAAO;KACF,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,aAAa,CAAC,CAAC;AAE3B,OAAO,CAAC,KAAK,EAAE,CAAC"}