diff --git a/.github/workflows/npm-publish.yml b/.github/workflows/npm-publish.yml index 30adcd947..9a6f1e5f5 100644 --- a/.github/workflows/npm-publish.yml +++ b/.github/workflows/npm-publish.yml @@ -29,10 +29,18 @@ jobs: npm run build-pack node scripts/build-task.js + - name: Validate MCP package contents + run: npm run validate:package --workspace=@igniteui/mcp-server -- --expected-version "$VERSION" + - name: Define npm tag run: | - if [[ ${VERSION} == *"alpha"* || ${VERSION} == *"beta"* || ${VERSION} == *"rc"* ]]; then echo "NPM_TAG=next"; else echo "NPM_TAG=latest"; fi >> $GITHUB_ENV - echo ${NPM_TAG} + if [[ ${VERSION} == *"alpha"* || ${VERSION} == *"beta"* || ${VERSION} == *"rc"* ]]; then + NPM_TAG=next + else + NPM_TAG=latest + fi + echo "NPM_TAG=$NPM_TAG" >> $GITHUB_ENV + echo "$NPM_TAG" - name: Publish packages # use npm run as yarn run changes the registry and publishes to https://registry.yarnpkg.com diff --git a/packages/cli/package.json b/packages/cli/package.json index f71b5ca1e..b7a1af12d 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "igniteui-cli", - "version": "15.2.1", + "version": "15.2.2-alpha.3", "description": "CLI tool for creating Ignite UI projects", "keywords": [ "CLI", @@ -66,9 +66,9 @@ "all": true }, "dependencies": { - "@igniteui/angular-templates": "^21.2.1521", - "@igniteui/cli-core": "^15.2.1", - "@igniteui/mcp-server": "^15.2.1", + "@igniteui/angular-templates": "^21.2.1522-alpha.3", + "@igniteui/cli-core": "^15.2.2-alpha.3", + "@igniteui/mcp-server": "^15.2.2-alpha.3", "@inquirer/prompts": "^7.9.0", "chalk": "^5.3.0", "glob": "^11.0.0", diff --git a/packages/core/package.json b/packages/core/package.json index 20981529c..d3e3491dd 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@igniteui/cli-core", - "version": "15.2.1", + "version": "15.2.2-alpha.3", "description": "Base types and functionality for Ignite UI CLI", "repository": { "type": "git", diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/package.json b/packages/igniteui-mcp/igniteui-doc-mcp/package.json index dea1d5483..9e8521100 100644 --- a/packages/igniteui-mcp/igniteui-doc-mcp/package.json +++ b/packages/igniteui-mcp/igniteui-doc-mcp/package.json @@ -1,7 +1,7 @@ { "name": "@igniteui/mcp-server", "mcpName": "io.github.IgniteUI/mcp-server", - "version": "15.2.1", + "version": "15.2.2-alpha.3", "description": "Unified MCP server for Ignite UI — documentation, GitHub API, and CLI scaffolding", "repository": { "type": "git", @@ -38,6 +38,7 @@ "test:watch": "vitest", "coverage": "vitest run --coverage", "build:db": "npx tsx scripts/build-db.ts", + "validate:package": "npx tsx scripts/validate-package.ts", "inspector": "npx @modelcontextprotocol/inspector dist/index.js", "clear": "npx tsx -e \"import{rmSync}from'fs';rmSync('dist',{recursive:true,force:true})\"", "clear:angular": "npx tsx -e \"import{rmSync}from'fs';['docs_processing','docs_prepeared','docs_final'].forEach(d=>{rmSync('dist/'+d+'/angular',{recursive:true,force:true})})\"", diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/scripts/validate-package.ts b/packages/igniteui-mcp/igniteui-doc-mcp/scripts/validate-package.ts new file mode 100644 index 000000000..68bb7ed7a --- /dev/null +++ b/packages/igniteui-mcp/igniteui-doc-mcp/scripts/validate-package.ts @@ -0,0 +1,110 @@ +import { readdirSync, readFileSync, statSync, existsSync } from "fs"; +import { join, resolve } from "path"; +import { fileURLToPath } from "url"; + +const PKG_ROOT = resolve(fileURLToPath(new URL("..", import.meta.url))); +const DB_PATH = join(PKG_ROOT, "dist", "igniteui-docs.db"); +const DB_MIN_BYTES = 20 * 1024 * 1024; // 20 MB minimum for the SQLite DB +const DOCS_ROOT = join(PKG_ROOT, "docs"); +const FRAMEWORK_DIRS = ["angular-api", "react-api", "webcomponents-api", "blazor-api"]; +const FRAMEWORK_MIN_BYTES = 300 * 1024; // 300 KB minimum for each docs/-api directory + +const errors: string[] = []; + +function getExpectedVersion(): string | null { + const idx = process.argv.indexOf("--expected-version"); + if (idx >= 0) { + const rawValue = process.argv[idx + 1]; + const value = rawValue?.trim(); + if (!value || value.startsWith("--")) { + console.error('Missing or invalid value for "--expected-version". Provide a version after the flag.'); + process.exit(1); + } + return value.replace(/^v/, ""); + } + if (process.env.EXPECTED_VERSION) return process.env.EXPECTED_VERSION.replace(/^v/, ""); + return null; +} + +const expectedVersion = getExpectedVersion(); +if (expectedVersion) { + const pkgJsonPath = join(PKG_ROOT, "package.json"); + const pkgJson = JSON.parse(readFileSync(pkgJsonPath, "utf8")); + if (pkgJson.version !== expectedVersion) { + errors.push(`package.json version mismatch: got ${pkgJson.version}, expected ${expectedVersion}`); + } else { + console.log(`OK ver package.json ${pkgJson.version}`); + } + + const serverJsonPath = join(PKG_ROOT, "server.json"); + if (!existsSync(serverJsonPath)) { + errors.push(`server.json missing: ${serverJsonPath}`); + } else { + const serverJson = JSON.parse(readFileSync(serverJsonPath, "utf8")); + if (serverJson.version !== expectedVersion) { + errors.push(`server.json version mismatch: got ${serverJson.version}, expected ${expectedVersion}`); + } else { + console.log(`OK ver server.json ${serverJson.version}`); + } + const pkgs: Array<{ identifier?: string; version?: string }> = serverJson.packages ?? []; + if (pkgs.length === 0) { + errors.push(`server.json has no entries in "packages"`); + } + pkgs.forEach((p, i) => { + const label = p.identifier ?? `packages[${i}]`; + if (p.version !== expectedVersion) { + errors.push(`server.json ${label} version mismatch: got ${p.version}, expected ${expectedVersion}`); + } else { + console.log(`OK ver server.json ${label.padEnd(20)} ${p.version}`); + } + }); + } +} + +function formatSize(bytes: number): string { + if (bytes >= 1024 * 1024) return `${(bytes / 1024 / 1024).toFixed(2)} MB`; + if (bytes >= 1024) return `${(bytes / 1024).toFixed(2)} KB`; + return `${bytes} B`; +} + +function dirSize(dir: string): number { + let total = 0; + for (const entry of readdirSync(dir, { withFileTypes: true })) { + const full = join(dir, entry.name); + if (entry.isDirectory()) total += dirSize(full); + else if (entry.isFile()) total += statSync(full).size; + } + return total; +} + +if (!existsSync(DB_PATH)) { + errors.push(`DB missing: ${DB_PATH}`); +} else { + const size = statSync(DB_PATH).size; + if (size < DB_MIN_BYTES) { + errors.push(`DB too small: ${formatSize(size)} < ${formatSize(DB_MIN_BYTES)} (${DB_PATH})`); + } else { + console.log(`OK db ${formatSize(size)} ${DB_PATH}`); + } +} + +for (const framework of FRAMEWORK_DIRS) { + const frameworkDir = join(DOCS_ROOT, framework); + if (!existsSync(frameworkDir)) { + errors.push(`Docs framework dir missing: ${frameworkDir}`); + continue; + } + const size = dirSize(frameworkDir); + if (size < FRAMEWORK_MIN_BYTES) { + errors.push(`Docs framework dir too small: ${framework} = ${formatSize(size)} < ${formatSize(FRAMEWORK_MIN_BYTES)}`); + } else { + console.log(`OK dir ${formatSize(size).padStart(10)} ${framework}`); + } +} + +if (errors.length > 0) { + console.error(`\nValidation failed with ${errors.length} error(s):`); + for (const e of errors) console.error(` - ${e}`); + process.exit(1); +} +console.log("\nAll checks passed."); diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/server.json b/packages/igniteui-mcp/igniteui-doc-mcp/server.json index c7b789183..572da8bc7 100644 --- a/packages/igniteui-mcp/igniteui-doc-mcp/server.json +++ b/packages/igniteui-mcp/igniteui-doc-mcp/server.json @@ -7,12 +7,12 @@ "source": "github", "url": "https://github.com/IgniteUI/igniteui-cli" }, - "version": "15.2.1", + "version": "15.2.2-alpha.3", "packages": [ { "registryType": "npm", "identifier": "@igniteui/mcp-server", - "version": "15.2.1", + "version": "15.2.2-alpha.3", "transport": { "type": "stdio" } diff --git a/packages/igx-templates/package.json b/packages/igx-templates/package.json index 5a5406a59..b252a6240 100644 --- a/packages/igx-templates/package.json +++ b/packages/igx-templates/package.json @@ -1,6 +1,6 @@ { "name": "@igniteui/angular-templates", - "version": "21.2.1521", + "version": "21.2.1522-alpha.3", "description": "Templates for Ignite UI for Angular projects and components", "repository": { "type": "git", @@ -12,7 +12,7 @@ "author": "Infragistics", "license": "MIT", "dependencies": { - "@igniteui/cli-core": "^15.2.1", + "@igniteui/cli-core": "^15.2.2-alpha.3", "typescript": "~5.5.4" } } diff --git a/packages/ng-schematics/package.json b/packages/ng-schematics/package.json index db918b00f..e5dac37b1 100644 --- a/packages/ng-schematics/package.json +++ b/packages/ng-schematics/package.json @@ -1,6 +1,6 @@ { "name": "@igniteui/angular-schematics", - "version": "21.2.1521", + "version": "21.2.1522-alpha.3", "description": "Ignite UI for Angular Schematics for ng new and ng generate", "repository": { "type": "git", @@ -20,8 +20,8 @@ "dependencies": { "@angular-devkit/core": "^21.0.0", "@angular-devkit/schematics": "^21.0.0", - "@igniteui/angular-templates": "^21.2.1521", - "@igniteui/cli-core": "^15.2.1", + "@igniteui/angular-templates": "^21.2.1522-alpha.3", + "@igniteui/cli-core": "^15.2.2-alpha.3", "@schematics/angular": "^21.0.0", "minimatch": "^10.0.1", "rxjs": "~7.8.1"