@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.
Files changed (80) hide show
  1. package/AI-FRIENDLY-LOGGING-GUIDE.md +237 -0
  2. package/AI-LOGGING-MIGRATION-COMPLETE.md +371 -0
  3. package/ALREADY-PUBLISHED-PACKAGES-FIX.md +264 -0
  4. package/AUDIT-BRANCHES-PROGRESS-FIX.md +90 -0
  5. package/AUDIT-EXAMPLE-OUTPUT.md +113 -0
  6. package/CHECKPOINT-RECOVERY-FIX.md +450 -0
  7. package/LOGGING-MIGRATION-STATUS.md +186 -0
  8. package/PARALLEL-PUBLISH-DEBUGGING-GUIDE.md +441 -0
  9. package/PARALLEL-PUBLISH-FIXES-IMPLEMENTED.md +405 -0
  10. package/PARALLEL-PUBLISH-LOGGING-FIXES.md +274 -0
  11. package/PARALLEL-PUBLISH-QUICK-REFERENCE.md +375 -0
  12. package/PARALLEL_EXECUTION_FIX.md +2 -2
  13. package/PUBLISH_IMPROVEMENTS_IMPLEMENTED.md +4 -5
  14. package/VERSION-AUDIT-FIX.md +333 -0
  15. package/dist/application.js +6 -6
  16. package/dist/application.js.map +1 -1
  17. package/dist/arguments.js +43 -13
  18. package/dist/arguments.js.map +1 -1
  19. package/dist/commands/audio-commit.js +18 -18
  20. package/dist/commands/audio-commit.js.map +1 -1
  21. package/dist/commands/audio-review.js +32 -32
  22. package/dist/commands/audio-review.js.map +1 -1
  23. package/dist/commands/clean.js +9 -9
  24. package/dist/commands/clean.js.map +1 -1
  25. package/dist/commands/commit.js +20 -20
  26. package/dist/commands/commit.js.map +1 -1
  27. package/dist/commands/development.js +88 -89
  28. package/dist/commands/development.js.map +1 -1
  29. package/dist/commands/link.js +36 -36
  30. package/dist/commands/link.js.map +1 -1
  31. package/dist/commands/publish.js +318 -220
  32. package/dist/commands/publish.js.map +1 -1
  33. package/dist/commands/release.js +14 -14
  34. package/dist/commands/release.js.map +1 -1
  35. package/dist/commands/review.js +15 -17
  36. package/dist/commands/review.js.map +1 -1
  37. package/dist/commands/select-audio.js +5 -5
  38. package/dist/commands/select-audio.js.map +1 -1
  39. package/dist/commands/tree.js +134 -39
  40. package/dist/commands/tree.js.map +1 -1
  41. package/dist/commands/unlink.js +39 -39
  42. package/dist/commands/unlink.js.map +1 -1
  43. package/dist/commands/updates.js +150 -14
  44. package/dist/commands/updates.js.map +1 -1
  45. package/dist/commands/versions.js +14 -13
  46. package/dist/commands/versions.js.map +1 -1
  47. package/dist/constants.js +1 -1
  48. package/dist/content/diff.js +5 -5
  49. package/dist/content/diff.js.map +1 -1
  50. package/dist/content/files.js +2 -2
  51. package/dist/content/files.js.map +1 -1
  52. package/dist/content/log.js +3 -3
  53. package/dist/content/log.js.map +1 -1
  54. package/dist/execution/CommandValidator.js +6 -6
  55. package/dist/execution/CommandValidator.js.map +1 -1
  56. package/dist/execution/DynamicTaskPool.js +129 -19
  57. package/dist/execution/DynamicTaskPool.js.map +1 -1
  58. package/dist/execution/RecoveryManager.js +99 -21
  59. package/dist/execution/RecoveryManager.js.map +1 -1
  60. package/dist/execution/TreeExecutionAdapter.js +23 -20
  61. package/dist/execution/TreeExecutionAdapter.js.map +1 -1
  62. package/dist/main.js +2 -2
  63. package/dist/main.js.map +1 -1
  64. package/dist/util/checkpointManager.js +4 -4
  65. package/dist/util/checkpointManager.js.map +1 -1
  66. package/dist/util/dependencyGraph.js +2 -2
  67. package/dist/util/dependencyGraph.js.map +1 -1
  68. package/dist/util/fileLock.js +1 -1
  69. package/dist/util/fileLock.js.map +1 -1
  70. package/dist/util/general.js +148 -15
  71. package/dist/util/general.js.map +1 -1
  72. package/dist/util/interactive.js +2 -2
  73. package/dist/util/interactive.js.map +1 -1
  74. package/dist/util/performance.js.map +1 -1
  75. package/dist/util/safety.js +13 -13
  76. package/dist/util/safety.js.map +1 -1
  77. package/dist/utils/branchState.js +567 -0
  78. package/dist/utils/branchState.js.map +1 -0
  79. package/package.json +4 -4
  80. package/scripts/update-test-log-assertions.js +73 -0
