From d3767152e9bbb43d3bf6cf7150fd23730a611dc3 Mon Sep 17 00:00:00 2001 From: Andrey Avtomonov Date: Sun, 17 May 2026 10:21:56 +0200 Subject: [PATCH] fix(cli): rename sql connection flag --- README.md | 2 +- .../content/docs/cli-reference/index.mdx | 2 +- .../content/docs/cli-reference/ktx-sql.mdx | 12 +++++------ .../cli/src/commands/sql-commands.test.ts | 21 ++++++++++++++++--- packages/cli/src/commands/sql-commands.ts | 6 +++--- 5 files changed, 29 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 8a0d6a7b..e058b828 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ Agent integration ready: yes (codex:project) | `ktx sl search "revenue"` | Search semantic-layer sources | | `ktx sl validate --connection-id ` | Validate a semantic source | | `ktx sl query --measure --format sql` | Compile semantic-layer SQL | -| `ktx sql --connection-id "select 1"` | Execute read-only SQL | +| `ktx sql --connection "select 1"` | Execute read-only SQL | | `ktx wiki search "revenue definition"` | Search local wiki context | | `ktx mcp start` | Start the local MCP server for agent clients | diff --git a/docs-site/content/docs/cli-reference/index.mdx b/docs-site/content/docs/cli-reference/index.mdx index d0658141..2b681cba 100644 --- a/docs-site/content/docs/cli-reference/index.mdx +++ b/docs-site/content/docs/cli-reference/index.mdx @@ -81,7 +81,7 @@ ktx sl search "revenue" ktx wiki search "revenue recognition" # Execute read-only SQL -ktx sql --connection-id warehouse "select count(*) from public.orders" +ktx sql --connection warehouse "select count(*) from public.orders" # Start the local MCP server for agent clients ktx mcp start diff --git a/docs-site/content/docs/cli-reference/ktx-sql.mdx b/docs-site/content/docs/cli-reference/ktx-sql.mdx index c8e9a376..ae4c9990 100644 --- a/docs-site/content/docs/cli-reference/ktx-sql.mdx +++ b/docs-site/content/docs/cli-reference/ktx-sql.mdx @@ -12,7 +12,7 @@ validates the statement before execution and only accepts a single `SELECT` or Use `ktx sql` with a required connection id and positional SQL text. ```bash -ktx sql --connection-id [options] +ktx sql --connection [options] ``` ## Options @@ -22,7 +22,7 @@ JSON. | Flag | Description | Default | |------|-------------|---------| -| `--connection-id ` | KTX database connection id. Required. | - | +| `-c`, `--connection ` | KTX database connection id. Required. | - | | `--max-rows ` | Maximum rows to return. Must be between `1` and `10000`. | `1000` | | `--output ` | Output mode: `pretty`, `plain` (TSV), or `json`. | `pretty` | | `--json` | Shortcut for `--output=json` (overrides `--output`). | `false` | @@ -33,23 +33,23 @@ Quote SQL in shell scripts and when the query contains spaces or punctuation. ```bash # Count rows in a table -ktx sql --connection-id warehouse "select count(*) from public.orders" +ktx sql --connection warehouse "select count(*) from public.orders" # Return a small result set ktx sql \ - --connection-id warehouse \ + --connection warehouse \ --max-rows 25 \ "select id, status from public.orders order by created_at desc" # Print JSON for agents or scripts ktx sql \ - --connection-id warehouse \ + --connection warehouse \ --json \ "select status, count(*) from public.orders group by status" # Print TSV rows ktx sql \ - --connection-id warehouse \ + -c warehouse \ --output plain \ "select id, status from public.orders" ``` diff --git a/packages/cli/src/commands/sql-commands.test.ts b/packages/cli/src/commands/sql-commands.test.ts index 69728c6f..f690b305 100644 --- a/packages/cli/src/commands/sql-commands.test.ts +++ b/packages/cli/src/commands/sql-commands.test.ts @@ -33,7 +33,7 @@ describe('registerSqlCommands', () => { await expect( program.parseAsync( - ['--project-dir', '/tmp/ktx-sql', 'sql', '--connection-id', 'warehouse', 'select', '1'], + ['--project-dir', '/tmp/ktx-sql', 'sql', '--connection', 'warehouse', 'select', '1'], { from: 'user' }, ), ).resolves.toBe(program); @@ -53,13 +53,28 @@ describe('registerSqlCommands', () => { ); }); + it('supports the short connection flag', async () => { + const program = new Command().exitOverride().option('--project-dir '); + const sql = vi.fn(async () => 0); + const context = makeContext({ deps: { sql } }); + registerSqlCommands(program, context); + + await expect( + program.parseAsync(['--project-dir', '/tmp/ktx-sql', 'sql', '-c', 'warehouse', 'select 1'], { + from: 'user', + }), + ).resolves.toBe(program); + + expect(sql).toHaveBeenCalledWith(expect.objectContaining({ connectionId: 'warehouse', sql: 'select 1' }), context.io); + }); + it('rejects missing SQL before invoking the runner', async () => { const program = new Command().exitOverride().option('--project-dir '); const sql = vi.fn(async () => 0); registerSqlCommands(program, makeContext({ deps: { sql } })); await expect( - program.parseAsync(['--project-dir', '/tmp/ktx-sql', 'sql', '--connection-id', 'warehouse'], { + program.parseAsync(['--project-dir', '/tmp/ktx-sql', 'sql', '--connection', 'warehouse'], { from: 'user', }), ).rejects.toThrow('missing required argument'); @@ -74,7 +89,7 @@ describe('registerSqlCommands', () => { await expect( program.parseAsync( - ['--project-dir', '/tmp/ktx-sql', 'sql', '--connection-id', 'warehouse', '--max-rows', '10001', 'select 1'], + ['--project-dir', '/tmp/ktx-sql', 'sql', '--connection', 'warehouse', '--max-rows', '10001', 'select 1'], { from: 'user' }, ), ).rejects.toThrow('must be an integer between 1 and 10000'); diff --git a/packages/cli/src/commands/sql-commands.ts b/packages/cli/src/commands/sql-commands.ts index 9f8e2759..0c73df6a 100644 --- a/packages/cli/src/commands/sql-commands.ts +++ b/packages/cli/src/commands/sql-commands.ts @@ -26,7 +26,7 @@ export function registerSqlCommands(program: Command, context: KtxCliCommandCont .command('sql') .description('Execute parser-validated read-only SQL against a configured connection') .argument('', 'SQL query to execute') - .requiredOption('--connection-id ', 'KTX connection id') + .requiredOption('-c, --connection ', 'KTX connection id') .option('--max-rows ', 'Maximum rows to return', parseSqlMaxRowsOption, DEFAULT_MAX_ROWS) .addOption( new Option('--output ', 'Output mode: pretty (default), plain (TSV), or json').choices([ @@ -40,7 +40,7 @@ export function registerSqlCommands(program: Command, context: KtxCliCommandCont async ( sqlParts: string[], options: { - connectionId: string; + connection: string; maxRows: number; output?: 'pretty' | 'plain' | 'json'; json?: boolean; @@ -50,7 +50,7 @@ export function registerSqlCommands(program: Command, context: KtxCliCommandCont await runSqlArgs(context, { command: 'execute', projectDir: resolveCommandProjectDir(command), - connectionId: options.connectionId, + connectionId: options.connection, sql: sqlParts.join(' '), maxRows: options.maxRows, output: options.output,