@carllee1983/dbcli 1.1.0 → 1.2.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.zh-TW.md CHANGED
@@ -1,395 +1,643 @@
1
- # dbcli — 為 AI 代理的資料庫 CLI
1
+ # dbcli — 為 AI 代理設計的資料庫 CLI
2
2
 
3
- [English](./README.md) | 繁體中文
3
+ **語言:** [English](./README.md) | [繁體中文](./README.zh-TW.md)
4
4
 
5
- ## 概述
5
+ 統一的資料庫 CLI 工具,讓 AI 代理(Claude Code、Gemini、Copilot、Cursor)能安全地查詢、探索與操作資料庫。
6
6
 
7
- dbcli 是一個統一的資料庫 CLI 工具,能讓 AI 代理(Claude Code、Gemini、Copilot、Cursor)安全地查詢、探索及操作資料庫。它扮演 AI 代理和多個資料庫系統(PostgreSQL、MySQL、MariaDB)之間的橋樑,簡化連接複雜度並強制實施基於權限的訪問控制。開發者每個專案初始化一次,之後 AI 代理就能智慧地與資料庫互動,無需手動架構探索或 SQL 語法知識。
7
+ **核心價值:** AI 代理可透過單一、具權限控管的 CLI 工具,在敏感資料保護下安全且智慧地存取專案資料庫。
8
8
 
9
- ## 核心價值
9
+ ## 國際化(i18n)
10
+
11
+ dbcli 透過環境變數 `DBCLI_LANG` 支援多語系:
12
+
13
+ ```bash
14
+ # 英文(預設)
15
+ dbcli init
16
+
17
+ # 繁體中文
18
+ DBCLI_LANG=zh-TW dbcli init
19
+
20
+ # 或在 .env 中設定
21
+ export DBCLI_LANG=zh-TW
22
+ dbcli init
23
+ ```
24
+
25
+ **支援語言:**
26
+ - `en` — English(預設)
27
+ - `zh-TW` — 繁體中文(台灣)
28
+
29
+ 所有訊息、說明文字、錯誤訊息與指令輸出會依語言設定自動切換。
10
30
 
11
- **AI 代理能透過單一的、權限受控的 CLI 工具安全且智慧地訪問專案資料庫,並提供敏感資料保護。**
12
31
 
13
32
  ## 快速開始
14
33
 
15
34
  ### 安裝
16
35
 
17
- 使用 Bun 安裝:
36
+ #### 全域安裝(建議)
18
37
 
19
38
  ```bash
20
- bun add -D @carllee1983/dbcli
39
+ npm install -g @carllee1983/dbcli
40
+ # 或使用 Bun:bun install -g @carllee1983/dbcli
21
41
  ```
22
42
 
23
- 或使用 npm:
43
+ #### 免安裝(無需事先安裝)
24
44
 
25
45
  ```bash
26
- npm install --save-dev @carllee1983/dbcli
46
+ npx @carllee1983/dbcli init
47
+ npx @carllee1983/dbcli query "SELECT * FROM users"
48
+ # 或使用 Bun:bunx @carllee1983/dbcli init
27
49
  ```
28
50
 
29
- ### 更新
51
+ #### 更新
30
52
 
31
53
  ```bash
32
- # 自動更新(推薦)
54
+ # 自我更新(建議)
33
55
  dbcli upgrade
34
56
 
35
- # 或手動更新
36
- bun update @carllee1983/dbcli
57
+ # 或透過 npm
58
+ npm update -g @carllee1983/dbcli
37
59
  ```
38
60
 
39
- ### 初始化
61
+ #### 開發安裝
40
62
 
41
63
  ```bash
42
- # 交互式設定
43
- dbcli init
44
-
45
- # 或非交互模式
46
- dbcli init --host localhost --port 5432 --user postgres --password secret --name mydb --system postgresql
64
+ git clone https://github.com/CarlLee1983/dbcli.git
65
+ cd dbcli
66
+ bun install
67
+ bun run src/cli.ts -- --help
68
+ # 或:bun run dev -- --help
47
69
  ```
48
70
 
49
- ### 基本使用
71
+ `dbcli` 未在 `PATH` 中,請使用 `bun run src/cli.ts <子指令> ...`(與 `bun run dev -- <子指令> ...` 相同)。
72
+
73
+ ### 第一步
50
74
 
51
75
  ```bash
52
- # 列出所有表
76
+ # 以資料庫連線初始化專案
77
+ dbcli init
78
+
79
+ # 具備自動補全功能的互動式 Shell
80
+ dbcli shell
81
+
82
+ # 列出可用資料表
53
83
  dbcli list
54
84
 
55
- # 查看特定表的架構
85
+ # 檢視資料表結構
56
86
  dbcli schema users
57
87
 
58
- # 執行查詢
59
- dbcli query "SELECT * FROM users LIMIT 10"
88
+ # 查詢資料
89
+ dbcli query "SELECT * FROM users"
90
+
91
+ # 修改結構 (DDL)
92
+ dbcli migrate create posts --column "id:int:pk" "title:varchar(100)"
60
93
 
61
- # 新增資料
62
- dbcli insert users --data '{"name":"Alice","email":"alice@example.com"}'
94
+ # 產生 AI 代理 skill
95
+ dbcli skill --install claude
96
+ ```
63
97
 
64
- # 更新資料
65
- dbcli update users --where "id=1" --set '{"status":"active"}'
98
+ ---
66
99
 
67
- # 刪除資料(僅限 Admin)
68
- dbcli delete users --where "id=1" --force
100
+ ## 多重連線支援 (v2)
69
101
 
70
- # 導出結果
71
- dbcli export "SELECT * FROM users" --format json --output users.json
72
- ```
102
+ dbcli 支援在單一專案中管理多個具名的資料庫連線。這對於管理不同環境(開發、測試、正式)或多個資料庫非常有用。
73
103
 
74
- ## 國際化
104
+ ### 初始化具名連線
75
105
 
76
- dbcli 支援多語言,可透過 `DBCLI_LANG` 環境變數控制:
106
+ 若要建立具名連線,請在 `init` 時使用 `--conn-name` 選項。您也可以為該連線指定自訂的 `.env` 檔案。
77
107
 
78
108
  ```bash
79
- # 英文(預設)
80
- dbcli init
81
-
82
- # 繁體中文
83
- DBCLI_LANG=zh-TW dbcli init
109
+ # 使用 .env.staging 建立名為 staging 的連線
110
+ dbcli init --conn-name staging --env-file .env.staging
84
111
 
85
- # 或在 .env 中設定
86
- export DBCLI_LANG=zh-TW
87
- dbcli init
112
+ # 建立名為 prod 的正式環境連線,並使用環境變數引用
113
+ dbcli init --conn-name prod --env-file .env.production --use-env-refs
88
114
  ```
89
115
 
90
- 支援語言:
91
- - `en` — English(英文,預設)
92
- - `zh-TW` — 繁體中文(台灣)
116
+ ### 管理連線
93
117
 
94
- 所有訊息、幫助文字和錯誤都會根據語言設定自動翻譯。
118
+ 使用 `dbcli use` 指令切換連線或列出所有連線。
95
119
 
96
- ## 功能
120
+ ```bash
121
+ # 列出所有連線(* 標記目前的預設值)
122
+ dbcli use --list
97
123
 
98
- ### 初始化與配置
124
+ # 將預設連線切換至 'staging'
125
+ dbcli use staging
99
126
 
100
- - `dbcli init` — 混合模式初始化(先讀取 .env,再提示缺少的值)
101
- - 支援混合資料庫系統配置(PostgreSQL、MySQL、MariaDB)
102
- - 自動解析專案 .env 檔案
103
- - 將配置儲存在 `.dbcli`(JSON 格式,按資料庫系統區分)
104
- - 定義粗粒度權限:Query-only / Read-Write / Admin
127
+ # 顯示目前的預設連線
128
+ dbcli use
105
129
 
106
- ### 架構探索與存儲
130
+ # 移除連線
131
+ dbcli init --remove staging
107
132
 
