diff --git a/packages/cli/src/cli-runtime.ts b/packages/cli/src/cli-runtime.ts index d933ac97..86a708f2 100644 --- a/packages/cli/src/cli-runtime.ts +++ b/packages/cli/src/cli-runtime.ts @@ -1,3 +1,5 @@ +import { createRequire } from 'node:module'; + import type { KtxConnectionMetabaseSetupArgs } from './commands/connection-metabase-setup.js'; import type { KtxConnectionNotionArgs } from './commands/connection-notion.js'; import type { KtxAgentArgs } from './agent.js'; @@ -16,9 +18,11 @@ import { profileMark, profileSpan } from './startup-profile.js'; profileMark('module:cli-runtime'); +const requirePackageJson = createRequire(import.meta.url); + export interface KtxCliPackageInfo { - name: '@ktx/cli'; - version: '0.0.0-private'; + name: string; + version: string; contextPackageName: '@ktx/context'; } @@ -45,9 +49,24 @@ export interface KtxCliDeps { } export function getKtxCliPackageInfo(): KtxCliPackageInfo { + return packageInfoFromJson(requirePackageJson('../package.json')); +} + +export function packageInfoFromJson(packageJson: unknown): KtxCliPackageInfo { + if ( + typeof packageJson !== 'object' || + packageJson === null || + !('name' in packageJson) || + !('version' in packageJson) || + typeof packageJson.name !== 'string' || + typeof packageJson.version !== 'string' + ) { + throw new Error('Invalid KTX CLI package metadata'); + } + return { - name: '@ktx/cli', - version: '0.0.0-private', + name: packageJson.name, + version: packageJson.version, contextPackageName: '@ktx/context', }; } diff --git a/packages/cli/src/index.test.ts b/packages/cli/src/index.test.ts index 0e4b4b1a..26fa00ae 100644 --- a/packages/cli/src/index.test.ts +++ b/packages/cli/src/index.test.ts @@ -6,6 +6,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { getKtxCliPackageInfo, + packageInfoFromJson, rendererUnavailableVizFallback, renderMemoryFlowTui, resolveVizFallback, @@ -56,6 +57,19 @@ describe('getKtxCliPackageInfo', () => { version: '0.0.0-private', }); }); + + it('normalizes public package metadata from package.json contents', () => { + expect( + packageInfoFromJson({ + name: '@kaelio/ktx', + version: '0.1.0', + }), + ).toEqual({ + name: '@kaelio/ktx', + version: '0.1.0', + contextPackageName: '@ktx/context', + }); + }); }); describe('memory-flow renderer exports', () => { diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index ae41043c..96fbbeec 100644 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -2,6 +2,7 @@ import { profileMark } from './startup-profile.js'; export { getKtxCliPackageInfo, + packageInfoFromJson, runInitForCommander, runKtxCli, type KtxCliDeps,