@@ -17,11 +17,11 @@ const execute = async (runConfig)=>{
17
17
  if (isDryRun) {
18
18
  try {
19
19
  const configPath = getUnplayableConfigPath();
20
- logger.info('Would start audio device selection process');
21
- logger.info('Would save selected device to %s', configPath);
20
+ logger.info('AUDIO_SELECT_DRY_RUN: Would start audio device selection | Mode: dry-run | Purpose: Choose input device');
21
+ logger.info('AUDIO_SELECT_SAVE_DRY_RUN: Would save device to config | Mode: dry-run | Path: %s', configPath);
22
22
  return 'Audio device selection completed (dry run)';
23
23
  } catch (error) {
24
- logger.warn('Error determining config path: %s', error.message);
24
+ logger.warn('AUDIO_SELECT_CONFIG_PATH_ERROR: Error determining config path | Error: %s | Impact: Cannot show save location', error.message);
25
25
  return 'Audio device selection completed (dry run)';
26
26
  }
27
27
  }
@@ -32,11 +32,11 @@ const execute = async (runConfig)=>{
32
32
  } catch (error) {
33
33
  // Check if this is a home directory error
34
34
  if (error.message && error.message.includes('Failed to determine home directory')) {
35
- logger.error(' %s', error.message);
35
+ logger.error('AUDIO_SELECT_FAILED: Audio device selection failed | Error: %s', error.message);
36
36
  throw new Error(`Failed to determine home directory: ${error.message}`);
37
37
  } else {
38
38
  const errorMessage = error.message || error.toString();
39
- logger.error(' Audio device selection failed: %s', errorMessage);
39
+ logger.error('AUDIO_SELECT_COMMAND_FAILED: Audio device selection command failed | Error: %s | Status: failed', errorMessage);
40
40
  throw new Error(`Audio device selection failed: ${errorMessage}`);
41
41
  }
42
42
  }
@@ -1 +1 @@
1
- {"version":3,"file":"select-audio.js","sources":["../../src/commands/select-audio.ts"],"sourcesContent":["#!/usr/bin/env node\nimport path from 'path';\nimport os from 'os';\nimport { getDryRunLogger } from '../logging';\nimport { Config } from '../types';\nimport { selectAndConfigureAudioDevice } from '@theunwalked/unplayable';\n\nconst getUnplayableConfigPath = (): string => {\n try {\n return path.join(os.homedir(), '.unplayable', 'audio-device.json');\n } catch (error: any) {\n throw new Error(`Failed to determine home directory: ${error.message}`);\n }\n};\n\nexport const execute = async (runConfig: Config): Promise<string> => {\n const isDryRun = runConfig.dryRun || false;\n const logger = getDryRunLogger(isDryRun);\n\n if (isDryRun) {\n try {\n const configPath = getUnplayableConfigPath();\n logger.info('Would start audio device selection process');\n logger.info('Would save selected device to %s', configPath);\n return 'Audio device selection completed (dry run)';\n } catch (error: any) {\n logger.warn('Error determining config path: %s', error.message);\n return 'Audio device selection completed (dry run)';\n }\n }\n\n try {\n const preferencesDir = path.join(os.homedir(), '.unplayable');\n const result = await selectAndConfigureAudioDevice(preferencesDir, logger, runConfig.debug);\n return result;\n } catch (error: any) {\n // Check if this is a home directory error\n if (error.message && error.message.includes('Failed to determine home directory')) {\n logger.error('❌ %s', error.message);\n throw new Error(`Failed to determine home directory: ${error.message}`);\n } else {\n const errorMessage = error.message || error.toString();\n logger.error('❌ Audio device selection failed: %s', errorMessage);\n throw new Error(`Audio device selection failed: ${errorMessage}`);\n }\n }\n};\n"],"names":["getUnplayableConfigPath","path","join","os","homedir","error","Error","message","execute","runConfig","isDryRun","dryRun","logger","getDryRunLogger","configPath","info","warn","preferencesDir","result","selectAndConfigureAudioDevice","debug","includes","errorMessage","toString"],"mappings":"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"}
1
+ {"version":3,"file":"select-audio.js","sources":["../../src/commands/select-audio.ts"],"sourcesContent":["#!/usr/bin/env node\nimport path from 'path';\nimport os from 'os';\nimport { getDryRunLogger } from '../logging';\nimport { Config } from '../types';\nimport { selectAndConfigureAudioDevice } from '@theunwalked/unplayable';\n\nconst getUnplayableConfigPath = (): string => {\n try {\n return path.join(os.homedir(), '.unplayable', 'audio-device.json');\n } catch (error: any) {\n throw new Error(`Failed to determine home directory: ${error.message}`);\n }\n};\n\nexport const execute = async (runConfig: Config): Promise<string> => {\n const isDryRun = runConfig.dryRun || false;\n const logger = getDryRunLogger(isDryRun);\n\n if (isDryRun) {\n try {\n const configPath = getUnplayableConfigPath();\n logger.info('AUDIO_SELECT_DRY_RUN: Would start audio device selection | Mode: dry-run | Purpose: Choose input device');\n logger.info('AUDIO_SELECT_SAVE_DRY_RUN: Would save device to config | Mode: dry-run | Path: %s', configPath);\n return 'Audio device selection completed (dry run)';\n } catch (error: any) {\n logger.warn('AUDIO_SELECT_CONFIG_PATH_ERROR: Error determining config path | Error: %s | Impact: Cannot show save location', error.message);\n return 'Audio device selection completed (dry run)';\n }\n }\n\n try {\n const preferencesDir = path.join(os.homedir(), '.unplayable');\n const result = await selectAndConfigureAudioDevice(preferencesDir, logger, runConfig.debug);\n return result;\n } catch (error: any) {\n // Check if this is a home directory error\n if (error.message && error.message.includes('Failed to determine home directory')) {\n logger.error('AUDIO_SELECT_FAILED: Audio device selection failed | Error: %s', error.message);\n throw new Error(`Failed to determine home directory: ${error.message}`);\n } else {\n const errorMessage = error.message || error.toString();\n logger.error('AUDIO_SELECT_COMMAND_FAILED: Audio device selection command failed | Error: %s | Status: failed', errorMessage);\n throw new Error(`Audio device selection failed: ${errorMessage}`);\n }\n }\n};\n"],"names":["getUnplayableConfigPath","path","join","os","homedir","error","Error","message","execute","runConfig","isDryRun","dryRun","logger","getDryRunLogger","configPath","info","warn","preferencesDir","result","selectAndConfigureAudioDevice","debug","includes","errorMessage","toString"],"mappings":"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"}
@@ -363,7 +363,7 @@ const extractPublishedVersion = async (packageDir, packageLogger)=>{
363
363
  }
364
364
  };