108
- - `dbcli list` — 列出所有表
109
- - `dbcli schema [table]` — 檢查單個或所有表的架構
110
- - 自動生成 `.dbcli` 搭配表結構及關聯
111
- - 支援增量架構刷新
133
+ # 重新命名連線
134
+ dbcli init --rename staging:production
135
+ ```
112
136
 
113
- ### 查詢操作
137
+ ### 臨時使用特定連線
114
138
 
115
- - `dbcli query "SELECT ..."` — 直接 SQL 查詢執行
116
- - 尊重權限等級(Query-only 模式拒絕寫入)
117
- - 返回結構化結果(便於 AI 解析)
118
- - 提供有用的錯誤訊息
139
+ 您可以使用 `--use <name>` 全域旗標,針對特定連線執行任一指令,而無需變更預設設定。
119
140
 
120
- ### 資料修改(附帶安全措施)
141
+ ```bash
142
+ # 針對正式資料庫執行一次查詢
143
+ dbcli query "SELECT count(*) FROM users" --use prod
121
144
 
122
- - `dbcli insert [table]` — 插入資料(需要驗證,權限檢查)
123
- - `dbcli update [table]` 更新資料(需要驗證,權限檢查)
124
- - `dbcli delete [table]` — 刪除資料(僅限 Admin)
125
- - 返回確認及受影響行數
145
+ # 檢查測試環境資料表的健康狀態
146
+ dbcli check users --use staging
147
+ ```
126
148
 
127
- ### 導出
149
+ ---
128
150
 
129
- - `dbcli export "SELECT ..." [--format json|csv]` — 導出查詢結果
130
151
 
131
- ### 資料存取控制(黑名單)
152
+ #### `dbcli init`
132
153
 
133
- - `dbcli blacklist table add/remove <table>` — 封鎖或解除封鎖整個表
134
- - `dbcli blacklist column add/remove <table>.<column>` — 隱藏或顯示特定欄位
135
- - `dbcli blacklist list` — 查看目前黑名單設定
136
- - 欄位黑名單在查詢結果中自動省略,並顯示安全通知
137
- - 可透過 `DBCLI_OVERRIDE_BLACKLIST=true` 環境變數覆蓋(僅限管理員)
154
+ 以資料庫連線設定初始化新的 dbcli 專案。
138
155
 
139
- ### AI 整合
156
+ **用法:**
157
+ ```bash
158
+ dbcli init [OPTIONS]
159
+ ```
140
160
 
141
- - 生成 dbcli 技能文檔(Claude Code 相容)
142
- - 支援跨平台 AI 代理使用(Claude Code、Gemini、Copilot CLI、Cursor、IDE)
143
- - 技能動態反映 dbcli 功能
161
+ **選項 (基本):**
162
+ - `--system <type>` 資料庫系統:`postgresql`、`mysql`、`mariadb`
163
+ - `--host <host>` — 主機
164
+ - `--port <port>` — 埠號
165
+ - `--user <user>` — 使用者
166
+ - `--password <pass>` — 密碼
167
+ - `--name <db>` — 資料庫名稱
168
+ - `--permission <level>` — 權限等級:`query-only`、`read-write`、`data-admin`、`admin`
169
+ - `--use-env-refs` — 在設定檔中儲存環境變數名稱參照,而非實際值
170
+ - `--skip-test` — 略過連線測試
171
+ - `--no-interactive` — 非互動模式(須提供所有必要選項)
172
+ - `--force` — 覆寫既有設定且不詢問確認
173
+
174
+ **選項 (多重連線 v2):**
175
+ - `--conn-name <name>` — 建立具名連線(例如 `staging`、`prod`)
176
+ - `--env-file <path>` — 從指定的 `.env` 檔案載入此連線的憑證
177
+ - `--remove <name>` — 從設定中移除具名連線
178
+ - `--rename <old:new>` — 重新命名現有連線(格式:`舊名:新名`)
179
+ **行為:**
180
+ - 若存在 `.env` 會讀取(自動帶入 DATABASE_URL、DB_* 等變數)
181
+ - 缺少的欄位會互動提示(主機、埠、使用者、密碼、資料庫名、權限等級)
182
+ - 在專案根目錄建立 `.dbcli` JSON 設定檔
183
+ - 儲存前會測試資料庫連線
184
+
185
+ **範例:**
186
+ ```bash
187
+ # 互動式初始化
188
+ dbcli init
144
189
 
145
- ### 診斷與維護
190
+ # 多重連線設定
191
+ dbcli init --conn-name staging --env-file .env.staging
192
+ dbcli init --conn-name prod --env-file .env.production --use-env-refs
146
193
 
147
- - `dbcli doctor` — 執行環境、設定、連線與資料的全面診斷
148
- - `dbcli upgrade` 檢查更新並自動升級 dbcli
149
- - `dbcli completion [shell]` — 產生 shell 自動補全腳本(bash、zsh、fish)
194
+ # 儲存環境變數參照(非互動)
195
+ dbcli init --use-env-refs --system mysql \
196
+ --env-host DB_HOST --env-port DB_PORT \
197
+ --env-user DB_USER --env-password DB_PASSWORD \
198
+ --env-database DB_DATABASE \
199
+ --no-interactive
200
+ ```
150
201
 
151
- ## 權限模型
202
+ ---
152
203
 
153
- dbcli 使用三層粗粒度權限模型,並搭配黑名單系統提供敏感表和欄位的細粒度保護(見[資料存取控制](#資料存取控制)):
204
+ #### `dbcli use` (需要 v2 設定)
154
205
 
155
- ### 1. Query-only(查詢只讀)
206
+ 在多重連線專案中管理或切換預設資料庫連線。
156
207
 
157
- 可用命令:
158
- - `dbcli list` — 列出表
159
- - `dbcli schema [table]` — 查看架構
160
- - `dbcli query "SELECT ..."` — 查詢
208
+ **用法:**
209
+ ```bash
210
+ dbcli use [連線名稱] [選項]
211
+ ```
161
212
 
162
- 限制:
163
- - 寫入操作(INSERT、UPDATE、DELETE)被拒絕
164
- - 查詢自動限制為 1000 行(防止意外全表掃描)
213
+ **選項:**
214
+ - `--list` — 列出所有連線並顯示目前的預設值
165
215
 
166
- ### 2. Read-Write(讀寫)
216
+ **範例:**
217
+ ```bash
218
+ # 顯示目前的預設連線
219
+ dbcli use
167
220
 
168
- 可用命令:
169
- - Query-only 的所有命令
170
- - `dbcli insert` — 插入資料
171
- - `dbcli update` — 更新資料
221
+ # 將預設連線切換至 'prod'
222
+ dbcli use prod
172
223
 
173
- 限制:
174
- - DELETE 被拒絕(需要 Admin)
175
- - Insert/Update 需要確認(除非 `--force`)
224
+ # 列出所有連線
225
+ dbcli use --list
226
+ ```
176
227
 
177
- ### 3. Admin(管理員)
228
+ ---
178
229
 
179
- 完全訪問:
180
- - 所有讀寫操作
181
- - DELETE 無限制
182
- - 可跳過確認(`--force`)
230
+ > **`--use-env-refs`:** 啟用後,設定檔會儲存環境變數名稱(例如 `{"$env": "DB_HOST"}`)而非實際值,避免將憑證寫入檔案,適合多環境與 CI/CD。連線時 dbcli 會自動從對應環境變數讀取實際值。
183
231
 
184
- ## 資料存取控制
232
+ ---
185
233
 
186
- dbcli 提供黑名單系統,與權限模型協同運作,防止 AI 代理存取敏感表或欄位,無論其權限等級為何。
234
+ #### `dbcli list`
187
235
 
188
- ### 表層級黑名單
236
+ 列出已連線資料庫中的所有資料表。
237
+
238
+ **用法:**
239
+ ```bash
240
+ dbcli list [OPTIONS]
241
+ ```
189
242
 
190
- 封鎖表後,所有操作(查詢、插入、更新、刪除)均會被拒絕,並顯示明確的錯誤訊息。
243
+ **選項:**
244
+ - `--format json` — 以 JSON 輸出,而非 ASCII 表格
191
245
 
246
+ **範例:**
192
247
  ```bash
193
- dbcli blacklist table add secrets_vault
194
- dbcli query "SELECT * FROM secrets_vault"
195
- # 錯誤:表 'secrets_vault' 已被列入黑名單
248
+ # 表格(人類可讀)
249
+ dbcli list
250
+
251
+ # JSON(供 AI 解析)
252
+ dbcli list --format json
253
+
254
+ # 串接工具
255
+ dbcli list --format json | jq '.data[].name'
196
256
  ```
197
257
 
198
- ### 欄位層級黑名單
258
+ ---
199
259
 
200
- 黑名單欄位會從 SELECT 結果中自動省略,並在輸出中顯示安全通知,讓 AI 代理了解結果集已被過濾。
260
+ #### `dbcli schema [table]`
201
261
 
262
+ 顯示資料表結構(欄位、型別、限制、外鍵)。
263
+
264
+ **用法:**
202
265
  ```bash
