@eldrforge/kodrdriv 1.2.1 → 1.2.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 (40) hide show
  1. package/dist/application.js +7 -19
  2. package/dist/application.js.map +1 -1
  3. package/dist/arguments.js +345 -96
  4. package/dist/arguments.js.map +1 -1
  5. package/dist/commands/clean.js +1 -1
  6. package/dist/commands/clean.js.map +1 -1
  7. package/dist/commands/commit.js +59 -14
  8. package/dist/commands/commit.js.map +1 -1
  9. package/dist/commands/link.js +200 -11
  10. package/dist/commands/link.js.map +1 -1
  11. package/dist/commands/release.js +9 -3
  12. package/dist/commands/release.js.map +1 -1
  13. package/dist/commands/review.js +356 -145
  14. package/dist/commands/review.js.map +1 -1
  15. package/dist/commands/tree.js +111 -250
  16. package/dist/commands/tree.js.map +1 -1
  17. package/dist/commands/unlink.js +238 -10
  18. package/dist/commands/unlink.js.map +1 -1
  19. package/dist/constants.js +28 -12
  20. package/dist/constants.js.map +1 -1
  21. package/dist/content/issues.js +1 -1
  22. package/dist/error/CommandErrors.js +8 -1
  23. package/dist/error/CommandErrors.js.map +1 -1
  24. package/dist/prompt/commit.js +6 -0
  25. package/dist/prompt/commit.js.map +1 -1
  26. package/dist/prompt/instructions/review.md +13 -3
  27. package/dist/util/openai.js +70 -9
  28. package/dist/util/openai.js.map +1 -1
  29. package/dist/util/validation.js +24 -1
  30. package/dist/util/validation.js.map +1 -1
  31. package/package.json +2 -2
  32. package/test-external-unlink/package.json +16 -0
  33. package/test-externals/package.json +8 -0
  34. package/test-review-flow.sh +15 -0
  35. package/test-sort-files/alpha.md +3 -0
  36. package/test-sort-files/middle.txt +3 -0
  37. package/test-sort-files/zebra.txt +3 -0
  38. package/test_output.txt +161 -0
  39. package/dist/types.js +0 -140
  40. package/dist/types.js.map +0 -1
@@ -6,6 +6,76 @@ import { safeJsonParse, validatePackageJson } from '../util/validation.js';
6
6
  import fs__default from 'fs/promises';
7
7
  import path__default from 'path';
8
8
 
9
+ // Helper function to check if a path is a symbolic link
10
+ const isSymbolicLink = async (filePath)=>{
11
+ try {
12
+ const stats = await fs__default.lstat(filePath);
13
+ return stats.isSymbolicLink();
14
+ } catch {
15
+ return false;
16
+ }
17
+ };
18
+ // Helper function to get the target of a symbolic link
19
+ const getSymbolicLinkTarget = async (filePath)=>{
20
+ try {
21
+ const target = await fs__default.readlink(filePath);
22
+ return target;
23
+ } catch {
24
+ return null;
25
+ }
26
+ };
27
+ // Helper function to find all linked dependencies in a package
28
+ const findLinkedDependencies = async (packagePath, packageName, storage, logger)=>{
29
+ const linkedDependencies = [];
30
+ try {
31
+ const packageJsonPath = path__default.join(packagePath, 'package.json');
32
+ const packageJsonContent = await storage.readFile(packageJsonPath, 'utf-8');
33
+ const parsed = safeJsonParse(packageJsonContent, packageJsonPath);
34
+ const packageJson = validatePackageJson(parsed, packageJsonPath);
35
+ const allDependencies = {
36
+ ...packageJson.dependencies,
37
+ ...packageJson.devDependencies
38
+ };
39
+ const nodeModulesPath = path__default.join(packagePath, 'node_modules');
40
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
41
+ for (const [dependencyName, version] of Object.entries(allDependencies)){
42
+ let dependencyPath;
43
+ if (dependencyName.startsWith('@')) {
44
+ // Scoped package
45
+ const [scope, name] = dependencyName.split('/');
46
+ dependencyPath = path__default.join(nodeModulesPath, scope, name);
47
+ } else {
48
+ // Unscoped package
49
+ dependencyPath = path__default.join(nodeModulesPath, dependencyName);
50
+ }
51
+ if (await isSymbolicLink(dependencyPath)) {
52
+ const target = await getSymbolicLinkTarget(dependencyPath);
53
+ if (target) {
54
+ // Determine if this is an external dependency (not in the same workspace)
55
+ const isExternal = !target.includes('node_modules') || target.startsWith('..');
56
+ linkedDependencies.push({
57
+ dependencyName,
58
+ targetPath: target,
59
+ isExternal
60
+ });
61
+ }
62
+ }
63
+ }
64
+ } catch (error) {
65
+ logger.warn(`Failed to check linked dependencies in ${packageName}: ${error.message}`);
66
+ }
67
+ return linkedDependencies;
68
+ };
69
+ // Helper function to check if a dependency matches any external link patterns
70
+ const matchesExternalLinkPattern = (dependencyName, externalLinkPatterns)=>{
71
+ if (!externalLinkPatterns || externalLinkPatterns.length === 0) {
72
+ return false;
73
+ }
74
+ return externalLinkPatterns.some((pattern)=>{
75
+ // Simple string matching - could be enhanced with glob patterns later
76
+ return dependencyName === pattern || dependencyName.startsWith(pattern);
77
+ });
78
+ };
9
79
  // Helper function to create symbolic links manually
