@eldrforge/kodrdriv 0.0.50 → 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.
- package/README.md +2 -1
- package/dist/application.js +5 -3
- package/dist/application.js.map +1 -1
- package/dist/arguments.js +97 -70
- package/dist/arguments.js.map +1 -1
- package/dist/commands/audio-commit.js +7 -7
- package/dist/commands/audio-commit.js.map +1 -1
- package/dist/commands/audio-review.js +13 -13
- package/dist/commands/audio-review.js.map +1 -1
- package/dist/commands/clean.js +2 -2
- package/dist/commands/clean.js.map +1 -1
- package/dist/commands/commit.js +301 -36
- package/dist/commands/commit.js.map +1 -1
- package/dist/commands/link.js +7 -7
- package/dist/commands/link.js.map +1 -1
- package/dist/commands/publish.js +285 -306
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/release.js +171 -14
- package/dist/commands/release.js.map +1 -1
- package/dist/commands/review.js +52 -40
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/select-audio.js +4 -4
- package/dist/commands/select-audio.js.map +1 -1
- package/dist/commands/tree.js +347 -34
- package/dist/commands/tree.js.map +1 -1
- package/dist/commands/unlink.js +5 -5
- package/dist/commands/unlink.js.map +1 -1
- package/dist/constants.js +28 -9
- package/dist/constants.js.map +1 -1
- package/dist/content/diff.js +122 -1
- package/dist/content/diff.js.map +1 -1
- package/dist/content/issues.js +17 -46
- package/dist/content/issues.js.map +1 -1
- package/dist/logging.js +3 -3
- package/dist/logging.js.map +1 -1
- package/dist/prompt/commit.js +2 -2
- package/dist/prompt/commit.js.map +1 -1
- package/dist/prompt/release.js +2 -2
- package/dist/prompt/release.js.map +1 -1
- package/dist/prompt/review.js +2 -2
- package/dist/prompt/review.js.map +1 -1
- package/dist/types.js +18 -5
- package/dist/types.js.map +1 -1
- package/dist/util/child.js +60 -4
- package/dist/util/child.js.map +1 -1
- package/dist/util/general.js +149 -13
- package/dist/util/general.js.map +1 -1
- package/dist/util/github.js +12 -8
- package/dist/util/github.js.map +1 -1
- package/dist/util/interactive.js +297 -0
- package/dist/util/interactive.js.map +1 -0
- package/dist/util/openai.js +87 -8
- package/dist/util/openai.js.map +1 -1
- package/dist/util/performance.js +8 -8
- package/dist/util/performance.js.map +1 -1
- package/dist/util/safety.js +4 -4
- package/dist/util/safety.js.map +1 -1
- package/dist/util/storage.js +2 -2
- package/dist/util/storage.js.map +1 -1
- package/package.json +6 -6
- package/test-increment.js +0 -0
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import
|
|
3
|
-
import
|
|
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
|
|
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 =
|
|
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":";;;;;;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,EAAKC,CAAAA,CAAAA,CAAAA,CAAI,CAACC,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,CAAKC,CAAAA,CAAAA,CAAAA,CAAI,CAACC,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
|
+
{"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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"}
|
package/dist/commands/tree.js
CHANGED
|
@@ -1,12 +1,207 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import
|
|
3
|
-
import
|
|
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(
|
|
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 =
|
|
119
|
-
return excludedPatterns.some((pattern)=>matchesPattern(packageJsonPath, pattern) || matchesPattern(relativePath, pattern) || matchesPattern(
|
|
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 =
|
|
321
|
+
const directPackageJsonPath = path__default.join(directory, 'package.json');
|
|
127
322
|
try {
|
|
128
|
-
await
|
|
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
|
|
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 =
|
|
146
|
-
const packageJsonPath =
|
|
340
|
+
const subDirPath = path__default.join(directory, entry.name);
|
|
341
|
+
const packageJsonPath = path__default.join(subDirPath, 'package.json');
|
|
147
342
|
try {
|
|
148
|
-
await
|
|
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:
|
|
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 = (
|
|
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 = ((
|
|
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
|
|
706
|
+
var _runConfig_tree3, _runConfig_tree4, _runConfig_tree5, _runConfig_tree6;
|
|
432
707
|
// Get exclusion patterns from config, fallback to empty array
|
|
433
|
-
const 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 = (
|
|
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 =
|
|
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 =
|
|
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 `${
|
|
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 = (
|
|
548
|
-
const useParallel = ((
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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} --
|
|
1029
|
+
logger.error(` kodrdriv tree ${builtInCommand} --continue`);
|
|
721
1030
|
} else {
|
|
722
|
-
logger.error(` kodrdriv tree --
|
|
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
|
}
|