From 3a0d4a86352ec90e4ed4cc9e014339f0df00da25 Mon Sep 17 00:00:00 2001 From: Joan Xie Date: Wed, 24 Sep 2025 13:57:19 -0700 Subject: [PATCH] feat: create schema version map with CURRENT_MANIFEST_SCHEMA selector --- src/cli/init.ts | 4 ++-- src/cli/pack.ts | 4 ++-- src/node/validate.ts | 7 +++---- src/shared/constants.ts | 35 +++++++++++++++++++++++++++++++++++ 4 files changed, 42 insertions(+), 8 deletions(-) create mode 100644 src/shared/constants.ts diff --git a/src/cli/init.ts b/src/cli/init.ts index 0d2df69..17b95a9 100644 --- a/src/cli/init.ts +++ b/src/cli/init.ts @@ -2,7 +2,7 @@ import { confirm, input, select } from "@inquirer/prompts"; import { existsSync, readFileSync, writeFileSync } from "fs"; import { basename, join, resolve } from "path"; -import { MANIFEST_VERSION } from "../schemas/0.2.js"; +import { CURRENT_MANIFEST_VERSION } from "../shared/constants.js"; import type { McpbManifest } from "../types.js"; interface PackageJson { @@ -774,7 +774,7 @@ export function buildManifest( const { keywords, license, repository } = optionalFields; return { - manifest_version: MANIFEST_VERSION, + manifest_version: CURRENT_MANIFEST_VERSION, name, ...(displayName && displayName !== name ? { display_name: displayName } diff --git a/src/cli/pack.ts b/src/cli/pack.ts index 30ce068..d7cb6f5 100644 --- a/src/cli/pack.ts +++ b/src/cli/pack.ts @@ -13,7 +13,7 @@ import { basename, join, relative, resolve, sep } from "path"; import { getAllFilesWithCount, readMcpbIgnorePatterns } from "../node/files.js"; import { validateManifest } from "../node/validate.js"; -import { MANIFEST_VERSION, McpbManifestSchema } from "../schemas/0.2.js"; +import { CURRENT_MANIFEST_VERSION, CURRENT_MANIFEST_SCHEMA } from "../shared/constants.js"; import { getLogger } from "../shared/log.js"; import { initExtension } from "./init.js"; @@ -92,7 +92,7 @@ export async function packExtension({ try { const manifestContent = readFileSync(manifestPath, "utf-8"); const manifestData = JSON.parse(manifestContent); - manifest = McpbManifestSchema.parse(manifestData); + manifest = CURRENT_MANIFEST_SCHEMA.parse(manifestData); } catch (error) { logger.error("ERROR: Failed to parse manifest.json"); if (error instanceof Error) { diff --git a/src/node/validate.ts b/src/node/validate.ts index 9e3340d..3be269e 100644 --- a/src/node/validate.ts +++ b/src/node/validate.ts @@ -6,8 +6,7 @@ import { join, resolve } from "path"; import prettyBytes from "pretty-bytes"; import { unpackExtension } from "../cli/unpack.js"; -import { McpbManifestSchema } from "../schemas/0.2.js"; -import { McpbManifestSchema as LooseMcpbManifestSchema } from "../schemas_loose/0.2.js"; +import { CURRENT_MANIFEST_SCHEMA, CURRENT_MANIFEST_SCHEMA_LOOSE } from "../shared/constants.js"; export function validateManifest(inputPath: string): boolean { try { @@ -22,7 +21,7 @@ export function validateManifest(inputPath: string): boolean { const manifestContent = readFileSync(manifestPath, "utf-8"); const manifestData = JSON.parse(manifestContent); - const result = McpbManifestSchema.safeParse(manifestData); + const result = CURRENT_MANIFEST_SCHEMA.safeParse(manifestData); if (result.success) { console.log("Manifest schema validation passes!"); @@ -72,7 +71,7 @@ export async function cleanMcpb(inputPath: string) { const manifestPath = resolve(unpackPath, "manifest.json"); const originalManifest = await fs.readFile(manifestPath, "utf-8"); const manifestData = JSON.parse(originalManifest); - const result = LooseMcpbManifestSchema.safeParse(manifestData); + const result = CURRENT_MANIFEST_SCHEMA_LOOSE.safeParse(manifestData); if (!result.success) { throw new Error( diff --git a/src/shared/constants.ts b/src/shared/constants.ts new file mode 100644 index 0000000..f1c1359 --- /dev/null +++ b/src/shared/constants.ts @@ -0,0 +1,35 @@ +import { McpbManifestSchema as ManifestSchemaV0_1 } from "../schemas/0.1.js"; +import { McpbManifestSchema as ManifestSchemaV0_2 } from "../schemas/0.2.js"; +import { McpbManifestSchema as LooseManifestSchemaV0_1 } from "../schemas_loose/0.1.js"; +import { McpbManifestSchema as LooseManifestSchemaV0_2 } from "../schemas_loose/0.2.js"; + +/** + * Current manifest version - the version that new manifests should use + */ +export const CURRENT_MANIFEST_VERSION = "0.2" as const; + +/** + * Map of manifest versions to their strict schemas + */ +export const MANIFEST_SCHEMAS = { + "0.1": ManifestSchemaV0_1, + "0.2": ManifestSchemaV0_2, +} as const; + +/** + * Map of manifest versions to their loose schemas (with passthrough) + */ +export const MANIFEST_SCHEMAS_LOOSE = { + "0.1": LooseManifestSchemaV0_1, + "0.2": LooseManifestSchemaV0_2, +} as const; + +/** + * Get the current manifest schema based on CURRENT_MANIFEST_VERSION + */ +export const CURRENT_MANIFEST_SCHEMA = MANIFEST_SCHEMAS[CURRENT_MANIFEST_VERSION]; + +/** + * Get the current loose manifest schema based on CURRENT_MANIFEST_VERSION + */ +export const CURRENT_MANIFEST_SCHEMA_LOOSE = MANIFEST_SCHEMAS_LOOSE[CURRENT_MANIFEST_VERSION];