opkg 0.9.2 → 0.9.3

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 (140) hide show
  1. package/package.json +3 -1
  2. package/packages/cli/dist/add-U44SL3OR.js +624 -0
  3. package/packages/cli/dist/add-U44SL3OR.js.map +7 -0
  4. package/packages/cli/dist/chunk-4B5HJLP2.js +48 -0
  5. package/packages/cli/dist/chunk-4B5HJLP2.js.map +7 -0
  6. package/packages/cli/dist/chunk-BROJ6OUT.js +631 -0
  7. package/packages/cli/dist/chunk-BROJ6OUT.js.map +7 -0
  8. package/packages/cli/dist/chunk-CVA64SXK.js +1136 -0
  9. package/packages/cli/dist/chunk-CVA64SXK.js.map +7 -0
  10. package/packages/cli/dist/chunk-D6LEPODL.js +413 -0
  11. package/packages/cli/dist/chunk-D6LEPODL.js.map +7 -0
  12. package/packages/cli/dist/chunk-HTYHJA3B.js +61 -0
  13. package/packages/cli/dist/chunk-HTYHJA3B.js.map +7 -0
  14. package/packages/cli/dist/chunk-KI7FDU3H.js +99 -0
  15. package/packages/cli/dist/chunk-KI7FDU3H.js.map +7 -0
  16. package/packages/cli/dist/chunk-PSQXKAL4.js +371 -0
  17. package/packages/cli/dist/chunk-PSQXKAL4.js.map +7 -0
  18. package/packages/cli/dist/chunk-PUDRKDVZ.js +1419 -0
  19. package/packages/cli/dist/chunk-PUDRKDVZ.js.map +7 -0
  20. package/packages/cli/dist/chunk-U7FW7SXX.js +568 -0
  21. package/packages/cli/dist/chunk-U7FW7SXX.js.map +7 -0
  22. package/packages/cli/dist/configure-3AZUMDJZ.js +107 -0
  23. package/packages/cli/dist/configure-3AZUMDJZ.js.map +7 -0
  24. package/packages/cli/dist/index.js +15 -15
  25. package/packages/cli/dist/install-EZNWMLJR.js +7581 -0
  26. package/packages/cli/dist/install-EZNWMLJR.js.map +7 -0
  27. package/packages/cli/dist/list-XR7RSJFS.js +327 -0
  28. package/packages/cli/dist/list-XR7RSJFS.js.map +7 -0
  29. package/packages/cli/dist/login-NRKHXZKM.js +150 -0
  30. package/packages/cli/dist/login-NRKHXZKM.js.map +7 -0
  31. package/packages/cli/dist/logout-SYHXCVCQ.js +40 -0
  32. package/packages/cli/dist/logout-SYHXCVCQ.js.map +7 -0
  33. package/packages/cli/dist/new-F46OSD72.js +277 -0
  34. package/packages/cli/dist/new-F46OSD72.js.map +7 -0
  35. package/packages/cli/dist/publish-4H43PCSG.js +619 -0
  36. package/packages/cli/dist/publish-4H43PCSG.js.map +7 -0
  37. package/packages/cli/dist/remove-BD52BHR2.js +542 -0
  38. package/packages/cli/dist/remove-BD52BHR2.js.map +7 -0
  39. package/packages/cli/dist/save-N3QWF2WN.js +1728 -0
  40. package/packages/cli/dist/save-N3QWF2WN.js.map +7 -0
  41. package/packages/cli/dist/search-ABROK3UO.js +157 -0
  42. package/packages/cli/dist/search-ABROK3UO.js.map +7 -0
  43. package/packages/cli/dist/set-NGM2FIKF.js +251 -0
  44. package/packages/cli/dist/set-NGM2FIKF.js.map +7 -0
  45. package/packages/cli/dist/uninstall-Q3CP4UN5.js +539 -0
  46. package/packages/cli/dist/uninstall-Q3CP4UN5.js.map +7 -0
  47. package/packages/cli/dist/unpublish-VBTNTMS5.js +245 -0
  48. package/packages/cli/dist/unpublish-VBTNTMS5.js.map +7 -0
  49. package/packages/cli/dist/view-MXRBMXOG.js +488 -0
  50. package/packages/cli/dist/view-MXRBMXOG.js.map +7 -0
  51. package/packages/cli/package.json +2 -0
  52. package/packages/core/dist/core/install/conflicts/file-conflict-resolver.d.ts +5 -4
  53. package/packages/core/dist/core/install/conflicts/file-conflict-resolver.d.ts.map +1 -1
  54. package/packages/core/dist/core/install/conflicts/file-conflict-resolver.js +6 -5
  55. package/packages/core/dist/core/install/conflicts/file-conflict-resolver.js.map +1 -1
  56. package/packages/core/dist/core/install/install-reporting.js +1 -1
  57. package/packages/core/dist/core/install/install-reporting.js.map +1 -1
  58. package/packages/core/dist/core/install/list-handler.d.ts.map +1 -1
  59. package/packages/core/dist/core/install/list-handler.js +7 -0
  60. package/packages/core/dist/core/install/list-handler.js.map +1 -1
  61. package/packages/core/dist/core/install/marketplace-handler.d.ts.map +1 -1
  62. package/packages/core/dist/core/install/marketplace-handler.js.map +1 -1
  63. package/packages/core/dist/core/install/operations/conflict-handler.d.ts +2 -1
  64. package/packages/core/dist/core/install/operations/conflict-handler.d.ts.map +1 -1
  65. package/packages/core/dist/core/install/operations/conflict-handler.js +2 -2
  66. package/packages/core/dist/core/install/operations/conflict-handler.js.map +1 -1
  67. package/packages/core/dist/core/install/orchestrator/orchestrator.d.ts.map +1 -1
  68. package/packages/core/dist/core/install/orchestrator/orchestrator.js +22 -14
  69. package/packages/core/dist/core/install/orchestrator/orchestrator.js.map +1 -1
  70. package/packages/core/dist/core/install/orchestrator/strategies/git-strategy.d.ts +1 -0
  71. package/packages/core/dist/core/install/orchestrator/strategies/git-strategy.d.ts.map +1 -1
  72. package/packages/core/dist/core/install/orchestrator/strategies/git-strategy.js +11 -24
  73. package/packages/core/dist/core/install/orchestrator/strategies/git-strategy.js.map +1 -1
  74. package/packages/core/dist/core/install/orchestrator/strategies/path-strategy.d.ts +2 -0
  75. package/packages/core/dist/core/install/orchestrator/strategies/path-strategy.d.ts.map +1 -1
  76. package/packages/core/dist/core/install/orchestrator/strategies/path-strategy.js +14 -14
  77. package/packages/core/dist/core/install/orchestrator/strategies/path-strategy.js.map +1 -1
  78. package/packages/core/dist/core/install/orchestrator/strategies/registry-strategy.d.ts +7 -0
  79. package/packages/core/dist/core/install/orchestrator/strategies/registry-strategy.d.ts.map +1 -1
  80. package/packages/core/dist/core/install/orchestrator/strategies/registry-strategy.js +28 -0
  81. package/packages/core/dist/core/install/orchestrator/strategies/registry-strategy.js.map +1 -1
  82. package/packages/core/dist/core/install/platform-resolution.d.ts +3 -0
  83. package/packages/core/dist/core/install/platform-resolution.d.ts.map +1 -1
  84. package/packages/core/dist/core/install/platform-resolution.js +5 -2
  85. package/packages/core/dist/core/install/platform-resolution.js.map +1 -1
  86. package/packages/core/dist/core/install/preprocessing/context-population.d.ts +18 -0
  87. package/packages/core/dist/core/install/preprocessing/context-population.d.ts.map +1 -0
  88. package/packages/core/dist/core/install/preprocessing/context-population.js +36 -0
  89. package/packages/core/dist/core/install/preprocessing/context-population.js.map +1 -0
  90. package/packages/core/dist/core/install/preprocessing/convenience-preprocessor.d.ts +23 -0
  91. package/packages/core/dist/core/install/preprocessing/convenience-preprocessor.d.ts.map +1 -1
  92. package/packages/core/dist/core/install/preprocessing/convenience-preprocessor.js +44 -0
  93. package/packages/core/dist/core/install/preprocessing/convenience-preprocessor.js.map +1 -1
  94. package/packages/core/dist/core/install/sources/path-source.d.ts.map +1 -1
  95. package/packages/core/dist/core/install/sources/path-source.js +8 -0
  96. package/packages/core/dist/core/install/sources/path-source.js.map +1 -1
  97. package/packages/core/dist/core/install/unified/context-builders.d.ts +5 -0
  98. package/packages/core/dist/core/install/unified/context-builders.d.ts.map +1 -1
  99. package/packages/core/dist/core/install/unified/context-builders.js +13 -0
  100. package/packages/core/dist/core/install/unified/context-builders.js.map +1 -1
  101. package/packages/core/dist/core/install/unified/context-helpers.d.ts.map +1 -1
  102. package/packages/core/dist/core/install/unified/context-helpers.js +5 -0
  103. package/packages/core/dist/core/install/unified/context-helpers.js.map +1 -1
  104. package/packages/core/dist/core/install/unified/context.d.ts +6 -0
  105. package/packages/core/dist/core/install/unified/context.d.ts.map +1 -1
  106. package/packages/core/dist/core/install/unified/multi-context-pipeline.d.ts.map +1 -1
  107. package/packages/core/dist/core/install/unified/multi-context-pipeline.js +0 -2
  108. package/packages/core/dist/core/install/unified/multi-context-pipeline.js.map +1 -1
  109. package/packages/core/dist/core/install/unified/phases/conflicts.d.ts.map +1 -1
  110. package/packages/core/dist/core/install/unified/phases/conflicts.js +1 -1
  111. package/packages/core/dist/core/install/unified/phases/conflicts.js.map +1 -1
  112. package/packages/core/dist/core/install/unified/phases/execute.d.ts.map +1 -1
  113. package/packages/core/dist/core/install/unified/phases/execute.js +2 -1
  114. package/packages/core/dist/core/install/unified/phases/execute.js.map +1 -1
  115. package/packages/core/dist/core/install/unified/phases/report.js +1 -1
  116. package/packages/core/dist/core/install/unified/phases/report.js.map +1 -1
  117. package/packages/core/dist/core/install/unified/pipeline.d.ts.map +1 -1
  118. package/packages/core/dist/core/install/unified/pipeline.js +5 -2
  119. package/packages/core/dist/core/install/unified/pipeline.js.map +1 -1
  120. package/packages/core/dist/core/ports/resolve.d.ts +0 -13
  121. package/packages/core/dist/core/ports/resolve.d.ts.map +1 -1
  122. package/packages/core/dist/core/ports/resolve.js +0 -28
  123. package/packages/core/dist/core/ports/resolve.js.map +1 -1
  124. package/packages/core/dist/core/remove/removal-confirmation.d.ts +4 -1
  125. package/packages/core/dist/core/remove/removal-confirmation.d.ts.map +1 -1
  126. package/packages/core/dist/core/remove/removal-confirmation.js +5 -4
  127. package/packages/core/dist/core/remove/removal-confirmation.js.map +1 -1
  128. package/packages/core/dist/core/remove/remove-from-source-pipeline.d.ts.map +1 -1
  129. package/packages/core/dist/core/remove/remove-from-source-pipeline.js +1 -10
  130. package/packages/core/dist/core/remove/remove-from-source-pipeline.js.map +1 -1
  131. package/packages/core/dist/core/uninstall/uninstall-executor.js +1 -1
  132. package/packages/core/dist/core/uninstall/uninstall-executor.js.map +1 -1
  133. package/packages/core/dist/core/uninstall/uninstall-reporter.d.ts +2 -2
  134. package/packages/core/dist/core/uninstall/uninstall-reporter.d.ts.map +1 -1
  135. package/packages/core/dist/core/uninstall/uninstall-reporter.js +4 -4
  136. package/packages/core/dist/core/uninstall/uninstall-reporter.js.map +1 -1
  137. package/packages/core/dist/index.d.ts +1 -1
  138. package/packages/core/dist/index.d.ts.map +1 -1
  139. package/packages/core/dist/types/execution-context.d.ts +24 -10
  140. package/packages/core/dist/types/execution-context.d.ts.map +1 -1
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../core/src/core/package-management.ts", "../../core/src/utils/version-ranges.ts", "../../core/src/core/package.ts", "../../core/src/core/install/plugin-transformer.ts", "../../core/src/core/conversion-context/creation.ts", "../../core/src/core/conversion-context/serialization.ts", "../../core/src/core/install/format-detector.ts", "../../core/src/core/install/plugin-metadata-resolver.ts", "../../core/src/core/install/path-package-loader.ts"],
4
+ "sourcesContent": ["import { basename, relative } from 'path';\nimport semver from 'semver';\nimport { PackageYml, PackageDependency } from '../types/index.js';\nimport { parsePackageYml, writePackageYml } from '../utils/package-yml.js';\nimport { exists, ensureDir } from '../utils/fs.js';\nimport { logger } from '../utils/logger.js';\nimport { getLocalOpenPackageDir, getLocalPackageYmlPath, getLocalPackagesDir, getLocalPackageDir, isRootPackage } from '../utils/paths.js';\nimport { DEPENDENCY_ARRAYS, FILE_PATTERNS, PACKAGE_PATHS } from '../constants/index.js';\nimport { createCaretRange, hasExplicitPrereleaseIntent, isPrereleaseVersion } from '../utils/version-ranges.js';\nimport { extractBaseVersion } from '../utils/version-generator.js';\nimport { isUnversionedVersion } from './package-versioning.js';\nimport { normalizePackageName, arePackageNamesEquivalent, normalizePackageNameForLookup } from '../utils/package-name.js';\nimport { extractGitHubInfo } from '../utils/git-url-parser.js';\nimport { packageManager } from './package.js';\nimport type { OutputPort } from './ports/output.js';\nimport type { PromptPort } from './ports/prompt.js';\nimport { resolveOutput, resolvePrompt } from './ports/resolve.js';\nimport { writePackageFilesToDirectory } from '../utils/package-copy.js';\nimport { getPackageFilesDir, getPackageYmlPath } from './package-context.js';\nimport { isManifestPath, normalizePackagePath } from '../utils/manifest-paths.js';\n\n/**\n * Ensure local OpenPackage directory structure exists\n * Shared utility for both install and save commands\n */\nexport async function ensureLocalOpenPackageStructure(targetDir: string): Promise<void> {\n const openpackageDir = getLocalOpenPackageDir(targetDir);\n const packagesDir = getLocalPackagesDir(targetDir);\n \n await Promise.all([\n ensureDir(openpackageDir),\n ensureDir(packagesDir)\n ]);\n}\n\n/**\n * Create a basic openpackage.yml file for workspace if it doesn't exist\n * Shared utility for both install and save commands\n * @param force - If true, overwrite existing openpackage.yml\n * @returns the openpackage.yml if it was created, null if it already existed and force=false\n */\nexport async function createWorkspacePackageYml(targetDir: string, force: boolean = false, output?: OutputPort): Promise<PackageYml | null> {\n const out = output ?? resolveOutput();\n await ensureLocalOpenPackageStructure(targetDir);\n\n const packageYmlPath = getLocalPackageYmlPath(targetDir);\n const projectName = basename(targetDir);\n const basicPackageYml: PackageYml = {\n name: projectName,\n dependencies: [],\n 'dev-dependencies': []\n };\n\n if (await exists(packageYmlPath)) {\n if (!force) {\n return null; // openpackage.yml already exists, no need to create\n }\n await writePackageYml(packageYmlPath, basicPackageYml);\n logger.info(`Overwrote basic openpackage.yml with name: ${projectName}`);\n out.success(`Overwrote basic openpackage.yml in .openpackage/ with name: ${projectName}`);\n return basicPackageYml;\n }\n\n await writePackageYml(packageYmlPath, basicPackageYml);\n logger.info(`Initialized workspace openpackage.yml`);\n out.success(`Initialized workspace openpackage.yml in .openpackage/`);\n return basicPackageYml;\n}\n\nexport interface EnsurePackageWithYmlOptions {\n interactive?: boolean;\n defaultVersion?: string;\n}\n\nexport interface EnsurePackageWithYmlResult {\n normalizedName: string;\n packageDir: string;\n packageYmlPath: string;\n packageConfig: PackageYml;\n isNew: boolean;\n}\n\n/**\n * Ensure a cached package directory and openpackage.yml exist, optionally prompting for details.\n * This is for NESTED packages only. Root packages use different flow.\n */\nexport async function ensurePackageWithYml(\n targetDir: string,\n packageName: string,\n options: EnsurePackageWithYmlOptions = {},\n output?: OutputPort,\n prompt?: PromptPort\n): Promise<EnsurePackageWithYmlResult> {\n const out = output ?? resolveOutput();\n const prm = prompt ?? resolvePrompt();\n await ensureLocalOpenPackageStructure(targetDir);\n\n const normalizedName = normalizePackageName(packageName);\n const packageDir = getPackageFilesDir(targetDir, 'nested', normalizedName);\n const packageYmlPath = getPackageYmlPath(targetDir, 'nested', normalizedName);\n\n await ensureDir(packageDir);\n\n let packageConfig: PackageYml | undefined;\n let isNew = false;\n\n if (await exists(packageYmlPath)) {\n packageConfig = await parsePackageYml(packageYmlPath);\n } else {\n isNew = true;\n // Try to seed from existing local registry copy to avoid prompts and preserve metadata.\n try {\n const registryExists = await packageManager.packageExists(normalizedName);\n if (registryExists) {\n const existing = await packageManager.loadPackage(normalizedName);\n packageConfig = {\n ...existing.metadata,\n name: normalizedName,\n partial: true\n };\n logger.info(`Loaded openpackage.yml for '${normalizedName}' from local registry copy`);\n out.success(`Loaded openpackage.yml from local registry for ${normalizedName}`);\n }\n } catch (error) {\n logger.debug('Unable to seed openpackage.yml from registry; falling back to prompts', { normalizedName, error });\n }\n\n if (!packageConfig) {\n if (options.interactive) {\n out.info(`Create new package \"${normalizedName}\"`);\n \n const description = await prm.text('Description:');\n const keywordsInput = await prm.text('Keywords (space-separated):');\n const isPrivate = await prm.confirm('Private package?', false);\n \n const keywordsArray = keywordsInput\n ? keywordsInput.trim().split(/\\s+/).filter((k: string) => k.length > 0)\n : [];\n \n packageConfig = {\n name: normalizePackageName(normalizedName),\n ...(description && { description }),\n ...(keywordsArray.length > 0 && { keywords: keywordsArray }),\n ...(isPrivate && { private: isPrivate })\n };\n } else {\n packageConfig = {\n name: normalizedName,\n ...(options.defaultVersion ? { version: options.defaultVersion } : {})\n };\n }\n\n packageConfig = {\n ...packageConfig,\n partial: true\n };\n }\n\n await writePackageYml(packageYmlPath, packageConfig);\n logger.info(\n `Created new package '${packageConfig.name}${packageConfig.version ? `@${packageConfig.version}` : ''}' at ${relative(targetDir, packageDir)}`\n );\n }\n\n if (packageConfig.name !== normalizedName) {\n const updatedConfig = { ...packageConfig, name: normalizedName };\n await writePackageYml(packageYmlPath, updatedConfig);\n packageConfig = updatedConfig;\n }\n\n return {\n normalizedName,\n packageDir,\n packageYmlPath,\n packageConfig,\n isNew\n };\n}\n\n/**\n * Add a package dependency to openpackage.yml with smart placement logic\n * Shared utility for both install and save commands\n */\nexport async function addPackageToYml(\n targetDir: string,\n packageName: string,\n packageVersion: string | undefined,\n isDev: boolean = false,\n originalVersion?: string, // The original version/range that was requested\n silent: boolean = false,\n path?: string, // Path to local directory or tarball (for path-based dependencies)\n git?: string, // Git source url (DEPRECATED: use url) (mutually exclusive with path/version)\n ref?: string, // Git ref (DEPRECATED: embed in url as #ref)\n gitPath?: string, // Git subdirectory path (for plugins in marketplaces)\n base?: string, // Phase 4: Base field for resource model\n output?: OutputPort\n): Promise<void> {\n const out = output ?? resolveOutput();\n const packageYmlPath = getLocalPackageYmlPath(targetDir);\n \n if (!(await exists(packageYmlPath))) {\n return; // If no openpackage.yml exists, ignore this step\n }\n \n // Don't add the workspace package to its own manifest\n if (await isRootPackage(targetDir, packageName)) {\n logger.debug(`Skipping manifest update: package '${packageName}' is the workspace package itself`);\n return;\n }\n \n const config = await parsePackageYml(packageYmlPath);\n if (!config.dependencies) config.dependencies = [];\n if (!config[DEPENDENCY_ARRAYS.DEV_DEPENDENCIES]) config[DEPENDENCY_ARRAYS.DEV_DEPENDENCIES] = [];\n\n const normalizedPackageName = normalizePackageName(packageName);\n const nameWithVersion = packageVersion ? `${packageName}@${packageVersion}` : packageName;\n const dependenciesArray = config.dependencies;\n const devDependenciesArray = config[DEPENDENCY_ARRAYS.DEV_DEPENDENCIES]!;\n\n const findIndex = (arr: PackageDependency[]): number =>\n arr.findIndex(dep => arePackageNamesEquivalent(dep.name, normalizedPackageName));\n\n let currentLocation: 'dependencies' | 'dev-dependencies' | null = null;\n let existingIndex = findIndex(dependenciesArray);\n if (existingIndex >= 0) {\n currentLocation = DEPENDENCY_ARRAYS.DEPENDENCIES;\n } else {\n existingIndex = findIndex(devDependenciesArray);\n if (existingIndex >= 0) {\n currentLocation = DEPENDENCY_ARRAYS.DEV_DEPENDENCIES;\n } else {\n existingIndex = -1;\n }\n }\n\n const existingRange =\n currentLocation && existingIndex >= 0\n ? config[currentLocation]![existingIndex]?.version\n : undefined;\n\n const shouldOmitVersion = isUnversionedVersion(packageVersion) || isUnversionedVersion(originalVersion);\n let versionToWrite: string | undefined = git ? undefined : shouldOmitVersion ? undefined : originalVersion;\n\n if (!git && !shouldOmitVersion && packageVersion) {\n const baseVersion = extractBaseVersion(packageVersion);\n const defaultRange = createCaretRange(baseVersion);\n versionToWrite = originalVersion ?? defaultRange;\n\n if (!originalVersion && existingRange) {\n const hasPrereleaseIntent = hasExplicitPrereleaseIntent(existingRange);\n const isNewVersionStable = !isPrereleaseVersion(packageVersion);\n\n if (hasPrereleaseIntent) {\n if (isNewVersionStable) {\n // Constraint has explicit prerelease intent and we're packing a stable\n // version on the same base line: normalize to a stable caret.\n versionToWrite = createCaretRange(baseVersion);\n logger.debug(\n `Updating range from prerelease-including '${existingRange}' to stable '${versionToWrite}' ` +\n `for ${packageName} (pack transition to ${packageVersion})`\n );\n } else {\n // For prerelease-intent ranges during saves (prerelease versions),\n // always preserve the existing constraint.\n versionToWrite = existingRange;\n }\n } else if (rangeIncludesVersion(existingRange, baseVersion)) {\n // Stable (non-prerelease) constraint that already includes the new base\n // version: keep it unchanged.\n versionToWrite = existingRange;\n } else {\n // Stable constraint that does not include the new base version: bump to\n // a new caret on the packed stable.\n versionToWrite = defaultRange;\n }\n }\n }\n\n // Build url field with embedded ref for git sources\n let urlField: string | undefined;\n if (git) {\n urlField = ref ? `${git}#${ref}` : git;\n }\n \n const dependency: PackageDependency = {\n name: normalizedPackageName,\n ...(versionToWrite ? { version: versionToWrite } : {}),\n ...(path && !git ? { path } : {}), // Only use path for local sources\n ...(urlField ? { url: urlField } : {}), // Use url with embedded ref\n ...(gitPath ? { path: gitPath } : {}), // Use path field for git subdirectory\n ...(base ? { base } : {}) // Phase 4: Base field for resource model\n };\n \n // Determine target location (dependencies vs dev-dependencies)\n \n let targetArray: 'dependencies' | 'dev-dependencies';\n if (currentLocation === DEPENDENCY_ARRAYS.DEV_DEPENDENCIES && !isDev) {\n targetArray = DEPENDENCY_ARRAYS.DEV_DEPENDENCIES;\n logger.info(`Keeping package in dev-dependencies: ${nameWithVersion}`);\n } else if (currentLocation === DEPENDENCY_ARRAYS.DEPENDENCIES && isDev) {\n targetArray = DEPENDENCY_ARRAYS.DEV_DEPENDENCIES;\n logger.info(`Moving package from dependencies to dev-dependencies: ${nameWithVersion}`);\n } else {\n targetArray = isDev ? DEPENDENCY_ARRAYS.DEV_DEPENDENCIES : DEPENDENCY_ARRAYS.DEPENDENCIES;\n }\n \n // Remove from current location if moving between arrays\n if (currentLocation && currentLocation !== targetArray && existingIndex >= 0) {\n config[currentLocation]!.splice(existingIndex, 1);\n existingIndex = -1;\n currentLocation = null;\n }\n \n // Update or add dependency\n const targetArrayRef = config[targetArray]!;\n const existingTargetIndex =\n currentLocation === targetArray ? findIndex(targetArrayRef) : -1;\n \n if (existingTargetIndex >= 0) {\n const existingDepForTarget = targetArrayRef[existingTargetIndex];\n const versionChanged = existingDepForTarget.version !== dependency.version;\n if (versionChanged) {\n targetArrayRef[existingTargetIndex] = dependency;\n if (!silent) {\n logger.info(`Updated existing package dependency: ${nameWithVersion}`);\n out.success(`Updated ${nameWithVersion} in main openpackage.yml`);\n }\n }\n } else {\n targetArrayRef.push(dependency);\n if (!silent) {\n logger.info(`Added new package dependency: ${nameWithVersion}`);\n out.success(`Added ${nameWithVersion} to main openpackage.yml`);\n }\n }\n \n await writePackageYml(packageYmlPath, config);\n}\n\n\n/**\n * Check if a dependency matches a given package name, handling various naming formats.\n * This function supports matching across format migrations:\n * - Direct name comparison (after normalization)\n * - Git-based matching (username/repo/path combinations)\n * \n * Examples of matches:\n * - \"anthropics/claude-plugins-official/code-review\" matches \"ghanthropics/claude-plugins-official/plugins/code-review\"\n * - \"@anthropics/claude-plugins-official\" matches \"ghanthropics/claude-plugins-official\"\n * - \"username/repo\" matches \"gh@username/repo\"\n */\nfunction doesDependencyMatchPackageName(\n dep: PackageDependency,\n userInputName: string\n): boolean {\n // Normalize both for direct comparison\n const normalizedDepName = normalizePackageNameForLookup(dep.name);\n const normalizedUserName = normalizePackageNameForLookup(userInputName);\n \n // Direct match after normalization\n if (normalizedDepName === normalizedUserName) {\n return true;\n }\n \n // If dependency has a git source, try matching based on git URL + path\n const gitUrlRaw = dep.url || dep.git;\n if (gitUrlRaw) {\n const githubInfo = extractGitHubInfo(gitUrlRaw);\n if (!githubInfo) {\n return false;\n }\n \n const { username, repo } = githubInfo;\n \n // Get the actual path from dependency (prefer path over subdirectory)\n const actualPath = dep.path || (dep.subdirectory?.startsWith('./') \n ? dep.subdirectory.substring(2) \n : dep.subdirectory);\n \n // Build all possible name variations that could match\n const possibleNames = [\n `${username}/${repo}`,\n `@${username}/${repo}`,\n `gh@${username}/${repo}`,\n ];\n \n if (actualPath) {\n possibleNames.push(\n `${username}/${repo}/${actualPath}`,\n `@${username}/${repo}/${actualPath}`,\n `gh@${username}/${repo}/${actualPath}`,\n );\n \n // Also try with just the basename of the path\n // e.g., \"plugins/code-review\" -> \"code-review\"\n const pathBasename = actualPath.split('/').pop();\n if (pathBasename && pathBasename !== actualPath) {\n possibleNames.push(\n `${username}/${repo}/${pathBasename}`,\n `@${username}/${repo}/${pathBasename}`,\n `gh@${username}/${repo}/${pathBasename}`,\n );\n }\n }\n \n // Check if any possible name matches the user input (case-insensitive)\n const normalizedInput = normalizePackageName(userInputName);\n for (const possibleName of possibleNames) {\n if (normalizePackageName(possibleName) === normalizedInput) {\n return true;\n }\n }\n }\n \n return false;\n}\n\n/**\n * Remove a dependency entry from a manifest file (both dependencies and dev-dependencies).\n * Use this when removing from a specific package manifest (e.g. --from essentials).\n *\n * @param manifestPath - Absolute path to openpackage.yml\n * @param dependencyName - User-specified name to match (e.g. essential-agent, @scope/pkg)\n * @returns true if a dependency was removed, false otherwise\n */\nexport interface RemoveDependencyFromManifestResult {\n removed: boolean;\n section?: 'dependencies' | 'dev-dependencies';\n}\n\nexport async function removeDependencyFromManifest(\n manifestPath: string,\n dependencyName: string\n): Promise<RemoveDependencyFromManifestResult> {\n if (!(await exists(manifestPath))) return { removed: false };\n\n try {\n const config = await parsePackageYml(manifestPath);\n const sections: Array<'dependencies' | 'dev-dependencies'> = [DEPENDENCY_ARRAYS.DEPENDENCIES, DEPENDENCY_ARRAYS.DEV_DEPENDENCIES];\n let removed = false;\n let removedFromSection: 'dependencies' | 'dev-dependencies' | undefined;\n let hadAnyDependencies = false;\n\n for (const section of sections) {\n const arr = config[section];\n if (!arr) continue;\n if (arr.length > 0) hadAnyDependencies = true;\n\n // Filter out dependencies that match the package name\n // Uses context-aware matching to handle git sources and naming migrations\n const next = arr.filter(dep => !doesDependencyMatchPackageName(dep, dependencyName));\n\n if (next.length !== arr.length) {\n config[section] = next as any;\n removed = true;\n removedFromSection = section;\n }\n }\n\n // Always write the config if:\n // 1. A package was removed (to persist the removal), OR\n // 2. The file had dependencies (to trigger migration even if no removal happened)\n if (removed || hadAnyDependencies) {\n await writePackageYml(manifestPath, config);\n }\n return { removed, section: removedFromSection };\n } catch (error) {\n logger.warn(`Failed to update openpackage.yml when removing ${dependencyName}: ${error}`);\n return { removed: false };\n }\n}\n\n/**\n * Remove a dependency entry from openpackage.yml (both dependencies and dev-dependencies).\n * Operates on the workspace manifest at .openpackage/openpackage.yml\n */\nexport async function removePackageFromOpenpackageYml(\n targetDir: string,\n packageName: string\n): Promise<boolean> {\n const packageYmlPath = getLocalPackageYmlPath(targetDir);\n const result = await removeDependencyFromManifest(packageYmlPath, packageName);\n return result.removed;\n}\n\n/**\n * Check if a manifest contains a dependency matching the user input.\n * Uses context-aware matching (direct name, git variations, etc.).\n *\n * @param manifestPath - Absolute path to openpackage.yml\n * @param userInput - User-specified name (e.g. essential-agent, .opencode)\n * @returns The matched dependency's stored name if found, null otherwise\n */\nexport async function findMatchingDependencyInManifest(\n manifestPath: string,\n userInput: string\n): Promise<string | null> {\n if (!(await exists(manifestPath))) return null;\n\n try {\n const config = await parsePackageYml(manifestPath);\n const sections: Array<'dependencies' | 'dev-dependencies'> = [DEPENDENCY_ARRAYS.DEPENDENCIES, DEPENDENCY_ARRAYS.DEV_DEPENDENCIES];\n\n for (const section of sections) {\n const arr = config[section];\n if (!arr) continue;\n\n const match = arr.find(dep => doesDependencyMatchPackageName(dep, userInput));\n if (match) return match.name;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nfunction rangeIncludesVersion(range: string, version: string): boolean {\n if (!range || !version) {\n return false;\n }\n try {\n return semver.satisfies(version, range, { includePrerelease: true });\n } catch {\n return false;\n }\n}\n\n\n", "import * as semver from 'semver';\n\n/**\n * Version range types supported by the system\n */\nexport type VersionRangeType = 'exact' | 'caret' | 'tilde' | 'wildcard' | 'comparison';\n\n/**\n * Parsed version range information\n */\nexport interface VersionRange {\n type: VersionRangeType;\n baseVersion: string;\n range: string;\n original: string;\n}\n\n/**\n * Parse a version string into a VersionRange object\n */\nexport function parseVersionRange(version: string): VersionRange {\n if (!version || version.trim() === '') {\n throw new Error('Version cannot be empty');\n }\n\n const trimmed = version.trim();\n \n // Handle wildcard/latest\n if (trimmed === '*' || trimmed === 'latest') {\n return {\n type: 'wildcard',\n baseVersion: '0.0.0',\n range: '*',\n original: trimmed\n };\n }\n\n // Handle caret ranges (^1.2.3)\n if (trimmed.startsWith('^')) {\n const baseVersion = trimmed.substring(1);\n if (!semver.valid(baseVersion)) {\n throw new Error(`Invalid base version for caret range: ${baseVersion}`);\n }\n return {\n type: 'caret',\n baseVersion,\n range: trimmed,\n original: trimmed\n };\n }\n\n // Handle tilde ranges (~1.2.3)\n if (trimmed.startsWith('~')) {\n const baseVersion = trimmed.substring(1);\n if (!semver.valid(baseVersion)) {\n throw new Error(`Invalid base version for tilde range: ${baseVersion}`);\n }\n return {\n type: 'tilde',\n baseVersion,\n range: trimmed,\n original: trimmed\n };\n }\n\n // Handle comparison ranges (>=1.2.3, <2.0.0, etc.)\n if (trimmed.match(/^[><=!]+/)) {\n if (!semver.validRange(trimmed)) {\n throw new Error(`Invalid comparison range: ${trimmed}`);\n }\n // Extract base version from comparison range for display purposes\n const baseVersion = semver.minVersion(trimmed)?.version || '0.0.0';\n return {\n type: 'comparison',\n baseVersion,\n range: trimmed,\n original: trimmed\n };\n }\n\n // Handle exact versions (1.2.3)\n if (semver.valid(trimmed)) {\n return {\n type: 'exact',\n baseVersion: trimmed,\n range: trimmed,\n original: trimmed\n };\n }\n\n throw new Error(`Invalid version format: ${trimmed}`);\n}\n\n/**\n * Check if a version satisfies a version range\n */\nexport function satisfiesVersion(version: string, range: string): boolean {\n try {\n // Always include prerelease versions in satisfaction checks\n return semver.satisfies(version, range, { includePrerelease: true });\n } catch (error) {\n return false;\n }\n}\n\n/**\n * Find the best version that satisfies a range from available versions\n */\nexport function findBestVersion(availableVersions: string[], range: string): string | null {\n try {\n // Sort versions in descending order (latest first)\n const sortedVersions = availableVersions\n .filter(v => semver.valid(v))\n .sort((a, b) => semver.compare(b, a));\n \n // Find the highest version that satisfies the range (including prereleases)\n return semver.maxSatisfying(sortedVersions, range, { includePrerelease: true });\n } catch (error) {\n return null;\n }\n}\n\n/**\n * Get the latest version from available versions\n */\nexport function getLatestVersion(availableVersions: string[]): string | null {\n const validVersions = availableVersions.filter(v => semver.valid(v));\n if (validVersions.length === 0) return null;\n \n return validVersions.sort((a, b) => semver.compare(b, a))[0];\n}\n\n/**\n * Create a caret range from a version (^1.2.3)\n */\nexport function createCaretRange(version: string): string {\n if (!semver.valid(version)) {\n throw new Error(`Invalid version for caret range: ${version}`);\n }\n return `^${version}`;\n}\n\n/**\n * Create a tilde range from a version (~1.2.3)\n */\nexport function createTildeRange(version: string): string {\n if (!semver.valid(version)) {\n throw new Error(`Invalid version for tilde range: ${version}`);\n }\n return `~${version}`;\n}\n\n/**\n * Check if a version range is exact (no range operators)\n */\nexport function isExactVersion(version: string): boolean {\n try {\n const parsed = parseVersionRange(version);\n return parsed.type === 'exact';\n } catch {\n return false;\n }\n}\n\n/**\n * Check if a version range is a wildcard (latest)\n */\nexport function isWildcardVersion(version: string): boolean {\n try {\n const parsed = parseVersionRange(version);\n return parsed.type === 'wildcard';\n } catch {\n return false;\n }\n}\n\n/**\n * Get a human-readable description of a version range\n */\nexport function describeVersionRange(version: string): string {\n try {\n const parsed = parseVersionRange(version);\n \n switch (parsed.type) {\n case 'exact':\n return `exact version ${parsed.baseVersion}`;\n case 'caret':\n return `compatible with ${parsed.baseVersion} (^${parsed.baseVersion})`;\n case 'tilde':\n return `approximately ${parsed.baseVersion} (~${parsed.baseVersion})`;\n case 'wildcard':\n return 'latest version (*)';\n case 'comparison':\n return `range ${parsed.range}`;\n default:\n return `version ${parsed.original}`;\n }\n } catch {\n return `invalid version ${version}`;\n }\n}\n\n/**\n * Resolve a version range to a specific version from available versions\n */\nexport function resolveVersionRange(version: string, availableVersions: string[]): string | null {\n try {\n const parsed = parseVersionRange(version);\n \n switch (parsed.type) {\n case 'exact':\n return availableVersions.includes(parsed.baseVersion) ? parsed.baseVersion : null;\n case 'wildcard':\n return getLatestVersion(availableVersions);\n default:\n // Resolve to best satisfying version including prereleases\n return findBestVersion(availableVersions, parsed.range);\n }\n } catch {\n return null;\n }\n}\n\n/**\n * Determine if a version string is a prerelease (includes WIP versions)\n */\nexport function isPrereleaseVersion(version: string): boolean {\n const parsed = semver.parse(version);\n return Boolean(parsed && parsed.prerelease.length > 0);\n}\n\n/**\n * Returns the stable base (major.minor.patch) portion of a version string.\n */\nexport function getStableBaseVersion(version: string): string | null {\n const parsed = semver.parse(version);\n if (!parsed) {\n return null;\n }\n\n return `${parsed.major}.${parsed.minor}.${parsed.patch}`;\n}\n\nexport interface VersionClassification {\n stable: string[];\n prerelease: string[];\n wip: string[];\n}\n\nexport function classifyVersions(versions: string[]): VersionClassification {\n const deduped = dedupeValidVersions(versions);\n const stable: string[] = [];\n const prerelease: string[] = [];\n const wip: string[] = [];\n\n for (const version of deduped) {\n if (isPrereleaseVersion(version)) {\n prerelease.push(version);\n wip.push(version); // All prerelease versions are treated as WIP\n } else {\n stable.push(version);\n }\n }\n\n return {\n stable: sortVersionsDesc(stable),\n prerelease: sortVersionsDesc(prerelease),\n wip: sortVersionsDesc(wip)\n };\n}\n\nexport interface VersionSelectionOptions {\n explicitPrereleaseIntent?: boolean;\n}\n\nexport interface VersionSelectionResult {\n version: string | null;\n isPrerelease: boolean;\n satisfyingStable: string[];\n satisfyingPrerelease: string[];\n availableStable: string[];\n availablePrerelease: string[];\n reason: 'exact' | 'wildcard' | 'range' | 'none';\n}\n\n/**\n * Determine whether a range explicitly references prerelease intent.\n */\nexport function hasExplicitPrereleaseIntent(range: string): boolean {\n const trimmed = range.trim();\n if (!trimmed || trimmed === '*' || trimmed.toLowerCase() === 'latest') {\n return false;\n }\n\n // Fast-path: if the original range string contains no '-' characters at all,\n // it cannot be explicitly expressing prerelease intent. This avoids treating\n // normalized comparators like \">=1.0.0-0\" (introduced by semver with\n // includePrerelease) as user-authored prerelease ranges when the original\n // input was a stable caret like \"^1.0.0\".\n if (!trimmed.includes('-')) {\n return false;\n }\n\n try {\n const parsedRange = new semver.Range(trimmed, { includePrerelease: true });\n for (const comparatorSet of parsedRange.set) {\n for (const comparator of comparatorSet) {\n if (comparator.semver.prerelease.length > 0) {\n return true;\n }\n }\n }\n } catch {\n return false;\n }\n\n return false;\n}\n\n/**\n * Select the most appropriate version according to WIP vs stable policy.\n */\nexport function selectVersionWithWipPolicy(\n availableVersions: string[],\n range: string,\n options?: VersionSelectionOptions\n): VersionSelectionResult {\n const parsedRange = parseVersionRange(range);\n const deduped = dedupeValidVersions(availableVersions);\n const availableStable = sortVersionsDesc(deduped.filter(version => !isPrereleaseVersion(version)));\n const availablePrerelease = sortVersionsDesc(deduped.filter(version => isPrereleaseVersion(version)));\n const satisfyingStable: string[] = [];\n const satisfyingPrerelease: string[] = [];\n\n const result: VersionSelectionResult = {\n version: null,\n isPrerelease: false,\n satisfyingStable,\n satisfyingPrerelease,\n availableStable,\n availablePrerelease,\n reason: 'none'\n };\n\n const finish = (): VersionSelectionResult => {\n return result;\n };\n\n if (parsedRange.type === 'exact') {\n result.reason = 'exact';\n const exactMatch = deduped.find(version => semver.eq(version, parsedRange.baseVersion));\n if (exactMatch) {\n if (isPrereleaseVersion(exactMatch)) {\n satisfyingPrerelease.push(exactMatch);\n result.isPrerelease = true;\n } else {\n satisfyingStable.push(exactMatch);\n }\n result.version = exactMatch;\n }\n return finish();\n }\n\n const normalizedRange = parsedRange.type === 'wildcard' ? '*' : parsedRange.range;\n satisfyingStable.push(\n ...filterSatisfying(availableStable, normalizedRange, false)\n );\n satisfyingPrerelease.push(\n ...filterSatisfying(availablePrerelease, normalizedRange, true)\n );\n\n // Latest wins policy: stable and WIP treated uniformly\n const allSatisfying = sortVersionsDesc([\n ...satisfyingStable,\n ...satisfyingPrerelease\n ]);\n\n if (parsedRange.type === 'wildcard') {\n result.reason = 'wildcard';\n } else {\n result.reason = 'range';\n }\n\n if (allSatisfying.length === 0) {\n return finish();\n }\n\n const selected = allSatisfying[0];\n result.version = selected;\n result.isPrerelease = isPrereleaseVersion(selected);\n return finish();\n}\n\nfunction dedupeValidVersions(versions: string[]): string[] {\n const seen = new Set<string>();\n for (const version of versions) {\n if (!version || !semver.valid(version) || seen.has(version)) {\n continue;\n }\n seen.add(version);\n }\n return Array.from(seen);\n}\n\nfunction sortVersionsDesc(versions: string[]): string[] {\n return versions.slice().sort(semver.rcompare);\n}\n\nfunction filterSatisfying(\n versions: string[],\n range: string,\n includePrerelease: boolean\n): string[] {\n try {\n return sortVersionsDesc(\n versions.filter(version => semver.satisfies(version, range, { includePrerelease }))\n );\n } catch {\n return [];\n }\n}\n", "import { join, relative, dirname, basename } from 'path';\nimport { isJunk } from 'junk';\nimport { Package, PackageFile } from '../types/index.js';\nimport {\n exists,\n walkFiles,\n readTextFile,\n writeTextFile,\n remove,\n ensureDir\n} from '../utils/fs.js';\nimport { logger } from '../utils/logger.js';\nimport {\n PackageNotFoundError,\n InvalidPackageError,\n} from '../utils/errors.js';\nimport { validatePackageName } from '../utils/package-name.js';\nimport {\n getPackagePath,\n getPackageVersionPath,\n getLatestPackageVersion,\n listPackageVersions\n} from './directory.js';\nimport { parsePackageYml, writePackageYml } from '../utils/package-yml.js';\nimport {\n resolveVersionRange,\n isExactVersion\n} from '../utils/version-ranges.js';\nimport { PACKAGE_PATHS, UNVERSIONED } from '../constants/index.js';\nimport { getTransformedPlugin } from './install/plugin-transformer.js';\nimport { loadPackageFromPath } from './install/path-package-loader.js';\n\n/**\n * Package management operations\n */\n\nexport interface PackageVersionState {\n exists: boolean;\n isPartial: boolean;\n paths: string[];\n}\n\ninterface PackageSaveOptions {\n partial?: boolean;\n}\n\nexport class PackageManager {\n \n \n /**\n * Load a package from the registry (latest version by default)\n */\n async loadPackage(\n packageName: string,\n version?: string,\n opts?: { packageRootDir?: string }\n ): Promise<Package> {\n logger.debug(`Loading package: ${packageName}`, { version });\n \n validatePackageName(packageName);\n \n // Check if this is a cached transformed plugin\n if (version) {\n const cachedPluginWithContext = getTransformedPlugin(packageName, version);\n if (cachedPluginWithContext) {\n logger.debug(`Using cached transformed plugin: ${packageName}@${version}`);\n return cachedPluginWithContext.package;\n }\n }\n \n let targetVersion: string | null = opts?.packageRootDir ? version ?? null : null;\n \n if (opts?.packageRootDir) {\n // Use provided root; version comes from manifest.\n } else if (version === UNVERSIONED) {\n targetVersion = UNVERSIONED;\n } else if (version) {\n // Check if it's a version range or exact version\n if (isExactVersion(version)) {\n targetVersion = version;\n } else {\n // It's a version range - resolve it to a specific version\n const availableVersions = await listPackageVersions(packageName);\n if (availableVersions.length === 0) {\n throw new PackageNotFoundError(packageName);\n }\n \n targetVersion = resolveVersionRange(version, availableVersions);\n if (!targetVersion) {\n throw new PackageNotFoundError(\n `No version of '${packageName}' satisfies range '${version}'. Available versions: ${availableVersions.join(', ')}`\n );\n }\n logger.debug(`Resolved version range '${version}' to '${targetVersion}' for package '${packageName}'`);\n }\n } else {\n // No version specified - get latest\n targetVersion = await getLatestPackageVersion(packageName);\n }\n \n if (!targetVersion && !opts?.packageRootDir) {\n throw new PackageNotFoundError(packageName);\n }\n \n const packagePath = opts?.packageRootDir\n ? opts.packageRootDir\n : getPackageVersionPath(packageName, targetVersion ?? undefined);\n if (!(await exists(packagePath))) {\n throw new PackageNotFoundError(packageName);\n }\n \n try {\n // Use unified loader to handle both regular packages and plugins\n const pkg = await loadPackageFromPath(packagePath, { packageName });\n return pkg;\n } catch (error) {\n if (error instanceof PackageNotFoundError || (error as any).name === 'ValidationError') {\n throw new PackageNotFoundError(packageName);\n }\n logger.error(`Failed to load package: ${packageName}`, { error });\n throw new InvalidPackageError(`Failed to load package: ${error}`);\n }\n }\n \n /**\n * Save a package to the registry (versioned)\n */\n async savePackage(pkg: Package, options: PackageSaveOptions = {}): Promise<void> {\n const { metadata, files } = pkg;\n const packagePath = getPackageVersionPath(metadata.name, metadata.version);\n \n logger.debug(`Saving package: ${metadata.name}@${metadata.version ?? UNVERSIONED}`, { packagePath });\n \n try {\n // Ensure the version directory exists\n await ensureDir(packagePath);\n \n // Save files\n for (const file of files) {\n const fullPath = join(packagePath, file.path);\n await ensureDir(dirname(fullPath));\n await writeTextFile(fullPath, file.content, (file.encoding as BufferEncoding) || 'utf8');\n }\n if (options.partial) {\n await this.markPartialInManifest(packagePath);\n } else {\n await this.clearPartialInManifest(packagePath);\n }\n \n logger.info(`Package '${metadata.name}@${metadata.version}' saved successfully`);\n } catch (error) {\n logger.error(`Failed to save package: ${metadata.name}@${metadata.version}`, { error });\n throw new InvalidPackageError(`Failed to save package: ${error}`);\n }\n }\n \n /**\n * Delete a specific version of a package\n */\n async deletePackageVersion(packageName: string, version: string): Promise<void> {\n logger.info(`Deleting package version: ${packageName}@${version}`);\n \n validatePackageName(packageName);\n \n const packagePath = getPackageVersionPath(packageName, version);\n \n if (!(await exists(packagePath))) {\n throw new PackageNotFoundError(`${packageName}@${version}`);\n }\n \n try {\n await remove(packagePath);\n logger.info(`Package version '${packageName}@${version}' deleted successfully`);\n } catch (error) {\n logger.error(`Failed to delete package version: ${packageName}@${version}`, { error });\n throw new InvalidPackageError(`Failed to delete package version: ${error}`);\n }\n }\n \n /**\n * Delete all versions of a package\n */\n async deletePackage(packageName: string): Promise<void> {\n logger.info(`Deleting all versions of package: ${packageName}`);\n \n validatePackageName(packageName);\n \n const packagePath = getPackagePath(packageName);\n \n if (!(await exists(packagePath))) {\n throw new PackageNotFoundError(packageName);\n }\n \n try {\n await remove(packagePath);\n logger.info(`All versions of package '${packageName}' deleted successfully`);\n } catch (error) {\n logger.error(`Failed to delete package: ${packageName}`, { error });\n throw new InvalidPackageError(`Failed to delete package: ${error}`);\n }\n }\n \n /**\n * Check if a package exists in the registry (any version)\n */\n async packageExists(packageName: string): Promise<boolean> {\n validatePackageName(packageName);\n const latestVersion = await getLatestPackageVersion(packageName);\n return latestVersion !== null;\n }\n\n /**\n * Return local state for a specific package version, including partial metadata.\n */\n async getPackageVersionState(packageName: string, version?: string): Promise<PackageVersionState> {\n const packagePath = getPackageVersionPath(packageName, version);\n const existsLocally = await exists(packagePath);\n\n if (!existsLocally) {\n return { exists: false, isPartial: false, paths: [] };\n }\n\n const manifestPath = join(packagePath, PACKAGE_PATHS.MANIFEST_RELATIVE);\n const manifestExists = await exists(manifestPath);\n let isPartial = !manifestExists;\n if (manifestExists) {\n try {\n const manifest = await parsePackageYml(manifestPath);\n isPartial = Boolean((manifest as any).partial);\n } catch (error) {\n logger.warn('Failed to read package manifest for partial state', { packageName, version, error });\n isPartial = true;\n }\n }\n\n const paths = await this.listPackageFilePaths(packagePath);\n\n return { exists: true, isPartial, paths };\n }\n \n /**\n * Discover all files in a package directory\n */\n\n private async discoverPackageFiles(packagePath: string): Promise<PackageFile[]> {\n const files: PackageFile[] = [];\n\n try {\n // Include all file types (no filtering)\n // Get all files recursively in the package directory\n for await (const fullPath of walkFiles(packagePath)) {\n const relativePath = relative(packagePath, fullPath);\n\n // Filter out junk files\n if (isJunk(basename(relativePath))) {\n continue;\n }\n\n const content = await readTextFile(fullPath);\n\n files.push({\n path: relativePath,\n content,\n encoding: 'utf8'\n });\n }\n\n logger.debug(`Discovered ${files.length} files in package directory`, { packagePath });\n return files;\n } catch (error) {\n logger.error(`Failed to discover files in package directory: ${packagePath}`, { error });\n throw new InvalidPackageError(`Failed to discover package files: ${error}`);\n }\n }\n\n private async markPartialInManifest(packagePath: string): Promise<void> {\n const manifestPath = join(packagePath, PACKAGE_PATHS.MANIFEST_RELATIVE);\n if (!(await exists(manifestPath))) {\n return;\n }\n\n const manifest = await parsePackageYml(manifestPath);\n (manifest as any).partial = true;\n await writePackageYml(manifestPath, manifest);\n }\n\n private async clearPartialInManifest(packagePath: string): Promise<void> {\n const manifestPath = join(packagePath, PACKAGE_PATHS.MANIFEST_RELATIVE);\n if (!(await exists(manifestPath))) {\n return;\n }\n\n const manifest = await parsePackageYml(manifestPath);\n if ((manifest as any).partial !== undefined) {\n delete (manifest as any).partial;\n await writePackageYml(manifestPath, manifest);\n }\n }\n\n private async listPackageFilePaths(packagePath: string): Promise<string[]> {\n const paths: string[] = [];\n for await (const fullPath of walkFiles(packagePath)) {\n const relativePath = relative(packagePath, fullPath);\n if (isJunk(basename(relativePath))) {\n continue;\n }\n paths.push(relativePath);\n }\n paths.sort();\n return paths;\n }\n}\n\n// Create and export a singleton instance\nexport const packageManager = new PackageManager();\n\n", "import { join, relative } from 'path';\nimport { readTextFile, walkFiles } from '../../utils/fs.js';\nimport { logger } from '../../utils/logger.js';\nimport { ValidationError } from '../../utils/errors.js';\nimport { isJunk } from 'junk';\nimport type { Package, PackageFile, PackageYml, PackageWithContext } from '../../types/index.js';\nimport { detectPackageFormat } from './format-detector.js';\nimport { DIR_PATTERNS } from '../../constants/index.js';\nimport { generateGitHubPackageName } from '../../utils/plugin-naming.js';\nimport { createPlatformContext } from '../conversion-context/index.js';\nimport { resolvePluginMetadata, type ClaudePluginManifest } from './plugin-metadata-resolver.js';\nimport type { MarketplacePluginEntry } from './marketplace-handler.js';\n\n/**\n * In-memory cache for transformed plugin packages with context.\n * Key: `${packageName}@${version}`\n */\nconst transformedPluginCache = new Map<string, PackageWithContext>();\n\n/**\n * Cache a transformed plugin package with context for later retrieval.\n */\nfunction cacheTransformedPlugin(pkg: Package, context?: any): void {\n const key = `${pkg.metadata.name}@${pkg.metadata.version}`;\n const cached: PackageWithContext = context \n ? { package: pkg, context }\n : { package: pkg, context: createPlatformContext('claude-plugin', 1.0) };\n transformedPluginCache.set(key, cached);\n}\n\n/**\n * Retrieve a cached transformed plugin package with context.\n */\nexport function getTransformedPlugin(name: string, version: string): PackageWithContext | undefined {\n const key = `${name}@${version}`;\n return transformedPluginCache.get(key);\n}\n\n/**\n * Context for transforming a plugin with naming information.\n */\ninterface PluginTransformContext {\n gitUrl?: string;\n path?: string;\n resourcePath?: string;\n repoPath?: string;\n marketplaceEntry?: MarketplacePluginEntry;\n}\n\n/**\n * Transform a Claude Code plugin to an OpenPackage Package with conversion context.\n * \n * Resolves plugin metadata from plugin.json or marketplace entry, converts it to\n * OpenPackage format, and collects all plugin files.\n * \n * @param pluginDir - Absolute path to plugin directory\n * @param context - Optional context for scoped naming and marketplace entry\n * @returns Package object with conversion context\n */\nexport async function transformPluginToPackage(\n pluginDir: string,\n context?: PluginTransformContext\n): Promise<PackageWithContext> {\n // Resolve plugin metadata from plugin.json or marketplace entry\n const resolved = await resolvePluginMetadata(pluginDir, context?.marketplaceEntry);\n const pluginManifest = resolved.manifest;\n \n // Generate scoped name using consistent naming logic\n // Always generate the name (no override) to ensure consistency\n const packageName = generateGitHubPackageName({\n gitUrl: context?.gitUrl,\n path: context?.path,\n resourcePath: context?.resourcePath,\n packageName: pluginManifest.name,\n repoPath: context?.repoPath\n });\n \n // Transform to OpenPackage metadata\n const metadata: PackageYml = {\n name: packageName,\n // Claude Code plugins often omit version; normalize to a concrete value so:\n // - logs/install output are consistent\n // - transformed plugin cache keys remain stable\n version: pluginManifest.version?.trim() || '0.0.0',\n description: pluginManifest.description,\n keywords: pluginManifest.keywords,\n license: pluginManifest.license,\n homepage: pluginManifest.homepage\n };\n \n // Extract author name\n if (pluginManifest.author?.name) {\n metadata.author = pluginManifest.author.name;\n }\n \n // Extract repository - handle both string and object forms\n if (pluginManifest.repository) {\n if (typeof pluginManifest.repository === 'string') {\n metadata.repository = {\n type: 'git',\n url: pluginManifest.repository\n };\n } else if (pluginManifest.repository.url) {\n metadata.repository = {\n type: pluginManifest.repository.type || 'git',\n url: pluginManifest.repository.url\n };\n }\n }\n \n // Collect all plugin files (preserve entire directory structure)\n const files = await extractPluginFiles(pluginDir);\n \n // Detect package format\n // Claude plugins are detected as platform-specific 'claude-plugin' format\n // and will use the claude-plugin flows defined in platforms.jsonc\n const format = detectPackageFormat(files);\n \n const pkg: Package = {\n metadata,\n files,\n // Store format metadata for installation pipeline\n _format: format\n };\n \n // Create conversion context for claude-plugin\n const conversionContext = createPlatformContext('claude-plugin', format.confidence);\n \n // Cache the transformed plugin with context for later retrieval\n cacheTransformedPlugin(pkg, conversionContext);\n \n logger.info('Transformed Claude Code plugin', {\n name: metadata.name,\n version: metadata.version,\n fileCount: files.length,\n format: format.type,\n platform: format.platform,\n confidence: format.confidence\n });\n \n return { package: pkg, context: conversionContext };\n}\n\n/**\n * Extract all files from a plugin directory, preserving structure.\n * \n * Plugin files are kept with their original paths (commands/, agents/, etc.)\n * The OpenPackage platform system will handle installing them to the correct\n * platform-specific directories (.claude/commands/, .cursor/commands/, etc.)\n * \n * Special handling for plugin-specific files:\n * - .claude-plugin/ \u2192 skipped (plugin metadata, not needed in workspace)\n * - .mcp.json, .lsp.json \u2192 kept as root files\n * - commands/, agents/, skills/, hooks/ \u2192 universal subdirs\n * \n * @param pluginDir - Absolute path to plugin directory\n * @returns Array of package files with original paths\n */\nasync function extractPluginFiles(pluginDir: string): Promise<PackageFile[]> {\n const files: PackageFile[] = [];\n \n try {\n for await (const fullPath of walkFiles(pluginDir)) {\n const relativePath = relative(pluginDir, fullPath);\n \n // Skip junk files (e.g., .DS_Store, Thumbs.db)\n const pathParts = relativePath.split('/');\n if (pathParts.some(part => isJunk(part))) {\n continue;\n }\n \n // Skip git metadata\n if (relativePath.startsWith('.git/') || relativePath === '.git') {\n continue;\n }\n \n // Skip .claude-plugin directory (plugin metadata, not needed in workspace)\n if (relativePath.startsWith(`${DIR_PATTERNS.CLAUDE_PLUGIN}/`)) {\n continue;\n }\n \n const content = await readTextFile(fullPath);\n \n files.push({\n path: relativePath,\n content,\n encoding: 'utf8'\n });\n }\n \n return files;\n \n } catch (error) {\n throw new ValidationError(\n `Failed to extract files from plugin directory ${pluginDir}: ${error}`\n );\n }\n}\n\n\n", "/**\n * Conversion Context Creation\n * \n * Functions for creating PackageConversionContext instances from various sources.\n */\n\nimport type { \n PackageConversionContext, \n FormatIdentity,\n FormatState \n} from '../../types/conversion-context.js';\nimport type { Platform } from '../platforms.js';\nimport type { PackageFormat } from '../install/format-detector.js';\nimport type { Package } from '../../types/index.js';\nimport { detectPackageFormat } from '../install/format-detector.js';\nimport { logger } from '../../utils/logger.js';\n\n/**\n * Create context from detected package format\n * \n * Use this at package discovery/loading time when format is detected.\n */\nexport function createContextFromFormat(format: PackageFormat): PackageConversionContext {\n const now = new Date();\n \n const originalFormat: FormatIdentity = {\n type: format.type,\n platform: format.platform,\n detectedAt: now,\n confidence: format.confidence\n };\n \n const currentFormat: FormatState = {\n type: format.type,\n platform: format.platform\n };\n \n logger.debug('Created conversion context from format', {\n type: format.type,\n platform: format.platform,\n confidence: format.confidence\n });\n \n return {\n originalFormat,\n currentFormat,\n conversionHistory: [],\n targetPlatform: undefined\n };\n}\n\n/**\n * Create context from package (detects format first)\n * \n * Use this when loading a package without prior format information.\n * Fallback for backward compatibility during migration.\n */\nexport function createContextFromPackage(pkg: Package): PackageConversionContext {\n // Use existing _format if available (for backward compatibility)\n const format = pkg._format || detectPackageFormat(pkg.files);\n \n logger.debug('Creating context from package', {\n name: pkg.metadata.name,\n hasFormat: !!pkg._format,\n detectedType: format.type,\n detectedPlatform: format.platform\n });\n \n return createContextFromFormat(format);\n}\n\n/**\n * Create context for a known platform-specific package\n * \n * Use this when you know definitively what platform a package is for\n * (e.g., when transforming a claude-plugin).\n */\nexport function createPlatformContext(\n platform: Platform,\n confidence: number = 1.0\n): PackageConversionContext {\n const now = new Date();\n \n const originalFormat: FormatIdentity = {\n type: 'platform-specific',\n platform,\n detectedAt: now,\n confidence\n };\n \n const currentFormat: FormatState = {\n type: 'platform-specific',\n platform\n };\n \n logger.debug('Created platform-specific context', { platform, confidence });\n \n return {\n originalFormat,\n currentFormat,\n conversionHistory: [],\n targetPlatform: undefined\n };\n}\n\n/**\n * Create context for universal format package\n * \n * Use this when loading a package that's already in universal format.\n */\nexport function createUniversalContext(\n confidence: number = 1.0\n): PackageConversionContext {\n const now = new Date();\n \n const originalFormat: FormatIdentity = {\n type: 'universal',\n platform: undefined,\n detectedAt: now,\n confidence\n };\n \n const currentFormat: FormatState = {\n type: 'universal',\n platform: undefined\n };\n \n logger.debug('Created universal format context', { confidence });\n \n return {\n originalFormat,\n currentFormat,\n conversionHistory: [],\n targetPlatform: undefined\n };\n}\n\n/**\n * Update context with target platform\n * \n * Sets the target platform for the current operation.\n * Returns a new context object (does not mutate).\n */\nexport function withTargetPlatform(\n context: PackageConversionContext,\n targetPlatform: Platform\n): PackageConversionContext {\n return {\n ...context,\n targetPlatform\n };\n}\n\n/**\n * Update context after successful conversion\n * \n * Records the conversion in history and updates current format.\n * Returns a new context object (does not mutate).\n */\nexport function updateContextAfterConversion(\n context: PackageConversionContext,\n newFormat: FormatState,\n targetPlatform: Platform\n): PackageConversionContext {\n const timestamp = new Date();\n \n const newHistory = [\n ...context.conversionHistory,\n {\n from: context.currentFormat,\n to: newFormat,\n targetPlatform,\n timestamp\n }\n ];\n \n logger.debug('Updated context after conversion', {\n from: {\n type: context.currentFormat.type,\n platform: context.currentFormat.platform\n },\n to: {\n type: newFormat.type,\n platform: newFormat.platform\n },\n targetPlatform,\n totalConversions: newHistory.length\n });\n \n return {\n ...context,\n currentFormat: newFormat,\n conversionHistory: newHistory,\n targetPlatform\n };\n}\n", "/**\n * Conversion Context Serialization\n * \n * Functions for serializing/deserializing context to/from JSON for temp directory persistence.\n */\n\nimport type { \n PackageConversionContext, \n SerializedConversionContext,\n ContextSerializationOptions \n} from '../../types/conversion-context.js';\nimport type { Platform } from '../platforms.js';\nimport { logger } from '../../utils/logger.js';\nimport { validateContext } from './validation.js';\n\n/**\n * Serialize context to JSON-friendly format\n * \n * Converts Date objects to ISO strings for JSON serialization.\n */\nexport function serializeContext(\n context: PackageConversionContext,\n options?: ContextSerializationOptions\n): SerializedConversionContext {\n const includeHistory = options?.includeHistory ?? true;\n \n return {\n originalFormat: {\n type: context.originalFormat.type,\n platform: context.originalFormat.platform,\n detectedAt: context.originalFormat.detectedAt.toISOString(),\n confidence: context.originalFormat.confidence\n },\n currentFormat: {\n type: context.currentFormat.type,\n platform: context.currentFormat.platform\n },\n conversionHistory: includeHistory ? context.conversionHistory.map(record => ({\n from: {\n type: record.from.type,\n platform: record.from.platform\n },\n to: {\n type: record.to.type,\n platform: record.to.platform\n },\n targetPlatform: record.targetPlatform,\n timestamp: record.timestamp.toISOString()\n })) : [],\n targetPlatform: context.targetPlatform\n };\n}\n\n/**\n * Deserialize context from JSON format\n * \n * Converts ISO strings back to Date objects.\n * Validates the restored context.\n */\nexport function deserializeContext(\n serialized: SerializedConversionContext\n): PackageConversionContext {\n const context: PackageConversionContext = {\n originalFormat: {\n type: serialized.originalFormat.type,\n platform: serialized.originalFormat.platform as Platform | undefined,\n detectedAt: new Date(serialized.originalFormat.detectedAt),\n confidence: serialized.originalFormat.confidence\n },\n currentFormat: {\n type: serialized.currentFormat.type,\n platform: serialized.currentFormat.platform as Platform | undefined\n },\n conversionHistory: serialized.conversionHistory.map(record => ({\n from: {\n type: record.from.type,\n platform: record.from.platform as Platform | undefined\n },\n to: {\n type: record.to.type,\n platform: record.to.platform as Platform | undefined\n },\n targetPlatform: record.targetPlatform as Platform,\n timestamp: new Date(record.timestamp)\n })),\n targetPlatform: serialized.targetPlatform as Platform | undefined\n };\n \n // Validate restored context\n try {\n validateContext(context);\n } catch (error) {\n logger.error('Deserialized context failed validation', { error });\n throw error;\n }\n \n return context;\n}\n\n/**\n * Serialize context to JSON string\n * \n * Convenience function for writing to files.\n */\nexport function contextToJSON(\n context: PackageConversionContext,\n options?: ContextSerializationOptions\n): string {\n const serialized = serializeContext(context, options);\n const pretty = options?.pretty ?? true;\n \n return JSON.stringify(serialized, null, pretty ? 2 : 0);\n}\n\n/**\n * Deserialize context from JSON string\n * \n * Convenience function for reading from files.\n */\nexport function contextFromJSON(json: string): PackageConversionContext {\n try {\n const serialized = JSON.parse(json) as SerializedConversionContext;\n return deserializeContext(serialized);\n } catch (error) {\n logger.error('Failed to parse context JSON', { error });\n throw new Error(`Invalid context JSON: ${(error as Error).message}`);\n }\n}\n\n/**\n * Create a human-readable description of context\n * \n * Useful for logging and debugging.\n */\nexport function describeContext(context: PackageConversionContext): string {\n const lines = [\n `Original: ${context.originalFormat.platform || 'universal'} (detected ${context.originalFormat.detectedAt.toISOString()})`,\n `Current: ${context.currentFormat.platform || 'universal'}`,\n `Target: ${context.targetPlatform || 'none'}`,\n `Conversions: ${context.conversionHistory.length}`\n ];\n \n if (context.conversionHistory.length > 0) {\n lines.push('History:');\n context.conversionHistory.forEach((h, i) => {\n lines.push(\n ` ${i + 1}. ${h.from.platform || 'universal'} \u2192 ${h.to.platform || 'universal'} ` +\n `(for ${h.targetPlatform}) at ${h.timestamp.toLocaleString()}`\n );\n });\n }\n \n return lines.join('\\n');\n}\n", "/**\n * Format Detector Module\n * \n * Detects package format (universal vs platform-specific) by analyzing file structure.\n * Used to determine conversion strategy during installation.\n */\n\nimport { dirname } from 'path';\nimport type { Platform } from '../platforms.js';\nimport type { PackageFile } from '../../types/index.js';\nimport type { PackageConversionContext } from '../../types/conversion-context.js';\nimport type { EnhancedPackageFormat } from './detection-types.js';\nimport { getAllPlatforms, isPlatformId } from '../platforms.js';\nimport { logger } from '../../utils/logger.js';\nimport { createContextFromFormat } from '../conversion-context/index.js';\n\n/**\n * Package format classification\n */\nexport interface PackageFormat {\n /**\n * Format type: universal (commands/, agents/) or platform-specific (.claude/, .cursor/)\n */\n type: 'universal' | 'platform-specific';\n \n /**\n * If platform-specific, which platform?\n */\n platform?: Platform;\n \n /**\n * Confidence score (0-1) based on file analysis\n */\n confidence: number;\n \n /**\n * Detailed file analysis for debugging\n */\n analysis: FormatAnalysis;\n}\n\nexport interface FormatAnalysis {\n universalFiles: number;\n platformSpecificFiles: number;\n detectedPlatforms: Map<Platform, number>; // Platform -> file count\n totalFiles: number;\n samplePaths: {\n universal: string[];\n platformSpecific: string[];\n };\n}\n\n/**\n * Known universal subdirectories in OpenPackage format\n */\nconst UNIVERSAL_SUBDIRS = [\n 'commands',\n 'agents',\n 'rules',\n 'skills',\n 'hooks'\n];\n\n/**\n * Known platform-specific root directories\n */\nconst PLATFORM_ROOT_DIRS: Record<string, Platform> = {\n '.claude': 'claude',\n '.claude-plugin': 'claude-plugin',\n '.cursor': 'cursor',\n '.opencode': 'opencode',\n '.codex': 'codex',\n '.factory': 'factory',\n '.kilocode': 'kilo',\n '.kiro': 'kiro',\n '.qwen': 'qwen',\n '.roo': 'roo',\n '.warp': 'warp',\n '.windsurf': 'windsurf',\n '.augment': 'augment',\n '.agent': 'antigravity'\n};\n\n/**\n * Detect package format from file list\n */\nexport function detectPackageFormat(files: PackageFile[]): PackageFormat {\n // Check for claude-plugin first (highest priority)\n const hasClaudePluginManifest = files.some(f => \n f.path === '.claude-plugin/plugin.json'\n );\n \n if (hasClaudePluginManifest) {\n return {\n type: 'platform-specific',\n platform: 'claude-plugin',\n confidence: 1.0,\n analysis: {\n universalFiles: 0,\n platformSpecificFiles: files.length,\n detectedPlatforms: new Map([['claude-plugin', files.length]]),\n totalFiles: files.length,\n samplePaths: {\n universal: [],\n platformSpecific: ['.claude-plugin/plugin.json']\n }\n }\n };\n }\n \n const analysis: FormatAnalysis = {\n universalFiles: 0,\n platformSpecificFiles: 0,\n detectedPlatforms: new Map(),\n totalFiles: files.length,\n samplePaths: {\n universal: [],\n platformSpecific: []\n }\n };\n \n // Analyze each file\n for (const file of files) {\n const classification = classifyFile(file.path);\n \n if (classification.type === 'universal') {\n analysis.universalFiles++;\n if (analysis.samplePaths.universal.length < 5) {\n analysis.samplePaths.universal.push(file.path);\n }\n } else if (classification.type === 'platform-specific' && classification.platform) {\n analysis.platformSpecificFiles++;\n const count = analysis.detectedPlatforms.get(classification.platform) || 0;\n analysis.detectedPlatforms.set(classification.platform, count + 1);\n \n if (analysis.samplePaths.platformSpecific.length < 5) {\n analysis.samplePaths.platformSpecific.push(file.path);\n }\n }\n }\n \n // Determine format based on analysis\n return determineFormat(analysis);\n}\n\n/**\n * Classify a single file path\n */\nfunction classifyFile(path: string): {\n type: 'universal' | 'platform-specific' | 'other';\n platform?: Platform;\n} {\n const parts = path.split('/');\n const firstPart = parts[0];\n \n // Check for platform-specific root directory\n if (firstPart in PLATFORM_ROOT_DIRS) {\n return {\n type: 'platform-specific',\n platform: PLATFORM_ROOT_DIRS[firstPart]\n };\n }\n \n // Check for platform suffix in filename BEFORE universal subdir\n // (e.g. agents/git/foo.opencode.md is platform-specific, not universal)\n const platformSuffix = extractPlatformSuffixFromPath(path);\n if (platformSuffix) {\n return {\n type: 'platform-specific',\n platform: platformSuffix\n };\n }\n \n // Check for universal subdirectory\n if (UNIVERSAL_SUBDIRS.includes(firstPart)) {\n return { type: 'universal' };\n }\n \n // Root-level files or other directories\n return { type: 'other' };\n}\n\n/**\n * Extract platform suffix from filename (e.g., \"mcp.claude.jsonc\" -> \"claude\")\n */\nfunction extractPlatformSuffixFromPath(path: string): Platform | null {\n const parts = path.split('/');\n const filename = parts[parts.length - 1];\n const nameParts = filename.split('.');\n \n // Need at least 3 parts: name.platform.ext\n if (nameParts.length >= 3) {\n const possiblePlatform = nameParts[nameParts.length - 2];\n if (isPlatformId(possiblePlatform)) {\n return possiblePlatform as Platform;\n }\n }\n \n return null;\n}\n\n/**\n * Determine overall format from analysis\n */\nfunction determineFormat(analysis: FormatAnalysis): PackageFormat {\n const { universalFiles, platformSpecificFiles, detectedPlatforms, totalFiles } = analysis;\n \n // No files analyzed\n if (totalFiles === 0) {\n return {\n type: 'universal',\n confidence: 0,\n analysis\n };\n }\n \n // Calculate ratios\n const universalRatio = universalFiles / totalFiles;\n const platformRatio = platformSpecificFiles / totalFiles;\n \n // Strong universal signal: >70% universal files\n if (universalRatio > 0.7) {\n return {\n type: 'universal',\n confidence: universalRatio,\n analysis\n };\n }\n \n // Strong platform-specific signal: >70% platform files\n if (platformRatio > 0.7) {\n // Determine dominant platform\n let dominantPlatform: Platform | undefined;\n let maxCount = 0;\n \n for (const [platform, count] of detectedPlatforms) {\n if (count > maxCount) {\n maxCount = count;\n dominantPlatform = platform;\n }\n }\n \n if (dominantPlatform) {\n return {\n type: 'platform-specific',\n platform: dominantPlatform,\n confidence: platformRatio,\n analysis\n };\n }\n }\n \n // Mixed or unclear: default to universal with low confidence\n return {\n type: 'universal',\n confidence: Math.max(universalRatio, 0.3),\n analysis\n };\n}\n\n/**\n * Check if a package format indicates platform-specific content\n */\nexport function isPlatformSpecific(format: PackageFormat): boolean {\n return format.type === 'platform-specific' && format.platform !== undefined;\n}\n\n/**\n * Check if conversion is needed for target platform\n */\nexport function needsConversion(\n format: PackageFormat,\n targetPlatform: Platform\n): boolean {\n // Universal format always uses standard flows (no conversion)\n if (format.type === 'universal') {\n return false;\n }\n \n // Platform-specific: needs conversion if target differs from source\n if (format.type === 'platform-specific' && format.platform) {\n return format.platform !== targetPlatform;\n }\n \n return false;\n}\n\n/**\n * Detect package format and create conversion context\n * \n * Convenience function that combines format detection with context creation.\n * Use this at package loading time to get both format and context together.\n */\nexport function detectPackageFormatWithContext(files: PackageFile[]): {\n format: PackageFormat;\n context: PackageConversionContext;\n} {\n const format = detectPackageFormat(files);\n const context = createContextFromFormat(format);\n \n return { format, context };\n}\n\n/**\n * Enhanced Package Format Detection (Two-Tier Strategy)\n * \n * Implements comprehensive format detection with two tiers:\n * \n * Tier 1 (Fast Path): Package-Level Markers\n * - Checks for explicit format markers from platforms.jsonc (e.g., .claude-plugin/plugin.json)\n * - Returns immediately if clear marker found\n * - Fastest path for well-structured packages\n * \n * Tier 2 (Detailed Path): Per-File Detection\n * - Falls back when no clear markers exist\n * - Analyzes each file's frontmatter against platform schemas\n * - Groups files by detected format\n * - Determines overall package format from distribution\n * \n * @param files - List of package files (with optional content/frontmatter)\n * @param targetDir - Optional target directory for local platform config\n * @returns Enhanced package format with comprehensive analysis\n */\nexport async function detectEnhancedPackageFormat(\n files: PackageFile[],\n targetDir?: string\n): Promise<EnhancedPackageFormat> {\n // Import detection modules dynamically to avoid circular deps\n const { detectPlatformMarkers, getPrimaryPlatformFromMarkers, isPurePlatformSpecific } = \n await import('./package-marker-detector.js');\n const { detectFileFormats } = await import('./file-format-detector.js');\n const { \n analyzeFormatDistribution, \n calculatePackageConfidence,\n determinePackageFormat: determineFromDistribution,\n groupFilesByPlatform\n } = await import('./format-distribution-analyzer.js');\n \n // Tier 1: Check for package-level markers (fast path)\n const markers = detectPlatformMarkers(files, targetDir);\n \n // Pure platform-specific package with single marker\n if (isPurePlatformSpecific(markers)) {\n const primaryPlatform = getPrimaryPlatformFromMarkers(markers)!;\n \n return {\n packageFormat: primaryPlatform,\n detectionMethod: 'package-marker',\n confidence: 1.0,\n // For marker fast-path, we still need format groups so conversion can run.\n // Group everything under the detected platform; individual files can be no-ops\n // if no import flow matches (e.g. plugin manifests).\n formatGroups: new Map([[primaryPlatform, files.map(f => f.path)]]),\n markers: {\n matchedPatterns: markers.matches.map(m => ({\n platformId: m.platformId,\n pattern: m.matchedPattern\n })),\n hasOpenPackageYml: markers.hasOpenPackageYml,\n hasPackageYml: markers.hasPackageYml\n },\n analysis: {\n totalFiles: files.length,\n analyzedFiles: 0, // Fast path - didn't analyze files\n skippedFiles: files.length,\n formatDistribution: new Map([[primaryPlatform, files.length]])\n }\n };\n }\n \n // Pure universal package: openpackage.yml at root, no platform markers\n // Skip per-file detection; all files are already in universal format\n if ((markers.hasOpenPackageYml || markers.hasPackageYml) && markers.matches.length === 0) {\n return {\n packageFormat: 'universal',\n detectionMethod: 'package-marker',\n confidence: 1.0,\n formatGroups: new Map([['universal', files.map(f => f.path)]]),\n markers: {\n matchedPatterns: [],\n hasOpenPackageYml: markers.hasOpenPackageYml,\n hasPackageYml: markers.hasPackageYml\n },\n analysis: {\n totalFiles: files.length,\n analyzedFiles: 0,\n skippedFiles: files.length,\n formatDistribution: new Map([['universal', files.length]])\n }\n };\n }\n \n // Tier 2: Per-file detection (detailed path)\n // Detect format for each file\n const fileFormats = detectFileFormats(files, targetDir);\n \n // Analyze distribution\n const distribution = analyzeFormatDistribution(fileFormats);\n const confidence = calculatePackageConfidence(distribution, fileFormats);\n const packageFormat = determineFromDistribution(distribution);\n const formatGroups = groupFilesByPlatform(fileFormats);\n \n // Count analyzed vs skipped files\n const analyzedFiles = fileFormats.size;\n const skippedFiles = files.length - analyzedFiles;\n \n return {\n packageFormat,\n detectionMethod: 'per-file',\n confidence,\n fileFormats,\n formatGroups,\n markers: markers.matches.length > 0 ? {\n matchedPatterns: markers.matches.map(m => ({\n platformId: m.platformId,\n pattern: m.matchedPattern\n })),\n hasOpenPackageYml: markers.hasOpenPackageYml,\n hasPackageYml: markers.hasPackageYml\n } : undefined,\n analysis: {\n totalFiles: files.length,\n analyzedFiles,\n skippedFiles,\n formatDistribution: distribution.counts\n }\n };\n}\n", "import { join } from 'path';\nimport { exists, readTextFile } from '../../utils/fs.js';\nimport { logger } from '../../utils/logger.js';\nimport { ValidationError } from '../../utils/errors.js';\nimport { CLAUDE_PLUGIN_PATHS } from '../../constants/index.js';\nimport type { MarketplacePluginEntry } from './marketplace-handler.js';\n\n/**\n * Claude Code plugin manifest schema (from plugin.json)\n */\nexport interface ClaudePluginManifest {\n name: string;\n version?: string;\n description?: string;\n author?: {\n name?: string;\n email?: string;\n url?: string;\n };\n homepage?: string;\n repository?: string | {\n type?: string;\n url?: string;\n };\n license?: string;\n keywords?: string[];\n // Component configuration\n commands?: string | string[];\n agents?: string | string[];\n hooks?: string | object;\n mcpServers?: string | object;\n lspServers?: string | object;\n}\n\n/**\n * Metadata resolution result with source information\n */\ninterface ResolvedPluginMetadata {\n /** Resolved plugin manifest */\n manifest: ClaudePluginManifest;\n /** Source of metadata */\n source: 'plugin.json' | 'marketplace' | 'merged';\n}\n\n/**\n * Resolve plugin metadata from multiple sources with priority handling.\n * \n * Resolution logic:\n * 1. Check if plugin.json exists\n * 2. If exists AND strict !== false:\n * - Use plugin.json as primary\n * - Merge marketplace entry fields (as defaults)\n * - Return with source: 'merged'\n * 3. If exists AND strict === false:\n * - Log warning (misconfiguration - strict:false but plugin.json exists)\n * - Use plugin.json anyway (safest fallback)\n * - Return with source: 'plugin.json'\n * 4. If NOT exists AND strict === false:\n * - Use marketplace entry as full definition\n * - Return with source: 'marketplace'\n * 5. If NOT exists AND strict !== false:\n * - Throw error (plugin.json required)\n * \n * @param pluginDir - Absolute path to plugin directory\n * @param marketplaceEntry - Optional marketplace entry for this plugin\n * @returns Resolved metadata and source\n * @throws ValidationError if plugin.json is required but missing or invalid\n */\nexport async function resolvePluginMetadata(\n pluginDir: string,\n marketplaceEntry?: MarketplacePluginEntry\n): Promise<ResolvedPluginMetadata> {\n const manifestPath = join(pluginDir, CLAUDE_PLUGIN_PATHS.PLUGIN_MANIFEST);\n const hasPluginJson = await exists(manifestPath);\n const isStrictFalse = marketplaceEntry?.strict === false;\n \n // Case 1 & 2: plugin.json exists\n if (hasPluginJson) {\n let pluginManifest: ClaudePluginManifest;\n \n try {\n const content = await readTextFile(manifestPath);\n pluginManifest = JSON.parse(content);\n } catch (error) {\n throw new ValidationError(\n `Failed to parse plugin manifest at ${manifestPath}: ${error}`\n );\n }\n \n // Case 2: strict:false but plugin.json exists (misconfiguration)\n if (isStrictFalse) {\n logger.warn(\n `Plugin at '${pluginDir}' has strict:false in marketplace but contains plugin.json. ` +\n `Using plugin.json as primary source. Consider removing plugin.json or setting strict:true.`\n );\n \n return {\n manifest: pluginManifest,\n source: 'plugin.json'\n };\n }\n \n // Case 1: strict is true or undefined - merge with marketplace entry\n if (marketplaceEntry) {\n const merged = mergePluginMetadata(pluginManifest, marketplaceEntry);\n \n return {\n manifest: merged,\n source: 'merged'\n };\n }\n \n // No marketplace entry, just use plugin.json\n return {\n manifest: pluginManifest,\n source: 'plugin.json'\n };\n }\n \n // Case 4: No plugin.json, strict:false - use marketplace entry\n if (isStrictFalse && marketplaceEntry) {\n const manifest = marketplaceEntryToManifest(marketplaceEntry);\n \n return {\n manifest,\n source: 'marketplace'\n };\n }\n \n // Case 5: No plugin.json and not strict:false - error\n if (marketplaceEntry) {\n throw new ValidationError(\n `Plugin '${marketplaceEntry.name}' at '${pluginDir}' is missing plugin.json. ` +\n `Either add .claude-plugin/plugin.json or set \"strict\": false in marketplace entry.`\n );\n } else {\n throw new ValidationError(\n `Plugin at '${pluginDir}' is missing plugin.json at ${CLAUDE_PLUGIN_PATHS.PLUGIN_MANIFEST}`\n );\n }\n}\n\n/**\n * Merge plugin.json with marketplace entry.\n * Plugin.json fields take priority, marketplace entry provides defaults.\n */\nfunction mergePluginMetadata(\n pluginManifest: ClaudePluginManifest,\n marketplaceEntry: MarketplacePluginEntry\n): ClaudePluginManifest {\n return {\n name: pluginManifest.name, // Always use plugin.json name\n version: pluginManifest.version ?? marketplaceEntry.version,\n description: pluginManifest.description ?? marketplaceEntry.description,\n author: pluginManifest.author ?? marketplaceEntry.author,\n homepage: pluginManifest.homepage ?? marketplaceEntry.homepage,\n repository: pluginManifest.repository ?? marketplaceEntry.repository,\n license: pluginManifest.license ?? marketplaceEntry.license,\n keywords: pluginManifest.keywords ?? marketplaceEntry.keywords,\n commands: pluginManifest.commands ?? marketplaceEntry.commands,\n agents: pluginManifest.agents ?? marketplaceEntry.agents,\n hooks: pluginManifest.hooks ?? marketplaceEntry.hooks,\n mcpServers: pluginManifest.mcpServers ?? marketplaceEntry.mcpServers,\n lspServers: pluginManifest.lspServers ?? marketplaceEntry.lspServers,\n };\n}\n\n/**\n * Convert marketplace entry to plugin manifest (for strict:false plugins)\n */\nfunction marketplaceEntryToManifest(entry: MarketplacePluginEntry): ClaudePluginManifest {\n return {\n name: entry.name,\n version: entry.version,\n description: entry.description,\n author: entry.author,\n homepage: entry.homepage,\n repository: entry.repository,\n license: entry.license,\n keywords: entry.keywords,\n commands: entry.commands,\n agents: entry.agents,\n hooks: entry.hooks,\n mcpServers: entry.mcpServers,\n lspServers: entry.lspServers,\n };\n}\n", "import { relative, basename } from 'path';\nimport { readFile } from 'fs/promises';\nimport { Package, PackageFile, PackageYml } from '../../types/index.js';\nimport { loadPackageConfig } from '../package-context.js';\nimport { extractPackageFromTarball } from '../../utils/tarball.js';\nimport { walkFiles, readTextFile } from '../../utils/fs.js';\nimport { isJunk } from 'junk';\nimport { logger } from '../../utils/logger.js';\nimport { ValidationError } from '../../utils/errors.js';\nimport { FILE_PATTERNS, PACKAGE_PATHS, CLAUDE_PLUGIN_PATHS } from '../../constants/index.js';\nimport { detectPluginType, detectPluginWithMarketplace, hasPluginContent } from './plugin-detector.js';\nimport { transformPluginToPackage } from './plugin-transformer.js';\nimport type { MarketplacePluginEntry } from './marketplace-handler.js';\nimport { generateGitHubPackageName } from '../../utils/plugin-naming.js';\nimport * as yaml from 'js-yaml';\n\nexport type PathSourceType = 'directory' | 'tarball';\n\n/**\n * Context for loading packages with naming information and marketplace metadata.\n */\nexport interface PackageLoadContext {\n gitUrl?: string;\n path?: string;\n resourcePath?: string;\n repoPath?: string;\n packageName?: string; // Optional override (avoid using - let transformer generate)\n marketplaceEntry?: MarketplacePluginEntry;\n}\n\n/**\n * Infer the source type from a path string.\n */\nexport function inferSourceType(path: string): PathSourceType {\n return path.endsWith(FILE_PATTERNS.TGZ_FILES) || path.endsWith(FILE_PATTERNS.TAR_GZ_FILES) ? 'tarball' : 'directory';\n}\n\n/**\n * Load a package from a local directory.\n * Reads all files from the directory and loads openpackage.yml.\n * \n * If the directory is a Claude Code plugin, transforms it to OpenPackage format.\n * \n * @param dirPath - Path to directory\n * @param context - Optional context for scoped naming (GitHub URL, subdirectory)\n */\nexport async function loadPackageFromDirectory(\n dirPath: string,\n context?: PackageLoadContext\n): Promise<Package> {\n // Check if this is a Claude Code plugin (with marketplace context if available)\n const pluginDetection = await detectPluginWithMarketplace(dirPath, context?.marketplaceEntry);\n \n if (pluginDetection.isPlugin && (pluginDetection.type === 'individual' || pluginDetection.type === 'marketplace-defined')) {\n logger.info(`Detected Claude Code plugin (${pluginDetection.type}), transforming to OpenPackage format`, { dirPath });\n const { package: pkg } = await transformPluginToPackage(dirPath, context);\n return pkg;\n }\n \n // If it's a marketplace, we need to handle plugin selection (done upstream in install command)\n if (pluginDetection.isPlugin && pluginDetection.type === 'marketplace') {\n throw new ValidationError(\n `Directory '${dirPath}' is a Claude Code plugin marketplace. ` +\n `Marketplace installation requires plugin selection and should be handled by the install command.`\n );\n }\n \n // Load openpackage.yml for regular packages\n let config = await loadPackageConfig(dirPath);\n if (!config) {\n // Marketplace-defined plugins (no plugin.json) may have only plugin content (commands/agents/skills).\n // Treat as loadable so install can proceed without marketplace selection.\n const hasContent = await hasPluginContent(dirPath);\n if (hasContent) {\n const syntheticEntry: MarketplacePluginEntry = {\n strict: false,\n name: context?.packageName ?? basename(dirPath),\n source: '.' // minimal spec for marketplace-defined plugin without marketplace manifest\n };\n const marketplaceDefined = await detectPluginWithMarketplace(dirPath, syntheticEntry);\n if (marketplaceDefined.isPlugin && marketplaceDefined.type === 'marketplace-defined') {\n const { package: pkg } = await transformPluginToPackage(dirPath, {\n ...context,\n marketplaceEntry: syntheticEntry\n });\n return pkg;\n }\n }\n // Resource-centric installs (Phase 3) can operate on directories without openpackage.yml,\n // as long as they match installable patterns (base detection ensures this upstream).\n if (!context?.resourcePath) {\n throw new ValidationError(\n `Directory '${dirPath}' is not a valid OpenPackage directory or Claude Code plugin. ` +\n `Missing ${FILE_PATTERNS.OPENPACKAGE_YML} or ${CLAUDE_PLUGIN_PATHS.PLUGIN_MANIFEST}`\n );\n }\n\n const fallbackBaseName = basename(dirPath);\n const fallbackName = context?.gitUrl\n ? generateGitHubPackageName({\n gitUrl: context.gitUrl,\n path: context.path,\n resourcePath: context.resourcePath,\n packageName: fallbackBaseName,\n repoPath: context.repoPath\n })\n : fallbackBaseName;\n\n config = {\n name: fallbackName,\n version: '0.0.0'\n } satisfies PackageYml;\n }\n\n // Apply GitHub scoping for packages from GitHub sources\n // This ensures consistent naming: gh@username/repo or gh@username/repo/path\n if (context?.gitUrl) {\n const originalName = config.name;\n const scopedName = generateGitHubPackageName({\n gitUrl: context.gitUrl,\n path: context.path,\n resourcePath: context.resourcePath,\n packageName: originalName, // Pass original name for non-GitHub sources\n repoPath: context.repoPath\n });\n \n // Only override if GitHub scoping was applied (name changed)\n if (scopedName !== originalName) {\n config.name = scopedName;\n }\n }\n\n // Discover all files in the directory\n const files: PackageFile[] = [];\n \n try {\n for await (const fullPath of walkFiles(dirPath)) {\n const relativePath = relative(dirPath, fullPath);\n \n // Filter out junk files\n if (isJunk(basename(relativePath))) {\n continue;\n }\n \n const content = await readTextFile(fullPath);\n \n files.push({\n path: relativePath,\n content,\n encoding: 'utf8'\n });\n }\n \n return {\n metadata: config,\n files\n };\n } catch (error) {\n logger.error(`Failed to load package from directory: ${dirPath}`, { error });\n throw new ValidationError(`Failed to load package from directory: ${error}`);\n }\n}\n\n/**\n * Load a package from a tarball file.\n * Extracts to a temporary location, reads files, then cleans up.\n */\nexport async function loadPackageFromTarball(tarballPath: string): Promise<Package> {\n // Read tarball file\n let tarballBuffer: Buffer;\n try {\n tarballBuffer = await readFile(tarballPath);\n } catch (error) {\n throw new ValidationError(`Failed to read tarball file '${tarballPath}': ${error}`);\n }\n \n // Extract tarball\n const extracted = await extractPackageFromTarball(tarballBuffer);\n \n // Find openpackage.yml in extracted files\n const packageYmlFile = extracted.files.find(\n f => f.path === PACKAGE_PATHS.MANIFEST_RELATIVE || f.path === 'openpackage.yml'\n );\n \n if (!packageYmlFile) {\n throw new ValidationError(\n `Tarball '${tarballPath}' does not contain a valid ${FILE_PATTERNS.OPENPACKAGE_YML} file`\n );\n }\n \n // Parse openpackage.yml content\n const config = yaml.load(packageYmlFile.content) as PackageYml;\n \n if (!config.name) {\n throw new ValidationError(\n `Tarball '${tarballPath}' contains invalid ${FILE_PATTERNS.OPENPACKAGE_YML}: missing name field`\n );\n }\n \n logger.debug(`Loaded package ${config.name}@${config.version} from tarball: ${tarballPath}`);\n \n return {\n metadata: config,\n files: extracted.files\n };\n}\n\n/**\n * Load a package from either a directory or tarball path.\n * Automatically detects the source type.\n * \n * @param path - Path to package\n * @param context - Optional context for scoped naming\n */\nexport async function loadPackageFromPath(\n path: string,\n context?: PackageLoadContext\n): Promise<Package> {\n const sourceType = inferSourceType(path);\n \n if (sourceType === 'tarball') {\n return await loadPackageFromTarball(path);\n } else {\n return await loadPackageFromDirectory(path, context);\n }\n}\n\n"],
5
+ "mappings": "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",
6
+ "names": ["basename", "relative", "semver", "join", "relative", "basename", "isJunk", "relative", "isJunk", "relative", "isJunk", "join", "relative", "isJunk", "basename", "basename", "semver"]
7
+ }