@nimblebrain/mpak 0.1.0 → 0.3.0

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.
Files changed (151) hide show
  1. package/README.md +50 -383
  2. package/dist/index.d.ts +0 -2
  3. package/dist/index.js +2117 -4
  4. package/dist/index.js.map +1 -1
  5. package/package.json +26 -23
  6. package/.claude/settings.local.json +0 -19
  7. package/.env.example +0 -13
  8. package/.github/workflows/ci.yml +0 -27
  9. package/CLAUDE.md +0 -283
  10. package/LICENSE +0 -201
  11. package/dist/commands/config.d.ts +0 -31
  12. package/dist/commands/config.d.ts.map +0 -1
  13. package/dist/commands/config.js +0 -129
  14. package/dist/commands/config.js.map +0 -1
  15. package/dist/commands/packages/pull.d.ts +0 -11
  16. package/dist/commands/packages/pull.d.ts.map +0 -1
  17. package/dist/commands/packages/pull.js +0 -72
  18. package/dist/commands/packages/pull.js.map +0 -1
  19. package/dist/commands/packages/run.d.ts +0 -47
  20. package/dist/commands/packages/run.d.ts.map +0 -1
  21. package/dist/commands/packages/run.js +0 -419
  22. package/dist/commands/packages/run.js.map +0 -1
  23. package/dist/commands/packages/search.d.ts +0 -12
  24. package/dist/commands/packages/search.d.ts.map +0 -1
  25. package/dist/commands/packages/search.js +0 -63
  26. package/dist/commands/packages/search.js.map +0 -1
  27. package/dist/commands/packages/show.d.ts +0 -8
  28. package/dist/commands/packages/show.d.ts.map +0 -1
  29. package/dist/commands/packages/show.js +0 -109
  30. package/dist/commands/packages/show.js.map +0 -1
  31. package/dist/commands/search.d.ts +0 -12
  32. package/dist/commands/search.d.ts.map +0 -1
  33. package/dist/commands/search.js +0 -144
  34. package/dist/commands/search.js.map +0 -1
  35. package/dist/commands/skills/index.d.ts +0 -8
  36. package/dist/commands/skills/index.d.ts.map +0 -1
  37. package/dist/commands/skills/index.js +0 -8
  38. package/dist/commands/skills/index.js.map +0 -1
  39. package/dist/commands/skills/install.d.ts +0 -9
  40. package/dist/commands/skills/install.d.ts.map +0 -1
  41. package/dist/commands/skills/install.js +0 -110
  42. package/dist/commands/skills/install.js.map +0 -1
  43. package/dist/commands/skills/list.d.ts +0 -8
  44. package/dist/commands/skills/list.d.ts.map +0 -1
  45. package/dist/commands/skills/list.js +0 -89
  46. package/dist/commands/skills/list.js.map +0 -1
  47. package/dist/commands/skills/pack.d.ts +0 -22
  48. package/dist/commands/skills/pack.d.ts.map +0 -1
  49. package/dist/commands/skills/pack.js +0 -116
  50. package/dist/commands/skills/pack.js.map +0 -1
  51. package/dist/commands/skills/pull.d.ts +0 -9
  52. package/dist/commands/skills/pull.d.ts.map +0 -1
  53. package/dist/commands/skills/pull.js +0 -68
  54. package/dist/commands/skills/pull.js.map +0 -1
  55. package/dist/commands/skills/search.d.ts +0 -14
  56. package/dist/commands/skills/search.d.ts.map +0 -1
  57. package/dist/commands/skills/search.js +0 -53
  58. package/dist/commands/skills/search.js.map +0 -1
  59. package/dist/commands/skills/show.d.ts +0 -8
  60. package/dist/commands/skills/show.d.ts.map +0 -1
  61. package/dist/commands/skills/show.js +0 -64
  62. package/dist/commands/skills/show.js.map +0 -1
  63. package/dist/commands/skills/validate.d.ts +0 -25
  64. package/dist/commands/skills/validate.d.ts.map +0 -1
  65. package/dist/commands/skills/validate.js +0 -191
  66. package/dist/commands/skills/validate.js.map +0 -1
  67. package/dist/index.d.ts.map +0 -1
  68. package/dist/lib/api/registry-client.d.ts +0 -63
  69. package/dist/lib/api/registry-client.d.ts.map +0 -1
  70. package/dist/lib/api/registry-client.js +0 -167
  71. package/dist/lib/api/registry-client.js.map +0 -1
  72. package/dist/lib/api/skills-client.d.ts +0 -30
  73. package/dist/lib/api/skills-client.d.ts.map +0 -1
  74. package/dist/lib/api/skills-client.js +0 -110
  75. package/dist/lib/api/skills-client.js.map +0 -1
  76. package/dist/program.d.ts +0 -12
  77. package/dist/program.d.ts.map +0 -1
  78. package/dist/program.js +0 -186
  79. package/dist/program.js.map +0 -1
  80. package/dist/schemas/generated/api-responses.d.ts +0 -541
  81. package/dist/schemas/generated/api-responses.d.ts.map +0 -1
  82. package/dist/schemas/generated/api-responses.js +0 -313
  83. package/dist/schemas/generated/api-responses.js.map +0 -1
  84. package/dist/schemas/generated/auth.d.ts +0 -18
  85. package/dist/schemas/generated/auth.d.ts.map +0 -1
  86. package/dist/schemas/generated/auth.js +0 -18
  87. package/dist/schemas/generated/auth.js.map +0 -1
  88. package/dist/schemas/generated/index.d.ts +0 -5
  89. package/dist/schemas/generated/index.d.ts.map +0 -1
  90. package/dist/schemas/generated/index.js +0 -6
  91. package/dist/schemas/generated/index.js.map +0 -1
  92. package/dist/schemas/generated/package.d.ts +0 -43
  93. package/dist/schemas/generated/package.d.ts.map +0 -1
  94. package/dist/schemas/generated/package.js +0 -20
  95. package/dist/schemas/generated/package.js.map +0 -1
  96. package/dist/schemas/generated/skill.d.ts +0 -381
  97. package/dist/schemas/generated/skill.d.ts.map +0 -1
  98. package/dist/schemas/generated/skill.js +0 -216
  99. package/dist/schemas/generated/skill.js.map +0 -1
  100. package/dist/utils/config-manager.d.ts +0 -66
  101. package/dist/utils/config-manager.d.ts.map +0 -1
  102. package/dist/utils/config-manager.js +0 -193
  103. package/dist/utils/config-manager.js.map +0 -1
  104. package/dist/utils/errors.d.ts +0 -12
  105. package/dist/utils/errors.d.ts.map +0 -1
  106. package/dist/utils/errors.js +0 -27
  107. package/dist/utils/errors.js.map +0 -1
  108. package/dist/utils/version.d.ts +0 -5
  109. package/dist/utils/version.d.ts.map +0 -1
  110. package/dist/utils/version.js +0 -19
  111. package/dist/utils/version.js.map +0 -1
  112. package/eslint.config.js +0 -63
  113. package/src/commands/config.ts +0 -162
  114. package/src/commands/packages/pull.ts +0 -96
  115. package/src/commands/packages/run.test.ts +0 -261
  116. package/src/commands/packages/run.ts +0 -536
  117. package/src/commands/packages/search.ts +0 -83
  118. package/src/commands/packages/show.ts +0 -128
  119. package/src/commands/search.ts +0 -191
  120. package/src/commands/skills/index.ts +0 -7
  121. package/src/commands/skills/install.ts +0 -129
  122. package/src/commands/skills/list.ts +0 -116
  123. package/src/commands/skills/pack.test.ts +0 -260
  124. package/src/commands/skills/pack.ts +0 -145
  125. package/src/commands/skills/pull.ts +0 -88
  126. package/src/commands/skills/search.ts +0 -73
  127. package/src/commands/skills/show.ts +0 -72
  128. package/src/commands/skills/validate.test.ts +0 -466
  129. package/src/commands/skills/validate.ts +0 -227
  130. package/src/index.ts +0 -11
  131. package/src/lib/api/registry-client.ts +0 -223
  132. package/src/lib/api/schema.d.ts +0 -520
  133. package/src/lib/api/skills-client.ts +0 -148
  134. package/src/program.test.ts +0 -22
  135. package/src/program.ts +0 -226
  136. package/src/schemas/config.v1.schema.json +0 -37
  137. package/src/schemas/generated/api-responses.ts +0 -386
  138. package/src/schemas/generated/auth.ts +0 -21
  139. package/src/schemas/generated/index.ts +0 -5
  140. package/src/schemas/generated/package.ts +0 -29
  141. package/src/schemas/generated/skill.ts +0 -271
  142. package/src/utils/config-manager.test.ts +0 -330
  143. package/src/utils/config-manager.ts +0 -272
  144. package/src/utils/errors.test.ts +0 -25
  145. package/src/utils/errors.ts +0 -33
  146. package/src/utils/version.test.ts +0 -16
  147. package/src/utils/version.ts +0 -18
  148. package/test/integration/registry-client.test.ts +0 -180
  149. package/tsconfig.check.json +0 -9
  150. package/tsconfig.json +0 -25
  151. package/vitest.config.ts +0 -14
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;IAChC,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC"}
1
+ {"version":3,"sources":["../src/program.ts","../src/utils/version.ts","../src/utils/format.ts","../src/utils/client.ts","../src/utils/config-manager.ts","../src/commands/search.ts","../src/commands/packages/search.ts","../src/commands/packages/show.ts","../src/commands/packages/pull.ts","../src/commands/packages/run.ts","../src/commands/config.ts","../src/commands/completion.ts","../src/commands/skills/validate.ts","../src/commands/skills/pack.ts","../src/commands/skills/search.ts","../src/commands/skills/show.ts","../src/commands/skills/pull.ts","../src/commands/skills/install.ts","../src/commands/skills/list.ts","../src/utils/errors.ts","../src/index.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { getVersion } from \"./utils/version.js\";\nimport { handleUnifiedSearch } from \"./commands/search.js\";\nimport { handleSearch } from \"./commands/packages/search.js\";\nimport { handleShow } from \"./commands/packages/show.js\";\nimport { handlePull } from \"./commands/packages/pull.js\";\nimport { handleRun } from \"./commands/packages/run.js\";\nimport {\n handleConfigSet,\n handleConfigGet,\n handleConfigList,\n handleConfigClear,\n} from \"./commands/config.js\";\nimport { handleCompletion } from \"./commands/completion.js\";\nimport {\n handleSkillValidate,\n handleSkillPack,\n handleSkillSearch,\n handleSkillShow,\n handleSkillPull,\n handleSkillInstall,\n handleSkillList,\n} from \"./commands/skills/index.js\";\n\n/**\n * Creates and configures the CLI program\n *\n * Command structure:\n * - mpak search <query> - Unified search (bundles + skills)\n * - mpak bundle <command> - MCP bundle commands\n * - mpak skill <command> - Agent skill commands\n * - mpak config <command> - Configuration commands\n */\nexport function createProgram(): Command {\n const program = new Command();\n\n program\n .name(\"mpak\")\n .description(\"CLI for MCP bundles and Agent Skills\")\n .version(getVersion(), \"-v, --version\", \"Output the current version\");\n\n // ==========================================================================\n // Unified search (bundles + skills)\n // ==========================================================================\n\n program\n .command(\"search <query>\")\n .description(\"Search bundles and skills\")\n .option(\"--type <type>\", \"Filter by type (bundle, skill)\")\n .option(\"--sort <field>\", \"Sort by: downloads, recent, name\")\n .option(\"--limit <number>\", \"Limit results\", parseInt)\n .option(\"--offset <number>\", \"Pagination offset\", parseInt)\n .option(\"--json\", \"Output as JSON\")\n .action(async (query, options) => {\n await handleUnifiedSearch(query, options);\n });\n\n // ==========================================================================\n // Top-level run alias (for Claude Code integration)\n // ==========================================================================\n\n program\n .command(\"run [package]\")\n .description('Run an MCP server (alias for \"bundle run\")')\n .option(\"--update\", \"Force re-download even if cached\")\n .option(\"-l, --local <path>\", \"Run a local .mcpb bundle file\")\n .action(async (packageSpec, options) => {\n await handleRun(packageSpec || \"\", options);\n });\n\n // ==========================================================================\n // Bundle namespace (MCP bundles)\n // ==========================================================================\n\n const bundle = program.command(\"bundle\").description(\"MCP bundle commands\");\n\n bundle\n .command(\"search <query>\")\n .description(\"Search public bundles\")\n .option(\"--type <type>\", \"Filter by server type (node, python, binary)\")\n .option(\"--sort <field>\", \"Sort by: downloads, recent, name\")\n .option(\"--limit <number>\", \"Limit results\", parseInt)\n .option(\"--offset <number>\", \"Pagination offset\", parseInt)\n .option(\"--json\", \"Output as JSON\")\n .action(async (query, options) => {\n await handleSearch(query, options);\n });\n\n bundle\n .command(\"show <package>\")\n .description(\"Show detailed information about a bundle\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (packageName, options) => {\n await handleShow(packageName, options);\n });\n\n bundle\n .command(\"pull <package>\")\n .description(\"Download a bundle from the registry\")\n .option(\"-o, --output <path>\", \"Output file path\")\n .option(\"--os <os>\", \"Target OS (darwin, linux, win32)\")\n .option(\"--arch <arch>\", \"Target architecture (x64, arm64)\")\n .option(\"--json\", \"Output download info as JSON\")\n .action(async (packageSpec, options) => {\n await handlePull(packageSpec, options);\n });\n\n bundle\n .command(\"run [package]\")\n .description(\"Run an MCP server from the registry\")\n .option(\"--update\", \"Force re-download even if cached\")\n .option(\"-l, --local <path>\", \"Run a local .mcpb bundle file\")\n .action(async (packageSpec, options) => {\n await handleRun(packageSpec || \"\", options);\n });\n\n // ==========================================================================\n // Skill namespace (Agent Skills)\n // ==========================================================================\n\n const skill = program.command(\"skill\").description(\"Agent skill commands\");\n\n skill\n .command(\"validate <path>\")\n .description(\"Validate a skill directory against the Agent Skills spec\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (path, options) => {\n await handleSkillValidate(path, options);\n });\n\n skill\n .command(\"pack <path>\")\n .description(\"Create a .skill bundle from a skill directory\")\n .option(\"-o, --output <path>\", \"Output file path\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (path, options) => {\n await handleSkillPack(path, options);\n });\n\n skill\n .command(\"search <query>\")\n .description(\"Search skills in the registry\")\n .option(\"--tags <tags>\", \"Filter by tags (comma-separated)\")\n .option(\"--category <category>\", \"Filter by category\")\n .option(\n \"--surface <surface>\",\n \"Filter by surface (claude-code, claude-api, claude-ai)\",\n )\n .option(\"--sort <field>\", \"Sort by: downloads, recent, name\")\n .option(\"--limit <number>\", \"Limit results\", parseInt)\n .option(\"--offset <number>\", \"Pagination offset\", parseInt)\n .option(\"--json\", \"Output as JSON\")\n .action(async (query, options) => {\n await handleSkillSearch(query, options);\n });\n\n skill\n .command(\"show <name>\")\n .description(\"Show detailed information about a skill\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (name, options) => {\n await handleSkillShow(name, options);\n });\n\n skill\n .command(\"pull <name>\")\n .description(\"Download a .skill bundle from the registry\")\n .option(\"-o, --output <path>\", \"Output file path\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (name, options) => {\n await handleSkillPull(name, options);\n });\n\n skill\n .command(\"install <name>\")\n .description(\"Install a skill to ~/.claude/skills/\")\n .option(\"--force\", \"Overwrite existing installation\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (name, options) => {\n await handleSkillInstall(name, options);\n });\n\n skill\n .command(\"list\")\n .description(\"List installed skills\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (options) => {\n await handleSkillList(options);\n });\n\n // ==========================================================================\n // Config commands (shared for bundles and skills)\n // ==========================================================================\n\n const configCmd = program\n .command(\"config\")\n .description(\"Manage per-package configuration values\");\n\n configCmd\n .command(\"set <package> <key=value...>\")\n .description(\"Set config value(s) for a package\")\n .action(async (packageName, keyValuePairs) => {\n await handleConfigSet(packageName, keyValuePairs);\n });\n\n configCmd\n .command(\"get <package>\")\n .description(\"Show stored config for a package (values are masked)\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (packageName, options) => {\n await handleConfigGet(packageName, options);\n });\n\n configCmd\n .command(\"list\")\n .description(\"List all packages with stored config\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (options) => {\n await handleConfigList(options);\n });\n\n configCmd\n .command(\"clear <package> [key]\")\n .description(\"Clear config for a package (all values or specific key)\")\n .action(async (packageName, key) => {\n await handleConfigClear(packageName, key);\n });\n\n // ==========================================================================\n // Shell completion\n // ==========================================================================\n\n program\n .command(\"completion <shell>\")\n .description(\"Generate shell completion script (bash, zsh, fish)\")\n .action((shell) => {\n handleCompletion(shell);\n });\n\n return program;\n}\n","declare const __CLI_VERSION__: string;\n\n/**\n * Gets the current version, injected at build time by tsup.\n */\nexport function getVersion(): string {\n return typeof __CLI_VERSION__ !== \"undefined\" ? __CLI_VERSION__ : \"unknown\";\n}\n","export interface TableOptions {\n /** Column indices to right-align (0-based) */\n rightAlign?: number[];\n}\n\n/**\n * Render an aligned text table with auto-calculated column widths.\n */\nexport function table(\n headers: string[],\n rows: string[][],\n opts?: TableOptions,\n): string {\n const rightAlign = new Set(opts?.rightAlign ?? []);\n\n // Calculate column widths from headers and data\n const widths = headers.map((h, i) => {\n const maxData = rows.reduce(\n (max, row) => Math.max(max, (row[i] ?? \"\").length),\n 0,\n );\n return Math.max(h.length, maxData);\n });\n\n const pad = (text: string, width: number, colIdx: number): string =>\n rightAlign.has(colIdx) ? text.padStart(width) : text.padEnd(width);\n\n const lines: string[] = [];\n\n // Header\n lines.push(\n headers.map((h, i) => pad(h, widths[i]!, i)).join(\" \"),\n );\n\n // Rows\n for (const row of rows) {\n lines.push(\n headers\n .map((_, i) => pad(row[i] ?? \"\", widths[i]!, i))\n .join(\" \"),\n );\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Return a short trust label for a certification level.\n */\nexport function certLabel(level: number | null | undefined): string {\n if (level == null) return \"-\";\n return `L${level}`;\n}\n\n/**\n * Human-readable file size.\n */\nexport function formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n/**\n * Truncate text to a maximum length, appending \"...\" if truncated.\n */\nexport function truncate(text: string, max: number): string {\n if (text.length <= max) return text;\n return text.slice(0, max - 3) + \"...\";\n}\n\n/**\n * Print a standardized error message and exit.\n */\nexport function fmtError(message: string): never {\n console.error(`Error: ${message}`);\n process.exit(1);\n}\n","import { MpakClient } from \"@nimblebrain/mpak-sdk\";\nimport { ConfigManager } from \"./config-manager.js\";\nimport { getVersion } from \"./version.js\";\n\n/**\n * Create an MpakClient with standard CLI configuration\n * (registry URL from config, User-Agent with CLI version).\n */\nexport function createClient(): MpakClient {\n const configManager = new ConfigManager();\n const version = getVersion();\n return new MpakClient({\n registryUrl: configManager.getRegistryUrl(),\n userAgent: `mpak-cli/${version}`,\n });\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\n\n/**\n * Current config schema version\n */\nexport const CONFIG_VERSION = \"1.0.0\";\n\n/**\n * Per-package user configuration (stores user_config values)\n */\nexport interface PackageConfig {\n [key: string]: string;\n}\n\n/**\n * Configuration structure (v1.0.0)\n */\nexport interface MpakConfig {\n version: string;\n lastUpdated: string;\n registryUrl?: string;\n packages?: Record<string, PackageConfig>;\n}\n\n/**\n * Error thrown when config file is corrupted or invalid\n */\nexport class ConfigCorruptedError extends Error {\n constructor(\n message: string,\n public readonly configPath: string,\n public override readonly cause?: Error,\n ) {\n super(message);\n this.name = \"ConfigCorruptedError\";\n }\n}\n\n/**\n * Validates that a parsed object conforms to the MpakConfig schema\n */\nfunction validateConfig(data: unknown, configPath: string): MpakConfig {\n if (typeof data !== \"object\" || data === null) {\n throw new ConfigCorruptedError(\n \"Config file must be a JSON object\",\n configPath,\n );\n }\n\n const obj = data as Record<string, unknown>;\n\n // Required fields\n if (typeof obj[\"version\"] !== \"string\") {\n throw new ConfigCorruptedError(\n \"Config missing required field: version (string)\",\n configPath,\n );\n }\n\n if (typeof obj[\"lastUpdated\"] !== \"string\") {\n throw new ConfigCorruptedError(\n \"Config missing required field: lastUpdated (string)\",\n configPath,\n );\n }\n\n // Optional fields with type validation\n if (\n obj[\"registryUrl\"] !== undefined &&\n typeof obj[\"registryUrl\"] !== \"string\"\n ) {\n throw new ConfigCorruptedError(\n \"Config field registryUrl must be a string\",\n configPath,\n );\n }\n\n if (obj[\"packages\"] !== undefined) {\n if (typeof obj[\"packages\"] !== \"object\" || obj[\"packages\"] === null) {\n throw new ConfigCorruptedError(\n \"Config field packages must be an object\",\n configPath,\n );\n }\n\n // Validate each package config\n for (const [pkgName, pkgConfig] of Object.entries(\n obj[\"packages\"] as Record<string, unknown>,\n )) {\n if (typeof pkgConfig !== \"object\" || pkgConfig === null) {\n throw new ConfigCorruptedError(\n `Config packages.${pkgName} must be an object`,\n configPath,\n );\n }\n\n for (const [key, value] of Object.entries(\n pkgConfig as Record<string, unknown>,\n )) {\n if (typeof value !== \"string\") {\n throw new ConfigCorruptedError(\n `Config packages.${pkgName}.${key} must be a string`,\n configPath,\n );\n }\n }\n }\n }\n\n // Check for unknown fields (additionalProperties: false in schema)\n const knownFields = new Set([\n \"version\",\n \"lastUpdated\",\n \"registryUrl\",\n \"packages\",\n ]);\n for (const key of Object.keys(obj)) {\n if (!knownFields.has(key)) {\n throw new ConfigCorruptedError(\n `Config contains unknown field: ${key}`,\n configPath,\n );\n }\n }\n\n return data as MpakConfig;\n}\n\n/**\n * Configuration manager for CLI settings in ~/.mpak/config.json\n */\nexport class ConfigManager {\n private configDir: string;\n private configFile: string;\n private config: MpakConfig | null = null;\n\n constructor() {\n this.configDir = join(homedir(), \".mpak\");\n this.configFile = join(this.configDir, \"config.json\");\n this.ensureConfigDir();\n }\n\n private ensureConfigDir(): void {\n if (!existsSync(this.configDir)) {\n mkdirSync(this.configDir, { recursive: true, mode: 0o700 });\n }\n }\n\n loadConfig(): MpakConfig {\n if (this.config) {\n return this.config;\n }\n\n if (!existsSync(this.configFile)) {\n this.config = {\n version: CONFIG_VERSION,\n lastUpdated: new Date().toISOString(),\n };\n this.saveConfig();\n return this.config;\n }\n\n let configJson: string;\n try {\n configJson = readFileSync(this.configFile, \"utf8\");\n } catch (err) {\n throw new ConfigCorruptedError(\n `Failed to read config file: ${err instanceof Error ? err.message : String(err)}`,\n this.configFile,\n err instanceof Error ? err : undefined,\n );\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(configJson);\n } catch (err) {\n throw new ConfigCorruptedError(\n `Config file contains invalid JSON: ${err instanceof Error ? err.message : String(err)}`,\n this.configFile,\n err instanceof Error ? err : undefined,\n );\n }\n\n // Validate structure against schema\n this.config = validateConfig(parsed, this.configFile);\n return this.config;\n }\n\n private saveConfig(): void {\n if (!this.config) {\n return;\n }\n this.config.lastUpdated = new Date().toISOString();\n const configJson = JSON.stringify(this.config, null, 2);\n writeFileSync(this.configFile, configJson, { mode: 0o600 });\n }\n\n setRegistryUrl(url: string): void {\n const config = this.loadConfig();\n config.registryUrl = url;\n this.saveConfig();\n }\n\n getRegistryUrl(): string {\n const config = this.loadConfig();\n return (\n config.registryUrl ||\n process.env[\"MPAK_REGISTRY_URL\"] ||\n \"https://registry.mpak.dev\"\n );\n }\n\n /**\n * Get all stored config values for a package\n */\n getPackageConfig(packageName: string): PackageConfig | undefined {\n const config = this.loadConfig();\n return config.packages?.[packageName];\n }\n\n /**\n * Get a specific config value for a package\n */\n getPackageConfigValue(\n packageName: string,\n key: string,\n ): string | undefined {\n const packageConfig = this.getPackageConfig(packageName);\n return packageConfig?.[key];\n }\n\n /**\n * Set a config value for a package\n */\n setPackageConfigValue(\n packageName: string,\n key: string,\n value: string,\n ): void {\n const config = this.loadConfig();\n if (!config.packages) {\n config.packages = {};\n }\n if (!config.packages[packageName]) {\n config.packages[packageName] = {};\n }\n config.packages[packageName][key] = value;\n this.saveConfig();\n }\n\n /**\n * Clear all config values for a package\n */\n clearPackageConfig(packageName: string): boolean {\n const config = this.loadConfig();\n if (config.packages?.[packageName]) {\n delete config.packages[packageName];\n this.saveConfig();\n return true;\n }\n return false;\n }\n\n /**\n * Clear a specific config value for a package\n */\n clearPackageConfigValue(packageName: string, key: string): boolean {\n const config = this.loadConfig();\n if (config.packages?.[packageName]?.[key] !== undefined) {\n delete config.packages[packageName][key];\n // Clean up empty package entries\n if (Object.keys(config.packages[packageName]).length === 0) {\n delete config.packages[packageName];\n }\n this.saveConfig();\n return true;\n }\n return false;\n }\n\n /**\n * List all packages with stored config\n */\n listPackagesWithConfig(): string[] {\n const config = this.loadConfig();\n return Object.keys(config.packages || {});\n }\n}\n","import { table, certLabel, truncate, fmtError } from \"../utils/format.js\";\nimport { createClient } from \"../utils/client.js\";\n\nexport interface UnifiedSearchOptions {\n type?: \"bundle\" | \"skill\";\n sort?: \"downloads\" | \"recent\" | \"name\";\n limit?: number;\n offset?: number;\n json?: boolean;\n}\n\ninterface UnifiedResult {\n type: \"bundle\" | \"skill\";\n name: string;\n description: string;\n downloads: number;\n version: string;\n author?: string | undefined;\n certLevel?: number | null | undefined;\n // Bundle-specific\n serverType?: string | undefined;\n verified?: boolean | undefined;\n provenance?: boolean | undefined;\n // Skill-specific\n category?: string | undefined;\n}\n\n/**\n * Unified search across bundles and skills\n */\nexport async function handleUnifiedSearch(\n query: string,\n options: UnifiedSearchOptions = {},\n): Promise<void> {\n try {\n const client = createClient();\n const results: UnifiedResult[] = [];\n let bundleTotal = 0;\n let skillTotal = 0;\n\n // Search both in parallel (unless filtered by type)\n const searchBundles = !options.type || options.type === \"bundle\";\n const searchSkillsFlag = !options.type || options.type === \"skill\";\n\n const searchParams: Record<string, unknown> = { q: query };\n if (options.sort) searchParams[\"sort\"] = options.sort;\n if (options.limit) searchParams[\"limit\"] = options.limit;\n if (options.offset) searchParams[\"offset\"] = options.offset;\n\n const [bundleResult, skillResult] = await Promise.all([\n searchBundles\n ? client.searchBundles(searchParams as Parameters<typeof client.searchBundles>[0])\n : null,\n searchSkillsFlag\n ? client\n .searchSkills(searchParams as Parameters<typeof client.searchSkills>[0])\n .catch(() => null) // Skills API may not be deployed yet\n : null,\n ]);\n\n // Process bundle results\n if (bundleResult) {\n bundleTotal = bundleResult.total;\n for (const bundle of bundleResult.bundles) {\n results.push({\n type: \"bundle\",\n name: bundle.name,\n description: bundle.description || \"\",\n downloads: bundle.downloads || 0,\n version: bundle.latest_version,\n author: bundle.author?.name || undefined,\n certLevel: bundle.certification_level,\n serverType: bundle.server_type || undefined,\n verified: bundle.verified,\n provenance: !!bundle.provenance,\n });\n }\n }\n\n // Process skill results\n if (skillResult) {\n skillTotal = skillResult.total;\n for (const skill of skillResult.skills) {\n results.push({\n type: \"skill\",\n name: skill.name,\n description: skill.description || \"\",\n downloads: skill.downloads || 0,\n version: skill.latest_version,\n author: skill.author?.name || undefined,\n category: skill.category || undefined,\n });\n }\n }\n\n // Sort combined results\n if (options.sort === \"downloads\") {\n results.sort((a, b) => b.downloads - a.downloads);\n } else if (options.sort === \"name\") {\n results.sort((a, b) => a.name.localeCompare(b.name));\n }\n\n // JSON output\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n results,\n totals: { bundles: bundleTotal, skills: skillTotal },\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n // No results\n if (results.length === 0) {\n console.log(`\\nNo results found for \"${query}\"`);\n if (!searchBundles) console.log(\" (searched skills only)\");\n if (!searchSkillsFlag) console.log(\" (searched bundles only)\");\n return;\n }\n\n // Summary\n const totalResults = bundleTotal + skillTotal;\n const typeFilter = options.type ? ` (${options.type}s only)` : \"\";\n console.log(\n `\\nFound ${totalResults} result(s) for \"${query}\"${typeFilter}:`,\n );\n\n const bundles = results.filter((r) => r.type === \"bundle\");\n const skills = results.filter((r) => r.type === \"skill\");\n\n // Bundles section\n if (bundles.length > 0) {\n console.log(`\\nBundles (${bundleTotal}):\\n`);\n const bundleRows = bundles.map((r) => [\n r.name.length > 38 ? r.name.slice(0, 35) + \"...\" : r.name,\n r.version || \"-\",\n certLabel(r.certLevel),\n truncate(r.description, 40),\n ]);\n console.log(table([\"NAME\", \"VERSION\", \"TRUST\", \"DESCRIPTION\"], bundleRows));\n }\n\n // Skills section\n if (skills.length > 0) {\n console.log(`\\nSkills (${skillTotal}):\\n`);\n const skillRows = skills.map((r) => [\n r.name.length > 38 ? r.name.slice(0, 35) + \"...\" : r.name,\n r.version || \"-\",\n r.category || \"-\",\n truncate(r.description, 40),\n ]);\n console.log(table([\"NAME\", \"VERSION\", \"CATEGORY\", \"DESCRIPTION\"], skillRows));\n }\n\n // Pagination hint\n const currentLimit = options.limit || 20;\n const currentOffset = options.offset || 0;\n if (bundleTotal + skillTotal > currentOffset + results.length) {\n console.log(\n `\\n Use --offset ${currentOffset + currentLimit} to see more results.`,\n );\n }\n\n console.log();\n console.log(\n 'Use \"mpak bundle show <name>\" or \"mpak skill show <name>\" for details.',\n );\n } catch (error) {\n fmtError(error instanceof Error ? error.message : \"Search failed\");\n }\n}\n","import { table, certLabel, truncate, fmtError } from \"../../utils/format.js\";\nimport { createClient } from \"../../utils/client.js\";\n\nexport interface SearchOptions {\n type?: string;\n sort?: \"downloads\" | \"recent\" | \"name\";\n limit?: number;\n offset?: number;\n json?: boolean;\n}\n\n/**\n * Search bundles (v1 API)\n */\nexport async function handleSearch(\n query: string,\n options: SearchOptions = {},\n): Promise<void> {\n try {\n const client = createClient();\n const params: Record<string, unknown> = { q: query };\n if (options.type) params[\"type\"] = options.type;\n if (options.sort) params[\"sort\"] = options.sort;\n if (options.limit) params[\"limit\"] = options.limit;\n if (options.offset) params[\"offset\"] = options.offset;\n const result = await client.searchBundles(params as Parameters<typeof client.searchBundles>[0]);\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (result.bundles.length === 0) {\n console.log(`\\nNo bundles found for \"${query}\"`);\n return;\n }\n\n console.log(`\\nFound ${result.total} bundle(s) for \"${query}\":\\n`);\n\n const rows = result.bundles.map((b) => [\n b.name,\n `v${b.latest_version}`,\n certLabel(b.certification_level),\n truncate(b.description || \"\", 50),\n ]);\n\n console.log(table([\"NAME\", \"VERSION\", \"TRUST\", \"DESCRIPTION\"], rows));\n console.log();\n\n if (result.pagination.has_more) {\n const nextOffset = (options.offset || 0) + (options.limit || 20);\n console.log(\n `More results available. Use --offset ${nextOffset} to see more.`,\n );\n }\n\n console.log('Use \"mpak show <bundle>\" for more details');\n } catch (error) {\n fmtError(error instanceof Error ? error.message : \"Failed to search bundles\");\n }\n}\n","import { fmtError } from \"../../utils/format.js\";\nimport { createClient } from \"../../utils/client.js\";\n\nexport interface ShowOptions {\n json?: boolean;\n}\n\nconst CERT_LEVEL_LABELS: Record<number, string> = {\n 1: \"L1 Basic\",\n 2: \"L2 Verified\",\n 3: \"L3 Hardened\",\n 4: \"L4 Certified\",\n};\n\n/**\n * Show detailed information about a bundle (v1 API)\n */\nexport async function handleShow(\n packageName: string,\n options: ShowOptions = {},\n): Promise<void> {\n try {\n const client = createClient();\n\n // Fetch bundle details and versions in parallel\n const [bundle, versionsInfo] = await Promise.all([\n client.getBundle(packageName),\n client.getBundleVersions(packageName),\n ]);\n\n if (options.json) {\n console.log(\n JSON.stringify(\n { ...bundle, versions_detail: versionsInfo.versions },\n null,\n 2,\n ),\n );\n return;\n }\n\n // Header\n const verified = bundle.verified ? \"\\u2713 \" : \"\";\n const provenance = bundle.provenance ? \"\\uD83D\\uDD12 \" : \"\";\n console.log(\n `\\n${verified}${provenance}${bundle.display_name || bundle.name} v${bundle.latest_version}\\n`,\n );\n\n // Description\n if (bundle.description) {\n console.log(bundle.description);\n console.log();\n }\n\n // Basic info\n console.log(\"Bundle Information:\");\n console.log(` Name: ${bundle.name}`);\n if (bundle.author?.name) {\n console.log(` Author: ${bundle.author.name}`);\n }\n if (bundle.server_type) {\n console.log(` Type: ${bundle.server_type}`);\n }\n if (bundle.license) {\n console.log(` License: ${bundle.license}`);\n }\n if (bundle.homepage) {\n console.log(` Homepage: ${bundle.homepage}`);\n }\n console.log();\n\n // Trust / Certification\n const certLevel = bundle.certification_level;\n const certification = bundle.certification;\n\n if (certLevel != null) {\n const label = CERT_LEVEL_LABELS[certLevel] ?? `L${certLevel}`;\n console.log(`Trust: ${label}`);\n if (certification?.controls_passed != null && certification?.controls_total != null) {\n console.log(` Controls: ${certification.controls_passed}/${certification.controls_total} passed`);\n }\n console.log();\n }\n\n // Provenance info\n if (bundle.provenance) {\n console.log(\"Provenance:\");\n console.log(` Repository: ${bundle.provenance.repository}`);\n console.log(` Commit: ${bundle.provenance.sha.substring(0, 12)}`);\n console.log(` Provider: ${bundle.provenance.provider}`);\n console.log();\n }\n\n // Stats\n console.log(\"Statistics:\");\n console.log(` Downloads: ${bundle.downloads.toLocaleString()}`);\n console.log(\n ` Published: ${new Date(bundle.published_at as string).toLocaleDateString()}`,\n );\n console.log();\n\n // Tools\n if (bundle.tools && bundle.tools.length > 0) {\n console.log(`Tools (${bundle.tools.length}):`);\n for (const tool of bundle.tools) {\n console.log(` - ${tool.name}`);\n if (tool.description) {\n console.log(` ${tool.description}`);\n }\n }\n console.log();\n }\n\n // Versions with platforms\n if (versionsInfo.versions && versionsInfo.versions.length > 0) {\n console.log(`Versions (${versionsInfo.versions.length}):`);\n const recentVersions = versionsInfo.versions.slice(0, 5);\n for (const version of recentVersions) {\n const date = new Date(\n version.published_at as string,\n ).toLocaleDateString();\n const downloads = version.downloads.toLocaleString();\n const isLatest =\n version.version === versionsInfo.latest ? \" (latest)\" : \"\";\n const provTag = version.provenance ? \" \\uD83D\\uDD12\" : \"\";\n\n // Format platforms\n const platformStrs = version.platforms.map(\n (p) => `${p.os}-${p.arch}`,\n );\n const platformsDisplay =\n platformStrs.length > 0\n ? ` [${platformStrs.join(\", \")}]`\n : \"\";\n\n console.log(\n ` ${version.version}${isLatest}${provTag} - ${date} - ${downloads} downloads${platformsDisplay}`,\n );\n }\n if (versionsInfo.versions.length > 5) {\n console.log(\n ` ... and ${versionsInfo.versions.length - 5} more`,\n );\n }\n console.log();\n }\n\n // Available platforms for latest version\n const latestVersion = versionsInfo.versions.find(\n (v) => v.version === versionsInfo.latest,\n );\n if (latestVersion && latestVersion.platforms.length > 0) {\n console.log(\"Available Platforms:\");\n for (const platform of latestVersion.platforms) {\n console.log(` - ${platform.os}-${platform.arch}`);\n }\n console.log();\n }\n\n // Install instructions\n console.log(\"Install:\");\n console.log(` mpak install ${bundle.name}`);\n console.log();\n console.log(\"Pull (download only):\");\n console.log(` mpak pull ${bundle.name}`);\n } catch (error) {\n fmtError(error instanceof Error ? error.message : \"Failed to get bundle details\");\n }\n}\n","import { writeFileSync } from \"fs\";\nimport { resolve } from \"path\";\nimport { MpakClient } from \"@nimblebrain/mpak-sdk\";\nimport { fmtError } from \"../../utils/format.js\";\nimport { createClient } from \"../../utils/client.js\";\n\nexport interface PullOptions {\n output?: string;\n json?: boolean;\n os?: string;\n arch?: string;\n}\n\n/**\n * Parse package specification into name and version\n * Examples:\n * @scope/name -> { name: '@scope/name', version: undefined }\n * @scope/name@1.0.0 -> { name: '@scope/name', version: '1.0.0' }\n */\nfunction parsePackageSpec(spec: string): { name: string; version?: string } {\n // Find the last @ which separates version from package name\n // Package names start with @, so we need to find the second @\n const lastAtIndex = spec.lastIndexOf(\"@\");\n\n if (lastAtIndex <= 0) {\n // No version specified or invalid format\n return { name: spec };\n }\n\n const name = spec.substring(0, lastAtIndex);\n const version = spec.substring(lastAtIndex + 1);\n\n // Validate that the name still starts with @\n if (!name.startsWith(\"@\")) {\n // This means the @ was part of the package name, not a version separator\n return { name: spec };\n }\n\n return { name, version };\n}\n\n/**\n * Pull (download) a package from the registry\n */\nexport async function handlePull(\n packageSpec: string,\n options: PullOptions = {},\n): Promise<void> {\n try {\n const { name, version } = parsePackageSpec(packageSpec);\n\n const client = createClient();\n\n // Detect platform (or use explicit overrides)\n const detectedPlatform = MpakClient.detectPlatform();\n const platform = {\n os: options.os || detectedPlatform.os,\n arch: options.arch || detectedPlatform.arch,\n };\n\n console.log(\n `=> Fetching ${version ? `${name}@${version}` : `${name} (latest)`}...`,\n );\n console.log(` Platform: ${platform.os}-${platform.arch}`);\n\n // Get download info with platform\n const downloadInfo = await client.getBundleDownload(\n name,\n version || \"latest\",\n platform,\n );\n\n if (options.json) {\n console.log(JSON.stringify(downloadInfo, null, 2));\n return;\n }\n\n const bundle = downloadInfo.bundle;\n console.log(` Version: ${bundle.version}`);\n console.log(\n ` Artifact: ${bundle.platform.os}-${bundle.platform.arch}`,\n );\n console.log(\n ` Size: ${(bundle.size / (1024 * 1024)).toFixed(2)} MB`,\n );\n\n // Determine output filename (include platform in name)\n const platformSuffix = `${bundle.platform.os}-${bundle.platform.arch}`;\n const defaultFilename = `${name.replace(\"@\", \"\").replace(\"/\", \"-\")}-${bundle.version}-${platformSuffix}.mcpb`;\n const outputPath = options.output\n ? resolve(options.output)\n : resolve(defaultFilename);\n\n console.log(`\\n=> Downloading to ${outputPath}...`);\n\n // Download the bundle\n const response = await fetch(downloadInfo.url);\n if (!response.ok) {\n throw new Error(`Failed to download bundle: ${response.statusText}`);\n }\n const arrayBuffer = await response.arrayBuffer();\n writeFileSync(outputPath, Buffer.from(arrayBuffer));\n\n console.log(`\\n=> Bundle downloaded successfully!`);\n console.log(` File: ${outputPath}`);\n console.log(` SHA256: ${bundle.sha256.substring(0, 16)}...`);\n } catch (error) {\n fmtError(error instanceof Error ? error.message : \"Failed to pull bundle\");\n }\n}\n","import { execFileSync, spawn, spawnSync } from \"child_process\";\nimport { createInterface } from \"readline\";\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n chmodSync,\n rmSync,\n statSync,\n} from \"fs\";\nimport { createHash } from \"crypto\";\nimport { homedir } from \"os\";\nimport { join, dirname, resolve, basename } from \"path\";\nimport { MpakClient } from \"@nimblebrain/mpak-sdk\";\nimport { createClient } from \"../../utils/client.js\";\nimport { ConfigManager } from \"../../utils/config-manager.js\";\n\nexport interface RunOptions {\n update?: boolean;\n local?: string; // Path to local .mcpb file\n}\n\ninterface McpConfig {\n command: string;\n args: string[];\n env?: Record<string, string>;\n}\n\n/**\n * User configuration field definition (MCPB v0.3 spec)\n */\ninterface UserConfigField {\n type: \"string\" | \"number\" | \"boolean\";\n title?: string;\n description?: string;\n sensitive?: boolean;\n required?: boolean;\n default?: string | number | boolean;\n}\n\ninterface McpbManifest {\n manifest_version: string;\n name: string;\n version: string;\n description: string;\n user_config?: Record<string, UserConfigField>;\n server: {\n type: \"node\" | \"python\" | \"binary\";\n entry_point: string;\n mcp_config: McpConfig;\n };\n}\n\ninterface CacheMetadata {\n version: string;\n pulledAt: string;\n platform: { os: string; arch: string };\n}\n\n/**\n * Parse package specification into name and version\n * @example parsePackageSpec('@scope/name') => { name: '@scope/name' }\n * @example parsePackageSpec('@scope/name@1.0.0') => { name: '@scope/name', version: '1.0.0' }\n */\nexport function parsePackageSpec(spec: string): {\n name: string;\n version?: string;\n} {\n const lastAtIndex = spec.lastIndexOf(\"@\");\n\n if (lastAtIndex <= 0) {\n return { name: spec };\n }\n\n const name = spec.substring(0, lastAtIndex);\n const version = spec.substring(lastAtIndex + 1);\n\n if (!name.startsWith(\"@\")) {\n return { name: spec };\n }\n\n return { name, version };\n}\n\n/**\n * Get cache directory for a package\n * @example getCacheDir('@scope/name') => '~/.mpak/cache/scope-name'\n */\nexport function getCacheDir(packageName: string): string {\n const cacheBase = join(homedir(), \".mpak\", \"cache\");\n // @scope/name -> scope/name\n const safeName = packageName.replace(\"@\", \"\").replace(\"/\", \"-\");\n return join(cacheBase, safeName);\n}\n\n/**\n * Read cache metadata\n */\nfunction getCacheMetadata(cacheDir: string): CacheMetadata | null {\n const metaPath = join(cacheDir, \".mpak-meta.json\");\n if (!existsSync(metaPath)) {\n return null;\n }\n try {\n return JSON.parse(readFileSync(metaPath, \"utf8\"));\n } catch {\n return null;\n }\n}\n\n/**\n * Write cache metadata\n */\nfunction writeCacheMetadata(\n cacheDir: string,\n metadata: CacheMetadata,\n): void {\n const metaPath = join(cacheDir, \".mpak-meta.json\");\n writeFileSync(metaPath, JSON.stringify(metadata, null, 2));\n}\n\n/**\n * Maximum allowed uncompressed size for a bundle (500MB).\n * Protects against zip bombs that could exhaust disk space.\n */\nconst MAX_UNCOMPRESSED_SIZE = 500 * 1024 * 1024;\n\n/**\n * Extract ZIP file to directory (simple implementation without external deps)\n */\nasync function extractZip(\n zipPath: string,\n destDir: string,\n): Promise<void> {\n // Use native unzip command (available on macOS, Linux, and Windows with WSL)\n // Check uncompressed size before extraction to prevent zip bombs\n try {\n const listOutput = execFileSync('unzip', ['-l', zipPath], {\n stdio: \"pipe\",\n encoding: \"utf8\",\n });\n const totalMatch = listOutput.match(/^\\s*(\\d+)\\s+\\d+\\s+files?$/m);\n if (totalMatch) {\n const totalSize = parseInt(totalMatch[1]!, 10);\n if (totalSize > MAX_UNCOMPRESSED_SIZE) {\n throw new Error(\n `Bundle uncompressed size (${Math.round(totalSize / 1024 / 1024)}MB) exceeds maximum allowed (${MAX_UNCOMPRESSED_SIZE / (1024 * 1024)}MB)`,\n );\n }\n }\n } catch (error: unknown) {\n if (\n error instanceof Error &&\n error.message.includes(\"exceeds maximum allowed\")\n ) {\n throw error;\n }\n // Fail closed: if we can't verify the size, don't extract\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Cannot verify bundle size before extraction: ${message}`);\n }\n\n // Ensure destination exists\n mkdirSync(destDir, { recursive: true });\n\n try {\n execFileSync('unzip', ['-o', '-q', zipPath, '-d', destDir], {\n stdio: \"pipe\",\n });\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to extract bundle: ${message}`);\n }\n}\n\n/**\n * Read manifest from extracted bundle\n */\nfunction readManifest(cacheDir: string): McpbManifest {\n const manifestPath = join(cacheDir, \"manifest.json\");\n if (!existsSync(manifestPath)) {\n throw new Error(`Manifest not found in bundle: ${manifestPath}`);\n }\n return JSON.parse(readFileSync(manifestPath, \"utf8\"));\n}\n\n/**\n * Resolve placeholders in args (e.g., ${__dirname})\n * @example resolveArgs(['${__dirname}/index.js'], '/cache') => ['/cache/index.js']\n */\nexport function resolveArgs(args: string[], cacheDir: string): string[] {\n return args.map((arg) =>\n arg.replace(/\\$\\{__dirname\\}/g, cacheDir),\n );\n}\n\n/**\n * Resolve the MPAK_WORKSPACE value.\n * If an override is provided (via env), use it. Otherwise default to $cwd/.mpak.\n */\nexport function resolveWorkspace(\n override: string | undefined,\n cwd: string,\n): string {\n return override || join(cwd, \".mpak\");\n}\n\n/**\n * Substitute ${user_config.*} placeholders in a string\n * @example substituteUserConfig('${user_config.api_key}', { api_key: 'secret' }) => 'secret'\n */\nexport function substituteUserConfig(\n value: string,\n userConfigValues: Record<string, string>,\n): string {\n return value.replace(\n /\\$\\{user_config\\.([^}]+)\\}/g,\n (match, key: string) => {\n return userConfigValues[key] ?? match;\n },\n );\n}\n\n/**\n * Substitute ${user_config.*} placeholders in env vars\n */\nexport function substituteEnvVars(\n env: Record<string, string> | undefined,\n userConfigValues: Record<string, string>,\n): Record<string, string> {\n if (!env) return {};\n const result: Record<string, string> = {};\n for (const [key, value] of Object.entries(env)) {\n result[key] = substituteUserConfig(value, userConfigValues);\n }\n return result;\n}\n\n/**\n * Get cache directory for a local bundle.\n * Uses hash of absolute path to avoid collisions.\n */\nexport function getLocalCacheDir(bundlePath: string): string {\n const absolutePath = resolve(bundlePath);\n const hash = createHash(\"md5\")\n .update(absolutePath)\n .digest(\"hex\")\n .slice(0, 12);\n return join(homedir(), \".mpak\", \"cache\", \"_local\", hash);\n}\n\n/**\n * Check if local bundle needs re-extraction.\n * Returns true if cache doesn't exist or bundle was modified after extraction.\n */\nexport function localBundleNeedsExtract(\n bundlePath: string,\n cacheDir: string,\n): boolean {\n const metaPath = join(cacheDir, \".mpak-meta.json\");\n if (!existsSync(metaPath)) return true;\n\n try {\n const meta = JSON.parse(readFileSync(metaPath, \"utf8\"));\n const bundleStat = statSync(bundlePath);\n return bundleStat.mtimeMs > new Date(meta.extractedAt).getTime();\n } catch {\n return true;\n }\n}\n\n/**\n * Prompt user for a config value (interactive terminal input)\n */\nasync function promptForValue(\n field: UserConfigField,\n key: string,\n): Promise<string> {\n return new Promise((resolvePrompt) => {\n const rl = createInterface({\n input: process.stdin,\n output: process.stderr,\n terminal: true,\n });\n\n const label = field.title || key;\n const hint = field.description ? ` (${field.description})` : \"\";\n const defaultHint =\n field.default !== undefined ? ` [${field.default}]` : \"\";\n const prompt = `=> ${label}${hint}${defaultHint}: `;\n\n // For sensitive fields, we'd ideally hide input, but Node's readline\n // doesn't support this natively. We'll just note it's sensitive.\n if (field.sensitive) {\n process.stderr.write(`=> (sensitive input)\\n`);\n }\n\n rl.question(prompt, (answer) => {\n rl.close();\n // Use default if empty and default exists\n if (!answer && field.default !== undefined) {\n resolvePrompt(String(field.default));\n } else {\n resolvePrompt(answer);\n }\n });\n });\n}\n\n/**\n * Check if we're in an interactive terminal\n */\nfunction isInteractive(): boolean {\n return process.stdin.isTTY === true;\n}\n\n/**\n * Gather user config values from stored config\n * Prompts for missing required values if interactive\n */\nasync function gatherUserConfigValues(\n packageName: string,\n userConfig: Record<string, UserConfigField>,\n configManager: ConfigManager,\n): Promise<Record<string, string>> {\n const result: Record<string, string> = {};\n const storedConfig = configManager.getPackageConfig(packageName) || {};\n const missingRequired: Array<{ key: string; field: UserConfigField }> =\n [];\n\n for (const [key, field] of Object.entries(userConfig)) {\n // Priority: 1) stored config, 2) default value\n const storedValue = storedConfig[key];\n\n if (storedValue !== undefined) {\n result[key] = storedValue;\n } else if (field.default !== undefined) {\n result[key] = String(field.default);\n } else if (field.required) {\n missingRequired.push({ key, field });\n }\n }\n\n // Prompt for missing required values if interactive\n if (missingRequired.length > 0) {\n if (!isInteractive()) {\n const missingKeys = missingRequired\n .map((m) => m.key)\n .join(\", \");\n process.stderr.write(\n `=> Error: Missing required config: ${missingKeys}\\n`,\n );\n process.stderr.write(\n `=> Run 'mpak config set ${packageName} <key>=<value>' to set values\\n`,\n );\n process.exit(1);\n }\n\n process.stderr.write(`=> Package requires configuration:\\n`);\n for (const { key, field } of missingRequired) {\n const value = await promptForValue(field, key);\n if (!value && field.required) {\n process.stderr.write(\n `=> Error: ${field.title || key} is required\\n`,\n );\n process.exit(1);\n }\n result[key] = value;\n\n // Offer to save the value\n if (value) {\n const rl = createInterface({\n input: process.stdin,\n output: process.stderr,\n terminal: true,\n });\n await new Promise<void>((resolvePrompt) => {\n rl.question(\n `=> Save ${field.title || key} for future runs? [Y/n]: `,\n (answer) => {\n rl.close();\n if (answer.toLowerCase() !== \"n\") {\n configManager.setPackageConfigValue(\n packageName,\n key,\n value,\n );\n process.stderr.write(\n `=> Saved to ~/.mpak/config.json\\n`,\n );\n }\n resolvePrompt();\n },\n );\n });\n }\n }\n }\n\n return result;\n}\n\n/**\n * Find Python executable (tries python3 first, then python)\n */\nfunction findPythonCommand(): string {\n // Try python3 first (preferred on macOS/Linux)\n const result = spawnSync(\"python3\", [\"--version\"], { stdio: \"pipe\" });\n if (result.status === 0) {\n return \"python3\";\n }\n // Fall back to python\n return \"python\";\n}\n\n/**\n * Download a bundle to a file path\n */\nasync function downloadBundle(\n downloadUrl: string,\n outputPath: string,\n): Promise<void> {\n const response = await fetch(downloadUrl);\n if (!response.ok) {\n throw new Error(\n `Failed to download bundle: ${response.statusText}`,\n );\n }\n const arrayBuffer = await response.arrayBuffer();\n writeFileSync(outputPath, Buffer.from(arrayBuffer));\n}\n\n/**\n * Run a package from the registry or a local bundle file\n */\nexport async function handleRun(\n packageSpec: string,\n options: RunOptions = {},\n): Promise<void> {\n // Validate that either --local or package spec is provided\n if (!options.local && !packageSpec) {\n process.stderr.write(\n `=> Error: Either provide a package name or use --local <path>\\n`,\n );\n process.exit(1);\n }\n\n let cacheDir: string;\n let packageName: string;\n\n if (options.local) {\n // === LOCAL BUNDLE MODE ===\n const bundlePath = resolve(options.local);\n\n // Validate bundle exists\n if (!existsSync(bundlePath)) {\n process.stderr.write(\n `=> Error: Bundle not found: ${bundlePath}\\n`,\n );\n process.exit(1);\n }\n\n // Validate .mcpb extension\n if (!bundlePath.endsWith(\".mcpb\")) {\n process.stderr.write(\n `=> Error: Not an MCPB bundle: ${bundlePath}\\n`,\n );\n process.exit(1);\n }\n\n cacheDir = getLocalCacheDir(bundlePath);\n const needsExtract =\n options.update ||\n localBundleNeedsExtract(bundlePath, cacheDir);\n\n if (needsExtract) {\n // Clear old extraction\n if (existsSync(cacheDir)) {\n rmSync(cacheDir, { recursive: true, force: true });\n }\n mkdirSync(cacheDir, { recursive: true });\n\n process.stderr.write(\n `=> Extracting ${basename(bundlePath)}...\\n`,\n );\n await extractZip(bundlePath, cacheDir);\n\n // Write local metadata\n writeFileSync(\n join(cacheDir, \".mpak-meta.json\"),\n JSON.stringify({\n localPath: bundlePath,\n extractedAt: new Date().toISOString(),\n }),\n );\n }\n\n // Read manifest to get package name for config lookup\n const manifest = readManifest(cacheDir);\n packageName = manifest.name;\n process.stderr.write(`=> Running ${packageName} (local)\\n`);\n } else {\n // === REGISTRY MODE ===\n const { name, version: requestedVersion } =\n parsePackageSpec(packageSpec);\n packageName = name;\n const client = createClient();\n const platform = MpakClient.detectPlatform();\n cacheDir = getCacheDir(name);\n\n let needsPull = true;\n const cachedMeta = getCacheMetadata(cacheDir);\n\n // Check if we have a cached version\n if (cachedMeta && !options.update) {\n if (requestedVersion) {\n // Specific version requested - check if cached version matches\n needsPull = cachedMeta.version !== requestedVersion;\n } else {\n // Latest requested - use cache (user can --update to refresh)\n needsPull = false;\n }\n }\n\n if (needsPull) {\n // Fetch download info\n const downloadInfo = await client.getBundleDownload(\n name,\n requestedVersion || \"latest\",\n platform,\n );\n const bundle = downloadInfo.bundle;\n\n // Check if cached version is already the latest\n if (\n cachedMeta &&\n cachedMeta.version === bundle.version &&\n !options.update\n ) {\n needsPull = false;\n }\n\n if (needsPull) {\n // Download to temp file\n const tempPath = join(\n homedir(),\n \".mpak\",\n \"tmp\",\n `${Date.now()}.mcpb`,\n );\n mkdirSync(dirname(tempPath), { recursive: true });\n\n process.stderr.write(\n `=> Pulling ${name}@${bundle.version}...\\n`,\n );\n await downloadBundle(downloadInfo.url, tempPath);\n\n // Clear old cache and extract\n if (existsSync(cacheDir)) {\n rmSync(cacheDir, { recursive: true, force: true });\n }\n mkdirSync(cacheDir, { recursive: true });\n\n await extractZip(tempPath, cacheDir);\n\n // Write metadata\n writeCacheMetadata(cacheDir, {\n version: bundle.version,\n pulledAt: new Date().toISOString(),\n platform: bundle.platform,\n });\n\n // Cleanup temp file\n rmSync(tempPath, { force: true });\n\n process.stderr.write(\n `=> Cached ${name}@${bundle.version}\\n`,\n );\n }\n }\n }\n\n // Read manifest and execute\n const manifest = readManifest(cacheDir);\n const { type, entry_point, mcp_config } = manifest.server;\n\n // Handle user_config substitution\n let userConfigValues: Record<string, string> = {};\n if (\n manifest.user_config &&\n Object.keys(manifest.user_config).length > 0\n ) {\n const configManager = new ConfigManager();\n userConfigValues = await gatherUserConfigValues(\n packageName,\n manifest.user_config,\n configManager,\n );\n }\n\n // Substitute user_config placeholders in env vars\n // Priority: process.env (from parent like Claude Desktop) > substituted values (from mpak config)\n const substitutedEnv = substituteEnvVars(\n mcp_config.env,\n userConfigValues,\n );\n\n let command: string;\n let args: string[];\n const env: Record<string, string | undefined> = {\n ...substitutedEnv,\n ...process.env,\n };\n\n switch (type) {\n case \"binary\": {\n // For binary, the entry_point is the executable path relative to bundle\n command = join(cacheDir, entry_point);\n args = resolveArgs(mcp_config.args || [], cacheDir);\n\n // Ensure binary is executable\n try {\n chmodSync(command, 0o755);\n } catch {\n // Ignore chmod errors on Windows\n }\n break;\n }\n\n case \"node\": {\n command = mcp_config.command || \"node\";\n // Use mcp_config.args directly if provided, otherwise fall back to entry_point\n if (mcp_config.args && mcp_config.args.length > 0) {\n args = resolveArgs(mcp_config.args, cacheDir);\n } else {\n args = [join(cacheDir, entry_point)];\n }\n break;\n }\n\n case \"python\": {\n // Use manifest command if specified, otherwise auto-detect python\n command =\n mcp_config.command === \"python\"\n ? findPythonCommand()\n : mcp_config.command || findPythonCommand();\n\n // Use mcp_config.args directly if provided, otherwise fall back to entry_point\n if (mcp_config.args && mcp_config.args.length > 0) {\n args = resolveArgs(mcp_config.args, cacheDir);\n } else {\n args = [join(cacheDir, entry_point)];\n }\n\n // Set PYTHONPATH to deps/ directory for dependency resolution\n const depsDir = join(cacheDir, \"deps\");\n const existingPythonPath = process.env[\"PYTHONPATH\"];\n env[\"PYTHONPATH\"] = existingPythonPath\n ? `${depsDir}:${existingPythonPath}`\n : depsDir;\n break;\n }\n\n default:\n throw new Error(`Unsupported server type: ${type as string}`);\n }\n\n // Provide a project-local workspace directory for stateful bundles.\n // Defaults to $CWD/.mpak — user can override via MPAK_WORKSPACE in their environment.\n env[\"MPAK_WORKSPACE\"] = resolveWorkspace(env[\"MPAK_WORKSPACE\"], process.cwd());\n\n // Spawn with stdio passthrough for MCP\n const child = spawn(command, args, {\n stdio: [\"inherit\", \"inherit\", \"inherit\"],\n env,\n cwd: cacheDir,\n });\n\n // Forward signals\n process.on(\"SIGINT\", () => child.kill(\"SIGINT\"));\n process.on(\"SIGTERM\", () => child.kill(\"SIGTERM\"));\n\n // Wait for exit\n child.on(\"exit\", (code) => {\n process.exit(code ?? 0);\n });\n\n child.on(\"error\", (error) => {\n process.stderr.write(\n `=> Failed to start server: ${error.message}\\n`,\n );\n process.exit(1);\n });\n}\n","import { ConfigManager } from \"../utils/config-manager.js\";\nimport type { PackageConfig } from \"../utils/config-manager.js\";\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface ConfigSetOptions {}\n\nexport interface ConfigGetOptions {\n json?: boolean;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface ConfigClearOptions {}\n\n/**\n * Mask sensitive values for display (show first 4 chars, rest as *)\n */\nfunction maskValue(value: string): string {\n if (value.length <= 4) {\n return \"*\".repeat(value.length);\n }\n return value.substring(0, 4) + \"*\".repeat(value.length - 4);\n}\n\n/**\n * Set config value(s) for a package\n * @example mpak config set @scope/name api_key=xxx\n * @example mpak config set @scope/name api_key=xxx other_key=yyy\n */\nexport async function handleConfigSet(\n packageName: string,\n keyValuePairs: string[],\n _options: ConfigSetOptions = {},\n): Promise<void> {\n if (keyValuePairs.length === 0) {\n process.stderr.write(\n \"Error: At least one key=value pair is required\\n\",\n );\n process.stderr.write(\n \"Usage: mpak config set <package> <key>=<value> [<key>=<value>...]\\n\",\n );\n process.exit(1);\n }\n\n const configManager = new ConfigManager();\n let setCount = 0;\n\n for (const pair of keyValuePairs) {\n const eqIndex = pair.indexOf(\"=\");\n if (eqIndex === -1) {\n process.stderr.write(\n `Error: Invalid format \"${pair}\". Expected key=value\\n`,\n );\n process.exit(1);\n }\n\n const key = pair.substring(0, eqIndex);\n const value = pair.substring(eqIndex + 1);\n\n if (!key) {\n process.stderr.write(`Error: Empty key in \"${pair}\"\\n`);\n process.exit(1);\n }\n\n configManager.setPackageConfigValue(packageName, key, value);\n setCount++;\n }\n\n console.log(`Set ${setCount} config value(s) for ${packageName}`);\n}\n\n/**\n * Get config values for a package\n * @example mpak config get @scope/name\n * @example mpak config get @scope/name --json\n */\nexport async function handleConfigGet(\n packageName: string,\n options: ConfigGetOptions = {},\n): Promise<void> {\n const configManager = new ConfigManager();\n const config = configManager.getPackageConfig(packageName);\n\n if (!config || Object.keys(config).length === 0) {\n if (options.json) {\n console.log(JSON.stringify({}, null, 2));\n } else {\n console.log(`No config stored for ${packageName}`);\n }\n return;\n }\n\n if (options.json) {\n // Mask values in JSON output too\n const masked: PackageConfig = {};\n for (const [key, value] of Object.entries(config)) {\n masked[key] = maskValue(value);\n }\n console.log(JSON.stringify(masked, null, 2));\n } else {\n console.log(`Config for ${packageName}:`);\n for (const [key, value] of Object.entries(config)) {\n console.log(` ${key}: ${maskValue(value)}`);\n }\n }\n}\n\n/**\n * List all packages with stored config\n * @example mpak config list\n */\nexport async function handleConfigList(\n options: ConfigGetOptions = {},\n): Promise<void> {\n const configManager = new ConfigManager();\n const packages = configManager.listPackagesWithConfig();\n\n if (packages.length === 0) {\n if (options.json) {\n console.log(JSON.stringify([], null, 2));\n } else {\n console.log(\"No packages have stored config\");\n }\n return;\n }\n\n if (options.json) {\n console.log(JSON.stringify(packages, null, 2));\n } else {\n console.log(\"Packages with stored config:\");\n for (const pkg of packages) {\n const config = configManager.getPackageConfig(pkg);\n const keyCount = config ? Object.keys(config).length : 0;\n console.log(\n ` ${pkg} (${keyCount} value${keyCount === 1 ? \"\" : \"s\"})`,\n );\n }\n }\n}\n\n/**\n * Clear config for a package\n * @example mpak config clear @scope/name # clears all\n * @example mpak config clear @scope/name api_key # clears specific key\n */\nexport async function handleConfigClear(\n packageName: string,\n key?: string,\n _options: ConfigClearOptions = {},\n): Promise<void> {\n const configManager = new ConfigManager();\n\n if (key) {\n // Clear specific key\n const cleared = configManager.clearPackageConfigValue(packageName, key);\n if (cleared) {\n console.log(`Cleared ${key} for ${packageName}`);\n } else {\n console.log(`No value found for ${key} in ${packageName}`);\n }\n } else {\n // Clear all config for package\n const cleared = configManager.clearPackageConfig(packageName);\n if (cleared) {\n console.log(`Cleared all config for ${packageName}`);\n } else {\n console.log(`No config found for ${packageName}`);\n }\n }\n}\n","/**\n * Shell completion script generation for mpak CLI.\n *\n * Usage:\n * eval \"$(mpak completion bash)\"\n * eval \"$(mpak completion zsh)\"\n * mpak completion fish | source\n */\n\nconst TOP_COMMANDS = [\n \"search\",\n \"run\",\n \"bundle\",\n \"skill\",\n \"config\",\n \"completion\",\n \"help\",\n];\n\nconst BUNDLE_SUBCOMMANDS = [\"search\", \"show\", \"pull\", \"run\"];\nconst SKILL_SUBCOMMANDS = [\n \"validate\",\n \"pack\",\n \"search\",\n \"show\",\n \"pull\",\n \"install\",\n \"list\",\n];\nconst CONFIG_SUBCOMMANDS = [\"set\", \"get\", \"list\", \"clear\"];\nconst COMPLETION_SHELLS = [\"bash\", \"zsh\", \"fish\"];\n\nfunction bashScript(): string {\n return `# mpak bash completion\n# Install: eval \"$(mpak completion bash)\"\n# Or: mpak completion bash >> ~/.bashrc\n\n_mpak_completions() {\n local cur prev words cword\n _init_completion || return\n\n local top_commands=\"${TOP_COMMANDS.join(\" \")}\"\n local bundle_sub=\"${BUNDLE_SUBCOMMANDS.join(\" \")}\"\n local skill_sub=\"${SKILL_SUBCOMMANDS.join(\" \")}\"\n local config_sub=\"${CONFIG_SUBCOMMANDS.join(\" \")}\"\n local completion_shells=\"${COMPLETION_SHELLS.join(\" \")}\"\n\n case \"\\${cword}\" in\n 1)\n COMPREPLY=( $(compgen -W \"\\${top_commands}\" -- \"\\${cur}\") )\n return\n ;;\n 2)\n case \"\\${prev}\" in\n bundle)\n COMPREPLY=( $(compgen -W \"\\${bundle_sub}\" -- \"\\${cur}\") )\n return\n ;;\n skill)\n COMPREPLY=( $(compgen -W \"\\${skill_sub}\" -- \"\\${cur}\") )\n return\n ;;\n config)\n COMPREPLY=( $(compgen -W \"\\${config_sub}\" -- \"\\${cur}\") )\n return\n ;;\n completion)\n COMPREPLY=( $(compgen -W \"\\${completion_shells}\" -- \"\\${cur}\") )\n return\n ;;\n esac\n ;;\n esac\n}\n\ncomplete -F _mpak_completions mpak\n`;\n}\n\nfunction zshScript(): string {\n return `#compdef mpak\n# mpak zsh completion\n# Install: eval \"$(mpak completion zsh)\"\n# Or: mpak completion zsh > ~/.zsh/completions/_mpak\n\n_mpak() {\n local -a top_commands bundle_sub skill_sub config_sub completion_shells\n\n top_commands=(\n 'search:Search bundles and skills'\n 'run:Run an MCP server'\n 'bundle:MCP bundle commands'\n 'skill:Agent skill commands'\n 'config:Manage per-package configuration'\n 'completion:Generate shell completions'\n 'help:Display help'\n )\n\n bundle_sub=(\n 'search:Search public bundles'\n 'show:Show bundle details'\n 'pull:Download a bundle'\n 'run:Run an MCP server from the registry'\n )\n\n skill_sub=(\n 'validate:Validate a skill directory'\n 'pack:Create a .skill bundle'\n 'search:Search skills in the registry'\n 'show:Show skill details'\n 'pull:Download a .skill bundle'\n 'install:Install a skill to ~/.claude/skills/'\n 'list:List installed skills'\n )\n\n config_sub=(\n 'set:Set config value(s) for a package'\n 'get:Show stored config for a package'\n 'list:List all packages with stored config'\n 'clear:Clear config for a package'\n )\n\n completion_shells=(\n 'bash:Generate bash completions'\n 'zsh:Generate zsh completions'\n 'fish:Generate fish completions'\n )\n\n if (( CURRENT == 2 )); then\n _describe -t commands 'mpak commands' top_commands\n return\n fi\n\n case \"\\${words[2]}\" in\n bundle)\n if (( CURRENT == 3 )); then\n _describe -t commands 'bundle commands' bundle_sub\n fi\n ;;\n skill)\n if (( CURRENT == 3 )); then\n _describe -t commands 'skill commands' skill_sub\n fi\n ;;\n config)\n if (( CURRENT == 3 )); then\n _describe -t commands 'config commands' config_sub\n fi\n ;;\n completion)\n if (( CURRENT == 3 )); then\n _describe -t commands 'shells' completion_shells\n fi\n ;;\n esac\n}\n\n_mpak \"$@\"\n`;\n}\n\nfunction fishScript(): string {\n return `# mpak fish completion\n# Install: mpak completion fish | source\n# Or: mpak completion fish > ~/.config/fish/completions/mpak.fish\n\n# Disable file completions by default\ncomplete -c mpak -f\n\n# Top-level commands\ncomplete -c mpak -n '__fish_use_subcommand' -a search -d 'Search bundles and skills'\ncomplete -c mpak -n '__fish_use_subcommand' -a run -d 'Run an MCP server'\ncomplete -c mpak -n '__fish_use_subcommand' -a bundle -d 'MCP bundle commands'\ncomplete -c mpak -n '__fish_use_subcommand' -a skill -d 'Agent skill commands'\ncomplete -c mpak -n '__fish_use_subcommand' -a config -d 'Manage per-package configuration'\ncomplete -c mpak -n '__fish_use_subcommand' -a completion -d 'Generate shell completions'\ncomplete -c mpak -n '__fish_use_subcommand' -a help -d 'Display help'\n\n# bundle subcommands\ncomplete -c mpak -n '__fish_seen_subcommand_from bundle; and not __fish_seen_subcommand_from search show pull run' -a search -d 'Search public bundles'\ncomplete -c mpak -n '__fish_seen_subcommand_from bundle; and not __fish_seen_subcommand_from search show pull run' -a show -d 'Show bundle details'\ncomplete -c mpak -n '__fish_seen_subcommand_from bundle; and not __fish_seen_subcommand_from search show pull run' -a pull -d 'Download a bundle'\ncomplete -c mpak -n '__fish_seen_subcommand_from bundle; and not __fish_seen_subcommand_from search show pull run' -a run -d 'Run an MCP server from the registry'\n\n# skill subcommands\ncomplete -c mpak -n '__fish_seen_subcommand_from skill; and not __fish_seen_subcommand_from validate pack search show pull install list' -a validate -d 'Validate a skill directory'\ncomplete -c mpak -n '__fish_seen_subcommand_from skill; and not __fish_seen_subcommand_from validate pack search show pull install list' -a pack -d 'Create a .skill bundle'\ncomplete -c mpak -n '__fish_seen_subcommand_from skill; and not __fish_seen_subcommand_from validate pack search show pull install list' -a search -d 'Search skills in the registry'\ncomplete -c mpak -n '__fish_seen_subcommand_from skill; and not __fish_seen_subcommand_from validate pack search show pull install list' -a show -d 'Show skill details'\ncomplete -c mpak -n '__fish_seen_subcommand_from skill; and not __fish_seen_subcommand_from validate pack search show pull install list' -a pull -d 'Download a .skill bundle'\ncomplete -c mpak -n '__fish_seen_subcommand_from skill; and not __fish_seen_subcommand_from validate pack search show pull install list' -a install -d 'Install a skill to ~/.claude/skills/'\ncomplete -c mpak -n '__fish_seen_subcommand_from skill; and not __fish_seen_subcommand_from validate pack search show pull install list' -a list -d 'List installed skills'\n\n# config subcommands\ncomplete -c mpak -n '__fish_seen_subcommand_from config; and not __fish_seen_subcommand_from set get list clear' -a set -d 'Set config value(s) for a package'\ncomplete -c mpak -n '__fish_seen_subcommand_from config; and not __fish_seen_subcommand_from set get list clear' -a get -d 'Show stored config for a package'\ncomplete -c mpak -n '__fish_seen_subcommand_from config; and not __fish_seen_subcommand_from set get list clear' -a list -d 'List all packages with stored config'\ncomplete -c mpak -n '__fish_seen_subcommand_from config; and not __fish_seen_subcommand_from set get list clear' -a clear -d 'Clear config for a package'\n\n# completion subcommands\ncomplete -c mpak -n '__fish_seen_subcommand_from completion; and not __fish_seen_subcommand_from bash zsh fish' -a bash -d 'Generate bash completions'\ncomplete -c mpak -n '__fish_seen_subcommand_from completion; and not __fish_seen_subcommand_from bash zsh fish' -a zsh -d 'Generate zsh completions'\ncomplete -c mpak -n '__fish_seen_subcommand_from completion; and not __fish_seen_subcommand_from bash zsh fish' -a fish -d 'Generate fish completions'\n`;\n}\n\nexport function handleCompletion(shell: string): void {\n switch (shell) {\n case \"bash\":\n process.stdout.write(bashScript());\n break;\n case \"zsh\":\n process.stdout.write(zshScript());\n break;\n case \"fish\":\n process.stdout.write(fishScript());\n break;\n default:\n process.stderr.write(\n `Unsupported shell: ${shell}\\nSupported shells: bash, zsh, fish\\n`,\n );\n process.exit(1);\n }\n}\n","import { existsSync, readFileSync, readdirSync, statSync } from \"fs\";\nimport { join, basename } from \"path\";\nimport matter from \"gray-matter\";\nimport { SkillFrontmatterSchema } from \"@nimblebrain/mpak-schemas\";\nimport type { SkillFrontmatter } from \"@nimblebrain/mpak-schemas\";\n\nexport interface ValidationResult {\n valid: boolean;\n name: string | null;\n path: string;\n frontmatter: SkillFrontmatter | null;\n errors: string[];\n warnings: string[];\n}\n\n/**\n * Validate a skill directory against the Agent Skills spec\n */\nexport function validateSkillDirectory(skillPath: string): ValidationResult {\n const result: ValidationResult = {\n valid: true,\n name: null,\n path: skillPath,\n frontmatter: null,\n errors: [],\n warnings: [],\n };\n\n // Check directory exists\n if (!existsSync(skillPath)) {\n result.valid = false;\n result.errors.push(`Directory not found: ${skillPath}`);\n return result;\n }\n\n const stats = statSync(skillPath);\n if (!stats.isDirectory()) {\n result.valid = false;\n result.errors.push(`Path is not a directory: ${skillPath}`);\n return result;\n }\n\n // Check SKILL.md exists\n const skillMdPath = join(skillPath, \"SKILL.md\");\n if (!existsSync(skillMdPath)) {\n result.valid = false;\n result.errors.push(\"SKILL.md not found\");\n return result;\n }\n\n // Read and parse SKILL.md\n let content: string;\n try {\n content = readFileSync(skillMdPath, \"utf-8\");\n } catch (err) {\n result.valid = false;\n result.errors.push(`Failed to read SKILL.md: ${err}`);\n return result;\n }\n\n // Parse frontmatter\n let parsed: matter.GrayMatterFile<string>;\n try {\n parsed = matter(content);\n } catch (err) {\n result.valid = false;\n result.errors.push(`Failed to parse frontmatter: ${err}`);\n return result;\n }\n\n if (!parsed.data || Object.keys(parsed.data).length === 0) {\n result.valid = false;\n result.errors.push(\"No frontmatter found in SKILL.md\");\n return result;\n }\n\n // Validate against schema\n const validation = SkillFrontmatterSchema.safeParse(parsed.data);\n\n if (!validation.success) {\n result.valid = false;\n for (const issue of validation.error.issues) {\n const path = issue.path.join(\".\");\n result.errors.push(`${path}: ${issue.message}`);\n }\n return result;\n }\n\n result.frontmatter = validation.data;\n result.name = validation.data.name;\n\n // Validate name matches directory name\n const dirName = basename(skillPath);\n if (validation.data.name !== dirName) {\n result.valid = false;\n result.errors.push(\n `Skill name \"${validation.data.name}\" does not match directory name \"${dirName}\"`,\n );\n }\n\n // Check for optional directories and files\n const contents = readdirSync(skillPath);\n\n // Standard optional directories\n const optionalDirs = [\"scripts\", \"references\", \"assets\"];\n for (const dir of optionalDirs) {\n if (contents.includes(dir)) {\n const dirPath = join(skillPath, dir);\n if (!statSync(dirPath).isDirectory()) {\n result.warnings.push(\n `\"${dir}\" exists but is not a directory`,\n );\n }\n }\n }\n\n // Check for discovery metadata (not required, but recommended)\n if (!validation.data.metadata) {\n result.warnings.push(\n \"No metadata field - consider adding for better discovery\",\n );\n } else {\n const meta = validation.data.metadata;\n if (!meta.tags || meta.tags.length === 0) {\n result.warnings.push(\n \"No tags in metadata - consider adding for better discovery\",\n );\n }\n if (!meta.category) {\n result.warnings.push(\n \"No category in metadata - consider adding for better discovery\",\n );\n }\n if (!meta.version) {\n result.warnings.push(\n \"No version in metadata - required for registry publishing\",\n );\n }\n }\n\n return result;\n}\n\n/**\n * Format validation result for CLI output\n */\nexport function formatValidationResult(\n result: ValidationResult,\n): string {\n const lines: string[] = [];\n\n if (result.valid) {\n lines.push(`\\u2713 Valid: ${result.name || result.path}`);\n } else {\n lines.push(`\\u2717 Invalid: ${result.name || result.path}`);\n }\n\n lines.push(\"\");\n\n if (result.frontmatter) {\n lines.push(\"\\u2713 SKILL.md found\");\n lines.push(\"\\u2713 Required fields\");\n lines.push(` \\u251c\\u2500 name: ${result.frontmatter.name}`);\n lines.push(\n ` \\u2514\\u2500 description: ${result.frontmatter.description.slice(0, 60)}${result.frontmatter.description.length > 60 ? \"...\" : \"\"} (${result.frontmatter.description.length} chars)`,\n );\n\n // Optional fields\n const optionalFields: string[] = [];\n if (result.frontmatter.license)\n optionalFields.push(`license: ${result.frontmatter.license}`);\n if (result.frontmatter.compatibility)\n optionalFields.push(\n `compatibility: ${result.frontmatter.compatibility}`,\n );\n if (result.frontmatter[\"allowed-tools\"])\n optionalFields.push(\n `allowed-tools: ${result.frontmatter[\"allowed-tools\"]}`,\n );\n\n if (optionalFields.length > 0) {\n lines.push(\"\");\n lines.push(\"\\u2713 Optional fields\");\n optionalFields.forEach((field, i) => {\n const prefix =\n i === optionalFields.length - 1\n ? \"\\u2514\\u2500\"\n : \"\\u251c\\u2500\";\n lines.push(` ${prefix} ${field}`);\n });\n }\n\n // Discovery metadata\n if (result.frontmatter.metadata) {\n const meta = result.frontmatter.metadata;\n lines.push(\"\");\n lines.push(\"\\u2713 Discovery metadata (metadata:)\");\n if (meta.tags)\n lines.push(\n ` \\u251c\\u2500 tags: [${meta.tags.join(\", \")}]`,\n );\n if (meta.category)\n lines.push(` \\u251c\\u2500 category: ${meta.category}`);\n if (meta.triggers)\n lines.push(\n ` \\u251c\\u2500 triggers: ${meta.triggers.length} defined`,\n );\n if (meta.version)\n lines.push(` \\u251c\\u2500 version: ${meta.version}`);\n if (meta.author)\n lines.push(` \\u2514\\u2500 author: ${meta.author.name}`);\n }\n }\n\n if (result.errors.length > 0) {\n lines.push(\"\");\n lines.push(\"Errors:\");\n result.errors.forEach((err) => lines.push(` \\u2717 ${err}`));\n }\n\n if (result.warnings.length > 0) {\n lines.push(\"\");\n lines.push(\"Warnings:\");\n result.warnings.forEach((warn) =>\n lines.push(` \\u26a0 ${warn}`),\n );\n }\n\n return lines.join(\"\\n\");\n}\n\nexport interface ValidateOptions {\n json?: boolean;\n}\n\n/**\n * Handle the validate command\n */\nexport async function handleSkillValidate(\n skillPath: string,\n options: ValidateOptions,\n): Promise<void> {\n const result = validateSkillDirectory(skillPath);\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log(\"\");\n console.log(`Validating ${skillPath}...`);\n console.log(\"\");\n console.log(formatValidationResult(result));\n }\n\n if (!result.valid) {\n process.exit(1);\n }\n}\n","import { createWriteStream, createReadStream } from \"fs\";\nimport { createHash } from \"crypto\";\nimport { basename, join, resolve } from \"path\";\nimport archiver from \"archiver\";\nimport {\n validateSkillDirectory,\n formatValidationResult,\n} from \"./validate.js\";\n\nexport interface PackResult {\n success: boolean;\n path: string | null;\n name: string | null;\n version: string | null;\n size: number | null;\n sha256: string | null;\n error: string | null;\n}\n\n/**\n * Create a .skill bundle from a skill directory\n */\nexport async function packSkill(\n skillPath: string,\n outputPath?: string,\n): Promise<PackResult> {\n // Validate first\n const validation = validateSkillDirectory(skillPath);\n\n if (!validation.valid) {\n return {\n success: false,\n path: null,\n name: null,\n version: null,\n size: null,\n sha256: null,\n error: `Validation failed:\\n${formatValidationResult(validation)}`,\n };\n }\n\n const skillName = validation.name!;\n const version =\n validation.frontmatter?.metadata?.version || \"0.0.0\";\n\n // Determine output path\n const bundleName = `${skillName}-${version}.skill`;\n const finalOutputPath =\n outputPath || join(process.cwd(), bundleName);\n\n // Create the zip archive\n return new Promise((resolvePromise) => {\n const output = createWriteStream(finalOutputPath);\n const archive = archiver(\"zip\", { zlib: { level: 9 } });\n\n output.on(\"close\", () => {\n const size = archive.pointer();\n\n // Calculate SHA256\n const hash = createHash(\"sha256\");\n const stream = createReadStream(finalOutputPath);\n\n stream.on(\"data\", (chunk) => hash.update(chunk));\n stream.on(\"end\", () => {\n const sha256 = hash.digest(\"hex\");\n\n resolvePromise({\n success: true,\n path: finalOutputPath,\n name: skillName,\n version,\n size,\n sha256,\n error: null,\n });\n });\n stream.on(\"error\", (err) => {\n resolvePromise({\n success: false,\n path: null,\n name: skillName,\n version,\n size: null,\n sha256: null,\n error: `Failed to calculate SHA256: ${err.message}`,\n });\n });\n });\n\n archive.on(\"error\", (err) => {\n resolvePromise({\n success: false,\n path: null,\n name: skillName,\n version,\n size: null,\n sha256: null,\n error: `Archive error: ${err.message}`,\n });\n });\n\n archive.pipe(output);\n\n // Add the skill directory to the archive\n // The archive should contain: skillName/SKILL.md, skillName/scripts/, etc.\n const dirName = basename(resolve(skillPath));\n archive.directory(skillPath, dirName);\n\n archive.finalize();\n });\n}\n\n/**\n * Format file size for display\n */\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nexport interface PackOptions {\n output?: string;\n json?: boolean;\n}\n\n/**\n * Handle the pack command\n */\nexport async function handleSkillPack(\n skillPath: string,\n options: PackOptions,\n): Promise<void> {\n console.log(\"\");\n console.log(`Validating ${skillPath}...`);\n\n const result = await packSkill(skillPath, options.output);\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else if (result.success) {\n console.log(`\\u2713 Valid: ${result.name}`);\n console.log(\"\");\n console.log(\"Creating bundle...\");\n console.log(\n `\\u2713 Created: ${basename(result.path!)} (${formatSize(result.size!)})`,\n );\n console.log(` SHA256: ${result.sha256}`);\n } else {\n console.log(result.error);\n }\n\n if (!result.success) {\n process.exit(1);\n }\n}\n","import { table, truncate, fmtError } from \"../../utils/format.js\";\nimport { createClient } from \"../../utils/client.js\";\n\nexport interface SearchOptions {\n tags?: string;\n category?: string;\n sort?: string;\n limit?: number;\n offset?: number;\n json?: boolean;\n}\n\n/**\n * Handle the skill search command\n */\nexport async function handleSkillSearch(\n query: string,\n options: SearchOptions,\n): Promise<void> {\n try {\n const client = createClient();\n const params: Record<string, unknown> = { q: query };\n if (options.tags) params[\"tags\"] = options.tags;\n if (options.category) params[\"category\"] = options.category;\n if (options.sort) params[\"sort\"] = options.sort;\n if (options.limit) params[\"limit\"] = options.limit;\n if (options.offset) params[\"offset\"] = options.offset;\n const result = await client.searchSkills(params as Parameters<typeof client.searchSkills>[0]);\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (result.skills.length === 0) {\n console.log(`No skills found for \"${query}\"`);\n return;\n }\n\n console.log();\n\n const rows = result.skills.map((s) => [\n s.name.length > 42 ? s.name.slice(0, 39) + \"...\" : s.name,\n s.latest_version || \"-\",\n s.category || \"-\",\n truncate(s.description || \"\", 40),\n ]);\n\n console.log(\n table([\"NAME\", \"VERSION\", \"CATEGORY\", \"DESCRIPTION\"], rows),\n );\n\n if (result.pagination.has_more) {\n console.log();\n console.log(\n `Showing ${result.skills.length} of ${result.total} results. Use --offset to see more.`,\n );\n }\n } catch (err) {\n fmtError(err instanceof Error ? err.message : String(err));\n }\n}\n","import { fmtError } from \"../../utils/format.js\";\nimport { createClient } from \"../../utils/client.js\";\n\nexport interface ShowOptions {\n json?: boolean;\n}\n\n/**\n * Handle the skill show command\n */\nexport async function handleSkillShow(\n name: string,\n options: ShowOptions,\n): Promise<void> {\n try {\n const client = createClient();\n const skill = await client.getSkill(name);\n\n if (options.json) {\n console.log(JSON.stringify(skill, null, 2));\n return;\n }\n\n console.log(\"\");\n console.log(`${skill.name}@${skill.latest_version}`);\n console.log(\"\");\n console.log(skill.description);\n console.log(\"\");\n\n // Metadata section\n console.log(\"Metadata:\");\n if (skill.license) console.log(` License: ${skill.license}`);\n if (skill.category)\n console.log(` Category: ${skill.category}`);\n if (skill.tags && skill.tags.length > 0)\n console.log(` Tags: ${skill.tags.join(\", \")}`);\n if (skill.author)\n console.log(\n ` Author: ${skill.author.name}${skill.author.url ? ` (${skill.author.url})` : \"\"}`,\n );\n console.log(\n ` Downloads: ${skill.downloads.toLocaleString()}`,\n );\n console.log(\n ` Published: ${new Date(skill.published_at).toLocaleDateString()}`,\n );\n\n // Triggers\n if (skill.triggers && skill.triggers.length > 0) {\n console.log(\"\");\n console.log(\"Triggers:\");\n skill.triggers.forEach((t: string) =>\n console.log(` - ${t}`),\n );\n }\n\n // Examples\n if (skill.examples && skill.examples.length > 0) {\n console.log(\"\");\n console.log(\"Examples:\");\n skill.examples.forEach(\n (ex: { prompt: string; context?: string | undefined }) => {\n console.log(\n ` - \"${ex.prompt}\"${ex.context ? ` (${ex.context})` : \"\"}`,\n );\n },\n );\n }\n\n // Versions\n if (skill.versions && skill.versions.length > 0) {\n console.log(\"\");\n console.log(\"Versions:\");\n skill.versions\n .slice(0, 5)\n .forEach(\n (v: {\n version: string;\n published_at: string;\n downloads: number;\n }) => {\n console.log(\n ` ${v.version.padEnd(12)} ${new Date(v.published_at).toLocaleDateString().padEnd(12)} ${v.downloads.toLocaleString()} downloads`,\n );\n },\n );\n if (skill.versions.length > 5) {\n console.log(\n ` ... and ${skill.versions.length - 5} more`,\n );\n }\n }\n\n console.log(\"\");\n console.log(`Install: mpak skill install ${skill.name}`);\n } catch (err) {\n fmtError(err instanceof Error ? err.message : String(err));\n }\n}\n","import { writeFileSync } from \"fs\";\nimport { basename, join } from \"path\";\nimport { formatSize, fmtError } from \"../../utils/format.js\";\nimport { createClient } from \"../../utils/client.js\";\n\n/**\n * Parse skill spec into name and version\n * Examples: @scope/name, @scope/name@1.0.0\n */\nfunction parseSkillSpec(spec: string): {\n name: string;\n version?: string;\n} {\n // Handle @scope/name@version format\n const atIndex = spec.lastIndexOf(\"@\");\n\n // If @ is at position 0, it's just the scope prefix\n if (atIndex <= 0) {\n return { name: spec };\n }\n\n // Check if the @ is part of version (after the /)\n const slashIndex = spec.indexOf(\"/\");\n if (atIndex > slashIndex) {\n return {\n name: spec.slice(0, atIndex),\n version: spec.slice(atIndex + 1),\n };\n }\n\n return { name: spec };\n}\n\nexport interface PullOptions {\n output?: string;\n json?: boolean;\n}\n\n/**\n * Handle the skill pull command\n */\nexport async function handleSkillPull(\n skillSpec: string,\n options: PullOptions,\n): Promise<void> {\n try {\n const { name, version } = parseSkillSpec(skillSpec);\n\n // Get download info\n const client = createClient();\n const downloadInfo = version\n ? await client.getSkillVersionDownload(name, version)\n : await client.getSkillDownload(name);\n\n console.log(\n `Pulling ${downloadInfo.skill.name}@${downloadInfo.skill.version}...`,\n );\n\n // Download the bundle\n const response = await fetch(downloadInfo.url);\n if (!response.ok) {\n throw new Error(`Download failed (${response.status})`);\n }\n const buffer = Buffer.from(await response.arrayBuffer());\n\n // Verify SHA256\n if (downloadInfo.skill.sha256) {\n const { createHash } = await import(\"crypto\");\n const hash = createHash(\"sha256\").update(buffer).digest(\"hex\");\n if (hash !== downloadInfo.skill.sha256) {\n throw new Error(\n `SHA256 mismatch: expected ${downloadInfo.skill.sha256}, got ${hash}`,\n );\n }\n }\n\n // Determine output path\n const filename = `${basename(downloadInfo.skill.name.replace(\"@\", \"\").replace(\"/\", \"-\"))}-${downloadInfo.skill.version}.skill`;\n const outputPath =\n options.output || join(process.cwd(), filename);\n\n // Write to disk\n writeFileSync(outputPath, buffer);\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n path: outputPath,\n name: downloadInfo.skill.name,\n version: downloadInfo.skill.version,\n size: downloadInfo.skill.size,\n sha256: downloadInfo.skill.sha256,\n },\n null,\n 2,\n ),\n );\n } else {\n console.log(\n `Downloaded ${filename} (${formatSize(downloadInfo.skill.size)})`,\n );\n console.log(` SHA256: ${downloadInfo.skill.sha256}`);\n console.log(` Path: ${outputPath}`);\n }\n } catch (err) {\n fmtError(err instanceof Error ? err.message : String(err));\n }\n}\n","import { existsSync, mkdirSync, writeFileSync, rmSync } from \"fs\";\nimport { join, basename } from \"path\";\nimport { homedir, tmpdir } from \"os\";\nimport { execFileSync } from \"child_process\";\nimport { formatSize, fmtError } from \"../../utils/format.js\";\nimport { createClient } from \"../../utils/client.js\";\n\n/**\n * Get the Claude Code skills directory\n */\nfunction getSkillsDir(): string {\n return join(homedir(), \".claude\", \"skills\");\n}\n\n/**\n * Parse skill spec into name and version\n */\nfunction parseSkillSpec(spec: string): {\n name: string;\n version?: string;\n} {\n const atIndex = spec.lastIndexOf(\"@\");\n if (atIndex <= 0) {\n return { name: spec };\n }\n const slashIndex = spec.indexOf(\"/\");\n if (atIndex > slashIndex) {\n return {\n name: spec.slice(0, atIndex),\n version: spec.slice(atIndex + 1),\n };\n }\n return { name: spec };\n}\n\n/**\n * Extract skill name from scoped name\n * @scope/skill-name -> skill-name\n */\nfunction getShortName(scopedName: string): string {\n const parts = scopedName.replace(\"@\", \"\").split(\"/\");\n return parts[parts.length - 1]!;\n}\n\nexport interface InstallOptions {\n force?: boolean;\n json?: boolean;\n}\n\n/**\n * Handle the skill install command\n */\nexport async function handleSkillInstall(\n skillSpec: string,\n options: InstallOptions,\n): Promise<void> {\n try {\n const { name, version } = parseSkillSpec(skillSpec);\n\n // Get download info\n const client = createClient();\n const downloadInfo = version\n ? await client.getSkillVersionDownload(name, version)\n : await client.getSkillDownload(name);\n const shortName = getShortName(downloadInfo.skill.name);\n const skillsDir = getSkillsDir();\n const installPath = join(skillsDir, shortName);\n\n // Check if already installed\n if (existsSync(installPath) && !options.force) {\n console.error(\n `Skill \"${shortName}\" is already installed at ${installPath}`,\n );\n console.error(\"Use --force to overwrite\");\n process.exit(1);\n }\n\n console.log(\n `Pulling ${downloadInfo.skill.name}@${downloadInfo.skill.version}...`,\n );\n\n // Download the bundle\n const response = await fetch(downloadInfo.url);\n if (!response.ok) {\n throw new Error(`Download failed (${response.status})`);\n }\n const buffer = Buffer.from(await response.arrayBuffer());\n\n // Verify SHA256\n if (downloadInfo.skill.sha256) {\n const { createHash } = await import(\"crypto\");\n const hash = createHash(\"sha256\").update(buffer).digest(\"hex\");\n if (hash !== downloadInfo.skill.sha256) {\n throw new Error(\n `SHA256 mismatch: expected ${downloadInfo.skill.sha256}, got ${hash}`,\n );\n }\n }\n\n console.log(\n `Downloaded ${basename(downloadInfo.skill.name)}-${downloadInfo.skill.version}.skill (${formatSize(downloadInfo.skill.size)})`,\n );\n\n // Ensure skills directory exists\n if (!existsSync(skillsDir)) {\n mkdirSync(skillsDir, { recursive: true });\n }\n\n // Write to temp file\n const tempPath = join(tmpdir(), `skill-${Date.now()}.skill`);\n writeFileSync(tempPath, buffer);\n\n // Remove existing installation if force\n if (existsSync(installPath)) {\n rmSync(installPath, { recursive: true });\n }\n\n // Extract using unzip\n // The .skill bundle contains: skillName/SKILL.md, skillName/...\n // We extract to the skills directory\n try {\n execFileSync('unzip', ['-o', tempPath, '-d', skillsDir], {\n stdio: \"pipe\",\n });\n } catch (err) {\n throw new Error(`Failed to extract skill bundle: ${err}`);\n } finally {\n // Clean up temp file\n rmSync(tempPath, { force: true });\n }\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n installed: true,\n name: downloadInfo.skill.name,\n shortName,\n version: downloadInfo.skill.version,\n path: installPath,\n },\n null,\n 2,\n ),\n );\n } else {\n console.log(`Extracting to ${installPath}/`);\n console.log(`\\u2713 Installed: ${shortName}`);\n console.log(\"\");\n console.log(\n \"Skill available in Claude Code. Restart to activate.\",\n );\n }\n } catch (err) {\n fmtError(err instanceof Error ? err.message : String(err));\n }\n}\n","import { existsSync, readdirSync, readFileSync, statSync } from \"fs\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport matter from \"gray-matter\";\n\n/**\n * Get the Claude Code skills directory\n */\nfunction getSkillsDir(): string {\n return join(homedir(), \".claude\", \"skills\");\n}\n\ninterface InstalledSkill {\n name: string;\n description: string;\n version: string | null;\n path: string;\n}\n\n/**\n * List all installed skills\n */\nfunction listInstalledSkills(): InstalledSkill[] {\n const skillsDir = getSkillsDir();\n\n if (!existsSync(skillsDir)) {\n return [];\n }\n\n const skills: InstalledSkill[] = [];\n const entries = readdirSync(skillsDir);\n\n for (const entry of entries) {\n // Skip hidden files\n if (entry.startsWith(\".\")) continue;\n\n const skillPath = join(skillsDir, entry);\n const stat = statSync(skillPath);\n\n if (!stat.isDirectory()) continue;\n\n // Check for SKILL.md\n const skillMdPath = join(skillPath, \"SKILL.md\");\n if (!existsSync(skillMdPath)) continue;\n\n // Parse SKILL.md\n try {\n const content = readFileSync(skillMdPath, \"utf-8\");\n const parsed = matter(content);\n\n skills.push({\n name: (parsed.data[\"name\"] as string) || entry,\n description: (parsed.data[\"description\"] as string) || \"\",\n version:\n ((parsed.data as Record<string, unknown>)[\"metadata\"] as Record<string, unknown> | undefined)\n ?.[\"version\"] as string | null ?? null,\n path: skillPath,\n });\n } catch {\n // If we can't parse, still include with basic info\n skills.push({\n name: entry,\n description: \"(unable to parse SKILL.md)\",\n version: null,\n path: skillPath,\n });\n }\n }\n\n return skills.sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport interface ListOptions {\n json?: boolean;\n}\n\n/**\n * Handle the skill list command\n */\nexport async function handleSkillList(\n options: ListOptions,\n): Promise<void> {\n const skills = listInstalledSkills();\n\n if (options.json) {\n console.log(JSON.stringify(skills, null, 2));\n return;\n }\n\n if (skills.length === 0) {\n console.log(\"No skills installed.\");\n console.log(\"\");\n console.log(\"Install skills with: mpak skill install <name>\");\n console.log(\"Or create your own in ~/.claude/skills/\");\n return;\n }\n\n console.log(\"\");\n console.log(\"Installed skills:\");\n console.log(\"\");\n\n const nameWidth =\n Math.max(20, ...skills.map((s) => s.name.length)) + 2;\n const versionWidth = 10;\n\n console.log(\n \"NAME\".padEnd(nameWidth) +\n \"VERSION\".padEnd(versionWidth) +\n \"DESCRIPTION\",\n );\n\n for (const skill of skills) {\n const name = skill.name.padEnd(nameWidth);\n const version = (skill.version || \"-\").padEnd(versionWidth);\n const desc =\n skill.description.length > 50\n ? skill.description.slice(0, 47) + \"...\"\n : skill.description;\n\n console.log(name + version + desc);\n }\n\n console.log(\"\");\n console.log(\n `${skills.length} skill(s) installed in ${getSkillsDir()}`,\n );\n}\n","/**\n * Custom error class for CLI errors\n */\nexport class CLIError extends Error {\n public readonly exitCode: number;\n\n constructor(message: string, exitCode: number = 1) {\n super(message);\n this.name = \"CLIError\";\n this.exitCode = exitCode;\n }\n}\n\n/**\n * Handles errors gracefully and exits with appropriate code\n */\nexport function handleError(error: unknown): never {\n if (error instanceof CLIError) {\n console.error(`Error: ${error.message}`);\n process.exit(error.exitCode);\n }\n\n if (error instanceof Error) {\n console.error(`Error: ${error.message}`);\n process.exit(1);\n }\n\n console.error(\"An unexpected error occurred\");\n process.exit(1);\n}\n","#!/usr/bin/env node\n\nimport { createProgram } from \"./program.js\";\nimport { handleError } from \"./utils/errors.js\";\n\nasync function main() {\n const program = createProgram();\n await program.parseAsync(process.argv);\n}\n\nmain().catch(handleError);\n"],"mappings":"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","names":["writeFileSync","MpakClient","MpakClient","writeFileSync","existsSync","mkdirSync","readFileSync","writeFileSync","homedir","join","resolve","MpakClient","parsePackageSpec","join","homedir","existsSync","readFileSync","writeFileSync","mkdirSync","resolve","manifest","MpakClient","existsSync","readFileSync","statSync","join","basename","createHash","basename","join","resolve","join","createHash","basename","resolve","formatSize","writeFileSync","basename","join","createHash","basename","join","writeFileSync","existsSync","mkdirSync","writeFileSync","rmSync","join","basename","homedir","execFileSync","join","homedir","parseSkillSpec","existsSync","createHash","basename","mkdirSync","writeFileSync","rmSync","execFileSync","existsSync","readdirSync","readFileSync","statSync","join","homedir","matter","getSkillsDir"]}
package/package.json CHANGED
@@ -1,28 +1,18 @@
1
1
  {
2
2
  "name": "@nimblebrain/mpak",
3
- "version": "0.1.0",
4
- "description": "CLI for downloading MCPB bundles from the mpak registry",
5
- "main": "dist/index.js",
3
+ "version": "0.3.0",
4
+ "description": "CLI for downloading MCPB bundles and Agent Skills from the mpak registry",
6
5
  "type": "module",
7
6
  "bin": {
8
- "mpak": "dist/index.js"
7
+ "mpak": "./dist/index.js"
9
8
  },
10
9
  "scripts": {
11
- "build": "tsc",
12
- "dev": "tsx src/index.ts",
13
- "generate:types": "openapi-typescript http://localhost:3200/documentation/json -o src/lib/api/schema.d.ts",
10
+ "build": "tsup",
11
+ "clean": "rm -rf dist",
14
12
  "lint": "eslint src",
15
- "lint:fix": "eslint src --fix",
16
- "prepublishOnly": "npm run build",
17
- "start": "node dist/index.js",
18
- "test": "vitest --run src",
19
- "test:unit": "vitest --run src",
20
- "test:integration": "vitest --run test/integration",
21
- "test:all": "vitest --run",
13
+ "test": "vitest --run",
22
14
  "test:watch": "vitest",
23
- "test:ui": "vitest --ui",
24
- "test:coverage": "vitest --coverage",
25
- "typecheck": "tsc -p tsconfig.check.json"
15
+ "typecheck": "tsc --noEmit"
26
16
  },
27
17
  "keywords": [
28
18
  "mcp",
@@ -31,12 +21,27 @@
31
21
  "cli",
32
22
  "package-manager"
33
23
  ],
34
- "author": "NimbleBrain Inc",
24
+ "author": "NimbleBrain Inc <engineering@mpak.dev>",
35
25
  "license": "Apache-2.0",
26
+ "repository": {
27
+ "type": "git",
28
+ "url": "https://github.com/NimbleBrainInc/mpak.git",
29
+ "directory": "packages/cli"
30
+ },
31
+ "homepage": "https://mpak.dev",
32
+ "bugs": {
33
+ "url": "https://github.com/NimbleBrainInc/mpak/issues"
34
+ },
35
+ "files": [
36
+ "dist",
37
+ "README.md"
38
+ ],
36
39
  "engines": {
37
- "node": ">=18"
40
+ "node": ">=22"
38
41
  },
39
42
  "dependencies": {
43
+ "@nimblebrain/mpak-schemas": "workspace:*",
44
+ "@nimblebrain/mpak-sdk": "workspace:*",
40
45
  "archiver": "^7.0.1",
41
46
  "commander": "^14.0.2",
42
47
  "gray-matter": "^4.0.3",
@@ -44,10 +49,8 @@
44
49
  },
45
50
  "devDependencies": {
46
51
  "@types/archiver": "^7.0.0",
47
- "@types/node": "^25.0.3",
48
- "@vitest/ui": "^4.0.16",
49
- "openapi-typescript": "^7.10.1",
50
- "tsx": "^4.21.0",
52
+ "@types/node": "^22.0.0",
53
+ "tsup": "^8.0.0",
51
54
  "typescript": "^5.9.3",
52
55
  "vitest": "^4.0.16"
53
56
  },
@@ -1,19 +0,0 @@
1
- {
2
- "permissions": {
3
- "allow": [
4
- "Bash(node dist/index.js:*)",
5
- "Bash(npm test:*)",
6
- "Bash(npm run build:*)",
7
- "Bash(npm run test:all:*)",
8
- "Bash(git add:*)",
9
- "Bash(git commit:*)",
10
- "Bash(npm version:*)",
11
- "Bash(npm publish:*)",
12
- "Bash(git push)",
13
- "Bash(git tag:*)",
14
- "Bash(git push:*)",
15
- "Bash(gh pr create:*)",
16
- "Bash(ls:*)"
17
- ]
18
- }
19
- }
package/.env.example DELETED
@@ -1,13 +0,0 @@
1
- # Clerk OAuth Configuration
2
- # Get these from your Clerk dashboard: https://dashboard.clerk.com
3
- CLERK_OAUTH_CLIENT_ID=96WRYcxabFktp9wn
4
- # Domain without protocol (https:// will be added automatically)
5
- # Example: select-shiner-31.clerk.accounts.dev
6
- CLERK_OAUTH_DOMAIN=clerk.nimblebrain.ai
7
-
8
- # OAuth Callback Server Configuration
9
- # Port for the local OAuth callback server
10
- MPAK_DEFAULT_PORT=41248
11
-
12
- # OAuth timeout in milliseconds (default: 5 minutes)
13
- MPAK_OAUTH_TIMEOUT=300000
@@ -1,27 +0,0 @@
1
- name: CI
2
-
3
- on:
4
- push:
5
- branches: [main]
6
- pull_request:
7
- branches: [main]
8
-
9
- jobs:
10
- test:
11
- runs-on: ubuntu-latest
12
-
13
- steps:
14
- - uses: actions/checkout@v4
15
-
16
- - uses: actions/setup-node@v4
17
- with:
18
- node-version: '20'
19
- cache: 'npm'
20
-
21
- - run: npm ci
22
-
23
- - run: npm run build
24
-
25
- - run: npm run typecheck
26
-
27
- - run: npm run test:all