diff --git a/packages/cli/src/demo-seeded-inspect.test.ts b/packages/cli/src/demo-seeded-inspect.test.ts index 35c76861..d8f1a083 100644 --- a/packages/cli/src/demo-seeded-inspect.test.ts +++ b/packages/cli/src/demo-seeded-inspect.test.ts @@ -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'); }); diff --git a/packages/cli/src/demo-seeded-inspect.ts b/packages/cli/src/demo-seeded-inspect.ts index 0081e4b8..49f8b83f 100644 --- a/packages/cli/src/demo-seeded-inspect.ts +++ b/packages/cli/src/demo-seeded-inspect.ts @@ -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'] { diff --git a/packages/cli/src/demo.test.ts b/packages/cli/src/demo.test.ts index 0cedba99..22c2ee1d 100644 --- a/packages/cli/src/demo.test.ts +++ b/packages/cli/src/demo.test.ts @@ -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(' ')); }); diff --git a/packages/cli/src/memory-flow-tui.test.tsx b/packages/cli/src/memory-flow-tui.test.tsx index 9bf5425e..54640836 100644 --- a/packages/cli/src/memory-flow-tui.test.tsx +++ b/packages/cli/src/memory-flow-tui.test.tsx @@ -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(' ')); }); diff --git a/packages/cli/src/next-steps.test.ts b/packages/cli/src/next-steps.test.ts index 39b0e22d..39202c6d 100644 --- a/packages/cli/src/next-steps.test.ts +++ b/packages/cli/src/next-steps.test.ts @@ -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.'); }); }); diff --git a/packages/cli/src/next-steps.ts b/packages/cli/src/next-steps.ts index a07f5cea..18870ab8 100644 --- a/packages/cli/src/next-steps.ts +++ b/packages/cli/src/next-steps.ts @@ -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), ]; } diff --git a/packages/cli/src/standalone-smoke.test.ts b/packages/cli/src/standalone-smoke.test.ts index 27f34b92..a2c05fe8 100644 --- a/packages/cli/src/standalone-smoke.test.ts +++ b/packages/cli/src/standalone-smoke.test.ts @@ -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 () => {