@eldrforge/kodrdriv 1.2.27 → 1.2.29
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.
- package/AI-FRIENDLY-LOGGING-GUIDE.md +237 -0
- package/AI-LOGGING-MIGRATION-COMPLETE.md +371 -0
- package/ALREADY-PUBLISHED-PACKAGES-FIX.md +264 -0
- package/AUDIT-BRANCHES-PROGRESS-FIX.md +90 -0
- package/AUDIT-EXAMPLE-OUTPUT.md +113 -0
- package/CHECKPOINT-RECOVERY-FIX.md +450 -0
- package/LOGGING-MIGRATION-STATUS.md +186 -0
- package/PARALLEL-PUBLISH-DEBUGGING-GUIDE.md +441 -0
- package/PARALLEL-PUBLISH-FIXES-IMPLEMENTED.md +405 -0
- package/PARALLEL-PUBLISH-LOGGING-FIXES.md +274 -0
- package/PARALLEL-PUBLISH-QUICK-REFERENCE.md +375 -0
- package/PARALLEL_EXECUTION_FIX.md +2 -2
- package/PUBLISH_IMPROVEMENTS_IMPLEMENTED.md +4 -5
- package/VERSION-AUDIT-FIX.md +333 -0
- package/dist/application.js +6 -6
- package/dist/application.js.map +1 -1
- package/dist/arguments.js +43 -13
- package/dist/arguments.js.map +1 -1
- package/dist/commands/audio-commit.js +18 -18
- package/dist/commands/audio-commit.js.map +1 -1
- package/dist/commands/audio-review.js +32 -32
- package/dist/commands/audio-review.js.map +1 -1
- package/dist/commands/clean.js +9 -9
- package/dist/commands/clean.js.map +1 -1
- package/dist/commands/commit.js +20 -20
- package/dist/commands/commit.js.map +1 -1
- package/dist/commands/development.js +88 -89
- package/dist/commands/development.js.map +1 -1
- package/dist/commands/link.js +36 -36
- package/dist/commands/link.js.map +1 -1
- package/dist/commands/publish.js +318 -220
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/release.js +14 -14
- package/dist/commands/release.js.map +1 -1
- package/dist/commands/review.js +15 -17
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/select-audio.js +5 -5
- package/dist/commands/select-audio.js.map +1 -1
- package/dist/commands/tree.js +134 -39
- package/dist/commands/tree.js.map +1 -1
- package/dist/commands/unlink.js +39 -39
- package/dist/commands/unlink.js.map +1 -1
- package/dist/commands/updates.js +150 -14
- package/dist/commands/updates.js.map +1 -1
- package/dist/commands/versions.js +14 -13
- package/dist/commands/versions.js.map +1 -1
- package/dist/constants.js +1 -1
- package/dist/content/diff.js +5 -5
- package/dist/content/diff.js.map +1 -1
- package/dist/content/files.js +2 -2
- package/dist/content/files.js.map +1 -1
- package/dist/content/log.js +3 -3
- package/dist/content/log.js.map +1 -1
- package/dist/execution/CommandValidator.js +6 -6
- package/dist/execution/CommandValidator.js.map +1 -1
- package/dist/execution/DynamicTaskPool.js +129 -19
- package/dist/execution/DynamicTaskPool.js.map +1 -1
- package/dist/execution/RecoveryManager.js +99 -21
- package/dist/execution/RecoveryManager.js.map +1 -1
- package/dist/execution/TreeExecutionAdapter.js +23 -20
- package/dist/execution/TreeExecutionAdapter.js.map +1 -1
- package/dist/main.js +2 -2
- package/dist/main.js.map +1 -1
- package/dist/util/checkpointManager.js +4 -4
- package/dist/util/checkpointManager.js.map +1 -1
- package/dist/util/dependencyGraph.js +2 -2
- package/dist/util/dependencyGraph.js.map +1 -1
- package/dist/util/fileLock.js +1 -1
- package/dist/util/fileLock.js.map +1 -1
- package/dist/util/general.js +148 -15
- package/dist/util/general.js.map +1 -1
- package/dist/util/interactive.js +2 -2
- package/dist/util/interactive.js.map +1 -1
- package/dist/util/performance.js.map +1 -1
- package/dist/util/safety.js +13 -13
- package/dist/util/safety.js.map +1 -1
- package/dist/utils/branchState.js +567 -0
- package/dist/utils/branchState.js.map +1 -0
- package/package.json +4 -4
- package/scripts/update-test-log-assertions.js +73 -0
package/dist/commands/link.js
CHANGED
|
@@ -61,7 +61,7 @@ const findLinkedDependencies = async (packagePath, packageName, storage, logger)
|
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
63
|
} catch (error) {
|
|
64
|
-
logger.warn(`
|
|
64
|
+
logger.warn(`LINKED_DEPS_CHECK_FAILED: Unable to check linked dependencies | Package: ${packageName} | Error: ${error.message}`);
|
|
65
65
|
}
|
|
66
66
|
return linkedDependencies;
|
|
67
67
|
};
|
|
@@ -122,28 +122,28 @@ const createSymbolicLink = async (packageName, sourcePath, targetDir, logger, is
|
|
|
122
122
|
logger.verbose(`Symlink already exists and points to correct target: ${targetPath} -> ${relativePath}`);
|
|
123
123
|
return true;
|
|
124
124
|
} else {
|
|
125
|
-
logger.info(
|
|
125
|
+
logger.info(`SYMLINK_FIXING: Correcting symlink target | Path: ${targetPath} | Old Target: ${existingLink} | New Target: ${relativePath}`);
|
|
126
126
|
await fs.unlink(targetPath);
|
|
127
127
|
await fs.symlink(relativePath, targetPath, 'dir');
|
|
128
|
-
logger.info(
|
|
128
|
+
logger.info(`SYMLINK_FIXED: Successfully updated symlink | Path: ${targetPath} | Target: ${relativePath} | Type: directory`);
|
|
129
129
|
return true;
|
|
130
130
|
}
|
|
131
131
|
} else if (stats.isDirectory()) {
|
|
132
132
|
// It's a directory, remove it
|
|
133
|
-
logger.warn(
|
|
133
|
+
logger.warn(`SYMLINK_DIRECTORY_CONFLICT: Removing existing directory to create symlink | Path: ${targetPath} | Type: directory | Action: Remove and replace with symlink`);
|
|
134
134
|
await fs.rm(targetPath, {
|
|
135
135
|
recursive: true,
|
|
136
136
|
force: true
|
|
137
137
|
});
|
|
138
138
|
await fs.symlink(relativePath, targetPath, 'dir');
|
|
139
|
-
logger.info(
|
|
139
|
+
logger.info(`SYMLINK_CREATED: Successfully created symlink after directory removal | Path: ${targetPath} | Target: ${relativePath} | Type: directory`);
|
|
140
140
|
return true;
|
|
141
141
|
} else {
|
|
142
142
|
// It's a file, remove it
|
|
143
|
-
logger.warn(
|
|
143
|
+
logger.warn(`SYMLINK_FILE_CONFLICT: Removing existing file to create symlink | Path: ${targetPath} | Type: file | Action: Remove and replace with symlink`);
|
|
144
144
|
await fs.unlink(targetPath);
|
|
145
145
|
await fs.symlink(relativePath, targetPath, 'dir');
|
|
146
|
-
logger.info(
|
|
146
|
+
logger.info(`SYMLINK_CREATED: Successfully created symlink after file removal | Path: ${targetPath} | Target: ${relativePath} | Type: directory`);
|
|
147
147
|
return true;
|
|
148
148
|
}
|
|
149
149
|
} catch (error) {
|
|
@@ -157,7 +157,7 @@ const createSymbolicLink = async (packageName, sourcePath, targetDir, logger, is
|
|
|
157
157
|
}
|
|
158
158
|
}
|
|
159
159
|
} catch (error) {
|
|
160
|
-
logger.warn(`
|
|
160
|
+
logger.warn(`SYMLINK_CREATE_FAILED: Unable to create symlink | Package: ${packageName} | Error: ${error.message} | Status: failed`);
|
|
161
161
|
return false;
|
|
162
162
|
}
|
|
163
163
|
};
|
|
@@ -207,7 +207,7 @@ const findMatchingPackages = async (targetDirectories, scope, storage, logger, p
|
|
|
207
207
|
});
|
|
208
208
|
}
|
|
209
209
|
} catch (error) {
|
|
210
|
-
logger.warn(`
|
|
210
|
+
logger.warn(`PACKAGE_JSON_PARSE_FAILED: Unable to parse package.json | Path: ${packageJsonLocation.path} | Error: ${error.message}`);
|
|
211
211
|
}
|
|
212
212
|
}
|
|
213
213
|
return matchingPackages;
|
|
@@ -264,14 +264,14 @@ const executeInternal = async (runConfig, packageArgument)=>{
|
|
|
264
264
|
process.cwd()
|
|
265
265
|
];
|
|
266
266
|
if (targetDirectories.length === 1) {
|
|
267
|
-
logger.info(`Analyzing workspace
|
|
267
|
+
logger.info(`WORKSPACE_ANALYSIS: Analyzing single workspace directory | Path: ${targetDirectories[0]} | Purpose: Find linkable packages`);
|
|
268
268
|
} else {
|
|
269
|
-
logger.info(`Analyzing
|
|
269
|
+
logger.info(`WORKSPACE_ANALYSIS: Analyzing multiple workspace directories | Paths: ${targetDirectories.join(', ')} | Count: ${targetDirectories.length} | Purpose: Find linkable packages across workspaces`);
|
|
270
270
|
}
|
|
271
271
|
// If no package argument provided, use new smart same-scope linking behavior
|
|
272
272
|
if (!packageArgument) {
|
|
273
273
|
var _runConfig_link1, _runConfig_link2;
|
|
274
|
-
logger.info('
|
|
274
|
+
logger.info('LINK_SMART_MODE: Smart linking mode activated for current project | Mode: smart | Target: current directory | Purpose: Auto-link dependencies based on scope');
|
|
275
275
|
// Work in current directory only - read the package.json
|
|
276
276
|
const currentDir = process.cwd();
|
|
277
277
|
const packageJsonPath = `${currentDir}/package.json`;
|
|
@@ -281,35 +281,35 @@ const executeInternal = async (runConfig, packageArgument)=>{
|
|
|
281
281
|
const parsed = safeJsonParse(packageJsonContent, packageJsonPath);
|
|
282
282
|
currentPackageJson = validatePackageJson(parsed, packageJsonPath);
|
|
283
283
|
} catch (error) {
|
|
284
|
-
const message = `No valid package.json
|
|
284
|
+
const message = `PACKAGE_JSON_NOT_FOUND: No valid package.json in current directory | Error: ${error.message} | Action: Cannot proceed with smart linking`;
|
|
285
285
|
logger.error(message);
|
|
286
286
|
return message;
|
|
287
287
|
}
|
|
288
288
|
if (!currentPackageJson.name) {
|
|
289
|
-
const message = 'package.json must have a name field';
|
|
289
|
+
const message = 'PACKAGE_NAME_MISSING: package.json must have a name field | Field: name | Requirement: Required for linking | Action: Add name field to package.json';
|
|
290
290
|
logger.error(message);
|
|
291
291
|
return message;
|
|
292
292
|
}
|
|
293
293
|
// Extract the scope from the current package name
|
|
294
294
|
const currentScope = currentPackageJson.name.startsWith('@') ? currentPackageJson.name.split('/')[0] : null;
|
|
295
295
|
if (!currentScope) {
|
|
296
|
-
const message = '
|
|
296
|
+
const message = 'PACKAGE_SCOPE_MISSING: Package must have scoped name for smart linking | Format Required: @scope/package | Current: ' + currentPackageJson.name + ' | Action: Use scoped package name';
|
|
297
297
|
logger.warn(message);
|
|
298
298
|
return message;
|
|
299
299
|
}
|
|
300
|
-
logger.info(`Current package: ${currentPackageJson.name}
|
|
300
|
+
logger.info(`CURRENT_PACKAGE_IDENTIFIED: Current package identified for smart linking | Package: ${currentPackageJson.name} | Scope: ${currentScope} | Path: ${currentDir}`);
|
|
301
301
|
// Step 1: Link the current package globally (optional - continue even if this fails)
|
|
302
302
|
try {
|
|
303
303
|
if (isDryRun) {
|
|
304
|
-
logger.info(`
|
|
304
|
+
logger.info(`SELF_LINK_DRY_RUN: Would link current package globally | Mode: dry-run | Package: ${currentPackageJson.name} | Command: npm link`);
|
|
305
305
|
} else {
|
|
306
|
-
logger.verbose(`
|
|
306
|
+
logger.verbose(`SELF_LINK_STARTING: Registering package globally | Package: ${currentPackageJson.name} | Command: npm link | Purpose: Make available for dependency linking`);
|
|
307
307
|
await run('npm link');
|
|
308
|
-
logger.info(
|
|
308
|
+
logger.info(`SELF_LINK_SUCCESS: Current package linked globally | Package: ${currentPackageJson.name} | Location: Global npm | Purpose: Make available for linking`);
|
|
309
309
|
}
|
|
310
310
|
} catch (error) {
|
|
311
|
-
logger.warn(
|
|
312
|
-
logger.info(`
|
|
311
|
+
logger.warn(`SELF_LINK_FAILED: Unable to self-link current package | Package: ${currentPackageJson.name} | Error: ${error.message} | Impact: Continuing with dependency linking`);
|
|
312
|
+
logger.info(`LINK_CONTINUING: Proceeding with dependency linking despite self-link failure | Next: Link matching dependencies`);
|
|
313
313
|
}
|
|
314
314
|
// Step 2: Find same-scope dependencies in current package
|
|
315
315
|
const allDependencies = {
|
|
@@ -371,10 +371,10 @@ const executeInternal = async (runConfig, packageArgument)=>{
|
|
|
371
371
|
process.chdir(packageDir);
|
|
372
372
|
logger.verbose(`Running 'npm link' in source: ${packageDir}`);
|
|
373
373
|
await run('npm link');
|
|
374
|
-
logger.info(
|
|
374
|
+
logger.info(`LINK_SOURCE_SCOPE_ROOTS: Source linked via scopeRoots | Package: ${depName} | Method: scopeRoots | Status: linked`);
|
|
375
375
|
globallyLinkedViaScopeRoots.push(depName);
|
|
376
376
|
} catch (linkError) {
|
|
377
|
-
logger.warn(
|
|
377
|
+
logger.warn(`LINK_SOURCE_FAILED: Failed to link source package | Package: ${depName} | Error: ${linkError.message}`);
|
|
378
378
|
} finally{
|
|
379
379
|
process.chdir(originalCwd);
|
|
380
380
|
}
|
|
@@ -441,10 +441,10 @@ const executeInternal = async (runConfig, packageArgument)=>{
|
|
|
441
441
|
// Create the symbolic link manually using the directory path directly
|
|
442
442
|
const success = await createSymbolicLink(depName, sourcePath, currentDir, logger, isDryRun);
|
|
443
443
|
if (success) {
|
|
444
|
-
logger.info(
|
|
444
|
+
logger.info(`LINK_DEPENDENCY_SUCCESS: Linked dependency successfully | Dependency: ${depName} | Status: symlink-created`);
|
|
445
445
|
linkedDependencies.push(depName);
|
|
446
446
|
} else {
|
|
447
|
-
logger.warn(
|
|
447
|
+
logger.warn(`LINK_DEPENDENCY_FAILED: Failed to link dependency | Dependency: ${depName} | Status: failed`);
|
|
448
448
|
}
|
|
449
449
|
} catch (error) {
|
|
450
450
|
logger.warn(`⚠️ Failed to link ${depName}: ${error.message}`);
|
|
@@ -461,16 +461,16 @@ const executeInternal = async (runConfig, packageArgument)=>{
|
|
|
461
461
|
} else {
|
|
462
462
|
logger.verbose(`Running 'npm install --package-lock-only --no-audit --no-fund' to regenerate package-lock.json without touching node_modules...`);
|
|
463
463
|
await run('npm install --package-lock-only --no-audit --no-fund');
|
|
464
|
-
logger.info(
|
|
464
|
+
logger.info(`LINK_LOCK_REGENERATED: Regenerated package-lock.json successfully | File: package-lock.json | Status: updated`);
|
|
465
465
|
}
|
|
466
466
|
} catch (error) {
|
|
467
|
-
logger.warn(
|
|
467
|
+
logger.warn(`LINK_LOCK_REGEN_FAILED: Failed to regenerate package-lock.json | Error: ${error.message} | Impact: Lock file may be out of sync`);
|
|
468
468
|
}
|
|
469
469
|
logger.info(summary);
|
|
470
470
|
return summary;
|
|
471
471
|
}
|
|
472
472
|
// New scope-based linking behavior
|
|
473
|
-
logger.info(
|
|
473
|
+
logger.info(`LINK_SCOPE_MODE: Linking scope or specific package | Target: ${packageArgument} | Mode: scope-based | Purpose: Link packages by scope`);
|
|
474
474
|
const { scope, packageName } = parsePackageArgument(packageArgument);
|
|
475
475
|
logger.verbose(`Parsed scope: ${scope}, package: ${packageName || 'all packages in scope'}`);
|
|
476
476
|
// Find matching packages in the workspace
|
|
@@ -496,7 +496,7 @@ const executeInternal = async (runConfig, packageArgument)=>{
|
|
|
496
496
|
} else {
|
|
497
497
|
logger.verbose(`Running 'npm link' in source: ${pkg.path}`);
|
|
498
498
|
await run('npm link');
|
|
499
|
-
logger.info(
|
|
499
|
+
logger.info(`LINK_SOURCE_SUCCESS: Source package linked globally | Package: ${pkg.name} | Status: linked`);
|
|
500
500
|
}
|
|
501
501
|
} finally{
|
|
502
502
|
process.chdir(originalCwd);
|
|
@@ -520,27 +520,27 @@ const executeInternal = async (runConfig, packageArgument)=>{
|
|
|
520
520
|
'link',
|
|
521
521
|
pkg.name
|
|
522
522
|
]);
|
|
523
|
-
logger.info(
|
|
523
|
+
logger.info(`LINK_CONSUMER_SUCCESS: Consumer linked to package | Consumer: ${consumer.name} | Package: ${pkg.name} | Status: linked`);
|
|
524
524
|
}
|
|
525
525
|
} finally{
|
|
526
526
|
process.chdir(consumerOriginalCwd);
|
|
527
527
|
}
|
|
528
528
|
} catch (error) {
|
|
529
|
-
logger.error(
|
|
529
|
+
logger.error(`LINK_CONSUMER_FAILED: Failed to link package in consumer | Package: ${pkg.name} | Consumer: ${consumer.name} | Error: ${error.message}`);
|
|
530
530
|
throw new Error(`Failed to link ${pkg.name} in consumer ${consumer.name}: ${error.message}`);
|
|
531
531
|
}
|
|
532
532
|
}
|
|
533
533
|
}
|
|
534
534
|
linkedPackages.push(pkg.name);
|
|
535
535
|
} catch (error) {
|
|
536
|
-
logger.error(
|
|
536
|
+
logger.error(`LINK_SOURCE_PACKAGE_FAILED: Failed to link source package | Package: ${pkg.name} | Error: ${error.message}`);
|
|
537
537
|
throw new Error(`Failed to link source package ${pkg.name}: ${error.message}`);
|
|
538
538
|
}
|
|
539
539
|
}
|
|
540
540
|
const summary = `Successfully linked ${linkedPackages.length} package(s): ${linkedPackages.join(', ')}`;
|
|
541
541
|
// Final step: Regenerate package-lock.json files in all affected packages without modifying node_modules
|
|
542
542
|
if (!isDryRun) {
|
|
543
|
-
logger.info(
|
|
543
|
+
logger.info(`LINK_LOCK_REGENERATING_ALL: Regenerating package-lock.json files in all packages | Mode: lockfile-only | Purpose: Update lock files after linking`);
|
|
544
544
|
// Get all unique consuming packages
|
|
545
545
|
const allConsumingPackages = new Set();
|
|
546
546
|
for (const pkg of packagesToLink){
|
|
@@ -557,15 +557,15 @@ const executeInternal = async (runConfig, packageArgument)=>{
|
|
|
557
557
|
try {
|
|
558
558
|
logger.verbose(`Running 'npm install --package-lock-only --no-audit --no-fund' in: ${packagePath}`);
|
|
559
559
|
await run('npm install --package-lock-only --no-audit --no-fund');
|
|
560
|
-
logger.verbose(
|
|
560
|
+
logger.verbose(`LINK_LOCK_PACKAGE_REGENERATED: Regenerated package-lock.json | Path: ${packagePath} | Status: updated`);
|
|
561
561
|
} finally{
|
|
562
562
|
process.chdir(originalCwd);
|
|
563
563
|
}
|
|
564
564
|
} catch (error) {
|
|
565
|
-
logger.warn(
|
|
565
|
+
logger.warn(`LINK_LOCK_PACKAGE_REGEN_FAILED: Failed to regenerate package-lock.json | Path: ${packagePath} | Error: ${error.message}`);
|
|
566
566
|
}
|
|
567
567
|
}
|
|
568
|
-
logger.info(
|
|
568
|
+
logger.info(`LINK_LOCK_ALL_REGENERATED: Regenerated package-lock.json files in all packages | Package Count: ${allConsumingPackages.size} | Status: completed`);
|
|
569
569
|
} else {
|
|
570
570
|
logger.info(`DRY RUN: Would run 'npm install --package-lock-only --no-audit --no-fund' to regenerate package-lock.json files in all packages`);
|
|
571
571
|
}
|
|
@@ -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 '@eldrforge/git-tools';\nimport {\n findAllPackageJsonFiles\n} from '../util/performance';\nimport { create as createStorage } from '../util/storage';\nimport { safeJsonParse, validatePackageJson } from '@eldrforge/git-tools';\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 (optional - continue even if this fails)\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.warn(`⚠️ Failed to self-link ${currentPackageJson.name}: ${error.message}`);\n logger.info(`Continuing with dependency linking despite self-link failure...`);\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 2.6: Handle external dependencies using scopeRoots configuration\n const scopeRoots = runConfig.link?.scopeRoots || {};\n const globallyLinkedViaScopeRoots: string[] = [];\n\n if (Object.keys(scopeRoots).length > 0 && externalDependencies.length > 0) {\n logger.info('Using scopeRoots configuration to discover and link external packages...');\n\n for (const depName of externalDependencies) {\n const depScope = depName.startsWith('@') ? depName.split('/')[0] : null;\n const scopeRoot = depScope ? scopeRoots[depScope] : null;\n\n if (scopeRoot) {\n logger.verbose(`Processing ${depName} with scope ${depScope} -> ${scopeRoot}`);\n\n // Convert relative path to absolute\n const absoluteScopeRoot = path.resolve(currentDir, scopeRoot);\n logger.verbose(`Scanning scope root directory: ${absoluteScopeRoot}`);\n\n try {\n // Look for package with matching name in the scope directory\n const expectedPackageName = depName.startsWith('@') ? depName.split('/')[1] : depName;\n const packageDir = path.join(absoluteScopeRoot, expectedPackageName);\n const packageJsonPath = path.join(packageDir, 'package.json');\n\n logger.verbose(`Checking for package at: ${packageDir}`);\n\n try {\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 === depName) {\n logger.info(`Found matching package: ${depName} at ${packageDir}`);\n\n if (isDryRun) {\n logger.info(`DRY RUN: Would run 'npm link' in: ${packageDir}`);\n globallyLinkedViaScopeRoots.push(depName);\n } else {\n // Step A: Run 'npm link' in the source package directory\n const originalCwd = process.cwd();\n try {\n process.chdir(packageDir);\n logger.verbose(`Running 'npm link' in source: ${packageDir}`);\n await run('npm link');\n logger.info(`✅ Source linked via scopeRoots: ${depName}`);\n globallyLinkedViaScopeRoots.push(depName);\n } catch (linkError: any) {\n logger.warn(`⚠️ Failed to link source package ${depName}: ${linkError.message}`);\n } finally {\n process.chdir(originalCwd);\n }\n }\n } else {\n logger.verbose(`Package name mismatch: expected ${depName}, found ${packageJson.name}`);\n }\n } catch (packageError: any) {\n logger.verbose(`Package not found or invalid: ${packageJsonPath} - ${packageError.message}`);\n }\n } catch (error: any) {\n logger.verbose(`Error processing scope ${depScope}: ${error.message}`);\n }\n } else {\n logger.verbose(`No scope root configured for ${depScope}`);\n }\n }\n\n if (globallyLinkedViaScopeRoots.length > 0) {\n logger.info(`Successfully prepared ${globallyLinkedViaScopeRoots.length} packages via scopeRoots: ${globallyLinkedViaScopeRoots.join(', ')}`);\n }\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","scopeRoots","globallyLinkedViaScopeRoots","depScope","scopeRoot","absoluteScopeRoot","resolve","expectedPackageName","originalCwd","chdir","linkError","packageError","globallyLinkedPackages","result","resultStr","stdout","directoryPaths","trim","line","dirPath","linkedCount","success","summary","linkedPackages","packagesToLink","pkg","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 '@eldrforge/git-tools';\nimport {\n findAllPackageJsonFiles\n} from '../util/performance';\nimport { create as createStorage } from '../util/storage';\nimport { safeJsonParse, validatePackageJson } from '@eldrforge/git-tools';\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(`LINKED_DEPS_CHECK_FAILED: Unable to check linked dependencies | Package: ${packageName} | Error: ${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(`SYMLINK_FIXING: Correcting symlink target | Path: ${targetPath} | Old Target: ${existingLink} | New Target: ${relativePath}`);\n await fs.unlink(targetPath);\n await fs.symlink(relativePath, targetPath, 'dir');\n logger.info(`SYMLINK_FIXED: Successfully updated symlink | Path: ${targetPath} | Target: ${relativePath} | Type: directory`);\n return true;\n }\n } else if (stats.isDirectory()) {\n // It's a directory, remove it\n logger.warn(`SYMLINK_DIRECTORY_CONFLICT: Removing existing directory to create symlink | Path: ${targetPath} | Type: directory | Action: Remove and replace with symlink`);\n await fs.rm(targetPath, { recursive: true, force: true });\n await fs.symlink(relativePath, targetPath, 'dir');\n logger.info(`SYMLINK_CREATED: Successfully created symlink after directory removal | Path: ${targetPath} | Target: ${relativePath} | Type: directory`);\n return true;\n } else {\n // It's a file, remove it\n logger.warn(`SYMLINK_FILE_CONFLICT: Removing existing file to create symlink | Path: ${targetPath} | Type: file | Action: Remove and replace with symlink`);\n await fs.unlink(targetPath);\n await fs.symlink(relativePath, targetPath, 'dir');\n logger.info(`SYMLINK_CREATED: Successfully created symlink after file removal | Path: ${targetPath} | Target: ${relativePath} | Type: directory`);\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(`SYMLINK_CREATE_FAILED: Unable to create symlink | Package: ${packageName} | Error: ${error.message} | Status: failed`);\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(`PACKAGE_JSON_PARSE_FAILED: Unable to parse package.json | Path: ${packageJsonLocation.path} | Error: ${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(`WORKSPACE_ANALYSIS: Analyzing single workspace directory | Path: ${targetDirectories[0]} | Purpose: Find linkable packages`);\n } else {\n logger.info(`WORKSPACE_ANALYSIS: Analyzing multiple workspace directories | Paths: ${targetDirectories.join(', ')} | Count: ${targetDirectories.length} | Purpose: Find linkable packages across workspaces`);\n }\n\n // If no package argument provided, use new smart same-scope linking behavior\n if (!packageArgument) {\n logger.info('LINK_SMART_MODE: Smart linking mode activated for current project | Mode: smart | Target: current directory | Purpose: Auto-link dependencies based on scope');\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 = `PACKAGE_JSON_NOT_FOUND: No valid package.json in current directory | Error: ${error.message} | Action: Cannot proceed with smart linking`;\n logger.error(message);\n return message;\n }\n\n if (!currentPackageJson.name) {\n const message = 'PACKAGE_NAME_MISSING: package.json must have a name field | Field: name | Requirement: Required for linking | Action: Add name field to package.json';\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 = 'PACKAGE_SCOPE_MISSING: Package must have scoped name for smart linking | Format Required: @scope/package | Current: ' + currentPackageJson.name + ' | Action: Use scoped package name';\n logger.warn(message);\n return message;\n }\n\n logger.info(`CURRENT_PACKAGE_IDENTIFIED: Current package identified for smart linking | Package: ${currentPackageJson.name} | Scope: ${currentScope} | Path: ${currentDir}`);\n\n // Step 1: Link the current package globally (optional - continue even if this fails)\n try {\n if (isDryRun) {\n logger.info(`SELF_LINK_DRY_RUN: Would link current package globally | Mode: dry-run | Package: ${currentPackageJson.name} | Command: npm link`);\n } else {\n logger.verbose(`SELF_LINK_STARTING: Registering package globally | Package: ${currentPackageJson.name} | Command: npm link | Purpose: Make available for dependency linking`);\n await run('npm link');\n logger.info(`SELF_LINK_SUCCESS: Current package linked globally | Package: ${currentPackageJson.name} | Location: Global npm | Purpose: Make available for linking`);\n }\n } catch (error: any) {\n logger.warn(`SELF_LINK_FAILED: Unable to self-link current package | Package: ${currentPackageJson.name} | Error: ${error.message} | Impact: Continuing with dependency linking`);\n logger.info(`LINK_CONTINUING: Proceeding with dependency linking despite self-link failure | Next: Link matching dependencies`);\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 2.6: Handle external dependencies using scopeRoots configuration\n const scopeRoots = runConfig.link?.scopeRoots || {};\n const globallyLinkedViaScopeRoots: string[] = [];\n\n if (Object.keys(scopeRoots).length > 0 && externalDependencies.length > 0) {\n logger.info('Using scopeRoots configuration to discover and link external packages...');\n\n for (const depName of externalDependencies) {\n const depScope = depName.startsWith('@') ? depName.split('/')[0] : null;\n const scopeRoot = depScope ? scopeRoots[depScope] : null;\n\n if (scopeRoot) {\n logger.verbose(`Processing ${depName} with scope ${depScope} -> ${scopeRoot}`);\n\n // Convert relative path to absolute\n const absoluteScopeRoot = path.resolve(currentDir, scopeRoot);\n logger.verbose(`Scanning scope root directory: ${absoluteScopeRoot}`);\n\n try {\n // Look for package with matching name in the scope directory\n const expectedPackageName = depName.startsWith('@') ? depName.split('/')[1] : depName;\n const packageDir = path.join(absoluteScopeRoot, expectedPackageName);\n const packageJsonPath = path.join(packageDir, 'package.json');\n\n logger.verbose(`Checking for package at: ${packageDir}`);\n\n try {\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 === depName) {\n logger.info(`Found matching package: ${depName} at ${packageDir}`);\n\n if (isDryRun) {\n logger.info(`DRY RUN: Would run 'npm link' in: ${packageDir}`);\n globallyLinkedViaScopeRoots.push(depName);\n } else {\n // Step A: Run 'npm link' in the source package directory\n const originalCwd = process.cwd();\n try {\n process.chdir(packageDir);\n logger.verbose(`Running 'npm link' in source: ${packageDir}`);\n await run('npm link');\n logger.info(`LINK_SOURCE_SCOPE_ROOTS: Source linked via scopeRoots | Package: ${depName} | Method: scopeRoots | Status: linked`);\n globallyLinkedViaScopeRoots.push(depName);\n } catch (linkError: any) {\n logger.warn(`LINK_SOURCE_FAILED: Failed to link source package | Package: ${depName} | Error: ${linkError.message}`);\n } finally {\n process.chdir(originalCwd);\n }\n }\n } else {\n logger.verbose(`Package name mismatch: expected ${depName}, found ${packageJson.name}`);\n }\n } catch (packageError: any) {\n logger.verbose(`Package not found or invalid: ${packageJsonPath} - ${packageError.message}`);\n }\n } catch (error: any) {\n logger.verbose(`Error processing scope ${depScope}: ${error.message}`);\n }\n } else {\n logger.verbose(`No scope root configured for ${depScope}`);\n }\n }\n\n if (globallyLinkedViaScopeRoots.length > 0) {\n logger.info(`Successfully prepared ${globallyLinkedViaScopeRoots.length} packages via scopeRoots: ${globallyLinkedViaScopeRoots.join(', ')}`);\n }\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(`LINK_DEPENDENCY_SUCCESS: Linked dependency successfully | Dependency: ${depName} | Status: symlink-created`);\n linkedDependencies.push(depName);\n } else {\n logger.warn(`LINK_DEPENDENCY_FAILED: Failed to link dependency | Dependency: ${depName} | Status: failed`);\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(`LINK_LOCK_REGENERATED: Regenerated package-lock.json successfully | File: package-lock.json | Status: updated`);\n }\n } catch (error: any) {\n logger.warn(`LINK_LOCK_REGEN_FAILED: Failed to regenerate package-lock.json | Error: ${error.message} | Impact: Lock file may be out of sync`);\n }\n\n logger.info(summary);\n return summary;\n }\n\n // New scope-based linking behavior\n logger.info(`LINK_SCOPE_MODE: Linking scope or specific package | Target: ${packageArgument} | Mode: scope-based | Purpose: Link packages by scope`);\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(`LINK_SOURCE_SUCCESS: Source package linked globally | Package: ${pkg.name} | Status: linked`);\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(`LINK_CONSUMER_SUCCESS: Consumer linked to package | Consumer: ${consumer.name} | Package: ${pkg.name} | Status: linked`);\n }\n } finally {\n process.chdir(consumerOriginalCwd);\n }\n } catch (error: any) {\n logger.error(`LINK_CONSUMER_FAILED: Failed to link package in consumer | Package: ${pkg.name} | Consumer: ${consumer.name} | Error: ${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(`LINK_SOURCE_PACKAGE_FAILED: Failed to link source package | Package: ${pkg.name} | Error: ${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(`LINK_LOCK_REGENERATING_ALL: Regenerating package-lock.json files in all packages | Mode: lockfile-only | Purpose: Update lock files after linking`);\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(`LINK_LOCK_PACKAGE_REGENERATED: Regenerated package-lock.json | Path: ${packagePath} | Status: updated`);\n } finally {\n process.chdir(originalCwd);\n }\n } catch (error: any) {\n logger.warn(`LINK_LOCK_PACKAGE_REGEN_FAILED: Failed to regenerate package-lock.json | Path: ${packagePath} | Error: ${error.message}`);\n }\n }\n\n logger.info(`LINK_LOCK_ALL_REGENERATED: Regenerated package-lock.json files in all packages | Package Count: ${allConsumingPackages.size} | Status: completed`);\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","scopeRoots","globallyLinkedViaScopeRoots","depScope","scopeRoot","absoluteScopeRoot","resolve","expectedPackageName","originalCwd","chdir","linkError","packageError","globallyLinkedPackages","result","resultStr","stdout","directoryPaths","trim","line","dirPath","linkedCount","success","summary","linkedPackages","packagesToLink","pkg","consumer","consumerOriginalCwd","runSecure","allConsumingPackages","Set","forEach","add","size","getLogger","packageStatuses","output","packageStatus","dep","type","execute","finalPackageArgument"],"mappings":"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"}
|