@carllee1983/dbcli 7.0.1 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/.agents/skills/story-development/SKILL.md +70 -0
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +1 -1
  4. package/.cursor/rules/dbcli.mdc +64 -1
  5. package/.cursor/skills/dbcli/reference.md +173 -7
  6. package/.cursor-plugin/plugin.json +1 -1
  7. package/.github/skills/dbcli/SKILL.md +64 -1
  8. package/.github/skills/dbcli/reference.md +173 -7
  9. package/CHANGELOG.md +299 -0
  10. package/README.zh-TW.md +1 -2
  11. package/assets/SKILL.md +64 -1
  12. package/assets/integration-kit/README.md +43 -0
  13. package/assets/integration-kit/external-consumers.ts +9 -0
  14. package/assets/integration-kit/skill-author-consumer.ts +77 -0
  15. package/assets/integration-kit/task-pack.md +18 -0
  16. package/assets/reference.md +173 -7
  17. package/assets/tasks/README.md +6 -0
  18. package/assets/tasks/analyze-table-perf.md +3 -3
  19. package/assets/tasks/audit-permissions.md +2 -2
  20. package/assets/tasks/connection-health.md +2 -2
  21. package/assets/tasks/design-review.md +3 -3
  22. package/assets/tasks/diagnose-slow-query.md +3 -3
  23. package/assets/tasks/migration-review.md +3 -3
  24. package/assets/tasks/mongo-safe-backfill.md +2 -2
  25. package/assets/tasks/mongo-schema-drift-review.md +2 -2
  26. package/assets/tasks/orm-drift-review.md +3 -3
  27. package/assets/tasks/pr-database-review.md +3 -3
  28. package/assets/tasks/safe-backfill-verify.md +3 -3
  29. package/assets/tasks/safe-backfill.md +3 -3
  30. package/assets/tasks/schema-drift-review.md +3 -3
  31. package/assets/tasks/slow-endpoint-investigation.md +19 -6
  32. package/assets/ui-template.html +18 -18
  33. package/dist/cli-runtime.mjs +25537 -22204
  34. package/dist/cli.mjs +7 -5
  35. package/dist/core.d.ts +297 -2
  36. package/dist/core.mjs +2075 -3
  37. package/dist/ui-style.css +1 -1
  38. package/gemini-extension.json +1 -1
  39. package/package.json +6 -4
  40. package/plugins/dbcli-agent/.codex-plugin/plugin.json +1 -1
  41. package/plugins/dbcli-agent/skills/dbcli/SKILL.md +64 -1
  42. package/plugins/dbcli-agent/skills/dbcli/reference.md +173 -7
  43. package/skills/dbcli/SKILL.md +64 -1
  44. package/skills/dbcli/reference.md +173 -7
  45. package/assets/SKILL.zh-TW.md +0 -506