203
- dbcli blacklist column add users.password_hash
204
- dbcli query "SELECT * FROM users"
205
- # [安全通知] 已省略黑名單欄位:password_hash
266
+ dbcli schema [table]
267
+ dbcli schema # 掃描整個資料庫並更新 .dbcli
268
+ dbcli schema users # 顯示 `users` 表結構
206
269
  ```
207
270
 
208
- ### 黑名單配置範例
271
+ **選項:**
272
+ - `--format json` — JSON 輸出
273
+ - `--refresh` — 偵測並增量更新 schema 變更(需 `--force` 核准)
274
+ - `--reset` — 清除既有 schema 並自資料庫重新抓取(切換連線後適用)
275
+ - `--force` — 重新整理/覆寫/重置時略過確認
209
276
 
210
- 黑名單規則儲存在 `.dbcli` 配置檔案中:
277
+ **範例:**
278
+ ```bash
279
+ # 顯示 users 表結構
280
+ dbcli schema users
211
281
 
212
- ```json
213
- {
214
- "blacklist": {
215
- "tables": ["audit_logs", "secrets_vault"],
216
- "columns": {
217
- "users": ["password_hash", "ssn"]
218
- }
219
- }
220
- }
282
+ # JSON 與完整中繼資料
283
+ dbcli schema users --format json
284
+
285
+ # 增量更新 schema(新表等)
286
+ dbcli schema --refresh --force
287
+
288
+ # 清空後全量重抓(切換 DB 後)
289
+ dbcli schema --reset --force
290
+
291
+ # 掃描整個資料庫
292
+ dbcli schema
221
293
  ```
222
294
 
223
- ### 覆蓋黑名單
295
+ ---
296
+
297
+ #### `dbcli query "SQL"`
224
298
 
225
- 管理員可透過環境變數在緊急情況下繞過黑名單:
299
+ 執行 SQL 查詢並回傳結果。
226
300
 
301
+ **用法:**
227
302
  ```bash
228
- DBCLI_OVERRIDE_BLACKLIST=true dbcli query "SELECT * FROM secrets_vault"
303
+ dbcli query "SELECT * FROM users"
229
304
  ```
230
305
 
231
- ## 常見命令
306
+ **選項:**
307
+ - `--format json|table|csv` — 輸出格式(預設:table)
308
+ - `--limit <數字>` — 限制列數(覆寫 query-only 下的自動上限)
309
+ - `--no-limit` — 在 query-only 模式下關閉自動 1000 列上限
232
310
 
233
- ### 初始化
311
+ **行為:**
312
+ - 依權限限制操作(Query-only 會阻擋 INSERT/UPDATE/DELETE)
313
+ - Query-only 模式預設自動限制最多 1000 列(並顯示提示),除非使用 `--no-limit` 或 `--limit`
314
+ - 回傳含中繼資料的結構化結果(列數、執行時間等)
315
+ - 若要將 CSV/JSON 寫入檔案,請用 shell 重新導向或 `export` 指令
234
316
 
317
+ **範例:**
235
318
  ```bash
236
- dbcli init
237
- # 提示:主機、埠口、用戶、密碼、資料庫名稱、權限級別
319
+ # 表格輸出
320
+ dbcli query "SELECT * FROM users"
238
321
 
239
- dbcli init --host db.example.com --port 5432 --user admin --password secret --name prod_db --system postgresql
240
- # 非交互式初始化
322
+ # JSON
323
+ dbcli query "SELECT * FROM users" --format json
241
324
 
242
- dbcli init --use-env-refs
243
- # 交互式:提示輸入環境變數名稱,config 中儲存 {"$env": "DB_HOST"} 而非實際值
325
+ # CSV 輸出至 stdout(重新導向成檔案)
326
+ dbcli query "SELECT * FROM users" --format csv > users.csv
244
327
 
245
- dbcli init --use-env-refs --system mysql \
246
- --env-host DB_HOST --env-port DB_PORT \
247
- --env-user DB_USER --env-password DB_PASSWORD \
248
- --env-database DB_DATABASE --no-interactive
249
- # 非交互式環境變數參照模式,適合 CI/CD
328
+ # 串接其他工具
329
+ dbcli query "SELECT * FROM products" --format json | jq '.data[] | .name'
330
+
331
+ # 大量結果(以 LIMIT/OFFSET 分頁)
332
+ dbcli query "SELECT * FROM users LIMIT 100 OFFSET 0"
250
333
  ```
251
334
 
252
- > **`--use-env-refs` 說明:** 使用此選項時,config 中儲存的是環境變數名稱(如 `{"$env": "DB_HOST"}`)而非實際值。這樣可以避免將敏感資訊寫入 config 檔案,適合多環境部署或 CI/CD 場景。連線時 dbcli 會自動從環境變數讀取實際值。
335
+ ---
253
336
 
254
- ### 列出表
337
+ #### `dbcli insert [table]`(需要 Read-Write 或 Admin 權限)
255
338
 
256
- ```bash
257
- dbcli list
258
- # 以表格輸出
259
- # ┌─────────┬──────────┬────────┐
260
- # │ Table │ Rows │ Engine │
261
- # ├─────────┼──────────┼────────┤
262
- # │ users │ 1,250 │ InnoDB │
263
- # │ posts │ 8,431 │ InnoDB │
264
- # └─────────┴──────────┴────────┘
339
+ 插入資料列。
265
340
 
266
- dbcli list --format json
267
- # 以 JSON 輸出
341
+ **用法:**
342
+ ```bash
343
+ dbcli insert users --data '{"name": "Alice", "email": "alice@example.com"}'
268
344
  ```
269
345
 
270
- ### 查看架構
346
+ **選項:**
347
+ - `--data JSON` — 資料列 JSON 物件(**必填**)
348
+ - `--dry-run` — 僅顯示 SQL,不執行
349
+ - `--force` — 略過確認
350
+
351
+ **行為:**
352
+ - 驗證 JSON 格式
353
+ - 產生參數化 SQL(降低 SQL 注入風險)
354
+ - 插入前顯示確認(除非使用 `--force`)
271
355
 
356
+ **範例:**
272
357
  ```bash
273
- dbcli schema users
274
- # 列出 users 表的欄位、型別、約束
358
+ # 插入一列
359
+ dbcli insert users --data '{"name": "Bob", "email": "bob@example.com"}'
275
360
 
276
- dbcli schema
277
- # 掃描整個資料庫架構
361
+ # 預覽 SQL
362
+ dbcli insert users --data '{"name": "Charlie"}' --dry-run
278
363
 
279
- dbcli schema --refresh --force
280
- # 檢測並應用架構變更(增量)
364
+ # 略過確認
365
+ dbcli insert users --data '{"name": "Diana"}' --force
366
+ ```
281
367
 
282
- dbcli schema --reset --force
283
- # 清空舊 schema 並重新從 DB 抓取(切換 DB 後使用)
368
+ ---
369
+
370
+ #### `dbcli update [table]`(需要 Read-Write 或 Admin 權限)
371
+
372
+ 更新既有資料列。
373
+
374
+ **用法:**
375
+ ```bash
376
+ dbcli update users --where "id=1" --set '{"name": "Alice Updated"}'
284
377
  ```
285
378
 
286
- ### 執行查詢
379
+ **選項:**
380
+ - `--where condition` — WHERE 條件(**必填**,例如 `"id=1 AND status='active'"`)
381
+ - `--set JSON` — 要更新的欄位 JSON(**必填**)
382
+ - `--dry-run` — 僅顯示 SQL
383
+ - `--force` — 略過確認
287
384
 
385
+ **範例:**
288
386
  ```bash
289
- dbcli query "SELECT id, name FROM users WHERE active = true"
387
+ # 更新單列
388
+ dbcli update users --where "id=1" --set '{"name": "Alice"}'
290
389
 
291
- dbcli query "SELECT * FROM posts" --format json
292
- # JSON 輸出
390
+ # 更新多列
391
+ dbcli update users --where "status='inactive'" --set '{"status":"active"}'
293
392
 
294
- dbcli query "SELECT * FROM large_table" --limit 100
295
- # 限制行數
393
+ # 預覽 SQL
394
+ dbcli update users --where "id=1" --set '{"name": "Bob"}' --dry-run
296
395
 
