feat(cli): add box-drawing prefixes to remaining setup stdout messages

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Luca Martial 2026-05-12 16:58:09 -07:00
parent 509f9f5301
commit 07ac71ea7c
7 changed files with 21 additions and 21 deletions

View file

@ -369,7 +369,7 @@ export async function runKtxSetupAgentsStep(
deps: KtxSetupAgentsDeps = {},
): Promise<KtxSetupAgentsResult> {
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') {

View file

@ -1320,7 +1320,7 @@ export async function runKtxSetupDatabasesStep(
deps: KtxSetupDatabasesDeps = {},
): Promise<KtxSetupDatabasesResult> {
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 };
}

View file

@ -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.',
);
});

View file

@ -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<KtxSetupEmbeddingsResult> {
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 };
}

View file

@ -393,7 +393,7 @@ export async function runKtxSetupAnthropicModelStep(
deps: KtxSetupModelDeps = {},
): Promise<KtxSetupModelResult> {
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 };
}

View file

@ -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(

View file

@ -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);
}