@eldrforge/kodrdriv 0.0.51 → 0.1.0

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 (61) hide show
  1. package/README.md +2 -1
  2. package/dist/application.js +5 -3
  3. package/dist/application.js.map +1 -1
  4. package/dist/arguments.js +97 -70
  5. package/dist/arguments.js.map +1 -1
  6. package/dist/commands/audio-commit.js +7 -7
  7. package/dist/commands/audio-commit.js.map +1 -1
  8. package/dist/commands/audio-review.js +13 -13
  9. package/dist/commands/audio-review.js.map +1 -1
  10. package/dist/commands/clean.js +2 -2
  11. package/dist/commands/clean.js.map +1 -1
  12. package/dist/commands/commit.js +301 -36
  13. package/dist/commands/commit.js.map +1 -1
  14. package/dist/commands/link.js +7 -7
  15. package/dist/commands/link.js.map +1 -1
  16. package/dist/commands/publish.js +285 -306
  17. package/dist/commands/publish.js.map +1 -1
  18. package/dist/commands/release.js +171 -14
  19. package/dist/commands/release.js.map +1 -1
  20. package/dist/commands/review.js +52 -40
  21. package/dist/commands/review.js.map +1 -1
  22. package/dist/commands/select-audio.js +4 -4
  23. package/dist/commands/select-audio.js.map +1 -1
  24. package/dist/commands/tree.js +347 -34
  25. package/dist/commands/tree.js.map +1 -1
  26. package/dist/commands/unlink.js +5 -5
  27. package/dist/commands/unlink.js.map +1 -1
  28. package/dist/constants.js +28 -9
  29. package/dist/constants.js.map +1 -1
  30. package/dist/content/diff.js +122 -1
  31. package/dist/content/diff.js.map +1 -1
  32. package/dist/content/issues.js +17 -46
  33. package/dist/content/issues.js.map +1 -1
  34. package/dist/logging.js +3 -3
  35. package/dist/logging.js.map +1 -1
  36. package/dist/prompt/commit.js +2 -2
  37. package/dist/prompt/commit.js.map +1 -1
  38. package/dist/prompt/release.js +2 -2
  39. package/dist/prompt/release.js.map +1 -1
  40. package/dist/prompt/review.js +2 -2
  41. package/dist/prompt/review.js.map +1 -1
  42. package/dist/types.js +18 -5
  43. package/dist/types.js.map +1 -1
  44. package/dist/util/child.js +60 -4
  45. package/dist/util/child.js.map +1 -1
  46. package/dist/util/general.js +149 -13
  47. package/dist/util/general.js.map +1 -1
  48. package/dist/util/github.js +12 -8
  49. package/dist/util/github.js.map +1 -1
  50. package/dist/util/interactive.js +297 -0
  51. package/dist/util/interactive.js.map +1 -0
  52. package/dist/util/openai.js +87 -8
  53. package/dist/util/openai.js.map +1 -1
  54. package/dist/util/performance.js +8 -8
  55. package/dist/util/performance.js.map +1 -1
  56. package/dist/util/safety.js +4 -4
  57. package/dist/util/safety.js.map +1 -1
  58. package/dist/util/storage.js +2 -2
  59. package/dist/util/storage.js.map +1 -1
  60. package/package.json +6 -6
  61. package/test-increment.js +0 -0
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
- import path from 'path';
3
- import os from 'os';
2
+ import path__default from 'path';
3
+ import os__default from 'os';
4
4
  import { getDryRunLogger } from '../logging.js';
5
5
  import { selectAndConfigureAudioDevice } from '@theunwalked/unplayable';
6
6
 
7
7
  const getUnplayableConfigPath = ()=>{
8
8
  try {
9
- return path.join(os.homedir(), '.unplayable', 'audio-device.json');
9
+ return path__default.join(os__default.homedir(), '.unplayable', 'audio-device.json');
10
10
  } catch (error) {
11
11
  throw new Error(`Failed to determine home directory: ${error.message}`);
12
12
  }
@@ -26,7 +26,7 @@ const execute = async (runConfig)=>{
26
26
  }
27
27
  }
