@eldrforge/kodrdriv 1.2.3 → 1.2.5

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.
@@ -395,13 +395,13 @@ const executeInternal = async (runConfig, packageArgument)=>{
395
395
  }
396
396
  }
397
397
  const summary = linkedDependencies.length > 0 ? `Self-linked ${currentPackageJson.name} and linked ${linkedDependencies.length} dependencies: ${linkedDependencies.join(', ')}` : `Self-linked ${currentPackageJson.name}, no dependencies were available to link`;
398
- // Step 5: Run npm install to regenerate package-lock.json
398
+ // Step 5: Regenerate package-lock.json without modifying node_modules
399
399
  try {
400
400
  if (isDryRun) {
401
- logger.info(`DRY RUN: Would run 'npm install' to regenerate package-lock.json`);
401
+ logger.info(`DRY RUN: Would run 'npm install --package-lock-only --no-audit --no-fund' to regenerate package-lock.json`);
402
402
  } else {
403
- logger.verbose(`Running 'npm install' to regenerate package-lock.json...`);
404
- await run('npm install');
403
+ logger.verbose(`Running 'npm install --package-lock-only --no-audit --no-fund' to regenerate package-lock.json without touching node_modules...`);
404
+ await run('npm install --package-lock-only --no-audit --no-fund');
405
405
  logger.info(`✅ Regenerated package-lock.json`);
406
406
  }
407
407
  } catch (error) {
@@ -479,9 +479,9 @@ const executeInternal = async (runConfig, packageArgument)=>{
479
479
  }
480
480
  }
481
481
  const summary = `Successfully linked ${linkedPackages.length} package(s): ${linkedPackages.join(', ')}`;
