@muggleai/mcp 1.0.1 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Help and usage guidance for muggle-mcp CLI.
3
+ * Provides comprehensive how-to guidance for users.
4
+ */
5
+ /**
6
+ * Get the post-install usage guidance message.
7
+ * @returns Usage guidance string for postinstall.
8
+ */
9
+ export declare function getPostInstallGuidance(): string;
10
+ /**
11
+ * Get the comprehensive help guidance message.
12
+ * @returns Full help guidance string.
13
+ */
14
+ export declare function getHelpGuidance(): string;
15
+ /**
16
+ * Help command handler.
17
+ * Prints comprehensive how-to guidance.
18
+ */
19
+ export declare function helpCommand(): void;
20
+ //# sourceMappingURL=help.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAwDH;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CA0C/C;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,MAAM,CA2HxC;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAoGH;;GAEG;AACH,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAU5C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgHH;;GAEG;AACH,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAU5C"}
@@ -1 +1 @@
1
- {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmBH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,mDAAmD;IACnD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AA2DD;;;GAGG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAmFxE"}
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmBH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,mDAAmD;IACnD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AA+DD;;;GAGG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAmFxE"}
package/dist/cli.js CHANGED
@@ -1,11 +1,13 @@
1
1
  #!/usr/bin/env node
2
- import { getLogger, getConfig, getQaTools, registerTools, getLocalQaTools, createUnifiedMcpServer, startStdioServer, getElectronAppVersion, getDownloadBaseUrl, getElectronAppDir, isElectronAppInstalled, getElectronAppChecksums, performLogin, performLogout, getAuthStatus, getDataDir, getBundledElectronAppVersion, getElectronAppVersionSource, getCredentialsFilePath, __require } from './chunk-IGLYJZH6.js';
3
- import { Command } from 'commander';
2
+ import { getLogger, getConfig, getQaTools, registerTools, getLocalQaTools, createUnifiedMcpServer, startStdioServer, getElectronAppVersion, getDownloadBaseUrl, getElectronAppDir, isElectronAppInstalled, getElectronAppChecksums, performLogin, performLogout, getAuthStatus, getDataDir, getBundledElectronAppVersion, getElectronAppVersionSource, getCredentialsFilePath, __require } from './chunk-DX2A2FVG.js';
4
3
  import * as fs from 'fs';
5
- import { existsSync, rmSync, mkdirSync, createWriteStream, readdirSync, writeFileSync, statSync } from 'fs';
4
+ import { readFileSync, existsSync, rmSync, mkdirSync, createWriteStream, readdirSync, writeFileSync, statSync } from 'fs';
6
5
  import * as path2 from 'path';
6
+ import { dirname, resolve } from 'path';
7
+ import { fileURLToPath } from 'url';
8
+ import { Command } from 'commander';
7
9
  import { exec } from 'child_process';
8
- import { platform } from 'os';
10
+ import { platform, arch } from 'os';
9
11
  import { pipeline } from 'stream/promises';
10
12
  import * as crypto from 'crypto';
11
13
 
@@ -399,10 +401,10 @@ async function serveCommand(options) {
399
401
  var logger5 = getLogger();
400
402
  function getPlatformKey() {
401
403
  const os = platform();
402
- const arch = process.arch;
404
+ const arch2 = process.arch;
403
405
  switch (os) {
404
406
  case "darwin":
405
- return arch === "arm64" ? "darwin-arm64" : "darwin-x64";
407
+ return arch2 === "arm64" ? "darwin-arm64" : "darwin-x64";
406
408
  case "win32":
407
409
  return "win32-x64";
408
410
  case "linux":
@@ -412,14 +414,14 @@ function getPlatformKey() {
412
414
  }
413
415
  }
414
416
  async function calculateFileChecksum(filePath) {
415
- return new Promise((resolve, reject) => {
417
+ return new Promise((resolve2, reject) => {
416
418
  const hash = crypto.createHash("sha256");
417
419
  const stream = fs.createReadStream(filePath);
418
420
  stream.on("data", (data) => {
419
421
  hash.update(data);
420
422
  });
421
423
  stream.on("end", () => {
422
- resolve(hash.digest("hex"));
424
+ resolve2(hash.digest("hex"));
423
425
  });
424
426
  stream.on("error", (error) => {
425
427
  reject(error);
@@ -487,36 +489,39 @@ function getChecksumForPlatform(checksums) {
487
489
  var logger6 = getLogger();
488
490
  function getBinaryName() {
489
491
  const os = platform();
492
+ const architecture = arch();
490
493
  switch (os) {
491
- case "darwin":
492
- return "muggle-test-darwin-arm64.zip";
494
+ case "darwin": {
495
+ const darwinArch = architecture === "arm64" ? "arm64" : "x64";
496
+ return `MuggleAI-darwin-${darwinArch}.zip`;
497
+ }
493
498
  case "win32":
494
- return "muggle-test-win32-x64.zip";
499
+ return "MuggleAI-win32-x64.zip";
495
500
  case "linux":
496
- return "muggle-test-linux-x64.tar.gz";
501
+ return "MuggleAI-linux-x64.zip";
497
502
  default:
498
503
  throw new Error(`Unsupported platform: ${os}`);
499
504
  }
500
505
  }
501
506
  async function extractZip(zipPath, destDir) {
502
- return new Promise((resolve, reject) => {
507
+ return new Promise((resolve2, reject) => {
503
508
  const cmd = platform() === "win32" ? `powershell -command "Expand-Archive -Path '${zipPath}' -DestinationPath '${destDir}' -Force"` : `unzip -o "${zipPath}" -d "${destDir}"`;
504
509
  exec(cmd, (error) => {
505
510
  if (error) {
506
511
  reject(error);
507
512
  } else {
508
- resolve();
513
+ resolve2();
509
514
  }
510
515
  });
511
516
  });
512
517
  }
513
518
  async function extractTarGz(tarPath, destDir) {
514
- return new Promise((resolve, reject) => {
519
+ return new Promise((resolve2, reject) => {
515
520
  exec(`tar -xzf "${tarPath}" -C "${destDir}"`, (error) => {
516
521
  if (error) {
517
522
  reject(error);
518
523
  } else {
519
- resolve();
524
+ resolve2();
520
525
  }
521
526
  });
522
527
  });
@@ -531,7 +536,7 @@ async function setupCommand(options) {
531
536
  return;
532
537
  }
533
538
  const binaryName = getBinaryName();
534
- const downloadUrl = `${baseUrl}/electron-app-v${version}/${binaryName}`;
539
+ const downloadUrl = `${baseUrl}/v${version}/${binaryName}`;
535
540
  console.log(`Downloading Muggle Test Electron app v${version}...`);
536
541
  console.log(`URL: ${downloadUrl}`);
537
542
  try {
@@ -588,10 +593,10 @@ var GITHUB_RELEASES_API = "https://api.github.com/repos/multiplex-ai/muggle-ai-m
588
593
  var VERSION_OVERRIDE_FILE = "electron-app-version-override.json";
589
594
  function getBinaryName2() {
590
595
  const os = platform();
591
- const arch = process.arch;
596
+ const arch2 = process.arch;
592
597
  switch (os) {
593
598
  case "darwin":
594
- return arch === "arm64" ? "MuggleAI-darwin-arm64.zip" : "MuggleAI-darwin-x64.zip";
599
+ return arch2 === "arm64" ? "MuggleAI-darwin-arm64.zip" : "MuggleAI-darwin-x64.zip";
595
600
  case "win32":
596
601
  return "MuggleAI-win32-x64.zip";
597
602
  case "linux":
@@ -688,24 +693,24 @@ function compareVersions2(a, b) {
688
693
  return 0;
689
694
  }
690
695
  async function extractZip2(zipPath, destDir) {
691
- return new Promise((resolve, reject) => {
696
+ return new Promise((resolve2, reject) => {
692
697
  const cmd = platform() === "win32" ? `powershell -command "Expand-Archive -Path '${zipPath}' -DestinationPath '${destDir}' -Force"` : `unzip -o "${zipPath}" -d "${destDir}"`;
693
698
  exec(cmd, (error) => {
694
699
  if (error) {
695
700
  reject(error);
696
701
  } else {
697
- resolve();
702
+ resolve2();
698
703
  }
699
704
  });
700
705
  });
701
706
  }
702
707
  async function extractTarGz2(tarPath, destDir) {
703
- return new Promise((resolve, reject) => {
708
+ return new Promise((resolve2, reject) => {
704
709
  exec(`tar -xzf "${tarPath}" -C "${destDir}"`, (error) => {
705
710
  if (error) {
706
711
  reject(error);
707
712
  } else {
708
- resolve();
713
+ resolve2();
709
714
  }
710
715
  });
711
716
  });
@@ -859,10 +864,14 @@ Cleaned up ${cleanupResult.removed.length} old version(s), freed ${formatBytes(c
859
864
  }
860
865
 
861
866
  // src/cli/index.ts
867
+ var __dirname$1 = dirname(fileURLToPath(import.meta.url));
868
+ var packageVersion = JSON.parse(
869
+ readFileSync(resolve(__dirname$1, "..", "package.json"), "utf-8")
870
+ ).version;
862
871
  var logger8 = getLogger();
863
872
  function createProgram() {
864
873
  const program = new Command();
865
- program.name("muggle-mcp").description("Unified MCP server for Muggle AI - Cloud QA and Local Testing").version("1.0.0");
874
+ program.name("muggle-mcp").description("Unified MCP server for Muggle AI - Cloud QA and Local Testing").version(packageVersion);
866
875
  program.command("serve").description("Start the MCP server").option("--qa", "Only enable Cloud QA tools").option("--local", "Only enable Local QA tools").option("--stdio", "Use stdio transport (default)").action(serveCommand);
867
876
  program.command("setup").description("Download/update the Electron app for local testing").option("--force", "Force re-download even if already installed").action(setupCommand);
868
877
  program.command("upgrade").description("Check for and install the latest electron-app version").option("--force", "Force re-download even if already on latest").option("--check", "Check for updates only, don't download").option("--version <version>", "Download a specific version (e.g., 1.0.2)").action(upgradeCommand);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/cleanup.ts","../src/cli/doctor.ts","../src/cli/login.ts","../src/cli/serve.ts","../src/shared/checksum.ts","../src/cli/setup.ts","../src/cli/upgrade.ts","../src/cli/index.ts","../src/cli/main.ts"],"names":["path","logger","existsSync","platform","rmSync","getBinaryName","path3","mkdirSync","compareVersions","extractZip","exec","extractTarGz","createWriteStream","pipeline","cleanupResult"],"mappings":"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","file":"cli.js","sourcesContent":["/**\n * Cleanup command - removes old electron-app versions to free disk space.\n */\n\nimport { existsSync, readdirSync, rmSync, statSync } from \"fs\";\nimport * as path from \"path\";\n\nimport { getDataDir, getElectronAppVersion } from \"../shared/config.js\";\nimport { getLogger } from \"../shared/logger.js\";\n\nconst logger = getLogger();\n\n/** Subdirectory name for electron-app versions. */\nconst ELECTRON_APP_DIR = \"electron-app\";\n\n/**\n * Options for the cleanup command.\n */\nexport interface ICleanupOptions {\n /** Remove all versions except current (default: keep current + 1 previous). */\n all?: boolean;\n /** Dry run - show what would be deleted without deleting. */\n dryRun?: boolean;\n}\n\n/**\n * Installed version info.\n */\nexport interface IInstalledVersion {\n /** Version string. */\n version: string;\n /** Full path to version directory. */\n path: string;\n /** Size in bytes. */\n sizeBytes: number;\n /** Whether this is the current active version. */\n isCurrent: boolean;\n}\n\n/**\n * Get the electron-app base directory.\n * @returns Path to ~/.muggle-ai/electron-app\n */\nfunction getElectronAppBaseDir(): string {\n return path.join(getDataDir(), ELECTRON_APP_DIR);\n}\n\n/**\n * Calculate directory size recursively.\n * @param dirPath - Path to directory.\n * @returns Size in bytes.\n */\nfunction getDirectorySize(dirPath: string): number {\n let totalSize = 0;\n\n try {\n const entries = readdirSync(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dirPath, entry.name);\n\n if (entry.isDirectory()) {\n totalSize += getDirectorySize(fullPath);\n } else if (entry.isFile()) {\n try {\n const stats = statSync(fullPath);\n totalSize += stats.size;\n } catch {\n // Skip files we can't stat\n }\n }\n }\n } catch {\n // Return 0 if we can't read the directory\n }\n\n return totalSize;\n}\n\n/**\n * Format bytes as human-readable string.\n * @param bytes - Size in bytes.\n * @returns Formatted string (e.g., \"150 MB\").\n */\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) {\n return \"0 B\";\n }\n\n const units = [\"B\", \"KB\", \"MB\", \"GB\"];\n const k = 1024;\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n const size = bytes / Math.pow(k, i);\n\n return `${size.toFixed(1)} ${units[i]}`;\n}\n\n/**\n * Compare semver versions.\n * @param a - First version.\n * @param b - Second version.\n * @returns Negative if a < b, positive if a > b, 0 if equal.\n */\nfunction compareVersions(a: string, b: string): number {\n const partsA = a.split(\".\").map(Number);\n const partsB = b.split(\".\").map(Number);\n\n for (let i = 0; i < 3; i++) {\n const partA = partsA[i] || 0;\n const partB = partsB[i] || 0;\n\n if (partA !== partB) {\n return partA - partB;\n }\n }\n\n return 0;\n}\n\n/**\n * List all installed electron-app versions.\n * @returns Array of installed version info, sorted by version descending.\n */\nexport function listInstalledVersions(): IInstalledVersion[] {\n const baseDir = getElectronAppBaseDir();\n const currentVersion = getElectronAppVersion();\n const versions: IInstalledVersion[] = [];\n\n if (!existsSync(baseDir)) {\n return versions;\n }\n\n try {\n const entries = readdirSync(baseDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n\n // Check if directory name looks like a version (e.g., \"1.0.1\")\n if (!/^\\d+\\.\\d+\\.\\d+$/.test(entry.name)) {\n continue;\n }\n\n const versionPath = path.join(baseDir, entry.name);\n const sizeBytes = getDirectorySize(versionPath);\n\n versions.push({\n version: entry.name,\n path: versionPath,\n sizeBytes: sizeBytes,\n isCurrent: entry.name === currentVersion,\n });\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.warn(\"Failed to list installed versions\", { error: errorMessage });\n }\n\n // Sort by version descending (newest first)\n versions.sort((a, b) => compareVersions(b.version, a.version));\n\n return versions;\n}\n\n/**\n * Remove old electron-app versions.\n * @param options - Cleanup options.\n * @returns Object with removed versions and freed bytes.\n */\nexport function cleanupOldVersions(options: ICleanupOptions = {}): {\n removed: IInstalledVersion[];\n freedBytes: number;\n} {\n const { all = false, dryRun = false } = options;\n const versions = listInstalledVersions();\n const removed: IInstalledVersion[] = [];\n let freedBytes = 0;\n\n // Determine which versions to keep\n // - Always keep current version\n // - By default, also keep one previous version (for rollback)\n // - With --all, only keep current\n\n const versionsToKeep = all ? 1 : 2;\n let keptCount = 0;\n\n for (const version of versions) {\n if (version.isCurrent) {\n keptCount++;\n continue;\n }\n\n if (keptCount < versionsToKeep) {\n keptCount++;\n continue;\n }\n\n // This version should be removed\n if (!dryRun) {\n try {\n rmSync(version.path, { recursive: true, force: true });\n logger.info(\"Removed old version\", {\n version: version.version,\n freedBytes: version.sizeBytes,\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(\"Failed to remove version\", {\n version: version.version,\n error: errorMessage,\n });\n continue;\n }\n }\n\n removed.push(version);\n freedBytes += version.sizeBytes;\n }\n\n return { removed: removed, freedBytes: freedBytes };\n}\n\n/**\n * Execute the versions command - list installed versions.\n */\nexport async function versionsCommand(): Promise<void> {\n console.log(\"\\nInstalled Electron App Versions\");\n console.log(\"================================\\n\");\n\n const versions = listInstalledVersions();\n\n if (versions.length === 0) {\n console.log(\"No versions installed.\");\n console.log(\"Run 'muggle-mcp setup' to download the Electron app.\\n\");\n return;\n }\n\n let totalSize = 0;\n\n for (const version of versions) {\n const marker = version.isCurrent ? \" (current)\" : \"\";\n const size = formatBytes(version.sizeBytes);\n console.log(` v${version.version}${marker} - ${size}`);\n totalSize += version.sizeBytes;\n }\n\n console.log(\"\");\n console.log(`Total: ${versions.length} version(s), ${formatBytes(totalSize)}`);\n console.log(\"\");\n}\n\n/**\n * Execute the cleanup command.\n * @param options - Command options.\n */\nexport async function cleanupCommand(options: ICleanupOptions): Promise<void> {\n console.log(\"\\nElectron App Cleanup\");\n console.log(\"====================\\n\");\n\n const versions = listInstalledVersions();\n\n if (versions.length === 0) {\n console.log(\"No versions installed. Nothing to clean up.\\n\");\n return;\n }\n\n if (versions.length === 1) {\n console.log(\"Only the current version is installed. Nothing to clean up.\\n\");\n return;\n }\n\n const currentVersion = versions.find((v) => v.isCurrent);\n const oldVersions = versions.filter((v) => !v.isCurrent);\n\n console.log(`Current version: v${currentVersion?.version || \"unknown\"}`);\n console.log(`Old versions: ${oldVersions.length}`);\n console.log(\"\");\n\n if (options.dryRun) {\n console.log(\"Dry run - showing what would be deleted:\\n\");\n }\n\n const result = cleanupOldVersions(options);\n\n if (result.removed.length === 0) {\n if (options.all) {\n console.log(\"No old versions to remove.\\n\");\n } else {\n console.log(\"Keeping one previous version for rollback.\");\n console.log(\"Use --all to remove all old versions.\\n\");\n }\n return;\n }\n\n console.log(options.dryRun ? \"Would remove:\" : \"Removed:\");\n\n for (const version of result.removed) {\n console.log(` v${version.version} (${formatBytes(version.sizeBytes)})`);\n }\n\n console.log(\"\");\n console.log(\n `${options.dryRun ? \"Would free\" : \"Freed\"}: ${formatBytes(result.freedBytes)}`,\n );\n console.log(\"\");\n\n if (options.dryRun) {\n console.log(\"Run without --dry-run to actually delete.\\n\");\n }\n\n logger.info(\"Cleanup completed\", {\n removed: result.removed.length,\n freedBytes: result.freedBytes,\n dryRun: options.dryRun,\n });\n}\n","/**\n * Doctor command - diagnoses installation and configuration issues.\n */\n\nimport { existsSync } from \"fs\";\n\nimport {\n getBundledElectronAppVersion,\n getConfig,\n getDataDir,\n getElectronAppVersion,\n getElectronAppVersionSource,\n isElectronAppInstalled,\n} from \"../shared/config.js\";\nimport { getAuthStatus, getCredentialsFilePath } from \"../shared/credentials.js\";\nimport { getLogger } from \"../shared/logger.js\";\n\nconst logger = getLogger();\n\n/**\n * Check result with status indicator.\n */\ninterface ICheckResult {\n /** Check name. */\n name: string;\n /** Whether check passed. */\n passed: boolean;\n /** Description of the result. */\n description: string;\n /** Suggestion to fix (if failed). */\n suggestion?: string;\n}\n\n/**\n * Run all diagnostic checks.\n * @returns Array of check results.\n */\nfunction runDiagnostics(): ICheckResult[] {\n const results: ICheckResult[] = [];\n const config = getConfig();\n\n // Check 1: Data directory exists\n const dataDir = getDataDir();\n results.push({\n name: \"Data Directory\",\n passed: existsSync(dataDir),\n description: existsSync(dataDir) ? `Found at ${dataDir}` : `Not found at ${dataDir}`,\n suggestion: \"Run 'muggle-mcp login' to create the data directory\",\n });\n\n // Check 2: Electron app installed\n const electronInstalled = isElectronAppInstalled();\n const electronVersion = getElectronAppVersion();\n const bundledVersion = getBundledElectronAppVersion();\n const versionSource = getElectronAppVersionSource();\n\n let electronDescription: string;\n if (electronInstalled) {\n electronDescription = `Installed (v${electronVersion})`;\n switch (versionSource) {\n case \"env\":\n electronDescription += ` [from ELECTRON_APP_VERSION env]`;\n break;\n case \"override\":\n electronDescription += ` [upgraded from bundled v${bundledVersion}]`;\n break;\n default:\n break;\n }\n } else {\n electronDescription = `Not installed (expected v${electronVersion})`;\n }\n\n results.push({\n name: \"Electron App\",\n passed: electronInstalled,\n description: electronDescription,\n suggestion: \"Run 'muggle-mcp setup' to download the Electron app\",\n });\n\n // Check 2b: Upgrade available hint\n if (electronInstalled) {\n results.push({\n name: \"Electron App Updates\",\n passed: true,\n description: \"Run 'muggle-mcp upgrade --check' to check for updates\",\n });\n }\n\n // Check 3: Authentication status\n const authStatus = getAuthStatus();\n results.push({\n name: \"Authentication\",\n passed: authStatus.authenticated,\n description: authStatus.authenticated\n ? `Authenticated as ${authStatus.email || \"unknown\"}`\n : \"Not authenticated\",\n suggestion: \"Run 'muggle-mcp login' to authenticate\",\n });\n\n // Check 4: API key available\n results.push({\n name: \"API Key\",\n passed: authStatus.hasApiKey,\n description: authStatus.hasApiKey ? \"API key stored\" : \"No API key stored\",\n suggestion: \"Run 'muggle-mcp login' to generate an API key\",\n });\n\n // Check 5: Credentials file\n const credentialsPath = getCredentialsFilePath();\n results.push({\n name: \"Credentials File\",\n passed: existsSync(credentialsPath),\n description: existsSync(credentialsPath)\n ? `Found at ${credentialsPath}`\n : `Not found at ${credentialsPath}`,\n suggestion: \"Run 'muggle-mcp login' to create credentials\",\n });\n\n // Check 6: Prompt service URL\n results.push({\n name: \"Prompt Service URL\",\n passed: !!config.qa.promptServiceBaseUrl,\n description: config.qa.promptServiceBaseUrl,\n });\n\n // Check 7: Web service URL (for local testing)\n results.push({\n name: \"Web Service URL\",\n passed: !!config.localQa.webServiceUrl,\n description: config.localQa.webServiceUrl,\n });\n\n return results;\n}\n\n/**\n * Format a check result for display.\n * @param result - Check result.\n * @returns Formatted string.\n */\nfunction formatCheckResult(result: ICheckResult): string {\n const icon = result.passed ? \"✓\" : \"✗\";\n const color = result.passed ? \"\\x1b[32m\" : \"\\x1b[31m\"; // Green or Red\n const reset = \"\\x1b[0m\";\n\n let output = `${color}${icon}${reset} ${result.name}: ${result.description}`;\n\n if (!result.passed && result.suggestion) {\n output += `\\n └─ ${result.suggestion}`;\n }\n\n return output;\n}\n\n/**\n * Execute the doctor command.\n */\nexport async function doctorCommand(): Promise<void> {\n console.log(\"\\nMuggle MCP Doctor\");\n console.log(\"=================\\n\");\n\n const results = runDiagnostics();\n\n for (const result of results) {\n console.log(formatCheckResult(result));\n }\n\n console.log(\"\");\n\n const failedCount = results.filter((r) => !r.passed).length;\n\n if (failedCount === 0) {\n console.log(\"All checks passed! Your installation is ready.\");\n } else {\n console.log(`${failedCount} issue(s) found. See suggestions above.`);\n }\n\n logger.info(\"Doctor command completed\", {\n totalChecks: results.length,\n passed: results.length - failedCount,\n failed: failedCount,\n });\n}\n","/**\n * Login/logout/status commands for authentication.\n */\n\nimport { performLogin, performLogout } from \"../shared/auth.js\";\nimport { getAuthStatus } from \"../shared/credentials.js\";\nimport { getLogger } from \"../shared/logger.js\";\n\nconst logger = getLogger();\n\n/**\n * Options for the login command.\n */\nexport interface ILoginOptions {\n /** Name for the API key. */\n keyName?: string;\n /** API key expiry: 30d, 90d, 1y, never. */\n keyExpiry?: string;\n}\n\n/**\n * Execute the login command.\n * @param options - Command options.\n */\nexport async function loginCommand(options: ILoginOptions): Promise<void> {\n console.log(\"\\nMuggle AI Login\");\n console.log(\"===============\\n\");\n\n const expiry = (options.keyExpiry || \"90d\") as \"30d\" | \"90d\" | \"1y\" | \"never\";\n\n console.log(\"Starting device code authentication...\");\n console.log(\"A browser window will open for you to complete login.\\n\");\n\n const result = await performLogin(options.keyName, expiry);\n\n if (result.success) {\n console.log(\"✓ Login successful!\");\n\n if (result.credentials?.email) {\n console.log(` Logged in as: ${result.credentials.email}`);\n }\n\n if (result.credentials?.apiKey) {\n console.log(\" API key created and stored for future use.\");\n }\n\n console.log(\"\\nYou can now use Muggle AI MCP tools.\");\n } else {\n console.error(\"✗ Login failed\");\n\n if (result.error) {\n console.error(` Error: ${result.error}`);\n }\n\n if (result.deviceCodeResponse) {\n console.log(\"\\nIf browser didn't open, visit:\");\n console.log(` ${result.deviceCodeResponse.verificationUriComplete}`);\n console.log(` Code: ${result.deviceCodeResponse.userCode}`);\n }\n\n process.exit(1);\n }\n}\n\n/**\n * Execute the logout command.\n */\nexport async function logoutCommand(): Promise<void> {\n console.log(\"\\nLogging out...\");\n\n performLogout();\n\n console.log(\"✓ Credentials cleared successfully.\");\n logger.info(\"Logout completed\");\n}\n\n/**\n * Execute the status command.\n */\nexport async function statusCommand(): Promise<void> {\n console.log(\"\\nAuthentication Status\");\n console.log(\"=====================\\n\");\n\n const status = getAuthStatus();\n\n if (status.authenticated) {\n console.log(\"✓ Authenticated\");\n\n if (status.email) {\n console.log(` Email: ${status.email}`);\n }\n\n if (status.userId) {\n console.log(` User ID: ${status.userId}`);\n }\n\n if (status.expiresAt) {\n const expiresDate = new Date(status.expiresAt);\n console.log(` Token expires: ${expiresDate.toLocaleString()}`);\n }\n\n console.log(` API Key: ${status.hasApiKey ? \"Yes\" : \"No\"}`);\n } else {\n console.log(\"✗ Not authenticated\");\n console.log(\"\\nRun 'muggle-mcp login' to authenticate.\");\n }\n}\n","/**\n * Serve command - starts the MCP server.\n */\n\nimport { getLocalQaTools } from \"../local-qa/index.js\";\nimport { getQaTools } from \"../qa/index.js\";\nimport { getConfig } from \"../shared/config.js\";\nimport { getLogger } from \"../shared/logger.js\";\nimport { createUnifiedMcpServer, registerTools, startStdioServer } from \"../server/index.js\";\n\nconst logger = getLogger();\n\n/**\n * Options for the serve command.\n */\nexport interface IServeOptions {\n /** Only enable Cloud QA tools. */\n qa?: boolean;\n /** Only enable Local QA tools. */\n local?: boolean;\n /** Use stdio transport. */\n stdio?: boolean;\n}\n\n/**\n * Execute the serve command.\n * @param options - Command options.\n */\nexport async function serveCommand(options: IServeOptions): Promise<void> {\n const config = getConfig();\n\n // Determine which tool sets to enable\n const enableQa = options.local ? false : true;\n const enableLocal = options.qa ? false : true;\n\n logger.info(\"Starting Muggle MCP Server\", {\n version: config.serverVersion,\n enableQa: enableQa,\n enableLocal: enableLocal,\n transport: \"stdio\",\n });\n\n try {\n // Register tools based on options\n if (enableQa) {\n const qaTools = getQaTools();\n registerTools(qaTools);\n logger.info(\"Registered QA tools\", { count: qaTools.length });\n }\n\n if (enableLocal) {\n const localTools = getLocalQaTools();\n registerTools(localTools);\n logger.info(\"Registered Local QA tools\", { count: localTools.length });\n }\n\n // Create unified MCP server\n const mcpServer = createUnifiedMcpServer({\n enableQaTools: enableQa,\n enableLocalTools: enableLocal,\n });\n\n // Start stdio server (MCP clients communicate via stdin/stdout)\n await startStdioServer(mcpServer);\n\n logger.info(\"MCP server started successfully\");\n } catch (error) {\n logger.error(\"Failed to start MCP server\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n });\n process.exit(1);\n }\n}\n","/**\n * Checksum verification utilities for downloaded binaries.\n * Uses SHA256 for integrity verification.\n */\n\nimport * as crypto from \"crypto\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { platform } from \"os\";\n\nimport { getLogger } from \"./logger.js\";\n\nconst logger = getLogger();\n\n/**\n * Platform key for checksum lookup.\n */\nexport type PlatformKey = \"darwin-arm64\" | \"darwin-x64\" | \"win32-x64\" | \"linux-x64\";\n\n/**\n * Checksums map from package.json muggleConfig.\n */\nexport interface IChecksums {\n /** macOS ARM64 (Apple Silicon) checksum. */\n \"darwin-arm64\"?: string;\n /** macOS x64 (Intel) checksum. */\n \"darwin-x64\"?: string;\n /** Windows x64 checksum. */\n \"win32-x64\"?: string;\n /** Linux x64 checksum. */\n \"linux-x64\"?: string;\n}\n\n/**\n * Result of checksum verification.\n */\nexport interface IChecksumResult {\n /** Whether verification passed. */\n valid: boolean;\n /** Expected checksum (from config or release). */\n expected: string;\n /** Actual checksum of downloaded file. */\n actual: string;\n /** Error message if verification failed. */\n error?: string;\n}\n\n/**\n * Get the platform key for the current system.\n * @returns The platform key for checksum lookup.\n */\nexport function getPlatformKey(): PlatformKey {\n const os = platform();\n const arch = process.arch;\n\n switch (os) {\n case \"darwin\":\n return arch === \"arm64\" ? \"darwin-arm64\" : \"darwin-x64\";\n case \"win32\":\n return \"win32-x64\";\n case \"linux\":\n return \"linux-x64\";\n default:\n throw new Error(`Unsupported platform: ${os}`);\n }\n}\n\n/**\n * Calculate SHA256 checksum of a file.\n * @param filePath - Path to the file.\n * @returns The SHA256 checksum as a hex string.\n */\nexport async function calculateFileChecksum(filePath: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const hash = crypto.createHash(\"sha256\");\n const stream = fs.createReadStream(filePath);\n\n stream.on(\"data\", (data) => {\n hash.update(data);\n });\n\n stream.on(\"end\", () => {\n resolve(hash.digest(\"hex\"));\n });\n\n stream.on(\"error\", (error) => {\n reject(error);\n });\n });\n}\n\n/**\n * Verify file checksum against expected value.\n * @param filePath - Path to the file to verify.\n * @param expectedChecksum - Expected SHA256 checksum.\n * @returns Verification result.\n */\nexport async function verifyFileChecksum(\n filePath: string,\n expectedChecksum: string,\n): Promise<IChecksumResult> {\n if (!expectedChecksum || expectedChecksum.trim() === \"\") {\n logger.warn(\"Checksum verification skipped - no checksum provided\", {\n file: path.basename(filePath),\n });\n return {\n valid: true,\n expected: \"\",\n actual: \"\",\n error: \"Checksum verification skipped - no checksum configured\",\n };\n }\n\n try {\n const actualChecksum = await calculateFileChecksum(filePath);\n const normalizedExpected = expectedChecksum.toLowerCase().trim();\n const normalizedActual = actualChecksum.toLowerCase();\n\n const valid = normalizedExpected === normalizedActual;\n\n if (!valid) {\n logger.error(\"Checksum verification failed\", {\n file: path.basename(filePath),\n expected: normalizedExpected,\n actual: normalizedActual,\n });\n } else {\n logger.info(\"Checksum verified successfully\", {\n file: path.basename(filePath),\n checksum: normalizedActual,\n });\n }\n\n return {\n valid: valid,\n expected: normalizedExpected,\n actual: normalizedActual,\n error: valid ? undefined : \"Checksum mismatch - file may be corrupted or tampered with\",\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(\"Checksum calculation failed\", {\n file: path.basename(filePath),\n error: errorMessage,\n });\n\n return {\n valid: false,\n expected: expectedChecksum,\n actual: \"\",\n error: `Failed to calculate checksum: ${errorMessage}`,\n };\n }\n}\n\n/**\n * Get checksum for current platform from checksums map.\n * @param checksums - Checksums map from config.\n * @returns Checksum for current platform, or empty string if not found.\n */\nexport function getChecksumForPlatform(checksums: IChecksums | undefined): string {\n if (!checksums) {\n return \"\";\n }\n\n const platformKey = getPlatformKey();\n return checksums[platformKey] || \"\";\n}\n","/**\n * Setup command - downloads/updates the Electron app.\n */\n\nimport { exec } from \"child_process\";\nimport { createWriteStream, existsSync, mkdirSync, rmSync } from \"fs\";\nimport { platform } from \"os\";\nimport { pipeline } from \"stream/promises\";\n\nimport {\n getDownloadBaseUrl,\n getElectronAppChecksums,\n getElectronAppDir,\n getElectronAppVersion,\n isElectronAppInstalled,\n} from \"../shared/config.js\";\nimport { getChecksumForPlatform, verifyFileChecksum } from \"../shared/checksum.js\";\nimport { getLogger } from \"../shared/logger.js\";\n\nconst logger = getLogger();\n\n/**\n * Options for the setup command.\n */\nexport interface ISetupOptions {\n /** Force re-download even if already installed. */\n force?: boolean;\n}\n\n/**\n * Get platform-specific binary name.\n * @returns Binary filename.\n */\nfunction getBinaryName(): string {\n const os = platform();\n switch (os) {\n case \"darwin\":\n return \"muggle-test-darwin-arm64.zip\";\n case \"win32\":\n return \"muggle-test-win32-x64.zip\";\n case \"linux\":\n return \"muggle-test-linux-x64.tar.gz\";\n default:\n throw new Error(`Unsupported platform: ${os}`);\n }\n}\n\n/**\n * Extract a zip file.\n * @param zipPath - Path to zip file.\n * @param destDir - Destination directory.\n */\nasync function extractZip(zipPath: string, destDir: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const cmd =\n platform() === \"win32\"\n ? `powershell -command \"Expand-Archive -Path '${zipPath}' -DestinationPath '${destDir}' -Force\"`\n : `unzip -o \"${zipPath}\" -d \"${destDir}\"`;\n\n exec(cmd, (error) => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n });\n}\n\n/**\n * Extract a tar.gz file.\n * @param tarPath - Path to tar.gz file.\n * @param destDir - Destination directory.\n */\nasync function extractTarGz(tarPath: string, destDir: string): Promise<void> {\n return new Promise((resolve, reject) => {\n exec(`tar -xzf \"${tarPath}\" -C \"${destDir}\"`, (error) => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n });\n}\n\n/**\n * Execute the setup command.\n * @param options - Command options.\n */\nexport async function setupCommand(options: ISetupOptions): Promise<void> {\n const version = getElectronAppVersion();\n const baseUrl = getDownloadBaseUrl();\n const versionDir = getElectronAppDir(version);\n\n // Check if already installed\n if (!options.force && isElectronAppInstalled()) {\n console.log(`Electron app v${version} is already installed at ${versionDir}`);\n console.log(\"Use --force to re-download.\");\n return;\n }\n\n const binaryName = getBinaryName();\n const downloadUrl = `${baseUrl}/electron-app-v${version}/${binaryName}`;\n\n console.log(`Downloading Muggle Test Electron app v${version}...`);\n console.log(`URL: ${downloadUrl}`);\n\n try {\n // Create directory\n if (existsSync(versionDir)) {\n rmSync(versionDir, { recursive: true, force: true });\n }\n mkdirSync(versionDir, { recursive: true });\n\n // Download\n const response = await fetch(downloadUrl);\n if (!response.ok) {\n throw new Error(`Download failed: ${response.status} ${response.statusText}`);\n }\n\n const tempFile = `${versionDir}/${binaryName}`;\n const fileStream = createWriteStream(tempFile);\n\n if (!response.body) {\n throw new Error(\"No response body\");\n }\n\n await pipeline(response.body as unknown as NodeJS.ReadableStream, fileStream);\n\n console.log(\"Download complete, verifying checksum...\");\n\n // Verify checksum\n const checksums = getElectronAppChecksums();\n const expectedChecksum = getChecksumForPlatform(checksums);\n const checksumResult = await verifyFileChecksum(tempFile, expectedChecksum);\n\n if (!checksumResult.valid && expectedChecksum) {\n rmSync(versionDir, { recursive: true, force: true });\n throw new Error(\n `Checksum verification failed!\\n` +\n `Expected: ${checksumResult.expected}\\n` +\n `Actual: ${checksumResult.actual}\\n` +\n `The downloaded file may be corrupted or tampered with.`,\n );\n }\n\n if (expectedChecksum) {\n console.log(\"Checksum verified successfully.\");\n } else {\n console.log(\"Warning: No checksum configured, skipping verification.\");\n }\n\n console.log(\"Extracting...\");\n\n // Extract based on file type\n if (binaryName.endsWith(\".zip\")) {\n await extractZip(tempFile, versionDir);\n } else if (binaryName.endsWith(\".tar.gz\")) {\n await extractTarGz(tempFile, versionDir);\n }\n\n // Clean up temp file\n rmSync(tempFile, { force: true });\n\n console.log(`Electron app installed to ${versionDir}`);\n logger.info(\"Setup complete\", { version: version, path: versionDir });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`Failed to download Electron app: ${errorMessage}`);\n logger.error(\"Setup failed\", { error: errorMessage });\n process.exit(1);\n }\n}\n","/**\n * Upgrade command - checks for and downloads the latest electron-app version.\n * Allows users to get newer electron-app versions independently of MCP updates.\n */\n\nimport { exec } from \"child_process\";\nimport { createWriteStream, existsSync, mkdirSync, rmSync, writeFileSync } from \"fs\";\nimport { platform } from \"os\";\nimport * as path from \"path\";\nimport { pipeline } from \"stream/promises\";\n\nimport {\n getDataDir,\n getDownloadBaseUrl,\n getElectronAppDir,\n getElectronAppVersion,\n} from \"../shared/config.js\";\nimport { getPlatformKey, verifyFileChecksum } from \"../shared/checksum.js\";\nimport { getLogger } from \"../shared/logger.js\";\nimport { cleanupOldVersions, formatBytes } from \"./cleanup.js\";\n\nconst logger = getLogger();\n\n/** GitHub API URL for releases. */\nconst GITHUB_RELEASES_API = \"https://api.github.com/repos/multiplex-ai/muggle-ai-mcp/releases\";\n\n/** Filename for storing the overridden electron-app version. */\nconst VERSION_OVERRIDE_FILE = \"electron-app-version-override.json\";\n\n/**\n * Options for the upgrade command.\n */\nexport interface IUpgradeOptions {\n /** Force re-download even if already on latest. */\n force?: boolean;\n /** Check for updates only, don't download. */\n check?: boolean;\n /** Specific version to download (e.g., \"1.0.2\"). */\n version?: string;\n}\n\n/**\n * Result of checking for updates.\n */\ninterface IUpdateCheckResult {\n /** Currently installed version. */\n currentVersion: string;\n /** Latest available version. */\n latestVersion: string;\n /** Whether an update is available. */\n updateAvailable: boolean;\n /** Download URL for the latest version. */\n downloadUrl?: string;\n}\n\n/**\n * Get platform-specific binary name.\n * @returns Binary filename.\n */\nfunction getBinaryName(): string {\n const os = platform();\n const arch = process.arch;\n\n switch (os) {\n case \"darwin\":\n return arch === \"arm64\"\n ? \"MuggleAI-darwin-arm64.zip\"\n : \"MuggleAI-darwin-x64.zip\";\n case \"win32\":\n return \"MuggleAI-win32-x64.zip\";\n case \"linux\":\n return \"MuggleAI-linux-x64.zip\";\n default:\n throw new Error(`Unsupported platform: ${os}`);\n }\n}\n\n/**\n * Extract version from release tag.\n * @param tag - Release tag (e.g., \"electron-app-v1.0.2\").\n * @returns Version string (e.g., \"1.0.2\") or null.\n */\nfunction extractVersionFromTag(tag: string): string | null {\n const match = tag.match(/^electron-app-v(\\d+\\.\\d+\\.\\d+)$/);\n return match ? match[1] : null;\n}\n\n/**\n * Get the path to the version override file.\n * @returns Path to the override file.\n */\nfunction getVersionOverridePath(): string {\n return path.join(getDataDir(), VERSION_OVERRIDE_FILE);\n}\n\n/**\n * Get the effective electron-app version (override or default).\n * @returns The version to use.\n */\nexport function getEffectiveElectronAppVersion(): string {\n const overridePath = getVersionOverridePath();\n\n if (existsSync(overridePath)) {\n try {\n const content = JSON.parse(require(\"fs\").readFileSync(overridePath, \"utf-8\"));\n if (content.version) {\n return content.version;\n }\n } catch {\n // Fall through to default\n }\n }\n\n return getElectronAppVersion();\n}\n\n/**\n * Save the version override.\n * @param version - Version to save.\n */\nfunction saveVersionOverride(version: string): void {\n const overridePath = getVersionOverridePath();\n const dataDir = getDataDir();\n\n if (!existsSync(dataDir)) {\n mkdirSync(dataDir, { recursive: true });\n }\n\n writeFileSync(overridePath, JSON.stringify({\n version: version,\n updatedAt: new Date().toISOString(),\n }, null, 2), \"utf-8\");\n}\n\n/**\n * Check for the latest electron-app version from GitHub releases.\n * @returns Update check result.\n */\nasync function checkForUpdates(): Promise<IUpdateCheckResult> {\n const currentVersion = getEffectiveElectronAppVersion();\n\n try {\n const response = await fetch(GITHUB_RELEASES_API, {\n headers: {\n \"Accept\": \"application/vnd.github.v3+json\",\n \"User-Agent\": \"muggle-mcp\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`GitHub API error: ${response.status} ${response.statusText}`);\n }\n\n const releases = await response.json() as Array<{\n tag_name: string;\n prerelease: boolean;\n draft: boolean;\n }>;\n\n // Find latest electron-app release (non-prerelease, non-draft)\n for (const release of releases) {\n if (release.prerelease || release.draft) {\n continue;\n }\n\n const version = extractVersionFromTag(release.tag_name);\n if (version) {\n const updateAvailable = compareVersions(version, currentVersion) > 0;\n const baseUrl = getDownloadBaseUrl();\n const binaryName = getBinaryName();\n\n return {\n currentVersion: currentVersion,\n latestVersion: version,\n updateAvailable: updateAvailable,\n downloadUrl: `${baseUrl}/electron-app-v${version}/${binaryName}`,\n };\n }\n }\n\n // No electron-app releases found\n return {\n currentVersion: currentVersion,\n latestVersion: currentVersion,\n updateAvailable: false,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.warn(\"Failed to check for updates\", { error: errorMessage });\n throw new Error(`Failed to check for updates: ${errorMessage}`);\n }\n}\n\n/**\n * Compare two semver versions.\n * @param a - First version.\n * @param b - Second version.\n * @returns 1 if a > b, -1 if a < b, 0 if equal.\n */\nfunction compareVersions(a: string, b: string): number {\n const partsA = a.split(\".\").map(Number);\n const partsB = b.split(\".\").map(Number);\n\n for (let i = 0; i < 3; i++) {\n const partA = partsA[i] || 0;\n const partB = partsB[i] || 0;\n\n if (partA > partB) {\n return 1;\n }\n if (partA < partB) {\n return -1;\n }\n }\n\n return 0;\n}\n\n/**\n * Extract a zip file.\n * @param zipPath - Path to zip file.\n * @param destDir - Destination directory.\n */\nasync function extractZip(zipPath: string, destDir: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const cmd =\n platform() === \"win32\"\n ? `powershell -command \"Expand-Archive -Path '${zipPath}' -DestinationPath '${destDir}' -Force\"`\n : `unzip -o \"${zipPath}\" -d \"${destDir}\"`;\n\n exec(cmd, (error) => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n });\n}\n\n/**\n * Extract a tar.gz file.\n * @param tarPath - Path to tar.gz file.\n * @param destDir - Destination directory.\n */\nasync function extractTarGz(tarPath: string, destDir: string): Promise<void> {\n return new Promise((resolve, reject) => {\n exec(`tar -xzf \"${tarPath}\" -C \"${destDir}\"`, (error) => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n });\n}\n\n/**\n * Fetch checksum for a specific version and platform from the release.\n * Looks for checksums.txt in the release assets.\n * @param version - Version to get checksum for.\n * @returns The checksum or empty string if not available.\n */\nasync function fetchChecksumFromRelease(version: string): Promise<string> {\n const baseUrl = getDownloadBaseUrl();\n const checksumUrl = `${baseUrl}/electron-app-v${version}/checksums.txt`;\n\n try {\n const response = await fetch(checksumUrl);\n if (!response.ok) {\n logger.warn(\"Checksums file not found in release\", { version: version });\n return \"\";\n }\n\n const text = await response.text();\n const binaryName = getBinaryName();\n const platformKey = getPlatformKey();\n\n // Parse checksums.txt format: \"checksum filename\" or \"checksum filename\"\n const lines = text.split(\"\\n\");\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) {\n continue;\n }\n\n // Match \"checksum filename\" or \"checksum filename\" format\n const match = trimmed.match(/^([a-fA-F0-9]{64})\\s+(.+)$/);\n if (match) {\n const checksum = match[1];\n const filename = match[2];\n\n // Check if this line is for our binary\n if (filename === binaryName || filename.includes(platformKey)) {\n logger.info(\"Found checksum in release\", {\n version: version,\n platform: platformKey,\n checksum: checksum.substring(0, 16) + \"...\",\n });\n return checksum;\n }\n }\n }\n\n logger.warn(\"Platform checksum not found in checksums.txt\", {\n version: version,\n platform: platformKey,\n });\n return \"\";\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.warn(\"Failed to fetch checksums from release\", {\n version: version,\n error: errorMessage,\n });\n return \"\";\n }\n}\n\n/**\n * Download and install a specific version.\n * @param version - Version to download.\n * @param downloadUrl - URL to download from.\n * @param checksum - Optional checksum to verify (if not provided, will fetch from release).\n */\nasync function downloadAndInstall(\n version: string,\n downloadUrl: string,\n checksum?: string,\n): Promise<void> {\n const versionDir = getElectronAppDir(version);\n const binaryName = getBinaryName();\n\n console.log(`Downloading Muggle Test Electron app v${version}...`);\n console.log(`URL: ${downloadUrl}`);\n\n // Create directory\n if (existsSync(versionDir)) {\n rmSync(versionDir, { recursive: true, force: true });\n }\n mkdirSync(versionDir, { recursive: true });\n\n // Download\n const response = await fetch(downloadUrl);\n if (!response.ok) {\n throw new Error(`Download failed: ${response.status} ${response.statusText}`);\n }\n\n const tempFile = path.join(versionDir, binaryName);\n const fileStream = createWriteStream(tempFile);\n\n if (!response.body) {\n throw new Error(\"No response body\");\n }\n\n await pipeline(response.body as unknown as NodeJS.ReadableStream, fileStream);\n\n console.log(\"Download complete, verifying checksum...\");\n\n // Get checksum (from parameter or fetch from release)\n let expectedChecksum = checksum;\n if (!expectedChecksum) {\n expectedChecksum = await fetchChecksumFromRelease(version);\n }\n\n // Verify checksum\n const checksumResult = await verifyFileChecksum(tempFile, expectedChecksum || \"\");\n\n if (!checksumResult.valid && expectedChecksum) {\n rmSync(versionDir, { recursive: true, force: true });\n throw new Error(\n `Checksum verification failed!\\n` +\n `Expected: ${checksumResult.expected}\\n` +\n `Actual: ${checksumResult.actual}\\n` +\n `The downloaded file may be corrupted or tampered with.`,\n );\n }\n\n if (expectedChecksum) {\n console.log(\"Checksum verified successfully.\");\n } else {\n console.log(\"Warning: No checksum available, skipping verification.\");\n }\n\n console.log(\"Extracting...\");\n\n // Extract based on file type\n if (binaryName.endsWith(\".zip\")) {\n await extractZip(tempFile, versionDir);\n } else if (binaryName.endsWith(\".tar.gz\")) {\n await extractTarGz(tempFile, versionDir);\n }\n\n // Clean up temp file\n rmSync(tempFile, { force: true });\n\n // Save version override\n saveVersionOverride(version);\n\n console.log(`Electron app v${version} installed to ${versionDir}`);\n logger.info(\"Upgrade complete\", { version: version, path: versionDir });\n}\n\n/**\n * Execute the upgrade command.\n * @param options - Command options.\n */\nexport async function upgradeCommand(options: IUpgradeOptions): Promise<void> {\n try {\n // If specific version requested\n if (options.version) {\n const baseUrl = getDownloadBaseUrl();\n const binaryName = getBinaryName();\n const downloadUrl = `${baseUrl}/electron-app-v${options.version}/${binaryName}`;\n\n await downloadAndInstall(options.version, downloadUrl);\n\n // Auto-cleanup old versions (keep current + 1 previous)\n const cleanupResult = cleanupOldVersions({ all: false });\n if (cleanupResult.removed.length > 0) {\n console.log(\n `\\nCleaned up ${cleanupResult.removed.length} old version(s), ` +\n `freed ${formatBytes(cleanupResult.freedBytes)}`,\n );\n }\n return;\n }\n\n // Check for updates\n console.log(\"Checking for updates...\");\n const result = await checkForUpdates();\n\n console.log(`Current version: ${result.currentVersion}`);\n console.log(`Latest version: ${result.latestVersion}`);\n\n if (options.check) {\n if (result.updateAvailable) {\n console.log(\"\\nUpdate available! Run 'muggle-mcp upgrade' to install.\");\n } else {\n console.log(\"\\nYou are on the latest version.\");\n }\n return;\n }\n\n if (!result.updateAvailable && !options.force) {\n console.log(\"\\nYou are already on the latest version.\");\n console.log(\"Use --force to re-download the current version.\");\n return;\n }\n\n if (!result.downloadUrl) {\n throw new Error(\"No download URL available\");\n }\n\n // Download and install\n await downloadAndInstall(result.latestVersion, result.downloadUrl);\n\n // Auto-cleanup old versions (keep current + 1 previous)\n const cleanupResult = cleanupOldVersions({ all: false });\n if (cleanupResult.removed.length > 0) {\n console.log(\n `\\nCleaned up ${cleanupResult.removed.length} old version(s), ` +\n `freed ${formatBytes(cleanupResult.freedBytes)}`,\n );\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`Upgrade failed: ${errorMessage}`);\n logger.error(\"Upgrade failed\", { error: errorMessage });\n process.exit(1);\n }\n}\n","/**\n * CLI entry point for @muggleai/mcp.\n * Provides commands for serving MCP, setup, diagnostics, and authentication.\n */\n\nimport { Command } from \"commander\";\n\nimport { getLogger } from \"../shared/logger.js\";\n\nimport { cleanupCommand, versionsCommand } from \"./cleanup.js\";\nimport { doctorCommand } from \"./doctor.js\";\nimport { loginCommand, logoutCommand, statusCommand } from \"./login.js\";\nimport { serveCommand } from \"./serve.js\";\nimport { setupCommand } from \"./setup.js\";\nimport { upgradeCommand } from \"./upgrade.js\";\n\nconst logger = getLogger();\n\n/**\n * Create and configure the CLI program.\n * @returns Configured Commander program.\n */\nfunction createProgram(): Command {\n const program = new Command();\n\n program\n .name(\"muggle-mcp\")\n .description(\"Unified MCP server for Muggle AI - Cloud QA and Local Testing\")\n .version(\"1.0.0\");\n\n // Serve command (main command)\n program\n .command(\"serve\")\n .description(\"Start the MCP server\")\n .option(\"--qa\", \"Only enable Cloud QA tools\")\n .option(\"--local\", \"Only enable Local QA tools\")\n .option(\"--stdio\", \"Use stdio transport (default)\")\n .action(serveCommand);\n\n // Setup command\n program\n .command(\"setup\")\n .description(\"Download/update the Electron app for local testing\")\n .option(\"--force\", \"Force re-download even if already installed\")\n .action(setupCommand);\n\n // Upgrade command\n program\n .command(\"upgrade\")\n .description(\"Check for and install the latest electron-app version\")\n .option(\"--force\", \"Force re-download even if already on latest\")\n .option(\"--check\", \"Check for updates only, don't download\")\n .option(\"--version <version>\", \"Download a specific version (e.g., 1.0.2)\")\n .action(upgradeCommand);\n\n // Versions command\n program\n .command(\"versions\")\n .description(\"List installed electron-app versions\")\n .action(versionsCommand);\n\n // Cleanup command\n program\n .command(\"cleanup\")\n .description(\"Remove old electron-app versions to free disk space\")\n .option(\"--all\", \"Remove all old versions (default: keep one previous)\")\n .option(\"--dry-run\", \"Show what would be deleted without deleting\")\n .action(cleanupCommand);\n\n // Doctor command\n program\n .command(\"doctor\")\n .description(\"Diagnose installation and configuration issues\")\n .action(doctorCommand);\n\n // Login command\n program\n .command(\"login\")\n .description(\"Authenticate with Muggle AI (uses device code flow)\")\n .option(\"--key-name <name>\", \"Name for the API key\")\n .option(\"--key-expiry <expiry>\", \"API key expiry: 30d, 90d, 1y, never\", \"90d\")\n .action(loginCommand);\n\n // Logout command\n program\n .command(\"logout\")\n .description(\"Clear stored credentials\")\n .action(logoutCommand);\n\n // Status command\n program\n .command(\"status\")\n .description(\"Show authentication status\")\n .action(statusCommand);\n\n // Default to serve when no command specified\n program.action(() => {\n serveCommand({ stdio: true });\n });\n\n return program;\n}\n\n/**\n * Run the CLI.\n */\nexport async function runCli(): Promise<void> {\n try {\n const program = createProgram();\n await program.parseAsync(process.argv);\n } catch (error) {\n logger.error(\"CLI error\", {\n error: error instanceof Error ? error.message : String(error),\n });\n process.exit(1);\n }\n}\n","#!/usr/bin/env node\n/**\n * CLI entry point for muggle-mcp.\n */\n\nimport { runCli } from \"./index.js\";\n\nrunCli().catch((error) => {\n console.error(\"Fatal error:\", error instanceof Error ? error.message : String(error));\n process.exit(1);\n});\n"]}
1
+ {"version":3,"sources":["../src/cli/cleanup.ts","../src/cli/doctor.ts","../src/cli/login.ts","../src/cli/serve.ts","../src/shared/checksum.ts","../src/cli/setup.ts","../src/cli/upgrade.ts","../src/cli/index.ts","../src/cli/main.ts"],"names":["path","logger","existsSync","arch","resolve","platform","rmSync","getBinaryName","path3","mkdirSync","compareVersions","extractZip","exec","extractTarGz","createWriteStream","pipeline","cleanupResult","__dirname"],"mappings":"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","file":"cli.js","sourcesContent":["/**\n * Cleanup command - removes old electron-app versions to free disk space.\n */\n\nimport { existsSync, readdirSync, rmSync, statSync } from \"fs\";\nimport * as path from \"path\";\n\nimport { getDataDir, getElectronAppVersion } from \"../shared/config.js\";\nimport { getLogger } from \"../shared/logger.js\";\n\nconst logger = getLogger();\n\n/** Subdirectory name for electron-app versions. */\nconst ELECTRON_APP_DIR = \"electron-app\";\n\n/**\n * Options for the cleanup command.\n */\nexport interface ICleanupOptions {\n /** Remove all versions except current (default: keep current + 1 previous). */\n all?: boolean;\n /** Dry run - show what would be deleted without deleting. */\n dryRun?: boolean;\n}\n\n/**\n * Installed version info.\n */\nexport interface IInstalledVersion {\n /** Version string. */\n version: string;\n /** Full path to version directory. */\n path: string;\n /** Size in bytes. */\n sizeBytes: number;\n /** Whether this is the current active version. */\n isCurrent: boolean;\n}\n\n/**\n * Get the electron-app base directory.\n * @returns Path to ~/.muggle-ai/electron-app\n */\nfunction getElectronAppBaseDir(): string {\n return path.join(getDataDir(), ELECTRON_APP_DIR);\n}\n\n/**\n * Calculate directory size recursively.\n * @param dirPath - Path to directory.\n * @returns Size in bytes.\n */\nfunction getDirectorySize(dirPath: string): number {\n let totalSize = 0;\n\n try {\n const entries = readdirSync(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dirPath, entry.name);\n\n if (entry.isDirectory()) {\n totalSize += getDirectorySize(fullPath);\n } else if (entry.isFile()) {\n try {\n const stats = statSync(fullPath);\n totalSize += stats.size;\n } catch {\n // Skip files we can't stat\n }\n }\n }\n } catch {\n // Return 0 if we can't read the directory\n }\n\n return totalSize;\n}\n\n/**\n * Format bytes as human-readable string.\n * @param bytes - Size in bytes.\n * @returns Formatted string (e.g., \"150 MB\").\n */\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) {\n return \"0 B\";\n }\n\n const units = [\"B\", \"KB\", \"MB\", \"GB\"];\n const k = 1024;\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n const size = bytes / Math.pow(k, i);\n\n return `${size.toFixed(1)} ${units[i]}`;\n}\n\n/**\n * Compare semver versions.\n * @param a - First version.\n * @param b - Second version.\n * @returns Negative if a < b, positive if a > b, 0 if equal.\n */\nfunction compareVersions(a: string, b: string): number {\n const partsA = a.split(\".\").map(Number);\n const partsB = b.split(\".\").map(Number);\n\n for (let i = 0; i < 3; i++) {\n const partA = partsA[i] || 0;\n const partB = partsB[i] || 0;\n\n if (partA !== partB) {\n return partA - partB;\n }\n }\n\n return 0;\n}\n\n/**\n * List all installed electron-app versions.\n * @returns Array of installed version info, sorted by version descending.\n */\nexport function listInstalledVersions(): IInstalledVersion[] {\n const baseDir = getElectronAppBaseDir();\n const currentVersion = getElectronAppVersion();\n const versions: IInstalledVersion[] = [];\n\n if (!existsSync(baseDir)) {\n return versions;\n }\n\n try {\n const entries = readdirSync(baseDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n\n // Check if directory name looks like a version (e.g., \"1.0.1\")\n if (!/^\\d+\\.\\d+\\.\\d+$/.test(entry.name)) {\n continue;\n }\n\n const versionPath = path.join(baseDir, entry.name);\n const sizeBytes = getDirectorySize(versionPath);\n\n versions.push({\n version: entry.name,\n path: versionPath,\n sizeBytes: sizeBytes,\n isCurrent: entry.name === currentVersion,\n });\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.warn(\"Failed to list installed versions\", { error: errorMessage });\n }\n\n // Sort by version descending (newest first)\n versions.sort((a, b) => compareVersions(b.version, a.version));\n\n return versions;\n}\n\n/**\n * Remove old electron-app versions.\n * @param options - Cleanup options.\n * @returns Object with removed versions and freed bytes.\n */\nexport function cleanupOldVersions(options: ICleanupOptions = {}): {\n removed: IInstalledVersion[];\n freedBytes: number;\n} {\n const { all = false, dryRun = false } = options;\n const versions = listInstalledVersions();\n const removed: IInstalledVersion[] = [];\n let freedBytes = 0;\n\n // Determine which versions to keep\n // - Always keep current version\n // - By default, also keep one previous version (for rollback)\n // - With --all, only keep current\n\n const versionsToKeep = all ? 1 : 2;\n let keptCount = 0;\n\n for (const version of versions) {\n if (version.isCurrent) {\n keptCount++;\n continue;\n }\n\n if (keptCount < versionsToKeep) {\n keptCount++;\n continue;\n }\n\n // This version should be removed\n if (!dryRun) {\n try {\n rmSync(version.path, { recursive: true, force: true });\n logger.info(\"Removed old version\", {\n version: version.version,\n freedBytes: version.sizeBytes,\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(\"Failed to remove version\", {\n version: version.version,\n error: errorMessage,\n });\n continue;\n }\n }\n\n removed.push(version);\n freedBytes += version.sizeBytes;\n }\n\n return { removed: removed, freedBytes: freedBytes };\n}\n\n/**\n * Execute the versions command - list installed versions.\n */\nexport async function versionsCommand(): Promise<void> {\n console.log(\"\\nInstalled Electron App Versions\");\n console.log(\"================================\\n\");\n\n const versions = listInstalledVersions();\n\n if (versions.length === 0) {\n console.log(\"No versions installed.\");\n console.log(\"Run 'muggle-mcp setup' to download the Electron app.\\n\");\n return;\n }\n\n let totalSize = 0;\n\n for (const version of versions) {\n const marker = version.isCurrent ? \" (current)\" : \"\";\n const size = formatBytes(version.sizeBytes);\n console.log(` v${version.version}${marker} - ${size}`);\n totalSize += version.sizeBytes;\n }\n\n console.log(\"\");\n console.log(`Total: ${versions.length} version(s), ${formatBytes(totalSize)}`);\n console.log(\"\");\n}\n\n/**\n * Execute the cleanup command.\n * @param options - Command options.\n */\nexport async function cleanupCommand(options: ICleanupOptions): Promise<void> {\n console.log(\"\\nElectron App Cleanup\");\n console.log(\"====================\\n\");\n\n const versions = listInstalledVersions();\n\n if (versions.length === 0) {\n console.log(\"No versions installed. Nothing to clean up.\\n\");\n return;\n }\n\n if (versions.length === 1) {\n console.log(\"Only the current version is installed. Nothing to clean up.\\n\");\n return;\n }\n\n const currentVersion = versions.find((v) => v.isCurrent);\n const oldVersions = versions.filter((v) => !v.isCurrent);\n\n console.log(`Current version: v${currentVersion?.version || \"unknown\"}`);\n console.log(`Old versions: ${oldVersions.length}`);\n console.log(\"\");\n\n if (options.dryRun) {\n console.log(\"Dry run - showing what would be deleted:\\n\");\n }\n\n const result = cleanupOldVersions(options);\n\n if (result.removed.length === 0) {\n if (options.all) {\n console.log(\"No old versions to remove.\\n\");\n } else {\n console.log(\"Keeping one previous version for rollback.\");\n console.log(\"Use --all to remove all old versions.\\n\");\n }\n return;\n }\n\n console.log(options.dryRun ? \"Would remove:\" : \"Removed:\");\n\n for (const version of result.removed) {\n console.log(` v${version.version} (${formatBytes(version.sizeBytes)})`);\n }\n\n console.log(\"\");\n console.log(\n `${options.dryRun ? \"Would free\" : \"Freed\"}: ${formatBytes(result.freedBytes)}`,\n );\n console.log(\"\");\n\n if (options.dryRun) {\n console.log(\"Run without --dry-run to actually delete.\\n\");\n }\n\n logger.info(\"Cleanup completed\", {\n removed: result.removed.length,\n freedBytes: result.freedBytes,\n dryRun: options.dryRun,\n });\n}\n","/**\n * Doctor command - diagnoses installation and configuration issues.\n */\n\nimport { existsSync } from \"fs\";\n\nimport {\n getBundledElectronAppVersion,\n getConfig,\n getDataDir,\n getElectronAppVersion,\n getElectronAppVersionSource,\n isElectronAppInstalled,\n} from \"../shared/config.js\";\nimport { getAuthStatus, getCredentialsFilePath } from \"../shared/credentials.js\";\nimport { getLogger } from \"../shared/logger.js\";\n\nconst logger = getLogger();\n\n/**\n * Check result with status indicator.\n */\ninterface ICheckResult {\n /** Check name. */\n name: string;\n /** Whether check passed. */\n passed: boolean;\n /** Description of the result. */\n description: string;\n /** Suggestion to fix (if failed). */\n suggestion?: string;\n}\n\n/**\n * Run all diagnostic checks.\n * @returns Array of check results.\n */\nfunction runDiagnostics(): ICheckResult[] {\n const results: ICheckResult[] = [];\n const config = getConfig();\n\n // Check 1: Data directory exists\n const dataDir = getDataDir();\n results.push({\n name: \"Data Directory\",\n passed: existsSync(dataDir),\n description: existsSync(dataDir) ? `Found at ${dataDir}` : `Not found at ${dataDir}`,\n suggestion: \"Run 'muggle-mcp login' to create the data directory\",\n });\n\n // Check 2: Electron app installed\n const electronInstalled = isElectronAppInstalled();\n const electronVersion = getElectronAppVersion();\n const bundledVersion = getBundledElectronAppVersion();\n const versionSource = getElectronAppVersionSource();\n\n let electronDescription: string;\n if (electronInstalled) {\n electronDescription = `Installed (v${electronVersion})`;\n switch (versionSource) {\n case \"env\":\n electronDescription += ` [from ELECTRON_APP_VERSION env]`;\n break;\n case \"override\":\n electronDescription += ` [upgraded from bundled v${bundledVersion}]`;\n break;\n default:\n break;\n }\n } else {\n electronDescription = `Not installed (expected v${electronVersion})`;\n }\n\n results.push({\n name: \"Electron App\",\n passed: electronInstalled,\n description: electronDescription,\n suggestion: \"Run 'muggle-mcp setup' to download the Electron app\",\n });\n\n // Check 2b: Upgrade available hint\n if (electronInstalled) {\n results.push({\n name: \"Electron App Updates\",\n passed: true,\n description: \"Run 'muggle-mcp upgrade --check' to check for updates\",\n });\n }\n\n // Check 3: Authentication status\n const authStatus = getAuthStatus();\n results.push({\n name: \"Authentication\",\n passed: authStatus.authenticated,\n description: authStatus.authenticated\n ? `Authenticated as ${authStatus.email || \"unknown\"}`\n : \"Not authenticated\",\n suggestion: \"Run 'muggle-mcp login' to authenticate\",\n });\n\n // Check 4: API key available\n results.push({\n name: \"API Key\",\n passed: authStatus.hasApiKey,\n description: authStatus.hasApiKey ? \"API key stored\" : \"No API key stored\",\n suggestion: \"Run 'muggle-mcp login' to generate an API key\",\n });\n\n // Check 5: Credentials file\n const credentialsPath = getCredentialsFilePath();\n results.push({\n name: \"Credentials File\",\n passed: existsSync(credentialsPath),\n description: existsSync(credentialsPath)\n ? `Found at ${credentialsPath}`\n : `Not found at ${credentialsPath}`,\n suggestion: \"Run 'muggle-mcp login' to create credentials\",\n });\n\n // Check 6: Prompt service URL\n results.push({\n name: \"Prompt Service URL\",\n passed: !!config.qa.promptServiceBaseUrl,\n description: config.qa.promptServiceBaseUrl,\n });\n\n // Check 7: Web service URL (for local testing)\n results.push({\n name: \"Web Service URL\",\n passed: !!config.localQa.webServiceUrl,\n description: config.localQa.webServiceUrl,\n });\n\n return results;\n}\n\n/**\n * Format a check result for display.\n * @param result - Check result.\n * @returns Formatted string.\n */\nfunction formatCheckResult(result: ICheckResult): string {\n const icon = result.passed ? \"✓\" : \"✗\";\n const color = result.passed ? \"\\x1b[32m\" : \"\\x1b[31m\"; // Green or Red\n const reset = \"\\x1b[0m\";\n\n let output = `${color}${icon}${reset} ${result.name}: ${result.description}`;\n\n if (!result.passed && result.suggestion) {\n output += `\\n └─ ${result.suggestion}`;\n }\n\n return output;\n}\n\n/**\n * Execute the doctor command.\n */\nexport async function doctorCommand(): Promise<void> {\n console.log(\"\\nMuggle MCP Doctor\");\n console.log(\"=================\\n\");\n\n const results = runDiagnostics();\n\n for (const result of results) {\n console.log(formatCheckResult(result));\n }\n\n console.log(\"\");\n\n const failedCount = results.filter((r) => !r.passed).length;\n\n if (failedCount === 0) {\n console.log(\"All checks passed! Your installation is ready.\");\n } else {\n console.log(`${failedCount} issue(s) found. See suggestions above.`);\n }\n\n logger.info(\"Doctor command completed\", {\n totalChecks: results.length,\n passed: results.length - failedCount,\n failed: failedCount,\n });\n}\n","/**\n * Login/logout/status commands for authentication.\n */\n\nimport { performLogin, performLogout } from \"../shared/auth.js\";\nimport { getAuthStatus } from \"../shared/credentials.js\";\nimport { getLogger } from \"../shared/logger.js\";\n\nconst logger = getLogger();\n\n/**\n * Options for the login command.\n */\nexport interface ILoginOptions {\n /** Name for the API key. */\n keyName?: string;\n /** API key expiry: 30d, 90d, 1y, never. */\n keyExpiry?: string;\n}\n\n/**\n * Execute the login command.\n * @param options - Command options.\n */\nexport async function loginCommand(options: ILoginOptions): Promise<void> {\n console.log(\"\\nMuggle AI Login\");\n console.log(\"===============\\n\");\n\n const expiry = (options.keyExpiry || \"90d\") as \"30d\" | \"90d\" | \"1y\" | \"never\";\n\n console.log(\"Starting device code authentication...\");\n console.log(\"A browser window will open for you to complete login.\\n\");\n\n const result = await performLogin(options.keyName, expiry);\n\n if (result.success) {\n console.log(\"✓ Login successful!\");\n\n if (result.credentials?.email) {\n console.log(` Logged in as: ${result.credentials.email}`);\n }\n\n if (result.credentials?.apiKey) {\n console.log(\" API key created and stored for future use.\");\n }\n\n console.log(\"\\nYou can now use Muggle AI MCP tools.\");\n } else {\n console.error(\"✗ Login failed\");\n\n if (result.error) {\n console.error(` Error: ${result.error}`);\n }\n\n if (result.deviceCodeResponse) {\n console.log(\"\\nIf browser didn't open, visit:\");\n console.log(` ${result.deviceCodeResponse.verificationUriComplete}`);\n console.log(` Code: ${result.deviceCodeResponse.userCode}`);\n }\n\n process.exit(1);\n }\n}\n\n/**\n * Execute the logout command.\n */\nexport async function logoutCommand(): Promise<void> {\n console.log(\"\\nLogging out...\");\n\n performLogout();\n\n console.log(\"✓ Credentials cleared successfully.\");\n logger.info(\"Logout completed\");\n}\n\n/**\n * Execute the status command.\n */\nexport async function statusCommand(): Promise<void> {\n console.log(\"\\nAuthentication Status\");\n console.log(\"=====================\\n\");\n\n const status = getAuthStatus();\n\n if (status.authenticated) {\n console.log(\"✓ Authenticated\");\n\n if (status.email) {\n console.log(` Email: ${status.email}`);\n }\n\n if (status.userId) {\n console.log(` User ID: ${status.userId}`);\n }\n\n if (status.expiresAt) {\n const expiresDate = new Date(status.expiresAt);\n console.log(` Token expires: ${expiresDate.toLocaleString()}`);\n }\n\n console.log(` API Key: ${status.hasApiKey ? \"Yes\" : \"No\"}`);\n } else {\n console.log(\"✗ Not authenticated\");\n console.log(\"\\nRun 'muggle-mcp login' to authenticate.\");\n }\n}\n","/**\n * Serve command - starts the MCP server.\n */\n\nimport { getLocalQaTools } from \"../local-qa/index.js\";\nimport { getQaTools } from \"../qa/index.js\";\nimport { getConfig } from \"../shared/config.js\";\nimport { getLogger } from \"../shared/logger.js\";\nimport { createUnifiedMcpServer, registerTools, startStdioServer } from \"../server/index.js\";\n\nconst logger = getLogger();\n\n/**\n * Options for the serve command.\n */\nexport interface IServeOptions {\n /** Only enable Cloud QA tools. */\n qa?: boolean;\n /** Only enable Local QA tools. */\n local?: boolean;\n /** Use stdio transport. */\n stdio?: boolean;\n}\n\n/**\n * Execute the serve command.\n * @param options - Command options.\n */\nexport async function serveCommand(options: IServeOptions): Promise<void> {\n const config = getConfig();\n\n // Determine which tool sets to enable\n const enableQa = options.local ? false : true;\n const enableLocal = options.qa ? false : true;\n\n logger.info(\"Starting Muggle MCP Server\", {\n version: config.serverVersion,\n enableQa: enableQa,\n enableLocal: enableLocal,\n transport: \"stdio\",\n });\n\n try {\n // Register tools based on options\n if (enableQa) {\n const qaTools = getQaTools();\n registerTools(qaTools);\n logger.info(\"Registered QA tools\", { count: qaTools.length });\n }\n\n if (enableLocal) {\n const localTools = getLocalQaTools();\n registerTools(localTools);\n logger.info(\"Registered Local QA tools\", { count: localTools.length });\n }\n\n // Create unified MCP server\n const mcpServer = createUnifiedMcpServer({\n enableQaTools: enableQa,\n enableLocalTools: enableLocal,\n });\n\n // Start stdio server (MCP clients communicate via stdin/stdout)\n await startStdioServer(mcpServer);\n\n logger.info(\"MCP server started successfully\");\n } catch (error) {\n logger.error(\"Failed to start MCP server\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n });\n process.exit(1);\n }\n}\n","/**\n * Checksum verification utilities for downloaded binaries.\n * Uses SHA256 for integrity verification.\n */\n\nimport * as crypto from \"crypto\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { platform } from \"os\";\n\nimport { getLogger } from \"./logger.js\";\n\nconst logger = getLogger();\n\n/**\n * Platform key for checksum lookup.\n */\nexport type PlatformKey = \"darwin-arm64\" | \"darwin-x64\" | \"win32-x64\" | \"linux-x64\";\n\n/**\n * Checksums map from package.json muggleConfig.\n */\nexport interface IChecksums {\n /** macOS ARM64 (Apple Silicon) checksum. */\n \"darwin-arm64\"?: string;\n /** macOS x64 (Intel) checksum. */\n \"darwin-x64\"?: string;\n /** Windows x64 checksum. */\n \"win32-x64\"?: string;\n /** Linux x64 checksum. */\n \"linux-x64\"?: string;\n}\n\n/**\n * Result of checksum verification.\n */\nexport interface IChecksumResult {\n /** Whether verification passed. */\n valid: boolean;\n /** Expected checksum (from config or release). */\n expected: string;\n /** Actual checksum of downloaded file. */\n actual: string;\n /** Error message if verification failed. */\n error?: string;\n}\n\n/**\n * Get the platform key for the current system.\n * @returns The platform key for checksum lookup.\n */\nexport function getPlatformKey(): PlatformKey {\n const os = platform();\n const arch = process.arch;\n\n switch (os) {\n case \"darwin\":\n return arch === \"arm64\" ? \"darwin-arm64\" : \"darwin-x64\";\n case \"win32\":\n return \"win32-x64\";\n case \"linux\":\n return \"linux-x64\";\n default:\n throw new Error(`Unsupported platform: ${os}`);\n }\n}\n\n/**\n * Calculate SHA256 checksum of a file.\n * @param filePath - Path to the file.\n * @returns The SHA256 checksum as a hex string.\n */\nexport async function calculateFileChecksum(filePath: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const hash = crypto.createHash(\"sha256\");\n const stream = fs.createReadStream(filePath);\n\n stream.on(\"data\", (data) => {\n hash.update(data);\n });\n\n stream.on(\"end\", () => {\n resolve(hash.digest(\"hex\"));\n });\n\n stream.on(\"error\", (error) => {\n reject(error);\n });\n });\n}\n\n/**\n * Verify file checksum against expected value.\n * @param filePath - Path to the file to verify.\n * @param expectedChecksum - Expected SHA256 checksum.\n * @returns Verification result.\n */\nexport async function verifyFileChecksum(\n filePath: string,\n expectedChecksum: string,\n): Promise<IChecksumResult> {\n if (!expectedChecksum || expectedChecksum.trim() === \"\") {\n logger.warn(\"Checksum verification skipped - no checksum provided\", {\n file: path.basename(filePath),\n });\n return {\n valid: true,\n expected: \"\",\n actual: \"\",\n error: \"Checksum verification skipped - no checksum configured\",\n };\n }\n\n try {\n const actualChecksum = await calculateFileChecksum(filePath);\n const normalizedExpected = expectedChecksum.toLowerCase().trim();\n const normalizedActual = actualChecksum.toLowerCase();\n\n const valid = normalizedExpected === normalizedActual;\n\n if (!valid) {\n logger.error(\"Checksum verification failed\", {\n file: path.basename(filePath),\n expected: normalizedExpected,\n actual: normalizedActual,\n });\n } else {\n logger.info(\"Checksum verified successfully\", {\n file: path.basename(filePath),\n checksum: normalizedActual,\n });\n }\n\n return {\n valid: valid,\n expected: normalizedExpected,\n actual: normalizedActual,\n error: valid ? undefined : \"Checksum mismatch - file may be corrupted or tampered with\",\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(\"Checksum calculation failed\", {\n file: path.basename(filePath),\n error: errorMessage,\n });\n\n return {\n valid: false,\n expected: expectedChecksum,\n actual: \"\",\n error: `Failed to calculate checksum: ${errorMessage}`,\n };\n }\n}\n\n/**\n * Get checksum for current platform from checksums map.\n * @param checksums - Checksums map from config.\n * @returns Checksum for current platform, or empty string if not found.\n */\nexport function getChecksumForPlatform(checksums: IChecksums | undefined): string {\n if (!checksums) {\n return \"\";\n }\n\n const platformKey = getPlatformKey();\n return checksums[platformKey] || \"\";\n}\n","/**\n * Setup command - downloads/updates the Electron app.\n */\n\nimport { exec } from \"child_process\";\nimport { createWriteStream, existsSync, mkdirSync, rmSync } from \"fs\";\nimport { arch, platform } from \"os\";\nimport { pipeline } from \"stream/promises\";\n\nimport {\n getDownloadBaseUrl,\n getElectronAppChecksums,\n getElectronAppDir,\n getElectronAppVersion,\n isElectronAppInstalled,\n} from \"../shared/config.js\";\nimport { getChecksumForPlatform, verifyFileChecksum } from \"../shared/checksum.js\";\nimport { getLogger } from \"../shared/logger.js\";\n\nconst logger = getLogger();\n\n/**\n * Options for the setup command.\n */\nexport interface ISetupOptions {\n /** Force re-download even if already installed. */\n force?: boolean;\n}\n\n/**\n * Get platform-specific binary name.\n * @returns Binary filename.\n */\nfunction getBinaryName(): string {\n const os = platform();\n const architecture = arch();\n\n switch (os) {\n case \"darwin\": {\n const darwinArch = architecture === \"arm64\" ? \"arm64\" : \"x64\";\n return `MuggleAI-darwin-${darwinArch}.zip`;\n }\n case \"win32\":\n return \"MuggleAI-win32-x64.zip\";\n case \"linux\":\n return \"MuggleAI-linux-x64.zip\";\n default:\n throw new Error(`Unsupported platform: ${os}`);\n }\n}\n\n/**\n * Extract a zip file.\n * @param zipPath - Path to zip file.\n * @param destDir - Destination directory.\n */\nasync function extractZip(zipPath: string, destDir: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const cmd =\n platform() === \"win32\"\n ? `powershell -command \"Expand-Archive -Path '${zipPath}' -DestinationPath '${destDir}' -Force\"`\n : `unzip -o \"${zipPath}\" -d \"${destDir}\"`;\n\n exec(cmd, (error) => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n });\n}\n\n/**\n * Extract a tar.gz file.\n * @param tarPath - Path to tar.gz file.\n * @param destDir - Destination directory.\n */\nasync function extractTarGz(tarPath: string, destDir: string): Promise<void> {\n return new Promise((resolve, reject) => {\n exec(`tar -xzf \"${tarPath}\" -C \"${destDir}\"`, (error) => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n });\n}\n\n/**\n * Execute the setup command.\n * @param options - Command options.\n */\nexport async function setupCommand(options: ISetupOptions): Promise<void> {\n const version = getElectronAppVersion();\n const baseUrl = getDownloadBaseUrl();\n const versionDir = getElectronAppDir(version);\n\n // Check if already installed\n if (!options.force && isElectronAppInstalled()) {\n console.log(`Electron app v${version} is already installed at ${versionDir}`);\n console.log(\"Use --force to re-download.\");\n return;\n }\n\n const binaryName = getBinaryName();\n const downloadUrl = `${baseUrl}/v${version}/${binaryName}`;\n\n console.log(`Downloading Muggle Test Electron app v${version}...`);\n console.log(`URL: ${downloadUrl}`);\n\n try {\n // Create directory\n if (existsSync(versionDir)) {\n rmSync(versionDir, { recursive: true, force: true });\n }\n mkdirSync(versionDir, { recursive: true });\n\n // Download\n const response = await fetch(downloadUrl);\n if (!response.ok) {\n throw new Error(`Download failed: ${response.status} ${response.statusText}`);\n }\n\n const tempFile = `${versionDir}/${binaryName}`;\n const fileStream = createWriteStream(tempFile);\n\n if (!response.body) {\n throw new Error(\"No response body\");\n }\n\n await pipeline(response.body as unknown as NodeJS.ReadableStream, fileStream);\n\n console.log(\"Download complete, verifying checksum...\");\n\n // Verify checksum\n const checksums = getElectronAppChecksums();\n const expectedChecksum = getChecksumForPlatform(checksums);\n const checksumResult = await verifyFileChecksum(tempFile, expectedChecksum);\n\n if (!checksumResult.valid && expectedChecksum) {\n rmSync(versionDir, { recursive: true, force: true });\n throw new Error(\n `Checksum verification failed!\\n` +\n `Expected: ${checksumResult.expected}\\n` +\n `Actual: ${checksumResult.actual}\\n` +\n `The downloaded file may be corrupted or tampered with.`,\n );\n }\n\n if (expectedChecksum) {\n console.log(\"Checksum verified successfully.\");\n } else {\n console.log(\"Warning: No checksum configured, skipping verification.\");\n }\n\n console.log(\"Extracting...\");\n\n // Extract based on file type\n if (binaryName.endsWith(\".zip\")) {\n await extractZip(tempFile, versionDir);\n } else if (binaryName.endsWith(\".tar.gz\")) {\n await extractTarGz(tempFile, versionDir);\n }\n\n // Clean up temp file\n rmSync(tempFile, { force: true });\n\n console.log(`Electron app installed to ${versionDir}`);\n logger.info(\"Setup complete\", { version: version, path: versionDir });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`Failed to download Electron app: ${errorMessage}`);\n logger.error(\"Setup failed\", { error: errorMessage });\n process.exit(1);\n }\n}\n","/**\n * Upgrade command - checks for and downloads the latest electron-app version.\n * Allows users to get newer electron-app versions independently of MCP updates.\n */\n\nimport { exec } from \"child_process\";\nimport { createWriteStream, existsSync, mkdirSync, rmSync, writeFileSync } from \"fs\";\nimport { platform } from \"os\";\nimport * as path from \"path\";\nimport { pipeline } from \"stream/promises\";\n\nimport {\n getDataDir,\n getDownloadBaseUrl,\n getElectronAppDir,\n getElectronAppVersion,\n} from \"../shared/config.js\";\nimport { getPlatformKey, verifyFileChecksum } from \"../shared/checksum.js\";\nimport { getLogger } from \"../shared/logger.js\";\nimport { cleanupOldVersions, formatBytes } from \"./cleanup.js\";\n\nconst logger = getLogger();\n\n/** GitHub API URL for releases. */\nconst GITHUB_RELEASES_API = \"https://api.github.com/repos/multiplex-ai/muggle-ai-mcp/releases\";\n\n/** Filename for storing the overridden electron-app version. */\nconst VERSION_OVERRIDE_FILE = \"electron-app-version-override.json\";\n\n/**\n * Options for the upgrade command.\n */\nexport interface IUpgradeOptions {\n /** Force re-download even if already on latest. */\n force?: boolean;\n /** Check for updates only, don't download. */\n check?: boolean;\n /** Specific version to download (e.g., \"1.0.2\"). */\n version?: string;\n}\n\n/**\n * Result of checking for updates.\n */\ninterface IUpdateCheckResult {\n /** Currently installed version. */\n currentVersion: string;\n /** Latest available version. */\n latestVersion: string;\n /** Whether an update is available. */\n updateAvailable: boolean;\n /** Download URL for the latest version. */\n downloadUrl?: string;\n}\n\n/**\n * Get platform-specific binary name.\n * @returns Binary filename.\n */\nfunction getBinaryName(): string {\n const os = platform();\n const arch = process.arch;\n\n switch (os) {\n case \"darwin\":\n return arch === \"arm64\"\n ? \"MuggleAI-darwin-arm64.zip\"\n : \"MuggleAI-darwin-x64.zip\";\n case \"win32\":\n return \"MuggleAI-win32-x64.zip\";\n case \"linux\":\n return \"MuggleAI-linux-x64.zip\";\n default:\n throw new Error(`Unsupported platform: ${os}`);\n }\n}\n\n/**\n * Extract version from release tag.\n * @param tag - Release tag (e.g., \"electron-app-v1.0.2\").\n * @returns Version string (e.g., \"1.0.2\") or null.\n */\nfunction extractVersionFromTag(tag: string): string | null {\n const match = tag.match(/^electron-app-v(\\d+\\.\\d+\\.\\d+)$/);\n return match ? match[1] : null;\n}\n\n/**\n * Get the path to the version override file.\n * @returns Path to the override file.\n */\nfunction getVersionOverridePath(): string {\n return path.join(getDataDir(), VERSION_OVERRIDE_FILE);\n}\n\n/**\n * Get the effective electron-app version (override or default).\n * @returns The version to use.\n */\nexport function getEffectiveElectronAppVersion(): string {\n const overridePath = getVersionOverridePath();\n\n if (existsSync(overridePath)) {\n try {\n const content = JSON.parse(require(\"fs\").readFileSync(overridePath, \"utf-8\"));\n if (content.version) {\n return content.version;\n }\n } catch {\n // Fall through to default\n }\n }\n\n return getElectronAppVersion();\n}\n\n/**\n * Save the version override.\n * @param version - Version to save.\n */\nfunction saveVersionOverride(version: string): void {\n const overridePath = getVersionOverridePath();\n const dataDir = getDataDir();\n\n if (!existsSync(dataDir)) {\n mkdirSync(dataDir, { recursive: true });\n }\n\n writeFileSync(overridePath, JSON.stringify({\n version: version,\n updatedAt: new Date().toISOString(),\n }, null, 2), \"utf-8\");\n}\n\n/**\n * Check for the latest electron-app version from GitHub releases.\n * @returns Update check result.\n */\nasync function checkForUpdates(): Promise<IUpdateCheckResult> {\n const currentVersion = getEffectiveElectronAppVersion();\n\n try {\n const response = await fetch(GITHUB_RELEASES_API, {\n headers: {\n \"Accept\": \"application/vnd.github.v3+json\",\n \"User-Agent\": \"muggle-mcp\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`GitHub API error: ${response.status} ${response.statusText}`);\n }\n\n const releases = await response.json() as Array<{\n tag_name: string;\n prerelease: boolean;\n draft: boolean;\n }>;\n\n // Find latest electron-app release (non-prerelease, non-draft)\n for (const release of releases) {\n if (release.prerelease || release.draft) {\n continue;\n }\n\n const version = extractVersionFromTag(release.tag_name);\n if (version) {\n const updateAvailable = compareVersions(version, currentVersion) > 0;\n const baseUrl = getDownloadBaseUrl();\n const binaryName = getBinaryName();\n\n return {\n currentVersion: currentVersion,\n latestVersion: version,\n updateAvailable: updateAvailable,\n downloadUrl: `${baseUrl}/electron-app-v${version}/${binaryName}`,\n };\n }\n }\n\n // No electron-app releases found\n return {\n currentVersion: currentVersion,\n latestVersion: currentVersion,\n updateAvailable: false,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.warn(\"Failed to check for updates\", { error: errorMessage });\n throw new Error(`Failed to check for updates: ${errorMessage}`);\n }\n}\n\n/**\n * Compare two semver versions.\n * @param a - First version.\n * @param b - Second version.\n * @returns 1 if a > b, -1 if a < b, 0 if equal.\n */\nfunction compareVersions(a: string, b: string): number {\n const partsA = a.split(\".\").map(Number);\n const partsB = b.split(\".\").map(Number);\n\n for (let i = 0; i < 3; i++) {\n const partA = partsA[i] || 0;\n const partB = partsB[i] || 0;\n\n if (partA > partB) {\n return 1;\n }\n if (partA < partB) {\n return -1;\n }\n }\n\n return 0;\n}\n\n/**\n * Extract a zip file.\n * @param zipPath - Path to zip file.\n * @param destDir - Destination directory.\n */\nasync function extractZip(zipPath: string, destDir: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const cmd =\n platform() === \"win32\"\n ? `powershell -command \"Expand-Archive -Path '${zipPath}' -DestinationPath '${destDir}' -Force\"`\n : `unzip -o \"${zipPath}\" -d \"${destDir}\"`;\n\n exec(cmd, (error) => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n });\n}\n\n/**\n * Extract a tar.gz file.\n * @param tarPath - Path to tar.gz file.\n * @param destDir - Destination directory.\n */\nasync function extractTarGz(tarPath: string, destDir: string): Promise<void> {\n return new Promise((resolve, reject) => {\n exec(`tar -xzf \"${tarPath}\" -C \"${destDir}\"`, (error) => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n });\n}\n\n/**\n * Fetch checksum for a specific version and platform from the release.\n * Looks for checksums.txt in the release assets.\n * @param version - Version to get checksum for.\n * @returns The checksum or empty string if not available.\n */\nasync function fetchChecksumFromRelease(version: string): Promise<string> {\n const baseUrl = getDownloadBaseUrl();\n const checksumUrl = `${baseUrl}/electron-app-v${version}/checksums.txt`;\n\n try {\n const response = await fetch(checksumUrl);\n if (!response.ok) {\n logger.warn(\"Checksums file not found in release\", { version: version });\n return \"\";\n }\n\n const text = await response.text();\n const binaryName = getBinaryName();\n const platformKey = getPlatformKey();\n\n // Parse checksums.txt format: \"checksum filename\" or \"checksum filename\"\n const lines = text.split(\"\\n\");\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) {\n continue;\n }\n\n // Match \"checksum filename\" or \"checksum filename\" format\n const match = trimmed.match(/^([a-fA-F0-9]{64})\\s+(.+)$/);\n if (match) {\n const checksum = match[1];\n const filename = match[2];\n\n // Check if this line is for our binary\n if (filename === binaryName || filename.includes(platformKey)) {\n logger.info(\"Found checksum in release\", {\n version: version,\n platform: platformKey,\n checksum: checksum.substring(0, 16) + \"...\",\n });\n return checksum;\n }\n }\n }\n\n logger.warn(\"Platform checksum not found in checksums.txt\", {\n version: version,\n platform: platformKey,\n });\n return \"\";\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.warn(\"Failed to fetch checksums from release\", {\n version: version,\n error: errorMessage,\n });\n return \"\";\n }\n}\n\n/**\n * Download and install a specific version.\n * @param version - Version to download.\n * @param downloadUrl - URL to download from.\n * @param checksum - Optional checksum to verify (if not provided, will fetch from release).\n */\nasync function downloadAndInstall(\n version: string,\n downloadUrl: string,\n checksum?: string,\n): Promise<void> {\n const versionDir = getElectronAppDir(version);\n const binaryName = getBinaryName();\n\n console.log(`Downloading Muggle Test Electron app v${version}...`);\n console.log(`URL: ${downloadUrl}`);\n\n // Create directory\n if (existsSync(versionDir)) {\n rmSync(versionDir, { recursive: true, force: true });\n }\n mkdirSync(versionDir, { recursive: true });\n\n // Download\n const response = await fetch(downloadUrl);\n if (!response.ok) {\n throw new Error(`Download failed: ${response.status} ${response.statusText}`);\n }\n\n const tempFile = path.join(versionDir, binaryName);\n const fileStream = createWriteStream(tempFile);\n\n if (!response.body) {\n throw new Error(\"No response body\");\n }\n\n await pipeline(response.body as unknown as NodeJS.ReadableStream, fileStream);\n\n console.log(\"Download complete, verifying checksum...\");\n\n // Get checksum (from parameter or fetch from release)\n let expectedChecksum = checksum;\n if (!expectedChecksum) {\n expectedChecksum = await fetchChecksumFromRelease(version);\n }\n\n // Verify checksum\n const checksumResult = await verifyFileChecksum(tempFile, expectedChecksum || \"\");\n\n if (!checksumResult.valid && expectedChecksum) {\n rmSync(versionDir, { recursive: true, force: true });\n throw new Error(\n `Checksum verification failed!\\n` +\n `Expected: ${checksumResult.expected}\\n` +\n `Actual: ${checksumResult.actual}\\n` +\n `The downloaded file may be corrupted or tampered with.`,\n );\n }\n\n if (expectedChecksum) {\n console.log(\"Checksum verified successfully.\");\n } else {\n console.log(\"Warning: No checksum available, skipping verification.\");\n }\n\n console.log(\"Extracting...\");\n\n // Extract based on file type\n if (binaryName.endsWith(\".zip\")) {\n await extractZip(tempFile, versionDir);\n } else if (binaryName.endsWith(\".tar.gz\")) {\n await extractTarGz(tempFile, versionDir);\n }\n\n // Clean up temp file\n rmSync(tempFile, { force: true });\n\n // Save version override\n saveVersionOverride(version);\n\n console.log(`Electron app v${version} installed to ${versionDir}`);\n logger.info(\"Upgrade complete\", { version: version, path: versionDir });\n}\n\n/**\n * Execute the upgrade command.\n * @param options - Command options.\n */\nexport async function upgradeCommand(options: IUpgradeOptions): Promise<void> {\n try {\n // If specific version requested\n if (options.version) {\n const baseUrl = getDownloadBaseUrl();\n const binaryName = getBinaryName();\n const downloadUrl = `${baseUrl}/electron-app-v${options.version}/${binaryName}`;\n\n await downloadAndInstall(options.version, downloadUrl);\n\n // Auto-cleanup old versions (keep current + 1 previous)\n const cleanupResult = cleanupOldVersions({ all: false });\n if (cleanupResult.removed.length > 0) {\n console.log(\n `\\nCleaned up ${cleanupResult.removed.length} old version(s), ` +\n `freed ${formatBytes(cleanupResult.freedBytes)}`,\n );\n }\n return;\n }\n\n // Check for updates\n console.log(\"Checking for updates...\");\n const result = await checkForUpdates();\n\n console.log(`Current version: ${result.currentVersion}`);\n console.log(`Latest version: ${result.latestVersion}`);\n\n if (options.check) {\n if (result.updateAvailable) {\n console.log(\"\\nUpdate available! Run 'muggle-mcp upgrade' to install.\");\n } else {\n console.log(\"\\nYou are on the latest version.\");\n }\n return;\n }\n\n if (!result.updateAvailable && !options.force) {\n console.log(\"\\nYou are already on the latest version.\");\n console.log(\"Use --force to re-download the current version.\");\n return;\n }\n\n if (!result.downloadUrl) {\n throw new Error(\"No download URL available\");\n }\n\n // Download and install\n await downloadAndInstall(result.latestVersion, result.downloadUrl);\n\n // Auto-cleanup old versions (keep current + 1 previous)\n const cleanupResult = cleanupOldVersions({ all: false });\n if (cleanupResult.removed.length > 0) {\n console.log(\n `\\nCleaned up ${cleanupResult.removed.length} old version(s), ` +\n `freed ${formatBytes(cleanupResult.freedBytes)}`,\n );\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`Upgrade failed: ${errorMessage}`);\n logger.error(\"Upgrade failed\", { error: errorMessage });\n process.exit(1);\n }\n}\n","/**\n * CLI entry point for @muggleai/mcp.\n * Provides commands for serving MCP, setup, diagnostics, and authentication.\n */\n\nimport { readFileSync } from \"fs\";\nimport { dirname, resolve } from \"path\";\nimport { fileURLToPath } from \"url\";\n\nimport { Command } from \"commander\";\n\nimport { getLogger } from \"../shared/logger.js\";\n\n/** Directory containing this module. */\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\n/** Package version read from package.json. */\nconst packageVersion = JSON.parse(\n readFileSync(resolve(__dirname, \"..\", \"package.json\"), \"utf-8\")\n).version as string;\n\nimport { cleanupCommand, versionsCommand } from \"./cleanup.js\";\nimport { doctorCommand } from \"./doctor.js\";\nimport { loginCommand, logoutCommand, statusCommand } from \"./login.js\";\nimport { serveCommand } from \"./serve.js\";\nimport { setupCommand } from \"./setup.js\";\nimport { upgradeCommand } from \"./upgrade.js\";\n\nconst logger = getLogger();\n\n/**\n * Create and configure the CLI program.\n * @returns Configured Commander program.\n */\nfunction createProgram(): Command {\n const program = new Command();\n\n program\n .name(\"muggle-mcp\")\n .description(\"Unified MCP server for Muggle AI - Cloud QA and Local Testing\")\n .version(packageVersion);\n\n // Serve command (main command)\n program\n .command(\"serve\")\n .description(\"Start the MCP server\")\n .option(\"--qa\", \"Only enable Cloud QA tools\")\n .option(\"--local\", \"Only enable Local QA tools\")\n .option(\"--stdio\", \"Use stdio transport (default)\")\n .action(serveCommand);\n\n // Setup command\n program\n .command(\"setup\")\n .description(\"Download/update the Electron app for local testing\")\n .option(\"--force\", \"Force re-download even if already installed\")\n .action(setupCommand);\n\n // Upgrade command\n program\n .command(\"upgrade\")\n .description(\"Check for and install the latest electron-app version\")\n .option(\"--force\", \"Force re-download even if already on latest\")\n .option(\"--check\", \"Check for updates only, don't download\")\n .option(\"--version <version>\", \"Download a specific version (e.g., 1.0.2)\")\n .action(upgradeCommand);\n\n // Versions command\n program\n .command(\"versions\")\n .description(\"List installed electron-app versions\")\n .action(versionsCommand);\n\n // Cleanup command\n program\n .command(\"cleanup\")\n .description(\"Remove old electron-app versions to free disk space\")\n .option(\"--all\", \"Remove all old versions (default: keep one previous)\")\n .option(\"--dry-run\", \"Show what would be deleted without deleting\")\n .action(cleanupCommand);\n\n // Doctor command\n program\n .command(\"doctor\")\n .description(\"Diagnose installation and configuration issues\")\n .action(doctorCommand);\n\n // Login command\n program\n .command(\"login\")\n .description(\"Authenticate with Muggle AI (uses device code flow)\")\n .option(\"--key-name <name>\", \"Name for the API key\")\n .option(\"--key-expiry <expiry>\", \"API key expiry: 30d, 90d, 1y, never\", \"90d\")\n .action(loginCommand);\n\n // Logout command\n program\n .command(\"logout\")\n .description(\"Clear stored credentials\")\n .action(logoutCommand);\n\n // Status command\n program\n .command(\"status\")\n .description(\"Show authentication status\")\n .action(statusCommand);\n\n // Default to serve when no command specified\n program.action(() => {\n serveCommand({ stdio: true });\n });\n\n return program;\n}\n\n/**\n * Run the CLI.\n */\nexport async function runCli(): Promise<void> {\n try {\n const program = createProgram();\n await program.parseAsync(process.argv);\n } catch (error) {\n logger.error(\"CLI error\", {\n error: error instanceof Error ? error.message : String(error),\n });\n process.exit(1);\n }\n}\n","#!/usr/bin/env node\n/**\n * CLI entry point for muggle-mcp.\n */\n\nimport { runCli } from \"./index.js\";\n\nrunCli().catch((error) => {\n console.error(\"Fatal error:\", error instanceof Error ? error.message : String(error));\n process.exit(1);\n});\n"]}
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { __export, toolRequiresAuth, startDeviceCodeFlow, saveCredentials, resetLogger, resetConfig, pollDeviceCode, performLogout, performLogin, openBrowserUrl, loadCredentials, isElectronAppInstalled, isCredentialsExpired, getValidCredentials, getLogger, getElectronAppVersionSource, getElectronAppVersion, getElectronAppDir, getElectronAppChecksums, getDownloadBaseUrl, getDataDir, getCredentialsFilePath, getConfig, getCallerCredentials, getBundledElectronAppVersion, getAuthStatus, deleteCredentials, createChildLogger, createApiKeyWithToken } from './chunk-IGLYJZH6.js';
2
- export { createChildLogger, createUnifiedMcpServer, getConfig, getLocalQaTools, getLogger, getQaTools, local_qa_exports as localQa, qa_exports as qa, server_exports as server } from './chunk-IGLYJZH6.js';
1
+ import { __export, toolRequiresAuth, startDeviceCodeFlow, saveCredentials, resetLogger, resetConfig, pollDeviceCode, performLogout, performLogin, openBrowserUrl, loadCredentials, isElectronAppInstalled, isCredentialsExpired, getValidCredentials, getLogger, getElectronAppVersionSource, getElectronAppVersion, getElectronAppDir, getElectronAppChecksums, getDownloadBaseUrl, getDataDir, getCredentialsFilePath, getConfig, getCallerCredentials, getBundledElectronAppVersion, getAuthStatus, deleteCredentials, createChildLogger, createApiKeyWithToken } from './chunk-DX2A2FVG.js';
2
+ export { createChildLogger, createUnifiedMcpServer, getConfig, getLocalQaTools, getLogger, getQaTools, local_qa_exports as localQa, qa_exports as qa, server_exports as server } from './chunk-DX2A2FVG.js';
3
3
 
4
4
  // src/shared/index.ts
5
5
  var shared_exports = {};
@@ -1 +1 @@
1
- {"version":3,"file":"execution-service.d.ts","sourceRoot":"","sources":["../../../src/local-qa/services/execution-service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,OAAO,KAAK,EAGV,eAAe,EAIhB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,cAAc,EACd,YAAY,EAGb,MAAM,mBAAmB,CAAC;AAoyB3B;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CAAE,MAAM,EAAE;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,eAAe,CAAC,CA4J3B;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAE,MAAM,EAAE;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,eAAe,CAAC,CA2I3B;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAE,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;CAAE,GAAG,OAAO,CAyBpE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAK,KAAK,CAAC;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,YAAY,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,cAAc,CAAC;CACxB,CAAC,CAUD"}
1
+ {"version":3,"file":"execution-service.d.ts","sourceRoot":"","sources":["../../../src/local-qa/services/execution-service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,KAAK,EAGV,eAAe,EAOhB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,cAAc,EACd,YAAY,EAGb,MAAM,mBAAmB,CAAC;AA2xB3B;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CAAE,MAAM,EAAE;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,eAAe,CAAC,CA4J3B;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAE,MAAM,EAAE;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,eAAe,CAAC,CA2I3B;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAE,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;CAAE,GAAG,OAAO,CA6BpE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAK,KAAK,CAAC;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,YAAY,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,cAAc,CAAC;CACxB,CAAC,CAUD"}