Simplify CLI next steps

This commit is contained in:
Luca Martial 2026-05-11 22:05:54 -07:00
parent 97a6b91f95
commit be90ad27f4
7 changed files with 22 additions and 29 deletions

View file

@ -4,7 +4,7 @@ import { join } from 'node:path';
import { afterEach, describe, expect, it } from 'vitest';
import { runDemoSeeded } from './demo-seeded.js';
import { formatSeededInspect, inspectSeededProject } from './demo-seeded-inspect.js';
import { KTX_NEXT_STEP_COMMANDS } from './next-steps.js';
import { KTX_NEXT_STEP_DIRECT_COMMANDS } from './next-steps.js';
describe('seeded demo inspect contract', () => {
const projectDir = join(tmpdir(), `ktx-demo-seeded-inspect-${process.pid}`);
@ -59,7 +59,7 @@ describe('seeded demo inspect contract', () => {
reports: { primaryPath: 'reports/seeded-demo-report.json', fileCount: 1 },
replays: { primaryPath: 'replays/replay.memory-flow.v1.json', latestPath: 'replays/latest.memory-flow.v1.json' },
},
nextCommands: KTX_NEXT_STEP_COMMANDS,
nextCommands: KTX_NEXT_STEP_DIRECT_COMMANDS,
});
expect(inspect.generatedOutputs.replays.fileCount).toBeGreaterThanOrEqual(3);
@ -91,10 +91,7 @@ describe('seeded demo inspect contract', () => {
expect(output).toContain('Latest replay: seeded (packaged, prebuilt)');
expect(output).toContain(' $ ktx agent tools --json');
expect(output).toContain(' $ ktx agent context --json');
expect(output).toContain(' $ ktx serve --mcp stdio --user-id local');
expect(output.indexOf('ktx agent tools --json')).toBeLessThan(
output.indexOf('ktx serve --mcp stdio --user-id local'),
);
expect(output).not.toContain('ktx serve --mcp stdio --user-id local');
expect(output).not.toContain('ktx ask');
expect(output).not.toContain('deterministic mode');
});

View file

@ -4,7 +4,7 @@ import { join, resolve } from 'node:path';
import type { MemoryFlowReplayInput } from '@ktx/context/ingest/memory-flow';
import { loadPackagedDemoReplay } from './demo-assets.js';
import { DEMO_LATEST_REPLAY_FILE, loadLatestDemoReplay } from './demo-replay-store.js';
import { KTX_NEXT_STEP_COMMANDS, KTX_NEXT_STEP_COMMAND_WIDTH } from './next-steps.js';
import { KTX_NEXT_STEP_COMMAND_WIDTH, KTX_NEXT_STEP_DIRECT_COMMANDS } from './next-steps.js';
type SeededInspectReadiness = 'missing' | 'ready' | 'corrupt';
@ -181,7 +181,7 @@ function sourceBundleFromManifest(manifest: DemoSeededManifest): SeededInspectSu
}
function nextCommands(): SeededInspectSummary['nextCommands'] {
return [...KTX_NEXT_STEP_COMMANDS];
return [...KTX_NEXT_STEP_DIRECT_COMMANDS];
}
function modeMetadataFromReplay(replay: MemoryFlowReplayInput | null): SeededInspectSummary['modeMetadata'] {

View file

@ -8,7 +8,7 @@ import { DEMO_FULL_JOB_ID, defaultDemoProjectDir, ensureDemoProject } from './de
import type { DemoFullResult } from './demo-full.js';
import { createTestDemoPromptAdapter } from './demo-interaction.js';
import type { renderMemoryFlowTui } from './memory-flow-tui.js';
import { KTX_NEXT_STEP_COMMANDS } from './next-steps.js';
import { KTX_NEXT_STEP_DIRECT_COMMANDS } from './next-steps.js';
import { resetVizFallbackWarningsForTest } from './viz-fallback.js';
function makeIo(options: { isTTY?: boolean; columns?: number; rawMode?: boolean } = {}) {
@ -205,7 +205,7 @@ describe('runKtxDemo', () => {
expect(io.stdout()).toContain('Connection: orbit_demo');
expect(io.stdout()).toContain('ktx sl list');
expect(io.stdout()).toContain('ktx wiki list');
expect(io.stdout()).toContain('ktx serve --mcp stdio --user-id local');
expect(io.stdout()).not.toContain('ktx serve --mcp stdio --user-id local');
expect(io.stdout()).not.toContain('KTX memory flow');
expect(io.stderr()).toContain(
'Visualization requested but stdin raw mode is unavailable; printing plain output.',
@ -223,7 +223,7 @@ describe('runKtxDemo', () => {
expect(testIo.stdout()).toContain('Connection: orbit_demo');
expect(testIo.stdout()).toContain('ktx sl list');
expect(testIo.stdout()).toContain('ktx wiki list');
expect(testIo.stdout()).toContain('ktx serve --mcp stdio --user-id local');
expect(testIo.stdout()).not.toContain('ktx serve --mcp stdio --user-id local');
expect(testIo.stdout()).not.toContain('KTX memory flow');
expect(testIo.stderr()).toContain(
'Visualization requested but stdout is not an interactive terminal; printing plain output.',
@ -284,7 +284,7 @@ describe('runKtxDemo', () => {
expect(io.stdout()).toContain('LLM calls: none');
expect(io.stdout()).toContain('Your KTX project files are at:');
expect(io.stdout()).toContain(join(tmpdir(), 'ktx-demo-'));
expect(io.stdout()).toContain('ktx serve --mcp stdio');
expect(io.stdout()).not.toContain('ktx serve --mcp stdio');
expect(io.stdout()).not.toContain(['ktx', 'mcp'].join(' '));
expect(io.stdout()).not.toContain('deterministic');
});
@ -347,7 +347,7 @@ describe('runKtxDemo', () => {
generatedContext: 'prebuilt from bundled assets',
llmCalls: 'none',
},
nextCommands: KTX_NEXT_STEP_COMMANDS,
nextCommands: KTX_NEXT_STEP_DIRECT_COMMANDS,
});
expect(parsed.generatedOutputs.replays.fileCount).toBeGreaterThanOrEqual(3);
expect(jsonIo.stderr()).toBe('');
@ -414,7 +414,7 @@ describe('runKtxDemo', () => {
expect(testIo.stdout()).toContain('KTX finished ingesting your data');
expect(testIo.stdout()).toContain('ktx sl list');
expect(testIo.stdout()).toContain('ktx wiki list');
expect(testIo.stdout()).toContain('ktx serve --mcp stdio --user-id local');
expect(testIo.stdout()).not.toContain('ktx serve --mcp stdio --user-id local');
expect(testIo.stdout()).not.toContain(['ktx', 'ask'].join(' '));
expect(testIo.stdout()).not.toContain(['ktx', 'mcp'].join(' '));
});

View file

@ -201,7 +201,7 @@ describe('MemoryFlowTuiApp', () => {
expect(frame).toContain('KTX finished ingesting your data');
expect(frame).toContain('ktx sl list');
expect(frame).toContain('ktx wiki list');
expect(frame).toContain('ktx serve --mcp stdio --user-id local');
expect(frame).not.toContain('ktx serve --mcp stdio --user-id local');
expect(frame).not.toContain(['ktx', 'ask'].join(' '));
expect(frame).not.toContain(['ktx', 'mcp'].join(' '));
});

View file

@ -66,11 +66,10 @@ describe('KTX demo next steps', () => {
const rendered = formatNextStepLines().join('\n');
expect(rendered).toContain('KTX context is ready for agents.');
expect(rendered).toContain('Preferred route: CLI + Skills');
expect(rendered).toContain('no MCP server is required');
expect(rendered).toContain('Direct CLI checks:');
expect(rendered).toContain('Optional MCP:');
expect(rendered).not.toContain('Ask your agent to use KTX');
expect(rendered).toContain('ask a data question');
expect(rendered).toContain('Verify with:');
expect(rendered).not.toContain('Preferred route');
expect(rendered).not.toContain('Optional MCP:');
});
it('does not advertise removed Commander migration commands', () => {
@ -80,7 +79,6 @@ describe('KTX demo next steps', () => {
expect(rendered).toContain('ktx agent context --json');
expect(rendered).toContain('ktx sl list');
expect(rendered).toContain('ktx wiki list');
expect(rendered).toContain('ktx serve --mcp stdio --user-id local');
for (const removed of [
command('ktx', 'ask'),
@ -91,6 +89,7 @@ describe('KTX demo next steps', () => {
command('dev', 'knowledge'),
command('ktx', 'ingest', 'run'),
command('ktx', 'ingest', 'replay'),
command('ktx', 'serve', '--mcp', 'stdio', '--user-id', 'local'),
]) {
expect(rendered).not.toContain(removed);
}
@ -123,7 +122,7 @@ describe('KTX demo next steps', () => {
expect(rendered).toContain('KTX context is ready for agents.');
expect(rendered).toContain('ktx agent context --json');
expect(rendered).toContain('ktx serve --mcp stdio --user-id local');
expect(rendered).not.toContain('ktx serve --mcp stdio --user-id local');
expect(rendered).not.toContain('Build KTX context next.');
});
});

View file

@ -58,12 +58,9 @@ function commandLines(commands: ReadonlyArray<{ command: string; description: st
export function formatNextStepLines(indent = ' '): string[] {
return [
`${indent}KTX context is ready for agents.`,
`${indent}Preferred route: CLI + Skills; installed rules call the pinned local CLI directly, so no MCP server is required.`,
`${indent}Direct CLI checks:`,
`${indent}KTX context is ready for agents. Open your coding agent in this directory and ask a data question.`,
`${indent}Verify with:`,
...commandLines(KTX_NEXT_STEP_DIRECT_COMMANDS, indent),
`${indent}Optional MCP:`,
...commandLines(KTX_NEXT_STEP_MCP_COMMANDS, indent),
];
}

View file

@ -221,7 +221,7 @@ describe('standalone built ktx CLI smoke', () => {
expect(result.stdout).toContain('Notion:');
expect(result.stdout).toContain('Semantic-layer sources:');
expect(result.stdout).toContain('Knowledge pages:');
expect(result.stdout).toContain('ktx serve --mcp stdio');
expect(result.stdout).not.toContain('ktx serve --mcp stdio');
expect(result.stdout).not.toContain(['--mode', 'deterministic'].join(' '));
});
@ -336,7 +336,7 @@ describe('standalone built ktx CLI smoke', () => {
expect(inspect.stdout).toContain('ktx agent tools --json');
expect(inspect.stdout).toContain('ktx agent context --json');
expect(inspect.stdout).not.toContain('ktx ask "your question here"');
expect(inspect.stdout).toContain('ktx serve --mcp stdio');
expect(inspect.stdout).not.toContain('ktx serve --mcp stdio');
});
it('serves seeded demo wiki and semantic-layer context over stdio MCP', async () => {