365
365
  // Enhanced run function that can show output based on log level
366
- const runWithLogging = async (command, packageLogger, options = {}, showOutput = 'none')=>{
366
+ const runWithLogging = async (command, packageLogger, options = {}, showOutput = 'none', logFilePath)=>{
367
367
  const execPromise = util.promisify(exec);
368
368
  // Ensure encoding is set to 'utf8' to get string output instead of Buffer
369
369
  const execOptions = {
@@ -377,6 +377,24 @@ const runWithLogging = async (command, packageLogger, options = {}, showOutput =
377
377
  } else if (showOutput === 'minimal') {
378
378
  packageLogger.verbose(`Running: ${command}`);
379
379
  }
380
+ // Helper to write to log file
381
+ const writeToLogFile = async (content)=>{
382
+ if (!logFilePath) return;
383
+ try {
384
+ const logDir = path__default.dirname(logFilePath);
385
+ await fs.mkdir(logDir, {
386
+ recursive: true
387
+ });
388
+ await fs.appendFile(logFilePath, content + '\n', 'utf-8');
389
+ } catch (err) {
390
+ packageLogger.warn(`Failed to write to log file ${logFilePath}: ${err.message}`);
391
+ }
392
+ };
393
+ // Write command to log file
394
+ if (logFilePath) {
395
+ const timestamp = new Date().toISOString();
396
+ await writeToLogFile(`[${timestamp}] Executing: ${command}\n`);
397
+ }
380
398
  try {
381
399
  const result = await execPromise(command, execOptions);
382
400
  if (showOutput === 'full') {
@@ -401,6 +419,18 @@ const runWithLogging = async (command, packageLogger, options = {}, showOutput =
401
419
  });
402
420
  }
403
421
  }
422
+ // Write output to log file
423
+ if (logFilePath) {
424
+ const stdout = String(result.stdout);
425
+ const stderr = String(result.stderr);
426
+ if (stdout.trim()) {
427
+ await writeToLogFile(`\n=== STDOUT ===\n${stdout}`);
428
+ }
429
+ if (stderr.trim()) {
430
+ await writeToLogFile(`\n=== STDERR ===\n${stderr}`);
431
+ }
432
+ await writeToLogFile(`\n[${new Date().toISOString()}] Command completed successfully\n`);
433
+ }
404
434
  // Ensure result is properly typed as strings
405
435
  return {
406
436
  stdout: String(result.stdout),
@@ -426,6 +456,19 @@ const runWithLogging = async (command, packageLogger, options = {}, showOutput =
426
456
  });
427
457
  }
428
458
  }
459
+ // Write error output to log file
460
+ if (logFilePath) {
461
+ await writeToLogFile(`\n[${new Date().toISOString()}] Command failed: ${error.message}`);
462
+ if (error.stdout) {
463
+ await writeToLogFile(`\n=== STDOUT ===\n${error.stdout}`);
464
+ }
465
+ if (error.stderr) {
466
+ await writeToLogFile(`\n=== STDERR ===\n${error.stderr}`);
467
+ }
468
+ if (error.stack) {
469
+ await writeToLogFile(`\n=== STACK TRACE ===\n${error.stack}`);
470
+ }
471
+ }
429
472
  throw error;
430
473
  }
431
474
  };
