@eldrforge/kodrdriv 1.2.2 → 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.
@@ -3,7 +3,127 @@ import { create } from '../util/storage.js';
3
3
  import { run, runSecure } from '../util/child.js';
4
4
  import { findAllPackageJsonFiles } from '../util/performance.js';
5
5
  import { safeJsonParse, validatePackageJson } from '../util/validation.js';
6
+ import fs__default from 'fs/promises';
7
+ import path__default from 'path';
6
8
 
9
+ // Helper function to check if a dependency matches any external unlink patterns
10
+ const matchesExternalUnlinkPattern = (dependencyName, externalUnlinkPatterns)=>{
11
+ if (!externalUnlinkPatterns || externalUnlinkPatterns.length === 0) {
12
+ return false;
13
+ }
14
+ return externalUnlinkPatterns.some((pattern)=>{
15
+ // Simple string matching - could be enhanced with glob patterns later
16
+ return dependencyName === pattern || dependencyName.startsWith(pattern);
17
+ });
18
+ };
19
+ // Helper function to check if a path is a symbolic link
20
+ const isSymbolicLink = async (filePath)=>{
21
+ try {
22
+ const stats = await fs__default.lstat(filePath);
23
+ return stats.isSymbolicLink();
24
+ } catch {
25
+ return false;
26
+ }
27
+ };
28
+ // Helper function to get the target of a symbolic link
29
+ const getSymbolicLinkTarget = async (filePath)=>{
30
+ try {
31
+ const target = await fs__default.readlink(filePath);
32
+ return target;
33
+ } catch {
34
+ return null;
35
+ }
36
+ };
37
+ // Helper function to find all linked dependencies in a package
38
+ const findLinkedDependencies = async (packagePath, packageName, storage, logger)=>{
39
+ const linkedDependencies = [];
40
+ try {
41
+ const packageJsonPath = path__default.join(packagePath, 'package.json');
42
+ const packageJsonContent = await storage.readFile(packageJsonPath, 'utf-8');
43
+ const parsed = safeJsonParse(packageJsonContent, packageJsonPath);
44
+ const packageJson = validatePackageJson(parsed, packageJsonPath);
45
+ const allDependencies = {
46
+ ...packageJson.dependencies,
47
+ ...packageJson.devDependencies
48
+ };
49
+ const nodeModulesPath = path__default.join(packagePath, 'node_modules');
50
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
51
+ for (const [dependencyName, version] of Object.entries(allDependencies)){
52
+ let dependencyPath;
53
+ if (dependencyName.startsWith('@')) {
54
+ // Scoped package
55
+ const [scope, name] = dependencyName.split('/');
56
+ dependencyPath = path__default.join(nodeModulesPath, scope, name);
57
+ } else {
58
+ // Unscoped package
59
+ dependencyPath = path__default.join(nodeModulesPath, dependencyName);
60
+ }
61
+ if (await isSymbolicLink(dependencyPath)) {
62
+ const target = await getSymbolicLinkTarget(dependencyPath);
63
+ if (target) {
64
+ // Determine if this is an external dependency (not in the same workspace)
65
+ const isExternal = !target.includes('node_modules') || target.startsWith('..');
66
+ linkedDependencies.push({
67
+ dependencyName,
68
+ targetPath: target,
69
+ isExternal
70
+ });
71
+ }
72
+ }
73
+ }
74
+ } catch (error) {
75
+ logger.warn(`Failed to check linked dependencies in ${packageName}: ${error.message}`);
76
+ }
77
+ return linkedDependencies;
78
+ };
79
+ // Helper function to remove symbolic links manually
80
+ const removeSymbolicLink = async (packageName, targetDir, logger, isDryRun = false)=>{
81
+ try {
82
+ // Parse package name to get scope and name parts
83
+ const [scope, name] = packageName.startsWith('@') ? packageName.split('/') : [
84
+ null,
85
+ packageName
86
+ ];
87
+ // Create the target path structure
88
+ const nodeModulesPath = path__default.join(targetDir, 'node_modules');
89
+ let targetPath;
90
+ if (scope) {
91
+ // Scoped package: node_modules/@scope/name
92
+ targetPath = path__default.join(nodeModulesPath, scope, name);
93
+ } else {
94
+ // Unscoped package: node_modules/name
95
+ targetPath = path__default.join(nodeModulesPath, name);
96
+ }
97
+ if (isDryRun) {
98
+ logger.verbose(`DRY RUN: Would check and remove symlink: ${targetPath}`);
99
+ return true;
100
+ }
101
+ // Check if something exists at the target path
102
+ try {
103
+ const stats = await fs__default.lstat(targetPath); // Use lstat to not follow symlinks
104
+ if (stats.isSymbolicLink()) {
105
+ // It's a symlink, remove it
106
+ await fs__default.unlink(targetPath);
107
+ logger.verbose(`Removed symlink: ${targetPath}`);
108
+ return true;
109
+ } else {
110
+ logger.verbose(`Target exists but is not a symlink: ${targetPath}`);
111
+ return false;
112
+ }
113
+ } catch (error) {
114
+ if (error.code === 'ENOENT') {
115
+ // Nothing exists at target path, nothing to remove
116
+ logger.verbose(`No symlink found at: ${targetPath}`);
117
+ return true;
118
+ } else {
119
+ throw error; // Re-throw unexpected errors
120
+ }
121
+ }
122
+ } catch (error) {
123
+ logger.warn(`Failed to remove symlink for ${packageName}: ${error.message}`);
124
+ return false;
125
+ }
126
+ };
7
127
  // Helper function to parse package names and scopes (same as link command)