482
- // Final step: Run npm install in all consuming packages to regenerate package-lock.json files
482
+ // Final step: Regenerate package-lock.json files in all affected packages without modifying node_modules
483
483
  if (!isDryRun) {
484
- logger.info(`🔄 Regenerating package-lock.json files in all packages...`);
484
+ logger.info(`🔄 Regenerating package-lock.json files in all packages (lockfile-only)...`);
485
485
  // Get all unique consuming packages
486
486
  const allConsumingPackages = new Set();
487
487
  for (const pkg of packagesToLink){
@@ -490,14 +490,14 @@ const executeInternal = async (runConfig, packageArgument)=>{
490
490
  }
491
491
  // Also include the source packages
492
492
  packagesToLink.forEach((pkg)=>allConsumingPackages.add(pkg.path));
493
- // Run npm install in each package
493
+ // Run lockfile-only install in each package
494
494
  for (const packagePath of allConsumingPackages){
495
495
  try {
496
496
  const originalCwd = process.cwd();
497
497
  process.chdir(packagePath);
498
498
  try {
499
- logger.verbose(`Running 'npm install' in: ${packagePath}`);
500
- await run('npm install');
499
+ logger.verbose(`Running 'npm install --package-lock-only --no-audit --no-fund' in: ${packagePath}`);
500
+ await run('npm install --package-lock-only --no-audit --no-fund');
501
501
  logger.verbose(`✅ Regenerated package-lock.json in: ${packagePath}`);
502
502
  } finally{
503
503
  process.chdir(originalCwd);
@@ -508,7 +508,7 @@ const executeInternal = async (runConfig, packageArgument)=>{
508
508
  }
509
509
  logger.info(`✅ Regenerated package-lock.json files in ${allConsumingPackages.size} packages`);
510
510
  } else {
511
- logger.info(`DRY RUN: Would run 'npm install' to regenerate package-lock.json files in all packages`);
511
+ logger.info(`DRY RUN: Would run 'npm install --package-lock-only --no-audit --no-fund' to regenerate package-lock.json files in all packages`);
512
512
  }
513
513
  logger.info(summary);
514
514
  return summary;
@@ -1 +1 @@
1
- {"version":3,"file":"link.js","sources":["../../src/commands/link.ts"],"sourcesContent":["import { getLogger, getDryRunLogger } from '../logging';\nimport { Config } from '../types';\nimport { run, runSecure } from '../util/child';\nimport {\n findAllPackageJsonFiles\n} from '../util/performance';\nimport { create as createStorage } from '../util/storage';\nimport { safeJsonParse, validatePackageJson } from '../util/validation';\nimport fs from 'fs/promises';\nimport path from 'path';\n\n// Helper function to check if a path is a symbolic link\nconst isSymbolicLink = async (filePath: string): Promise<boolean> => {\n try {\n const stats = await fs.lstat(filePath);\n return stats.isSymbolicLink();\n } catch {\n return false;\n }\n};\n\n// Helper function to get the target of a symbolic link\nconst getSymbolicLinkTarget = async (filePath: string): Promise<string | null> => {\n try {\n const target = await fs.readlink(filePath);\n return target;\n } catch {\n return null;\n }\n};\n\n// Helper function to find all linked dependencies in a package\nconst findLinkedDependencies = async (\n packagePath: string,\n packageName: string,\n storage: any,\n logger: any\n): Promise<Array<{ dependencyName: string; targetPath: string; isExternal: boolean }>> => {\n const linkedDependencies: Array<{ dependencyName: string; targetPath: string; isExternal: boolean }> = [];\n\n try {\n const packageJsonPath = path.join(packagePath, 'package.json');\n const packageJsonContent = await storage.readFile(packageJsonPath, 'utf-8');\n const parsed = safeJsonParse(packageJsonContent, packageJsonPath);\n const packageJson = validatePackageJson(parsed, packageJsonPath);\n\n const allDependencies = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies\n };\n\n const nodeModulesPath = path.join(packagePath, 'node_modules');\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for (const [dependencyName, version] of Object.entries(allDependencies)) {\n let dependencyPath: string;\n\n if (dependencyName.startsWith('@')) {\n // Scoped package\n const [scope, name] = dependencyName.split('/');\n dependencyPath = path.join(nodeModulesPath, scope, name);\n } else {\n // Unscoped package\n dependencyPath = path.join(nodeModulesPath, dependencyName);\n }\n\n if (await isSymbolicLink(dependencyPath)) {\n const target = await getSymbolicLinkTarget(dependencyPath);\n if (target) {\n // Determine if this is an external dependency (not in the same workspace)\n const isExternal = !target.includes('node_modules') || target.startsWith('..');\n linkedDependencies.push({\n dependencyName,\n targetPath: target,\n isExternal\n });\n }\n }\n }\n } catch (error: any) {\n logger.warn(`Failed to check linked dependencies in ${packageName}: ${error.message}`);\n }\n\n return linkedDependencies;\n};\n\n// Helper function to check if a dependency matches any external link patterns\nconst matchesExternalLinkPattern = (dependencyName: string, externalLinkPatterns: string[]): boolean => {\n if (!externalLinkPatterns || externalLinkPatterns.length === 0) {\n return false;\n }\n\n return externalLinkPatterns.some(pattern => {\n // Simple string matching - could be enhanced with glob patterns later\n return dependencyName === pattern || dependencyName.startsWith(pattern);\n });\n};\n\n// Helper function to create symbolic links manually\nconst createSymbolicLink = async (\n packageName: string,\n sourcePath: string,\n targetDir: string,\n logger: any,\n isDryRun: boolean = false\n): Promise<boolean> => {\n try {\n // Parse package name to get scope and name parts\n const [scope, name] = packageName.startsWith('@')\n ? packageName.split('/')\n : [null, packageName];\n\n // Create the target path structure\n const nodeModulesPath = path.join(targetDir, 'node_modules');\n let targetPath: string;\n\n if (scope) {\n // Scoped package: node_modules/@scope/name\n const scopeDir = path.join(nodeModulesPath, scope);\n targetPath = path.join(scopeDir, name);\n\n if (!isDryRun) {\n // Ensure scope directory exists\n await fs.mkdir(scopeDir, { recursive: true });\n }\n } else {\n // Unscoped package: node_modules/name\n targetPath = path.join(nodeModulesPath, name);\n\n if (!isDryRun) {\n // Ensure node_modules directory exists\n await fs.mkdir(nodeModulesPath, { recursive: true });\n }\n }\n\n if (isDryRun) {\n logger.verbose(`DRY RUN: Would create symlink: ${targetPath} -> ${sourcePath}`);\n return true;\n }\n\n // Create the symbolic link using relative path for better portability\n const relativePath = path.relative(path.dirname(targetPath), sourcePath);\n\n // Check if something already exists at the target path\n try {\n const stats = await fs.lstat(targetPath); // Use lstat to not follow symlinks\n\n if (stats.isSymbolicLink()) {\n // It's a symlink, check if it points to the correct target\n const existingLink = await fs.readlink(targetPath);\n if (existingLink === relativePath) {\n logger.verbose(`Symlink already exists and points to correct target: ${targetPath} -> ${relativePath}`);\n return true;\n } else {\n logger.info(`🔧 Fixing symlink: ${targetPath} (was pointing to ${existingLink}, now pointing to ${relativePath})`);\n await fs.unlink(targetPath);\n await fs.symlink(relativePath, targetPath, 'dir');\n logger.info(`✅ Fixed symlink: ${targetPath} -> ${relativePath}`);\n return true;\n }\n } else if (stats.isDirectory()) {\n // It's a directory, remove it\n logger.warn(`⚠️ Removing existing directory to create symlink: ${targetPath}`);\n await fs.rm(targetPath, { recursive: true, force: true });\n await fs.symlink(relativePath, targetPath, 'dir');\n logger.info(`✅ Created symlink: ${targetPath} -> ${relativePath}`);\n return true;\n } else {\n // It's a file, remove it\n logger.warn(`⚠️ Removing existing file to create symlink: ${targetPath}`);\n await fs.unlink(targetPath);\n await fs.symlink(relativePath, targetPath, 'dir');\n logger.info(`✅ Created symlink: ${targetPath} -> ${relativePath}`);\n return true;\n }\n } catch (error: any) {\n if (error.code === 'ENOENT') {\n // Nothing exists at target path, create the symlink\n await fs.symlink(relativePath, targetPath, 'dir');\n logger.verbose(`Created symlink: ${targetPath} -> ${relativePath}`);\n return true;\n } else {\n throw error; // Re-throw unexpected errors\n }\n }\n } catch (error: any) {\n logger.warn(`Failed to create symlink for ${packageName}: ${error.message}`);\n return false;\n }\n};\n\n// Helper function to parse package names and scopes\nconst parsePackageArgument = (packageArg: string): { scope: string; packageName?: string } => {\n if (packageArg.startsWith('@')) {\n const parts = packageArg.split('/');\n if (parts.length === 1) {\n // Just a scope like \"@fjell\"\n return { scope: parts[0] };\n } else {\n // Full package name like \"@fjell/core\"\n return { scope: parts[0], packageName: packageArg };\n }\n } else {\n throw new Error(`Package argument must start with @ (scope): ${packageArg}`);\n }\n};\n\n// Find packages in the workspace that match the given scope or package name\nconst findMatchingPackages = async (\n targetDirectories: string[],\n scope: string,\n storage: any,\n logger: any,\n packageName?: string\n): Promise<Array<{ name: string; path: string; isSource: boolean }>> => {\n const matchingPackages: Array<{ name: string; path: string; isSource: boolean }> = [];\n\n // Find all package.json files in target directories\n let allPackageJsonFiles: any[] = [];\n for (const targetDirectory of targetDirectories) {\n const packageJsonFiles = await findAllPackageJsonFiles(targetDirectory, storage);\n allPackageJsonFiles = allPackageJsonFiles.concat(packageJsonFiles);\n }\n\n for (const packageJsonLocation of allPackageJsonFiles) {\n const packageDir = packageJsonLocation.path.replace('/package.json', '');\n\n try {\n const packageJsonContent = await storage.readFile(packageJsonLocation.path, 'utf-8');\n const parsed = safeJsonParse(packageJsonContent, packageJsonLocation.path);\n const packageJson = validatePackageJson(parsed, packageJsonLocation.path);\n\n if (!packageJson.name) continue;\n\n const isInScope = packageJson.name.startsWith(scope + '/');\n const isExactMatch = packageName && packageJson.name === packageName;\n\n if (isInScope || isExactMatch) {\n matchingPackages.push({\n name: packageJson.name,\n path: packageDir,\n isSource: packageName ? packageJson.name === packageName : isInScope\n });\n }\n } catch (error: any) {\n logger.warn(`Failed to parse ${packageJsonLocation.path}: ${error.message}`);\n }\n }\n\n return matchingPackages;\n};\n\n// Find packages that depend on the target package\nconst findConsumingPackages = async (\n targetDirectories: string[],\n targetPackageName: string,\n storage: any,\n logger: any\n): Promise<Array<{ name: string; path: string }>> => {\n const consumingPackages: Array<{ name: string; path: string }> = [];\n\n // Find all package.json files in target directories\n let allPackageJsonFiles: any[] = [];\n for (const targetDirectory of targetDirectories) {\n const packageJsonFiles = await findAllPackageJsonFiles(targetDirectory, storage);\n allPackageJsonFiles = allPackageJsonFiles.concat(packageJsonFiles);\n }\n\n for (const packageJsonLocation of allPackageJsonFiles) {\n const packageDir = packageJsonLocation.path.replace('/package.json', '');\n\n try {\n const packageJsonContent = await storage.readFile(packageJsonLocation.path, 'utf-8');\n const parsed = safeJsonParse(packageJsonContent, packageJsonLocation.path);\n const packageJson = validatePackageJson(parsed, packageJsonLocation.path);\n\n if (!packageJson.name) continue;\n\n // Check if this package depends on the target package\n const dependencyTypes = ['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies'];\n const hasDependency = dependencyTypes.some(depType =>\n packageJson[depType] && packageJson[depType][targetPackageName]\n );\n\n if (hasDependency && packageJson.name !== targetPackageName) {\n consumingPackages.push({\n name: packageJson.name,\n path: packageDir\n });\n }\n } catch (error: any) {\n logger.warn(`Failed to parse ${packageJsonLocation.path}: ${error.message}`);\n }\n }\n\n return consumingPackages;\n};\n\nconst executeInternal = async (runConfig: Config, packageArgument?: string): Promise<string> => {\n const isDryRun = runConfig.dryRun || runConfig.link?.dryRun || false;\n const logger = getDryRunLogger(isDryRun);\n const storage = createStorage({ log: logger.info });\n\n // Check if this is a status command\n if (packageArgument === 'status') {\n return await executeStatus(runConfig);\n }\n\n // Get target directories from config, default to current directory\n const targetDirectories = runConfig.tree?.directories || [process.cwd()];\n\n if (targetDirectories.length === 1) {\n logger.info(`Analyzing workspace at: ${targetDirectories[0]}`);\n } else {\n logger.info(`Analyzing workspaces at: ${targetDirectories.join(', ')}`);\n }\n\n // If no package argument provided, use new smart same-scope linking behavior\n if (!packageArgument) {\n logger.info('🔗 Smart linking current project...');\n\n // Work in current directory only - read the package.json\n const currentDir = process.cwd();\n const packageJsonPath = `${currentDir}/package.json`;\n\n let currentPackageJson;\n try {\n const packageJsonContent = await storage.readFile(packageJsonPath, 'utf-8');\n const parsed = safeJsonParse(packageJsonContent, packageJsonPath);\n currentPackageJson = validatePackageJson(parsed, packageJsonPath);\n } catch (error: any) {\n const message = `No valid package.json found in current directory: ${error.message}`;\n logger.error(message);\n return message;\n }\n\n if (!currentPackageJson.name) {\n const message = 'package.json must have a name field';\n logger.error(message);\n return message;\n }\n\n // Extract the scope from the current package name\n const currentScope = currentPackageJson.name.startsWith('@')\n ? currentPackageJson.name.split('/')[0]\n : null;\n\n if (!currentScope) {\n const message = 'Current package must have a scoped name (e.g., @scope/package) for smart linking';\n logger.warn(message);\n return message;\n }\n\n logger.info(`Current package: ${currentPackageJson.name} (scope: ${currentScope})`);\n\n // Step 1: Link the current package globally\n try {\n if (isDryRun) {\n logger.info(`DRY RUN: Would run 'npm link' in current directory`);\n } else {\n logger.verbose(`Running 'npm link' to register ${currentPackageJson.name} globally...`);\n await run('npm link');\n logger.info(`✅ Self-linked: ${currentPackageJson.name}`);\n }\n } catch (error: any) {\n logger.error(`❌ Failed to self-link ${currentPackageJson.name}: ${error.message}`);\n throw new Error(`Failed to self-link ${currentPackageJson.name}: ${error.message}`);\n }\n\n // Step 2: Find same-scope dependencies in current package\n const allDependencies = {\n ...currentPackageJson.dependencies,\n ...currentPackageJson.devDependencies\n };\n\n const sameScopeDependencies = Object.keys(allDependencies).filter(depName =>\n depName.startsWith(currentScope + '/')\n );\n\n // Step 2.5: Find external dependencies that match external link patterns\n const externalLinkPatterns = runConfig.link?.externals || [];\n const externalDependencies = Object.keys(allDependencies).filter(depName =>\n matchesExternalLinkPattern(depName, externalLinkPatterns)\n );\n\n const allDependenciesToLink = [...sameScopeDependencies, ...externalDependencies];\n\n if (allDependenciesToLink.length === 0) {\n logger.info(`No same-scope or external dependencies found for ${currentScope}`);\n if (isDryRun) {\n return `DRY RUN: Would self-link, no dependencies found to link`;\n } else {\n return `Self-linked ${currentPackageJson.name}, no dependencies to link`;\n }\n }\n\n logger.info(`Found ${sameScopeDependencies.length} same-scope dependencies: ${sameScopeDependencies.join(', ')}`);\n if (externalDependencies.length > 0) {\n logger.info(`Found ${externalDependencies.length} external dependencies matching patterns: ${externalDependencies.join(', ')}`);\n }\n\n // Step 3: Get globally linked packages directories (only if we have dependencies to link)\n let globallyLinkedPackages: { [key: string]: string } = {};\n try {\n if (isDryRun) {\n logger.info(`DRY RUN: Would run 'npm ls --link -g -p' to discover linked package directories`);\n logger.info(`DRY RUN: Would attempt to link dependencies: ${allDependenciesToLink.join(', ')}`);\n return `DRY RUN: Would self-link and attempt to link ${allDependenciesToLink.length} dependencies`;\n } else {\n logger.verbose(`Discovering globally linked package directories...`);\n const result = await run('npm ls --link -g -p');\n const resultStr = typeof result === 'string' ? result : result.stdout;\n\n // Parse the directory paths - each line is a directory path\n const directoryPaths = resultStr.trim().split('\\n').filter(line => line.trim() !== '');\n\n // Extract package names from directory paths and build a map\n for (const dirPath of directoryPaths) {\n try {\n // Read the package.json to get the actual package name\n const packageJsonPath = `${dirPath.trim()}/package.json`;\n const packageJsonContent = await storage.readFile(packageJsonPath, 'utf-8');\n const parsed = safeJsonParse(packageJsonContent, packageJsonPath);\n const packageJson = validatePackageJson(parsed, packageJsonPath);\n\n if (packageJson.name) {\n globallyLinkedPackages[packageJson.name] = dirPath.trim();\n }\n } catch (packageError: any) {\n logger.verbose(`Could not read package.json from ${dirPath}: ${packageError.message}`);\n }\n }\n\n const linkedCount = Object.keys(globallyLinkedPackages).length;\n logger.verbose(`Found ${linkedCount} globally linked package(s)`);\n }\n } catch (error: any) {\n logger.warn(`Failed to get globally linked packages (continuing anyway): ${error.message}`);\n globallyLinkedPackages = {};\n }\n\n // Step 4: Link same-scope dependencies that are available globally using manual symlinks\n const linkedDependencies: string[] = [];\n\n for (const depName of allDependenciesToLink) {\n const sourcePath = globallyLinkedPackages[depName];\n if (sourcePath) {\n try {\n logger.verbose(`Linking dependency: ${depName} from ${sourcePath}`);\n\n // Create the symbolic link manually using the directory path directly\n const success = await createSymbolicLink(depName, sourcePath, currentDir, logger, isDryRun);\n\n if (success) {\n logger.info(`✅ Linked dependency: ${depName}`);\n linkedDependencies.push(depName);\n } else {\n logger.warn(`⚠️ Failed to link ${depName}`);\n }\n } catch (error: any) {\n logger.warn(`⚠️ Failed to link ${depName}: ${error.message}`);\n }\n } else {\n logger.verbose(`Skipping ${depName} (not globally linked)`);\n }\n }\n\n const summary = linkedDependencies.length > 0\n ? `Self-linked ${currentPackageJson.name} and linked ${linkedDependencies.length} dependencies: ${linkedDependencies.join(', ')}`\n : `Self-linked ${currentPackageJson.name}, no dependencies were available to link`;\n\n // Step 5: Run npm install to regenerate package-lock.json\n try {\n if (isDryRun) {\n logger.info(`DRY RUN: Would run 'npm install' to regenerate package-lock.json`);\n } else {\n logger.verbose(`Running 'npm install' to regenerate package-lock.json...`);\n await run('npm install');\n logger.info(`✅ Regenerated package-lock.json`);\n }\n } catch (error: any) {\n logger.warn(`⚠️ Failed to regenerate package-lock.json: ${error.message}`);\n }\n\n logger.info(summary);\n return summary;\n }\n\n // New scope-based linking behavior\n logger.info(`🔗 Linking scope/package: ${packageArgument}`);\n\n const { scope, packageName } = parsePackageArgument(packageArgument);\n logger.verbose(`Parsed scope: ${scope}, package: ${packageName || 'all packages in scope'}`);\n\n // Find matching packages in the workspace\n const matchingPackages = await findMatchingPackages(targetDirectories, scope, storage, logger, packageName);\n\n if (matchingPackages.length === 0) {\n const message = packageName\n ? `No package found matching: ${packageName}`\n : `No packages found in scope: ${scope}`;\n logger.warn(message);\n return message;\n }\n\n logger.info(`Found ${matchingPackages.length} matching package(s)`);\n\n const linkedPackages: string[] = [];\n\n // If specific package name provided, use that; otherwise link all packages in scope\n const packagesToLink = packageName\n ? matchingPackages.filter(pkg => pkg.name === packageName)\n : matchingPackages;\n\n for (const pkg of packagesToLink) {\n logger.info(`Processing package: ${pkg.name}`);\n\n // Step A: Run 'npm link' in the source package directory\n try {\n const originalCwd = process.cwd();\n process.chdir(pkg.path);\n\n try {\n if (isDryRun) {\n logger.info(`DRY RUN: Would run 'npm link' in: ${pkg.path}`);\n } else {\n logger.verbose(`Running 'npm link' in source: ${pkg.path}`);\n await run('npm link');\n logger.info(`✅ Source linked: ${pkg.name}`);\n }\n } finally {\n process.chdir(originalCwd);\n }\n\n // Step B: Find all packages that depend on this package and link them\n const consumingPackages = await findConsumingPackages(targetDirectories, pkg.name, storage, logger);\n\n if (consumingPackages.length === 0) {\n logger.info(`No consuming packages found for: ${pkg.name}`);\n } else {\n logger.info(`Found ${consumingPackages.length} consuming package(s) for: ${pkg.name}`);\n\n for (const consumer of consumingPackages) {\n try {\n const consumerOriginalCwd = process.cwd();\n process.chdir(consumer.path);\n\n try {\n if (isDryRun) {\n logger.info(`DRY RUN: Would run 'npm link ${pkg.name}' in: ${consumer.path}`);\n } else {\n logger.verbose(`Running 'npm link ${pkg.name}' in consumer: ${consumer.path}`);\n await runSecure('npm', ['link', pkg.name]);\n logger.info(`✅ Consumer linked: ${consumer.name} -> ${pkg.name}`);\n }\n } finally {\n process.chdir(consumerOriginalCwd);\n }\n } catch (error: any) {\n logger.error(`❌ Failed to link ${pkg.name} in ${consumer.name}: ${error.message}`);\n throw new Error(`Failed to link ${pkg.name} in consumer ${consumer.name}: ${error.message}`);\n }\n }\n }\n\n linkedPackages.push(pkg.name);\n } catch (error: any) {\n logger.error(`❌ Failed to link source package ${pkg.name}: ${error.message}`);\n throw new Error(`Failed to link source package ${pkg.name}: ${error.message}`);\n }\n }\n\n const summary = `Successfully linked ${linkedPackages.length} package(s): ${linkedPackages.join(', ')}`;\n\n // Final step: Run npm install in all consuming packages to regenerate package-lock.json files\n if (!isDryRun) {\n logger.info(`🔄 Regenerating package-lock.json files in all packages...`);\n\n // Get all unique consuming packages\n const allConsumingPackages = new Set<string>();\n for (const pkg of packagesToLink) {\n const consumingPackages = await findConsumingPackages(targetDirectories, pkg.name, storage, logger);\n consumingPackages.forEach(consumer => allConsumingPackages.add(consumer.path));\n }\n\n // Also include the source packages\n packagesToLink.forEach(pkg => allConsumingPackages.add(pkg.path));\n\n // Run npm install in each package\n for (const packagePath of allConsumingPackages) {\n try {\n const originalCwd = process.cwd();\n process.chdir(packagePath);\n\n try {\n logger.verbose(`Running 'npm install' in: ${packagePath}`);\n await run('npm install');\n logger.verbose(`✅ Regenerated package-lock.json in: ${packagePath}`);\n } finally {\n process.chdir(originalCwd);\n }\n } catch (error: any) {\n logger.warn(`⚠️ Failed to regenerate package-lock.json in ${packagePath}: ${error.message}`);\n }\n }\n\n logger.info(`✅ Regenerated package-lock.json files in ${allConsumingPackages.size} packages`);\n } else {\n logger.info(`DRY RUN: Would run 'npm install' to regenerate package-lock.json files in all packages`);\n }\n\n logger.info(summary);\n return summary;\n};\n\n// Status function to show what's currently linked\nconst executeStatus = async (runConfig: Config): Promise<string> => {\n const logger = getLogger();\n const storage = createStorage({ log: logger.info });\n\n // Get target directories from config, default to current directory\n const targetDirectories = runConfig.tree?.directories || [process.cwd()];\n\n if (targetDirectories.length === 1) {\n logger.info(`🔍 Checking link status in: ${targetDirectories[0]}`);\n } else {\n logger.info(`🔍 Checking link status in: ${targetDirectories.join(', ')}`);\n }\n\n // Find all packages in the workspace\n let allPackageJsonFiles: any[] = [];\n for (const targetDirectory of targetDirectories) {\n const packageJsonFiles = await findAllPackageJsonFiles(targetDirectory, storage);\n allPackageJsonFiles = allPackageJsonFiles.concat(packageJsonFiles);\n }\n\n const packageStatuses: Array<{\n name: string;\n path: string;\n linkedDependencies: Array<{ dependencyName: string; targetPath: string; isExternal: boolean }>;\n }> = [];\n\n for (const packageJsonLocation of allPackageJsonFiles) {\n const packageDir = packageJsonLocation.path.replace('/package.json', '');\n\n try {\n const packageJsonContent = await storage.readFile(packageJsonLocation.path, 'utf-8');\n const parsed = safeJsonParse(packageJsonContent, packageJsonLocation.path);\n const packageJson = validatePackageJson(parsed, packageJsonLocation.path);\n\n if (!packageJson.name) continue;\n\n const linkedDependencies = await findLinkedDependencies(packageDir, packageJson.name, storage, logger);\n\n if (linkedDependencies.length > 0) {\n packageStatuses.push({\n name: packageJson.name,\n path: packageDir,\n linkedDependencies\n });\n }\n } catch (error: any) {\n logger.warn(`Failed to parse ${packageJsonLocation.path}: ${error.message}`);\n }\n }\n\n if (packageStatuses.length === 0) {\n return 'No linked dependencies found in workspace.';\n }\n\n // Format the output\n let output = `Found ${packageStatuses.length} package(s) with linked dependencies:\\n\\n`;\n\n for (const packageStatus of packageStatuses) {\n output += `📦 ${packageStatus.name}\\n`;\n output += ` Path: ${packageStatus.path}\\n`;\n\n if (packageStatus.linkedDependencies.length > 0) {\n output += ` Linked dependencies:\\n`;\n for (const dep of packageStatus.linkedDependencies) {\n const type = dep.isExternal ? '🔗 External' : '🔗 Internal';\n output += ` ${type} ${dep.dependencyName} -> ${dep.targetPath}\\n`;\n }\n }\n output += '\\n';\n }\n\n return output;\n};\n\nexport const execute = async (runConfig: Config, packageArgument?: string): Promise<string> => {\n try {\n // Use packageArgument from runConfig if not provided as parameter\n const finalPackageArgument = packageArgument || runConfig.link?.packageArgument;\n return await executeInternal(runConfig, finalPackageArgument);\n } catch (error: any) {\n const logger = getLogger();\n logger.error(`link failed: ${error.message}`);\n throw error;\n }\n};\n\n"],"names":["isSymbolicLink","filePath","stats","fs","lstat","getSymbolicLinkTarget","target","readlink","findLinkedDependencies","packagePath","packageName","storage","logger","linkedDependencies","packageJsonPath","path","join","packageJsonContent","readFile","parsed","safeJsonParse","packageJson","validatePackageJson","allDependencies","dependencies","devDependencies","nodeModulesPath","dependencyName","version","Object","entries","dependencyPath","startsWith","scope","name","split","isExternal","includes","push","targetPath","error","warn","message","matchesExternalLinkPattern","externalLinkPatterns","length","some","pattern","createSymbolicLink","sourcePath","targetDir","isDryRun","scopeDir","mkdir","recursive","verbose","relativePath","relative","dirname","existingLink","info","unlink","symlink","isDirectory","rm","force","code","parsePackageArgument","packageArg","parts","Error","findMatchingPackages","targetDirectories","matchingPackages","allPackageJsonFiles","targetDirectory","packageJsonFiles","findAllPackageJsonFiles","concat","packageJsonLocation","packageDir","replace","isInScope","isExactMatch","isSource","findConsumingPackages","targetPackageName","consumingPackages","dependencyTypes","hasDependency","depType","executeInternal","runConfig","packageArgument","dryRun","link","getDryRunLogger","createStorage","log","executeStatus","tree","directories","process","cwd","currentDir","currentPackageJson","currentScope","run","sameScopeDependencies","keys","filter","depName","externals","externalDependencies","allDependenciesToLink","globallyLinkedPackages","result","resultStr","stdout","directoryPaths","trim","line","dirPath","packageError","linkedCount","success","summary","linkedPackages","packagesToLink","pkg","originalCwd","chdir","consumer","consumerOriginalCwd","runSecure","allConsumingPackages","Set","forEach","add","size","getLogger","packageStatuses","output","packageStatus","dep","type","execute","finalPackageArgument"],"mappings":"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"}
1
+ {"version":3,"file":"link.js","sources":["../../src/commands/link.ts"],"sourcesContent":["import { getLogger, getDryRunLogger } from '../logging';\nimport { Config } from '../types';\nimport { run, runSecure } from '../util/child';\nimport {\n findAllPackageJsonFiles\n} from '../util/performance';\nimport { create as createStorage } from '../util/storage';\nimport { safeJsonParse, validatePackageJson } from '../util/validation';\nimport fs from 'fs/promises';\nimport path from 'path';\n\n// Helper function to check if a path is a symbolic link\nconst isSymbolicLink = async (filePath: string): Promise<boolean> => {\n try {\n const stats = await fs.lstat(filePath);\n return stats.isSymbolicLink();\n } catch {\n return false;\n }\n};\n\n// Helper function to get the target of a symbolic link\nconst getSymbolicLinkTarget = async (filePath: string): Promise<string | null> => {\n try {\n const target = await fs.readlink(filePath);\n return target;\n } catch {\n return null;\n }\n};\n\n// Helper function to find all linked dependencies in a package\nconst findLinkedDependencies = async (\n packagePath: string,\n packageName: string,\n storage: any,\n logger: any\n): Promise<Array<{ dependencyName: string; targetPath: string; isExternal: boolean }>> => {\n const linkedDependencies: Array<{ dependencyName: string; targetPath: string; isExternal: boolean }> = [];\n\n try {\n const packageJsonPath = path.join(packagePath, 'package.json');\n const packageJsonContent = await storage.readFile(packageJsonPath, 'utf-8');\n const parsed = safeJsonParse(packageJsonContent, packageJsonPath);\n const packageJson = validatePackageJson(parsed, packageJsonPath);\n\n const allDependencies = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies\n };\n\n const nodeModulesPath = path.join(packagePath, 'node_modules');\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for (const [dependencyName, version] of Object.entries(allDependencies)) {\n let dependencyPath: string;\n\n if (dependencyName.startsWith('@')) {\n // Scoped package\n const [scope, name] = dependencyName.split('/');\n dependencyPath = path.join(nodeModulesPath, scope, name);\n } else {\n // Unscoped package\n dependencyPath = path.join(nodeModulesPath, dependencyName);\n }\n\n if (await isSymbolicLink(dependencyPath)) {\n const target = await getSymbolicLinkTarget(dependencyPath);\n if (target) {\n // Determine if this is an external dependency (not in the same workspace)\n const isExternal = !target.includes('node_modules') || target.startsWith('..');\n linkedDependencies.push({\n dependencyName,\n targetPath: target,\n isExternal\n });\n }\n }\n }\n } catch (error: any) {\n logger.warn(`Failed to check linked dependencies in ${packageName}: ${error.message}`);\n }\n\n return linkedDependencies;\n};\n\n// Helper function to check if a dependency matches any external link patterns\nconst matchesExternalLinkPattern = (dependencyName: string, externalLinkPatterns: string[]): boolean => {\n if (!externalLinkPatterns || externalLinkPatterns.length === 0) {\n return false;\n }\n\n return externalLinkPatterns.some(pattern => {\n // Simple string matching - could be enhanced with glob patterns later\n return dependencyName === pattern || dependencyName.startsWith(pattern);\n });\n};\n\n// Helper function to create symbolic links manually\nconst createSymbolicLink = async (\n packageName: string,\n sourcePath: string,\n targetDir: string,\n logger: any,\n isDryRun: boolean = false\n): Promise<boolean> => {\n try {\n // Parse package name to get scope and name parts\n const [scope, name] = packageName.startsWith('@')\n ? packageName.split('/')\n : [null, packageName];\n\n // Create the target path structure\n const nodeModulesPath = path.join(targetDir, 'node_modules');\n let targetPath: string;\n\n if (scope) {\n // Scoped package: node_modules/@scope/name\n const scopeDir = path.join(nodeModulesPath, scope);\n targetPath = path.join(scopeDir, name);\n\n if (!isDryRun) {\n // Ensure scope directory exists\n await fs.mkdir(scopeDir, { recursive: true });\n }\n } else {\n // Unscoped package: node_modules/name\n targetPath = path.join(nodeModulesPath, name);\n\n if (!isDryRun) {\n // Ensure node_modules directory exists\n await fs.mkdir(nodeModulesPath, { recursive: true });\n }\n }\n\n if (isDryRun) {\n logger.verbose(`DRY RUN: Would create symlink: ${targetPath} -> ${sourcePath}`);\n return true;\n }\n\n // Create the symbolic link using relative path for better portability\n const relativePath = path.relative(path.dirname(targetPath), sourcePath);\n\n // Check if something already exists at the target path\n try {\n const stats = await fs.lstat(targetPath); // Use lstat to not follow symlinks\n\n if (stats.isSymbolicLink()) {\n // It's a symlink, check if it points to the correct target\n const existingLink = await fs.readlink(targetPath);\n if (existingLink === relativePath) {\n logger.verbose(`Symlink already exists and points to correct target: ${targetPath} -> ${relativePath}`);\n return true;\n } else {\n logger.info(`🔧 Fixing symlink: ${targetPath} (was pointing to ${existingLink}, now pointing to ${relativePath})`);\n await fs.unlink(targetPath);\n await fs.symlink(relativePath, targetPath, 'dir');\n logger.info(`✅ Fixed symlink: ${targetPath} -> ${relativePath}`);\n return true;\n }\n } else if (stats.isDirectory()) {\n // It's a directory, remove it\n logger.warn(`⚠️ Removing existing directory to create symlink: ${targetPath}`);\n await fs.rm(targetPath, { recursive: true, force: true });\n await fs.symlink(relativePath, targetPath, 'dir');\n logger.info(`✅ Created symlink: ${targetPath} -> ${relativePath}`);\n return true;\n } else {\n // It's a file, remove it\n logger.warn(`⚠️ Removing existing file to create symlink: ${targetPath}`);\n await fs.unlink(targetPath);\n await fs.symlink(relativePath, targetPath, 'dir');\n logger.info(`✅ Created symlink: ${targetPath} -> ${relativePath}`);\n return true;\n }\n } catch (error: any) {\n if (error.code === 'ENOENT') {\n // Nothing exists at target path, create the symlink\n await fs.symlink(relativePath, targetPath, 'dir');\n logger.verbose(`Created symlink: ${targetPath} -> ${relativePath}`);\n return true;\n } else {\n throw error; // Re-throw unexpected errors\n }\n }\n } catch (error: any) {\n logger.warn(`Failed to create symlink for ${packageName}: ${error.message}`);\n return false;\n }\n};\n\n// Helper function to parse package names and scopes\nconst parsePackageArgument = (packageArg: string): { scope: string; packageName?: string } => {\n if (packageArg.startsWith('@')) {\n const parts = packageArg.split('/');\n if (parts.length === 1) {\n // Just a scope like \"@fjell\"\n return { scope: parts[0] };\n } else {\n // Full package name like \"@fjell/core\"\n return { scope: parts[0], packageName: packageArg };\n }\n } else {\n throw new Error(`Package argument must start with @ (scope): ${packageArg}`);\n }\n};\n\n// Find packages in the workspace that match the given scope or package name\nconst findMatchingPackages = async (\n targetDirectories: string[],\n scope: string,\n storage: any,\n logger: any,\n packageName?: string\n): Promise<Array<{ name: string; path: string; isSource: boolean }>> => {\n const matchingPackages: Array<{ name: string; path: string; isSource: boolean }> = [];\n\n // Find all package.json files in target directories\n let allPackageJsonFiles: any[] = [];\n for (const targetDirectory of targetDirectories) {\n const packageJsonFiles = await findAllPackageJsonFiles(targetDirectory, storage);\n allPackageJsonFiles = allPackageJsonFiles.concat(packageJsonFiles);\n }\n\n for (const packageJsonLocation of allPackageJsonFiles) {\n const packageDir = packageJsonLocation.path.replace('/package.json', '');\n\n try {\n const packageJsonContent = await storage.readFile(packageJsonLocation.path, 'utf-8');\n const parsed = safeJsonParse(packageJsonContent, packageJsonLocation.path);\n const packageJson = validatePackageJson(parsed, packageJsonLocation.path);\n\n if (!packageJson.name) continue;\n\n const isInScope = packageJson.name.startsWith(scope + '/');\n const isExactMatch = packageName && packageJson.name === packageName;\n\n if (isInScope || isExactMatch) {\n matchingPackages.push({\n name: packageJson.name,\n path: packageDir,\n isSource: packageName ? packageJson.name === packageName : isInScope\n });\n }\n } catch (error: any) {\n logger.warn(`Failed to parse ${packageJsonLocation.path}: ${error.message}`);\n }\n }\n\n return matchingPackages;\n};\n\n// Find packages that depend on the target package\nconst findConsumingPackages = async (\n targetDirectories: string[],\n targetPackageName: string,\n storage: any,\n logger: any\n): Promise<Array<{ name: string; path: string }>> => {\n const consumingPackages: Array<{ name: string; path: string }> = [];\n\n // Find all package.json files in target directories\n let allPackageJsonFiles: any[] = [];\n for (const targetDirectory of targetDirectories) {\n const packageJsonFiles = await findAllPackageJsonFiles(targetDirectory, storage);\n allPackageJsonFiles = allPackageJsonFiles.concat(packageJsonFiles);\n }\n\n for (const packageJsonLocation of allPackageJsonFiles) {\n const packageDir = packageJsonLocation.path.replace('/package.json', '');\n\n try {\n const packageJsonContent = await storage.readFile(packageJsonLocation.path, 'utf-8');\n const parsed = safeJsonParse(packageJsonContent, packageJsonLocation.path);\n const packageJson = validatePackageJson(parsed, packageJsonLocation.path);\n\n if (!packageJson.name) continue;\n\n // Check if this package depends on the target package\n const dependencyTypes = ['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies'];\n const hasDependency = dependencyTypes.some(depType =>\n packageJson[depType] && packageJson[depType][targetPackageName]\n );\n\n if (hasDependency && packageJson.name !== targetPackageName) {\n consumingPackages.push({\n name: packageJson.name,\n path: packageDir\n });\n }\n } catch (error: any) {\n logger.warn(`Failed to parse ${packageJsonLocation.path}: ${error.message}`);\n }\n }\n\n return consumingPackages;\n};\n\nconst executeInternal = async (runConfig: Config, packageArgument?: string): Promise<string> => {\n const isDryRun = runConfig.dryRun || runConfig.link?.dryRun || false;\n const logger = getDryRunLogger(isDryRun);\n const storage = createStorage({ log: logger.info });\n\n // Check if this is a status command\n if (packageArgument === 'status') {\n return await executeStatus(runConfig);\n }\n\n // Get target directories from config, default to current directory\n const targetDirectories = runConfig.tree?.directories || [process.cwd()];\n\n if (targetDirectories.length === 1) {\n logger.info(`Analyzing workspace at: ${targetDirectories[0]}`);\n } else {\n logger.info(`Analyzing workspaces at: ${targetDirectories.join(', ')}`);\n }\n\n // If no package argument provided, use new smart same-scope linking behavior\n if (!packageArgument) {\n logger.info('🔗 Smart linking current project...');\n\n // Work in current directory only - read the package.json\n const currentDir = process.cwd();\n const packageJsonPath = `${currentDir}/package.json`;\n\n let currentPackageJson;\n try {\n const packageJsonContent = await storage.readFile(packageJsonPath, 'utf-8');\n const parsed = safeJsonParse(packageJsonContent, packageJsonPath);\n currentPackageJson = validatePackageJson(parsed, packageJsonPath);\n } catch (error: any) {\n const message = `No valid package.json found in current directory: ${error.message}`;\n logger.error(message);\n return message;\n }\n\n if (!currentPackageJson.name) {\n const message = 'package.json must have a name field';\n logger.error(message);\n return message;\n }\n\n // Extract the scope from the current package name\n const currentScope = currentPackageJson.name.startsWith('@')\n ? currentPackageJson.name.split('/')[0]\n : null;\n\n if (!currentScope) {\n const message = 'Current package must have a scoped name (e.g., @scope/package) for smart linking';\n logger.warn(message);\n return message;\n }\n\n logger.info(`Current package: ${currentPackageJson.name} (scope: ${currentScope})`);\n\n // Step 1: Link the current package globally\n try {\n if (isDryRun) {\n logger.info(`DRY RUN: Would run 'npm link' in current directory`);\n } else {\n logger.verbose(`Running 'npm link' to register ${currentPackageJson.name} globally...`);\n await run('npm link');\n logger.info(`✅ Self-linked: ${currentPackageJson.name}`);\n }\n } catch (error: any) {\n logger.error(`❌ Failed to self-link ${currentPackageJson.name}: ${error.message}`);\n throw new Error(`Failed to self-link ${currentPackageJson.name}: ${error.message}`);\n }\n\n // Step 2: Find same-scope dependencies in current package\n const allDependencies = {\n ...currentPackageJson.dependencies,\n ...currentPackageJson.devDependencies\n };\n\n const sameScopeDependencies = Object.keys(allDependencies).filter(depName =>\n depName.startsWith(currentScope + '/')\n );\n\n // Step 2.5: Find external dependencies that match external link patterns\n const externalLinkPatterns = runConfig.link?.externals || [];\n const externalDependencies = Object.keys(allDependencies).filter(depName =>\n matchesExternalLinkPattern(depName, externalLinkPatterns)\n );\n\n const allDependenciesToLink = [...sameScopeDependencies, ...externalDependencies];\n\n if (allDependenciesToLink.length === 0) {\n logger.info(`No same-scope or external dependencies found for ${currentScope}`);\n if (isDryRun) {\n return `DRY RUN: Would self-link, no dependencies found to link`;\n } else {\n return `Self-linked ${currentPackageJson.name}, no dependencies to link`;\n }\n }\n\n logger.info(`Found ${sameScopeDependencies.length} same-scope dependencies: ${sameScopeDependencies.join(', ')}`);\n if (externalDependencies.length > 0) {\n logger.info(`Found ${externalDependencies.length} external dependencies matching patterns: ${externalDependencies.join(', ')}`);\n }\n\n // Step 3: Get globally linked packages directories (only if we have dependencies to link)\n let globallyLinkedPackages: { [key: string]: string } = {};\n try {\n if (isDryRun) {\n logger.info(`DRY RUN: Would run 'npm ls --link -g -p' to discover linked package directories`);\n logger.info(`DRY RUN: Would attempt to link dependencies: ${allDependenciesToLink.join(', ')}`);\n return `DRY RUN: Would self-link and attempt to link ${allDependenciesToLink.length} dependencies`;\n } else {\n logger.verbose(`Discovering globally linked package directories...`);\n const result = await run('npm ls --link -g -p');\n const resultStr = typeof result === 'string' ? result : result.stdout;\n\n // Parse the directory paths - each line is a directory path\n const directoryPaths = resultStr.trim().split('\\n').filter(line => line.trim() !== '');\n\n // Extract package names from directory paths and build a map\n for (const dirPath of directoryPaths) {\n try {\n // Read the package.json to get the actual package name\n const packageJsonPath = `${dirPath.trim()}/package.json`;\n const packageJsonContent = await storage.readFile(packageJsonPath, 'utf-8');\n const parsed = safeJsonParse(packageJsonContent, packageJsonPath);\n const packageJson = validatePackageJson(parsed, packageJsonPath);\n\n if (packageJson.name) {\n globallyLinkedPackages[packageJson.name] = dirPath.trim();\n }\n } catch (packageError: any) {\n logger.verbose(`Could not read package.json from ${dirPath}: ${packageError.message}`);\n }\n }\n\n const linkedCount = Object.keys(globallyLinkedPackages).length;\n logger.verbose(`Found ${linkedCount} globally linked package(s)`);\n }\n } catch (error: any) {\n logger.warn(`Failed to get globally linked packages (continuing anyway): ${error.message}`);\n globallyLinkedPackages = {};\n }\n\n // Step 4: Link same-scope dependencies that are available globally using manual symlinks\n const linkedDependencies: string[] = [];\n\n for (const depName of allDependenciesToLink) {\n const sourcePath = globallyLinkedPackages[depName];\n if (sourcePath) {\n try {\n logger.verbose(`Linking dependency: ${depName} from ${sourcePath}`);\n\n // Create the symbolic link manually using the directory path directly\n const success = await createSymbolicLink(depName, sourcePath, currentDir, logger, isDryRun);\n\n if (success) {\n logger.info(`✅ Linked dependency: ${depName}`);\n linkedDependencies.push(depName);\n } else {\n logger.warn(`⚠️ Failed to link ${depName}`);\n }\n } catch (error: any) {\n logger.warn(`⚠️ Failed to link ${depName}: ${error.message}`);\n }\n } else {\n logger.verbose(`Skipping ${depName} (not globally linked)`);\n }\n }\n\n const summary = linkedDependencies.length > 0\n ? `Self-linked ${currentPackageJson.name} and linked ${linkedDependencies.length} dependencies: ${linkedDependencies.join(', ')}`\n : `Self-linked ${currentPackageJson.name}, no dependencies were available to link`;\n\n // Step 5: Regenerate package-lock.json without modifying node_modules\n try {\n if (isDryRun) {\n logger.info(`DRY RUN: Would run 'npm install --package-lock-only --no-audit --no-fund' to regenerate package-lock.json`);\n } else {\n logger.verbose(`Running 'npm install --package-lock-only --no-audit --no-fund' to regenerate package-lock.json without touching node_modules...`);\n await run('npm install --package-lock-only --no-audit --no-fund');\n logger.info(`✅ Regenerated package-lock.json`);\n }\n } catch (error: any) {\n logger.warn(`⚠️ Failed to regenerate package-lock.json: ${error.message}`);\n }\n\n logger.info(summary);\n return summary;\n }\n\n // New scope-based linking behavior\n logger.info(`🔗 Linking scope/package: ${packageArgument}`);\n\n const { scope, packageName } = parsePackageArgument(packageArgument);\n logger.verbose(`Parsed scope: ${scope}, package: ${packageName || 'all packages in scope'}`);\n\n // Find matching packages in the workspace\n const matchingPackages = await findMatchingPackages(targetDirectories, scope, storage, logger, packageName);\n\n if (matchingPackages.length === 0) {\n const message = packageName\n ? `No package found matching: ${packageName}`\n : `No packages found in scope: ${scope}`;\n logger.warn(message);\n return message;\n }\n\n logger.info(`Found ${matchingPackages.length} matching package(s)`);\n\n const linkedPackages: string[] = [];\n\n // If specific package name provided, use that; otherwise link all packages in scope\n const packagesToLink = packageName\n ? matchingPackages.filter(pkg => pkg.name === packageName)\n : matchingPackages;\n\n for (const pkg of packagesToLink) {\n logger.info(`Processing package: ${pkg.name}`);\n\n // Step A: Run 'npm link' in the source package directory\n try {\n const originalCwd = process.cwd();\n process.chdir(pkg.path);\n\n try {\n if (isDryRun) {\n logger.info(`DRY RUN: Would run 'npm link' in: ${pkg.path}`);\n } else {\n logger.verbose(`Running 'npm link' in source: ${pkg.path}`);\n await run('npm link');\n logger.info(`✅ Source linked: ${pkg.name}`);\n }\n } finally {\n process.chdir(originalCwd);\n }\n\n // Step B: Find all packages that depend on this package and link them\n const consumingPackages = await findConsumingPackages(targetDirectories, pkg.name, storage, logger);\n\n if (consumingPackages.length === 0) {\n logger.info(`No consuming packages found for: ${pkg.name}`);\n } else {\n logger.info(`Found ${consumingPackages.length} consuming package(s) for: ${pkg.name}`);\n\n for (const consumer of consumingPackages) {\n try {\n const consumerOriginalCwd = process.cwd();\n process.chdir(consumer.path);\n\n try {\n if (isDryRun) {\n logger.info(`DRY RUN: Would run 'npm link ${pkg.name}' in: ${consumer.path}`);\n } else {\n logger.verbose(`Running 'npm link ${pkg.name}' in consumer: ${consumer.path}`);\n await runSecure('npm', ['link', pkg.name]);\n logger.info(`✅ Consumer linked: ${consumer.name} -> ${pkg.name}`);\n }\n } finally {\n process.chdir(consumerOriginalCwd);\n }\n } catch (error: any) {\n logger.error(`❌ Failed to link ${pkg.name} in ${consumer.name}: ${error.message}`);\n throw new Error(`Failed to link ${pkg.name} in consumer ${consumer.name}: ${error.message}`);\n }\n }\n }\n\n linkedPackages.push(pkg.name);\n } catch (error: any) {\n logger.error(`❌ Failed to link source package ${pkg.name}: ${error.message}`);\n throw new Error(`Failed to link source package ${pkg.name}: ${error.message}`);\n }\n }\n\n const summary = `Successfully linked ${linkedPackages.length} package(s): ${linkedPackages.join(', ')}`;\n\n // Final step: Regenerate package-lock.json files in all affected packages without modifying node_modules\n if (!isDryRun) {\n logger.info(`🔄 Regenerating package-lock.json files in all packages (lockfile-only)...`);\n\n // Get all unique consuming packages\n const allConsumingPackages = new Set<string>();\n for (const pkg of packagesToLink) {\n const consumingPackages = await findConsumingPackages(targetDirectories, pkg.name, storage, logger);\n consumingPackages.forEach(consumer => allConsumingPackages.add(consumer.path));\n }\n\n // Also include the source packages\n packagesToLink.forEach(pkg => allConsumingPackages.add(pkg.path));\n\n // Run lockfile-only install in each package\n for (const packagePath of allConsumingPackages) {\n try {\n const originalCwd = process.cwd();\n process.chdir(packagePath);\n\n try {\n logger.verbose(`Running 'npm install --package-lock-only --no-audit --no-fund' in: ${packagePath}`);\n await run('npm install --package-lock-only --no-audit --no-fund');\n logger.verbose(`✅ Regenerated package-lock.json in: ${packagePath}`);\n } finally {\n process.chdir(originalCwd);\n }\n } catch (error: any) {\n logger.warn(`⚠️ Failed to regenerate package-lock.json in ${packagePath}: ${error.message}`);\n }\n }\n\n logger.info(`✅ Regenerated package-lock.json files in ${allConsumingPackages.size} packages`);\n } else {\n logger.info(`DRY RUN: Would run 'npm install --package-lock-only --no-audit --no-fund' to regenerate package-lock.json files in all packages`);\n }\n\n logger.info(summary);\n return summary;\n};\n\n// Status function to show what's currently linked\nconst executeStatus = async (runConfig: Config): Promise<string> => {\n const logger = getLogger();\n const storage = createStorage({ log: logger.info });\n\n // Get target directories from config, default to current directory\n const targetDirectories = runConfig.tree?.directories || [process.cwd()];\n\n if (targetDirectories.length === 1) {\n logger.info(`🔍 Checking link status in: ${targetDirectories[0]}`);\n } else {\n logger.info(`🔍 Checking link status in: ${targetDirectories.join(', ')}`);\n }\n\n // Find all packages in the workspace\n let allPackageJsonFiles: any[] = [];\n for (const targetDirectory of targetDirectories) {\n const packageJsonFiles = await findAllPackageJsonFiles(targetDirectory, storage);\n allPackageJsonFiles = allPackageJsonFiles.concat(packageJsonFiles);\n }\n\n const packageStatuses: Array<{\n name: string;\n path: string;\n linkedDependencies: Array<{ dependencyName: string; targetPath: string; isExternal: boolean }>;\n }> = [];\n\n for (const packageJsonLocation of allPackageJsonFiles) {\n const packageDir = packageJsonLocation.path.replace('/package.json', '');\n\n try {\n const packageJsonContent = await storage.readFile(packageJsonLocation.path, 'utf-8');\n const parsed = safeJsonParse(packageJsonContent, packageJsonLocation.path);\n const packageJson = validatePackageJson(parsed, packageJsonLocation.path);\n\n if (!packageJson.name) continue;\n\n const linkedDependencies = await findLinkedDependencies(packageDir, packageJson.name, storage, logger);\n\n if (linkedDependencies.length > 0) {\n packageStatuses.push({\n name: packageJson.name,\n path: packageDir,\n linkedDependencies\n });\n }\n } catch (error: any) {\n logger.warn(`Failed to parse ${packageJsonLocation.path}: ${error.message}`);\n }\n }\n\n if (packageStatuses.length === 0) {\n return 'No linked dependencies found in workspace.';\n }\n\n // Format the output\n let output = `Found ${packageStatuses.length} package(s) with linked dependencies:\\n\\n`;\n\n for (const packageStatus of packageStatuses) {\n output += `📦 ${packageStatus.name}\\n`;\n output += ` Path: ${packageStatus.path}\\n`;\n\n if (packageStatus.linkedDependencies.length > 0) {\n output += ` Linked dependencies:\\n`;\n for (const dep of packageStatus.linkedDependencies) {\n const type = dep.isExternal ? '🔗 External' : '🔗 Internal';\n output += ` ${type} ${dep.dependencyName} -> ${dep.targetPath}\\n`;\n }\n }\n output += '\\n';\n }\n\n return output;\n};\n\nexport const execute = async (runConfig: Config, packageArgument?: string): Promise<string> => {\n try {\n // Use packageArgument from runConfig if not provided as parameter\n const finalPackageArgument = packageArgument || runConfig.link?.packageArgument;\n return await executeInternal(runConfig, finalPackageArgument);\n } catch (error: any) {\n const logger = getLogger();\n logger.error(`link failed: ${error.message}`);\n throw error;\n }\n};\n\n"],"names":["isSymbolicLink","filePath","stats","fs","lstat","getSymbolicLinkTarget","target","readlink","findLinkedDependencies","packagePath","packageName","storage","logger","linkedDependencies","packageJsonPath","path","join","packageJsonContent","readFile","parsed","safeJsonParse","packageJson","validatePackageJson","allDependencies","dependencies","devDependencies","nodeModulesPath","dependencyName","version","Object","entries","dependencyPath","startsWith","scope","name","split","isExternal","includes","push","targetPath","error","warn","message","matchesExternalLinkPattern","externalLinkPatterns","length","some","pattern","createSymbolicLink","sourcePath","targetDir","isDryRun","scopeDir","mkdir","recursive","verbose","relativePath","relative","dirname","existingLink","info","unlink","symlink","isDirectory","rm","force","code","parsePackageArgument","packageArg","parts","Error","findMatchingPackages","targetDirectories","matchingPackages","allPackageJsonFiles","targetDirectory","packageJsonFiles","findAllPackageJsonFiles","concat","packageJsonLocation","packageDir","replace","isInScope","isExactMatch","isSource","findConsumingPackages","targetPackageName","consumingPackages","dependencyTypes","hasDependency","depType","executeInternal","runConfig","packageArgument","dryRun","link","getDryRunLogger","createStorage","log","executeStatus","tree","directories","process","cwd","currentDir","currentPackageJson","currentScope","run","sameScopeDependencies","keys","filter","depName","externals","externalDependencies","allDependenciesToLink","globallyLinkedPackages","result","resultStr","stdout","directoryPaths","trim","line","dirPath","packageError","linkedCount","success","summary","linkedPackages","packagesToLink","pkg","originalCwd","chdir","consumer","consumerOriginalCwd","runSecure","allConsumingPackages","Set","forEach","add","size","getLogger","packageStatuses","output","packageStatus","dep","type","execute","finalPackageArgument"],"mappings":"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"}
@@ -189,6 +189,85 @@ const runPrechecks = async (runConfig)=>{
189
189
  }
190
190
  logger.info('All prechecks passed.');
191
191
  };
192
+ // Helper: deep-sort object keys for stable comparison
193
+ const sortObjectKeys = (value)=>{
194
+ if (Array.isArray(value)) {
195
+ return value.map(sortObjectKeys);
196
+ }
197
+ if (value && typeof value === 'object') {
198
+ const sorted = {};
199
+ Object.keys(value).sort().forEach((key)=>{
200
+ sorted[key] = sortObjectKeys(value[key]);
201
+ });
202
+ return sorted;
203
+ }
204
+ return value;
205
+ };
206
+ // Determine if there are substantive changes compared to the target branch (beyond just version bump)
207
+ const isReleaseNecessaryComparedToTarget = async (targetBranch, isDryRun)=>{
208
+ const logger = getDryRunLogger(isDryRun);
209
+ // We compare current HEAD branch to the provided target branch
210
+ const currentBranch = await getCurrentBranchName();
211
+ // If branches are identical, nothing to release
212
+ const { stdout: namesStdout } = await runSecure('git', [
213
+ 'diff',
214
+ '--name-only',
215
+ `${targetBranch}..${currentBranch}`
216
+ ]);
217
+ const changedFiles = namesStdout.split('\n').map((s)=>s.trim()).filter(Boolean);
218
+ if (changedFiles.length === 0) {
219
+ // No definitive signal; proceed with publish rather than skipping
220
+ return {
221
+ necessary: true,
222
+ reason: 'No detectable changes via diff; proceeding conservatively'
223
+ };
224
+ }
225
+ // If any files changed other than package.json or package-lock.json, a release is necessary
226
+ const nonVersionFiles = changedFiles.filter((f)=>f !== 'package.json' && f !== 'package-lock.json');
227
+ if (nonVersionFiles.length > 0) {
228
+ return {
229
+ necessary: true,
230
+ reason: `Changed files beyond version bump: ${nonVersionFiles.join(', ')}`
231
+ };
232
+ }
233
+ // Only package.json and/or package-lock.json changed. Verify package.json change is only the version field
234
+ try {
235
+ // Read package.json content from both branches
236
+ const { stdout: basePkgStdout } = await runSecure('git', [
237
+ 'show',
238
+ `${targetBranch}:package.json`
239
+ ]);
240
+ const { stdout: headPkgStdout } = await runSecure('git', [
241
+ 'show',
242
+ `${currentBranch}:package.json`
243
+ ]);
244
+ const basePkg = validatePackageJson(safeJsonParse(basePkgStdout, `${targetBranch}:package.json`), `${targetBranch}:package.json`);
245
+ const headPkg = validatePackageJson(safeJsonParse(headPkgStdout, `${currentBranch}:package.json`), `${currentBranch}:package.json`);
246
+ const { version: _baseVersion, ...baseWithoutVersion } = basePkg;
247
+ const { version: _headVersion, ...headWithoutVersion } = headPkg;
248
+ const baseSorted = sortObjectKeys(baseWithoutVersion);
249
+ const headSorted = sortObjectKeys(headWithoutVersion);
250
+ const equalExceptVersion = JSON.stringify(baseSorted) === JSON.stringify(headSorted);
251
+ if (equalExceptVersion) {
252
+ return {
253
+ necessary: false,
254
+ reason: 'Only version changed in package.json (plus lockfile)'
255
+ };
256
+ }
257
+ // Other fields changed inside package.json
258
+ return {
259
+ necessary: true,
260
+ reason: 'package.json changes beyond version field'
261
+ };
262
+ } catch (error) {
263
+ // Conservative: if we cannot prove it is only a version change, proceed with release
264
+ logger.verbose(`Could not conclusively compare package.json changes: ${error.message}`);
265
+ return {
266
+ necessary: true,
267
+ reason: 'Could not compare package.json safely'
268
+ };
269
+ }
270
+ };
192
271
  const handleTargetBranchSyncRecovery = async (runConfig)=>{
193
272
  var _runConfig_publish;
194
273
  const isDryRun = runConfig.dryRun || false;
@@ -233,6 +312,22 @@ const execute = async (runConfig)=>{
233
312
  }
234
313
  // Run prechecks before starting any work
235
314
  await runPrechecks(runConfig);
315
+ // Early check: determine if a release is necessary compared to target branch
316
+ logger.info('Evaluating if a release is necessary compared to target branch...');
317
+ try {
318
+ const necessity = await isReleaseNecessaryComparedToTarget(targetBranch, isDryRun);
319
+ if (!necessity.necessary) {
320
+ logger.info(`Skipping publish: ${necessity.reason}.`);
321
+ // Emit a machine-readable marker so tree mode can detect skip and avoid propagating versions
322
+ logger.info('KODRDRIV_PUBLISH_SKIPPED');
323
+ return;
324
+ } else {
325
+ logger.verbose(`Proceeding with publish: ${necessity.reason}.`);
326
+ }
327
+ } catch (error) {
328
+ // On unexpected errors, proceed with publish to avoid false negatives blocking releases
329
+ logger.verbose(`Release necessity check encountered an issue (${error.message}). Proceeding with publish.`);
330
+ }
236
331
  logger.info('Starting release process...');
237
332
  let pr = null;
238
333
  if (isDryRun) {
@@ -247,7 +342,35 @@ const execute = async (runConfig)=>{
247
342
  } else {
248
343
  var _runConfig_publish4, _runConfig_publish5, _runConfig_publish6;
249
344
  logger.info('No open pull request found, starting new release publishing process...');
250
- // STEP 1: Determine and set target version FIRST (before any commits)
345
+ // STEP 1: Prepare for release (update dependencies and run prepublish checks) with NO version bump yet
346
+ logger.verbose('Preparing for release: switching from workspace to remote dependencies.');
347
+ logger.verbose('Updating dependencies to latest versions from registry');
348
+ const updatePatterns = (_runConfig_publish4 = runConfig.publish) === null || _runConfig_publish4 === void 0 ? void 0 : _runConfig_publish4.dependencyUpdatePatterns;
349
+ if (updatePatterns && updatePatterns.length > 0) {
350
+ logger.verbose(`Updating dependencies matching patterns: ${updatePatterns.join(', ')}`);
351
+ const patternsArg = updatePatterns.join(' ');
352
+ await runWithDryRunSupport(`npm update ${patternsArg}`, isDryRun);
353
+ } else {
354
+ logger.verbose('No dependency update patterns specified, updating all dependencies');
355
+ await runWithDryRunSupport('npm update', isDryRun);
356
+ }
357
+ logger.info('Running prepublishOnly script...');
358
+ await runWithDryRunSupport('npm run prepublishOnly', isDryRun, {}, true); // Use inherited stdio
359
+ // STEP 2: Commit dependency updates if any (still no version bump)
360
+ logger.verbose('Staging dependency updates for commit');
361
+ await runWithDryRunSupport('git add package.json package-lock.json', isDryRun);
362
+ logger.verbose('Checking for staged dependency updates...');
363
+ if (isDryRun) {
364
+ logger.verbose('Would create dependency update commit if changes are staged');
365
+ } else {
366
+ if (await hasStagedChanges()) {
367
+ logger.verbose('Staged dependency changes found, creating commit...');
368
+ await execute$1(runConfig);
369
+ } else {
370
+ logger.verbose('No dependency changes to commit, skipping commit.');
371
+ }
372
+ }
373
+ // STEP 3: Determine and set target version AFTER checks and dependency commit
251
374
  logger.info('Determining target version...');
252
375
  let newVersion;
253
376
  if (isDryRun) {
@@ -259,19 +382,15 @@ const execute = async (runConfig)=>{
259
382
  const parsed = safeJsonParse(packageJsonContents, 'package.json');
260
383
  const packageJson = validatePackageJson(parsed, 'package.json');
261
384
  const currentVersion = packageJson.version;
262
- // Determine target version based on --targetVersion option
263
385
  const targetVersionInput = ((_runConfig_publish7 = runConfig.publish) === null || _runConfig_publish7 === void 0 ? void 0 : _runConfig_publish7.targetVersion) || 'patch';
264
386
  const proposedVersion = calculateTargetVersion(currentVersion, targetVersionInput);
265
- // Check if target tag already exists
266
387
  const targetTagName = `v${proposedVersion}`;
267
388
  const tagExists = await checkIfTagExists(targetTagName);
268
389
  if (tagExists) {
269
390
  throw new Error(`Tag ${targetTagName} already exists. Please choose a different version or delete the existing tag.`);
270
391
  }
271
- // Interactive confirmation if --interactive flag is set
272
392
  if ((_runConfig_publish8 = runConfig.publish) === null || _runConfig_publish8 === void 0 ? void 0 : _runConfig_publish8.interactive) {
273
393
  newVersion = await confirmVersionInteractively(currentVersion, proposedVersion, targetVersionInput);
274
- // Re-check if the confirmed version's tag exists (in case user entered custom version)
275
394
  const confirmedTagName = `v${newVersion}`;
276
395
  const confirmedTagExists = await checkIfTagExists(confirmedTagName);
277
396
  if (confirmedTagExists) {
@@ -281,39 +400,21 @@ const execute = async (runConfig)=>{
281
400
  newVersion = proposedVersion;
282
401
  }
283
402
  logger.info(`Bumping version from ${currentVersion} to ${newVersion}`);
284
- // Update package.json with the new version BEFORE any other operations
285
403
  packageJson.version = newVersion;
286
404
  await storage.writeFile('package.json', JSON.stringify(packageJson, null, 2) + '\n', 'utf-8');
287
405
  logger.info(`Version updated in package.json: ${newVersion}`);
288
406
  }
289
- // STEP 2: Prepare for release (with correct version now in package.json)
290
- logger.verbose('Preparing for release: switching from workspace to remote dependencies.');
291
- logger.verbose('Updating dependencies to latest versions from registry');
292
- const updatePatterns = (_runConfig_publish4 = runConfig.publish) === null || _runConfig_publish4 === void 0 ? void 0 : _runConfig_publish4.dependencyUpdatePatterns;
293
- if (updatePatterns && updatePatterns.length > 0) {
294
- logger.verbose(`Updating dependencies matching patterns: ${updatePatterns.join(', ')}`);
295
- const patternsArg = updatePatterns.join(' ');
296
- await runWithDryRunSupport(`npm update ${patternsArg}`, isDryRun);
297
- } else {
298
- logger.verbose('No dependency update patterns specified, updating all dependencies');
299
- await runWithDryRunSupport('npm update', isDryRun);
300
- }
301
- logger.info('Running prepublishOnly script...');
302
- await runWithDryRunSupport('npm run prepublishOnly', isDryRun, {}, true); // Use inherited stdio
303
- // STEP 3: Stage all changes (version bump + dependencies + any build artifacts)
304
- logger.verbose('Staging all changes for release commit');
407
+ // STEP 4: Commit version bump as a separate commit
408
+ logger.verbose('Staging version bump for commit');
305
409
  await runWithDryRunSupport('git add package.json package-lock.json', isDryRun);
306
- logger.verbose('Checking for staged changes...');
307
410
  if (isDryRun) {
308
- logger.verbose('Assuming staged changes exist for demo purposes');
309
- logger.verbose('Would create commit...');
310
- await execute$1(runConfig);
411
+ logger.verbose('Would create version bump commit');
311
412
  } else {
312
413
  if (await hasStagedChanges()) {
313
- logger.verbose('Staged changes found, creating commit...');
414
+ logger.verbose('Creating version bump commit...');
314
415
  await execute$1(runConfig);
315
416
  } else {
316
- logger.verbose('No changes to commit, skipping commit.');
417
+ logger.verbose('No version changes to commit.');
317
418
  }
318
419
  }
319
420
  logger.info('Generating release notes...');