import { describe, expect, it } from 'vitest'; import { renderKtxCommandTree } from '../src/print-command-tree.js'; describe('renderKtxCommandTree', () => { it('renders an indented tree rooted at "ktx" with known top-level commands', () => { const output = renderKtxCommandTree(); const lines = output.split('\n'); expect(lines[0]).toMatch(/^ktx( |$)/); const topLevel = lines .filter((line) => /^ {2}[├└]── \S/.test(line)) .map((line) => line.replace(/^ {2}[├└]── /, '').trim().split(' ')[0]); for (const expected of ['setup', 'connection', 'ingest', 'sl', 'mcp', 'admin']) { expect(topLevel).toContain(expected); } expect(output).toContain('│ └── test [connectionId]'); expect(output).toContain('│ ├── status Show KTX MCP daemon status'); expect(output).not.toContain('│ ├── add'); expect(output).not.toContain('│ ├── remove'); expect(output).not.toContain('│ ├── map'); expect(output).not.toContain('│ ├── mapping'); expect(output).not.toContain('│ ├── metabase'); expect(output).not.toContain('│ ├── notion'); expect(output).not.toContain('scan '); expect(output).not.toContain('│ ├── replay'); expect(output).not.toContain('│ └── replay'); expect(output).not.toContain('│ ├── run'); expect(output).not.toContain('│ ├── watch'); expect(output).not.toContain('│ └── watch'); expect(output).not.toContain('│ ├── read'); expect(output).not.toContain('│ ├── write'); expect(output).not.toContain('│ └── write'); }); it('ends with a single trailing newline', () => { const output = renderKtxCommandTree(); expect(output.endsWith('\n')).toBe(true); expect(output.endsWith('\n\n')).toBe(false); }); });