8
128
  const parsePackageArgument = (packageArg)=>{
9
129
  if (packageArg.startsWith('@')) {
@@ -98,6 +218,10 @@ const executeInternal = async (runConfig, packageArgument)=>{
98
218
  const storage = create({
99
219
  log: logger.info
100
220
  });
221
+ // Check if this is a status command
222
+ if (packageArgument === 'status') {
223
+ return await executeStatus(runConfig);
224
+ }
101
225
  // Get target directories from config, default to current directory
102
226
  const targetDirectories = ((_runConfig_tree = runConfig.tree) === null || _runConfig_tree === void 0 ? void 0 : _runConfig_tree.directories) || [
103
227
  process.cwd()
@@ -109,7 +233,7 @@ const executeInternal = async (runConfig, packageArgument)=>{
109
233
  }
110
234
  // If no package argument provided, implement new behavior for current project
111
235
  if (!packageArgument) {
112
- var _runConfig_unlink1;
236
+ var _runConfig_unlink1, _runConfig_unlink2;
113
237
  logger.info('🔓 Unlinking current project...');
114
238
  const currentDir = process.cwd();
115
239
  const packageJsonPath = `${currentDir}/package.json`;
@@ -136,18 +260,53 @@ const executeInternal = async (runConfig, packageArgument)=>{
136
260
  }
137
261
  logger.info(`Processing package: ${packageName}`);
138
262
  const cleanNodeModules = ((_runConfig_unlink1 = runConfig.unlink) === null || _runConfig_unlink1 === void 0 ? void 0 : _runConfig_unlink1.cleanNodeModules) || false;
263
+ const externalUnlinkPatterns = ((_runConfig_unlink2 = runConfig.unlink) === null || _runConfig_unlink2 === void 0 ? void 0 : _runConfig_unlink2.externals) || [];
264
+ // Step 0: Handle external dependencies if patterns are specified
265
+ if (externalUnlinkPatterns.length > 0) {
266
+ logger.info(`Step 0: Processing external dependencies matching patterns: ${externalUnlinkPatterns.join(', ')}`);
267
+ // Read package.json to get dependencies
268
+ const packageJsonContent = await storage.readFile(packageJsonPath, 'utf-8');
269
+ const parsed = safeJsonParse(packageJsonContent, packageJsonPath);
270
+ const packageJson = validatePackageJson(parsed, packageJsonPath);
271
+ const allDependencies = {
272
+ ...packageJson.dependencies,
273
+ ...packageJson.devDependencies
274
+ };
275
+ const externalDependencies = Object.keys(allDependencies).filter((depName)=>matchesExternalUnlinkPattern(depName, externalUnlinkPatterns));
276
+ if (externalDependencies.length > 0) {
277
+ logger.info(`Found ${externalDependencies.length} external dependencies to unlink: ${externalDependencies.join(', ')}`);
278
+ for (const depName of externalDependencies){
279
+ try {
280
+ const success = await removeSymbolicLink(depName, currentDir, logger, isDryRun);
281
+ if (success) {
282
+ logger.info(`✅ Unlinked external dependency: ${depName}`);
283
+ } else {
284
+ logger.warn(`⚠️ Failed to unlink external dependency: ${depName}`);
285
+ }
286
+ } catch (error) {
287
+ logger.warn(`⚠️ Error unlinking external dependency ${depName}: ${error.message}`);
288
+ }
289
+ }
290
+ } else {
291
+ logger.info('No external dependencies found matching the specified patterns');
292
+ }
293
+ }
139
294
  if (isDryRun) {
140
- logger.info(`DRY RUN: Would execute unlink steps for ${packageName}:`);
141
- logger.info(` 1. npm unlink -g`);
295
+ let dryRunMessage = `DRY RUN: Would execute unlink steps for ${packageName}:\n`;
296
+ if (externalUnlinkPatterns.length > 0) {
297
+ dryRunMessage += ` 0. Unlink external dependencies matching patterns: ${externalUnlinkPatterns.join(', ')}\n`;
298
+ }
299
+ dryRunMessage += ` 1. npm unlink -g\n`;
142
300
  if (cleanNodeModules) {
143
- logger.info(` 2. rm -rf node_modules package-lock.json`);
144
- logger.info(` 3. npm install`);
145
- logger.info(` 4. Check for remaining links with npm ls --link`);
301
+ dryRunMessage += ` 2. rm -rf node_modules package-lock.json\n`;
302
+ dryRunMessage += ` 3. npm install\n`;
303
+ dryRunMessage += ` 4. Check for remaining links with npm ls --link`;
146
304
  } else {
147
- logger.info(` 2. Check for remaining links with npm ls --link`);
148
- logger.info(` Note: Use --clean-node-modules flag to also clean and reinstall dependencies`);
305
+ dryRunMessage += ` 2. Check for remaining links with npm ls --link\n`;
306
+ dryRunMessage += ` Note: Use --clean-node-modules flag to also clean and reinstall dependencies`;
149
307
  }
150
- return `DRY RUN: Would execute unlink steps for ${packageName}`;
308
+ logger.info(dryRunMessage);
309
+ return dryRunMessage;
151
310
  }
152
311
  // Step 1: Remove global link
153
312
  logger.info('Step 1: Removing global link...');
@@ -297,11 +456,80 @@ const executeInternal = async (runConfig, packageArgument)=>{
297
456
  logger.info(summary);
298
457
  return summary;
299
458
  };
459
+ // Status function to show what's currently linked (same as link command)
460
+ const executeStatus = async (runConfig)=>{
461
+ var _runConfig_tree;
462
+ const logger = getLogger();
463
+ const storage = create({
464
+ log: logger.info
465
+ });
466
+ // Get target directories from config, default to current directory
467
+ const targetDirectories = ((_runConfig_tree = runConfig.tree) === null || _runConfig_tree === void 0 ? void 0 : _runConfig_tree.directories) || [
468
+ process.cwd()
469
+ ];
470
+ if (targetDirectories.length === 1) {
471
+ logger.info(`🔍 Checking link status in: ${targetDirectories[0]}`);
472
+ } else {
473
+ logger.info(`🔍 Checking link status in: ${targetDirectories.join(', ')}`);
474
+ }
475
+ // Find all packages in the workspace
476
+ let allPackageJsonFiles = [];
477
+ for (const targetDirectory of targetDirectories){
478
+ const packageJsonFiles = await findAllPackageJsonFiles(targetDirectory, storage);
479
+ allPackageJsonFiles = allPackageJsonFiles.concat(packageJsonFiles);
480
+ }
481
+ const packageStatuses = [];
482
+ for (const packageJsonLocation of allPackageJsonFiles){
483
+ const packageDir = packageJsonLocation.path.replace('/package.json', '');
484
+ try {
485
+ const packageJsonContent = await storage.readFile(packageJsonLocation.path, 'utf-8');
486
+ const parsed = safeJsonParse(packageJsonContent, packageJsonLocation.path);
487
+ const packageJson = validatePackageJson(parsed, packageJsonLocation.path);
488
+ if (!packageJson.name) continue;
489
+ const linkedDependencies = await findLinkedDependencies(packageDir, packageJson.name, storage, logger);
490
+ if (linkedDependencies.length > 0) {
491
+ packageStatuses.push({
492
+ name: packageJson.name,
493
+ path: packageDir,
494
+ linkedDependencies
495
+ });
496
+ }
497
+ } catch (error) {
498
+ logger.warn(`Failed to parse ${packageJsonLocation.path}: ${error.message}`);
499
+ }
500
+ }
501
+ if (packageStatuses.length === 0) {
502
+ return 'No linked dependencies found in workspace.';
503
+ }
504
+ // Format the output
505
+ let output = `Found ${packageStatuses.length} package(s) with linked dependencies:\n\n`;
506
+ for (const packageStatus of packageStatuses){
507
+ output += `📦 ${packageStatus.name}\n`;
508
+ output += ` Path: ${packageStatus.path}\n`;
509
+ if (packageStatus.linkedDependencies.length > 0) {
510
+ output += ` Linked dependencies:\n`;
511
+ for (const dep of packageStatus.linkedDependencies){
512
+ const type = dep.isExternal ? '🔗 External' : '🔗 Internal';
513
+ output += ` ${type} ${dep.dependencyName} -> ${dep.targetPath}\n`;
514
+ }
515
+ }
516
+ output += '\n';
517
+ }
518
+ return output;
519
+ };
300
520
  const execute = async (runConfig, packageArgument)=>{
301
521
  try {
302
522
  var _runConfig_unlink;
523
+ // Check if this is a status command from direct parameter
524
+ if (packageArgument === 'status') {
525
+ return await executeStatus(runConfig);
526
+ }
303
527
  // Use packageArgument from runConfig if not provided as parameter
304
528
  const finalPackageArgument = packageArgument || ((_runConfig_unlink = runConfig.unlink) === null || _runConfig_unlink === void 0 ? void 0 : _runConfig_unlink.packageArgument);
529
+ // Check if this is a status command from config
530
+ if (finalPackageArgument === 'status') {
531
+ return await executeStatus(runConfig);
532
+ }
305
533
  return await executeInternal(runConfig, finalPackageArgument);
306
534
  } catch (error) {
307
535
  const logger = getLogger();
@@ -310,5 +538,5 @@ const execute = async (runConfig, packageArgument)=>{
310
538
  }
311
539
  };
312
540
 
313
- export { execute };
541
+ export { execute, findLinkedDependencies, getSymbolicLinkTarget, isSymbolicLink, matchesExternalUnlinkPattern, parsePackageArgument, removeSymbolicLink };
314
542
  //# sourceMappingURL=unlink.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"unlink.js","sources":["../../src/commands/unlink.ts"],"sourcesContent":["import { getDryRunLogger, getLogger } from '../logging';\nimport { Config } from '../types';\nimport { create as createStorage } from '../util/storage';\nimport { run, runSecure } from '../util/child';\nimport {\n findAllPackageJsonFiles\n} from '../util/performance';\nimport { safeJsonParse, validatePackageJson } from '../util/validation';\n\n// Helper function to parse package names and scopes (same as link command)\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.unlink?.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, implement new behavior for current project\n if (!packageArgument) {\n logger.info('🔓 Unlinking current project...');\n\n const currentDir = process.cwd();\n const packageJsonPath = `${currentDir}/package.json`;\n\n // Check if we're in a directory with package.json\n if (!(await storage.exists(packageJsonPath))) {\n const message = `No package.json found in current directory: ${currentDir}`;\n logger.warn(message);\n return message;\n }\n\n // Parse package.json to get package name\n let packageName: string;\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) {\n throw new Error('package.json has no name field');\n }\n packageName = packageJson.name;\n } catch (error: any) {\n const message = `Failed to parse package.json: ${error.message}`;\n logger.error(message);\n return message;\n }\n\n logger.info(`Processing package: ${packageName}`);\n\n const cleanNodeModules = runConfig.unlink?.cleanNodeModules || false;\n\n\n\n if (isDryRun) {\n logger.info(`DRY RUN: Would execute unlink steps for ${packageName}:`);\n logger.info(` 1. npm unlink -g`);\n if (cleanNodeModules) {\n logger.info(` 2. rm -rf node_modules package-lock.json`);\n logger.info(` 3. npm install`);\n logger.info(` 4. Check for remaining links with npm ls --link`);\n } else {\n logger.info(` 2. Check for remaining links with npm ls --link`);\n logger.info(` Note: Use --clean-node-modules flag to also clean and reinstall dependencies`);\n }\n return `DRY RUN: Would execute unlink steps for ${packageName}`;\n }\n\n // Step 1: Remove global link\n logger.info('Step 1: Removing global link...');\n try {\n await run('npm unlink -g');\n logger.info('✅ Global link removed');\n } catch (error: any) {\n // This might fail if the package wasn't globally linked, which is OK\n logger.warn(`⚠️ Failed to remove global link (this is OK if package wasn't linked): ${error.message}`);\n }\n\n if (cleanNodeModules) {\n // Step 2: Clean node_modules and package-lock.json\n logger.info('Step 2: Cleaning node_modules and package-lock.json...');\n try {\n await run('rm -rf node_modules package-lock.json');\n logger.info('✅ Cleaned node_modules and package-lock.json');\n } catch (error: any) {\n logger.warn(`⚠️ Failed to clean node_modules/package-lock.json: ${error.message}`);\n }\n\n // Step 3: Install dependencies\n logger.info('Step 3: Installing dependencies...');\n try {\n await run('npm install');\n logger.info('✅ Dependencies installed');\n } catch (error: any) {\n logger.error(`❌ Failed to install dependencies: ${error.message}`);\n throw error;\n }\n\n // Step 4: Check for remaining links (suppress output and errors)\n logger.info('Step 4: Checking for remaining links...');\n } else {\n // Step 2: Check for remaining links (suppress output and errors)\n logger.info('Step 2: Checking for remaining links...');\n logger.info('Note: Use --clean-node-modules flag to also clean and reinstall dependencies');\n }\n\n try {\n // Use child_process directly to suppress logging and get JSON output\n const util = await import('util');\n const child_process = await import('child_process');\n const execPromise = util.promisify(child_process.exec);\n\n const result = await execPromise('npm ls --link --json');\n\n // Parse JSON output to check for links to packages in the same scope\n const packageScope = packageName.includes('/') ? packageName.split('/')[0] : null;\n\n if (packageScope && result.stdout.trim()) {\n try {\n const linksData = safeJsonParse(result.stdout, 'npm ls output after unlink');\n const linkedPackages = Object.keys(linksData.dependencies || {});\n const scopeLinkedPackages = linkedPackages.filter(pkg => pkg.startsWith(packageScope + '/'));\n\n if (scopeLinkedPackages.length > 0) {\n logger.warn(`⚠️ Found remaining links to packages in scope ${packageScope}: ${scopeLinkedPackages.join(', ')}`);\n logger.verbose('This may be expected if other packages in your workspace are still linked');\n } else {\n logger.info('✅ No problematic links found');\n }\n } catch {\n // If JSON parsing fails, fall back to basic check\n logger.verbose('Failed to parse npm ls --link --json output, using basic check');\n if (result.stdout.includes(packageScope)) {\n logger.warn(`⚠️ Found remaining links to packages in scope ${packageScope}`);\n logger.verbose('This may be expected if other packages in your workspace are still linked');\n } else {\n logger.info('✅ No problematic links found');\n }\n }\n } else {\n logger.info('✅ No problematic links found');\n }\n } catch {\n // npm ls --link returns non-zero when there are no links, which is what we want\n // So we only log this at verbose level\n logger.verbose('npm ls --link check completed (non-zero exit is expected when no links exist)');\n }\n\n const summary = `Successfully unlinked ${packageName}`;\n logger.info(summary);\n return summary;\n }\n\n // New scope-based unlinking behavior\n logger.info(`🔓 Unlinking 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 unlinkedPackages: string[] = [];\n\n // If specific package name provided, use that; otherwise unlink all packages in scope\n const packagesToUnlink = packageName\n ? matchingPackages.filter(pkg => pkg.name === packageName)\n : matchingPackages;\n\n for (const pkg of packagesToUnlink) {\n logger.info(`Processing package: ${pkg.name}`);\n\n // Step A: Find all packages that depend on this package and unlink them first\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 unlink ${pkg.name}' in: ${consumer.path}`);\n } else {\n logger.verbose(`Running 'npm unlink ${pkg.name}' in consumer: ${consumer.path}`);\n await runSecure('npm', ['unlink', pkg.name]);\n logger.info(`✅ Consumer unlinked: ${consumer.name} -/-> ${pkg.name}`);\n }\n } finally {\n process.chdir(consumerOriginalCwd);\n }\n } catch (error: any) {\n // npm unlink can fail if package wasn't linked, but that's OK\n logger.warn(`⚠️ Failed to unlink ${pkg.name} in ${consumer.name}: ${error.message}`);\n }\n }\n }\n\n // Step B: Run 'npm unlink' 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 unlink' in: ${pkg.path}`);\n } else {\n logger.verbose(`Running 'npm unlink' in source: ${pkg.path}`);\n await run('npm unlink');\n logger.info(`✅ Source unlinked: ${pkg.name}`);\n }\n } finally {\n process.chdir(originalCwd);\n }\n\n unlinkedPackages.push(pkg.name);\n } catch (error: any) {\n // npm unlink can fail if package wasn't linked, but that's OK\n logger.warn(`⚠️ Failed to unlink source package ${pkg.name}: ${error.message}`);\n unlinkedPackages.push(pkg.name); // Still count as success\n }\n }\n\n const summary = `Successfully unlinked ${unlinkedPackages.length} package(s): ${unlinkedPackages.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.unlink?.packageArgument;\n return await executeInternal(runConfig, finalPackageArgument);\n } catch (error: any) {\n const logger = getLogger();\n logger.error(`unlink failed: ${error.message}`);\n throw error;\n }\n};\n"],"names":["parsePackageArgument","packageArg","startsWith","parts","split","length","scope","packageName","Error","findMatchingPackages","targetDirectories","storage","logger","matchingPackages","allPackageJsonFiles","targetDirectory","packageJsonFiles","findAllPackageJsonFiles","concat","packageJsonLocation","packageDir","path","replace","packageJsonContent","readFile","parsed","safeJsonParse","packageJson","validatePackageJson","name","isInScope","isExactMatch","push","isSource","error","warn","message","findConsumingPackages","targetPackageName","consumingPackages","dependencyTypes","hasDependency","some","depType","executeInternal","runConfig","packageArgument","isDryRun","dryRun","unlink","getDryRunLogger","createStorage","log","info","tree","directories","process","cwd","join","currentDir","packageJsonPath","exists","cleanNodeModules","run","util","child_process","execPromise","promisify","exec","result","packageScope","includes","stdout","trim","linksData","linkedPackages","Object","keys","dependencies","scopeLinkedPackages","filter","pkg","verbose","summary","unlinkedPackages","packagesToUnlink","consumer","consumerOriginalCwd","chdir","runSecure","originalCwd","execute","finalPackageArgument","getLogger"],"mappings":"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"}
1
+ {"version":3,"file":"unlink.js","sources":["../../src/commands/unlink.ts"],"sourcesContent":["import { getDryRunLogger, getLogger } from '../logging';\nimport { Config } from '../types';\nimport { create as createStorage } from '../util/storage';\nimport { run, runSecure } from '../util/child';\nimport {\n findAllPackageJsonFiles\n} from '../util/performance';\nimport { safeJsonParse, validatePackageJson } from '../util/validation';\nimport fs from 'fs/promises';\nimport path from 'path';\n\n// Helper function to check if a dependency matches any external unlink patterns\nexport const matchesExternalUnlinkPattern = (dependencyName: string, externalUnlinkPatterns: string[]): boolean => {\n if (!externalUnlinkPatterns || externalUnlinkPatterns.length === 0) {\n return false;\n }\n\n return externalUnlinkPatterns.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 check if a path is a symbolic link\nexport const 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\nexport const 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\nexport const 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 remove symbolic links manually\nexport const removeSymbolicLink = async (\n packageName: 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 targetPath = path.join(nodeModulesPath, scope, name);\n } else {\n // Unscoped package: node_modules/name\n targetPath = path.join(nodeModulesPath, name);\n }\n\n if (isDryRun) {\n logger.verbose(`DRY RUN: Would check and remove symlink: ${targetPath}`);\n return true;\n }\n\n // Check if something 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, remove it\n await fs.unlink(targetPath);\n logger.verbose(`Removed symlink: ${targetPath}`);\n return true;\n } else {\n logger.verbose(`Target exists but is not a symlink: ${targetPath}`);\n return false;\n }\n } catch (error: any) {\n if (error.code === 'ENOENT') {\n // Nothing exists at target path, nothing to remove\n logger.verbose(`No symlink found at: ${targetPath}`);\n return true;\n } else {\n throw error; // Re-throw unexpected errors\n }\n }\n } catch (error: any) {\n logger.warn(`Failed to remove symlink for ${packageName}: ${error.message}`);\n return false;\n }\n};\n\n// Helper function to parse package names and scopes (same as link command)\nexport const 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.unlink?.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, implement new behavior for current project\n if (!packageArgument) {\n logger.info('🔓 Unlinking current project...');\n\n const currentDir = process.cwd();\n const packageJsonPath = `${currentDir}/package.json`;\n\n // Check if we're in a directory with package.json\n if (!(await storage.exists(packageJsonPath))) {\n const message = `No package.json found in current directory: ${currentDir}`;\n logger.warn(message);\n return message;\n }\n\n // Parse package.json to get package name\n let packageName: string;\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) {\n throw new Error('package.json has no name field');\n }\n packageName = packageJson.name;\n } catch (error: any) {\n const message = `Failed to parse package.json: ${error.message}`;\n logger.error(message);\n return message;\n }\n\n logger.info(`Processing package: ${packageName}`);\n\n const cleanNodeModules = runConfig.unlink?.cleanNodeModules || false;\n const externalUnlinkPatterns = runConfig.unlink?.externals || [];\n\n // Step 0: Handle external dependencies if patterns are specified\n if (externalUnlinkPatterns.length > 0) {\n logger.info(`Step 0: Processing external dependencies matching patterns: ${externalUnlinkPatterns.join(', ')}`);\n\n // Read package.json to get dependencies\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 externalDependencies = Object.keys(allDependencies).filter(depName =>\n matchesExternalUnlinkPattern(depName, externalUnlinkPatterns)\n );\n\n if (externalDependencies.length > 0) {\n logger.info(`Found ${externalDependencies.length} external dependencies to unlink: ${externalDependencies.join(', ')}`);\n\n for (const depName of externalDependencies) {\n try {\n const success = await removeSymbolicLink(depName, currentDir, logger, isDryRun);\n if (success) {\n logger.info(`✅ Unlinked external dependency: ${depName}`);\n } else {\n logger.warn(`⚠️ Failed to unlink external dependency: ${depName}`);\n }\n } catch (error: any) {\n logger.warn(`⚠️ Error unlinking external dependency ${depName}: ${error.message}`);\n }\n }\n } else {\n logger.info('No external dependencies found matching the specified patterns');\n }\n }\n\n if (isDryRun) {\n let dryRunMessage = `DRY RUN: Would execute unlink steps for ${packageName}:\\n`;\n if (externalUnlinkPatterns.length > 0) {\n dryRunMessage += ` 0. Unlink external dependencies matching patterns: ${externalUnlinkPatterns.join(', ')}\\n`;\n }\n dryRunMessage += ` 1. npm unlink -g\\n`;\n if (cleanNodeModules) {\n dryRunMessage += ` 2. rm -rf node_modules package-lock.json\\n`;\n dryRunMessage += ` 3. npm install\\n`;\n dryRunMessage += ` 4. Check for remaining links with npm ls --link`;\n } else {\n dryRunMessage += ` 2. Check for remaining links with npm ls --link\\n`;\n dryRunMessage += ` Note: Use --clean-node-modules flag to also clean and reinstall dependencies`;\n }\n\n logger.info(dryRunMessage);\n return dryRunMessage;\n }\n\n // Step 1: Remove global link\n logger.info('Step 1: Removing global link...');\n try {\n await run('npm unlink -g');\n logger.info('✅ Global link removed');\n } catch (error: any) {\n // This might fail if the package wasn't globally linked, which is OK\n logger.warn(`⚠️ Failed to remove global link (this is OK if package wasn't linked): ${error.message}`);\n }\n\n if (cleanNodeModules) {\n // Step 2: Clean node_modules and package-lock.json\n logger.info('Step 2: Cleaning node_modules and package-lock.json...');\n try {\n await run('rm -rf node_modules package-lock.json');\n logger.info('✅ Cleaned node_modules and package-lock.json');\n } catch (error: any) {\n logger.warn(`⚠️ Failed to clean node_modules/package-lock.json: ${error.message}`);\n }\n\n // Step 3: Install dependencies\n logger.info('Step 3: Installing dependencies...');\n try {\n await run('npm install');\n logger.info('✅ Dependencies installed');\n } catch (error: any) {\n logger.error(`❌ Failed to install dependencies: ${error.message}`);\n throw error;\n }\n\n // Step 4: Check for remaining links (suppress output and errors)\n logger.info('Step 4: Checking for remaining links...');\n } else {\n // Step 2: Check for remaining links (suppress output and errors)\n logger.info('Step 2: Checking for remaining links...');\n logger.info('Note: Use --clean-node-modules flag to also clean and reinstall dependencies');\n }\n\n try {\n // Use child_process directly to suppress logging and get JSON output\n const util = await import('util');\n const child_process = await import('child_process');\n const execPromise = util.promisify(child_process.exec);\n\n const result = await execPromise('npm ls --link --json');\n\n // Parse JSON output to check for links to packages in the same scope\n const packageScope = packageName.includes('/') ? packageName.split('/')[0] : null;\n\n if (packageScope && result.stdout.trim()) {\n try {\n const linksData = safeJsonParse(result.stdout, 'npm ls output after unlink');\n const linkedPackages = Object.keys(linksData.dependencies || {});\n const scopeLinkedPackages = linkedPackages.filter(pkg => pkg.startsWith(packageScope + '/'));\n\n if (scopeLinkedPackages.length > 0) {\n logger.warn(`⚠️ Found remaining links to packages in scope ${packageScope}: ${scopeLinkedPackages.join(', ')}`);\n logger.verbose('This may be expected if other packages in your workspace are still linked');\n } else {\n logger.info('✅ No problematic links found');\n }\n } catch {\n // If JSON parsing fails, fall back to basic check\n logger.verbose('Failed to parse npm ls --link --json output, using basic check');\n if (result.stdout.includes(packageScope)) {\n logger.warn(`⚠️ Found remaining links to packages in scope ${packageScope}`);\n logger.verbose('This may be expected if other packages in your workspace are still linked');\n } else {\n logger.info('✅ No problematic links found');\n }\n }\n } else {\n logger.info('✅ No problematic links found');\n }\n } catch {\n // npm ls --link returns non-zero when there are no links, which is what we want\n // So we only log this at verbose level\n logger.verbose('npm ls --link check completed (non-zero exit is expected when no links exist)');\n }\n\n const summary = `Successfully unlinked ${packageName}`;\n logger.info(summary);\n return summary;\n }\n\n // New scope-based unlinking behavior\n logger.info(`🔓 Unlinking 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 unlinkedPackages: string[] = [];\n\n // If specific package name provided, use that; otherwise unlink all packages in scope\n const packagesToUnlink = packageName\n ? matchingPackages.filter(pkg => pkg.name === packageName)\n : matchingPackages;\n\n for (const pkg of packagesToUnlink) {\n logger.info(`Processing package: ${pkg.name}`);\n\n // Step A: Find all packages that depend on this package and unlink them first\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 unlink ${pkg.name}' in: ${consumer.path}`);\n } else {\n logger.verbose(`Running 'npm unlink ${pkg.name}' in consumer: ${consumer.path}`);\n await runSecure('npm', ['unlink', pkg.name]);\n logger.info(`✅ Consumer unlinked: ${consumer.name} -/-> ${pkg.name}`);\n }\n } finally {\n process.chdir(consumerOriginalCwd);\n }\n } catch (error: any) {\n // npm unlink can fail if package wasn't linked, but that's OK\n logger.warn(`⚠️ Failed to unlink ${pkg.name} in ${consumer.name}: ${error.message}`);\n }\n }\n }\n\n // Step B: Run 'npm unlink' 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 unlink' in: ${pkg.path}`);\n } else {\n logger.verbose(`Running 'npm unlink' in source: ${pkg.path}`);\n await run('npm unlink');\n logger.info(`✅ Source unlinked: ${pkg.name}`);\n }\n } finally {\n process.chdir(originalCwd);\n }\n\n unlinkedPackages.push(pkg.name);\n } catch (error: any) {\n // npm unlink can fail if package wasn't linked, but that's OK\n logger.warn(`⚠️ Failed to unlink source package ${pkg.name}: ${error.message}`);\n unlinkedPackages.push(pkg.name); // Still count as success\n }\n }\n\n const summary = `Successfully unlinked ${unlinkedPackages.length} package(s): ${unlinkedPackages.join(', ')}`;\n logger.info(summary);\n return summary;\n};\n\n// Status function to show what's currently linked (same as link command)\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 // Check if this is a status command from direct parameter\n if (packageArgument === 'status') {\n return await executeStatus(runConfig);\n }\n\n // Use packageArgument from runConfig if not provided as parameter\n const finalPackageArgument = packageArgument || runConfig.unlink?.packageArgument;\n\n // Check if this is a status command from config\n if (finalPackageArgument === 'status') {\n return await executeStatus(runConfig);\n }\n\n return await executeInternal(runConfig, finalPackageArgument);\n } catch (error: any) {\n const logger = getLogger();\n logger.error(`unlink failed: ${error.message}`);\n throw error;\n }\n};\n"],"names":["matchesExternalUnlinkPattern","dependencyName","externalUnlinkPatterns","length","some","pattern","startsWith","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","version","Object","entries","dependencyPath","scope","name","split","isExternal","includes","push","targetPath","error","warn","message","removeSymbolicLink","targetDir","isDryRun","verbose","unlink","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","getDryRunLogger","createStorage","log","info","executeStatus","tree","directories","process","cwd","currentDir","exists","cleanNodeModules","externals","externalDependencies","keys","filter","depName","success","dryRunMessage","run","util","child_process","execPromise","promisify","exec","result","packageScope","stdout","trim","linksData","linkedPackages","scopeLinkedPackages","pkg","summary","unlinkedPackages","packagesToUnlink","consumer","consumerOriginalCwd","chdir","runSecure","originalCwd","getLogger","packageStatuses","output","packageStatus","dep","type","execute","finalPackageArgument"],"mappings":"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"}
package/dist/constants.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import os__default from 'os';
2
2
  import path__default from 'path';
3
3
 
4
- const VERSION = '1.2.2 (HEAD/3638780 T:v1.2.2 2025-08-14 07:39:50 -0700) linux x64 v22.18.0';
4
+ const VERSION = '1.2.3 (HEAD/303d484 T:v1.2.3 2025-08-19 21:45:29 -0700) linux x64 v22.18.0';
5
5
  const PROGRAM_NAME = 'kodrdriv';
6
6
  const DEFAULT_OVERRIDES = false;
7
7
  const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS = 'YYYY-MM-DD-HHmmss.SSS';
@@ -183,26 +183,28 @@ const KODRDRIV_DEFAULTS = {
183
183
  link: {
184
184
  scopeRoots: {},
185
185
  dryRun: false,
186
- packageArgument: undefined
186
+ packageArgument: undefined,
187
+ externals: []
187
188
  },
188
189
  unlink: {
189
190
  scopeRoots: {},
190
191
  workspaceFile: undefined,
191
192
  dryRun: false,
192
193
  cleanNodeModules: false,
193
- packageArgument: undefined
194
+ packageArgument: undefined,
195
+ externals: []
194
196
  },
195
197
  tree: {
196
198
  directories: undefined,
197
- excludedPatterns: undefined,
199
+ exclude: undefined,
198
200
  startFrom: undefined,
199
201
  stopAt: undefined,
200
202
  cmd: undefined,
201
- parallel: false,
202
203
  builtInCommand: undefined,
203
204
  continue: false,
204
205
  packageArgument: undefined,
205
- cleanNodeModules: false
206
+ cleanNodeModules: false,
207
+ externals: []
206
208
  },
207
209
  development: {
208
210
  targetVersion: 'patch',
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sources":["../src/constants.ts"],"sourcesContent":["import { MergeMethod } from './types';\nimport os from 'os';\nimport path from 'path';\n\nexport const VERSION = '__VERSION__ (__GIT_BRANCH__/__GIT_COMMIT__ __GIT_TAGS__ __GIT_COMMIT_DATE__) __SYSTEM_INFO__';\nexport const PROGRAM_NAME = 'kodrdriv';\nexport const DEFAULT_CHARACTER_ENCODING = 'utf-8';\nexport const DEFAULT_BINARY_TO_TEXT_ENCODING = 'base64';\nexport const DEFAULT_DIFF = true;\nexport const DEFAULT_LOG = false;\nexport const DEFAULT_OVERRIDES = false;\nexport const DATE_FORMAT_MONTH_DAY = 'MM-DD';\nexport const DATE_FORMAT_YEAR = 'YYYY';\nexport const DATE_FORMAT_YEAR_MONTH = 'YYYY-MM';\nexport const DATE_FORMAT_YEAR_MONTH_DAY = 'YYYY-MM-DD';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_SLASH = 'YYYY/MM/DD';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES = 'YYYY-MM-DD-HHmm';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS = 'YYYY-MM-DD-HHmmss';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS = 'YYYY-MM-DD-HHmmss.SSS';\nexport const DATE_FORMAT_SHORT_TIMESTAMP = 'YYMMdd-HHmm';\nexport const DATE_FORMAT_MONTH = 'MM';\nexport const DATE_FORMAT_DAY = 'DD';\nexport const DATE_FORMAT_HOURS = 'HHmm';\nexport const DATE_FORMAT_MINUTES = 'mm';\nexport const DATE_FORMAT_SECONDS = 'ss';\nexport const DATE_FORMAT_MILLISECONDS = 'SSS';\nexport const DEFAULT_VERBOSE = false;\nexport const DEFAULT_DRY_RUN = false;\nexport const DEFAULT_DEBUG = false;\nexport const DEFAULT_MODEL = 'gpt-4o-mini';\nexport const DEFAULT_MODEL_STRONG = 'gpt-4o';\nexport const DEFAULT_OPENAI_REASONING = 'low';\nexport const DEFAULT_OPENAI_MAX_OUTPUT_TOKENS = 10000;\nexport const DEFAULT_OUTPUT_DIRECTORY = 'output/kodrdriv';\n\n// Buffer size for git commands that may produce large output (like git log)\nexport const DEFAULT_GIT_COMMAND_MAX_BUFFER = 50 * 1024 * 1024; // 50MB\n\nexport const DEFAULT_CONTEXT_DIRECTORIES: string[] = [];\n\nexport const DEFAULT_CONFIG_DIR = '.kodrdriv';\nexport const DEFAULT_PREFERENCES_DIRECTORY = path.join(os.homedir(), '.kodrdriv');\n\nexport const DEFAULT_FROM_COMMIT_ALIAS = 'main';\nexport const DEFAULT_TO_COMMIT_ALIAS = 'HEAD';\n\nexport const DEFAULT_ADD = false;\nexport const DEFAULT_CACHED = false;\nexport const DEFAULT_SENDIT_MODE = false;\nexport const DEFAULT_INTERACTIVE_MODE = false;\nexport const DEFAULT_AMEND_MODE = false;\nexport const DEFAULT_MESSAGE_LIMIT = 50;\nexport const DEFAULT_MAX_DIFF_BYTES = 20480; // 20KB limit per file\n\nexport const DEFAULT_MERGE_METHOD: MergeMethod = 'squash';\n\nexport const DEFAULT_EXCLUDED_PATTERNS = [\n 'node_modules', 'package-lock.json', 'yarn.lock', 'bun.lockb',\n 'composer.lock', 'Cargo.lock', 'Gemfile.lock',\n 'dist', 'build', 'out', '.next', '.nuxt', 'coverage',\n '.vscode', '.idea', '.DS_Store', '.git', '.gitignore',\n 'logs', 'tmp', '.cache', '*.log', '.env', '.env.*',\n '*.pem', '*.crt', '*.key', '*.sqlite', '*.db',\n '*.zip', '*.tar', '*.gz', '*.exe', '*.bin'\n];\n\nexport const COMMAND_COMMIT = 'commit';\nexport const COMMAND_AUDIO_COMMIT = 'audio-commit';\nexport const COMMAND_SELECT_AUDIO = 'select-audio';\nexport const COMMAND_RELEASE = 'release';\nexport const COMMAND_REVIEW = 'review';\nexport const COMMAND_AUDIO_REVIEW = 'audio-review';\nexport const COMMAND_PUBLISH = 'publish';\nexport const COMMAND_TREE = 'tree';\nexport const COMMAND_LINK = 'link';\nexport const COMMAND_UNLINK = 'unlink';\nexport const COMMAND_CLEAN = 'clean';\nexport const COMMAND_DEVELOPMENT = 'development';\nexport const COMMAND_VERSIONS = 'versions';\nexport const COMMAND_CHECK_CONFIG = 'check-config';\nexport const COMMAND_INIT_CONFIG = 'init-config';\n\nexport const ALLOWED_COMMANDS = [\n COMMAND_COMMIT,\n COMMAND_AUDIO_COMMIT,\n COMMAND_SELECT_AUDIO,\n COMMAND_RELEASE,\n COMMAND_REVIEW,\n COMMAND_AUDIO_REVIEW,\n COMMAND_PUBLISH,\n COMMAND_TREE,\n COMMAND_LINK,\n COMMAND_UNLINK,\n COMMAND_CLEAN,\n COMMAND_DEVELOPMENT,\n COMMAND_VERSIONS\n];\n\nexport const DEFAULT_COMMAND = COMMAND_COMMIT;\n\nexport const DEFAULT_INSTRUCTIONS_DIR = `instructions`;\n\nexport const DEFAULT_PERSONA_DIR = `personas`;\n\nexport const DEFAULT_INSTRUCTIONS_COMMIT_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/commit.md`;\nexport const DEFAULT_INSTRUCTIONS_RELEASE_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/release.md`;\nexport const DEFAULT_INSTRUCTIONS_REVIEW_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/review.md`;\n\nexport const DEFAULT_PERSONA_RELEASER_FILE = `${DEFAULT_PERSONA_DIR}/releaser.md`;\nexport const DEFAULT_PERSONA_YOU_FILE = `${DEFAULT_PERSONA_DIR}/you.md`;\n\n// Default instructions for each persona\nexport const DEFAULT_INSTRUCTIONS_MAP = {\n [COMMAND_COMMIT]: DEFAULT_INSTRUCTIONS_COMMIT_FILE,\n [COMMAND_AUDIO_COMMIT]: DEFAULT_INSTRUCTIONS_COMMIT_FILE, // Reuse commit instructions\n [COMMAND_RELEASE]: DEFAULT_INSTRUCTIONS_RELEASE_FILE,\n [COMMAND_REVIEW]: DEFAULT_INSTRUCTIONS_REVIEW_FILE, // Reuse audio-review instructions for now\n [COMMAND_AUDIO_REVIEW]: DEFAULT_INSTRUCTIONS_REVIEW_FILE,\n};\n\n// Default personas for each command\nexport const DEFAULT_PERSONA_MAP = {\n [COMMAND_COMMIT]: DEFAULT_PERSONA_YOU_FILE,\n [COMMAND_AUDIO_COMMIT]: DEFAULT_PERSONA_YOU_FILE, // Use You persona\n [COMMAND_RELEASE]: DEFAULT_PERSONA_RELEASER_FILE,\n [COMMAND_REVIEW]: DEFAULT_PERSONA_YOU_FILE, // Use You persona\n [COMMAND_AUDIO_REVIEW]: DEFAULT_PERSONA_YOU_FILE,\n};\n\n// Used by child process to create paths\nexport const DEFAULT_PATH_SEPARATOR = '/';\n\n// Used by util/general for file filtering\nexport const DEFAULT_IGNORE_PATTERNS = [\n 'node_modules/**',\n '**/*.log',\n '.git/**',\n 'dist/**',\n 'build/**',\n 'coverage/**',\n '.DS_Store',\n '*.tmp',\n '*.cache',\n];\n\n// Used by util/storage for directory names\nexport const DEFAULT_DIRECTORY_PREFIX = '.kodrdriv';\n\n// Used by other commands but not exposed in CLI\nexport const INTERNAL_DEFAULT_OUTPUT_FILE = 'output.txt';\n\nexport const INTERNAL_DATETIME_FORMAT = 'YYYY-MM-DD_HH-mm-ss';\n\n// Define defaults in one place\nexport const KODRDRIV_DEFAULTS = {\n dryRun: DEFAULT_DRY_RUN,\n verbose: DEFAULT_VERBOSE,\n debug: DEFAULT_DEBUG,\n overrides: DEFAULT_OVERRIDES,\n model: DEFAULT_MODEL,\n openaiReasoning: DEFAULT_OPENAI_REASONING as 'low' | 'medium' | 'high',\n openaiMaxOutputTokens: DEFAULT_OPENAI_MAX_OUTPUT_TOKENS,\n contextDirectories: DEFAULT_CONTEXT_DIRECTORIES,\n commandName: DEFAULT_COMMAND,\n configDirectory: DEFAULT_CONFIG_DIR,\n outputDirectory: DEFAULT_OUTPUT_DIRECTORY,\n preferencesDirectory: DEFAULT_PREFERENCES_DIRECTORY,\n commit: {\n add: DEFAULT_ADD,\n cached: DEFAULT_CACHED,\n sendit: DEFAULT_SENDIT_MODE,\n interactive: DEFAULT_INTERACTIVE_MODE,\n amend: DEFAULT_AMEND_MODE,\n messageLimit: DEFAULT_MESSAGE_LIMIT,\n skipFileCheck: false,\n maxDiffBytes: DEFAULT_MAX_DIFF_BYTES,\n openaiReasoning: DEFAULT_OPENAI_REASONING as 'low' | 'medium' | 'high',\n openaiMaxOutputTokens: DEFAULT_OPENAI_MAX_OUTPUT_TOKENS,\n },\n release: {\n from: DEFAULT_FROM_COMMIT_ALIAS,\n to: DEFAULT_TO_COMMIT_ALIAS,\n messageLimit: DEFAULT_MESSAGE_LIMIT,\n interactive: DEFAULT_INTERACTIVE_MODE,\n maxDiffBytes: DEFAULT_MAX_DIFF_BYTES,\n noMilestones: false,\n openaiReasoning: DEFAULT_OPENAI_REASONING as 'low' | 'medium' | 'high',\n openaiMaxOutputTokens: DEFAULT_OPENAI_MAX_OUTPUT_TOKENS,\n },\n audioCommit: {\n maxRecordingTime: 300, // 5 minutes default\n audioDevice: undefined, // Auto-detect by default\n openaiReasoning: DEFAULT_OPENAI_REASONING as 'low' | 'medium' | 'high',\n openaiMaxOutputTokens: DEFAULT_OPENAI_MAX_OUTPUT_TOKENS,\n },\n review: {\n includeCommitHistory: true,\n includeRecentDiffs: true,\n includeReleaseNotes: false,\n includeGithubIssues: true,\n commitHistoryLimit: 10,\n diffHistoryLimit: 5,\n releaseNotesLimit: 3,\n githubIssuesLimit: 20,\n sendit: DEFAULT_SENDIT_MODE,\n openaiReasoning: DEFAULT_OPENAI_REASONING as 'low' | 'medium' | 'high',\n openaiMaxOutputTokens: DEFAULT_OPENAI_MAX_OUTPUT_TOKENS,\n },\n audioReview: {\n includeCommitHistory: true,\n includeRecentDiffs: true,\n includeReleaseNotes: false,\n includeGithubIssues: true,\n commitHistoryLimit: 10,\n diffHistoryLimit: 5,\n releaseNotesLimit: 3,\n githubIssuesLimit: 20,\n sendit: DEFAULT_SENDIT_MODE,\n maxRecordingTime: 300, // 5 minutes default\n audioDevice: undefined, // Auto-detect by default\n directory: undefined, // No default directory\n openaiReasoning: DEFAULT_OPENAI_REASONING as 'low' | 'medium' | 'high',\n openaiMaxOutputTokens: DEFAULT_OPENAI_MAX_OUTPUT_TOKENS,\n },\n publish: {\n mergeMethod: DEFAULT_MERGE_METHOD,\n from: DEFAULT_FROM_COMMIT_ALIAS,\n targetVersion: 'patch',\n interactive: DEFAULT_INTERACTIVE_MODE,\n requiredEnvVars: ['GITHUB_TOKEN', 'OPENAI_API_KEY'],\n linkWorkspacePackages: true,\n unlinkWorkspacePackages: true,\n sendit: DEFAULT_SENDIT_MODE,\n targetBranch: 'main',\n noMilestones: false,\n },\n link: {\n scopeRoots: {},\n dryRun: false,\n packageArgument: undefined,\n },\n unlink: {\n scopeRoots: {},\n workspaceFile: undefined,\n dryRun: false,\n cleanNodeModules: false,\n packageArgument: undefined,\n },\n tree: {\n directories: undefined,\n excludedPatterns: undefined,\n startFrom: undefined,\n stopAt: undefined,\n cmd: undefined,\n parallel: false,\n builtInCommand: undefined,\n continue: false,\n packageArgument: undefined,\n cleanNodeModules: false,\n },\n development: {\n targetVersion: 'patch',\n noMilestones: false,\n },\n versions: {\n subcommand: undefined,\n directories: undefined,\n },\n excludedPatterns: DEFAULT_EXCLUDED_PATTERNS,\n};\n"],"names":["VERSION","PROGRAM_NAME","DEFAULT_OVERRIDES","DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS","DEFAULT_VERBOSE","DEFAULT_DRY_RUN","DEFAULT_DEBUG","DEFAULT_MODEL","DEFAULT_OPENAI_REASONING","DEFAULT_OPENAI_MAX_OUTPUT_TOKENS","DEFAULT_OUTPUT_DIRECTORY","DEFAULT_GIT_COMMAND_MAX_BUFFER","DEFAULT_CONTEXT_DIRECTORIES","DEFAULT_CONFIG_DIR","DEFAULT_PREFERENCES_DIRECTORY","path","join","os","homedir","DEFAULT_FROM_COMMIT_ALIAS","DEFAULT_TO_COMMIT_ALIAS","DEFAULT_ADD","DEFAULT_CACHED","DEFAULT_SENDIT_MODE","DEFAULT_INTERACTIVE_MODE","DEFAULT_AMEND_MODE","DEFAULT_MESSAGE_LIMIT","DEFAULT_MAX_DIFF_BYTES","DEFAULT_MERGE_METHOD","DEFAULT_EXCLUDED_PATTERNS","COMMAND_COMMIT","COMMAND_AUDIO_COMMIT","COMMAND_SELECT_AUDIO","COMMAND_RELEASE","COMMAND_REVIEW","COMMAND_AUDIO_REVIEW","COMMAND_PUBLISH","COMMAND_TREE","COMMAND_LINK","COMMAND_UNLINK","COMMAND_CLEAN","COMMAND_DEVELOPMENT","COMMAND_VERSIONS","COMMAND_CHECK_CONFIG","COMMAND_INIT_CONFIG","ALLOWED_COMMANDS","DEFAULT_COMMAND","KODRDRIV_DEFAULTS","dryRun","verbose","debug","overrides","model","openaiReasoning","openaiMaxOutputTokens","contextDirectories","commandName","configDirectory","outputDirectory","preferencesDirectory","commit","add","cached","sendit","interactive","amend","messageLimit","skipFileCheck","maxDiffBytes","release","from","to","noMilestones","audioCommit","maxRecordingTime","audioDevice","undefined","review","includeCommitHistory","includeRecentDiffs","includeReleaseNotes","includeGithubIssues","commitHistoryLimit","diffHistoryLimit","releaseNotesLimit","githubIssuesLimit","audioReview","directory","publish","mergeMethod","targetVersion","requiredEnvVars","linkWorkspacePackages","unlinkWorkspacePackages","targetBranch","link","scopeRoots","packageArgument","unlink","workspaceFile","cleanNodeModules","tree","directories","excludedPatterns","startFrom","stopAt","cmd","parallel","builtInCommand","continue","development","versions","subcommand"],"mappings":"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"}
1
+ {"version":3,"file":"constants.js","sources":["../src/constants.ts"],"sourcesContent":["import { MergeMethod } from './types';\nimport os from 'os';\nimport path from 'path';\n\nexport const VERSION = '__VERSION__ (__GIT_BRANCH__/__GIT_COMMIT__ __GIT_TAGS__ __GIT_COMMIT_DATE__) __SYSTEM_INFO__';\nexport const PROGRAM_NAME = 'kodrdriv';\nexport const DEFAULT_CHARACTER_ENCODING = 'utf-8';\nexport const DEFAULT_BINARY_TO_TEXT_ENCODING = 'base64';\nexport const DEFAULT_DIFF = true;\nexport const DEFAULT_LOG = false;\nexport const DEFAULT_OVERRIDES = false;\nexport const DATE_FORMAT_MONTH_DAY = 'MM-DD';\nexport const DATE_FORMAT_YEAR = 'YYYY';\nexport const DATE_FORMAT_YEAR_MONTH = 'YYYY-MM';\nexport const DATE_FORMAT_YEAR_MONTH_DAY = 'YYYY-MM-DD';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_SLASH = 'YYYY/MM/DD';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES = 'YYYY-MM-DD-HHmm';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS = 'YYYY-MM-DD-HHmmss';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS = 'YYYY-MM-DD-HHmmss.SSS';\nexport const DATE_FORMAT_SHORT_TIMESTAMP = 'YYMMdd-HHmm';\nexport const DATE_FORMAT_MONTH = 'MM';\nexport const DATE_FORMAT_DAY = 'DD';\nexport const DATE_FORMAT_HOURS = 'HHmm';\nexport const DATE_FORMAT_MINUTES = 'mm';\nexport const DATE_FORMAT_SECONDS = 'ss';\nexport const DATE_FORMAT_MILLISECONDS = 'SSS';\nexport const DEFAULT_VERBOSE = false;\nexport const DEFAULT_DRY_RUN = false;\nexport const DEFAULT_DEBUG = false;\nexport const DEFAULT_MODEL = 'gpt-4o-mini';\nexport const DEFAULT_MODEL_STRONG = 'gpt-4o';\nexport const DEFAULT_OPENAI_REASONING = 'low';\nexport const DEFAULT_OPENAI_MAX_OUTPUT_TOKENS = 10000;\nexport const DEFAULT_OUTPUT_DIRECTORY = 'output/kodrdriv';\n\n// Buffer size for git commands that may produce large output (like git log)\nexport const DEFAULT_GIT_COMMAND_MAX_BUFFER = 50 * 1024 * 1024; // 50MB\n\nexport const DEFAULT_CONTEXT_DIRECTORIES: string[] = [];\n\nexport const DEFAULT_CONFIG_DIR = '.kodrdriv';\nexport const DEFAULT_PREFERENCES_DIRECTORY = path.join(os.homedir(), '.kodrdriv');\n\nexport const DEFAULT_FROM_COMMIT_ALIAS = 'main';\nexport const DEFAULT_TO_COMMIT_ALIAS = 'HEAD';\n\nexport const DEFAULT_ADD = false;\nexport const DEFAULT_CACHED = false;\nexport const DEFAULT_SENDIT_MODE = false;\nexport const DEFAULT_INTERACTIVE_MODE = false;\nexport const DEFAULT_AMEND_MODE = false;\nexport const DEFAULT_MESSAGE_LIMIT = 50;\nexport const DEFAULT_MAX_DIFF_BYTES = 20480; // 20KB limit per file\n\nexport const DEFAULT_MERGE_METHOD: MergeMethod = 'squash';\n\nexport const DEFAULT_EXCLUDED_PATTERNS = [\n 'node_modules', 'package-lock.json', 'yarn.lock', 'bun.lockb',\n 'composer.lock', 'Cargo.lock', 'Gemfile.lock',\n 'dist', 'build', 'out', '.next', '.nuxt', 'coverage',\n '.vscode', '.idea', '.DS_Store', '.git', '.gitignore',\n 'logs', 'tmp', '.cache', '*.log', '.env', '.env.*',\n '*.pem', '*.crt', '*.key', '*.sqlite', '*.db',\n '*.zip', '*.tar', '*.gz', '*.exe', '*.bin'\n];\n\nexport const COMMAND_COMMIT = 'commit';\nexport const COMMAND_AUDIO_COMMIT = 'audio-commit';\nexport const COMMAND_SELECT_AUDIO = 'select-audio';\nexport const COMMAND_RELEASE = 'release';\nexport const COMMAND_REVIEW = 'review';\nexport const COMMAND_AUDIO_REVIEW = 'audio-review';\nexport const COMMAND_PUBLISH = 'publish';\nexport const COMMAND_TREE = 'tree';\nexport const COMMAND_LINK = 'link';\nexport const COMMAND_UNLINK = 'unlink';\nexport const COMMAND_CLEAN = 'clean';\nexport const COMMAND_DEVELOPMENT = 'development';\nexport const COMMAND_VERSIONS = 'versions';\nexport const COMMAND_CHECK_CONFIG = 'check-config';\nexport const COMMAND_INIT_CONFIG = 'init-config';\n\nexport const ALLOWED_COMMANDS = [\n COMMAND_COMMIT,\n COMMAND_AUDIO_COMMIT,\n COMMAND_SELECT_AUDIO,\n COMMAND_RELEASE,\n COMMAND_REVIEW,\n COMMAND_AUDIO_REVIEW,\n COMMAND_PUBLISH,\n COMMAND_TREE,\n COMMAND_LINK,\n COMMAND_UNLINK,\n COMMAND_CLEAN,\n COMMAND_DEVELOPMENT,\n COMMAND_VERSIONS\n];\n\nexport const DEFAULT_COMMAND = COMMAND_COMMIT;\n\nexport const DEFAULT_INSTRUCTIONS_DIR = `instructions`;\n\nexport const DEFAULT_PERSONA_DIR = `personas`;\n\nexport const DEFAULT_INSTRUCTIONS_COMMIT_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/commit.md`;\nexport const DEFAULT_INSTRUCTIONS_RELEASE_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/release.md`;\nexport const DEFAULT_INSTRUCTIONS_REVIEW_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/review.md`;\n\nexport const DEFAULT_PERSONA_RELEASER_FILE = `${DEFAULT_PERSONA_DIR}/releaser.md`;\nexport const DEFAULT_PERSONA_YOU_FILE = `${DEFAULT_PERSONA_DIR}/you.md`;\n\n// Default instructions for each persona\nexport const DEFAULT_INSTRUCTIONS_MAP = {\n [COMMAND_COMMIT]: DEFAULT_INSTRUCTIONS_COMMIT_FILE,\n [COMMAND_AUDIO_COMMIT]: DEFAULT_INSTRUCTIONS_COMMIT_FILE, // Reuse commit instructions\n [COMMAND_RELEASE]: DEFAULT_INSTRUCTIONS_RELEASE_FILE,\n [COMMAND_REVIEW]: DEFAULT_INSTRUCTIONS_REVIEW_FILE, // Reuse audio-review instructions for now\n [COMMAND_AUDIO_REVIEW]: DEFAULT_INSTRUCTIONS_REVIEW_FILE,\n};\n\n// Default personas for each command\nexport const DEFAULT_PERSONA_MAP = {\n [COMMAND_COMMIT]: DEFAULT_PERSONA_YOU_FILE,\n [COMMAND_AUDIO_COMMIT]: DEFAULT_PERSONA_YOU_FILE, // Use You persona\n [COMMAND_RELEASE]: DEFAULT_PERSONA_RELEASER_FILE,\n [COMMAND_REVIEW]: DEFAULT_PERSONA_YOU_FILE, // Use You persona\n [COMMAND_AUDIO_REVIEW]: DEFAULT_PERSONA_YOU_FILE,\n};\n\n// Used by child process to create paths\nexport const DEFAULT_PATH_SEPARATOR = '/';\n\n// Used by util/general for file filtering\nexport const DEFAULT_IGNORE_PATTERNS = [\n 'node_modules/**',\n '**/*.log',\n '.git/**',\n 'dist/**',\n 'build/**',\n 'coverage/**',\n '.DS_Store',\n '*.tmp',\n '*.cache',\n];\n\n// Used by util/storage for directory names\nexport const DEFAULT_DIRECTORY_PREFIX = '.kodrdriv';\n\n// Used by other commands but not exposed in CLI\nexport const INTERNAL_DEFAULT_OUTPUT_FILE = 'output.txt';\n\nexport const INTERNAL_DATETIME_FORMAT = 'YYYY-MM-DD_HH-mm-ss';\n\n// Define defaults in one place\nexport const KODRDRIV_DEFAULTS = {\n dryRun: DEFAULT_DRY_RUN,\n verbose: DEFAULT_VERBOSE,\n debug: DEFAULT_DEBUG,\n overrides: DEFAULT_OVERRIDES,\n model: DEFAULT_MODEL,\n openaiReasoning: DEFAULT_OPENAI_REASONING as 'low' | 'medium' | 'high',\n openaiMaxOutputTokens: DEFAULT_OPENAI_MAX_OUTPUT_TOKENS,\n contextDirectories: DEFAULT_CONTEXT_DIRECTORIES,\n commandName: DEFAULT_COMMAND,\n configDirectory: DEFAULT_CONFIG_DIR,\n outputDirectory: DEFAULT_OUTPUT_DIRECTORY,\n preferencesDirectory: DEFAULT_PREFERENCES_DIRECTORY,\n commit: {\n add: DEFAULT_ADD,\n cached: DEFAULT_CACHED,\n sendit: DEFAULT_SENDIT_MODE,\n interactive: DEFAULT_INTERACTIVE_MODE,\n amend: DEFAULT_AMEND_MODE,\n messageLimit: DEFAULT_MESSAGE_LIMIT,\n skipFileCheck: false,\n maxDiffBytes: DEFAULT_MAX_DIFF_BYTES,\n openaiReasoning: DEFAULT_OPENAI_REASONING as 'low' | 'medium' | 'high',\n openaiMaxOutputTokens: DEFAULT_OPENAI_MAX_OUTPUT_TOKENS,\n },\n release: {\n from: DEFAULT_FROM_COMMIT_ALIAS,\n to: DEFAULT_TO_COMMIT_ALIAS,\n messageLimit: DEFAULT_MESSAGE_LIMIT,\n interactive: DEFAULT_INTERACTIVE_MODE,\n maxDiffBytes: DEFAULT_MAX_DIFF_BYTES,\n noMilestones: false,\n openaiReasoning: DEFAULT_OPENAI_REASONING as 'low' | 'medium' | 'high',\n openaiMaxOutputTokens: DEFAULT_OPENAI_MAX_OUTPUT_TOKENS,\n },\n audioCommit: {\n maxRecordingTime: 300, // 5 minutes default\n audioDevice: undefined, // Auto-detect by default\n openaiReasoning: DEFAULT_OPENAI_REASONING as 'low' | 'medium' | 'high',\n openaiMaxOutputTokens: DEFAULT_OPENAI_MAX_OUTPUT_TOKENS,\n },\n review: {\n includeCommitHistory: true,\n includeRecentDiffs: true,\n includeReleaseNotes: false,\n includeGithubIssues: true,\n commitHistoryLimit: 10,\n diffHistoryLimit: 5,\n releaseNotesLimit: 3,\n githubIssuesLimit: 20,\n sendit: DEFAULT_SENDIT_MODE,\n openaiReasoning: DEFAULT_OPENAI_REASONING as 'low' | 'medium' | 'high',\n openaiMaxOutputTokens: DEFAULT_OPENAI_MAX_OUTPUT_TOKENS,\n },\n audioReview: {\n includeCommitHistory: true,\n includeRecentDiffs: true,\n includeReleaseNotes: false,\n includeGithubIssues: true,\n commitHistoryLimit: 10,\n diffHistoryLimit: 5,\n releaseNotesLimit: 3,\n githubIssuesLimit: 20,\n sendit: DEFAULT_SENDIT_MODE,\n maxRecordingTime: 300, // 5 minutes default\n audioDevice: undefined, // Auto-detect by default\n directory: undefined, // No default directory\n openaiReasoning: DEFAULT_OPENAI_REASONING as 'low' | 'medium' | 'high',\n openaiMaxOutputTokens: DEFAULT_OPENAI_MAX_OUTPUT_TOKENS,\n },\n publish: {\n mergeMethod: DEFAULT_MERGE_METHOD,\n from: DEFAULT_FROM_COMMIT_ALIAS,\n targetVersion: 'patch',\n interactive: DEFAULT_INTERACTIVE_MODE,\n requiredEnvVars: ['GITHUB_TOKEN', 'OPENAI_API_KEY'],\n linkWorkspacePackages: true,\n unlinkWorkspacePackages: true,\n sendit: DEFAULT_SENDIT_MODE,\n targetBranch: 'main',\n noMilestones: false,\n },\n link: {\n scopeRoots: {},\n dryRun: false,\n packageArgument: undefined,\n externals: [],\n },\n unlink: {\n scopeRoots: {},\n workspaceFile: undefined,\n dryRun: false,\n cleanNodeModules: false,\n packageArgument: undefined,\n externals: [],\n },\n tree: {\n directories: undefined,\n exclude: undefined,\n startFrom: undefined,\n stopAt: undefined,\n cmd: undefined,\n\n builtInCommand: undefined,\n continue: false,\n packageArgument: undefined,\n cleanNodeModules: false,\n externals: [],\n },\n development: {\n targetVersion: 'patch',\n noMilestones: false,\n },\n versions: {\n subcommand: undefined,\n directories: undefined,\n },\n excludedPatterns: DEFAULT_EXCLUDED_PATTERNS,\n};\n"],"names":["VERSION","PROGRAM_NAME","DEFAULT_OVERRIDES","DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS","DEFAULT_VERBOSE","DEFAULT_DRY_RUN","DEFAULT_DEBUG","DEFAULT_MODEL","DEFAULT_OPENAI_REASONING","DEFAULT_OPENAI_MAX_OUTPUT_TOKENS","DEFAULT_OUTPUT_DIRECTORY","DEFAULT_GIT_COMMAND_MAX_BUFFER","DEFAULT_CONTEXT_DIRECTORIES","DEFAULT_CONFIG_DIR","DEFAULT_PREFERENCES_DIRECTORY","path","join","os","homedir","DEFAULT_FROM_COMMIT_ALIAS","DEFAULT_TO_COMMIT_ALIAS","DEFAULT_ADD","DEFAULT_CACHED","DEFAULT_SENDIT_MODE","DEFAULT_INTERACTIVE_MODE","DEFAULT_AMEND_MODE","DEFAULT_MESSAGE_LIMIT","DEFAULT_MAX_DIFF_BYTES","DEFAULT_MERGE_METHOD","DEFAULT_EXCLUDED_PATTERNS","COMMAND_COMMIT","COMMAND_AUDIO_COMMIT","COMMAND_SELECT_AUDIO","COMMAND_RELEASE","COMMAND_REVIEW","COMMAND_AUDIO_REVIEW","COMMAND_PUBLISH","COMMAND_TREE","COMMAND_LINK","COMMAND_UNLINK","COMMAND_CLEAN","COMMAND_DEVELOPMENT","COMMAND_VERSIONS","COMMAND_CHECK_CONFIG","COMMAND_INIT_CONFIG","ALLOWED_COMMANDS","DEFAULT_COMMAND","KODRDRIV_DEFAULTS","dryRun","verbose","debug","overrides","model","openaiReasoning","openaiMaxOutputTokens","contextDirectories","commandName","configDirectory","outputDirectory","preferencesDirectory","commit","add","cached","sendit","interactive","amend","messageLimit","skipFileCheck","maxDiffBytes","release","from","to","noMilestones","audioCommit","maxRecordingTime","audioDevice","undefined","review","includeCommitHistory","includeRecentDiffs","includeReleaseNotes","includeGithubIssues","commitHistoryLimit","diffHistoryLimit","releaseNotesLimit","githubIssuesLimit","audioReview","directory","publish","mergeMethod","targetVersion","requiredEnvVars","linkWorkspacePackages","unlinkWorkspacePackages","targetBranch","link","scopeRoots","packageArgument","externals","unlink","workspaceFile","cleanNodeModules","tree","directories","exclude","startFrom","stopAt","cmd","builtInCommand","continue","development","versions","subcommand","excludedPatterns"],"mappings":"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"}