@carllee1983/dbcli 1.44.0 → 1.45.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/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.cursor/rules/dbcli.mdc +30 -3
- package/.cursor/skills/dbcli/reference.md +100 -2
- package/.cursor-plugin/plugin.json +1 -1
- package/.github/skills/dbcli/SKILL.md +30 -3
- package/.github/skills/dbcli/reference.md +100 -2
- package/CHANGELOG.md +26 -0
- package/README.md +13 -0
- package/README.zh-TW.md +13 -0
- package/assets/SKILL.md +30 -3
- package/assets/SKILL.zh-TW.md +26 -3
- package/assets/reference.md +100 -2
- package/dist/agent-core.d.ts +7 -1
- package/dist/agent-core.mjs +29 -8
- package/dist/cli.mjs +2045 -11756
- package/dist/core.d.ts +48 -3
- package/dist/core.mjs +348 -89
- package/gemini-extension.json +1 -1
- package/package.json +2 -1
- package/plugins/dbcli-agent/.codex-plugin/plugin.json +1 -1
- package/plugins/dbcli-agent/skills/dbcli/SKILL.md +30 -3
- package/plugins/dbcli-agent/skills/dbcli/reference.md +100 -2
- package/skills/dbcli/SKILL.md +30 -3
- package/skills/dbcli/reference.md +100 -2
- package/.cursor/skills/dbcli/SKILL.md +0 -106
package/.cursor/rules/dbcli.mdc
CHANGED
|
@@ -21,6 +21,20 @@ the CLI package has not been installed globally.
|
|
|
21
21
|
3. All writes: `--dry-run` (SQL/Mongo) → run → `query` read-back to confirm. Redis
|
|
22
22
|
`query` has **no `--dry-run`** (see **Redis**); Elasticsearch is **read-only**.
|
|
23
23
|
|
|
24
|
+
**Environment and mutation boundary:** In v2, inspect `dbcli use --list --format json`
|
|
25
|
+
before selecting a named connection. A connection labelled `environment: "production"`
|
|
26
|
+
must be explicitly selected; it is never silently used through the saved default. To
|
|
27
|
+
persist a production default, a human must repeat the exact name with
|
|
28
|
+
`--confirm-production`. When `DBCLI_AGENT_MODE=1`, configuration, permission, and
|
|
29
|
+
credential mutations are blocked unconditionally. Run human/admin changes in a separate
|
|
30
|
+
process with agent mode disabled; do not treat a same-process environment variable as
|
|
31
|
+
approval. Trusted config writes maintain an integrity record and secure file modes where
|
|
32
|
+
supported, and agent reads fail closed on missing, replaced, non-regular, or tampered
|
|
33
|
+
records. Agent mode refuses legacy single-file `.dbcli` configs until a human/admin
|
|
34
|
+
migration to V2 home storage. For a same-user hostile process, a host can set
|
|
35
|
+
`DBCLI_CONFIG_INTEGRITY_ANCHOR_DIR` to a protected or read-only directory containing
|
|
36
|
+
detached digests.
|
|
37
|
+
|
|
24
38
|
**`update` / `delete` `--where` is equality-only (SQL).** It accepts **only** `col=val` or
|
|
25
39
|
`col1=v1 AND col2=v2`. A comparison / pattern operator (`>`, `>=`, `<`, `!=`, `LIKE`, `IN`)
|
|
26
40
|
is a **parse error**; worse, `OR` is **silently swallowed into the value** — `a=1 OR b=2`
|
|
@@ -238,7 +252,7 @@ dbcli init --system elasticsearch \
|
|
|
238
252
|
```bash
|
|
239
253
|
dbcli init --conn-name staging --env-file .env.staging --permission query-only
|
|
240
254
|
dbcli init --conn-name prod --env-file .env.production --use-env-refs --skip-test
|
|
241
|
-
dbcli use --list
|
|
255
|
+
dbcli use --list --format json # safe identity inventory: name/env/permission/server/database
|
|
242
256
|
dbcli use prod # switch default (persists — avoid for one-off queries)
|
|
243
257
|
dbcli query --use staging "SELECT 1" # one-shot override on any subcommand
|
|
244
258
|
DBCLI_CONNECTION=staging dbcli query "SELECT 1" # one-shot via env; parallel-safe
|
|
@@ -247,6 +261,18 @@ dbcli init --rename staging:stg # rename
|
|
|
247
261
|
dbcli init --remove stg # remove
|
|
248
262
|
```
|
|
249
263
|
|
|
264
|
+
For a connection shared across projects, use the explicit root-level `--global` scope. It stores a v2 registry at `~/.config/dbcli/config.json`; it does not create or modify a project binding:
|
|
265
|
+
|
|
266
|
+
```bash
|
|
267
|
+
dbcli --global init --conn-name shared --system postgresql --host db.example.com \
|
|
268
|
+
--port 5432 --user app --password '<secret>' --name appdb \
|
|
269
|
+
--skip-test --no-interactive --force
|
|
270
|
+
dbcli --global use --list --format json
|
|
271
|
+
dbcli --global query "SELECT 1"
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
`--global` must appear before the command. Without it, commands continue to use the current project's `.dbcli` binding; global and project registries are independent.
|
|
275
|
+
|
|
250
276
|
Each named connection has its own schema cache at `.dbcli/schemas/<connection>/`. Run
|
|
251
277
|
`dbcli schema --use <name>` once per connection **before** `schema <table>` — otherwise the
|
|
252
278
|
cache may serve another connection's columns. `schema --refresh` / `--reset` manage the cache
|
|
@@ -313,6 +339,7 @@ Full flags and edge cases: see [reference.md](reference.md) `init` section.
|
|
|
313
339
|
| `snapshot` | query-only+ | **(v1.25)** SQL only. Capture a result fingerprint (`rowCount` + per-column null/distinct/min/max/sum + order-independent checksum). `--out` (default `.dbcli/snapshots/snap-<ts>.json`), `--rows`, `--stdout`, `--format`, `--no-limit`. Baseline for `assert --against`. |
|
|
314
340
|
| `assert` | query-only+ | **(v1.25)** SQL only. Verify an invariant; exit 1 on failure unless `--no-fail`. `--expect "rows>0\|value==X\|col:c not null\|unique\|between a and b\|>= n"`, `--vs <query> --compare rows\|value` (reconcile), `--against <snapshot> --tolerance <pct>`. |
|
|
315
341
|
| `verification` | n/a | Inspect and manage local verification artifacts. `list` / `show <id-or-path>` / `summary` are read-only; `prune` is dry-run by default and deletes only with `--execute --force`. Reads `<cwd>/.dbcli/verification/`; no DB connection, no audit writes. |
|
|
342
|
+
| `backfill artifact` | n/a | Build a bounded, reviewable source-to-SQL backfill artifact from JSON. Includes source/target identity, blacklist/schema preflight, read-back verification, and rollback hints; dry-run only and never executes writes. |
|
|
316
343
|
| `proxy` | n/a | **(v1.26)** MySQL/MariaDB/PostgreSQL only. Local-dev observability proxy — relays app traffic to the real DB and appends query/latency/byte/error events to `.dbcli/proxy/events.jsonl`. Subcommands: `mysql` \| `mariadb` \| `postgresql`. `--listen`, `--target`, `--events`, `--slow-ms` (default `1000`), `--redact none\|literals`. Observe-only. **(v1.27)** `proxy analyze` aggregates the event log offline into a JSON/text report (summary, byFingerprint with suggestedCommands, slowest, errors, hotTables, N+1) — errors out if no events exist yet. |
|
|
317
344
|
| `status` | query-only+ | Safe JSON/text summary (no credentials). |
|
|
318
345
|
| `inspect` | query-only+ | Read-only context snapshot (connection, permission, blacklist, objects, snippets, context-aware `suggestedCommands`, and **(v1.23)** human-readable `hints`). `--for-agent` / `--brief` / `--no-connect` / `--require-schema-cache`. Supports `--recovery`. |
|
|
@@ -320,7 +347,7 @@ Full flags and edge cases: see [reference.md](reference.md) `init` section.
|
|
|
320
347
|
| `guide` | query-only+ | Deterministic next-command plan for a fixed goal (`slow-query`, `capacity`, `health`, `index-usage`, `permissions`, `schema-overview`). `--list` to enumerate. **(v1.23)** `guide missing-index-for <query>` suggests composite indexes for a single SELECT (`--format yaml\|json\|markdown`, `--min-confidence`). |
|
|
321
348
|
| `recovery` | n/a | Look up the structured `RecoveryEnvelope` for a known error code (`--code <CODE>` or `--list`). Standalone synthesizer; does not require a real failure. |
|
|
322
349
|
| `recover` | n/a | Inspect (default) or `--apply` the auto-saved recovery plan in `.dbcli/last-recovery.json`. `--allow-write=readonly-cmd\|write-cmd`, `--no-verify`, `--from <file>`, `--next --after-step <n> --result <json\|@file>` for multi-turn step-at-a-time. |
|
|
323
|
-
| `doctor` | n/a | Environment, config, connection, SRV diagnostics (Mongo), schema cache age. |
|
|
350
|
+
| `doctor` | n/a | Environment/runtime identity, config, connection, SRV diagnostics (Mongo), schema cache age. `--format json --remediation` emits candidate-only blacklist/schema/bounded-sample plans (SQL: `dbcli plan` → human-confirmed bounded `dbcli query`; MongoDB/Elasticsearch: `dbcli schema` preflight → human-confirmed bounded query); it never applies them. |
|
|
324
351
|
| `completion` | n/a | bash / zsh / fish scripts. |
|
|
325
352
|
| `upgrade` | n/a | Self-update from npm; 24h-cached version hints on every command. |
|
|
326
353
|
| `shell` | (same as query+) | Interactive REPL. SQL engines, MongoDB, and Redis (single-line; `.no-limit on/off`). **(v1.22)** Elasticsearch opens a Kibana Dev Tools-style REPL (`<METHOD> /<path>` + optional JSON body, blank line submits). |
|
|
@@ -509,4 +536,4 @@ schema. Raw `query` / `export` invocations render a sortable table only.
|
|
|
509
536
|
- Blacklisted tables and columns are redacted from query output.
|
|
510
537
|
- `schema` reports `estimatedRowCount` and `sizeCategory` (small / medium / large / huge). For large/huge tables add `WHERE` or `LIMIT` — bands in reference.md.
|
|
511
538
|
- `doctor` on `mongodb+srv://` reports whether SRV resolves natively or through the DoH fallback — useful when the runtime restricts DNS.
|
|
512
|
-
- **Global flags:** `--config <path>`, `--use <name>`, `-v` / `-vv` /
|
|
539
|
+
- **Global flags:** `--version`, `--config <path>`, `--global`, `--use <name>`, `-v` / `--verbose` / `-vv`, `-q` / `--quiet`, `--no-color` (also honours `NO_COLOR`). Root-level flags must precede the command unless the command explicitly declares a command-level option.
|
|
@@ -4,6 +4,22 @@ Companion to [SKILL.md](SKILL.md). Exhaustive flags, copy-paste examples, `shell
|
|
|
4
4
|
|
|
5
5
|
For cross-engine support status, see `docs/feature-matrix.md` in the repository.
|
|
6
6
|
|
|
7
|
+
## Global options and placement
|
|
8
|
+
|
|
9
|
+
These options are available on the root `dbcli` command. Root-level options must
|
|
10
|
+
appear before the command path (for example, `dbcli --use prod status`). A
|
|
11
|
+
command-level option is only valid after the command that declares it.
|
|
12
|
+
|
|
13
|
+
| Option | Purpose |
|
|
14
|
+
|---|---|
|
|
15
|
+
| `--version` | Print the installed dbcli version. |
|
|
16
|
+
| `--no-color` | Disable colored output. |
|
|
17
|
+
| `-v, --verbose` | Increase logging verbosity; repeat for debug output. |
|
|
18
|
+
| `-q, --quiet` | Suppress non-essential output. |
|
|
19
|
+
| `--config <path>` | Select the `.dbcli` configuration path. |
|
|
20
|
+
| `--global` | Select the user-global registry at `~/.config/dbcli/config.json` instead of the current project's `.dbcli` config. Place it before the command path. |
|
|
21
|
+
| `--use <connection>` | Select a named connection for this invocation; place it before the command path unless that command explicitly lists a command-level `--use`. |
|
|
22
|
+
|
|
7
23
|
## Commands
|
|
8
24
|
|
|
9
25
|
### init
|
|
@@ -34,10 +50,18 @@ dbcli init --conn-name staging --env-file .env.staging # Named connection with
|
|
|
34
50
|
dbcli init --conn-name prod --env-file .env.production --use-env-refs --skip-test
|
|
35
51
|
dbcli init --remove staging # Remove a named connection
|
|
36
52
|
dbcli init --rename staging:production # Rename a connection
|
|
53
|
+
|
|
54
|
+
# User-global registry (shared by projects; --global must precede the command)
|
|
55
|
+
dbcli --global init --conn-name shared --system postgresql --host db.example.com \
|
|
56
|
+
--port 5432 --user app --password '<secret>' --name appdb \
|
|
57
|
+
--skip-test --no-interactive --force
|
|
58
|
+
dbcli --global use --list
|
|
37
59
|
```
|
|
38
60
|
|
|
39
61
|
**Key options:** `--system`, `--permission`, `--use-env-refs`, `--skip-test`, `--no-interactive`, `--force`, `--conn-name <name>`, `--env-file <path>`, `--remove <name>`, `--rename <old:new>`
|
|
40
62
|
|
|
63
|
+
**Environment-reference options:** `--env-host <var>`, `--env-port <var>`, `--env-user <var>`, `--env-password <var>`, `--env-database <var>`
|
|
64
|
+
|
|
41
65
|
**MongoDB-specific options:** `--uri <uri>` (full connection URI), `--auth-source <db>` (auth database, default: `admin` when user/password set)
|
|
42
66
|
|
|
43
67
|
**Elasticsearch-specific options:** `--cloud-id <id>` (Elastic Cloud), `--api-key <key>` (ApiKey auth). Other ES fields (`nodes[]`, `protocol`, `caPath`, `rejectUnauthorized`) can be edited directly in `.dbcli`.
|
|
@@ -46,6 +70,8 @@ dbcli init --rename staging:production # Rename a connection
|
|
|
46
70
|
|
|
47
71
|
**Multi-connection:** Using `--conn-name` or `--env-file` creates a v2 config with named connections. Each connection can have its own env file and permission level. Existing v1 configs are automatically imported as the `default` connection when upgrading.
|
|
48
72
|
|
|
73
|
+
Use root-level `--global` with `init`, `use`, `status`, `query`, or any other command to read or mutate the user-global v2 registry at `~/.config/dbcli/config.json`. Without it, the current project binding remains the source of truth. The global registry uses the same private file mode and integrity record as project home storage.
|
|
74
|
+
|
|
49
75
|
> **AI agent note on `--use-env-refs`:** If an existing `.dbcli` config contains `{"$env": "DB_HOST"}` style references, the connection values are read from environment variables at runtime. Do NOT re-run `init` to replace these references with actual values — the env-ref format is intentional for CI/CD and multi-environment setups.
|
|
50
76
|
|
|
51
77
|
### use
|
|
@@ -56,8 +82,20 @@ Switch or display the default database connection (v2 multi-connection config).
|
|
|
56
82
|
dbcli use # Show current default connection
|
|
57
83
|
dbcli use staging # Switch default to 'staging'
|
|
58
84
|
dbcli use --list # List all connections (* marks default)
|
|
85
|
+
dbcli use --list --format json # Credential-free connection identity inventory
|
|
59
86
|
```
|
|
60
87
|
|
|
88
|
+
Each v2 named connection may include an optional non-secret `environment` label
|
|
89
|
+
(for example, `"environment": "production"`). JSON output is an object with a
|
|
90
|
+
`connections` array. Each item contains `name`, `environment` (a string or
|
|
91
|
+
`null`),
|
|
92
|
+
`permission`, `system`, `server` (`host` and `port`), `database`, and `isDefault`.
|
|
93
|
+
Environment-backed server and database fields are `null`; URI-only MongoDB and
|
|
94
|
+
Cloud ID-only Elasticsearch connections also return `null` instead of default
|
|
95
|
+
placeholders. It deliberately excludes user names, passwords, URIs, Cloud IDs,
|
|
96
|
+
API keys, and env variable names.
|
|
97
|
+
Misspelled selectors suggest nearby configured connection names.
|
|
98
|
+
|
|
61
99
|
Any command can also use `--use <name>` to temporarily select a connection without changing the default:
|
|
62
100
|
|
|
63
101
|
```bash
|
|
@@ -67,6 +105,18 @@ dbcli list --use prod
|
|
|
67
105
|
|
|
68
106
|
**Requires v2 config** (created with `dbcli init --conn-name`).
|
|
69
107
|
|
|
108
|
+
**Options:** `--list`, `--format <text|json>`, `--confirm-production <name>` (required when explicitly selecting a production connection as the default).
|
|
109
|
+
|
|
110
|
+
### Agent configuration trust boundary
|
|
111
|
+
|
|
112
|
+
When `DBCLI_AGENT_MODE=1`, configuration, permission, and credential mutations
|
|
113
|
+
are rejected. Agent reads require the V2 directory config and its integrity
|
|
114
|
+
record; missing, replaced, non-regular, or tampered records fail closed. Legacy
|
|
115
|
+
single-file `.dbcli` configs must be migrated by a human/admin process with
|
|
116
|
+
agent mode disabled. A host that needs protection from a same-user hostile
|
|
117
|
+
process can set `DBCLI_CONFIG_INTEGRITY_ANCHOR_DIR` to a protected or read-only
|
|
118
|
+
directory; trusted writes publish detached digests there.
|
|
119
|
+
|
|
70
120
|
### list
|
|
71
121
|
|
|
72
122
|
List all tables (SQL), collections (MongoDB), keys (Redis), or indices (Elasticsearch).
|
|
@@ -746,6 +796,7 @@ Manage sensitive data blacklist to prevent AI access to restricted tables/column
|
|
|
746
796
|
|
|
747
797
|
```bash
|
|
748
798
|
dbcli blacklist list # Show current blacklist
|
|
799
|
+
dbcli blacklist list --format json # Stable machine-readable result
|
|
749
800
|
dbcli blacklist table add payments # Block entire table
|
|
750
801
|
dbcli blacklist table remove payments # Unblock table
|
|
751
802
|
dbcli blacklist column add users.password # Block specific column
|
|
@@ -754,6 +805,11 @@ dbcli blacklist column remove users.password
|
|
|
754
805
|
|
|
755
806
|
**Subcommands:** `list`, `table add <name>`, `table remove <name>`, `column add <table.column>`, `column remove <table.column>`
|
|
756
807
|
|
|
808
|
+
**`list` options:** `--config <path>`, `--format <text|json>` (default: `text`). JSON writes one
|
|
809
|
+
document to stdout: `{ "tables": string[], "columns": Record<string, string[]>, "warnings":
|
|
810
|
+
[{ "collection", "raw", "reason" }] }`. Invalid MongoDB blacklist patterns appear in `warnings`;
|
|
811
|
+
the JSON result is otherwise free of human headings and diagnostics.
|
|
812
|
+
|
|
757
813
|
### check
|
|
758
814
|
|
|
759
815
|
Run data health checks on tables.
|
|
@@ -1079,7 +1135,7 @@ dbcli proxy mysql --listen 127.0.0.1:3307 --target 127.0.0.1:3306
|
|
|
1079
1135
|
dbcli proxy postgresql --listen 127.0.0.1:5434 --target 127.0.0.1:5432
|
|
1080
1136
|
dbcli proxy mysql --slow-ms 500 --redact literals # redact SQL literals in events
|
|
1081
1137
|
dbcli proxy mariadb --events ./logs/proxy.jsonl # custom event file
|
|
1082
|
-
dbcli
|
|
1138
|
+
dbcli --use prod proxy postgresql # infer target from named connection
|
|
1083
1139
|
|
|
1084
1140
|
dbcli proxy analyze # analyze .dbcli/proxy/events.jsonl (JSON)
|
|
1085
1141
|
dbcli proxy analyze --format text --top 10 # human-readable top-10 view
|
|
@@ -1489,6 +1545,7 @@ Audit entries are metadata-only by design — never raw SQL bodies, `--param` va
|
|
|
1489
1545
|
| `--all` | Merge entries across all connections; output is an envelope array `[{ connection, entry }, ...]` (D-39). | off (current connection only) |
|
|
1490
1546
|
| `--for-agent` | Shortcut for `--format json --brief`. Single-connection JSON is a flat array; `--all` JSON is an envelope array. | off |
|
|
1491
1547
|
| `--brief` | Drop large redaction fields from the entry; keep `ts / command / target / success` (D-33). | off |
|
|
1548
|
+
| `--no-brief` | Disable brief mode when a higher-level default enables it. | off |
|
|
1492
1549
|
| `--format <fmt>` | `table` \| `json`. | `table` |
|
|
1493
1550
|
|
|
1494
1551
|
Reader behavior (D-41): tail merges `<conn>.jsonl.1` (rotated segment, if present) and `<conn>.jsonl`, sorts by `ts` ascending, then takes the last `--n` entries — so `--n 1000` can span a fresh rotation boundary.
|
|
@@ -1506,6 +1563,7 @@ Examples:
|
|
|
1506
1563
|
| `<id-prefix>` | Positional. UUID or prefix ≥ 4 characters; ambiguous prefix exits 1 with disambiguation hint; prefix < 4 chars exits 1. | — |
|
|
1507
1564
|
| `--recovery-ref <id>` | Find the audit entry whose `recovery_ref` field matches this id (exact, not prefix). Mutually exclusive with positional `<id-prefix>` (D-38). | — |
|
|
1508
1565
|
| `--all` | Search across all connections. Output is an envelope `{ connection, entry }` (single-hit also envelope, for shape stability — D-36). | off |
|
|
1566
|
+
| `--no-brief` | Disable brief mode when a higher-level default enables it. | off |
|
|
1509
1567
|
| `--format <fmt>` | `table` \| `json`. | `table` |
|
|
1510
1568
|
|
|
1511
1569
|
Examples:
|
|
@@ -1532,6 +1590,7 @@ Examples:
|
|
|
1532
1590
|
| Flag | Purpose | Default |
|
|
1533
1591
|
|---|---|---|
|
|
1534
1592
|
| `--format <fmt>` | `table` \| `json`. | `table` |
|
|
1593
|
+
| `--no-brief` | Disable brief mode when a higher-level default enables it. | off |
|
|
1535
1594
|
|
|
1536
1595
|
Output reports: writer enabled/disabled, last write result, file-lock state, rotation cap usage (`max_bytes` / `max_entries`). When `audit.enabled = false` (D1 opt-out), `tail` / `show` / `health` still exit 0 and print `Audit is disabled (audit.enabled = false in .dbcli). Use 'dbcli audit health' for details.` (E note).
|
|
1537
1596
|
|
|
@@ -1919,6 +1978,39 @@ includes `storageDir`, `dryRun`, `cutoff`, `criteria`, `protected`, `candidates`
|
|
|
1919
1978
|
|
|
1920
1979
|
**Permission:** n/a
|
|
1921
1980
|
|
|
1981
|
+
### backfill
|
|
1982
|
+
|
|
1983
|
+
Generate a bounded, reviewable source-to-SQL backfill artifact. The command is
|
|
1984
|
+
strictly dry-run: it reads a local JSON source catalog, records non-secret
|
|
1985
|
+
source/target connection identity, and never opens a database connection or
|
|
1986
|
+
executes generated SQL.
|
|
1987
|
+
|
|
1988
|
+
```bash
|
|
1989
|
+
dbcli backfill artifact \
|
|
1990
|
+
--source ./backfill.json \
|
|
1991
|
+
--source-use staging \
|
|
1992
|
+
--target-use production
|
|
1993
|
+
dbcli backfill artifact --source ./backfill.json \
|
|
1994
|
+
--source-use staging --target-use production --stdout
|
|
1995
|
+
dbcli backfill artifact --source ./backfill.json \
|
|
1996
|
+
--source-use staging --target-use production --out .dbcli/backfills/review.json
|
|
1997
|
+
```
|
|
1998
|
+
|
|
1999
|
+
The source catalog must contain `table`, non-empty `keyColumns`, `rows`, a
|
|
2000
|
+
read-only `verifyQuery`, and `expect`; no more than 1,000 rows are accepted.
|
|
2001
|
+
Identifiers are validated and row values are limited to JSON scalars. The
|
|
2002
|
+
target connection must be PostgreSQL, MySQL, or MariaDB (the source identity
|
|
2003
|
+
may describe another engine); target selectors in generated commands are
|
|
2004
|
+
shell-quoted. The artifact includes a SHA-256 source fingerprint, generated parameterized
|
|
2005
|
+
`UPDATE` statements with per-statement `plan` commands, blacklist/schema
|
|
2006
|
+
preflight commands, a `verify safe-backfill` read-back command, identity
|
|
2007
|
+
differences, and a rollback hint. `execution.mode` is always `dry-run` and
|
|
2008
|
+
`requiresHumanConfirmation` is always true; applying SQL is a separate,
|
|
2009
|
+
explicit human-reviewed workflow.
|
|
2010
|
+
|
|
2011
|
+
**Options:** `--source <path>` (required), `--source-use <name>` (required),
|
|
2012
|
+
`--target-use <name>` (required), `--stdout`, `--out <path>`
|
|
2013
|
+
|
|
1922
2014
|
### doctor
|
|
1923
2015
|
|
|
1924
2016
|
Run diagnostic checks on environment, configuration, connection, and data.
|
|
@@ -1936,7 +2028,13 @@ dbcli doctor --format json # JSON output for AI agents
|
|
|
1936
2028
|
> **MongoDB SRV diagnostics:** When the active connection uses `mongodb+srv://`, `doctor` reports whether the current runtime can resolve SRV records directly or only through the DNS-over-HTTPS fallback used by dbcli. This helps spot execution-environment DNS restrictions even when Compass can connect.
|
|
1937
2029
|
|
|
1938
2030
|
**Exit code:** 0 if all pass or warnings only, 1 if any error
|
|
1939
|
-
**Options:** `--format <text|json
|
|
2031
|
+
**Options:** `--format <text|json>`, `--remediation`
|
|
2032
|
+
|
|
2033
|
+
With `--format json --remediation`, large-table warnings include one bounded
|
|
2034
|
+
sample candidate per table. SQL candidates first run `dbcli plan` for a `LIMIT
|
|
2035
|
+
100` read; MongoDB and Elasticsearch candidates first run `dbcli schema` as a
|
|
2036
|
+
preflight. Each then offers a matching bounded `dbcli query` as the
|
|
2037
|
+
human-confirmed apply step; doctor never runs either command automatically.
|
|
1940
2038
|
|
|
1941
2039
|
### completion
|
|
1942
2040
|
|
|
@@ -21,6 +21,20 @@ the CLI package has not been installed globally.
|
|
|
21
21
|
3. All writes: `--dry-run` (SQL/Mongo) → run → `query` read-back to confirm. Redis
|
|
22
22
|
`query` has **no `--dry-run`** (see **Redis**); Elasticsearch is **read-only**.
|
|
23
23
|
|
|
24
|
+
**Environment and mutation boundary:** In v2, inspect `dbcli use --list --format json`
|
|
25
|
+
before selecting a named connection. A connection labelled `environment: "production"`
|
|
26
|
+
must be explicitly selected; it is never silently used through the saved default. To
|
|
27
|
+
persist a production default, a human must repeat the exact name with
|
|
28
|
+
`--confirm-production`. When `DBCLI_AGENT_MODE=1`, configuration, permission, and
|
|
29
|
+
credential mutations are blocked unconditionally. Run human/admin changes in a separate
|
|
30
|
+
process with agent mode disabled; do not treat a same-process environment variable as
|
|
31
|
+
approval. Trusted config writes maintain an integrity record and secure file modes where
|
|
32
|
+
supported, and agent reads fail closed on missing, replaced, non-regular, or tampered
|
|
33
|
+
records. Agent mode refuses legacy single-file `.dbcli` configs until a human/admin
|
|
34
|
+
migration to V2 home storage. For a same-user hostile process, a host can set
|
|
35
|
+
`DBCLI_CONFIG_INTEGRITY_ANCHOR_DIR` to a protected or read-only directory containing
|
|
36
|
+
detached digests.
|
|
37
|
+
|
|
24
38
|
**`update` / `delete` `--where` is equality-only (SQL).** It accepts **only** `col=val` or
|
|
25
39
|
`col1=v1 AND col2=v2`. A comparison / pattern operator (`>`, `>=`, `<`, `!=`, `LIKE`, `IN`)
|
|
26
40
|
is a **parse error**; worse, `OR` is **silently swallowed into the value** — `a=1 OR b=2`
|
|
@@ -238,7 +252,7 @@ dbcli init --system elasticsearch \
|
|
|
238
252
|
```bash
|
|
239
253
|
dbcli init --conn-name staging --env-file .env.staging --permission query-only
|
|
240
254
|
dbcli init --conn-name prod --env-file .env.production --use-env-refs --skip-test
|
|
241
|
-
dbcli use --list
|
|
255
|
+
dbcli use --list --format json # safe identity inventory: name/env/permission/server/database
|
|
242
256
|
dbcli use prod # switch default (persists — avoid for one-off queries)
|
|
243
257
|
dbcli query --use staging "SELECT 1" # one-shot override on any subcommand
|
|
244
258
|
DBCLI_CONNECTION=staging dbcli query "SELECT 1" # one-shot via env; parallel-safe
|
|
@@ -247,6 +261,18 @@ dbcli init --rename staging:stg # rename
|
|
|
247
261
|
dbcli init --remove stg # remove
|
|
248
262
|
```
|
|
249
263
|
|
|
264
|
+
For a connection shared across projects, use the explicit root-level `--global` scope. It stores a v2 registry at `~/.config/dbcli/config.json`; it does not create or modify a project binding:
|
|
265
|
+
|
|
266
|
+
```bash
|
|
267
|
+
dbcli --global init --conn-name shared --system postgresql --host db.example.com \
|
|
268
|
+
--port 5432 --user app --password '<secret>' --name appdb \
|
|
269
|
+
--skip-test --no-interactive --force
|
|
270
|
+
dbcli --global use --list --format json
|
|
271
|
+
dbcli --global query "SELECT 1"
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
`--global` must appear before the command. Without it, commands continue to use the current project's `.dbcli` binding; global and project registries are independent.
|
|
275
|
+
|
|
250
276
|
Each named connection has its own schema cache at `.dbcli/schemas/<connection>/`. Run
|
|
251
277
|
`dbcli schema --use <name>` once per connection **before** `schema <table>` — otherwise the
|
|
252
278
|
cache may serve another connection's columns. `schema --refresh` / `--reset` manage the cache
|
|
@@ -313,6 +339,7 @@ Full flags and edge cases: see [reference.md](reference.md) `init` section.
|
|
|
313
339
|
| `snapshot` | query-only+ | **(v1.25)** SQL only. Capture a result fingerprint (`rowCount` + per-column null/distinct/min/max/sum + order-independent checksum). `--out` (default `.dbcli/snapshots/snap-<ts>.json`), `--rows`, `--stdout`, `--format`, `--no-limit`. Baseline for `assert --against`. |
|
|
314
340
|
| `assert` | query-only+ | **(v1.25)** SQL only. Verify an invariant; exit 1 on failure unless `--no-fail`. `--expect "rows>0\|value==X\|col:c not null\|unique\|between a and b\|>= n"`, `--vs <query> --compare rows\|value` (reconcile), `--against <snapshot> --tolerance <pct>`. |
|
|
315
341
|
| `verification` | n/a | Inspect and manage local verification artifacts. `list` / `show <id-or-path>` / `summary` are read-only; `prune` is dry-run by default and deletes only with `--execute --force`. Reads `<cwd>/.dbcli/verification/`; no DB connection, no audit writes. |
|
|
342
|
+
| `backfill artifact` | n/a | Build a bounded, reviewable source-to-SQL backfill artifact from JSON. Includes source/target identity, blacklist/schema preflight, read-back verification, and rollback hints; dry-run only and never executes writes. |
|
|
316
343
|
| `proxy` | n/a | **(v1.26)** MySQL/MariaDB/PostgreSQL only. Local-dev observability proxy — relays app traffic to the real DB and appends query/latency/byte/error events to `.dbcli/proxy/events.jsonl`. Subcommands: `mysql` \| `mariadb` \| `postgresql`. `--listen`, `--target`, `--events`, `--slow-ms` (default `1000`), `--redact none\|literals`. Observe-only. **(v1.27)** `proxy analyze` aggregates the event log offline into a JSON/text report (summary, byFingerprint with suggestedCommands, slowest, errors, hotTables, N+1) — errors out if no events exist yet. |
|
|
317
344
|
| `status` | query-only+ | Safe JSON/text summary (no credentials). |
|
|
318
345
|
| `inspect` | query-only+ | Read-only context snapshot (connection, permission, blacklist, objects, snippets, context-aware `suggestedCommands`, and **(v1.23)** human-readable `hints`). `--for-agent` / `--brief` / `--no-connect` / `--require-schema-cache`. Supports `--recovery`. |
|
|
@@ -320,7 +347,7 @@ Full flags and edge cases: see [reference.md](reference.md) `init` section.
|
|
|
320
347
|
| `guide` | query-only+ | Deterministic next-command plan for a fixed goal (`slow-query`, `capacity`, `health`, `index-usage`, `permissions`, `schema-overview`). `--list` to enumerate. **(v1.23)** `guide missing-index-for <query>` suggests composite indexes for a single SELECT (`--format yaml\|json\|markdown`, `--min-confidence`). |
|
|
321
348
|
| `recovery` | n/a | Look up the structured `RecoveryEnvelope` for a known error code (`--code <CODE>` or `--list`). Standalone synthesizer; does not require a real failure. |
|
|
322
349
|
| `recover` | n/a | Inspect (default) or `--apply` the auto-saved recovery plan in `.dbcli/last-recovery.json`. `--allow-write=readonly-cmd\|write-cmd`, `--no-verify`, `--from <file>`, `--next --after-step <n> --result <json\|@file>` for multi-turn step-at-a-time. |
|
|
323
|
-
| `doctor` | n/a | Environment, config, connection, SRV diagnostics (Mongo), schema cache age. |
|
|
350
|
+
| `doctor` | n/a | Environment/runtime identity, config, connection, SRV diagnostics (Mongo), schema cache age. `--format json --remediation` emits candidate-only blacklist/schema/bounded-sample plans (SQL: `dbcli plan` → human-confirmed bounded `dbcli query`; MongoDB/Elasticsearch: `dbcli schema` preflight → human-confirmed bounded query); it never applies them. |
|
|
324
351
|
| `completion` | n/a | bash / zsh / fish scripts. |
|
|
325
352
|
| `upgrade` | n/a | Self-update from npm; 24h-cached version hints on every command. |
|
|
326
353
|
| `shell` | (same as query+) | Interactive REPL. SQL engines, MongoDB, and Redis (single-line; `.no-limit on/off`). **(v1.22)** Elasticsearch opens a Kibana Dev Tools-style REPL (`<METHOD> /<path>` + optional JSON body, blank line submits). |
|
|
@@ -509,4 +536,4 @@ schema. Raw `query` / `export` invocations render a sortable table only.
|
|
|
509
536
|
- Blacklisted tables and columns are redacted from query output.
|
|
510
537
|
- `schema` reports `estimatedRowCount` and `sizeCategory` (small / medium / large / huge). For large/huge tables add `WHERE` or `LIMIT` — bands in reference.md.
|
|
511
538
|
- `doctor` on `mongodb+srv://` reports whether SRV resolves natively or through the DoH fallback — useful when the runtime restricts DNS.
|
|
512
|
-
- **Global flags:** `--config <path>`, `--use <name>`, `-v` / `-vv` /
|
|
539
|
+
- **Global flags:** `--version`, `--config <path>`, `--global`, `--use <name>`, `-v` / `--verbose` / `-vv`, `-q` / `--quiet`, `--no-color` (also honours `NO_COLOR`). Root-level flags must precede the command unless the command explicitly declares a command-level option.
|
|
@@ -4,6 +4,22 @@ Companion to [SKILL.md](SKILL.md). Exhaustive flags, copy-paste examples, `shell
|
|
|
4
4
|
|
|
5
5
|
For cross-engine support status, see `docs/feature-matrix.md` in the repository.
|
|
6
6
|
|
|
7
|
+
## Global options and placement
|
|
8
|
+
|
|
9
|
+
These options are available on the root `dbcli` command. Root-level options must
|
|
10
|
+
appear before the command path (for example, `dbcli --use prod status`). A
|
|
11
|
+
command-level option is only valid after the command that declares it.
|
|
12
|
+
|
|
13
|
+
| Option | Purpose |
|
|
14
|
+
|---|---|
|
|
15
|
+
| `--version` | Print the installed dbcli version. |
|
|
16
|
+
| `--no-color` | Disable colored output. |
|
|
17
|
+
| `-v, --verbose` | Increase logging verbosity; repeat for debug output. |
|
|
18
|
+
| `-q, --quiet` | Suppress non-essential output. |
|
|
19
|
+
| `--config <path>` | Select the `.dbcli` configuration path. |
|
|
20
|
+
| `--global` | Select the user-global registry at `~/.config/dbcli/config.json` instead of the current project's `.dbcli` config. Place it before the command path. |
|
|
21
|
+
| `--use <connection>` | Select a named connection for this invocation; place it before the command path unless that command explicitly lists a command-level `--use`. |
|
|
22
|
+
|
|
7
23
|
## Commands
|
|
8
24
|
|
|
9
25
|
### init
|
|
@@ -34,10 +50,18 @@ dbcli init --conn-name staging --env-file .env.staging # Named connection with
|
|
|
34
50
|
dbcli init --conn-name prod --env-file .env.production --use-env-refs --skip-test
|
|
35
51
|
dbcli init --remove staging # Remove a named connection
|
|
36
52
|
dbcli init --rename staging:production # Rename a connection
|
|
53
|
+
|
|
54
|
+
# User-global registry (shared by projects; --global must precede the command)
|
|
55
|
+
dbcli --global init --conn-name shared --system postgresql --host db.example.com \
|
|
56
|
+
--port 5432 --user app --password '<secret>' --name appdb \
|
|
57
|
+
--skip-test --no-interactive --force
|
|
58
|
+
dbcli --global use --list
|
|
37
59
|
```
|
|
38
60
|
|
|
39
61
|
**Key options:** `--system`, `--permission`, `--use-env-refs`, `--skip-test`, `--no-interactive`, `--force`, `--conn-name <name>`, `--env-file <path>`, `--remove <name>`, `--rename <old:new>`
|
|
40
62
|
|
|
63
|
+
**Environment-reference options:** `--env-host <var>`, `--env-port <var>`, `--env-user <var>`, `--env-password <var>`, `--env-database <var>`
|
|
64
|
+
|
|
41
65
|
**MongoDB-specific options:** `--uri <uri>` (full connection URI), `--auth-source <db>` (auth database, default: `admin` when user/password set)
|
|
42
66
|
|
|
43
67
|
**Elasticsearch-specific options:** `--cloud-id <id>` (Elastic Cloud), `--api-key <key>` (ApiKey auth). Other ES fields (`nodes[]`, `protocol`, `caPath`, `rejectUnauthorized`) can be edited directly in `.dbcli`.
|
|
@@ -46,6 +70,8 @@ dbcli init --rename staging:production # Rename a connection
|
|
|
46
70
|
|
|
47
71
|
**Multi-connection:** Using `--conn-name` or `--env-file` creates a v2 config with named connections. Each connection can have its own env file and permission level. Existing v1 configs are automatically imported as the `default` connection when upgrading.
|
|
48
72
|
|
|
73
|
+
Use root-level `--global` with `init`, `use`, `status`, `query`, or any other command to read or mutate the user-global v2 registry at `~/.config/dbcli/config.json`. Without it, the current project binding remains the source of truth. The global registry uses the same private file mode and integrity record as project home storage.
|
|
74
|
+
|
|
49
75
|
> **AI agent note on `--use-env-refs`:** If an existing `.dbcli` config contains `{"$env": "DB_HOST"}` style references, the connection values are read from environment variables at runtime. Do NOT re-run `init` to replace these references with actual values — the env-ref format is intentional for CI/CD and multi-environment setups.
|
|
50
76
|
|
|
51
77
|
### use
|
|
@@ -56,8 +82,20 @@ Switch or display the default database connection (v2 multi-connection config).
|
|
|
56
82
|
dbcli use # Show current default connection
|
|
57
83
|
dbcli use staging # Switch default to 'staging'
|
|
58
84
|
dbcli use --list # List all connections (* marks default)
|
|
85
|
+
dbcli use --list --format json # Credential-free connection identity inventory
|
|
59
86
|
```
|
|
60
87
|
|
|
88
|
+
Each v2 named connection may include an optional non-secret `environment` label
|
|
89
|
+
(for example, `"environment": "production"`). JSON output is an object with a
|
|
90
|
+
`connections` array. Each item contains `name`, `environment` (a string or
|
|
91
|
+
`null`),
|
|
92
|
+
`permission`, `system`, `server` (`host` and `port`), `database`, and `isDefault`.
|
|
93
|
+
Environment-backed server and database fields are `null`; URI-only MongoDB and
|
|
94
|
+
Cloud ID-only Elasticsearch connections also return `null` instead of default
|
|
95
|
+
placeholders. It deliberately excludes user names, passwords, URIs, Cloud IDs,
|
|
96
|
+
API keys, and env variable names.
|
|
97
|
+
Misspelled selectors suggest nearby configured connection names.
|
|
98
|
+
|
|
61
99
|
Any command can also use `--use <name>` to temporarily select a connection without changing the default:
|
|
62
100
|
|
|
63
101
|
```bash
|
|
@@ -67,6 +105,18 @@ dbcli list --use prod
|
|
|
67
105
|
|
|
68
106
|
**Requires v2 config** (created with `dbcli init --conn-name`).
|
|
69
107
|
|
|
108
|
+
**Options:** `--list`, `--format <text|json>`, `--confirm-production <name>` (required when explicitly selecting a production connection as the default).
|
|
109
|
+
|
|
110
|
+
### Agent configuration trust boundary
|
|
111
|
+
|
|
112
|
+
When `DBCLI_AGENT_MODE=1`, configuration, permission, and credential mutations
|
|
113
|
+
are rejected. Agent reads require the V2 directory config and its integrity
|
|
114
|
+
record; missing, replaced, non-regular, or tampered records fail closed. Legacy
|
|
115
|
+
single-file `.dbcli` configs must be migrated by a human/admin process with
|
|
116
|
+
agent mode disabled. A host that needs protection from a same-user hostile
|
|
117
|
+
process can set `DBCLI_CONFIG_INTEGRITY_ANCHOR_DIR` to a protected or read-only
|
|
118
|
+
directory; trusted writes publish detached digests there.
|
|
119
|
+
|
|
70
120
|
### list
|
|
71
121
|
|
|
72
122
|
List all tables (SQL), collections (MongoDB), keys (Redis), or indices (Elasticsearch).
|
|
@@ -746,6 +796,7 @@ Manage sensitive data blacklist to prevent AI access to restricted tables/column
|
|
|
746
796
|
|
|
747
797
|
```bash
|
|
748
798
|
dbcli blacklist list # Show current blacklist
|
|
799
|
+
dbcli blacklist list --format json # Stable machine-readable result
|
|
749
800
|
dbcli blacklist table add payments # Block entire table
|
|
750
801
|
dbcli blacklist table remove payments # Unblock table
|
|
751
802
|
dbcli blacklist column add users.password # Block specific column
|
|
@@ -754,6 +805,11 @@ dbcli blacklist column remove users.password
|
|
|
754
805
|
|
|
755
806
|
**Subcommands:** `list`, `table add <name>`, `table remove <name>`, `column add <table.column>`, `column remove <table.column>`
|
|
756
807
|
|
|
808
|
+
**`list` options:** `--config <path>`, `--format <text|json>` (default: `text`). JSON writes one
|
|
809
|
+
document to stdout: `{ "tables": string[], "columns": Record<string, string[]>, "warnings":
|
|
810
|
+
[{ "collection", "raw", "reason" }] }`. Invalid MongoDB blacklist patterns appear in `warnings`;
|
|
811
|
+
the JSON result is otherwise free of human headings and diagnostics.
|
|
812
|
+
|
|
757
813
|
### check
|
|
758
814
|
|
|
759
815
|
Run data health checks on tables.
|
|
@@ -1079,7 +1135,7 @@ dbcli proxy mysql --listen 127.0.0.1:3307 --target 127.0.0.1:3306
|
|
|
1079
1135
|
dbcli proxy postgresql --listen 127.0.0.1:5434 --target 127.0.0.1:5432
|
|
1080
1136
|
dbcli proxy mysql --slow-ms 500 --redact literals # redact SQL literals in events
|
|
1081
1137
|
dbcli proxy mariadb --events ./logs/proxy.jsonl # custom event file
|
|
1082
|
-
dbcli
|
|
1138
|
+
dbcli --use prod proxy postgresql # infer target from named connection
|
|
1083
1139
|
|
|
1084
1140
|
dbcli proxy analyze # analyze .dbcli/proxy/events.jsonl (JSON)
|
|
1085
1141
|
dbcli proxy analyze --format text --top 10 # human-readable top-10 view
|
|
@@ -1489,6 +1545,7 @@ Audit entries are metadata-only by design — never raw SQL bodies, `--param` va
|
|
|
1489
1545
|
| `--all` | Merge entries across all connections; output is an envelope array `[{ connection, entry }, ...]` (D-39). | off (current connection only) |
|
|
1490
1546
|
| `--for-agent` | Shortcut for `--format json --brief`. Single-connection JSON is a flat array; `--all` JSON is an envelope array. | off |
|
|
1491
1547
|
| `--brief` | Drop large redaction fields from the entry; keep `ts / command / target / success` (D-33). | off |
|
|
1548
|
+
| `--no-brief` | Disable brief mode when a higher-level default enables it. | off |
|
|
1492
1549
|
| `--format <fmt>` | `table` \| `json`. | `table` |
|
|
1493
1550
|
|
|
1494
1551
|
Reader behavior (D-41): tail merges `<conn>.jsonl.1` (rotated segment, if present) and `<conn>.jsonl`, sorts by `ts` ascending, then takes the last `--n` entries — so `--n 1000` can span a fresh rotation boundary.
|
|
@@ -1506,6 +1563,7 @@ Examples:
|
|
|
1506
1563
|
| `<id-prefix>` | Positional. UUID or prefix ≥ 4 characters; ambiguous prefix exits 1 with disambiguation hint; prefix < 4 chars exits 1. | — |
|
|
1507
1564
|
| `--recovery-ref <id>` | Find the audit entry whose `recovery_ref` field matches this id (exact, not prefix). Mutually exclusive with positional `<id-prefix>` (D-38). | — |
|
|
1508
1565
|
| `--all` | Search across all connections. Output is an envelope `{ connection, entry }` (single-hit also envelope, for shape stability — D-36). | off |
|
|
1566
|
+
| `--no-brief` | Disable brief mode when a higher-level default enables it. | off |
|
|
1509
1567
|
| `--format <fmt>` | `table` \| `json`. | `table` |
|
|
1510
1568
|
|
|
1511
1569
|
Examples:
|
|
@@ -1532,6 +1590,7 @@ Examples:
|
|
|
1532
1590
|
| Flag | Purpose | Default |
|
|
1533
1591
|
|---|---|---|
|
|
1534
1592
|
| `--format <fmt>` | `table` \| `json`. | `table` |
|
|
1593
|
+
| `--no-brief` | Disable brief mode when a higher-level default enables it. | off |
|
|
1535
1594
|
|
|
1536
1595
|
Output reports: writer enabled/disabled, last write result, file-lock state, rotation cap usage (`max_bytes` / `max_entries`). When `audit.enabled = false` (D1 opt-out), `tail` / `show` / `health` still exit 0 and print `Audit is disabled (audit.enabled = false in .dbcli). Use 'dbcli audit health' for details.` (E note).
|
|
1537
1596
|
|
|
@@ -1919,6 +1978,39 @@ includes `storageDir`, `dryRun`, `cutoff`, `criteria`, `protected`, `candidates`
|
|
|
1919
1978
|
|
|
1920
1979
|
**Permission:** n/a
|
|
1921
1980
|
|
|
1981
|
+
### backfill
|
|
1982
|
+
|
|
1983
|
+
Generate a bounded, reviewable source-to-SQL backfill artifact. The command is
|
|
1984
|
+
strictly dry-run: it reads a local JSON source catalog, records non-secret
|
|
1985
|
+
source/target connection identity, and never opens a database connection or
|
|
1986
|
+
executes generated SQL.
|
|
1987
|
+
|
|
1988
|
+
```bash
|
|
1989
|
+
dbcli backfill artifact \
|
|
1990
|
+
--source ./backfill.json \
|
|
1991
|
+
--source-use staging \
|
|
1992
|
+
--target-use production
|
|
1993
|
+
dbcli backfill artifact --source ./backfill.json \
|
|
1994
|
+
--source-use staging --target-use production --stdout
|
|
1995
|
+
dbcli backfill artifact --source ./backfill.json \
|
|
1996
|
+
--source-use staging --target-use production --out .dbcli/backfills/review.json
|
|
1997
|
+
```
|
|
1998
|
+
|
|
1999
|
+
The source catalog must contain `table`, non-empty `keyColumns`, `rows`, a
|
|
2000
|
+
read-only `verifyQuery`, and `expect`; no more than 1,000 rows are accepted.
|
|
2001
|
+
Identifiers are validated and row values are limited to JSON scalars. The
|
|
2002
|
+
target connection must be PostgreSQL, MySQL, or MariaDB (the source identity
|
|
2003
|
+
may describe another engine); target selectors in generated commands are
|
|
2004
|
+
shell-quoted. The artifact includes a SHA-256 source fingerprint, generated parameterized
|
|
2005
|
+
`UPDATE` statements with per-statement `plan` commands, blacklist/schema
|
|
2006
|
+
preflight commands, a `verify safe-backfill` read-back command, identity
|
|
2007
|
+
differences, and a rollback hint. `execution.mode` is always `dry-run` and
|
|
2008
|
+
`requiresHumanConfirmation` is always true; applying SQL is a separate,
|
|
2009
|
+
explicit human-reviewed workflow.
|
|
2010
|
+
|
|
2011
|
+
**Options:** `--source <path>` (required), `--source-use <name>` (required),
|
|
2012
|
+
`--target-use <name>` (required), `--stdout`, `--out <path>`
|
|
2013
|
+
|
|
1922
2014
|
### doctor
|
|
1923
2015
|
|
|
1924
2016
|
Run diagnostic checks on environment, configuration, connection, and data.
|
|
@@ -1936,7 +2028,13 @@ dbcli doctor --format json # JSON output for AI agents
|
|
|
1936
2028
|
> **MongoDB SRV diagnostics:** When the active connection uses `mongodb+srv://`, `doctor` reports whether the current runtime can resolve SRV records directly or only through the DNS-over-HTTPS fallback used by dbcli. This helps spot execution-environment DNS restrictions even when Compass can connect.
|
|
1937
2029
|
|
|
1938
2030
|
**Exit code:** 0 if all pass or warnings only, 1 if any error
|
|
1939
|
-
**Options:** `--format <text|json
|
|
2031
|
+
**Options:** `--format <text|json>`, `--remediation`
|
|
2032
|
+
|
|
2033
|
+
With `--format json --remediation`, large-table warnings include one bounded
|
|
2034
|
+
sample candidate per table. SQL candidates first run `dbcli plan` for a `LIMIT
|
|
2035
|
+
100` read; MongoDB and Elasticsearch candidates first run `dbcli schema` as a
|
|
2036
|
+
preflight. Each then offers a matching bounded `dbcli query` as the
|
|
2037
|
+
human-confirmed apply step; doctor never runs either command automatically.
|
|
1940
2038
|
|
|
1941
2039
|
### completion
|
|
1942
2040
|
|
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,32 @@ All notable changes to dbcli are documented here.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [1.45.0] - 2026-08-04 - root-level `--global`:跨專案共用的 user-global registry
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **root-level `--global` 旗標。** 原本每條連線都綁在專案上:`init` 會在 `./.dbcli/config.json` 寫 binding stub,真正的設定落在 `~/.config/dbcli/projects/<project-id>/`。要在多個專案共用同一條連線,只能在每個 repo 重跑一次 `init`,或手動複製設定。`--global` 讓 `~/.config/dbcli/config.json` 成為一個獨立的 v2 registry:`dbcli --global init --conn-name shared ...` 直接寫進去、不建立也不修改專案 binding,`dbcli --global use --list` / `--global query` 則在不依賴當前目錄的情況下操作它。scope 必須明確選取 —— 未帶 `--global` 時一切照舊走專案 binding,避免在不相關的專案裡誤用全域連線。全域檔案沿用與 home storage 專案設定相同的私有檔案權限與 integrity record。
|
|
13
|
+
- **`getDbcliConfigHome()` / `getGlobalConfigPath()` / `isGlobalConfigPath()` 加入 `public.ts`。** 前者把 per-user root 改為延遲解析並支援 `DBCLI_CONFIG_HOME` 覆寫,測試與 embedder 不必 reload module 就能隔離 config home。
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
17
|
+
- **`migrate` 與 `queries` 子指令補上 Commander `command` 傳遞。** 這兩處原本以 `resolveConfigPath(undefined, opts)` 解析設定路徑,看不到 ancestor 的 root-level 旗標 —— 沒有 `--global` 時症狀被 `.dbcli` 預設值蓋掉,加上 `--global` 後就會靜默讀錯 registry。現在 36 個 `resolveConfigPath` 呼叫點全部傳入 command。
|
|
18
|
+
- **`resolveConfigPath` 的優先序明確化。** 顯式 `--config` 仍最優先(`--global --config <path>` 因此是確定的),其次是顯式 `--global`,最後才是 `.dbcli` 預設值。
|
|
19
|
+
|
|
20
|
+
## [1.44.1] - 2026-08-02 - `agent-core` 的 `loadEnvFile` 改用 node:fs,可在 Node 執行
|
|
21
|
+
|
|
22
|
+
### Fixed
|
|
23
|
+
|
|
24
|
+
- **`loadEnvFile` 不再依賴 `Bun.file`。** `./agent-core` 存在的理由是給下游 agent CLI 共用,而那些工具不一定跑在 Bun 上;`loadEnvFile` 內部呼叫 `Bun.file()`,在 Node 下直接 `ReferenceError: Bun is not defined`,使整個匯出對第一個 Node 消費者(logq)不可用。改以 `node:fs/promises` 讀檔,解析與「不覆寫既有 `process.env`」的行為完全不變;檔案不存在仍拋 `ConfigError`。其餘五個匯出本來就沒有 runtime 相依,不受影響。
|
|
25
|
+
|
|
26
|
+
### Added
|
|
27
|
+
|
|
28
|
+
- **Node runtime 契約測試。** 本 repo 的測試全部跑在 Bun 上,所以 agent-core 裡的 Bun-only 呼叫對它們是隱形的 —— 這正是這個 bug 得以發布的原因。新增的契約測試會 spawn 真正的 `node` 行程去 import 建置後的 `dist/agent-core.mjs`,逐一呼叫每個匯出。還原修正後此測試會失敗(已驗證),因此這個失敗模式不會再次出貨。
|
|
29
|
+
|
|
30
|
+
### Changed
|
|
31
|
+
|
|
32
|
+
- **同步跨平台發版 metadata。** npm package、Codex/Claude/Cursor plugin、packaged Codex plugin 與 Gemini extension 統一為 `1.44.1`。
|
|
33
|
+
|
|
8
34
|
## [1.44.0] - 2026-08-02 - agent-core 補上錯誤型別與 env reference 型別
|
|
9
35
|
|
|
10
36
|
### Added
|
package/README.md
CHANGED
|
@@ -269,6 +269,18 @@ dbcli init --conn-name staging --env-file .env.staging
|
|
|
269
269
|
dbcli init --conn-name prod --env-file .env.production --use-env-refs
|
|
270
270
|
```
|
|
271
271
|
|
|
272
|
+
For connections shared across projects, use the user-global scope. It stores a v2 registry at `~/.config/dbcli/config.json` and leaves the current project's `.dbcli` binding untouched:
|
|
273
|
+
|
|
274
|
+
```bash
|
|
275
|
+
dbcli --global init --conn-name shared --system postgresql --host db.example.com \
|
|
276
|
+
--port 5432 --user app --password '<secret>' --name appdb \
|
|
277
|
+
--skip-test --no-interactive --force
|
|
278
|
+
dbcli --global use --list --format json
|
|
279
|
+
dbcli --global query "SELECT 1"
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
Root-level `--global` must precede the command. Without it, commands continue to use the project configuration.
|
|
283
|
+
|
|
272
284
|
### Managing Connections
|
|
273
285
|
|
|
274
286
|
Use the `dbcli use` command to switch between connections or list them.
|
|
@@ -1073,6 +1085,7 @@ All commands support these global options:
|
|
|
1073
1085
|
| Flag | Description |
|
|
1074
1086
|
|------|-------------|
|
|
1075
1087
|
| `--config <path>` | Path to .dbcli config file (default: `.dbcli`) |
|
|
1088
|
+
| `--global` | Use the user-global registry at `~/.config/dbcli/config.json` |
|
|
1076
1089
|
| `--use <connection>` | Use a named v2 connection for this invocation only (does not change the default) |
|
|
1077
1090
|
| `-v, --verbose` | Increase verbosity (`-v` verbose, `-vv` debug) |
|
|
1078
1091
|
| `-q, --quiet` | Suppress non-essential output |
|