28
28
  try {
29
- const preferencesDir = path.join(os.homedir(), '.unplayable');
29
+ const preferencesDir = path__default.join(os__default.homedir(), '.unplayable');
30
30
  const result = await selectAndConfigureAudioDevice(preferencesDir, logger, runConfig.debug);
31
31
  return result;
32
32
  } catch (error) {
@@ -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('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":";;;;;;AAOA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAMA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,GAA0B,CAAA,CAAA,CAAA,CAAA,CAAA;IAC5B,CAAA,CAAA,CAAA,CAAI,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,EAAKC,CAAAA,CAAAA,CAAAA,CAAI,CAACC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAGC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAO,CAAA,GAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,mBAAA,CAAA,CAAA;AAClD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAY,CAAA;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAIC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoC,CAAA,CAAED,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAME,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAO,CAAA,CAAE,CAAA,CAAA;AAC1E,CAAA,CAAA,CAAA,CAAA,CAAA;AACJ,CAAA,CAAA;AAEO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAMC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,IAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA;IAC1B,MAAMC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAWD,SAAAA,CAAUE,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAM,IAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACrC,CAAA,CAAA,CAAA,CAAA,MAAMC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,IAASC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAgBH,QAAAA,CAAAA,CAAAA;AAE/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAIA,QAAAA,CAAAA,CAAU,CAAA;QACV,CAAA,CAAA,CAAA,CAAI,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAMI,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAad,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA;AACnBY,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAOG,CAAAA,CAAAA,CAAAA,CAAI,CAAC,4CAAA,CAAA,CAAA;YACZH,MAAAA,CAAOG,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoCD,UAAAA,CAAAA,CAAAA;YAChD,OAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOT,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAY,CAAA;AACjBO,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAOI,CAAAA,CAAAA,CAAAA,CAAI,CAAC,mCAAA,CAAA,CAAqCX,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAME,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAO,CAAA,CAAA;YAC9D,OAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACJ,CAAA,CAAA,CAAA,CAAA,CAAA;IAEA,CAAA,CAAA,CAAA,CAAI,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAMU,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,IAAiBhB,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAKC,CAAAA,CAAAA,CAAAA,CAAI,CAACC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAGC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAO,CAAA,CAAA,CAAA,CAAI,aAAA,CAAA,CAAA;AAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAMc,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,IAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAMC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAA8BF,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAgBL,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQH,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,EAAUW,KAAK,CAAA,CAAA;QAC1F,OAAOF,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA;AACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOb,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAY,CAAA;;QAEjB,CAAA,CAAA,CAAA,CAAIA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAME,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAO,CAAA,CAAA,CAAA,CAAIF,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAME,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAO,CAACc,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAuC,CAAA;AAC/ET,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAOP,CAAAA,CAAAA,CAAAA,CAAAA,CAAK,CAAC,MAAA,CAAA,CAAQA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAME,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAO,CAAA,CAAA;AAClC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAID,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoC,CAAA,CAAED,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAME,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAO,CAAA,CAAE,CAAA,CAAA;QAC1E,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAMe,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAejB,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAME,OAAO,CAAA,CAAA,CAAA,CAAIF,CAAAA,CAAAA,CAAAA,CAAAA,EAAMkB,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQ,CAAA,CAAA,CAAA;YACpDX,MAAAA,CAAOP,CAAAA,CAAAA,CAAAA,CAAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAuCiB,YAAAA,CAAAA,CAAAA;AACpD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAIhB,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAM,CAAC,+BAA+B,CAAA,CAAEgB,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAc,CAAA,CAAA;AACpE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACJ,CAAA,CAAA,CAAA,CAAA,CAAA;AACJ,CAAA,CAAA;;"}
@@ -1,12 +1,207 @@
1
1
  #!/usr/bin/env node
2
- import path from 'path';
3
- import fs from 'fs/promises';
2
+ import path__default from 'path';
3
+ import fs__default from 'fs/promises';
4
4
  import { exec } from 'child_process';
5
5
  import util from 'util';
6
6
  import { getLogger } from '../logging.js';
7
7
  import { create } from '../util/storage.js';
8
8
  import { safeJsonParse, validatePackageJson } from '../util/validation.js';
9
+ import { getOutputPath } from '../util/general.js';
10
+ import { DEFAULT_OUTPUT_DIRECTORY } from '../constants.js';
11
+ import { execute as execute$1 } from './commit.js';
9
12
 
13
+ function _define_property(obj, key, value) {
14
+ if (key in obj) {
15
+ Object.defineProperty(obj, key, {
16
+ value: value,
17
+ enumerable: true,
18
+ configurable: true,
19
+ writable: true
20
+ });
21
+ } else {
22
+ obj[key] = value;
23
+ }
24
+ return obj;
25
+ }
26
+ // Global state to track published versions during tree execution - protected by mutex
27
+ let publishedVersions = [];
28
+ let executionContext = null;
29
+ // Simple mutex to prevent race conditions in global state access
30
+ class SimpleMutex {
31
+ async lock() {
32
+ return new Promise((resolve)=>{
33
+ if (!this.locked) {
34
+ this.locked = true;
35
+ resolve();
36
+ } else {
37
+ this.queue.push(resolve);
38
+ }
39
+ });
40
+ }
41
+ unlock() {
42
+ this.locked = false;
43
+ const next = this.queue.shift();
44
+ if (next) {
45
+ this.locked = true;
46
+ next();
47
+ }
48
+ }
49
+ constructor(){
50
+ _define_property(this, "locked", false);
51
+ _define_property(this, "queue", []);
52
+ }
53
+ }
54
+ const globalStateMutex = new SimpleMutex();
55
+ // Update inter-project dependencies in package.json based on published versions
56
+ const updateInterProjectDependencies = async (packageDir, publishedVersions, allPackageNames, packageLogger, isDryRun)=>{
57
+ const storage = create({
58
+ log: packageLogger.info
59
+ });
60
+ const packageJsonPath = path__default.join(packageDir, 'package.json');
61
+ if (!await storage.exists(packageJsonPath)) {
62
+ packageLogger.verbose('No package.json found, skipping dependency updates');
63
+ return false;
64
+ }
65
+ let hasChanges = false;
66
+ try {
67
+ const packageJsonContent = await storage.readFile(packageJsonPath, 'utf-8');
68
+ const parsed = safeJsonParse(packageJsonContent, packageJsonPath);
69
+ const packageJson = validatePackageJson(parsed, packageJsonPath);
70
+ const sectionsToUpdate = [
71
+ 'dependencies',
72
+ 'devDependencies',
73
+ 'peerDependencies'
74
+ ];
75
+ for (const publishedVersion of publishedVersions){
76
+ const { packageName, version } = publishedVersion;
77
+ // Only update if this is an inter-project dependency (exists in our build tree)
78
+ if (!allPackageNames.has(packageName)) {
79
+ continue;
80
+ }
81
+ // Update the dependency in all relevant sections
82
+ for (const section of sectionsToUpdate){
83
+ const deps = packageJson[section];
84
+ if (deps && deps[packageName]) {
85
+ const oldVersion = deps[packageName];
86
+ const newVersion = `^${version}`;
87
+ if (oldVersion !== newVersion) {
88
+ if (isDryRun) {
89
+ packageLogger.info(`Would update ${section}.${packageName}: ${oldVersion} → ${newVersion}`);
90
+ } else {
91
+ packageLogger.info(`Updating ${section}.${packageName}: ${oldVersion} → ${newVersion}`);
92
+ deps[packageName] = newVersion;
93
+ }
94
+ hasChanges = true;
95
+ }
96
+ }
97
+ }
98
+ }
99
+ if (hasChanges && !isDryRun) {
100
+ // Write updated package.json
101
+ await storage.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\n', 'utf-8');
102
+ packageLogger.info('Inter-project dependencies updated successfully');
103
+ }
104
+ } catch (error) {
105
+ packageLogger.warn(`Failed to update inter-project dependencies: ${error.message}`);
106
+ return false;
107
+ }
108
+ return hasChanges;
109
+ };
110
+ // Get the context file path
111
+ const getContextFilePath = (outputDirectory)=>{
112
+ const outputDir = outputDirectory || DEFAULT_OUTPUT_DIRECTORY;
113
+ return getOutputPath(outputDir, '.kodrdriv-context');
114
+ };
115
+ // Save execution context to file
116
+ const saveExecutionContext = async (context, outputDirectory)=>{
117
+ const storage = create({
118
+ log: ()=>{}
119
+ }); // Silent storage for context operations
120
+ const contextFilePath = getContextFilePath(outputDirectory);
121
+ try {
122
+ // Ensure output directory exists
123
+ await storage.ensureDirectory(path__default.dirname(contextFilePath));
124
+ // Save context with JSON serialization that handles dates
125
+ const contextData = {
126
+ ...context,
127
+ startTime: context.startTime.toISOString(),
128
+ lastUpdateTime: context.lastUpdateTime.toISOString(),
129
+ publishedVersions: context.publishedVersions.map((v)=>({
130
+ ...v,
131
+ publishTime: v.publishTime.toISOString()
132
+ }))
133
+ };
134
+ await storage.writeFile(contextFilePath, JSON.stringify(contextData, null, 2), 'utf-8');
135
+ } catch (error) {
136
+ // Don't fail the entire operation if context saving fails
137
+ const logger = getLogger();
138
+ logger.warn(`Warning: Failed to save execution context: ${error.message}`);
139
+ }
140
+ };
141
+ // Load execution context from file
142
+ const loadExecutionContext = async (outputDirectory)=>{
143
+ const storage = create({
144
+ log: ()=>{}
145
+ }); // Silent storage for context operations
146
+ const contextFilePath = getContextFilePath(outputDirectory);
147
+ try {
148
+ if (!await storage.exists(contextFilePath)) {
149
+ return null;
150
+ }
151
+ const contextContent = await storage.readFile(contextFilePath, 'utf-8');
152
+ const contextData = JSON.parse(contextContent);
153
+ // Restore dates from ISO strings
154
+ return {
155
+ ...contextData,
156
+ startTime: new Date(contextData.startTime),
157
+ lastUpdateTime: new Date(contextData.lastUpdateTime),
158
+ publishedVersions: contextData.publishedVersions.map((v)=>({
159
+ ...v,
160
+ publishTime: new Date(v.publishTime)
161
+ }))
162
+ };
163
+ } catch (error) {
164
+ const logger = getLogger();
165
+ logger.warn(`Warning: Failed to load execution context: ${error.message}`);
166
+ return null;
167
+ }
168
+ };
169
+ // Clean up context file
170
+ const cleanupContext = async (outputDirectory)=>{
171
+ const storage = create({
172
+ log: ()=>{}
173
+ }); // Silent storage for context operations
174
+ const contextFilePath = getContextFilePath(outputDirectory);
175
+ try {
176
+ if (await storage.exists(contextFilePath)) {
177
+ await storage.deleteFile(contextFilePath);
178
+ }
179
+ } catch (error) {
180
+ // Don't fail if cleanup fails
181
+ const logger = getLogger();
182
+ logger.warn(`Warning: Failed to cleanup execution context: ${error.message}`);
183
+ }
184
+ };
185
+ // Extract published version from package.json after successful publish
186
+ const extractPublishedVersion = async (packageDir, packageLogger)=>{
187
+ const storage = create({
188
+ log: packageLogger.info
189
+ });
190
+ const packageJsonPath = path__default.join(packageDir, 'package.json');
191
+ try {
192
+ const packageJsonContent = await storage.readFile(packageJsonPath, 'utf-8');
193
+ const parsed = safeJsonParse(packageJsonContent, packageJsonPath);
194
+ const packageJson = validatePackageJson(parsed, packageJsonPath);
195
+ return {
196
+ packageName: packageJson.name,
197
+ version: packageJson.version,
198
+ publishTime: new Date()
199
+ };
200
+ } catch (error) {
201
+ packageLogger.warn(`Failed to extract published version: ${error.message}`);
202
+ return null;
203
+ }
204
+ };
10
205
  // Enhanced run function that can show output based on log level
11
206
  const runWithLogging = async (command, packageLogger, options = {}, showOutput = 'none')=>{
12
207
  const execPromise = util.promisify(exec);
@@ -108,24 +303,24 @@ const matchesPattern = (filePath, pattern)=>{
108
303
  .replace(/\?/g, '.') // ? matches any single character
109
304
  .replace(/\./g, '\\.'); // Escape literal dots
110
305
  const regex = new RegExp(`^${regexPattern}$`);
111
- return regex.test(filePath) || regex.test(path.basename(filePath));
306
+ return regex.test(filePath) || regex.test(path__default.basename(filePath));
112
307
  };
113
308
  const shouldExclude = (packageJsonPath, excludedPatterns)=>{
114
309
  if (!excludedPatterns || excludedPatterns.length === 0) {
115
310
  return false;
116
311
  }
117
312
  // Check both the full path and relative path patterns
118
- const relativePath = path.relative(process.cwd(), packageJsonPath);
119
- return excludedPatterns.some((pattern)=>matchesPattern(packageJsonPath, pattern) || matchesPattern(relativePath, pattern) || matchesPattern(path.dirname(packageJsonPath), pattern) || matchesPattern(path.dirname(relativePath), pattern));
313
+ const relativePath = path__default.relative(process.cwd(), packageJsonPath);
314
+ return excludedPatterns.some((pattern)=>matchesPattern(packageJsonPath, pattern) || matchesPattern(relativePath, pattern) || matchesPattern(path__default.dirname(packageJsonPath), pattern) || matchesPattern(path__default.dirname(relativePath), pattern));
120
315
  };
121
316
  const scanForPackageJsonFiles = async (directory, excludedPatterns = [])=>{
122
317
  const logger = getLogger();
123
318
  const packageJsonPaths = [];
124
319
  try {
125
320
  // First check if there's a package.json in the specified directory itself
126
- const directPackageJsonPath = path.join(directory, 'package.json');
321
+ const directPackageJsonPath = path__default.join(directory, 'package.json');
127
322
  try {
128
- await fs.access(directPackageJsonPath);
323
+ await fs__default.access(directPackageJsonPath);
129
324
  // Check if this package should be excluded
130
325
  if (!shouldExclude(directPackageJsonPath, excludedPatterns)) {
131
326
  packageJsonPaths.push(directPackageJsonPath);
@@ -137,15 +332,15 @@ const scanForPackageJsonFiles = async (directory, excludedPatterns = [])=>{
137
332
  // No package.json in the root of this directory, that's fine
138
333
  }
139
334
  // Then scan subdirectories for package.json files
140
- const entries = await fs.readdir(directory, {
335
+ const entries = await fs__default.readdir(directory, {
141
336
  withFileTypes: true
142
337
  });
143
338
  for (const entry of entries){
144
339
  if (entry.isDirectory()) {
145
- const subDirPath = path.join(directory, entry.name);
146
- const packageJsonPath = path.join(subDirPath, 'package.json');
340
+ const subDirPath = path__default.join(directory, entry.name);
341
+ const packageJsonPath = path__default.join(subDirPath, 'package.json');
147
342
  try {
148
- await fs.access(packageJsonPath);
343
+ await fs__default.access(packageJsonPath);
149
344
  // Check if this package should be excluded
150
345
  if (shouldExclude(packageJsonPath, excludedPatterns)) {
151
346
  logger.verbose(`Excluding package.json at: ${packageJsonPath} (matches exclusion pattern)`);
@@ -192,7 +387,7 @@ const parsePackageJson = async (packageJsonPath)=>{
192
387
  return {
193
388
  name: packageJson.name,
194
389
  version: packageJson.version || '0.0.0',
195
- path: path.dirname(packageJsonPath),
390
+ path: path__default.dirname(packageJsonPath),
196
391
  dependencies,
197
392
  localDependencies: new Set() // Will be populated later
198
393
  };
@@ -318,7 +513,7 @@ const groupPackagesByDependencyLevels = (graph, buildOrder, runConfig)=>{
318
513
  return levels;
319
514
  };
320
515
  // Execute a single package and return execution result
321
- const executePackage = async (packageName, packageInfo, commandToRun, runConfig, isDryRun, index, total, isBuiltInCommand = false)=>{
516
+ const executePackage = async (packageName, packageInfo, commandToRun, runConfig, isDryRun, index, total, allPackageNames, isBuiltInCommand = false)=>{
322
517
  const packageLogger = createPackageLogger(packageName, index + 1, total, isDryRun);
323
518
  const packageDir = packageInfo.path;
324
519
  const logger = getLogger();
@@ -341,6 +536,23 @@ const executePackage = async (packageName, packageInfo, commandToRun, runConfig,
341
536
  }
342
537
  try {
343
538
  if (isDryRun) {
539
+ // Handle inter-project dependency updates for publish commands in dry run mode
540
+ await globalStateMutex.lock();
541
+ try {
542
+ if (isBuiltInCommand && commandToRun.includes('publish') && publishedVersions.length > 0) {
543
+ packageLogger.info('Would check for inter-project dependency updates before publish...');
544
+ const versionSnapshot = [
545
+ ...publishedVersions
546
+ ]; // Create safe copy
547
+ globalStateMutex.unlock();
548
+ await updateInterProjectDependencies(packageDir, versionSnapshot, allPackageNames, packageLogger, isDryRun);
549
+ } else {
550
+ globalStateMutex.unlock();
551
+ }
552
+ } catch (error) {
553
+ globalStateMutex.unlock();
554
+ throw error;
555
+ }
344
556
  // Use main logger for the specific message tests expect
345
557
  logger.info(`DRY RUN: Would execute: ${commandToRun}`);
346
558
  if (runConfig.debug || runConfig.verbose) {
@@ -354,6 +566,25 @@ const executePackage = async (packageName, packageInfo, commandToRun, runConfig,
354
566
  if (runConfig.debug) {
355
567
  packageLogger.debug(`Changed to directory: ${packageDir}`);
356
568
  }
569
+ // Handle inter-project dependency updates for publish commands before executing
570
+ if (isBuiltInCommand && commandToRun.includes('publish') && publishedVersions.length > 0) {
571
+ packageLogger.info('Updating inter-project dependencies based on previously published packages...');
572
+ const hasUpdates = await updateInterProjectDependencies(packageDir, publishedVersions, allPackageNames, packageLogger, isDryRun);
573
+ if (hasUpdates) {
574
+ // Commit the dependency updates using kodrdriv commit
575
+ packageLogger.info('Committing inter-project dependency updates...');
576
+ try {
577
+ await execute$1({
578
+ ...runConfig,
579
+ dryRun: false
580
+ });
581
+ packageLogger.info('Inter-project dependency updates committed successfully');
582
+ } catch (commitError) {
583
+ packageLogger.warn(`Failed to commit inter-project dependency updates: ${commitError.message}`);
584
+ // Continue with publish anyway - the updates are still in place
585
+ }
586
+ }
587
+ }
357
588
  if (runConfig.debug || runConfig.verbose) {
358
589
  if (isBuiltInCommand) {
359
590
  packageLogger.info(`Executing built-in command: ${commandToRun}`);
@@ -375,6 +606,19 @@ const executePackage = async (packageName, packageInfo, commandToRun, runConfig,
375
606
  // For custom commands, use the existing logic
376
607
  await runWithLogging(commandToRun, packageLogger, {}, showOutput);
377
608
  }
609
+ // Track published version after successful publish
610
+ if (isBuiltInCommand && commandToRun.includes('publish')) {
611
+ const publishedVersion = await extractPublishedVersion(packageDir, packageLogger);
612
+ if (publishedVersion) {
613
+ await globalStateMutex.lock();
614
+ try {
615
+ publishedVersions.push(publishedVersion);
616
+ packageLogger.info(`Tracked published version: ${publishedVersion.packageName}@${publishedVersion.version}`);
617
+ } finally{
618
+ globalStateMutex.unlock();
619
+ }
620
+ }
621
+ }
378
622
  if (runConfig.debug || runConfig.verbose) {
379
623
  packageLogger.info(`Command completed successfully`);
380
624
  } else {
@@ -404,11 +648,42 @@ const executePackage = async (packageName, packageInfo, commandToRun, runConfig,
404
648
  }
405
649
  };
406
650
  const execute = async (runConfig)=>{
407
- var _runConfig_tree, _runConfig_tree1;
651
+ var _runConfig_tree, _runConfig_tree1, _runConfig_tree2;
408
652
  const logger = getLogger();
409
653
  const isDryRun = runConfig.dryRun || false;
654
+ const isContinue = ((_runConfig_tree = runConfig.tree) === null || _runConfig_tree === void 0 ? void 0 : _runConfig_tree.continue) || false;
655
+ // Handle continue mode
656
+ if (isContinue) {
657
+ const savedContext = await loadExecutionContext(runConfig.outputDirectory);
658
+ if (savedContext) {
659
+ logger.info('Continuing previous tree execution...');
660
+ logger.info(`Original command: ${savedContext.command}`);
661
+ logger.info(`Started: ${savedContext.startTime.toISOString()}`);
662
+ logger.info(`Previously completed: ${savedContext.completedPackages.length}/${savedContext.buildOrder.length} packages`);
663
+ // Restore state safely
664
+ await globalStateMutex.lock();
665
+ try {
666
+ publishedVersions = savedContext.publishedVersions;
667
+ } finally{
668
+ globalStateMutex.unlock();
669
+ }
670
+ executionContext = savedContext;
671
+ // Use original config but allow some overrides (like dry run)
672
+ runConfig = {
673
+ ...savedContext.originalConfig,
674
+ dryRun: runConfig.dryRun,
675
+ outputDirectory: runConfig.outputDirectory || savedContext.originalConfig.outputDirectory
676
+ };
677
+ } else {
678
+ logger.warn('No previous execution context found. Starting new execution...');
679
+ }
680
+ } else {
681
+ // Reset published versions tracking for new tree execution
682
+ publishedVersions = [];
683
+ executionContext = null;
684
+ }
410
685
  // Check if we're in built-in command mode (tree command with second argument)
411
- const builtInCommand = (_runConfig_tree = runConfig.tree) === null || _runConfig_tree === void 0 ? void 0 : _runConfig_tree.builtInCommand;
686
+ const builtInCommand = (_runConfig_tree1 = runConfig.tree) === null || _runConfig_tree1 === void 0 ? void 0 : _runConfig_tree1.builtInCommand;
412
687
  const supportedBuiltInCommands = [
413
688
  'commit',
414
689
  'publish',
@@ -419,7 +694,7 @@ const execute = async (runConfig)=>{
419
694
  throw new Error(`Unsupported built-in command: ${builtInCommand}. Supported commands: ${supportedBuiltInCommands.join(', ')}`);
420
695
  }
421
696
  // Determine the target directories - either specified or current working directory
422
- const targetDirectories = ((_runConfig_tree1 = runConfig.tree) === null || _runConfig_tree1 === void 0 ? void 0 : _runConfig_tree1.directories) || [
697
+ const targetDirectories = ((_runConfig_tree2 = runConfig.tree) === null || _runConfig_tree2 === void 0 ? void 0 : _runConfig_tree2.directories) || [
423
698
  process.cwd()
424
699
  ];
425
700
  if (targetDirectories.length === 1) {
@@ -428,9 +703,9 @@ const execute = async (runConfig)=>{
428
703
  logger.info(`${isDryRun ? 'DRY RUN: ' : ''}Analyzing workspaces at: ${targetDirectories.join(', ')}`);
429
704
  }
430
705
  try {
431
- var _runConfig_tree2, _runConfig_tree3, _runConfig_tree4, _runConfig_tree5;
706
+ var _runConfig_tree3, _runConfig_tree4, _runConfig_tree5, _runConfig_tree6;
432
707
  // Get exclusion patterns from config, fallback to empty array
433
- const excludedPatterns = ((_runConfig_tree2 = runConfig.tree) === null || _runConfig_tree2 === void 0 ? void 0 : _runConfig_tree2.excludedPatterns) || [];
708
+ const excludedPatterns = ((_runConfig_tree3 = runConfig.tree) === null || _runConfig_tree3 === void 0 ? void 0 : _runConfig_tree3.excludedPatterns) || [];
434
709
  if (excludedPatterns.length > 0) {
435
710
  logger.verbose(`${isDryRun ? 'DRY RUN: ' : ''}Using exclusion patterns: ${excludedPatterns.join(', ')}`);
436
711
  }
@@ -457,13 +732,13 @@ const execute = async (runConfig)=>{
457
732
  logger.verbose(`${isDryRun ? 'DRY RUN: ' : ''}Determining build order...`);
458
733
  let buildOrder = topologicalSort(dependencyGraph);
459
734
  // Handle start-from functionality if specified
460
- const startFrom = (_runConfig_tree3 = runConfig.tree) === null || _runConfig_tree3 === void 0 ? void 0 : _runConfig_tree3.startFrom;
735
+ const startFrom = (_runConfig_tree4 = runConfig.tree) === null || _runConfig_tree4 === void 0 ? void 0 : _runConfig_tree4.startFrom;
461
736
  if (startFrom) {
462
737
  logger.verbose(`${isDryRun ? 'DRY RUN: ' : ''}Looking for start package: ${startFrom}`);
463
738
  // Find the package that matches the startFrom directory name
464
739
  const startIndex = buildOrder.findIndex((packageName)=>{
465
740
  const packageInfo = dependencyGraph.packages.get(packageName);
466
- const dirName = path.basename(packageInfo.path);
741
+ const dirName = path__default.basename(packageInfo.path);
467
742
  return dirName === startFrom || packageName === startFrom;
468
743
  });
469
744
  if (startIndex === -1) {
@@ -477,7 +752,7 @@ const execute = async (runConfig)=>{
477
752
  for (const packageJsonPath of allPackageJsonPathsForCheck){
478
753
  try {
479
754
  const packageInfo = await parsePackageJson(packageJsonPath);
480
- const dirName = path.basename(packageInfo.path);
755
+ const dirName = path__default.basename(packageInfo.path);
481
756
  if (dirName === startFrom || packageInfo.name === startFrom) {
482
757
  // Check if this package was excluded
483
758
  if (shouldExclude(packageJsonPath, excludedPatterns)) {
@@ -495,7 +770,7 @@ const execute = async (runConfig)=>{
495
770
  } else {
496
771
  const availablePackages = buildOrder.map((name)=>{
497
772
  const packageInfo = dependencyGraph.packages.get(name);
498
- return `${path.basename(packageInfo.path)} (${name})`;
773
+ return `${path__default.basename(packageInfo.path)} (${name})`;
499
774
  }).join(', ');
500
775
  throw new Error(`Package directory '${startFrom}' not found. Available packages: ${availablePackages}`);
501
776
  }
@@ -544,8 +819,8 @@ const execute = async (runConfig)=>{
544
819
  returnOutput = `\nBuild order: ${buildOrder.join(' → ')}\n`;
545
820
  }
546
821
  // Execute command if provided (custom command or built-in command)
547
- const cmd = (_runConfig_tree4 = runConfig.tree) === null || _runConfig_tree4 === void 0 ? void 0 : _runConfig_tree4.cmd;
548
- const useParallel = ((_runConfig_tree5 = runConfig.tree) === null || _runConfig_tree5 === void 0 ? void 0 : _runConfig_tree5.parallel) || false;
822
+ const cmd = (_runConfig_tree5 = runConfig.tree) === null || _runConfig_tree5 === void 0 ? void 0 : _runConfig_tree5.cmd;
823
+ const useParallel = ((_runConfig_tree6 = runConfig.tree) === null || _runConfig_tree6 === void 0 ? void 0 : _runConfig_tree6.parallel) || false;
549
824
  // Determine command to execute
550
825
  let commandToRun;
551
826
  let isBuiltInCommand = false;
@@ -558,13 +833,37 @@ const execute = async (runConfig)=>{
558
833
  commandToRun = cmd;
559
834
  }
560
835
  if (commandToRun) {
836
+ // Create set of all package names for inter-project dependency detection
837
+ const allPackageNames = new Set(Array.from(dependencyGraph.packages.keys()));
838
+ // Initialize execution context if not continuing
839
+ if (!executionContext) {
840
+ executionContext = {
841
+ command: commandToRun,
842
+ originalConfig: runConfig,
843
+ publishedVersions: [],
844
+ completedPackages: [],
845
+ buildOrder: buildOrder,
846
+ startTime: new Date(),
847
+ lastUpdateTime: new Date()
848
+ };
849
+ // Save initial context
850
+ if (isBuiltInCommand && builtInCommand === 'publish' && !isDryRun) {
851
+ await saveExecutionContext(executionContext, runConfig.outputDirectory);
852
+ }
853
+ }
561
854
  // Add spacing before command execution
562
855
  logger.info('');
563
856
  const executionDescription = isBuiltInCommand ? `built-in command "${builtInCommand}"` : `"${commandToRun}"`;
564
857
  const parallelInfo = useParallel ? ' (with parallel execution)' : '';
565
858
  logger.info(`${isDryRun ? 'DRY RUN: ' : ''}Executing ${executionDescription} in ${buildOrder.length} packages${parallelInfo}...`);
859
+ // Show info for publish commands
860
+ if (isBuiltInCommand && builtInCommand === 'publish') {
861
+ logger.info('Inter-project dependencies will be automatically updated before each publish.');
862
+ }
566
863
  let successCount = 0;
567
864
  let failedPackage = null;
865
+ // If continuing, start from where we left off
866
+ const startIndex = isContinue && executionContext ? executionContext.completedPackages.length : 0;
568
867
  if (useParallel) {
569
868
  // Parallel execution: group packages by dependency levels
570
869
  const dependencyLevels = groupPackagesByDependencyLevels(dependencyGraph, buildOrder, runConfig);
@@ -605,7 +904,7 @@ const execute = async (runConfig)=>{
605
904
  const levelPromises = currentLevel.map((packageName)=>{
606
905
  const packageInfo = dependencyGraph.packages.get(packageName);
607
906
  const globalIndex = buildOrder.indexOf(packageName);
608
- return executePackage(packageName, packageInfo, commandToRun, runConfig, isDryRun, globalIndex, buildOrder.length, isBuiltInCommand);
907
+ return executePackage(packageName, packageInfo, commandToRun, runConfig, isDryRun, globalIndex, buildOrder.length, allPackageNames, isBuiltInCommand);
609
908
  });
610
909
  // Wait for all packages in this level to complete
611
910
  const results = await Promise.allSettled(levelPromises);
@@ -632,7 +931,7 @@ const execute = async (runConfig)=>{
632
931
  logger.error(formattedError);
633
932
  logger.error(`Failed after ${successCount} successful packages.`);
634
933
  const packageDir = dependencyGraph.packages.get(packageName).path;
635
- const packageDirName = path.basename(packageDir);
934
+ const packageDirName = path__default.basename(packageDir);
636
935
  logger.error(`To resume from this package, run:`);
637
936
  if (isBuiltInCommand) {
638
937
  logger.error(` kodrdriv tree ${builtInCommand} --start-from ${packageDirName}`);
@@ -650,7 +949,7 @@ const execute = async (runConfig)=>{
650
949
  packageLogger.error(`Unexpected error: ${result.reason}`);
651
950
  logger.error(`Failed after ${successCount} successful packages.`);
652
951
  const packageDir = dependencyGraph.packages.get(packageName).path;
653
- const packageDirName = path.basename(packageDir);
952
+ const packageDirName = path__default.basename(packageDir);
654
953
  logger.error(`To resume from this package, run:`);
655
954
  if (isBuiltInCommand) {
656
955
  logger.error(` kodrdriv tree ${builtInCommand} --start-from ${packageDirName}`);
@@ -694,13 +993,25 @@ const execute = async (runConfig)=>{
694
993
  }
695
994
  } else {
696
995
  // Sequential execution
697
- for(let i = 0; i < buildOrder.length; i++){
996
+ for(let i = startIndex; i < buildOrder.length; i++){
698
997
  const packageName = buildOrder[i];
998
+ // Skip if already completed (in continue mode)
999
+ if (executionContext && executionContext.completedPackages.includes(packageName)) {
1000
+ successCount++;
1001
+ continue;
1002
+ }
699
1003
  const packageInfo = dependencyGraph.packages.get(packageName);
700
1004
  const packageLogger = createPackageLogger(packageName, i + 1, buildOrder.length, isDryRun);
701
- const result = await executePackage(packageName, packageInfo, commandToRun, runConfig, isDryRun, i, buildOrder.length, isBuiltInCommand);
1005
+ const result = await executePackage(packageName, packageInfo, commandToRun, runConfig, isDryRun, i, buildOrder.length, allPackageNames, isBuiltInCommand);
702
1006
  if (result.success) {
703
1007
  successCount++;
1008
+ // Update context
1009
+ if (executionContext && isBuiltInCommand && builtInCommand === 'publish' && !isDryRun) {
1010
+ executionContext.completedPackages.push(packageName);
1011
+ executionContext.publishedVersions = publishedVersions;
1012
+ executionContext.lastUpdateTime = new Date();
1013
+ await saveExecutionContext(executionContext, runConfig.outputDirectory);
1014
+ }
704
1015
  // Add spacing between packages (except after the last one)
705
1016
  if (i < buildOrder.length - 1) {
706
1017
  logger.info('');
@@ -713,13 +1024,11 @@ const execute = async (runConfig)=>{
713
1024
  packageLogger.error(`Execution failed`);
714
1025
  logger.error(formattedError);
715
1026
  logger.error(`Failed after ${successCount} successful packages.`);
716
- const packageDir = packageInfo.path;
717
- const packageDirName = path.basename(packageDir);
718
- logger.error(`To resume from this package, run:`);
1027
+ logger.error(`To resume from this point, run:`);
719
1028
  if (isBuiltInCommand) {
720
- logger.error(` kodrdriv tree ${builtInCommand} --start-from ${packageDirName}`);
1029
+ logger.error(` kodrdriv tree ${builtInCommand} --continue`);
721
1030
  } else {
722
- logger.error(` kodrdriv tree --start-from ${packageDirName} --cmd "${commandToRun}"`);
1031
+ logger.error(` kodrdriv tree --continue --cmd "${commandToRun}"`);
723
1032
  }
724
1033
  throw new Error(`Command failed in package ${packageName}`);
725
1034
  }
@@ -730,6 +1039,10 @@ const execute = async (runConfig)=>{
730
1039
  if (!failedPackage) {
731
1040
  const summary = `${isDryRun ? 'DRY RUN: ' : ''}All ${buildOrder.length} packages completed successfully! 🎉`;
732
1041
  logger.info(summary);
1042
+ // Clean up context on successful completion
1043
+ if (isBuiltInCommand && builtInCommand === 'publish' && !isDryRun) {
1044
+ await cleanupContext(runConfig.outputDirectory);
1045
+ }
733
1046
  return returnOutput; // Don't duplicate the summary in return string
734
1047
  }
735
1048
  }