@@ -0,0 +1,43 @@
1
+ # Skill Author Integration Kit
2
+
3
+ Copy `skill-author-consumer.ts` into a Bun/TypeScript Skill that depends on
4
+ `@carllee1983/dbcli`. It uses only the public `@carllee1983/dbcli/core` contract.
5
+
6
+ ```ts
7
+ import { spawn } from 'bun'
8
+ import { discover, preflight } from './skill-author-consumer'
9
+
10
+ const run = async (args: readonly string[]) => {
11
+ const child = spawn(['dbcli', ...args], { stdout: 'pipe', stderr: 'pipe' })
12
+ return {
13
+ code: await child.exited,
14
+ stdout: await new Response(child.stdout).text(),
15
+ stderr: await new Response(child.stderr).text(),
16
+ }
17
+ }
18
+
19
+ const catalog = await discover(run) // strict catalog parsing and schema pinning
20
+ const gate = await preflight(run, ['schema.read', 'query.read'], 'STORY-123')
21
+ if (!gate.ok) throw new Error(gate.error?.code ?? 'requirements are unavailable')
22
+ console.log(catalog.capabilities.map(({ id }) => id))
23
+ ```
24
+
25
+ `discover` accepts only exit `0`. `preflight` accepts `0`, `1`, or `2`: each is
26
+ a valid Operation Envelope response. Treat exit `1` as a completed negative
27
+ result and inspect `ok`, `data`, and `error`; exit `2` means invalid invocation.
28
+ Both helpers reject non-JSON output, stderr, unknown fields, and any schema
29
+ version other than the exported constants.
30
+
31
+ Use [`task-pack.md`](./task-pack.md) as the smallest `safety.requires` example.
32
+ It remains plan-only; do not put a CRUD, CQRS, or DBA workflow into dbcli.
33
+
34
+ [`external-consumers.ts`](./external-consumers.ts) supplies the requirements for
35
+ the three contract-test consumers: CRUD, CQRS, and DBA. They use this kit's
36
+ public contract only; dbcli neither implements nor approves their workflows.
37
+
38
+ The optional correlation ID is returned in `context.correlationId` for
39
+ non-static agent output and is recorded as audit metadata. It is not evidence:
40
+ for a supported command, request an evidence receipt with
41
+ `--evidence-receipt <workspace-relative-path>` and retain the returned receipt
42
+ with that correlation ID. Never put secrets, SQL, personal data, or free-form
43
+ input in a correlation ID.
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Example requirements owned by external Skills, not by dbcli.
3
+ * Each consumer uses discover/preflight from skill-author-consumer.ts.
4
+ */
5
+ export const EXTERNAL_CONSUMERS = {
6
+ crud: ['schema.read', 'query.read', 'data.insert', 'data.update', 'data.delete'],
7
+ cqrs: ['schema.read', 'query.read'],
8
+ dba: ['connection.diagnose', 'schema.scan', 'audit.show'],
9
+ } as const
@@ -0,0 +1,77 @@
1
+ import {
2
+ CAPABILITY_CONTRACT_SCHEMA_VERSION,
3
+ OPERATION_ENVELOPE_SCHEMA_VERSION,
4
+ parseCapabilityCatalog,
5
+ parseOperationEnvelope,
6
+ type CapabilityCatalog,
7
+ type OperationEnvelope,
8
+ } from '@carllee1983/dbcli/core'
9
+
10
+ export interface CommandResult {
11
+ readonly code: number
12
+ readonly stdout: string
13
+ readonly stderr: string
14
+ }
15
+
16
+ export type RunDbcli = (args: readonly string[]) => Promise<CommandResult>
17
+
18
+ export class DbcliIntegrationError extends Error {
19
+ constructor(message: string) {
20
+ super(message)
21
+ this.name = 'DbcliIntegrationError'
22
+ }
23
+ }
24
+
25
+ function json(stdout: string, label: string): unknown {
26
+ try {
27
+ return JSON.parse(stdout)
28
+ } catch {
29
+ throw new DbcliIntegrationError(`${label} did not emit JSON`)
30
+ }
31
+ }
32
+
33
+ /** Discover the static catalog and reject an unpinned or non-strict response. */
34
+ export async function discover(run: RunDbcli): Promise<CapabilityCatalog> {
35
+ const result = await run(['capabilities', '--format', 'json'])
36
+ if (result.code !== 0 || result.stderr !== '') {
37
+ throw new DbcliIntegrationError(`capability discovery failed (exit ${result.code})`)
38
+ }
39
+ const catalog = parseCapabilityCatalog(json(result.stdout, 'capability discovery'))
40
+ if (catalog.schemaVersion !== CAPABILITY_CONTRACT_SCHEMA_VERSION) {
41
+ throw new DbcliIntegrationError(`unsupported capability schema ${catalog.schemaVersion}`)
42
+ }
43
+ return catalog
44
+ }
45
+
46
+ /**
47
+ * Run requirement preflight through the agent envelope. Exit 1 is a valid
48
+ * completed negative result; callers inspect `envelope.ok` and `error`.
49
+ */
50
+ export async function preflight(
51
+ run: RunDbcli,
52
+ required: readonly string[],
53
+ correlationId: string
54
+ ): Promise<OperationEnvelope> {
55
+ const result = await run([
56
+ '--agent-output',
57
+ '--correlation-id',
58
+ correlationId,
59
+ 'capabilities',
60
+ 'check',
61
+ '--require',
62
+ required.join(','),
63
+ ])
64
+ if (![0, 1, 2].includes(result.code) || result.stderr !== '') {
65
+ throw new DbcliIntegrationError(
66
+ `capability preflight failed outside its contract (exit ${result.code})`
67
+ )
68
+ }
69
+ const parsed = parseOperationEnvelope(json(result.stdout, 'capability preflight'))
70
+ if (!parsed.ok) throw new DbcliIntegrationError(`invalid Operation Envelope: ${parsed.reason}`)
71
+ if (parsed.value.schemaVersion !== OPERATION_ENVELOPE_SCHEMA_VERSION) {
72
+ throw new DbcliIntegrationError(
73
+ `unsupported Operation Envelope schema ${parsed.value.schemaVersion}`
74
+ )
75
+ }
76
+ return parsed.value
77
+ }
@@ -0,0 +1,18 @@
1
+ ---
2
+ name: example-read-only-review
3
+ description: Minimal Task Pack requirement declaration for an external Skill.
4
+ engines: [postgresql, mysql]
5
+ safety:
6
+ mode: plan-only
7
+ requires: [schema.read, query.read]
8
+ steps:
9
+ - type: command
10
+ command: dbcli blacklist list --format json
11
+ risk: readonly
12
+ - type: command
13
+ command: dbcli schema {{table}} --format json
14
+ risk: readonly
15
+ ---
16
+
17
+ This pack only plans commands. `safety.requires` contains capability IDs, not
18
+ command names; dbcli validates them before emitting a plan.
@@ -43,6 +43,7 @@ never the right move.
43
43
  [snapshot](#snapshot) ·
44
44
  [assert](#assert) ·
45
45
  [proxy](#proxy) ·
46
+ [capabilities](#capabilities) ·
46
47
  [status](#status) ·
47
48
  [inspect](#inspect) ·
48
49
  [report](#report) ·
@@ -85,6 +86,8 @@ command-level option is only valid after the command that declares it.
85
86
  | `--use <connection>` | Select a named connection for this invocation; place it before the command path unless that command explicitly lists a command-level `--use`. |
86
87
  | `--timeout <ms>` | Connection timeout in milliseconds (integer, 100–600000), overriding the connection config's `timeout` field for this invocation. Applies to every engine adapter. Without either the flag or the config field, adapters fall back to their built-in 5000ms default. |
87
88
  | `--statement-timeout <ms>` | How long a single statement may run, in milliseconds (integer, 0–3600000; `0` removes the limit), overriding the connection config's `statementTimeout` field. Independent of the connection timeout — raising it does not slow down detection of an unreachable host. Falls back to `--timeout` when unset, and to the server's own setting when neither is given. |
89
+ | `--agent-output` | Request the PLAT-005 v1 Operation Envelope. It must precede the subcommand and currently supports `capabilities` and `capabilities check`; it conflicts with explicit `--format` and command-local `--for-agent`. |
90
+ | `--correlation-id <id>` | Associate one invocation with a Story, incident, change request, migration, or backfill. Place it before the subcommand. IDs are 1–160 ASCII letters, numbers, dots, underscores, colons, or hyphens; never use sensitive or free-form data. |
88
91
 
89
92
  `--timeout` is applied only when the adapter is constructed for this invocation — it is
90
93
  never written back to `config.json`. Set the connection's `timeout` field instead for a
@@ -1298,6 +1301,10 @@ The normalized JSON escape hatch is Zod-validated and uses an array of tables
1298
1301
  with explicit exact `identity` objects; optional parsed identifiers must include
1299
1302
  their `quoted` flags, and every normalized JSON `unparsed.reason` must start with
1300
1303
  `blocked:`.
1304
+ A Drizzle snapshot or normalized JSON artifact that is not valid JSON, and a
1305
+ normalized JSON artifact that violates that contract, fail closed: the error
1306
+ names the offending file and lists the fields at fault, bounded with a count of
1307
+ the remainder, rather than degrading to `unparsed`.
1301
1308
 
1302
1309
  ```json
1303
1310
  {
@@ -1669,6 +1676,150 @@ Every actionable block carries machine-readable next steps so an agent can move
1669
1676
  **Engines:** MySQL / MariaDB / PostgreSQL
1670
1677
  **Permission:** n/a (acts as a TCP relay; does not use dbcli's SQL permission model)
1671
1678
 
1679
+ ### capabilities
1680
+
1681
+ Discovery. Lists the static dbcli capability catalog — what this tool can do,
1682
+ described in a versioned shape an external Skill can parse before it starts
1683
+ working. It never opens a database connection and never writes anything.
1684
+
1685
+ A **capability** names one atomic dbcli ability (`schema.read`, `data.delete`).
1686
+ It is not a job and not a method: `dba.tune-production` or `crud.scaffold`
1687
+ belong to the Role or Method Skill that composes dbcli, never to dbcli itself.
1688
+
1689
+ ```bash
1690
+ dbcli capabilities # human-readable (default)
1691
+ dbcli capabilities --format json # for agents and Skills
1692
+ dbcli capabilities --format markdown # table, for docs
1693
+ ```
1694
+
1695
+ Each entry carries `id`, `description`, `command`, `risk`, `sideEffect`,
1696
+ `engines`, `limitedEngines`, `engineIndependent`, `minimumPermission`,
1697
+ `requiresConnection`, `mutatesConfiguration`, `supportsJson` and
1698
+ `supportsEvidence`. `limitedEngines` is the subset of `engines` the support
1699
+ matrix marks *limited* rather than fully supported. Output is sorted by `id`, so two runs of
1700
+ the same build are byte-identical.
1701
+
1702
+ `schemaVersion` is the **capability contract** version, not the npm package
1703
+ version. Pin `schemaVersion`, never `7.x`.
1704
+
1705
+ **Scope:** the catalog covers every public command, including `explain`, `plan`,
1706
+ `impact assess`, `assert`, `snapshot`, `verify`, `verification`, `evidence`,
1707
+ `contract`, `semantic`, `design`, `proxy`, `recovery`, `backfill artifact`,
1708
+ `password`, and `capabilities` itself. An id it does not know is still
1709
+ `unknown`, which fails closed.
1710
+
1711
+ Every engine claim was read out of the implementation. Where the code refuses a
1712
+ non-SQL connection outright — `explain`, `plan`, `assert`, `snapshot`, `verify`,
1713
+ `proxy` — the entry is `unsupported` for MongoDB, Redis and Elasticsearch and
1714
+ the note names the gate. Where only one *mode* needs SQL — `--against-cache` for
1715
+ `impact assess`, `design diff` and `design propose`, and `draft validate` for
1716
+ `semantic` — the entry is `limited` there, because the rest of the command runs
1717
+ fine. Where a command never opens a connection at all, it is
1718
+ engine-independent. Nothing is marked supported on an engine the code does not
1719
+ settle.
1720
+
1721
+ **Permission:** query-only+ (no connection is made)
1722
+
1723
+ #### capabilities check
1724
+
1725
+ Asks whether the capabilities you need are available *here* — against this
1726
+ machine's local configuration only. It reads engine and permission from the
1727
+ config; it does not connect to the database to find out.
1728
+
1729
+ ```bash
1730
+ dbcli capabilities check --require schema.read,query.read
1731
+ dbcli capabilities check --require schema.read,data.delete --format json
1732
+ dbcli --use staging capabilities check --require schema.read --format json
1733
+ dbcli --agent-output capabilities check --require schema.read
1734
+ ```
1735
+
1736
+ For a copyable Bun/TypeScript consumer that strictly parses this contract, pins schema
1737
+ versions, handles exit codes and Operation Envelopes, and includes Task Pack and
1738
+ correlation/evidence examples, see `assets/integration-kit/README.md`.
1739
+
1740
+ #### Agent output v1 (PLAT-005)
1741
+
1742
+ `dbcli --agent-output capabilities` and `dbcli --agent-output capabilities check --require <ids>`
1743
+ are the supported operations. Either emits one compact UTF-8 JSON document followed by one newline
1744
+ on stdout, with stderr empty. The envelope always has, in stable order, `schemaVersion`, `ok`,
1745
+ `operation`, `status`, `context`, `data`, `warnings`, `evidence`, `recovery`, and `error`; consumers
1746
+ must use the names, not the order. `schemaVersion` is `1`, `operation` is `capabilities.list` or
1747
+ `capabilities.check`, and `status` is `succeeded` or `failed`. The full document, including newline,
1748
+ is capped at 64 KiB.
1749
+
1750
+ The flag must be before the subcommand and conflicts with explicitly supplied `--format` or
1751
+ `--for-agent`. Invalid placement/input and unsupported operations exit `2`; success exits `0`;
1752
+ unmet requirements and internal failures exit `1`. This output is ephemeral: it is not evidence and
1753
+ adds no timestamp. `--correlation-id <id>` is an optional root option. For supported non-static
1754
+ agent output, it appears as `context.correlationId` and in the existing audit entry as
1755
+ `metadata.correlation_id`; command summaries redact it. Static `capabilities` output remains
1756
+ `context: null`, and the option creates or changes no evidence receipt.
1757
+
1758
+ Code/message vocabulary is locale-independent English. Stable error codes mean:
1759
+
1760
+ | Code | Meaning |
1761
+ |---|---|
1762
+ | `INVALID_AGENT_OUTPUT_OPTIONS` | The agent-output option is invalid, misplaced, or conflicts with explicit output options. |
1763
+ | `UNSUPPORTED_AGENT_OUTPUT_OPERATION` | The requested operation is outside PLAT-005 support. |
1764
+ | `INVALID_CAPABILITY_REQUIREMENTS` | `--require` is missing, empty, or malformed. |
1765
+ | `CAPABILITY_REQUIREMENTS_UNMET` | A completed check found one or more unavailable or unknown requirements. |
1766
+ | `AGENT_OUTPUT_LIMIT_EXCEEDED` | The otherwise valid serialized envelope exceeded 64 KiB. |
1767
+ | `AGENT_OUTPUT_INTERNAL_ERROR` | An unexpected failure was replaced with the safe agent-output failure. |
1768
+ | `INVALID_CORRELATION_ID` | The root correlation ID is absent or does not match the allowed identifier grammar. |
1769
+
1770
+ Stable warning codes mean:
1771
+
1772
+ | Code | Meaning |
1773
+ |---|---|
1774
+ | `DUPLICATE_CAPABILITY_REQUIREMENT` | A repeated required id was de-duplicated in first-seen order. |
1775
+ | `CAPABILITY_CONTEXT_UNAVAILABLE` | No local configuration was available to evaluate. |
1776
+ | `CAPABILITY_CONTEXT_UNRESOLVABLE` | Configuration exists but cannot yield an engine and permission. |
1777
+ | `AGENT_MODE_RESTRICTION_ACTIVE` | `DBCLI_AGENT_MODE=1` refuses configuration, permission, and credential changes. |
1778
+
1779
+ | Flag | Purpose |
1780
+ |---|---|
1781
+ | `--require <ids>` | Comma-separated capability ids. Required; an empty list is refused rather than reported as ok. |
1782
+ | `--format <type>` | `text` (default) or `json`. |
1783
+
1784
+ Each result is `available`, `unavailable` or `unknown`:
1785
+
1786
+ | Status | Reason | Means |
1787
+ |---|---|---|
1788
+ | `available` | `null` | The configured engine and permission would not refuse it. |
1789
+ | `unavailable` | `engine` | The configured engine does not support it. |
1790
+ | `unavailable` | `permission` | The configured permission level is below its minimum. |
1791
+ | `unavailable` | `agent-mode` | `DBCLI_AGENT_MODE=1` is set and the capability changes configuration, permission or credentials — refused unconditionally. |
1792
+ | `unavailable` | `context-unavailable` | No local config here, so there is nothing to evaluate against. |
1793
+ | `unavailable` | `context-unresolvable` | A config exists but could not be resolved into an engine and a permission — an `{"$env": "..."}` reference pointing at an unset variable, for instance. Distinct from "no config", because saying there is none would be false. |
1794
+ | `unknown` | `unknown-capability` | No such capability id. Never guessed at — a typo is refused, not resolved to a neighbour. |
1795
+
1796
+ A duplicate id in `--require` is de-duplicated in first-seen order and reported
1797
+ in `warnings`; `required` and `results` each hold it once.
1798
+
1799
+ `required` and `results` hold the ids you asked for in first-seen input order,
1800
+ so `results[i]` answers `required[i]` and you never have to re-index by id to
1801
+ read your own answer. Reordering the arguments therefore reorders the output and
1802
+ the two byte streams differ; what reordering never changes is a capability's
1803
+ status, its reason, or the overall `ok`. Identical input is byte-identical
1804
+ output.
1805
+
1806
+ **Exit codes:** `0` every requirement available · `1` any unavailable or
1807
+ unknown · `2` invalid input or an unreadable format.
1808
+
1809
+ Blockers are reported least-fixable first — engine, then agent mode, then
1810
+ permission — so `reason` names the one actually in the way.
1811
+
1812
+ **`available` is not approval.** It says the gate would not refuse on engine,
1813
+ agent-mode and permission grounds. Blacklist, write gate, confirmation and audit all still run
1814
+ at execution time, and no human has agreed to anything. `admin` in a config file
1815
+ is a permission level, not a DBA sign-off.
1816
+
1817
+ `schema.read` is available under `DBCLI_AGENT_MODE=1`, and `dbcli schema` runs
1818
+ there: storing the schema cache is not a configuration change. Agent mode still
1819
+ refuses every change to connection identity, permission and credentials.
1820
+
1821
+ **Permission:** query-only+ (no connection is made)
1822
+
1672
1823
  ### status
1673
1824
 
1674
1825
  Show current configuration status (safe for AI agents, no credentials exposed).
@@ -2948,14 +3099,18 @@ The strict v1 artifact contains `version` and `contracts`. Each contract has a u
2948
3099
  canonical `name`, `status` (`draft`, `approved`, or `deprecated`), bounded plain-text
2949
3100
  `description` and `owner`, one or more canonical semantic `subjects`, optional aliases,
2950
3101
  and an `evidencePolicy` of `none`, `receipt-required`, or `verification-required`.
2951
- Subjects must remain in the existing visible semantic registry; protected identifiers,
2952
- unknown keys, duplicate names or subjects, SQL-like text, credentials, and stale
2953
- references fail closed without exposing protected names.
3102
+ Each subject must use one of the canonical `model:` / `field:` / `relationship:` /
3103
+ `metric:` forms and must remain in the existing visible semantic registry; protected
3104
+ identifiers, unknown keys, duplicate names or subjects, SQL-like text, credentials, and
3105
+ stale references fail closed without exposing protected names. Diagnostics name the
3106
+ offending property or subject position, never a rejected key, value, or local path taken
3107
+ from the artifact or the local configuration.
2954
3108
 
2955
3109
  `contract validate` requires an explicit valid artifact. `contract context` and
2956
3110
  `contract search` return only valid approved contracts; draft and deprecated contracts
2957
3111
  remain local review artifacts. `contract drift` reports `valid`, `stale`, `invalid`, or
2958
- `unavailable` evidence offline and exits non-zero except for `valid`. A missing default
3112
+ `unavailable` evidence offline and exits non-zero except for `valid`; a subject whose form
3113
+ is unsupported is `invalid`, while a well-formed subject that no longer exists is `stale`. A missing default
2959
3114
  file is allowed by `skill context` and leaves ordinary semantic context unchanged; a
2960
3115
  present invalid file fails closed. No contract command writes a file, opens a database
2961
3116
  connection, widens a `QueryDraft`, or changes permission/blacklist behavior.
@@ -2982,7 +3137,7 @@ dbcli skill --install codex # install to ~/.codex/skills/dbcli/
2982
3137
  **Options:**
2983
3138
  - `--install <platform>` — `claude` | `gemini` | `antigravity` | `copilot` | `cursor` | `codex` | `windsurf`. Writes `SKILL.md` plus `reference.md` next to it so the agent gets progressive disclosure.
2984
3139
  - `--output <path>` — write `SKILL.md` to a file instead of stdout. Does not install `reference.md`.
2985
- - `--lang <en|zh-TW>` — source language for the emitted SKILL content (default `en`). It selects `assets/SKILL.md` vs `assets/SKILL.zh-TW.md`; the install/output filename stays `SKILL.md` regardless.
3140
+ - Skill content is always the canonical English `assets/SKILL.md`; the install/output filename is `SKILL.md`.
2986
3141
 
2987
3142
  **Notes:**
2988
3143
  - Both files come straight from `assets/SKILL.md` + `assets/reference.md` inside the dbcli package — no runtime rendering. Keep these in sync when shipping a release.
@@ -3003,12 +3158,23 @@ Emit an AI-friendly snapshot of the connected database's schema and saved-query
3003
3158
  dbcli skill context # XML (default)
3004
3159
  dbcli skill context --format json
3005
3160
  dbcli skill context --format markdown
3161
+ dbcli skill context --context-version 2 --format json
3006
3162
  ```
3007
3163
 
3008
3164
  **Options:**
3009
3165
  - `--format <xml|json|markdown>` — output format (default: `xml`)
3010
-
3011
- **Permission:** query-only+ — read-only; blacklisted objects are never emitted.
3166
+ - `--context-version <version>` — explicit agent contract; version `2` supports
3167
+ PostgreSQL, MySQL, MariaDB, Elasticsearch, and Redis. Omit it for byte-compatible v1.
3168
+
3169
+ Version 2 is offline and bounded: it emits only visible cached SQL tables/fields,
3170
+ flattened Elasticsearch fields, or declared Redis key families, plus safe capability,
3171
+ snippet, semantic, contract, and data-access metadata. It never connects, scans Redis,
3172
+ reads documents or project source, or emits values, credentials, query bodies/defaults,
3173
+ source paths, counts, or raw mappings. Missing evidence is reported in `gaps`; invalid
3174
+ evidence fails with a stable `INVALID_*` code. MongoDB rejects explicit v2.
3175
+
3176
+ **Permission:** query-only+ — read-only; blacklisted objects are never emitted outside
3177
+ the blacklist policy.
3012
3178
 
3013
3179
  ### skill tasks (Agent Task Packs)
3014
3180
 
@@ -21,6 +21,8 @@ Each task is a `.md` file with a YAML frontmatter block:
21
21
  - `description`, `tags`, `engines`
22
22
  - `params` (map of name → `{ type, required?, default?, description?, enum? }`)
23
23
  - `safety.mode` — only `plan-only` is supported in this version
24
+ - `safety.requires` — optional capability IDs; planning checks them against the
25
+ local engine, permission, and agent-mode context before emitting a plan
24
26
  - `steps[]` — each step is `{ type: command, command, reason?, risk? }`
25
27
 
26
28
  Use block-style YAML (no inline `{ ... }` maps) — the built-in YAML parser does
@@ -28,3 +30,7 @@ not support inline maps.
28
30
 
29
31
  The markdown body below the frontmatter is `Agent Notes` and is shown in
30
32
  `dbcli skill tasks show <name>`.
33
+
34
+ Use `postgresql` for PostgreSQL. The legacy `postgres` engine spelling is read
35
+ as `postgresql`; legacy requirement names `blacklist-list` and `schema-check`
36
+ are rejected with their replacements, `blacklist.manage` and `schema.read`.
@@ -2,7 +2,7 @@
2
2
  name: analyze-table-perf
3
3
  description: Inspect a single table's structure, indexes and read-only performance signals.
4
4
  tags: [diagnostics, performance, readonly]
5
- engines: [postgres, mysql]
5
+ engines: [postgresql, mysql]
6
6
  params:
7
7
  table:
8
8
  type: string
@@ -11,8 +11,8 @@ params:
11
11
  safety:
12
12
  mode: plan-only
13
13
  requires:
14
- - blacklist-list
15
- - schema-check
14
+ - blacklist.manage
15
+ - schema.read
16
16
  steps:
17
17
  - type: command
18
18
  command: blacklist list
@@ -2,7 +2,7 @@
2
2
  name: audit-permissions
3
3
  description: Audit the active permission tier and blacklist coverage before granting an agent write access.
4
4
  tags: [security, permissions, readonly]
5
- engines: [postgres, mysql]
5
+ engines: [postgresql, mysql]
6
6
  params:
7
7
  table:
8
8
  type: string
@@ -11,7 +11,7 @@ params:
11
11
  safety:
12
12
  mode: plan-only
13
13
  requires:
14
- - blacklist-list
14
+ - blacklist.manage
15
15
  steps:
16
16
  - type: command
17
17
  command: status
@@ -2,7 +2,7 @@
2
2
  name: connection-health
3
3
  description: Quick read-only health check of the active connection (reachability, config, capacity signals).
4
4
  tags: [diagnostics, health, readonly]
5
- engines: [postgres, mysql]
5
+ engines: [postgresql, mysql]
6
6
  params:
7
7
  section:
8
8
  type: string
@@ -13,7 +13,7 @@ params:
13
13
  safety:
14
14
  mode: plan-only
15
15
  requires:
16
- - blacklist-list
16
+ - blacklist.manage
17
17
  steps:
18
18
  - type: command
19
19
  command: status
@@ -2,12 +2,12 @@
2
2
  name: design-review
3
3
  description: Validate and render a version-controlled SQL database design before comparing it with the local schema cache and preparing review-only proposals.
4
4
  tags: [design, schema, readonly]
5
- engines: [postgres, mysql]
5
+ engines: [postgresql, mysql]
6
6
  safety:
7
7
  mode: plan-only
8
8
  requires:
9
- - blacklist-list
10
- - schema-check
9
+ - blacklist.manage
10
+ - schema.read
11
11
  steps:
12
12
  - type: command
13
13
  command: blacklist list
@@ -2,7 +2,7 @@
2
2
  name: diagnose-slow-query
3
3
  description: Diagnose slow query causes using safe read-only dbcli steps.
4
4
  tags: [diagnostics, performance, readonly]
5
- engines: [postgres, mysql]
5
+ engines: [postgresql, mysql]
6
6
  params:
7
7
  query:
8
8
  type: string
@@ -11,8 +11,8 @@ params:
11
11
  safety:
12
12
  mode: plan-only
13
13
  requires:
14
- - blacklist-list
15
- - schema-check
14
+ - blacklist.manage
15
+ - schema.read
16
16
  steps:
17
17
  - type: command
18
18
  command: blacklist list
@@ -2,7 +2,7 @@
2
2
  name: migration-review
3
3
  description: Capture pre-change schema evidence and preview a migration's DDL before it is applied.
4
4
  tags: [migration, schema, readonly]
5
- engines: [postgres, mysql]
5
+ engines: [postgresql, mysql]
6
6
  params:
7
7
  table:
8
8
  type: string
@@ -15,8 +15,8 @@ params:
15
15
  safety:
16
16
  mode: plan-only
17
17
  requires:
18
- - blacklist-list
19
- - schema-check
18
+ - blacklist.manage
19
+ - schema.read
20
20
  steps:
21
21
  - type: command
22
22
  command: blacklist list
@@ -19,8 +19,8 @@ params:
19
19
  safety:
20
20
  mode: plan-only
21
21
  requires:
22
- - blacklist-list
23
- - schema-check
22
+ - blacklist.manage
23
+ - schema.read
24
24
  steps:
25
25
  - type: command
26
26
  command: blacklist list
@@ -15,8 +15,8 @@ params:
15
15
  safety:
16
16
  mode: plan-only
17
17
  requires:
18
- - blacklist-list
19
- - schema-check
18
+ - blacklist.manage
19
+ - schema.read
20
20
  steps:
21
21
  - type: command
22
22
  command: blacklist list
@@ -2,7 +2,7 @@
2
2
  name: orm-drift-review
3
3
  description: Compare an ORM schema definition (Prisma / DDL / normalized JSON) against the live schema cache and review drift before any corrective migration.
4
4
  tags: [diagnostics, schema, orm, readonly]
5
- engines: [postgres, mysql]
5
+ engines: [postgresql, mysql]
6
6
  params:
7
7
  orm_path:
8
8
  type: string
@@ -11,8 +11,8 @@ params:
11
11
  safety:
12
12
  mode: plan-only
13
13
  requires:
14
- - blacklist-list
15
- - schema-check
14
+ - blacklist.manage
15
+ - schema.read
16
16
  steps:
17
17
  - type: command
18
18
  command: blacklist list
@@ -2,7 +2,7 @@
2
2
  name: pr-database-review
3
3
  description: Review a PR's changed persistence paths, queries and migrations for database risk before merge.
4
4
  tags: [review, safety, readonly]
5
- engines: [postgres, mysql]
5
+ engines: [postgresql, mysql]
6
6
  params:
7
7
  query:
8
8
  type: string
@@ -11,8 +11,8 @@ params:
11
11
  safety:
12
12
  mode: plan-only
13
13
  requires:
14
- - blacklist-list
15
- - schema-check
14
+ - blacklist.manage
15
+ - schema.read
16
16
  steps:
17
17
  - type: command
18
18
  command: blacklist list
@@ -2,7 +2,7 @@
2
2
  name: safe-backfill-verify
3
3
  description: Plan a safe backfill/UPDATE and a read-back assertion that verifies the write achieved its goal.
4
4
  tags: [data, write, safety, verification]
5
- engines: [postgres, mysql]
5
+ engines: [postgresql, mysql]
6
6
  params:
7
7
  table:
8
8
  type: string
@@ -23,8 +23,8 @@ params:
23
23
  safety:
24
24
  mode: plan-only
25
25
  requires:
26
- - blacklist-list
27
- - schema-check
26
+ - blacklist.manage
27
+ - schema.read
28
28
  steps:
29
29
  - type: command
30
30
  command: blacklist list
@@ -2,7 +2,7 @@
2
2
  name: safe-backfill
3
3
  description: Plan a safe data backfill/UPDATE with blacklist, schema and risk checks before any write.
4
4
  tags: [data, write, safety]
5
- engines: [postgres, mysql]
5
+ engines: [postgresql, mysql]
6
6
  params:
7
7
  table:
8
8
  type: string
@@ -15,8 +15,8 @@ params:
15
15
  safety:
16
16
  mode: plan-only
17
17
  requires:
18
- - blacklist-list
19
- - schema-check
18
+ - blacklist.manage
19
+ - schema.read
20
20
  steps:
21
21
  - type: command
22
22
  command: blacklist list
@@ -2,7 +2,7 @@
2
2
  name: schema-drift-review
3
3
  description: Detect drift between the cached/committed schema and the live database for one table.
4
4
  tags: [diagnostics, schema, readonly]
5
- engines: [postgres, mysql]
5
+ engines: [postgresql, mysql]
6
6
  params:
7
7
  table:
8
8
  type: string
@@ -11,8 +11,8 @@ params:
11
11
  safety:
12
12
  mode: plan-only
13
13
  requires:
14
- - blacklist-list
15
- - schema-check
14
+ - blacklist.manage
15
+ - schema.read
16
16
  steps:
17
17
  - type: command
18
18
  command: blacklist list