From 07ac71ea7cb7efe9c1dd2676fb60ee90a9d0beb2 Mon Sep 17 00:00:00 2001 From: Luca Martial Date: Tue, 12 May 2026 16:58:09 -0700 Subject: [PATCH] feat(cli): add box-drawing prefixes to remaining setup stdout messages Co-Authored-By: Claude Opus 4.6 (1M context) --- packages/cli/src/setup-agents.ts | 2 +- packages/cli/src/setup-databases.ts | 4 ++-- packages/cli/src/setup-embeddings.test.ts | 2 +- packages/cli/src/setup-embeddings.ts | 12 ++++++------ packages/cli/src/setup-models.ts | 6 +++--- packages/cli/src/setup-project.ts | 2 +- packages/cli/src/setup-sources.ts | 14 +++++++------- 7 files changed, 21 insertions(+), 21 deletions(-) diff --git a/packages/cli/src/setup-agents.ts b/packages/cli/src/setup-agents.ts index 1545a9b6..24d149a5 100644 --- a/packages/cli/src/setup-agents.ts +++ b/packages/cli/src/setup-agents.ts @@ -369,7 +369,7 @@ export async function runKtxSetupAgentsStep( deps: KtxSetupAgentsDeps = {}, ): Promise { if (args.skipAgents) { - io.stdout.write('Agent integration skipped.\n'); + io.stdout.write('│ Agent integration skipped.\n'); return { status: 'skipped', projectDir: args.projectDir }; } if (!args.agents && args.inputMode === 'disabled') { diff --git a/packages/cli/src/setup-databases.ts b/packages/cli/src/setup-databases.ts index 2210338c..fbb90bd1 100644 --- a/packages/cli/src/setup-databases.ts +++ b/packages/cli/src/setup-databases.ts @@ -1320,7 +1320,7 @@ export async function runKtxSetupDatabasesStep( deps: KtxSetupDatabasesDeps = {}, ): Promise { if (args.skipDatabases) { - io.stdout.write('Primary source setup skipped. KTX cannot work until you add a primary source.\n'); + io.stdout.write('│ Primary source setup skipped. KTX cannot work until you add a primary source.\n'); return { status: 'skipped', projectDir: args.projectDir }; } @@ -1377,7 +1377,7 @@ export async function runKtxSetupDatabasesStep( if (drivers === 'missing-input') return { status: 'missing-input', projectDir: args.projectDir }; if (drivers.length === 0) { await markDatabasesComplete(args.projectDir, []); - io.stdout.write('KTX cannot work without a primary source.\n'); + io.stdout.write('│ KTX cannot work without a primary source.\n'); return { status: 'skipped', projectDir: args.projectDir }; } diff --git a/packages/cli/src/setup-embeddings.test.ts b/packages/cli/src/setup-embeddings.test.ts index 4b84e489..4f03e2e7 100644 --- a/packages/cli/src/setup-embeddings.test.ts +++ b/packages/cli/src/setup-embeddings.test.ts @@ -198,7 +198,7 @@ describe('setup embeddings step', () => { await vi.waitFor(() => { expect(io.stdout()).toContain( - '\r- Testing local sentence-transformers embeddings (all-MiniLM-L6-v2, 384 dimensions). First run may take up to 60 seconds.', + '\r│ - Testing local sentence-transformers embeddings (all-MiniLM-L6-v2, 384 dimensions). First run may take up to 60 seconds.', ); }); diff --git a/packages/cli/src/setup-embeddings.ts b/packages/cli/src/setup-embeddings.ts index 0c617c3e..986ff99a 100644 --- a/packages/cli/src/setup-embeddings.ts +++ b/packages/cli/src/setup-embeddings.ts @@ -349,7 +349,7 @@ function healthCheckStartText(backend: KtxSetupEmbeddingBackend, model: string, function startHealthCheckProgress(io: KtxCliIo, message: string): HealthCheckProgress { if (io.stdout.isTTY !== true) { - io.stdout.write(`${message}\n`); + io.stdout.write(`│ ${message}\n`); const noop = () => undefined; return { succeed: noop, @@ -360,7 +360,7 @@ function startHealthCheckProgress(io: KtxCliIo, message: string): HealthCheckPro let frameIndex = 0; let stopped = false; const writeFrame = () => { - io.stdout.write(`${CLEAR_CURRENT_LINE}${HEALTH_CHECK_SPINNER_FRAMES[frameIndex]} ${message}`); + io.stdout.write(`${CLEAR_CURRENT_LINE}│ ${HEALTH_CHECK_SPINNER_FRAMES[frameIndex]} ${message}`); }; writeFrame(); const interval = setInterval(() => { @@ -374,7 +374,7 @@ function startHealthCheckProgress(io: KtxCliIo, message: string): HealthCheckPro } stopped = true; clearInterval(interval); - io.stdout.write(`${CLEAR_CURRENT_LINE}${finalMessage}\n`); + io.stdout.write(`${CLEAR_CURRENT_LINE}│ ${finalMessage}\n`); }; return { @@ -393,7 +393,7 @@ export async function runKtxSetupEmbeddingsStep( deps: KtxSetupEmbeddingsDeps = {}, ): Promise { if (args.skipEmbeddings) { - io.stdout.write('Embeddings setup skipped.\n'); + io.stdout.write('│ Embeddings setup skipped.\n'); return { status: 'skipped', projectDir: args.projectDir }; } @@ -405,7 +405,7 @@ export async function runKtxSetupEmbeddingsStep( !args.embeddingApiKeyEnv && !args.embeddingApiKeyFile ) { - io.stdout.write(`Embeddings ready: yes (${project.config.ingest.embeddings.model})\n`); + io.stdout.write(`│ Embeddings ready: yes (${project.config.ingest.embeddings.model})\n`); return { status: 'ready', projectDir: args.projectDir }; } @@ -492,7 +492,7 @@ export async function runKtxSetupEmbeddingsStep( credentialRef, }), ); - io.stdout.write(`Embeddings ready: yes (${model}, ${dimensions} dimensions)\n`); + io.stdout.write(`│ Embeddings ready: yes (${model}, ${dimensions} dimensions)\n`); return { status: 'ready', projectDir: args.projectDir }; } diff --git a/packages/cli/src/setup-models.ts b/packages/cli/src/setup-models.ts index f69d6506..16cf32e8 100644 --- a/packages/cli/src/setup-models.ts +++ b/packages/cli/src/setup-models.ts @@ -393,7 +393,7 @@ export async function runKtxSetupAnthropicModelStep( deps: KtxSetupModelDeps = {}, ): Promise { if (args.skipLlm) { - io.stdout.write('LLM setup skipped.\n'); + io.stdout.write('│ LLM setup skipped.\n'); return { status: 'skipped', projectDir: args.projectDir }; } @@ -405,7 +405,7 @@ export async function runKtxSetupAnthropicModelStep( !args.anthropicApiKeyFile && !args.anthropicModel ) { - io.stdout.write(`LLM ready: yes (${project.config.llm.models.default})\n`); + io.stdout.write(`│ LLM ready: yes (${project.config.llm.models.default})\n`); return { status: 'ready', projectDir: args.projectDir }; } @@ -438,7 +438,7 @@ export async function runKtxSetupAnthropicModelStep( const health = await healthCheck(buildHealthConfig(credential.value, model.model)); if (health.ok) { await persistLlmConfig(args.projectDir, credential.ref, model.model); - io.stdout.write(`LLM ready: yes (${model.model})\n`); + io.stdout.write(`│ LLM ready: yes (${model.model})\n`); return { status: 'ready', projectDir: args.projectDir }; } diff --git a/packages/cli/src/setup-project.ts b/packages/cli/src/setup-project.ts index 669e3f34..e0fc4c94 100644 --- a/packages/cli/src/setup-project.ts +++ b/packages/cli/src/setup-project.ts @@ -136,7 +136,7 @@ async function loadExistingProject(projectDir: string, deps: KtxSetupProjectDeps } function printProjectSummary(io: KtxCliIo, projectDir: string): void { - io.stdout.write(`Project: ${projectDir}\n`); + io.stdout.write(`│ Project: ${projectDir}\n`); } async function promptForNewProjectDir( diff --git a/packages/cli/src/setup-sources.ts b/packages/cli/src/setup-sources.ts index 3393b838..7f9c0f13 100644 --- a/packages/cli/src/setup-sources.ts +++ b/packages/cli/src/setup-sources.ts @@ -701,7 +701,7 @@ async function runInitialSourceIngestWithRecovery(input: { deps: KtxSetupSourcesDeps; }): Promise<'ready' | 'continue' | 'back' | 'failed'> { while (true) { - input.io.stdout.write(`Building context from ${input.connectionId}. Large sources can take a while.\n`); + input.io.stdout.write(`│ Building context from ${input.connectionId}. Large sources can take a while.\n`); const ingestCode = await (input.deps.runInitialIngest ?? defaultRunInitialIngest)( input.args.projectDir, input.connectionId, @@ -729,8 +729,8 @@ async function runInitialSourceIngestWithRecovery(input: { continue; } if (action === 'continue') { - input.io.stdout.write(`Context source saved without a completed context build for ${input.connectionId}.\n`); - input.io.stdout.write(`Run later: ktx ingest ${input.connectionId}\n`); + input.io.stdout.write(`│ Context source saved without a completed context build for ${input.connectionId}.\n`); + input.io.stdout.write(`│ Run later: ktx ingest ${input.connectionId}\n`); return 'continue'; } return 'back'; @@ -1357,7 +1357,7 @@ export async function runKtxSetupSourcesStep( try { if (args.skipSources) { await markSourcesComplete(args.projectDir); - io.stdout.write('Context source setup skipped.\n'); + io.stdout.write('│ Context source setup skipped.\n'); return { status: 'skipped', projectDir: args.projectDir }; } @@ -1370,7 +1370,7 @@ export async function runKtxSetupSourcesStep( return { status: 'failed', projectDir: args.projectDir }; } if (args.inputMode !== 'disabled') { - io.stdout.write(`${message}\n`); + io.stdout.write(`│ ${message}\n`); return { status: 'skipped', projectDir: args.projectDir }; } } @@ -1394,7 +1394,7 @@ export async function runKtxSetupSourcesStep( return { status: 'missing-input', projectDir: args.projectDir }; } await markSourcesComplete(args.projectDir); - io.stdout.write('No context sources selected.\n'); + io.stdout.write('│ No context sources selected.\n'); return { status: 'skipped', projectDir: args.projectDir }; } @@ -1467,7 +1467,7 @@ export async function runKtxSetupSourcesStep( break; } } else { - io.stdout.write(`Context source ${connectionId} saved. It will be built during the context build step.\n`); + io.stdout.write(`│ Context source ${connectionId} saved. It will be built during the context build step.\n`); } readyConnectionIds.push(connectionId); }