297
- dbcli query "SELECT * FROM large_table" --no-limit
298
- # 停用自動限制(Query-only 模式下需要 `--force`)
396
+ # 略過確認
397
+ dbcli update users --where "id=2" --set '{"email": "new@example.com"}' --force
299
398
  ```
300
399
 
301
- ### 插入資料
400
+ ---
302
401
 
303
- ```bash
304
- dbcli insert users --data '{"name":"Bob","email":"bob@example.com"}'
402
+ #### `dbcli delete [table]`(需要 Data-Admin 或 Admin 權限)
305
403
 
306
- echo '{"name":"Charlie","email":"charlie@example.com"}' | dbcli insert users
404
+ 刪除資料列(query-only read-write 不可用;需較高 DML 權限)。
307
405
 
308
- dbcli insert users --data '{"name":"David","email":"david@example.com"}' --force
309
- # 跳過確認提示
406
+ **用法:**
407
+ ```bash
408
+ dbcli delete users --where "id=1" --force
310
409
  ```
311
410
 
312
- ### 更新資料
411
+ **選項:**
412
+ - `--where condition` — WHERE 條件(**必填**)
413
+ - `--dry-run` — 僅顯示 SQL
414
+ - `--force` — 實際刪除時必填(安全閘門)
313
415
 
416
+ **範例:**
314
417
  ```bash
315
- dbcli update users --where "id=1" --set '{"status":"active"}'
418
+ # 刪除單列(須 `--force`)
419
+ dbcli delete users --where "id=1" --force
316
420
 
317
- dbcli update posts --where "author_id=5" --set '{"updated_at":"2026-03-26"}'
421
+ # 預覽刪除
422
+ dbcli delete products --where "status='deprecated'" --dry-run
318
423
 
319
- dbcli update users --where "id=1" --set '{"name":"Updated"}' --dry-run
320
- # 顯示 SQL 但不執行
424
+ # 刪除多列
425
+ dbcli delete orders --where "created_at < '2020-01-01'" --force
321
426
  ```
322
427
 
323
- ### 刪除資料
428
+ ---
324
429
 
325
- ```bash
326
- # 僅限 Admin 權限
327
- dbcli delete users --where "id=1"
430
+ #### `dbcli export "SQL"`
328
431
 
329
- dbcli delete users --where "status='inactive'" --force
330
- # 跳過確認提示
432
+ 將查詢結果匯出至檔案。
433
+
434
+ **用法:**
435
+ ```bash
436
+ dbcli export "SELECT * FROM users" --format json --output users.json
331
437
  ```
332
438
 
333
- ### 導出資料
439
+ **選項:**
440
+ - `--format json|csv` — 輸出格式
441
+ - `--output file` — 寫入檔案(預設 stdout 供管道使用)
334
442
 
443
+ **行為:**
444
+ - Query-only 權限下每次匯出最多 1000 列
445
+ - 產生符合 RFC 4180 的 CSV
446
+ - 產生結構良好的 JSON 陣列
447
+
448
+ **範例:**
335
449
  ```bash
450
+ # 匯出 JSON
336
451
  dbcli export "SELECT * FROM users" --format json --output users.json
337
452
 
338
- dbcli export "SELECT id, name FROM posts" --format csv > posts.csv
453
+ # 匯出 CSV
454
+ dbcli export "SELECT * FROM orders" --format csv --output orders.csv
455
+
456
+ # 管道壓縮
457
+ dbcli export "SELECT * FROM products" --format csv | gzip > products.csv.gz
458
+
459
+ # 搭配 jq
460
+ dbcli export "SELECT * FROM users WHERE active=true" --format json | jq '.data | length'
339
461
  ```
340
462
 
341
- ### 生成技能
463
+ ---
464
+
465
+ #### `dbcli skill`
466
+
467
+ 產生或安裝 AI 代理 skill 說明文件。
342
468
 
469
+ **用法:**
343
470
  ```bash
344
- dbcli skill
345
- # 輸出到標準輸出(用於管道傳輸)
471
+ dbcli skill # 輸出至 stdout
472
+ dbcli skill --output SKILL.md # 寫入檔案
473
+ dbcli skill --install claude # 安裝至 Claude Code 設定
474
+ dbcli skill --install gemini # 安裝至 Gemini CLI
475
+ dbcli skill --install copilot # 安裝至 GitHub Copilot
476
+ dbcli skill --install cursor # 安裝至 Cursor IDE
477
+ ```
346
478
 
347
- dbcli skill --output ./SKILL.md
348
- # 寫入檔案
479
+ **行為:**
480
+ - 依 CLI 內省動態產生 SKILL.md
481
+ - 依權限等級過濾指令(Query-only 會隱藏寫入類指令)
482
+ - 支援 stdout、檔案、各平台安裝等輸出方式
349
483
 
484
+ **範例:**
485
+ ```bash
486
+ # 為 Claude Code 產生 skill
350
487
  dbcli skill --install claude
351
- # 安裝至 Claude Code 技能目錄
488
+
489
+ # 手動產生文件
490
+ dbcli skill > ./docs/SKILL.md
491
+
492
+ # 檢視產生的 skill(stdout)
493
+ dbcli skill
494
+
495
+ # 為多平台安裝
496
+ dbcli skill --install claude && \
497
+ dbcli skill --install gemini && \
498
+ dbcli skill --install copilot && \
499
+ dbcli skill --install cursor
352
500
  ```
353
501
 
354
- ### 管理黑名單
502
+ ---
503
+
504
+ #### `dbcli blacklist`
355
505
 
506
+ 管理資料存取黑名單,阻擋 AI 代理存取敏感資料表或欄位。
507
+
508
+ **用法:**
356
509
  ```bash
357
- # 查看目前黑名單
358
510
  dbcli blacklist list
511
+ dbcli blacklist table add <table>
512
+ dbcli blacklist table remove <table>
513
+ dbcli blacklist column add <table>.<column>
514
+ dbcli blacklist column remove <table>.<column>
515
+ ```
516
+
517
+ **子指令:**
359
518
 
360
- # 封鎖整個表
519
+ | 子指令 | 說明 |
520
+ |--------|------|
521
+ | `dbcli blacklist list` | 顯示目前黑名單(表與欄位) |
522
+ | `dbcli blacklist table add <table>` | 將表加入黑名單(阻擋所有操作) |
523
+ | `dbcli blacklist table remove <table>` | 從黑名單移除表 |
524
+ | `dbcli blacklist column add <table>.<column>` | 將欄位加入黑名單(SELECT 結果中省略) |
525
+ | `dbcli blacklist column remove <table>.<column>` | 從黑名單移除欄位 |
526
+
527
+ **行為:**
528
+ - 表黑名單會阻擋該表所有操作(query、insert、update、delete)
529
+ - 欄位黑名單會從 SELECT 結果中靜默省略欄位,並顯示安全通知
530
+ - 規則存在 `.dbcli`,適用於所有權限等級
531
+ - 管理員可透過環境變數 `DBCLI_OVERRIDE_BLACKLIST=true` 覆蓋
532
+
533
+ **範例:**
534
+ ```bash
535
+ # 檢視黑名單
536
+ dbcli blacklist list
537
+
538
+ # 封鎖敏感表
361
539
  dbcli blacklist table add audit_logs
362
540
  dbcli blacklist table add secrets_vault
363
541
 
364
- # 從黑名單移除表
365
- dbcli blacklist table remove audit_logs
366
-
367
- # 隱藏敏感欄位
542
+ # 在查詢結果中隱藏敏感欄位
368
543
  dbcli blacklist column add users.password_hash
369
544
  dbcli blacklist column add users.ssn
370
545
 
371
- # 從黑名單移除欄位
546
+ # 移除表黑名單
547
+ dbcli blacklist table remove audit_logs
548
+
549
+ # 移除欄位黑名單
372
550
  dbcli blacklist column remove users.ssn
373
551
 
374
- # 管理員覆蓋黑名單(緊急使用)
552
+ # 覆蓋黑名單(僅管理用途)
375
553
  DBCLI_OVERRIDE_BLACKLIST=true dbcli query "SELECT * FROM secrets_vault"
