@carllee1983/dbcli 0.1.0 → 0.3.0-beta

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.
@@ -0,0 +1,530 @@
1
+ # dbcli — 為 AI 代理的資料庫 CLI
2
+
3
+ [English](./README.md) | 繁體中文
4
+
5
+ ## 概述
6
+
7
+ dbcli 是一個統一的資料庫 CLI 工具,能讓 AI 代理(Claude Code、Gemini、Copilot、Cursor)安全地查詢、探索及操作資料庫。它扮演 AI 代理和多個資料庫系統(PostgreSQL、MySQL、MariaDB)之間的橋樑,簡化連接複雜度並強制實施基於權限的訪問控制。開發者每個專案初始化一次,之後 AI 代理就能智慧地與資料庫互動,無需手動架構探索或 SQL 語法知識。
8
+
9
+ ## 核心價值
10
+
11
+ **AI 代理能透過單一的、權限受控的 CLI 工具安全且智慧地訪問專案資料庫,並提供敏感資料保護。**
12
+
13
+ ## 快速開始
14
+
15
+ ### 安裝
16
+
17
+ 使用 Bun 安裝:
18
+
19
+ ```bash
20
+ bun add -D dbcli
21
+ ```
22
+
23
+ 或使用 npm:
24
+
25
+ ```bash
26
+ npm install --save-dev dbcli
27
+ ```
28
+
29
+ ### 初始化
30
+
31
+ ```bash
32
+ # 交互式設定
33
+ dbcli init
34
+
35
+ # 或非交互模式
36
+ dbcli init --host localhost --port 5432 --user postgres --password secret --name mydb --system postgresql
37
+ ```
38
+
39
+ ### 基本使用
40
+
41
+ ```bash
42
+ # 列出所有表
43
+ dbcli list
44
+
45
+ # 查看特定表的架構
46
+ dbcli schema users
47
+
48
+ # 執行查詢
49
+ dbcli query "SELECT * FROM users LIMIT 10"
50
+
51
+ # 新增資料
52
+ dbcli insert users --data '{"name":"Alice","email":"alice@example.com"}'
53
+
54
+ # 更新資料
55
+ dbcli update users --where "id=1" --set '{"status":"active"}'
56
+
57
+ # 刪除資料(僅限 Admin)
58
+ dbcli delete users --where "id=1" --force
59
+
60
+ # 導出結果
61
+ dbcli export "SELECT * FROM users" --format json --output users.json
62
+ ```
63
+
64
+ ## 國際化
65
+
66
+ dbcli 支援多語言,可透過 `DBCLI_LANG` 環境變數控制:
67
+
68
+ ```bash
69
+ # 英文(預設)
70
+ dbcli init
71
+
72
+ # 繁體中文
73
+ DBCLI_LANG=zh-TW dbcli init
74
+
75
+ # 或在 .env 中設定
76
+ export DBCLI_LANG=zh-TW
77
+ dbcli init
78
+ ```
79
+
80
+ 支援語言:
81
+ - `en` — English(英文,預設)
82
+ - `zh-TW` — 繁體中文(台灣)
83
+
84
+ 所有訊息、幫助文字和錯誤都會根據語言設定自動翻譯。
85
+
86
+ ## 功能
87
+
88
+ ### 初始化與配置
89
+
90
+ - `dbcli init` — 混合模式初始化(先讀取 .env,再提示缺少的值)
91
+ - 支援混合資料庫系統配置(PostgreSQL、MySQL、MariaDB)
92
+ - 自動解析專案 .env 檔案
93
+ - 將配置儲存在 `.dbcli`(JSON 格式,按資料庫系統區分)
94
+ - 定義粗粒度權限:Query-only / Read-Write / Admin
95
+
96
+ ### 架構探索與存儲
97
+
98
+ - `dbcli list` — 列出所有表
99
+ - `dbcli schema [table]` — 檢查單個或所有表的架構
100
+ - 自動生成 `.dbcli` 搭配表結構及關聯
101
+ - 支援增量架構刷新
102
+
103
+ ### 查詢操作
104
+
105
+ - `dbcli query "SELECT ..."` — 直接 SQL 查詢執行
106
+ - 尊重權限等級(Query-only 模式拒絕寫入)
107
+ - 返回結構化結果(便於 AI 解析)
108
+ - 提供有用的錯誤訊息
109
+
110
+ ### 資料修改(附帶安全措施)
111
+
112
+ - `dbcli insert [table]` — 插入資料(需要驗證,權限檢查)
113
+ - `dbcli update [table]` — 更新資料(需要驗證,權限檢查)
114
+ - `dbcli delete [table]` — 刪除資料(僅限 Admin)
115
+ - 返回確認及受影響行數
116
+
117
+ ### 導出
118
+
119
+ - `dbcli export "SELECT ..." [--format json|csv]` — 導出查詢結果
120
+
121
+ ### 資料存取控制(黑名單)
122
+
123
+ - `dbcli blacklist table add/remove <table>` — 封鎖或解除封鎖整個表
124
+ - `dbcli blacklist column add/remove <table>.<column>` — 隱藏或顯示特定欄位
125
+ - `dbcli blacklist list` — 查看目前黑名單設定
126
+ - 欄位黑名單在查詢結果中自動省略,並顯示安全通知
127
+ - 可透過 `DBCLI_OVERRIDE_BLACKLIST=true` 環境變數覆蓋(僅限管理員)
128
+
129
+ ### AI 整合
130
+
131
+ - 生成 dbcli 技能文檔(Claude Code 相容)
132
+ - 支援跨平台 AI 代理使用(Claude Code、Gemini、Copilot CLI、Cursor、IDE)
133
+ - 技能動態反映 dbcli 功能
134
+
135
+ ## 權限模型
136
+
137
+ dbcli 使用三層粗粒度權限模型,並搭配黑名單系統提供敏感表和欄位的細粒度保護(見[資料存取控制](#資料存取控制)):
138
+
139
+ ### 1. Query-only(查詢只讀)
140
+
141
+ 可用命令:
142
+ - `dbcli list` — 列出表
143
+ - `dbcli schema [table]` — 查看架構
144
+ - `dbcli query "SELECT ..."` — 查詢
145
+
146
+ 限制:
147
+ - 寫入操作(INSERT、UPDATE、DELETE)被拒絕
148
+ - 查詢自動限制為 1000 行(防止意外全表掃描)
149
+
150
+ ### 2. Read-Write(讀寫)
151
+
152
+ 可用命令:
153
+ - Query-only 的所有命令
154
+ - `dbcli insert` — 插入資料
155
+ - `dbcli update` — 更新資料
156
+
157
+ 限制:
158
+ - DELETE 被拒絕(需要 Admin)
159
+ - Insert/Update 需要確認(除非 `--force`)
160
+
161
+ ### 3. Admin(管理員)
162
+
163
+ 完全訪問:
164
+ - 所有讀寫操作
165
+ - DELETE 無限制
166
+ - 可跳過確認(`--force`)
167
+
168
+ ## 資料存取控制
169
+
170
+ dbcli 提供黑名單系統,與權限模型協同運作,防止 AI 代理存取敏感表或欄位,無論其權限等級為何。
171
+
172
+ ### 表層級黑名單
173
+
174
+ 封鎖表後,所有操作(查詢、插入、更新、刪除)均會被拒絕,並顯示明確的錯誤訊息。
175
+
176
+ ```bash
177
+ dbcli blacklist table add secrets_vault
178
+ dbcli query "SELECT * FROM secrets_vault"
179
+ # 錯誤:表 'secrets_vault' 已被列入黑名單
180
+ ```
181
+
182
+ ### 欄位層級黑名單
183
+
184
+ 黑名單欄位會從 SELECT 結果中自動省略,並在輸出中顯示安全通知,讓 AI 代理了解結果集已被過濾。
185
+
186
+ ```bash
187
+ dbcli blacklist column add users.password_hash
188
+ dbcli query "SELECT * FROM users"
189
+ # [安全通知] 已省略黑名單欄位:password_hash
190
+ ```
191
+
192
+ ### 黑名單配置範例
193
+
194
+ 黑名單規則儲存在 `.dbcli` 配置檔案中:
195
+
196
+ ```json
197
+ {
198
+ "blacklist": {
199
+ "tables": ["audit_logs", "secrets_vault"],
200
+ "columns": {
201
+ "users": ["password_hash", "ssn"]
202
+ }
203
+ }
204
+ }
205
+ ```
206
+
207
+ ### 覆蓋黑名單
208
+
209
+ 管理員可透過環境變數在緊急情況下繞過黑名單:
210
+
211
+ ```bash
212
+ DBCLI_OVERRIDE_BLACKLIST=true dbcli query "SELECT * FROM secrets_vault"
213
+ ```
214
+
215
+ ## 常見命令
216
+
217
+ ### 初始化
218
+
219
+ ```bash
220
+ dbcli init
221
+ # 提示:主機、埠口、用戶、密碼、資料庫名稱、權限級別
222
+
223
+ dbcli init --host db.example.com --port 5432 --user admin --password secret --name prod_db --system postgresql
224
+ # 非交互式初始化
225
+ ```
226
+
227
+ ### 列出表
228
+
229
+ ```bash
230
+ dbcli list
231
+ # 以表格輸出
232
+ # ┌─────────┬──────────┬────────┐
233
+ # │ Table │ Rows │ Engine │
234
+ # ├─────────┼──────────┼────────┤
235
+ # │ users │ 1,250 │ InnoDB │
236
+ # │ posts │ 8,431 │ InnoDB │
237
+ # └─────────┴──────────┴────────┘
238
+
239
+ dbcli list --format json
240
+ # 以 JSON 輸出
241
+ ```
242
+
243
+ ### 查看架構
244
+
245
+ ```bash
246
+ dbcli schema users
247
+ # 列出 users 表的欄位、型別、約束
248
+
249
+ dbcli schema
250
+ # 掃描整個資料庫架構
251
+
252
+ dbcli schema --refresh --force
253
+ # 檢測並應用架構變更(增量)
254
+
255
+ dbcli schema --reset --force
256
+ # 清空舊 schema 並重新從 DB 抓取(切換 DB 後使用)
257
+ ```
258
+
259
+ ### 執行查詢
260
+
261
+ ```bash
262
+ dbcli query "SELECT id, name FROM users WHERE active = true"
263
+
264
+ dbcli query "SELECT * FROM posts" --format json
265
+ # 以 JSON 輸出
266
+
267
+ dbcli query "SELECT * FROM large_table" --limit 100
268
+ # 限制行數
269
+
270
+ dbcli query "SELECT * FROM large_table" --no-limit
271
+ # 停用自動限制(Query-only 模式下需要 `--force`)
272
+ ```
273
+
274
+ ### 插入資料
275
+
276
+ ```bash
277
+ dbcli insert users --data '{"name":"Bob","email":"bob@example.com"}'
278
+
279
+ echo '{"name":"Charlie","email":"charlie@example.com"}' | dbcli insert users
280
+
281
+ dbcli insert users --data '{"name":"David","email":"david@example.com"}' --force
282
+ # 跳過確認提示
283
+ ```
284
+
285
+ ### 更新資料
286
+
287
+ ```bash
288
+ dbcli update users --where "id=1" --set '{"status":"active"}'
289
+
290
+ dbcli update posts --where "author_id=5" --set '{"updated_at":"2026-03-26"}'
291
+
292
+ dbcli update users --where "id=1" --set '{"name":"Updated"}' --dry-run
293
+ # 顯示 SQL 但不執行
294
+ ```
295
+
296
+ ### 刪除資料
297
+
298
+ ```bash
299
+ # 僅限 Admin 權限
300
+ dbcli delete users --where "id=1"
301
+
302
+ dbcli delete users --where "status='inactive'" --force
303
+ # 跳過確認提示
304
+ ```
305
+
306
+ ### 導出資料
307
+
308
+ ```bash
309
+ dbcli export "SELECT * FROM users" --format json --output users.json
310
+
311
+ dbcli export "SELECT id, name FROM posts" --format csv > posts.csv
312
+ ```
313
+
314
+ ### 生成技能
315
+
316
+ ```bash
317
+ dbcli skill
318
+ # 輸出到標準輸出(用於管道傳輸)
319
+
320
+ dbcli skill --output ./SKILL.md
321
+ # 寫入檔案
322
+
323
+ dbcli skill --install claude
324
+ # 安裝至 Claude Code 技能目錄
325
+ ```
326
+
327
+ ### 管理黑名單
328
+
329
+ ```bash
330
+ # 查看目前黑名單
331
+ dbcli blacklist list
332
+
333
+ # 封鎖整個表
334
+ dbcli blacklist table add audit_logs
335
+ dbcli blacklist table add secrets_vault
336
+
337
+ # 從黑名單移除表
338
+ dbcli blacklist table remove audit_logs
339
+
340
+ # 隱藏敏感欄位
341
+ dbcli blacklist column add users.password_hash
342
+ dbcli blacklist column add users.ssn
343
+
344
+ # 從黑名單移除欄位
345
+ dbcli blacklist column remove users.ssn
346
+
347
+ # 管理員覆蓋黑名單(緊急使用)
348
+ DBCLI_OVERRIDE_BLACKLIST=true dbcli query "SELECT * FROM secrets_vault"
349
+ ```
350
+
351
+ ## 環境配置
352
+
353
+ ### .dbcli 配置檔案
354
+
355
+ 初始化後,dbcli 會創建 `.dbcli` 檔案:
356
+
357
+ ```json
358
+ {
359
+ "connection": {
360
+ "system": "postgresql",
361
+ "host": "localhost",
362
+ "port": 5432,
363
+ "user": "postgres",
364
+ "password": "secret",
365
+ "database": "mydb"
366
+ },
367
+ "permission": "read-write",
368
+ "metadata": {
369
+ "createdAt": "2026-03-26T12:00:00Z",
370
+ "tables": [
371
+ {
372
+ "name": "users",
373
+ "columns": [...],
374
+ "primaryKey": ["id"],
375
+ "foreignKeys": [...]
376
+ }
377
+ ]
378
+ }
379
+ }
380
+ ```
381
+
382
+ ### 環境變數參考
383
+
384
+ | 變數 | 說明 | 預設值 |
385
+ |------|------|--------|
386
+ | `DBCLI_LANG` | 語言(en、zh-TW) | `en` |
387
+ | `DATABASE_URL` | 資料庫連接字串(可選,init 會嘗試解析) | 無 |
388
+
389
+ ### .env 整合
390
+
391
+ dbcli init 會自動解析 .env 檔案以預先填入連接詳細資訊:
392
+
393
+ ```bash
394
+ # .env
395
+ DATABASE_URL=postgresql://user:password@localhost:5432/mydb
396
+
397
+ dbcli init
398
+ # 自動填入資料庫詳細資訊,只需確認或調整
399
+ ```
400
+
401
+ ## 故障排除
402
+
403
+ ### 「未配置資料庫」
404
+
405
+ ```
406
+ Database not configured. Run: dbcli init
407
+ ```
408
+
409
+ **解決方案:** 執行 `dbcli init` 建立 `.dbcli` 配置檔案。
410
+
411
+ ### 「連接失敗」
412
+
413
+ ```
414
+ Failed to connect to database: ECONNREFUSED 127.0.0.1:5432
415
+ ```
416
+
417
+ **檢查清單:**
418
+ - 資料庫伺服器是否執行中?
419
+ - 主機和埠口是否正確?
420
+ - 用戶和密碼是否有效?
421
+ - 網路是否可達?(特別是遠程資料庫)
422
+
423
+ ### 「權限被拒」
424
+
425
+ ```
426
+ Permission denied (required: admin)
427
+ ```
428
+
429
+ **解決方案:**
430
+ - 該命令需要更高的權限等級
431
+ - 執行 `dbcli init` 並選擇更高的權限級別
432
+ - 或聯繫資料庫管理員
433
+
434
+ ### 「表不存在」
435
+
436
+ ```
437
+ Table not found: nonexistent_table
438
+ ```
439
+
440
+ **解決方案:**
441
+ - 執行 `dbcli list` 檢查可用表
442
+ - 檢查表名拼寫
443
+ - 確認已連接到正確的資料庫
444
+
445
+ ### 查詢超時
446
+
447
+ ```
448
+ Query timeout after 30s
449
+ ```
450
+
451
+ **解決方案:**
452
+ - 簡化查詢(新增 WHERE 條件、JOIN 等)
453
+ - 使用 `--limit` 限制行數
454
+ - 檢查資料庫索引是否最佳化
455
+
456
+ ## 技術棧
457
+
458
+ | 組件 | 技術 | 理由 |
459
+ |------|------|------|
460
+ | 執行時 | Bun | 快速啟動、原生 TS 支援 |
461
+ | 資料庫 | PostgreSQL、MySQL、MariaDB | 廣泛使用、成熟生態 |
462
+ | 測試 | Vitest | 快速、全面的單位 & 集成測試 |
463
+ | 分發 | npm | 標準 Node.js/Bun 生態 |
464
+
465
+ ## 開發
466
+
467
+ ### 設定開發環境
468
+
469
+ ```bash
470
+ # 克隆倉庫
471
+ git clone https://github.com/your-org/dbcli.git
472
+ cd dbcli
473
+
474
+ # 安裝依賴
475
+ bun install
476
+
477
+ # 執行測試
478
+ bun test
479
+
480
+ # 本地開發
481
+ bun run src/cli.ts init
482
+ ```
483
+
484
+ ### 測試
485
+
486
+ ```bash
487
+ # 執行所有測試
488
+ bun test
489
+
490
+ # 執行特定測試檔案
491
+ bun test src/commands/query.test.ts
492
+
493
+ # 監視模式
494
+ bun test --watch
495
+ ```
496
+
497
+ ### 構建
498
+
499
+ ```bash
500
+ # 構建發行版本
501
+ bun build src/cli.ts --outfile dist/cli.mjs
502
+ ```
503
+
504
+ ## 貢獻
505
+
506
+ 貢獻歡迎!請提交問題和拉請求。
507
+
508
+ ### 開發者指南
509
+
510
+ 詳見 [CONTRIBUTING.md](./CONTRIBUTING.md)。
511
+
512
+ ### 國際化貢獻
513
+
514
+ 如果要新增訊息或翻譯:
515
+
516
+ 1. 編輯 `resources/lang/{en,zh-TW}/messages.json`
517
+ 2. 在命令中使用 `t()` 或 `t_vars()`
518
+ 3. 執行測試確保一致性
519
+
520
+ ## 授權
521
+
522
+ MIT — 見 [LICENSE](./LICENSE)
523
+
524
+ ## 更新日誌
525
+
526
+ 見 [CHANGELOG.md](./CHANGELOG.md)。
527
+
528
+ ---
529
+
530
+ **最後更新:** 2026-03-26 | **版本:** v1.0.0+