@@ -473,6 +516,15 @@ const executePackage = async (packageName, packageInfo, commandToRun, runConfig,
473
516
  const packageLogger = createPackageLogger(packageName, index + 1, total, isDryRun);
474
517
  const packageDir = packageInfo.path;
475
518
  const logger = getLogger();
519
+ // Create log file path for publish commands
520
+ let logFilePath;
521
+ if (isBuiltInCommand && commandToRun.includes('publish')) {
522
+ var _commandToRun_split_;
523
+ const outputDir = runConfig.outputDirectory || 'output/kodrdriv';
524
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-').replace('T', '_').split('.')[0];
525
+ const commandName = ((_commandToRun_split_ = commandToRun.split(' ')[1]) === null || _commandToRun_split_ === void 0 ? void 0 : _commandToRun_split_.split(' ')[0]) || 'command';
526
+ logFilePath = path__default.join(packageDir, outputDir, `${commandName}_${timestamp}.log`);
527
+ }
476
528
  // Determine output level based on flags
477
529
  // For publish commands, default to full output to show OpenAI progress and other details
478
530
  // For other commands, require --verbose or --debug for output
@@ -624,17 +676,18 @@ const executePackage = async (packageName, packageInfo, commandToRun, runConfig,
624
676
  if (builtInCommandName === 'publish') {
625
677
  packageLogger.info(`⏰ Setting timeout of ${commandTimeoutMs / 60000} minutes for publish command`);
626
678
  }
627
- const commandPromise = runWithLogging(effectiveCommand, packageLogger, {}, showOutput);
679
+ const commandPromise = runWithLogging(effectiveCommand, packageLogger, {}, showOutput, logFilePath);
628
680
  const commandTimeoutPromise = new Promise((_, reject)=>{
629
681
  setTimeout(()=>reject(new Error(`Command timed out after ${commandTimeoutMs / 60000} minutes`)), commandTimeoutMs);
630
682
  });
631
683
  try {
632
- const { stdout } = await Promise.race([
684
+ const { stdout, stderr } = await Promise.race([
633
685
  commandPromise,
634
686
  commandTimeoutPromise
635
687
  ]);
636
688
  // Detect explicit skip marker from publish to avoid propagating versions
637
- if (builtInCommandName === 'publish' && stdout && stdout.includes('KODRDRIV_PUBLISH_SKIPPED')) {
689
+ // Check both stdout (where we now write it) and stderr (winston logger output, for backward compat)
690
+ if (builtInCommandName === 'publish' && (stdout && stdout.includes('KODRDRIV_PUBLISH_SKIPPED') || stderr && stderr.includes('KODRDRIV_PUBLISH_SKIPPED'))) {
638
691
  packageLogger.info('Publish skipped for this package; will not record or propagate a version.');
639
692
  publishWasSkipped = true;
640
693
  }
@@ -648,7 +701,7 @@ const executePackage = async (packageName, packageInfo, commandToRun, runConfig,
648
701
  }
649
702
  } else {
650
703
  // For custom commands, use the existing logic
651
- await runWithLogging(commandToRun, packageLogger, {}, showOutput);
704
+ await runWithLogging(commandToRun, packageLogger, {}, showOutput, logFilePath);
652
705
  }
653
706
  // Track published version after successful publish (skip during dry run)
654
707
  if (!isDryRun && isBuiltInCommand && commandToRun.includes('publish')) {
@@ -717,7 +770,8 @@ const executePackage = async (packageName, packageInfo, commandToRun, runConfig,
717
770
  }
718
771
  return {
719
772
  success: true,
720
- skippedNoChanges: publishWasSkipped
773
+ skippedNoChanges: publishWasSkipped,
774
+ logFile: logFilePath
721
775
  };
722
776
  } catch (error) {
723
777
  var _error_message;
@@ -732,7 +786,8 @@ const executePackage = async (packageName, packageInfo, commandToRun, runConfig,
732
786
  return {
733
787
  success: false,
734
788
  error,
735
- isTimeoutError
789
+ isTimeoutError,
790
+ logFile: logFilePath
736
791
  };
737
792
  }
738
793
  };
@@ -842,7 +897,7 @@ const checkTreePublishStatus = async ()=>{
842
897
  }
843
898
  };
844
899
  const execute = async (runConfig)=>{
845
- var _runConfig_tree, _runConfig_tree1, _runConfig_tree2, _runConfig_tree3, _runConfig_tree4, _runConfig_tree5, _runConfig_tree6, _runConfig_tree7, _runConfig_tree8, _runConfig_tree9, _runConfig_tree10, _runConfig_tree11, _runConfig_tree12, _runConfig_tree13, _runConfig_tree14;
900
+ var _runConfig_tree, _runConfig_tree1, _runConfig_tree2, _runConfig_tree3, _runConfig_tree4, _runConfig_tree5, _runConfig_tree6, _runConfig_tree7, _runConfig_tree8, _runConfig_tree9, _runConfig_tree10, _runConfig_tree11, _runConfig_tree12, _runConfig_tree13, _runConfig_tree14, _runConfig_tree15;
846
901
  const logger = getLogger();
847
902
  const isDryRun = runConfig.dryRun || false;
848
903
  const isContinue = ((_runConfig_tree = runConfig.tree) === null || _runConfig_tree === void 0 ? void 0 : _runConfig_tree.continue) || false;
@@ -865,17 +920,57 @@ const execute = async (runConfig)=>{
865
920
  logger.info('You can now run the tree command with --continue to resume from the next package.');
866
921
  return `Package '${promotePackage}' promoted to completed status.`;
867
922
  }
923
+ // Handle audit-branches command
924
+ if ((_runConfig_tree4 = runConfig.tree) === null || _runConfig_tree4 === void 0 ? void 0 : _runConfig_tree4.auditBranches) {
925
+ var _runConfig_tree16, _runConfig_tree17, _runConfig_publish;
926
+ logger.info('🔍 Auditing branch state across all packages...');
927
+ const directories = ((_runConfig_tree16 = runConfig.tree) === null || _runConfig_tree16 === void 0 ? void 0 : _runConfig_tree16.directories) || [
928
+ process.cwd()
929
+ ];
930
+ const excludedPatterns = ((_runConfig_tree17 = runConfig.tree) === null || _runConfig_tree17 === void 0 ? void 0 : _runConfig_tree17.exclude) || [];
931
+ let allPackageJsonPaths = [];
932
+ for (const targetDirectory of directories){
933
+ const packageJsonPaths = await scanForPackageJsonFiles(targetDirectory, excludedPatterns);
934
+ allPackageJsonPaths = allPackageJsonPaths.concat(packageJsonPaths);
935
+ }
936
+ if (allPackageJsonPaths.length === 0) {
937
+ return 'No packages found';
938
+ }
939
+ const dependencyGraph = await buildDependencyGraph(allPackageJsonPaths);
940
+ const packages = Array.from(dependencyGraph.packages.values()).map((pkg)=>({
941
+ name: pkg.name,
942
+ path: pkg.path
943
+ }));
944
+ const { auditBranchState, formatAuditResults } = await import('../utils/branchState.js');
945
+ // For publish workflows, check branch consistency, merge conflicts, and existing PRs
946
+ // Don't pass an expected branch - let the audit find the most common branch
947
+ const targetBranch = ((_runConfig_publish = runConfig.publish) === null || _runConfig_publish === void 0 ? void 0 : _runConfig_publish.targetBranch) || 'main';
948
+ logger.info(`Checking for merge conflicts with '${targetBranch}' and existing pull requests...`);
949
+ const auditResult = await auditBranchState(packages, undefined, {
950
+ targetBranch,
951
+ checkPR: true,
952
+ checkConflicts: true
953
+ });
954
+ const formatted = formatAuditResults(auditResult);
955
+ logger.info('\n' + formatted);
956
+ if (auditResult.issuesFound > 0) {
957
+ logger.warn(`\n⚠️ Found issues in ${auditResult.issuesFound} package(s). Review the fixes above.`);
958
+ return `Branch audit complete: ${auditResult.issuesFound} package(s) need attention`;
959
+ }
960
+ logger.info(`\n✅ All ${auditResult.goodPackages} package(s) are in good state!`);
961
+ return `Branch audit complete: All packages OK`;
962
+ }
868
963
  // Handle parallel execution recovery commands
869
964
  const { loadRecoveryManager } = await import('../execution/RecoveryManager.js');
870
965
  // Handle status-parallel command
871
- if ((_runConfig_tree4 = runConfig.tree) === null || _runConfig_tree4 === void 0 ? void 0 : _runConfig_tree4.statusParallel) {
872
- var _runConfig_tree15, _runConfig_tree16;
966
+ if ((_runConfig_tree5 = runConfig.tree) === null || _runConfig_tree5 === void 0 ? void 0 : _runConfig_tree5.statusParallel) {
967
+ var _runConfig_tree18, _runConfig_tree19;
873
968
  logger.info('📊 Checking parallel execution status...');
874
969
  // Need to build dependency graph first
875
- const directories = ((_runConfig_tree15 = runConfig.tree) === null || _runConfig_tree15 === void 0 ? void 0 : _runConfig_tree15.directories) || [
970
+ const directories = ((_runConfig_tree18 = runConfig.tree) === null || _runConfig_tree18 === void 0 ? void 0 : _runConfig_tree18.directories) || [
876
971
  process.cwd()
877
972
  ];
878
- const excludedPatterns = ((_runConfig_tree16 = runConfig.tree) === null || _runConfig_tree16 === void 0 ? void 0 : _runConfig_tree16.exclude) || [];
973
+ const excludedPatterns = ((_runConfig_tree19 = runConfig.tree) === null || _runConfig_tree19 === void 0 ? void 0 : _runConfig_tree19.exclude) || [];
879
974
  let allPackageJsonPaths = [];
880
975
  for (const targetDirectory of directories){
881
976
  const packageJsonPaths = await scanForPackageJsonFiles(targetDirectory, excludedPatterns);
@@ -895,13 +990,13 @@ const execute = async (runConfig)=>{
895
990
  return status;
896
991
  }
897
992
  // Handle validate-state command
898
- if ((_runConfig_tree5 = runConfig.tree) === null || _runConfig_tree5 === void 0 ? void 0 : _runConfig_tree5.validateState) {
899
- var _runConfig_tree17, _runConfig_tree18;
993
+ if ((_runConfig_tree6 = runConfig.tree) === null || _runConfig_tree6 === void 0 ? void 0 : _runConfig_tree6.validateState) {
994
+ var _runConfig_tree20, _runConfig_tree21;
900
995
  logger.info('🔍 Validating checkpoint state...');
901
- const directories = ((_runConfig_tree17 = runConfig.tree) === null || _runConfig_tree17 === void 0 ? void 0 : _runConfig_tree17.directories) || [
996
+ const directories = ((_runConfig_tree20 = runConfig.tree) === null || _runConfig_tree20 === void 0 ? void 0 : _runConfig_tree20.directories) || [
902
997
  process.cwd()
903
998
  ];
904
- const excludedPatterns = ((_runConfig_tree18 = runConfig.tree) === null || _runConfig_tree18 === void 0 ? void 0 : _runConfig_tree18.exclude) || [];
999
+ const excludedPatterns = ((_runConfig_tree21 = runConfig.tree) === null || _runConfig_tree21 === void 0 ? void 0 : _runConfig_tree21.exclude) || [];
905
1000
  let allPackageJsonPaths = [];
906
1001
  for (const targetDirectory of directories){
907
1002
  const packageJsonPaths = await scanForPackageJsonFiles(targetDirectory, excludedPatterns);
@@ -934,7 +1029,7 @@ const execute = async (runConfig)=>{
934
1029
  return validation.valid ? 'Checkpoint is valid' : 'Checkpoint has issues';
935
1030
  }
936
1031
  // Handle parallel execution recovery options (must happen before main execution)
937
- const hasRecoveryOptions = ((_runConfig_tree6 = runConfig.tree) === null || _runConfig_tree6 === void 0 ? void 0 : _runConfig_tree6.markCompleted) || ((_runConfig_tree7 = runConfig.tree) === null || _runConfig_tree7 === void 0 ? void 0 : _runConfig_tree7.skipPackages) || ((_runConfig_tree8 = runConfig.tree) === null || _runConfig_tree8 === void 0 ? void 0 : _runConfig_tree8.retryFailed) || ((_runConfig_tree9 = runConfig.tree) === null || _runConfig_tree9 === void 0 ? void 0 : _runConfig_tree9.skipFailed) || ((_runConfig_tree10 = runConfig.tree) === null || _runConfig_tree10 === void 0 ? void 0 : _runConfig_tree10.resetPackage);
1032
+ const hasRecoveryOptions = ((_runConfig_tree7 = runConfig.tree) === null || _runConfig_tree7 === void 0 ? void 0 : _runConfig_tree7.markCompleted) || ((_runConfig_tree8 = runConfig.tree) === null || _runConfig_tree8 === void 0 ? void 0 : _runConfig_tree8.skipPackages) || ((_runConfig_tree9 = runConfig.tree) === null || _runConfig_tree9 === void 0 ? void 0 : _runConfig_tree9.retryFailed) || ((_runConfig_tree10 = runConfig.tree) === null || _runConfig_tree10 === void 0 ? void 0 : _runConfig_tree10.skipFailed) || ((_runConfig_tree11 = runConfig.tree) === null || _runConfig_tree11 === void 0 ? void 0 : _runConfig_tree11.resetPackage);
938
1033
  if (hasRecoveryOptions && runConfig.tree) {
939
1034
  var _runConfig_tree_retry;
940
1035
  logger.info('🔧 Applying recovery options...');
@@ -970,10 +1065,10 @@ const execute = async (runConfig)=>{
970
1065
  }
971
1066
  // Handle continue mode
972
1067
  if (isContinue) {
973
- var _runConfig_tree19;
1068
+ var _runConfig_tree22;
974
1069
  // For parallel execution, the checkpoint is managed by DynamicTaskPool/CheckpointManager
975
1070
  // For sequential execution, we use the legacy context file
976
- const isParallelMode = (_runConfig_tree19 = runConfig.tree) === null || _runConfig_tree19 === void 0 ? void 0 : _runConfig_tree19.parallel;
1071
+ const isParallelMode = (_runConfig_tree22 = runConfig.tree) === null || _runConfig_tree22 === void 0 ? void 0 : _runConfig_tree22.parallel;
977
1072
  if (!isParallelMode) {
978
1073
  // Sequential execution: load legacy context
979
1074
  const savedContext = await loadExecutionContext(runConfig.outputDirectory);
@@ -1017,7 +1112,7 @@ const execute = async (runConfig)=>{
1017
1112
  executionContext = null;
1018
1113
  }
1019
1114
  // Check if we're in built-in command mode (tree command with second argument)
1020
- const builtInCommand = (_runConfig_tree11 = runConfig.tree) === null || _runConfig_tree11 === void 0 ? void 0 : _runConfig_tree11.builtInCommand;
1115
+ const builtInCommand = (_runConfig_tree12 = runConfig.tree) === null || _runConfig_tree12 === void 0 ? void 0 : _runConfig_tree12.builtInCommand;
1021
1116
  const supportedBuiltInCommands = [
1022
1117
  'commit',
1023
1118
  'publish',
@@ -1034,8 +1129,8 @@ const execute = async (runConfig)=>{
1034
1129
  }
1035
1130
  // Handle run subcommand - convert space-separated scripts to npm run commands
1036
1131
  if (builtInCommand === 'run') {
1037
- var _runConfig_tree20;
1038
- const packageArgument = (_runConfig_tree20 = runConfig.tree) === null || _runConfig_tree20 === void 0 ? void 0 : _runConfig_tree20.packageArgument;
1132
+ var _runConfig_tree23;
1133
+ const packageArgument = (_runConfig_tree23 = runConfig.tree) === null || _runConfig_tree23 === void 0 ? void 0 : _runConfig_tree23.packageArgument;
1039
1134
  if (!packageArgument) {
1040
1135
  throw new Error('run subcommand requires script names. Usage: kodrdriv tree run "clean build test"');
1041
1136
  }
@@ -1058,11 +1153,11 @@ const execute = async (runConfig)=>{
1058
1153
  runConfig.__scriptsToValidate = scripts;
1059
1154
  }
1060
1155
  // Determine the target directories - either specified or current working directory
1061
- const directories = ((_runConfig_tree12 = runConfig.tree) === null || _runConfig_tree12 === void 0 ? void 0 : _runConfig_tree12.directories) || [
1156
+ const directories = ((_runConfig_tree13 = runConfig.tree) === null || _runConfig_tree13 === void 0 ? void 0 : _runConfig_tree13.directories) || [
1062
1157
  process.cwd()
1063
1158
  ];
1064
1159
  // Handle link status subcommand
1065
- if (builtInCommand === 'link' && ((_runConfig_tree13 = runConfig.tree) === null || _runConfig_tree13 === void 0 ? void 0 : _runConfig_tree13.packageArgument) === 'status') {
1160
+ if (builtInCommand === 'link' && ((_runConfig_tree14 = runConfig.tree) === null || _runConfig_tree14 === void 0 ? void 0 : _runConfig_tree14.packageArgument) === 'status') {
1066
1161
  // For tree link status, we want to show status across all packages
1067
1162
  logger.info(`${isDryRun ? 'DRY RUN: ' : ''}Running link status across workspace...`);
1068
1163
  // Create a config that will be passed to the link command
@@ -1082,7 +1177,7 @@ const execute = async (runConfig)=>{
1082
1177
  }
1083
1178
  }
1084
1179
  // Handle unlink status subcommand
1085
- if (builtInCommand === 'unlink' && ((_runConfig_tree14 = runConfig.tree) === null || _runConfig_tree14 === void 0 ? void 0 : _runConfig_tree14.packageArgument) === 'status') {
1180
+ if (builtInCommand === 'unlink' && ((_runConfig_tree15 = runConfig.tree) === null || _runConfig_tree15 === void 0 ? void 0 : _runConfig_tree15.packageArgument) === 'status') {
1086
1181
  // For tree unlink status, we want to show status across all packages
1087
1182
  logger.info(`${isDryRun ? 'DRY RUN: ' : ''}Running unlink status across workspace...`);
1088
1183
  // Create a config that will be passed to the unlink command
@@ -1107,9 +1202,9 @@ const execute = async (runConfig)=>{
1107
1202
  logger.info(`${isDryRun ? 'DRY RUN: ' : ''}Analyzing workspaces at: ${directories.join(', ')}`);
1108
1203
  }
1109
1204
  try {
1110
- var _runConfig_tree21, _runConfig_tree22, _runConfig_tree23, _runConfig_tree24;
1205
+ var _runConfig_tree24, _runConfig_tree25, _runConfig_tree26, _runConfig_tree27;
1111
1206
  // Get exclusion patterns from config, fallback to empty array
1112
- const excludedPatterns = ((_runConfig_tree21 = runConfig.tree) === null || _runConfig_tree21 === void 0 ? void 0 : _runConfig_tree21.exclude) || [];
1207
+ const excludedPatterns = ((_runConfig_tree24 = runConfig.tree) === null || _runConfig_tree24 === void 0 ? void 0 : _runConfig_tree24.exclude) || [];
1113
1208
  if (excludedPatterns.length > 0) {
1114
1209
  logger.verbose(`${isDryRun ? 'DRY RUN: ' : ''}Using exclusion patterns: ${excludedPatterns.join(', ')}`);
1115
1210
  }
@@ -1136,7 +1231,7 @@ const execute = async (runConfig)=>{
1136
1231
  logger.verbose(`${isDryRun ? 'DRY RUN: ' : ''}Determining build order...`);
1137
1232
  let buildOrder = topologicalSort(dependencyGraph);
1138
1233
  // Handle start-from functionality if specified
1139
- const startFrom = (_runConfig_tree22 = runConfig.tree) === null || _runConfig_tree22 === void 0 ? void 0 : _runConfig_tree22.startFrom;
1234
+ const startFrom = (_runConfig_tree25 = runConfig.tree) === null || _runConfig_tree25 === void 0 ? void 0 : _runConfig_tree25.startFrom;
1140
1235
  if (startFrom) {
1141
1236
  logger.verbose(`${isDryRun ? 'DRY RUN: ' : ''}Looking for start package: ${startFrom}`);
1142
1237
  // Resolve the actual package name (can be package name or directory name)
@@ -1193,7 +1288,7 @@ const execute = async (runConfig)=>{
1193
1288
  logger.info(`${isDryRun ? 'DRY RUN: ' : ''}Starting execution from package '${startFrom}' (${buildOrder.length} of ${originalLength} packages remaining).`);
1194
1289
  }
1195
1290
  // Handle stop-at functionality if specified
1196
- const stopAt = (_runConfig_tree23 = runConfig.tree) === null || _runConfig_tree23 === void 0 ? void 0 : _runConfig_tree23.stopAt;
1291
+ const stopAt = (_runConfig_tree26 = runConfig.tree) === null || _runConfig_tree26 === void 0 ? void 0 : _runConfig_tree26.stopAt;
1197
1292
  if (stopAt) {
1198
1293
  logger.verbose(`${isDryRun ? 'DRY RUN: ' : ''}Looking for stop package: ${stopAt}`);
1199
1294
  // Find the package that matches the stopAt directory name
@@ -1512,8 +1607,8 @@ const execute = async (runConfig)=>{
1512
1607
  }
1513
1608
  // Handle special "checkout" command that switches all packages to specified branch
1514
1609
  if (builtInCommand === 'checkout') {
1515
- var _runConfig_tree25;
1516
- const targetBranch = (_runConfig_tree25 = runConfig.tree) === null || _runConfig_tree25 === void 0 ? void 0 : _runConfig_tree25.packageArgument;
1610
+ var _runConfig_tree28;
1611
+ const targetBranch = (_runConfig_tree28 = runConfig.tree) === null || _runConfig_tree28 === void 0 ? void 0 : _runConfig_tree28.packageArgument;
1517
1612
  if (!targetBranch) {
1518
1613
  throw new Error('checkout subcommand requires a branch name. Usage: kodrdriv tree checkout <branch-name>');
1519
1614
  }
@@ -1692,12 +1787,12 @@ const execute = async (runConfig)=>{
1692
1787
  returnOutput = `\nBuild order: ${buildOrder.join(' → ')}\n`;
1693
1788
  }
1694
1789
  // Execute command if provided (custom command or built-in command)
1695
- const cmd = (_runConfig_tree24 = runConfig.tree) === null || _runConfig_tree24 === void 0 ? void 0 : _runConfig_tree24.cmd;
1790
+ const cmd = (_runConfig_tree27 = runConfig.tree) === null || _runConfig_tree27 === void 0 ? void 0 : _runConfig_tree27.cmd;
1696
1791
  // Determine command to execute
1697
1792
  let commandToRun;
1698
1793
  let isBuiltInCommand = false;
1699
1794
  if (builtInCommand) {
1700
- var _runConfig_tree26, _runConfig_tree27, _runConfig_tree28;
1795
+ var _runConfig_tree29, _runConfig_tree30, _runConfig_tree31;
1701
1796
  // Built-in command mode: shell out to kodrdriv subprocess
1702
1797
  // Build command with propagated global options
1703
1798
  const globalOptions = [];
@@ -1714,14 +1809,14 @@ const execute = async (runConfig)=>{
1714
1809
  // Build the command with global options
1715
1810
  const optionsString = globalOptions.length > 0 ? ` ${globalOptions.join(' ')}` : '';
1716
1811
  // Add package argument for link/unlink/updates commands
1717
- const packageArg = (_runConfig_tree26 = runConfig.tree) === null || _runConfig_tree26 === void 0 ? void 0 : _runConfig_tree26.packageArgument;
1812
+ const packageArg = (_runConfig_tree29 = runConfig.tree) === null || _runConfig_tree29 === void 0 ? void 0 : _runConfig_tree29.packageArgument;
1718
1813
  const packageArgString = packageArg && (builtInCommand === 'link' || builtInCommand === 'unlink' || builtInCommand === 'updates') ? ` "${packageArg}"` : '';
1719
1814
  // Add command-specific options
1720
1815
  let commandSpecificOptions = '';
1721
- if (builtInCommand === 'unlink' && ((_runConfig_tree27 = runConfig.tree) === null || _runConfig_tree27 === void 0 ? void 0 : _runConfig_tree27.cleanNodeModules)) {
1816
+ if (builtInCommand === 'unlink' && ((_runConfig_tree30 = runConfig.tree) === null || _runConfig_tree30 === void 0 ? void 0 : _runConfig_tree30.cleanNodeModules)) {
1722
1817
  commandSpecificOptions += ' --clean-node-modules';
1723
1818
  }
1724
- if ((builtInCommand === 'link' || builtInCommand === 'unlink') && ((_runConfig_tree28 = runConfig.tree) === null || _runConfig_tree28 === void 0 ? void 0 : _runConfig_tree28.externals) && runConfig.tree.externals.length > 0) {
1819
+ if ((builtInCommand === 'link' || builtInCommand === 'unlink') && ((_runConfig_tree31 = runConfig.tree) === null || _runConfig_tree31 === void 0 ? void 0 : _runConfig_tree31.externals) && runConfig.tree.externals.length > 0) {
1725
1820
  commandSpecificOptions += ` --externals ${runConfig.tree.externals.join(' ')}`;
1726
1821
  }
1727
1822
  commandToRun = `kodrdriv ${builtInCommand}${optionsString}${packageArgString}${commandSpecificOptions}`;
@@ -1731,7 +1826,7 @@ const execute = async (runConfig)=>{
1731
1826
  commandToRun = cmd;
1732
1827
  }
1733
1828
  if (commandToRun) {
1734
- var _runConfig_tree29, _runConfig_tree30;
1829
+ var _runConfig_tree32, _runConfig_tree33;
1735
1830
  // Validate scripts for run command before execution
1736
1831
  const scriptsToValidate = runConfig.__scriptsToValidate;
1737
1832
  if (scriptsToValidate && scriptsToValidate.length > 0) {
@@ -1750,7 +1845,7 @@ const execute = async (runConfig)=>{
1750
1845
  }
1751
1846
  }
1752
1847
  // Validate command for parallel execution if parallel mode is enabled
1753
- if ((_runConfig_tree29 = runConfig.tree) === null || _runConfig_tree29 === void 0 ? void 0 : _runConfig_tree29.parallel) {
1848
+ if ((_runConfig_tree32 = runConfig.tree) === null || _runConfig_tree32 === void 0 ? void 0 : _runConfig_tree32.parallel) {
1754
1849
  const { CommandValidator } = await import('../execution/CommandValidator.js');
1755
1850
  const validation = CommandValidator.validateForParallel(commandToRun, builtInCommand);
1756
1851
  CommandValidator.logValidation(validation);
@@ -1801,7 +1896,7 @@ const execute = async (runConfig)=>{
1801
1896
  // If continuing, start from where we left off
1802
1897
  const startIndex = isContinue && executionContext ? executionContext.completedPackages.length : 0;
1803
1898
  // Check if parallel execution is enabled
1804
- if ((_runConfig_tree30 = runConfig.tree) === null || _runConfig_tree30 === void 0 ? void 0 : _runConfig_tree30.parallel) {
1899
+ if ((_runConfig_tree33 = runConfig.tree) === null || _runConfig_tree33 === void 0 ? void 0 : _runConfig_tree33.parallel) {
1805
1900
  var _runConfig_tree_retry1, _runConfig_tree_retry2, _runConfig_tree_retry3, _runConfig_tree_retry4;
1806
1901
  logger.info('🚀 Using parallel execution mode');
1807
1902
  // If dry run, show preview instead of executing