376
554
  ```
377
555
 
556
+ ---
557
+
558
+ #### `dbcli check`
559
+
560
+ 執行資料品質與健康檢查。
561
+
562
+ **用法:**
563
+ ```bash
564
+ dbcli check [資料表] [選項]
565
+ ```
566
+
567
+ **選項:**
568
+ - `--all` — 檢查所有表(預設略過極大表,除非加 `--include-large`)
569
+ - `--include-large` — 與 `--all` 一併使用時一併檢查極大表
570
+ - `--checks <類型>` — 逗號分隔:`nulls`、`duplicates`、`orphans`、`emptyStrings`、`rowCount`、`size`
571
+ - `--sample <數字>` — 大表取樣列數(預設:`10000`)
572
+ - `--format json|table` — 輸出格式(預設:`json`)
573
+
574
+ **範例:**
575
+ ```bash
576
+ # 檢查 users 表
577
+ dbcli check users
578
+
579
+ # 僅執行特定檢查
580
+ dbcli check orders --checks nulls,orphans --format table
581
+
582
+ # 掃描所有資料表
583
+ dbcli check --all
584
+ ```
585
+
586
+ ---
587
+
588
+ #### `dbcli diff`
589
+
590
+ 儲存 schema 快照,或將目前資料庫與先前快照比對(表、欄位、索引)。
591
+
592
+ **用法:**
593
+ ```bash
594
+ dbcli diff --snapshot ./schema-before.json
595
+ dbcli diff --against ./schema-before.json
596
+ dbcli diff --against ./schema-before.json --format table
597
+ ```
598
+
599
+ **選項:**
600
+ - `--snapshot <path>` — 將目前 schema 寫入 JSON 檔
601
+ - `--against <path>` — 與已存快照比對差異
602
+ - `--format json|table` — 輸出格式(預設:`json`)
603
+ - `--config <path>` — 設定路徑(預設:`.dbcli`)
604
+
605
+ ---
606
+
607
+ #### `dbcli status`
608
+
609
+ 顯示不含連線憑證的設定摘要(權限、資料庫系統、黑名單筆數、設定中繼版本),適合提供給 AI 代理。
610
+
611
+ **用法:**
612
+ ```bash
613
+ dbcli status
614
+ dbcli status --format text
615
+ dbcli status --format json
616
+ ```
617
+
618
+ **選項:**
619
+ - `--format text|json` — 輸出格式(預設:`json`)
620
+
621
+ **注意:** 此指令固定讀取專案預設路徑 `.dbcli`(不使用全域 `--config` 旗標)。
622
+
623
+ ---
624
+
378
625
  #### `dbcli doctor`
379
626
 
380
- 執行環境、設定、連線與資料的全面診斷。
627
+ 對環境、設定、連線與資料執行診斷檢查。
381
628
 
382
629
  ```bash
383
630
  dbcli doctor # 彩色文字輸出
384
- dbcli doctor --format json # JSON 輸出供 AI agent 使用
631
+ dbcli doctor --format json # JSON 輸出(供 AI 代理)
385
632
  ```
386
633
 
387
634
  **檢查項目:**
388
635
  - **環境:** Bun 版本相容性、dbcli 版本(與 npm registry 比對)
389
- - **設定:** 設定檔存在/合法、權限等級、blacklist 完整性
390
- - **連線與資料:** 資料庫連線測試、schema cache 新鮮度(> 7 天警告)、大表警告(> 1M 列)
636
+ - **設定:** 設定檔是否存在/有效、權限等級、黑名單完整性
637
+ - **連線與資料:** 資料庫連線、schema 快取新鮮度(超過 7 天警告)、大表警告(超過 100 萬列)
391
638
 
392
- **選項:** `--format <text|json>`
639
+ **選項:** `--format <text|json>`
640
+ **結束代碼:** 0 = 全部通過或僅警告,1 = 有錯誤
393
641
 
394
642
  ---
395
643
 
@@ -398,10 +646,10 @@ dbcli doctor --format json # JSON 輸出供 AI agent 使用
398
646
  產生 shell 自動補全腳本。
399
647
 
400
648
  ```bash
401
- dbcli completion bash # 輸出 bash 補全腳本
402
- dbcli completion zsh # 輸出 zsh 補全腳本
403
- dbcli completion fish # 輸出 fish 補全腳本
404
- dbcli completion --install # 自動偵測 shell 並安裝
649
+ dbcli completion bash # bash 補全輸出至 stdout
650
+ dbcli completion zsh # zsh
651
+ dbcli completion fish # fish
652
+ dbcli completion --install # 自動偵測 shell 並寫入 rc
405
653
  dbcli completion --install zsh # 指定 shell 安裝
406
654
  ```
407
655
 
@@ -411,203 +659,568 @@ dbcli completion --install zsh # 指定 shell 安裝
411
659
 
412
660
  #### `dbcli upgrade`
413
661
 
414
- 檢查更新並自動升級 dbcli。
662
+ 檢查更新並自我升級 dbcli。
663
+
664
+ ```bash
665
+ dbcli upgrade # 有新版則升級
666
+ dbcli upgrade --check # 僅檢查,不安裝
667
+ ```
668
+
669
+ **選項:** `--check` — 只檢查,不安裝
670
+ **背景檢查:** dbcli 每 24 小時會靜默查詢 npm registry 一次;若有新版,會在指令輸出結束後顯示提示。
671
+
672
+ #### `dbcli shell`
415
673
 
674
+ 互動式資料庫 shell:執行 SQL、自動補全、語法高亮。
675
+
676
+ **用法:**
416
677
  ```bash
