From d567ffec48ae00e7bcfb73c54eee02011b9309bb Mon Sep 17 00:00:00 2001 From: Luca Martial Date: Tue, 12 May 2026 17:14:35 -0700 Subject: [PATCH 1/2] feat(cli): offer connection URL paste first in database setup Users most commonly paste a connection URL rather than entering fields individually, so surface that option first in the connection method prompt. Co-Authored-By: Claude Opus 4.6 (1M context) --- packages/cli/src/setup-databases.test.ts | 41 ++++++++++++++++++++++-- packages/cli/src/setup-databases.ts | 2 +- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/packages/cli/src/setup-databases.test.ts b/packages/cli/src/setup-databases.test.ts index 4c2abfcd..36b8df07 100644 --- a/packages/cli/src/setup-databases.test.ts +++ b/packages/cli/src/setup-databases.test.ts @@ -142,8 +142,8 @@ describe('setup databases step', () => { expect(prompts.select).toHaveBeenCalledWith({ message: 'How do you want to connect to PostgreSQL?', options: [ - { value: 'fields', label: 'Enter connection details (host, port, database, user)' }, { value: 'url', label: 'Paste a connection URL' }, + { value: 'fields', label: 'Enter connection details (host, port, database, user)' }, { value: 'back', label: 'Back' }, ], }); @@ -154,6 +154,43 @@ describe('setup databases step', () => { ); }); + it('offers connection URL paste first for URL-capable primary sources', async () => { + const cases: Array<{ driver: KtxSetupDatabaseDriver; label: string }> = [ + { driver: 'postgres', label: 'PostgreSQL' }, + { driver: 'mysql', label: 'MySQL' }, + { driver: 'clickhouse', label: 'ClickHouse' }, + { driver: 'sqlserver', label: 'SQL Server' }, + ]; + + for (const testCase of cases) { + const prompts = makePromptAdapter({ + selectValues: ['back'], + }); + + const result = await runKtxSetupDatabasesStep( + { + projectDir: tempDir, + inputMode: 'auto', + databaseDrivers: [testCase.driver], + skipDatabases: false, + databaseSchemas: [], + }, + makeIo().io, + { prompts }, + ); + + expect(result.status).toBe('back'); + expect(prompts.select).toHaveBeenCalledWith({ + message: `How do you want to connect to ${testCase.label}?`, + options: [ + { value: 'url', label: 'Paste a connection URL' }, + { value: 'fields', label: 'Enter connection details (host, port, database, user)' }, + { value: 'back', label: 'Back' }, + ], + }); + } + }); + it('lets Back leave database setup when the driver came from flags', async () => { const prompts = makePromptAdapter({ selectValues: ['back'] }); @@ -488,8 +525,8 @@ describe('setup databases step', () => { expect(prompts.select).toHaveBeenNthCalledWith(1, { message: 'How do you want to connect to PostgreSQL?', options: [ - { value: 'fields', label: 'Enter connection details (host, port, database, user)' }, { value: 'url', label: 'Paste a connection URL' }, + { value: 'fields', label: 'Enter connection details (host, port, database, user)' }, { value: 'back', label: 'Back' }, ], }); diff --git a/packages/cli/src/setup-databases.ts b/packages/cli/src/setup-databases.ts index bbb39836..e431baa0 100644 --- a/packages/cli/src/setup-databases.ts +++ b/packages/cli/src/setup-databases.ts @@ -615,8 +615,8 @@ async function buildUrlConnectionConfig(input: { const choice = await input.prompts.select({ message: `How do you want to connect to ${label}?`, options: [ - { value: 'fields', label: 'Enter connection details (host, port, database, user)' }, { value: 'url', label: 'Paste a connection URL' }, + { value: 'fields', label: 'Enter connection details (host, port, database, user)' }, { value: 'back', label: 'Back' }, ], }); From a2096dd847540f6be4a2eec1135912dba63c4060 Mon Sep 17 00:00:00 2001 From: Luca Martial Date: Tue, 12 May 2026 17:14:56 -0700 Subject: [PATCH 2/2] feat(cli): hide table counts from primary source connection test output MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Table counts during connection testing are noisy and not actionable for users — the scan step already reports detailed schema information. Co-Authored-By: Claude Opus 4.6 (1M context) --- packages/cli/src/setup-databases.test.ts | 3 ++- packages/cli/src/setup-databases.ts | 4 +--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/cli/src/setup-databases.test.ts b/packages/cli/src/setup-databases.test.ts index 36b8df07..697ee10a 100644 --- a/packages/cli/src/setup-databases.test.ts +++ b/packages/cli/src/setup-databases.test.ts @@ -955,10 +955,11 @@ describe('setup databases step', () => { [ '◇ Testing postgres-warehouse', '│ ✓ Connection test passed', - '│ Driver: PostgreSQL · Tables: 2', + '│ Driver: PostgreSQL', '│', ].join('\n'), ); + expect(io.stdout()).not.toContain('Tables: 2'); expect(io.stdout()).toContain( [ '◇ Scanning postgres-warehouse', diff --git a/packages/cli/src/setup-databases.ts b/packages/cli/src/setup-databases.ts index e431baa0..18ff7e74 100644 --- a/packages/cli/src/setup-databases.ts +++ b/packages/cli/src/setup-databases.ts @@ -1184,9 +1184,7 @@ async function validateAndScanConnection(input: { const testOutput = testIo.stdoutText(); const outputDriver = normalizeDriver(readOutputValue(testOutput, 'Driver')); const driverDisplay = outputDriver ? driverLabel(outputDriver) : (configuredDriverLabel ?? 'Unknown driver'); - const tableCount = Number(readOutputValue(testOutput, 'Tables') ?? NaN); - const testLines = ['✓ Connection test passed']; - testLines.push(`Driver: ${driverDisplay}${Number.isFinite(tableCount) ? ` · Tables: ${tableCount}` : ''}`); + const testLines = ['✓ Connection test passed', `Driver: ${driverDisplay}`]; writeSetupSection(input.io, `Testing ${input.connectionId}`, testLines); if (!(await maybeConfigureSchemaScope(input))) {