ktx/packages/cli/src/cli-runtime.ts

90 lines
3.3 KiB
TypeScript
Raw Normal View History

2026-05-10 23:51:24 +02:00
import type { KtxConnectionMetabaseSetupArgs } from './commands/connection-metabase-setup.js';
import type { KtxConnectionNotionArgs } from './commands/connection-notion.js';
import type { KtxAgentArgs } from './agent.js';
import type { KtxConnectionArgs } from './connection.js';
import type { KtxDemoArgs } from './demo.js';
import type { KtxDoctorArgs } from './doctor.js';
import type { KtxIngestArgs } from './ingest.js';
import type { KtxKnowledgeArgs } from './knowledge.js';
import type { KtxPublicIngestArgs } from './public-ingest.js';
import type { KtxScanArgs } from './scan.js';
import type { KtxServeArgs } from './serve.js';
import type { KtxSetupArgs } from './setup.js';
import type { KtxSlArgs } from './sl.js';
2026-05-10 23:12:26 +02:00
import { profileMark, profileSpan } from './startup-profile.js';
profileMark('module:cli-runtime');
2026-05-10 23:51:24 +02:00
export interface KtxCliPackageInfo {
name: '@ktx/cli';
2026-05-10 23:12:26 +02:00
version: '0.0.0-private';
2026-05-10 23:51:24 +02:00
contextPackageName: '@ktx/context';
2026-05-10 23:12:26 +02:00
}
2026-05-10 23:51:24 +02:00
export interface KtxCliIo {
2026-05-11 00:31:15 -07:00
stdout: { isTTY?: boolean; columns?: number; write(chunk: string): void };
2026-05-10 23:12:26 +02:00
stderr: { write(chunk: string): void };
}
2026-05-10 23:51:24 +02:00
export interface KtxCliDeps {
serveStdio?: (args: KtxServeArgs) => Promise<number>;
setup?: (args: KtxSetupArgs, io: KtxCliIo) => Promise<number>;
agent?: (args: KtxAgentArgs, io: KtxCliIo) => Promise<number>;
connection?: (args: KtxConnectionArgs, io: KtxCliIo) => Promise<number>;
connectionNotion?: (args: KtxConnectionNotionArgs, io: KtxCliIo) => Promise<number>;
connectionMetabaseSetup?: (args: KtxConnectionMetabaseSetupArgs, io: KtxCliIo) => Promise<number>;
demo?: (args: KtxDemoArgs, io: KtxCliIo) => Promise<number>;
doctor?: (args: KtxDoctorArgs, io: KtxCliIo) => Promise<number>;
ingest?: (args: KtxIngestArgs, io: KtxCliIo) => Promise<number>;
publicIngest?: (args: KtxPublicIngestArgs, io: KtxCliIo) => Promise<number>;
scan?: (args: KtxScanArgs, io: KtxCliIo) => Promise<number>;
knowledge?: (args: KtxKnowledgeArgs, io: KtxCliIo) => Promise<number>;
sl?: (args: KtxSlArgs, io: KtxCliIo) => Promise<number>;
2026-05-10 23:12:26 +02:00
}
2026-05-10 23:51:24 +02:00
export function getKtxCliPackageInfo(): KtxCliPackageInfo {
2026-05-10 23:12:26 +02:00
return {
2026-05-10 23:51:24 +02:00
name: '@ktx/cli',
2026-05-10 23:12:26 +02:00
version: '0.0.0-private',
2026-05-10 23:51:24 +02:00
contextPackageName: '@ktx/context',
2026-05-10 23:12:26 +02:00
};
}
async function runInit(
args: { projectDir: string; projectName?: string; force: boolean },
2026-05-10 23:51:24 +02:00
io: KtxCliIo,
2026-05-10 23:12:26 +02:00
): Promise<number> {
2026-05-10 23:51:24 +02:00
const { initKtxProject } = await import('@ktx/context/project');
const result = await initKtxProject({
2026-05-10 23:12:26 +02:00
projectDir: args.projectDir,
projectName: args.projectName,
force: args.force,
});
2026-05-10 23:51:24 +02:00
io.stdout.write(`Initialized KTX project at ${result.projectDir}\n`);
2026-05-10 23:12:26 +02:00
io.stdout.write(`Config: ${result.configPath}\n`);
io.stdout.write(`Commit: ${result.commitHash ?? 'none'}\n`);
return 0;
}
export async function runInitForCommander(
args: { projectDir: string; projectName?: string; force: boolean },
2026-05-10 23:51:24 +02:00
io: KtxCliIo,
2026-05-10 23:12:26 +02:00
): Promise<number> {
return await runInit(args, io);
}
2026-05-10 23:51:24 +02:00
export async function runKtxCli(
2026-05-10 23:12:26 +02:00
argv = process.argv.slice(2),
2026-05-10 23:51:24 +02:00
io: KtxCliIo = process,
deps: KtxCliDeps = {},
2026-05-10 23:12:26 +02:00
): Promise<number> {
2026-05-10 23:51:24 +02:00
const info = getKtxCliPackageInfo();
profileMark('runtime:runKtxCli');
const { runCommanderKtxCli } = await profileSpan('import ./cli-program.js', () => import('./cli-program.js'));
2026-05-10 23:12:26 +02:00
2026-05-10 23:51:24 +02:00
return await runCommanderKtxCli(argv, io, deps, info, {
2026-05-10 23:12:26 +02:00
runInit: runInitForCommander,
});
}