417
- dbcli upgrade # 檢查並升級
418
- dbcli upgrade --check # 僅檢查,不升級
678
+ dbcli shell # 互動模式(SQL + dbcli 指令)
679
+ dbcli shell --sql # 僅 SQL 模式
419
680
  ```
420
681
 
421
- **背景檢查:** 每個指令靜默檢查 npm registry(每 24 小時一次),有新版時在指令完成後顯示提示。
682
+ **Shell 內:**
683
+ - 以 `;` 結尾的 SQL 會執行
684
+ - 可輸入 dbcli 子指令且不需 `dbcli` 前綴(例如 `schema users`、`list`)
685
+ - Tab 可觸發情境式補全(SQL 關鍵字、表/欄位名)
686
+ - `.help` 可查看 meta 指令(`.quit`、`.clear`、`.format`、`.history`、`.timing`)
687
+ - 多行 SQL:輸入會累積直到出現 `;`
688
+ - 歷史記錄跨工作階段保存在 `~/.dbcli_history`
689
+
690
+ **權限:** 繼承設定檔;SQL 與子指令皆受權限/黑名單約束。
691
+
692
+ #### `dbcli migrate`
693
+
694
+ Schema DDL 操作。**所有子指令預設為 dry-run** — 實際執行 SQL 請加 `--execute`。
695
+
696
+ **用法:**
697
+ ```bash
698
+ # 建立表
699
+ dbcli migrate create posts \
700
+ --column "id:serial:pk" \
701
+ --column "title:varchar(200):not-null" \
702
+ --column "body:text" \
703
+ --column "created_at:timestamp:default=now()"
704
+
705
+ # 執行(真正跑 SQL)
706
+ dbcli migrate create posts --column "id:serial:pk" --execute
707
+
708
+ # 刪表(破壞性 — 需 `--execute --force`)
709
+ dbcli migrate drop posts --execute --force
710
+
711
+ # 欄位操作
712
+ dbcli migrate add-column users bio text --nullable --execute
713
+ dbcli migrate alter-column users name --type "varchar(200)" --execute
714
+ dbcli migrate alter-column users email --rename user_email --execute
715
+ dbcli migrate drop-column users temp_field --execute --force
716
+
717
+ # 索引
718
+ dbcli migrate add-index users --columns email --unique --execute
719
+ dbcli migrate drop-index idx_users_email --table users --execute --force
720
+
721
+ # 限制條件
722
+ dbcli migrate add-constraint orders --fk user_id --references users.id --on-delete cascade --execute
723
+ dbcli migrate add-constraint users --unique email --execute
724
+ dbcli migrate add-constraint users --check "age >= 0" --execute
725
+ dbcli migrate drop-constraint orders fk_orders_user_id --execute --force
726
+
727
+ # 列舉型別(僅 PostgreSQL)
728
+ dbcli migrate add-enum status active inactive suspended --execute
729
+ dbcli migrate alter-enum status --add-value archived --execute
730
+ dbcli migrate drop-enum status --execute --force
731
+ ```
732
+
733
+ **欄位規格格式:** `name:type[:modifier...]` — 修飾子:`pk`、`not-null`、`unique`、`auto-increment`、`default=<value>`、`references=<table>.<column>`
734
+
735
+ **選項(各子指令):** `--execute`(執行 SQL)、`--force`(DROP 時略過確認)、`--config <path>`
736
+ **權限:** 僅 admin
737
+
738
+ ---
422
739
 
423
740
  ## 全域選項
424
741
 
425
- 以下選項適用於所有指令:
742
+ 所有指令皆支援下列全域選項:
426
743
 
427
- | 選項 | 說明 |
744
+ | 旗標 | 說明 |
428
745
  |------|------|
429
- | `--config <path>` | 指定 .dbcli 設定檔路徑(預設:`.dbcli`) |
430
- | `-v, --verbose` | 增加輸出詳細度(`-v` 詳細、`-vv` 除錯) |
431
- | `-q, --quiet` | 靜音模式,抑制非必要輸出 |
432
- | `--no-color` | 關閉彩色輸出(支援 `NO_COLOR` 環境變數) |
746
+ | `--config <path>` | `.dbcli` 設定檔路徑(預設:`.dbcli`) |
747
+ | `-v, --verbose` | 提高詳細度(`-v` 詳細、`-vv` 除錯) |
748
+ | `-q, --quiet` | 抑制非必要輸出 |
749
+ | `--no-color` | 關閉彩色輸出(亦遵守 `NO_COLOR` 環境變數) |
750
+
751
+ ---
752
+
753
+ ## 內部機制與策略
754
+
755
+ ### Schema 更新策略
756
+
757
+ dbcli 會在您的 `.dbcli` 設定檔中維護一份 Schema 快照。這讓 AI 代理無需頻繁連網即可理解資料庫結構。了解此快取何時更新至關重要:
758
+
759
+ 1. **手動更新:**
760
+ * `dbcli schema`:執行全量資料庫掃描。
761
+ * `dbcli schema --refresh`:增量更新。偵測變更並僅更新受影響的資料表。
762
+ * `dbcli schema --reset`:清除快取並重新抓取所有內容。
763
+ 2. **自動更新 (DDL):**
764
+ * 當您透過 `dbcli migrate` 執行 DDL 指令(例如 `add-column`)時,CLI 會在成功執行後自動重新掃描該資料表,並更新 `.dbcli` 中的快照。
765
+ 3. **即時驗證(不存入快取):**
766
+ * `insert`、`update`、`delete` 與 `check` 等指令在執行前會立即從資料庫抓取最新 Schema 以確保資料完整性,但它們**不會**更新 `.dbcli` 中的長期快照。
767
+
768
+ > **注意:** 若您使用外部工具(如 DBeaver 或遷移腳本)變更資料庫結構,您**必須**執行 `dbcli schema --refresh` 同步快照,AI 代理才能看到變更。
769
+
770
+ ### `dbcli migrate` 的原理
771
+
772
+ `migrate` 指令遵循嚴格的安全流程,以防止意外損壞資料庫:
773
+
774
+ 1. **權限檢查:** 驗證使用者是否具備 `admin` 權限。其他等級皆無法執行 DDL。
775
+ 2. **黑名單檢查:** 確保操作目標未包含在安全黑名單中。
776
+ 3. **資料庫方言生成:** `DDLGenerator` 會根據您的系統將請求轉換為正確的 SQL:
777
+ * **PostgreSQL:** 使用 `SERIAL`、原生 `ENUM` 型別以及雙引號識別字。
778
+ * **MySQL/MariaDB:** 使用 `AUTO_INCREMENT`、行內 `ENUM` 定義以及反引號識別字。
779
+ 4. **測試執行 (預設):** 所有指令預設僅輸出產生的 SQL 供審核,不實際執行。
780
+ 5. **執行與確認:**
781
+ * 需要加上 `--execute` 旗標才會執行。
782
+ * 破壞性操作(如 `drop`)需要同時具備 `--execute` 與 `--force`。
783
+ 6. **快照同步:** 成功執行後,會自動觸發該資料表的 Schema 更新,保持 `.dbcli` 檔案為最新狀態。
784
+
785
+ ---
786
+
787
+ ## 權限模型
788
+
789
+ dbcli 採用粗粒度權限系統,共四個等級。權限在 `dbcli init` 時設定並存於 `.dbcli`。黑名單與權限並行,針對敏感表與欄位提供細部保護(見[資料存取控制](#資料存取控制))。
790
+
791
+ ### 權限等級
792
+
793
+ | 等級 | 允許的指令 | 阻擋的指令 | 適用情境 |
794
+ |------|------------|------------|----------|
795
+ | **Query-only** | `init`、`list`、`schema`、`query`、`export`(最多 1000 列) | `insert`、`update`、`delete`、`migrate` | 唯讀 AI 代理、分析、報表 |
796
+ | **Read-Write** | 另含 `insert`、`update` | `delete`、`migrate` | 應用開發、內容管理 |
797
+ | **Data-Admin** | 另含 `delete` | `migrate` | 完整 DML,無 DDL |
798
+ | **Admin** | 含 `migrate`(DDL)在內的全部指令 | — | DBA、結構變更 |
433
799
 
434
- ## 環境配置
800
+ ### 設定
435
801
 
436
- ### .dbcli 配置檔案
802
+ 權限在初始化時設定:
437
803
 
438
- 初始化後,dbcli 會創建 `.dbcli` 檔案:
804
+ ```bash
805
+ dbcli init
806
+ # 提示:權限等級(query-only / read-write / data-admin / admin)
807
+ # 儲存於專案 .dbcli/config.json: "permission": "query-only"
808
+ ```
809
+
810
+ ### 依權限的範例
811
+
812
+ #### Query-only 模式(AI 代理)
813
+ ```bash
814
+ # 允許:讀取
815
+ dbcli query "SELECT * FROM users"
816
+ dbcli schema users
817
+ dbcli export "SELECT * FROM orders" --format json
818
+
819
+ # 阻擋:寫入
820
+ dbcli insert users --data '{...}' # 錯誤:權限不足
821
+ dbcli delete users --where "id=1" # 錯誤:權限不足
822
+ ```
823
+
824
+ #### Read-Write 模式(應用開發者)
825
+ ```bash
826
+ # 允許:讀寫
827
+ dbcli query "SELECT * FROM users"
828
+ dbcli insert users --data '{"name": "Alice"}'
829
+ dbcli update users --where "id=1" --set '{"name": "Bob"}'
830
+
831
+ # 阻擋:刪除(須 data-admin 或 admin)
832
+ dbcli delete users --where "id=1" # 錯誤:read-write 無法執行 DELETE
833
+ ```
834
+
835
+ #### Admin 模式(資料庫管理員)
836
+ ```bash
837
+ # 允許:含 DDL 在內的全部操作
838
+ dbcli query "SELECT * FROM users"
839
+ dbcli insert users --data '{"name": "Eve"}'
840
+ dbcli update users --where "id=1" --set '{"status": "active"}'
841
+ dbcli delete users --where "id=1" --force # Data-Admin 以上可刪除
842
+ dbcli migrate create posts --column "id:serial:pk" --execute # 僅 Admin
843
+ ```
844
+
845
+ ### 最佳實踐
846
+
847
+ - **AI 代理:** 唯讀情境使用 Query-only,降低誤刪/誤改風險
848
+ - **應用程式:** 一般 CRUD 使用 Read-Write,避免誤執行 DROP TABLE
849
+ - **維運:** 僅在結構變更、大量刪除或緊急處理時使用 Admin
850
+ - **最小權限:** 依實際需求給予最低足夠的權限等級
851
+
852
+ ---
853
+
854
+ ## 資料存取控制
855
+
856
+ 黑名單與權限模型搭配,防止 AI 代理存取敏感表或欄位,不受其權限等級影響。
857
+
858
+ ### 表層級黑名單
859
+
860
+ 封鎖表後,查詢、插入、更新、刪除皆會被拒絕,並顯示明確錯誤。
861
+
862
+ ```bash
863
+ dbcli blacklist table add secrets_vault
864
+
865
+ dbcli query "SELECT * FROM secrets_vault"
866
+ # 錯誤:表 'secrets_vault' 已列入黑名單
867
+ ```
868
+
869
+ ### 欄位層級黑名單
870
+
871
+ 黑名單欄位會從 SELECT 結果中省略,輸出中會附安全通知,讓代理知道結果已被過濾。
872
+
873
+ ```bash
874
+ dbcli blacklist column add users.password_hash
875
+ dbcli blacklist column add users.ssn
876
+
877
+ dbcli query "SELECT * FROM users"
878
+ # [Security] Columns omitted by blacklist: password_hash, ssn
879
+ ```
880
+
881
+ ### 安全通知
882
+
883
+ 當黑名單過濾查詢輸出時,dbcli 會在結果中附加通知列,避免代理在不知情下依不完整資料決策。
884
+
885
+ ### 以環境變數覆蓋
886
+
887
+ 管理員可在緊急或維護時以 `DBCLI_OVERRIDE_BLACKLIST=true` 略過黑名單:
888
+
889
+ ```bash
890
+ DBCLI_OVERRIDE_BLACKLIST=true dbcli query "SELECT * FROM secrets_vault"
891
+ ```
892
+
893
+ 此覆蓋會被記錄,僅應在必要時由管理員使用。
894
+
895
+ ### 黑名單設定
896
+
897
+ 規則存於 `.dbcli`,亦可手動編輯:
439
898
 
440
899
  ```json