10
80
  const createSymbolicLink = async (packageName, sourcePath, targetDir, logger, isDryRun = false)=>{
11
81
  try {
@@ -186,6 +256,10 @@ const executeInternal = async (runConfig, packageArgument)=>{
186
256
  const storage = create({
187
257
  log: logger.info
188
258
  });
259
+ // Check if this is a status command
260
+ if (packageArgument === 'status') {
261
+ return await executeStatus(runConfig);
262
+ }
189
263
  // Get target directories from config, default to current directory
190
264
  const targetDirectories = ((_runConfig_tree = runConfig.tree) === null || _runConfig_tree === void 0 ? void 0 : _runConfig_tree.directories) || [
191
265
  process.cwd()
@@ -197,6 +271,7 @@ const executeInternal = async (runConfig, packageArgument)=>{
197
271
  }
198
272
  // If no package argument provided, use new smart same-scope linking behavior
199
273
  if (!packageArgument) {
274
+ var _runConfig_link1;
200
275
  logger.info('🔗 Smart linking current project...');
201
276
  // Work in current directory only - read the package.json
202
277
  const currentDir = process.cwd();
@@ -243,21 +318,32 @@ const executeInternal = async (runConfig, packageArgument)=>{
243
318
  ...currentPackageJson.devDependencies
244
319
  };
245
320
  const sameScopeDependencies = Object.keys(allDependencies).filter((depName)=>depName.startsWith(currentScope + '/'));
246
- if (sameScopeDependencies.length === 0) {
247
- logger.info(`No same-scope dependencies found for ${currentScope}`);
321
+ // Step 2.5: Find external dependencies that match external link patterns
322
+ const externalLinkPatterns = ((_runConfig_link1 = runConfig.link) === null || _runConfig_link1 === void 0 ? void 0 : _runConfig_link1.externals) || [];
323
+ const externalDependencies = Object.keys(allDependencies).filter((depName)=>matchesExternalLinkPattern(depName, externalLinkPatterns));
324
+ const allDependenciesToLink = [
325
+ ...sameScopeDependencies,
326
+ ...externalDependencies
327
+ ];
328
+ if (allDependenciesToLink.length === 0) {
329
+ logger.info(`No same-scope or external dependencies found for ${currentScope}`);
248
330
  if (isDryRun) {
249
- return `DRY RUN: Would self-link, no same-scope dependencies found to link`;
331
+ return `DRY RUN: Would self-link, no dependencies found to link`;
250
332
  } else {
251
- return `Self-linked ${currentPackageJson.name}, no same-scope dependencies to link`;
333
+ return `Self-linked ${currentPackageJson.name}, no dependencies to link`;
252
334
  }
253
335
  }
254
- // Step 3: Get globally linked packages directories (only if we have same-scope dependencies)
336
+ logger.info(`Found ${sameScopeDependencies.length} same-scope dependencies: ${sameScopeDependencies.join(', ')}`);
337
+ if (externalDependencies.length > 0) {
338
+ logger.info(`Found ${externalDependencies.length} external dependencies matching patterns: ${externalDependencies.join(', ')}`);
339
+ }
340
+ // Step 3: Get globally linked packages directories (only if we have dependencies to link)
255
341
  let globallyLinkedPackages = {};
256
342
  try {
257
343
  if (isDryRun) {
258
344
  logger.info(`DRY RUN: Would run 'npm ls --link -g -p' to discover linked package directories`);
259
- logger.info(`DRY RUN: Would attempt to link same-scope dependencies: ${sameScopeDependencies.join(', ')}`);
260
- return `DRY RUN: Would self-link and attempt to link ${sameScopeDependencies.length} same-scope dependencies`;
345
+ logger.info(`DRY RUN: Would attempt to link dependencies: ${allDependenciesToLink.join(', ')}`);
346
+ return `DRY RUN: Would self-link and attempt to link ${allDependenciesToLink.length} dependencies`;
261
347
  } else {
262
348
  logger.verbose(`Discovering globally linked package directories...`);
263
349
  const result = await run('npm ls --link -g -p');
@@ -286,14 +372,13 @@ const executeInternal = async (runConfig, packageArgument)=>{
286
372
  logger.warn(`Failed to get globally linked packages (continuing anyway): ${error.message}`);
287
373
  globallyLinkedPackages = {};
288
374
  }
289
- logger.info(`Found ${sameScopeDependencies.length} same-scope dependencies: ${sameScopeDependencies.join(', ')}`);
290
375
  // Step 4: Link same-scope dependencies that are available globally using manual symlinks
291
376
  const linkedDependencies = [];
292
- for (const depName of sameScopeDependencies){
377
+ for (const depName of allDependenciesToLink){
293
378
  const sourcePath = globallyLinkedPackages[depName];
294
379
  if (sourcePath) {
295
380
  try {
296
- logger.verbose(`Linking same-scope dependency: ${depName} from ${sourcePath}`);
381
+ logger.verbose(`Linking dependency: ${depName} from ${sourcePath}`);
297
382
  // Create the symbolic link manually using the directory path directly
298
383
  const success = await createSymbolicLink(depName, sourcePath, currentDir, logger, isDryRun);
299
384
  if (success) {
@@ -309,7 +394,19 @@ const executeInternal = async (runConfig, packageArgument)=>{
309
394
  logger.verbose(`Skipping ${depName} (not globally linked)`);
310
395
  }
311
396
  }
312
- const summary = linkedDependencies.length > 0 ? `Self-linked ${currentPackageJson.name} and linked ${linkedDependencies.length} same-scope dependencies: ${linkedDependencies.join(', ')}` : `Self-linked ${currentPackageJson.name}, no same-scope dependencies were available to link`;
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
399
+ try {
400
+ if (isDryRun) {
401
+ logger.info(`DRY RUN: Would run 'npm install' to regenerate package-lock.json`);
402
+ } else {
403
+ logger.verbose(`Running 'npm install' to regenerate package-lock.json...`);
404
+ await run('npm install');
405
+ logger.info(`✅ Regenerated package-lock.json`);
406
+ }
407
+ } catch (error) {
408
+ logger.warn(`⚠️ Failed to regenerate package-lock.json: ${error.message}`);
409
+ }
313
410
  logger.info(summary);
314
411
  return summary;
315
412
  }
@@ -382,9 +479,101 @@ const executeInternal = async (runConfig, packageArgument)=>{
382
479
  }
383
480
  }
384
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
483
+ if (!isDryRun) {
484
+ logger.info(`🔄 Regenerating package-lock.json files in all packages...`);
485
+ // Get all unique consuming packages
486
+ const allConsumingPackages = new Set();
487
+ for (const pkg of packagesToLink){
488
+ const consumingPackages = await findConsumingPackages(targetDirectories, pkg.name, storage, logger);
489
+ consumingPackages.forEach((consumer)=>allConsumingPackages.add(consumer.path));
490
+ }
491
+ // Also include the source packages
492
+ packagesToLink.forEach((pkg)=>allConsumingPackages.add(pkg.path));
493
+ // Run npm install in each package
494
+ for (const packagePath of allConsumingPackages){
495
+ try {
496
+ const originalCwd = process.cwd();
497
+ process.chdir(packagePath);
498
+ try {
499
+ logger.verbose(`Running 'npm install' in: ${packagePath}`);
500
+ await run('npm install');
501
+ logger.verbose(`✅ Regenerated package-lock.json in: ${packagePath}`);
502
+ } finally{
503
+ process.chdir(originalCwd);
504
+ }
505
+ } catch (error) {
506
+ logger.warn(`⚠️ Failed to regenerate package-lock.json in ${packagePath}: ${error.message}`);
507
+ }
508
+ }
509
+ logger.info(`✅ Regenerated package-lock.json files in ${allConsumingPackages.size} packages`);
510
+ } else {
511
+ logger.info(`DRY RUN: Would run 'npm install' to regenerate package-lock.json files in all packages`);
512
+ }
385
513
  logger.info(summary);
386
514
  return summary;
387
515
  };
516
+ // Status function to show what's currently linked
517
+ const executeStatus = async (runConfig)=>{
518
+ var _runConfig_tree;
519
+ const logger = getLogger();
520
+ const storage = create({
521
+ log: logger.info
522
+ });
523
+ // Get target directories from config, default to current directory
524
+ const targetDirectories = ((_runConfig_tree = runConfig.tree) === null || _runConfig_tree === void 0 ? void 0 : _runConfig_tree.directories) || [
525
+ process.cwd()
526
+ ];
527
+ if (targetDirectories.length === 1) {
528
+ logger.info(`🔍 Checking link status in: ${targetDirectories[0]}`);
529
+ } else {
530
+ logger.info(`🔍 Checking link status in: ${targetDirectories.join(', ')}`);
531
+ }
532
+ // Find all packages in the workspace
533
+ let allPackageJsonFiles = [];
534
+ for (const targetDirectory of targetDirectories){
535
+ const packageJsonFiles = await findAllPackageJsonFiles(targetDirectory, storage);
536
+ allPackageJsonFiles = allPackageJsonFiles.concat(packageJsonFiles);
537
+ }
538
+ const packageStatuses = [];
539
+ for (const packageJsonLocation of allPackageJsonFiles){
540
+ const packageDir = packageJsonLocation.path.replace('/package.json', '');
541
+ try {
542
+ const packageJsonContent = await storage.readFile(packageJsonLocation.path, 'utf-8');
543
+ const parsed = safeJsonParse(packageJsonContent, packageJsonLocation.path);
544
+ const packageJson = validatePackageJson(parsed, packageJsonLocation.path);
545
+ if (!packageJson.name) continue;
546
+ const linkedDependencies = await findLinkedDependencies(packageDir, packageJson.name, storage, logger);
547
+ if (linkedDependencies.length > 0) {
548
+ packageStatuses.push({
549
+ name: packageJson.name,
550
+ path: packageDir,
551
+ linkedDependencies
552
+ });
553
+ }
554
+ } catch (error) {
555
+ logger.warn(`Failed to parse ${packageJsonLocation.path}: ${error.message}`);
556
+ }
557
+ }
558
+ if (packageStatuses.length === 0) {
559
+ return 'No linked dependencies found in workspace.';
560
+ }
561
+ // Format the output
562
+ let output = `Found ${packageStatuses.length} package(s) with linked dependencies:\n\n`;
563
+ for (const packageStatus of packageStatuses){
564
+ output += `📦 ${packageStatus.name}\n`;
565
+ output += ` Path: ${packageStatus.path}\n`;
566
+ if (packageStatus.linkedDependencies.length > 0) {
567
+ output += ` Linked dependencies:\n`;
568
+ for (const dep of packageStatus.linkedDependencies){
569
+ const type = dep.isExternal ? '🔗 External' : '🔗 Internal';
570
+ output += ` ${type} ${dep.dependencyName} -> ${dep.targetPath}\n`;
571
+ }
572
+ }
573
+ output += '\n';
574
+ }
575
+ return output;
576
+ };
388
577
  const execute = async (runConfig, packageArgument)=>{
389
578
  try {
390
579
  var _runConfig_link;
@@ -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 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 // 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 if (sameScopeDependencies.length === 0) {\n logger.info(`No same-scope dependencies found for ${currentScope}`);\n if (isDryRun) {\n return `DRY RUN: Would self-link, no same-scope dependencies found to link`;\n } else {\n return `Self-linked ${currentPackageJson.name}, no same-scope dependencies to link`;\n }\n }\n\n // Step 3: Get globally linked packages directories (only if we have same-scope dependencies)\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 same-scope dependencies: ${sameScopeDependencies.join(', ')}`);\n return `DRY RUN: Would self-link and attempt to link ${sameScopeDependencies.length} same-scope 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 logger.info(`Found ${sameScopeDependencies.length} same-scope dependencies: ${sameScopeDependencies.join(', ')}`);\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 sameScopeDependencies) {\n const sourcePath = globallyLinkedPackages[depName];\n if (sourcePath) {\n try {\n logger.verbose(`Linking same-scope 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} same-scope dependencies: ${linkedDependencies.join(', ')}`\n : `Self-linked ${currentPackageJson.name}, no same-scope dependencies were available to link`;\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 logger.info(summary);\n return summary;\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"],"names":["createSymbolicLink","packageName","sourcePath","targetDir","logger","isDryRun","scope","name","startsWith","split","nodeModulesPath","path","join","targetPath","scopeDir","fs","mkdir","recursive","verbose","relativePath","relative","dirname","stats","lstat","isSymbolicLink","existingLink","readlink","info","unlink","symlink","isDirectory","warn","rm","force","error","code","message","parsePackageArgument","packageArg","parts","length","Error","findMatchingPackages","targetDirectories","storage","matchingPackages","allPackageJsonFiles","targetDirectory","packageJsonFiles","findAllPackageJsonFiles","concat","packageJsonLocation","packageDir","replace","packageJsonContent","readFile","parsed","safeJsonParse","packageJson","validatePackageJson","isInScope","isExactMatch","push","isSource","findConsumingPackages","targetPackageName","consumingPackages","dependencyTypes","hasDependency","some","depType","executeInternal","runConfig","packageArgument","dryRun","link","getDryRunLogger","createStorage","log","tree","directories","process","cwd","currentDir","packageJsonPath","currentPackageJson","currentScope","run","allDependencies","dependencies","devDependencies","sameScopeDependencies","Object","keys","filter","depName","globallyLinkedPackages","result","resultStr","stdout","directoryPaths","trim","line","dirPath","packageError","linkedCount","linkedDependencies","success","summary","linkedPackages","packagesToLink","pkg","originalCwd","chdir","consumer","consumerOriginalCwd","runSecure","execute","finalPackageArgument","getLogger"],"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: 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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"}
@@ -6,7 +6,7 @@ import { getDefaultFromRef } from '../util/git.js';
6
6
  import { create } from '../content/log.js';
7
7
  import { create as create$1, truncateDiffByFiles } from '../content/diff.js';
8
8
  import { createPrompt } from '../prompt/release.js';
9
- import { getModelForCommand, createCompletionWithRetry } from '../util/openai.js';
9
+ import { getModelForCommand, createCompletionWithRetry, getOpenAIMaxOutputTokensForCommand, getOpenAIReasoningForCommand } from '../util/openai.js';
10
10
  import { getDryRunLogger } from '../logging.js';
11
11
  import { getOutputPath, getTimestampedResponseFilename, getTimestampedRequestFilename, getTimestampedReleaseNotesFilename } from '../util/general.js';
12
12
  import { create as create$2 } from '../util/storage.js';
@@ -59,8 +59,12 @@ Please revise the release notes according to the user's feedback while maintaini
59
59
  },
60
60
  callLLM: async (request, runConfig, outputDirectory)=>{
61
61
  const modelToUse = getModelForCommand(runConfig, 'release');
62
+ const openaiReasoning = getOpenAIReasoningForCommand(runConfig, 'release');
63
+ const openaiMaxOutputTokens = getOpenAIMaxOutputTokensForCommand(runConfig, 'release');
62
64
  return await createCompletionWithRetry(request.messages, {
63
65
  model: modelToUse,
66
+ openaiReasoning,
67
+ openaiMaxOutputTokens,
64
68
  responseFormat: {
65
69
  type: 'json_object'
66
70
  },
@@ -268,13 +272,15 @@ const execute = async (runConfig)=>{
268
272
  };
269
273
  const summary = await createCompletionWithRetry(request.messages, {
270
274
  model: modelToUse,
275
+ openaiReasoning: getOpenAIReasoningForCommand(runConfig, 'release'),
276
+ openaiMaxOutputTokens: getOpenAIMaxOutputTokensForCommand(runConfig, 'release'),
277
+ maxTokens: promptResult.maxTokens,
271
278
  responseFormat: {
272
279
  type: 'json_object'
273
280
  },
274
281
  debug: runConfig.debug,
275
282
  debugRequestFile: getOutputPath(outputDirectory, getTimestampedRequestFilename('release')),
276
- debugResponseFile: getOutputPath(outputDirectory, getTimestampedResponseFilename('release')),
277
- maxTokens: promptResult.maxTokens
283
+ debugResponseFile: getOutputPath(outputDirectory, getTimestampedResponseFilename('release'))
278
284
  }, createRetryCallback(diffContent, logContent));
279
285
  // Validate and safely cast the response
280
286
  let releaseSummary = validateReleaseSummary(summary);