@eldrforge/kodrdriv 1.2.20 → 1.2.22

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 (77) hide show
  1. package/WORKFLOW-PRECHECK-IMPLEMENTATION.md +239 -0
  2. package/WORKFLOW-SKIP-SUMMARY.md +121 -0
  3. package/dist/application.js +6 -2
  4. package/dist/application.js.map +1 -1
  5. package/dist/arguments.js +2 -2
  6. package/dist/arguments.js.map +1 -1
  7. package/dist/commands/audio-commit.js +15 -6
  8. package/dist/commands/audio-commit.js.map +1 -1
  9. package/dist/commands/audio-review.js +31 -15
  10. package/dist/commands/audio-review.js.map +1 -1
  11. package/dist/commands/commit.js +31 -20
  12. package/dist/commands/commit.js.map +1 -1
  13. package/dist/commands/link.js +27 -27
  14. package/dist/commands/link.js.map +1 -1
  15. package/dist/commands/publish.js +87 -34
  16. package/dist/commands/publish.js.map +1 -1
  17. package/dist/commands/release.js +32 -19
  18. package/dist/commands/release.js.map +1 -1
  19. package/dist/commands/review.js +36 -30
  20. package/dist/commands/review.js.map +1 -1
  21. package/dist/commands/select-audio.js +4 -4
  22. package/dist/commands/select-audio.js.map +1 -1
  23. package/dist/commands/tree.js +154 -38
  24. package/dist/commands/tree.js.map +1 -1
  25. package/dist/commands/unlink.js +13 -13
  26. package/dist/commands/unlink.js.map +1 -1
  27. package/dist/commands/updates.js +21 -0
  28. package/dist/commands/updates.js.map +1 -1
  29. package/dist/commands/versions.js +5 -5
  30. package/dist/commands/versions.js.map +1 -1
  31. package/dist/constants.js +4 -4
  32. package/dist/constants.js.map +1 -1
  33. package/dist/content/files.js +4 -4
  34. package/dist/content/files.js.map +1 -1
  35. package/dist/error/CommandErrors.js +1 -65
  36. package/dist/error/CommandErrors.js.map +1 -1
  37. package/dist/logging.js +3 -3
  38. package/dist/logging.js.map +1 -1
  39. package/dist/util/aiAdapter.js +28 -0
  40. package/dist/util/aiAdapter.js.map +1 -0
  41. package/dist/util/general.js +5 -5
  42. package/dist/util/general.js.map +1 -1
  43. package/dist/util/interactive.js +6 -437
  44. package/dist/util/interactive.js.map +1 -1
  45. package/dist/util/loggerAdapter.js +24 -0
  46. package/dist/util/loggerAdapter.js.map +1 -0
  47. package/dist/util/performance.js +4 -4
  48. package/dist/util/performance.js.map +1 -1
  49. package/dist/util/safety.js +4 -4
  50. package/dist/util/safety.js.map +1 -1
  51. package/dist/util/storage.js +2 -2
  52. package/dist/util/storage.js.map +1 -1
  53. package/dist/util/storageAdapter.js +25 -0
  54. package/dist/util/storageAdapter.js.map +1 -0
  55. package/package.json +6 -4
  56. package/test_output.txt +3 -3
  57. package/INTEGRATION-SUMMARY.md +0 -232
  58. package/TEST-STATUS.md +0 -168
  59. package/dist/content/issues.js +0 -331
  60. package/dist/content/issues.js.map +0 -1
  61. package/dist/content/releaseNotes.js +0 -90
  62. package/dist/content/releaseNotes.js.map +0 -1
  63. package/dist/prompt/commit.js +0 -76
  64. package/dist/prompt/commit.js.map +0 -1
  65. package/dist/prompt/instructions/commit.md +0 -133
  66. package/dist/prompt/instructions/release.md +0 -188
  67. package/dist/prompt/instructions/review.md +0 -169
  68. package/dist/prompt/personas/releaser.md +0 -24
  69. package/dist/prompt/personas/you.md +0 -55
  70. package/dist/prompt/release.js +0 -100
  71. package/dist/prompt/release.js.map +0 -1
  72. package/dist/prompt/review.js +0 -64
  73. package/dist/prompt/review.js.map +0 -1
  74. package/dist/util/github.js +0 -1071
  75. package/dist/util/github.js.map +0 -1
  76. package/dist/util/openai.js +0 -365
  77. package/dist/util/openai.js.map +0 -1
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
- import path__default from 'path';
3
- import os__default from 'os';
2
+ import path from 'path';
3
+ import os 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__default.join(os__default.homedir(), '.unplayable', 'audio-device.json');
9
+ return path.join(os.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__default.join(os__default.homedir(), '.unplayable');
29
+ const preferencesDir = path.join(os.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":"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"}
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
- import path__default from 'path';
3
- import fs__default from 'fs/promises';
2
+ import path from 'path';
3
+ import fs from 'fs/promises';
4
4
  import { exec } from 'child_process';
5
- import { safeJsonParse, validatePackageJson, getGloballyLinkedPackages, getGitStatusSummary, getLinkedDependencies, getLinkCompatibilityProblems, runSecure } from '@eldrforge/git-tools';
5
+ import { safeJsonParse, validatePackageJson, getGloballyLinkedPackages, getGitStatusSummary, getLinkedDependencies, getLinkCompatibilityProblems, runSecure, run } from '@eldrforge/git-tools';
6
6
  import util from 'util';
7
7
  import { getLogger } from '../logging.js';
8
8
  import { create } from '../util/storage.js';
@@ -11,6 +11,7 @@ import { DEFAULT_OUTPUT_DIRECTORY } from '../constants.js';
11
11
  import { execute as execute$3 } from './commit.js';
12
12
  import { execute as execute$1 } from './link.js';
13
13
  import { execute as execute$2 } from './unlink.js';
14
+ import { execute as execute$4 } from './updates.js';
14
15
 
15
16
  function _define_property(obj, key, value) {
16
17
  if (key in obj) {
@@ -96,7 +97,7 @@ const updateInterProjectDependencies = async (packageDir, publishedVersions, all
96
97
  const storage = create({
97
98
  log: packageLogger.info
98
99
  });
99
- const packageJsonPath = path__default.join(packageDir, 'package.json');
100
+ const packageJsonPath = path.join(packageDir, 'package.json');
100
101
  if (!await storage.exists(packageJsonPath)) {
101
102
  packageLogger.verbose('No package.json found, skipping dependency updates');
102
103
  return false;
@@ -152,6 +153,85 @@ const updateInterProjectDependencies = async (packageDir, publishedVersions, all
152
153
  }
153
154
  return hasChanges;
154
155
  };
156
+ // Detect scoped dependencies from package.json and run updates for them
157
+ const updateScopedDependencies = async (packageDir, packageLogger, isDryRun, runConfig)=>{
158
+ const storage = create({
159
+ log: packageLogger.info
160
+ });
161
+ const packageJsonPath = path.join(packageDir, 'package.json');
162
+ if (!await storage.exists(packageJsonPath)) {
163
+ packageLogger.verbose('No package.json found, skipping scoped dependency updates');
164
+ return false;
165
+ }
166
+ try {
167
+ var _runConfig_publish;
168
+ // Read the package.json before updates
169
+ const beforeContent = await storage.readFile(packageJsonPath, 'utf-8');
170
+ const parsed = safeJsonParse(beforeContent, packageJsonPath);
171
+ const packageJson = validatePackageJson(parsed, packageJsonPath);
172
+ // Determine which scopes to update
173
+ let scopesToUpdate;
174
+ // Check if scopedDependencyUpdates is configured
175
+ const configuredScopes = (_runConfig_publish = runConfig.publish) === null || _runConfig_publish === void 0 ? void 0 : _runConfig_publish.scopedDependencyUpdates;
176
+ if (configuredScopes !== undefined) {
177
+ // scopedDependencyUpdates is explicitly configured
178
+ if (configuredScopes.length > 0) {
179
+ // Use configured scopes
180
+ scopesToUpdate = new Set(configuredScopes);
181
+ packageLogger.verbose(`Using configured scopes: ${Array.from(scopesToUpdate).join(', ')}`);
182
+ } else {
183
+ // Empty array means explicitly disabled
184
+ packageLogger.verbose('Scoped dependency updates explicitly disabled');
185
+ return false;
186
+ }
187
+ } else {
188
+ // Not configured - use default behavior (package's own scope)
189
+ scopesToUpdate = new Set();
190
+ if (packageJson.name && packageJson.name.startsWith('@')) {
191
+ const packageScope = packageJson.name.split('/')[0]; // e.g., "@fjell/core" -> "@fjell"
192
+ scopesToUpdate.add(packageScope);
193
+ packageLogger.verbose(`No scopes configured, defaulting to package's own scope: ${packageScope}`);
194
+ } else {
195
+ packageLogger.verbose('Package is not scoped and no scopes configured, skipping scoped dependency updates');
196
+ return false;
197
+ }
198
+ }
199
+ if (scopesToUpdate.size === 0) {
200
+ packageLogger.verbose('No scopes to update, skipping updates');
201
+ return false;
202
+ }
203
+ // Run updates for each scope
204
+ for (const scope of scopesToUpdate){
205
+ packageLogger.info(`🔄 Checking for ${scope} dependency updates before publish...`);
206
+ try {
207
+ // Create a config for the updates command with the scope
208
+ const updatesConfig = {
209
+ ...runConfig,
210
+ dryRun: isDryRun,
211
+ updates: {
212
+ scope: scope
213
+ }
214
+ };
215
+ await execute$4(updatesConfig);
216
+ } catch (error) {
217
+ // Don't fail the publish if updates fails, just warn
218
+ packageLogger.warn(`Failed to update ${scope} dependencies: ${error.message}`);
219
+ }
220
+ }
221
+ // Check if package.json was modified
222
+ const afterContent = await storage.readFile(packageJsonPath, 'utf-8');
223
+ const hasChanges = beforeContent !== afterContent;
224
+ if (hasChanges) {
225
+ packageLogger.info('✅ Scoped dependencies updated successfully');
226
+ } else {
227
+ packageLogger.info('No scoped dependency updates needed');
228
+ }
229
+ return hasChanges;
230
+ } catch (error) {
231
+ packageLogger.warn(`Failed to detect scoped dependencies: ${error.message}`);
232
+ return false;
233
+ }
234
+ };
155
235
  // Get the context file path
156
236
  const getContextFilePath = (outputDirectory)=>{
157
237
  const outputDir = outputDirectory || DEFAULT_OUTPUT_DIRECTORY;
@@ -165,7 +245,7 @@ const saveExecutionContext = async (context, outputDirectory)=>{
165
245
  const contextFilePath = getContextFilePath(outputDirectory);
166
246
  try {
167
247
  // Ensure output directory exists
168
- await storage.ensureDirectory(path__default.dirname(contextFilePath));
248
+ await storage.ensureDirectory(path.dirname(contextFilePath));
169
249
  // Save context with JSON serialization that handles dates
170
250
  const contextData = {
171
251
  ...context,
@@ -269,7 +349,7 @@ const validateScripts = async (packages, scripts)=>{
269
349
  });
270
350
  logger.debug(`Validating scripts: ${scripts.join(', ')}`);
271
351
  for (const [packageName, packageInfo] of packages){
272
- const packageJsonPath = path__default.join(packageInfo.path, 'package.json');
352
+ const packageJsonPath = path.join(packageInfo.path, 'package.json');
273
353
  const missingForPackage = [];
274
354
  try {
275
355
  const packageJsonContent = await storage.readFile(packageJsonPath, 'utf-8');
@@ -305,19 +385,48 @@ const validateScripts = async (packages, scripts)=>{
305
385
  missingScripts
306
386
  };
307
387
  };
308
- // Extract published version from package.json after successful publish
388
+ // Extract published version from git tags after successful publish
389
+ // After kodrdriv publish, the release version is captured in the git tag,
390
+ // while package.json contains the next dev version
309
391
  const extractPublishedVersion = async (packageDir, packageLogger)=>{
310
392
  const storage = create({
311
393
  log: packageLogger.info
312
394
  });
313
- const packageJsonPath = path__default.join(packageDir, 'package.json');
395
+ const packageJsonPath = path.join(packageDir, 'package.json');
314
396
  try {
397
+ // Get package name from package.json
315
398
  const packageJsonContent = await storage.readFile(packageJsonPath, 'utf-8');
316
399
  const parsed = safeJsonParse(packageJsonContent, packageJsonPath);
317
400
  const packageJson = validatePackageJson(parsed, packageJsonPath);
401
+ // Get the most recently created tag (by creation date, not version number)
402
+ // This ensures we get the tag that was just created by the publish, not an older tag with a higher version
403
+ const { stdout: tagOutput } = await run('git tag --sort=-creatordate', {
404
+ cwd: packageDir
405
+ });
406
+ const tags = tagOutput.trim().split('\n').filter(Boolean);
407
+ if (tags.length === 0) {
408
+ packageLogger.warn('No git tags found after publish');
409
+ return null;
410
+ }
411
+ // Get the most recently created tag (first in the list)
412
+ const latestTag = tags[0];
413
+ // Extract version from tag, handling various formats:
414
+ // - v1.2.3 -> 1.2.3
415
+ // - working/v1.2.3 -> 1.2.3
416
+ // - main/v1.2.3 -> 1.2.3
417
+ let version = latestTag;
418
+ // If tag contains a slash (branch prefix), extract everything after it
419
+ if (version.includes('/')) {
420
+ version = version.split('/').pop() || version;
421
+ }
422
+ // Remove 'v' prefix if present
423
+ if (version.startsWith('v')) {
424
+ version = version.substring(1);
425
+ }
426
+ packageLogger.verbose(`Extracted published version from tag: ${latestTag} -> ${version}`);
318
427
  return {
319
428
  packageName: packageJson.name,
320
- version: packageJson.version,
429
+ version: version,
321
430
  publishTime: new Date()
322
431
  };
323
432
  } catch (error) {
@@ -437,24 +546,24 @@ const matchesPattern = (filePath, pattern)=>{
437
546
  .replace(/\?/g, '.') // ? matches any single character
438
547
  .replace(/\./g, '\\.'); // Escape literal dots
439
548
  const regex = new RegExp(`^${regexPattern}$`);
440
- return regex.test(filePath) || regex.test(path__default.basename(filePath));
549
+ return regex.test(filePath) || regex.test(path.basename(filePath));
441
550
  };
442
551
  const shouldExclude = (packageJsonPath, excludedPatterns)=>{
443
552
  if (!excludedPatterns || excludedPatterns.length === 0) {
444
553
  return false;
445
554
  }
446
555
  // Check both the full path and relative path patterns
447
- const relativePath = path__default.relative(process.cwd(), packageJsonPath);
448
- return excludedPatterns.some((pattern)=>matchesPattern(packageJsonPath, pattern) || matchesPattern(relativePath, pattern) || matchesPattern(path__default.dirname(packageJsonPath), pattern) || matchesPattern(path__default.dirname(relativePath), pattern));
556
+ const relativePath = path.relative(process.cwd(), packageJsonPath);
557
+ return excludedPatterns.some((pattern)=>matchesPattern(packageJsonPath, pattern) || matchesPattern(relativePath, pattern) || matchesPattern(path.dirname(packageJsonPath), pattern) || matchesPattern(path.dirname(relativePath), pattern));
449
558
  };
450
559
  const scanForPackageJsonFiles = async (directory, excludedPatterns = [])=>{
451
560
  const logger = getLogger();
452
561
  const packageJsonPaths = [];
453
562
  try {
454
563
  // First check if there's a package.json in the specified directory itself
455
- const directPackageJsonPath = path__default.join(directory, 'package.json');
564
+ const directPackageJsonPath = path.join(directory, 'package.json');
456
565
  try {
457
- await fs__default.access(directPackageJsonPath);
566
+ await fs.access(directPackageJsonPath);
458
567
  // Check if this package should be excluded
459
568
  if (!shouldExclude(directPackageJsonPath, excludedPatterns)) {
460
569
  packageJsonPaths.push(directPackageJsonPath);
@@ -466,15 +575,15 @@ const scanForPackageJsonFiles = async (directory, excludedPatterns = [])=>{
466
575
  // No package.json in the root of this directory, that's fine
467
576
  }
468
577
  // Then scan subdirectories for package.json files
469
- const entries = await fs__default.readdir(directory, {
578
+ const entries = await fs.readdir(directory, {
470
579
  withFileTypes: true
471
580
  });
472
581
  for (const entry of entries){
473
582
  if (entry.isDirectory()) {
474
- const subDirPath = path__default.join(directory, entry.name);
475
- const packageJsonPath = path__default.join(subDirPath, 'package.json');
583
+ const subDirPath = path.join(directory, entry.name);
584
+ const packageJsonPath = path.join(subDirPath, 'package.json');
476
585
  try {
477
- await fs__default.access(packageJsonPath);
586
+ await fs.access(packageJsonPath);
478
587
  // Check if this package should be excluded
479
588
  if (shouldExclude(packageJsonPath, excludedPatterns)) {
480
589
  logger.verbose(`Excluding package.json at: ${packageJsonPath} (matches exclusion pattern)`);
@@ -521,7 +630,7 @@ const parsePackageJson = async (packageJsonPath)=>{
521
630
  return {
522
631
  name: packageJson.name,
523
632
  version: packageJson.version || '0.0.0',
524
- path: path__default.dirname(packageJsonPath),
633
+ path: path.dirname(packageJsonPath),
525
634
  dependencies,
526
635
  localDependencies: new Set() // Will be populated later
527
636
  };
@@ -649,8 +758,8 @@ const executePackage = async (packageName, packageInfo, commandToRun, runConfig,
649
758
  try {
650
759
  // Validate package directory exists before changing to it
651
760
  try {
652
- await fs__default.access(packageDir);
653
- const stat = await fs__default.stat(packageDir);
761
+ await fs.access(packageDir);
762
+ const stat = await fs.stat(packageDir);
654
763
  if (!stat.isDirectory()) {
655
764
  throw new Error(`Path is not a directory: ${packageDir}`);
656
765
  }
@@ -661,13 +770,22 @@ const executePackage = async (packageName, packageInfo, commandToRun, runConfig,
661
770
  if (runConfig.debug) {
662
771
  packageLogger.debug(`Changed to directory: ${packageDir}`);
663
772
  }
664
- // Handle inter-project dependency updates for publish commands before executing (skip during dry run)
665
- if (!isDryRun && isBuiltInCommand && commandToRun.includes('publish') && publishedVersions.length > 0) {
666
- packageLogger.info('Updating inter-project dependencies based on previously published packages...');
667
- const hasUpdates = await updateInterProjectDependencies(packageDir, publishedVersions, allPackageNames, packageLogger, isDryRun);
668
- if (hasUpdates) {
773
+ // Handle dependency updates for publish commands before executing (skip during dry run)
774
+ if (!isDryRun && isBuiltInCommand && commandToRun.includes('publish')) {
775
+ let hasAnyUpdates = false;
776
+ // First, update all scoped dependencies from npm registry
777
+ const hasScopedUpdates = await updateScopedDependencies(packageDir, packageLogger, isDryRun, runConfig);
778
+ hasAnyUpdates = hasAnyUpdates || hasScopedUpdates;
779
+ // Then update inter-project dependencies based on previously published packages
780
+ if (publishedVersions.length > 0) {
781
+ packageLogger.info('Updating inter-project dependencies based on previously published packages...');
782
+ const hasInterProjectUpdates = await updateInterProjectDependencies(packageDir, publishedVersions, allPackageNames, packageLogger, isDryRun);
783
+ hasAnyUpdates = hasAnyUpdates || hasInterProjectUpdates;
784
+ }
785
+ // If either type of update occurred, commit the changes
786
+ if (hasAnyUpdates) {
669
787
  // Commit the dependency updates using kodrdriv commit
670
- packageLogger.info('Committing inter-project dependency updates...');
788
+ packageLogger.info('Committing dependency updates...');
671
789
  packageLogger.info('⏱️ This step may take a few minutes as it generates a commit message using AI...');
672
790
  // Add timeout wrapper around commit execution
673
791
  const commitTimeoutMs = 300000; // 5 minutes
@@ -689,14 +807,14 @@ const executePackage = async (packageName, packageInfo, commandToRun, runConfig,
689
807
  commitPromise,
690
808
  timeoutPromise
691
809
  ]);
692
- packageLogger.info('✅ Inter-project dependency updates committed successfully');
810
+ packageLogger.info('✅ Dependency updates committed successfully');
693
811
  } catch (commitError) {
694
812
  if (commitError.message.includes('timed out')) {
695
813
  packageLogger.error(`❌ Commit operation timed out after ${commitTimeoutMs / 1000} seconds`);
696
814
  packageLogger.error('This usually indicates an issue with the AI service or very large changes');
697
815
  packageLogger.error('You may need to manually commit the dependency updates');
698
816
  } else {
699
- packageLogger.warn(`Failed to commit inter-project dependency updates: ${commitError.message}`);
817
+ packageLogger.warn(`Failed to commit dependency updates: ${commitError.message}`);
700
818
  }
701
819
  // Continue with publish anyway - the updates are still in place
702
820
  } finally{
@@ -704,8 +822,6 @@ const executePackage = async (packageName, packageInfo, commandToRun, runConfig,
704
822
  clearInterval(progressInterval);
705
823
  }
706
824
  }
707
- } else {
708
- packageLogger.info('No inter-project dependency updates needed');
709
825
  }
710
826
  }
711
827
  if (runConfig.debug || runConfig.verbose) {
@@ -1051,7 +1167,7 @@ const execute = async (runConfig)=>{
1051
1167
  // Resolve the actual package name (can be package name or directory name)
1052
1168
  let startPackageName = null;
1053
1169
  for (const [pkgName, pkgInfo] of dependencyGraph.packages){
1054
- const dirName = path__default.basename(pkgInfo.path);
1170
+ const dirName = path.basename(pkgInfo.path);
1055
1171
  if (dirName === startFrom || pkgName === startFrom) {
1056
1172
  startPackageName = pkgName;
1057
1173
  break;
@@ -1068,7 +1184,7 @@ const execute = async (runConfig)=>{
1068
1184
  for (const packageJsonPath of allPackageJsonPathsForCheck){
1069
1185
  try {
1070
1186
  const packageInfo = await parsePackageJson(packageJsonPath);
1071
- const dirName = path__default.basename(packageInfo.path);
1187
+ const dirName = path.basename(packageInfo.path);
1072
1188
  if (dirName === startFrom || packageInfo.name === startFrom) {
1073
1189
  // Check if this package was excluded
1074
1190
  if (shouldExclude(packageJsonPath, excludedPatterns)) {
@@ -1086,7 +1202,7 @@ const execute = async (runConfig)=>{
1086
1202
  } else {
1087
1203
  const availablePackages = buildOrder.map((name)=>{
1088
1204
  const packageInfo = dependencyGraph.packages.get(name);
1089
- return `${path__default.basename(packageInfo.path)} (${name})`;
1205
+ return `${path.basename(packageInfo.path)} (${name})`;
1090
1206
  }).join(', ');
1091
1207
  throw new Error(`Package directory '${startFrom}' not found. Available packages: ${availablePackages}`);
1092
1208
  }
@@ -1108,7 +1224,7 @@ const execute = async (runConfig)=>{
1108
1224
  // Find the package that matches the stopAt directory name
1109
1225
  const stopIndex = buildOrder.findIndex((packageName)=>{
1110
1226
  const packageInfo = dependencyGraph.packages.get(packageName);
1111
- const dirName = path__default.basename(packageInfo.path);
1227
+ const dirName = path.basename(packageInfo.path);
1112
1228
  return dirName === stopAt || packageName === stopAt;
1113
1229
  });
1114
1230
  if (stopIndex === -1) {
@@ -1122,7 +1238,7 @@ const execute = async (runConfig)=>{
1122
1238
  for (const packageJsonPath of allPackageJsonPathsForCheck){
1123
1239
  try {
1124
1240
  const packageInfo = await parsePackageJson(packageJsonPath);
1125
- const dirName = path__default.basename(packageInfo.path);
1241
+ const dirName = path.basename(packageInfo.path);
1126
1242
  if (dirName === stopAt || packageInfo.name === stopAt) {
1127
1243
  // Check if this package was excluded
1128
1244
  if (shouldExclude(packageJsonPath, excludedPatterns)) {
@@ -1140,7 +1256,7 @@ const execute = async (runConfig)=>{
1140
1256
  } else {
1141
1257
  const availablePackages = buildOrder.map((name)=>{
1142
1258
  const packageInfo = dependencyGraph.packages.get(name);
1143
- return `${path__default.basename(packageInfo.path)} (${name})`;
1259
+ return `${path.basename(packageInfo.path)} (${name})`;
1144
1260
  }).join(', ');
1145
1261
  throw new Error(`Package directory '${stopAt}' not found. Available packages: ${availablePackages}`);
1146
1262
  }
@@ -1185,7 +1301,7 @@ const execute = async (runConfig)=>{
1185
1301
  for (const [packageName, packageInfo] of allPackages){
1186
1302
  if (packageName === targetPackageName) continue;
1187
1303
  try {
1188
- const packageJsonPath = path__default.join(packageInfo.path, 'package.json');
1304
+ const packageJsonPath = path.join(packageInfo.path, 'package.json');
1189
1305
  const packageJsonContent = await storage.readFile(packageJsonPath, 'utf-8');
1190
1306
  const parsed = safeJsonParse(packageJsonContent, packageJsonPath);
1191
1307
  const packageJson = validatePackageJson(parsed, packageJsonPath);