441
900
  {
442
- "connection": {
443
- "system": "postgresql",
444
- "host": "localhost",
445
- "port": 5432,
446
- "user": "postgres",
447
- "password": "secret",
448
- "database": "mydb"
449
- },
450
- "permission": "read-write",
451
- "metadata": {
452
- "createdAt": "2026-03-26T12:00:00Z",
453
- "tables": [
454
- {
455
- "name": "users",
456
- "columns": [...],
457
- "primaryKey": ["id"],
458
- "foreignKeys": [...]
459
- }
460
- ]
901
+ "blacklist": {
902
+ "tables": ["audit_logs", "secrets_vault"],
903
+ "columns": {
904
+ "users": ["password_hash", "ssn"]
905
+ }
461
906
  }
462
907
  }
463
908
  ```
464
909
 
465
- ### 環境變數參考
910
+ ### 黑名單與權限的關係
911
+
912
+ 兩者互補:
466
913
 
467
- | 變數 | 說明 | 預設值 |
468
- |------|------|--------|
469
- | `DBCLI_LANG` | 語言(en、zh-TW) | `en` |
470
- | `DATABASE_URL` | 資料庫連接字串(可選,init 會嘗試解析) | |
914
+ | 層級 | 控制內容 | 作用範圍 |
915
+ |------|----------|----------|
916
+ | **權限模型** | 操作類型(讀/寫/刪) | 所有表 |
917
+ | **黑名單** | 特定表與欄位 | 敏感資料 |
471
918
 
472
- ### .env 整合
919
+ Query-only 代理無法寫入任何表,也無法讀取黑名單表或欄位 — 兩層限制同時生效。
473
920
 
474
- dbcli init 會自動解析 .env 檔案以預先填入連接詳細資訊:
921
+ ---
922
+
923
+ ## AI 整合指南
924
+
925
+ dbcli 可產生供 AI 使用的 skill 文件,並可整合至常見 AI 開發工具。
926
+
927
+ ### 快速開始
928
+
929
+ 為慣用平台產生 skill:
475
930
 
476
931
  ```bash
477
- # .env
478
- DATABASE_URL=postgresql://user:password@localhost:5432/mydb
932
+ # Claude Code(Anthropic VS Code 擴充)
933
+ dbcli skill --install claude
479
934
 
480
- dbcli init
481
- # 自動填入資料庫詳細資訊,只需確認或調整
935
+ # Gemini CLI(Google 命令列 AI)
936
+ dbcli skill --install gemini
937
+
938
+ # GitHub Copilot CLI
939
+ dbcli skill --install copilot
940
+
941
+ # Cursor IDE
942
+ dbcli skill --install cursor
482
943
  ```
483
944
 
484
- ## 故障排除
945
+ 安裝後,AI 可依你的權限等級使用 dbcli 查詢、插入、更新或匯出資料。
485
946
 
486
- ### 「未配置資料庫」
947
+ ### 各平台設定
487
948
 
488
- ```
489
- Database not configured. Run: dbcli init
490
- ```
949
+ #### Claude Code(Anthropic)
491
950
 
492
- **解決方案:** 執行 `dbcli init` 建立 `.dbcli` 配置檔案。
951
+ 1. 全域安裝 dbcli:`npm install -g @carllee1983/dbcli`
952
+ 2. 初始化:`dbcli init`(選擇權限等級)
953
+ 3. 安裝 skill:`dbcli skill --install claude`
954
+ 4. 重新啟動 Claude Code 擴充
955
+ 5. 在對話中詢問:「顯示資料庫 schema」或「查詢作用中使用者」
493
956
 
494
- ### 「連接失敗」
957
+ **Skill 路徑:** `~/.claude/skills/SKILL.md`
495
958
 
959
+ ---
960
+
961
+ #### Gemini CLI(Google)
962
+
963
+ 1. 全域安裝:`npm install -g @carllee1983/dbcli`
964
+ 2. 初始化:`dbcli init`
965
+ 3. 安裝 skill:`dbcli skill --install gemini`
966
+ 4. 啟動 Gemini:`gemini start`
967
+ 5. 在對話中請求:「查詢 users 表」或「列出資料庫資料表」
968
+
969
+ **Skill 路徑:** `~/.local/share/gemini/skills/`(Linux)或各平台對應路徑
970
+
971
+ ---
972
+
973
+ #### GitHub Copilot CLI
974
+
975
+ 1. 全域安裝:`npm install -g @carllee1983/dbcli`
976
+ 2. 初始化:`dbcli init`
977
+ 3. 安裝 skill:`dbcli skill --install copilot`
978
+ 4. 安裝 Copilot CLI:`npm install -g @github-next/github-copilot-cli`
979
+ 5. 使用 `copilot --help` 並探索與 dbcli 的整合
980
+
981
+ **Skill 路徑:** 依 Copilot 設定而定
982
+
983
+ ---
984
+
985
+ #### Cursor IDE
986
+
987
+ 1. 全域安裝:`npm install -g @carllee1983/dbcli`
988
+ 2. 初始化:`dbcli init`
989
+ 3. 安裝 skill:`dbcli skill --install cursor`
990
+ 4. 開啟 Cursor
991
+ 5. 在 Composer 中:「新增一筆使用者」或「匯出使用者資料」
992
+
993
+ **Skill 路徑:** `~/.cursor/skills/`
994
+
995
+ ---
996
+
997
+ ### 範例:AI 代理工作流程
998
+
999
+ **情境:** 希望 AI 分析使用者參與度。
1000
+
1001
+ ```bash
1002
+ # 1. 安裝並初始化
1003
+ npm install -g @carllee1983/dbcli
1004
+ dbcli init # 選擇「query-only」較安全
1005
+
1006
+ # 2. 為 Claude Code 安裝 skill
1007
+ dbcli skill --install claude
1008
+
1009
+ # 3. 在 Claude Code 對話中:
1010
+ # 「分析最近 7 天的使用者活動並摘要重點」
1011
+
1012
+ # Claude Code 可能會:
1013
+ # - 使用:dbcli schema users、dbcli query "SELECT ..."
1014
+ # - 解析 JSON 輸出
1015
+ # - 提供分析
496
1016
  ```
497
- Failed to connect to database: ECONNREFUSED 127.0.0.1:5432
1017
+
1018
+ ### 重新整理 Skill
1019
+
1020
+ 權限或設定變更後,可重新產生 skill:
1021
+
1022
+ ```bash
1023
+ # 例如編輯 .dbcli/config.json,將 "permission" 設為 "admin"(或重新執行 dbcli init)
1024
+ dbcli skill # 會顯示 delete 與 migrate 等指令
1025
+
1026
+ # 再安裝一次以更新 AI 平台
1027
+ dbcli skill --install claude
498
1028
  ```
499
1029
 
500
- **檢查清單:**
501
- - 資料庫伺服器是否執行中?
502
- - 主機和埠口是否正確?
503
- - 用戶和密碼是否有效?
504
- - 網路是否可達?(特別是遠程資料庫)
1030
+ ---
1031
+
1032
+ ## 故障排除
1033
+
1034
+ ### 連線問題
1035
+
1036
+ #### 「ECONNREFUSED: Connection refused」
1037
+
1038
+ 資料庫未執行或主機/埠錯誤。
1039
+
1040
+ **處理方式:**
505
1041
 
506
- ### 「權限被拒」
1042
+ ```bash
1043
+ # 確認資料庫是否在跑
1044
+ psql --version # PostgreSQL
1045
+ mysql --version # MySQL
1046
+
1047
+ # 檢查連線字串
1048
+ dbcli init # 重新初始化以確認憑證
507
1049
 
1050
+ # 命令列測試主機/埠
1051
+ psql -h localhost -U postgres
1052
+ mysql -h 127.0.0.1 -u root
508
1053
  ```
509
- Permission denied (required: admin)
1054
+
1055
+ #### 「ENOTFOUND: getaddrinfo ENOTFOUND hostname」
1056
+
1057
+ 主機名稱無法解析(拼字錯誤或 DNS 問題)。
1058
+
1059
+ **處理方式:**
1060
+
1061
+ ```bash
1062
+ # 檢查專案設定中的 host(目錄型配置:.dbcli/config.json)
1063
+ grep host .dbcli/config.json
1064
+
1065
+ # 測試 DNS
1066
+ ping your-hostname.com
1067
+
1068
+ # 若仍有問題可改試 127.0.0.1
1069
+ dbcli init
510
1070
  ```
511
1071
 
512
- **解決方案:**
513
- - 該命令需要更高的權限等級
514
- - 執行 `dbcli init` 並選擇更高的權限級別
515
- - 或聯繫資料庫管理員
1072
+ ---
1073
+
1074
+ ### 權限錯誤
516
1075
 
517
- ### 「表不存在」
1076
+ #### 「Permission denied: INSERT requires Read-Write or Admin」
518
1077
 
1078
+ 在 Query-only 下嘗試寫入。
1079
+
1080
+ **處理方式:** 以較高權限重新初始化:
1081
+
1082
+ ```bash
1083
+ rm -rf .dbcli # 移除專案設定(具破壞性 — 請先備份)
1084
+ dbcli init # 選擇 read-write、data-admin 或 admin
519
1085
  ```
520
- Table not found: nonexistent_table
1086
+
1087
+ #### 「Permission denied: DELETE operation requires Data-Admin or Admin」
1088
+
1089
+ DELETE 在 query-only 與 read-write 下不允許。
1090
+
1091
+ **處理方式:** 改用 `data-admin` 或 `admin` 權限(重新執行 `dbcli init`,或編輯 `.dbcli/config.json`),或洽管理員。
1092
+
1093
+ ```bash
1094
+ dbcli init # 選擇 data-admin 或 admin
1095
+ dbcli delete users --where "id=1" --force
521
1096
  ```
522
1097
 
523
- **解決方案:**
524
- - 執行 `dbcli list` 檢查可用表
525
- - 檢查表名拼寫
526
- - 確認已連接到正確的資料庫
1098
+ ---
1099
+
1100
+ ### 查詢錯誤
1101
+
1102
+ #### 「Table not found: users」
1103
+
1104
+ 表不存在或名稱拼錯。
527
1105
 
528
- ### 查詢超時
1106
+ **處理方式:**
529
1107
 
1108
+ ```bash
1109
+ dbcli list
1110
+ dbcli query "SELECT * FROM user" --format json
530
1111
  ```
531
- Query timeout after 30s
1112
+
1113
+ #### 「Syntax error near SELECT」
1114
+
1115
+ SQL 語法錯誤。
1116
+
1117
+ **處理方式:**
1118
+
1119
+ ```bash
1120
+ # 先在原生用戶端測試
1121
+ psql # 或 mysql
1122
+
1123
+ # 再在 dbcli 使用
1124
+ dbcli query "SELECT * FROM users"
532
1125
  ```
533
1126
 
534
- **解決方案:**
535
- - 簡化查詢(新增 WHERE 條件、JOIN 等)
536
- - 使用 `--limit` 限制行數
537
- - 檢查資料庫索引是否最佳化
1127
+ ---
538
1128
 
539
- ## 技術棧
1129
+ ### 效能問題
540
1130
 
541
- | 組件 | 技術 | 理由 |
542
- |------|------|------|
543
- | 執行時 | Bun | 快速啟動、原生 TS 支援 |
544
- | 資料庫 | PostgreSQL、MySQL、MariaDB | 廣泛使用、成熟生態 |
545
- | 測試 | Vitest | 快速、全面的單位 & 集成測試 |
546
- | 分發 | npm | 標準 Node.js/Bun 生態 |
1131
+ #### 「查詢只回傳 1000 列而非完整結果」
547
1132
 
548
- ## 開發
1133
+ Query-only 會自動限制列數以策安全。
549
1134
 
550
- ### 設定開發環境
1135
+ **處理方式:** 提高權限或分段抓取:
551
1136
 
552
1137
  ```bash
553
- # 克隆倉庫
554
- git clone https://github.com/your-org/dbcli.git
555
- cd dbcli
1138
+ dbcli init # read-write 或 admin
556
1139
 
557
- # 安裝依賴
558
- bun install
1140
+ # 或分塊查詢
1141
+ dbcli query "SELECT * FROM users LIMIT 100 OFFSET 0"
1142
+ dbcli query "SELECT * FROM users LIMIT 100 OFFSET 100"
1143
+ ```
559
1144
 
560
- # 執行測試
561
- bun test
1145
+ #### 「第一次執行 CLI 超過 30 秒」
562
1146
 
563
- # 本地開發
564
- bun run src/cli.ts init
565
- ```
1147
+ npx 正在下載並快取套件。
566
1148
 
567
- ### 測試
1149
+ **處理方式:** 首次較慢屬正常,之後會很快:
568
1150
 
569
1151
  ```bash
570
- # 執行所有測試
571
- bun test
1152
+ npx @carllee1983/dbcli init # 首次約 30s
1153
+ npx @carllee1983/dbcli init # 之後 <1s
1154
+
1155
+ # 或全域安裝
1156
+ npm install -g @carllee1983/dbcli
1157
+ dbcli init
1158
+ ```
1159
+
1160
+ ---
1161
+
1162
+ ### 跨平台問題
1163
+
1164
+ #### Windows:「Command not found: dbcli」
1165
+
1166
+ npm 未建立 .cmd 或 PATH 未更新。
1167
+
1168
+ **處理方式:**
572
1169
 
573
- # 執行特定測試檔案
574
- bun test src/commands/query.test.ts
1170
+ ```bash
1171
+ # 重開終端機以更新 PATH
1172
+ # 或重新全域安裝
1173
+ npm uninstall -g @carllee1983/dbcli
1174
+ npm install -g @carllee1983/dbcli
575
1175
 
576
- # 監視模式
577
- bun test --watch
1176
+ where dbcli
578
1177
  ```
579
1178
 
580
- ### 構建
1179
+ #### macOS/Linux:「Permission denied: ./dist/cli.mjs」
1180
+
1181
+ 未設定執行位元。
1182
+
1183
+ **處理方式:**
581
1184
 
582
1185
  ```bash
583
- # 構建發行版本
584
- bun build src/cli.ts --outfile dist/cli.mjs
1186
+ chmod +x dist/cli.mjs
1187
+ ./dist/cli.mjs --help
585
1188
  ```
586
1189
 
587
- ## 貢獻
1190
+ ---
588
1191
 
589
- 貢獻歡迎!請提交問題和拉請求。
1192
+ ## 系統需求
590
1193
 
591
- ### 開發者指南
1194
+ ### 資料庫支援
592
1195
 
593
- 詳見 [CONTRIBUTING.md](./CONTRIBUTING.md)。
1196
+ - **PostgreSQL:** 12.0+
1197
+ - **MySQL:** 8.0+
1198
+ - **MariaDB:** 10.5+
594
1199
 
595
- ### 國際化貢獻
1200
+ ### 執行環境
596
1201
 
597
- 如果要新增訊息或翻譯:
1202
+ - **Node.js:** 18.0.0+
1203
+ - **Bun:** 1.3.3+
598
1204
 
599
- 1. 編輯 `resources/lang/{en,zh-TW}/messages.json`
600
- 2. 在命令中使用 `t()` 或 `t_vars()`
601
- 3. 執行測試確保一致性
1205
+ ### 平台
602
1206
 
603
- ## 授權
1207
+ - **macOS:** Intel 與 Apple Silicon
1208
+ - **Linux:** x86_64(Ubuntu、Debian、CentOS 等)
1209
+ - **Windows:** 10+(透過 npm .cmd 包裝)
1210
+
1211
+ ---
604
1212
 
605
- MIT — 見 [LICENSE](./LICENSE)
1213
+ ## 開發
606
1214
 
607
- ## 更新日誌
1215
+ ```bash
1216
+ bun test # 執行測試
1217
+ bun run build # 建置 CLI 至 dist/(發布前使用)
1218
+ ```
608
1219
 
609
- [CHANGELOG.md](./CHANGELOG.md)。
1220
+ 完整環境、測試與發布流程見 [CONTRIBUTING.md](./CONTRIBUTING.md)。
610
1221
 
611
1222
  ---
612
1223
 
613
- **最後更新:** 2026-03-26 | **版本:** v1.0.0+
1224
+ ## 授權
1225
+
1226
+ 詳見專案中的 LICENSE 檔案。