@eldrforge/kodrdriv 1.2.21 → 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.
- package/WORKFLOW-PRECHECK-IMPLEMENTATION.md +239 -0
- package/WORKFLOW-SKIP-SUMMARY.md +121 -0
- package/dist/arguments.js +2 -2
- package/dist/arguments.js.map +1 -1
- package/dist/commands/audio-commit.js +15 -6
- package/dist/commands/audio-commit.js.map +1 -1
- package/dist/commands/audio-review.js +31 -15
- package/dist/commands/audio-review.js.map +1 -1
- package/dist/commands/commit.js +30 -19
- package/dist/commands/commit.js.map +1 -1
- package/dist/commands/link.js +27 -27
- package/dist/commands/link.js.map +1 -1
- package/dist/commands/publish.js +74 -21
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/release.js +30 -17
- package/dist/commands/release.js.map +1 -1
- package/dist/commands/review.js +33 -26
- 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 +122 -35
- package/dist/commands/tree.js.map +1 -1
- package/dist/commands/unlink.js +13 -13
- package/dist/commands/unlink.js.map +1 -1
- package/dist/commands/updates.js +21 -0
- package/dist/commands/updates.js.map +1 -1
- package/dist/commands/versions.js +5 -5
- package/dist/commands/versions.js.map +1 -1
- package/dist/constants.js +4 -4
- package/dist/constants.js.map +1 -1
- package/dist/content/files.js +4 -4
- package/dist/content/files.js.map +1 -1
- package/dist/logging.js +3 -3
- package/dist/logging.js.map +1 -1
- package/dist/util/aiAdapter.js +28 -0
- package/dist/util/aiAdapter.js.map +1 -0
- package/dist/util/general.js +5 -5
- package/dist/util/general.js.map +1 -1
- package/dist/util/interactive.js +6 -437
- package/dist/util/interactive.js.map +1 -1
- package/dist/util/loggerAdapter.js +24 -0
- package/dist/util/loggerAdapter.js.map +1 -0
- package/dist/util/performance.js +4 -4
- 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/dist/util/storageAdapter.js +25 -0
- package/dist/util/storageAdapter.js.map +1 -0
- package/package.json +5 -4
- package/GITHUB-TOOLS-INTEGRATION.md +0 -323
- package/INTEGRATION-SUMMARY.md +0 -232
- package/TEST-STATUS.md +0 -168
- package/dist/prompt/commit.js +0 -76
- package/dist/prompt/commit.js.map +0 -1
- package/dist/prompt/instructions/commit.md +0 -133
- package/dist/prompt/instructions/release.md +0 -188
- package/dist/prompt/instructions/review.md +0 -169
- package/dist/prompt/personas/releaser.md +0 -24
- package/dist/prompt/personas/you.md +0 -55
- package/dist/prompt/release.js +0 -100
- package/dist/prompt/release.js.map +0 -1
- package/dist/prompt/review.js +0 -64
- package/dist/prompt/review.js.map +0 -1
- package/dist/util/openai.js +0 -365
- package/dist/util/openai.js.map +0 -1
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import
|
|
3
|
-
import
|
|
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
|
|
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 =
|
|
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":";;;;;;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,
|
|
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,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import
|
|
3
|
-
import
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import fs from 'fs/promises';
|
|
4
4
|
import { exec } from 'child_process';
|
|
5
5
|
import { safeJsonParse, validatePackageJson, getGloballyLinkedPackages, getGitStatusSummary, getLinkedDependencies, getLinkCompatibilityProblems, runSecure, run } from '@eldrforge/git-tools';
|
|
6
6
|
import util from 'util';
|
|
@@ -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 =
|
|
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(
|
|
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 =
|
|
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');
|
|
@@ -312,7 +392,7 @@ const extractPublishedVersion = async (packageDir, packageLogger)=>{
|
|
|
312
392
|
const storage = create({
|
|
313
393
|
log: packageLogger.info
|
|
314
394
|
});
|
|
315
|
-
const packageJsonPath =
|
|
395
|
+
const packageJsonPath = path.join(packageDir, 'package.json');
|
|
316
396
|
try {
|
|
317
397
|
// Get package name from package.json
|
|
318
398
|
const packageJsonContent = await storage.readFile(packageJsonPath, 'utf-8');
|
|
@@ -466,24 +546,24 @@ const matchesPattern = (filePath, pattern)=>{
|
|
|
466
546
|
.replace(/\?/g, '.') // ? matches any single character
|
|
467
547
|
.replace(/\./g, '\\.'); // Escape literal dots
|
|
468
548
|
const regex = new RegExp(`^${regexPattern}$`);
|
|
469
|
-
return regex.test(filePath) || regex.test(
|
|
549
|
+
return regex.test(filePath) || regex.test(path.basename(filePath));
|
|
470
550
|
};
|
|
471
551
|
const shouldExclude = (packageJsonPath, excludedPatterns)=>{
|
|
472
552
|
if (!excludedPatterns || excludedPatterns.length === 0) {
|
|
473
553
|
return false;
|
|
474
554
|
}
|
|
475
555
|
// Check both the full path and relative path patterns
|
|
476
|
-
const relativePath =
|
|
477
|
-
return excludedPatterns.some((pattern)=>matchesPattern(packageJsonPath, pattern) || matchesPattern(relativePath, pattern) || matchesPattern(
|
|
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));
|
|
478
558
|
};
|
|
479
559
|
const scanForPackageJsonFiles = async (directory, excludedPatterns = [])=>{
|
|
480
560
|
const logger = getLogger();
|
|
481
561
|
const packageJsonPaths = [];
|
|
482
562
|
try {
|
|
483
563
|
// First check if there's a package.json in the specified directory itself
|
|
484
|
-
const directPackageJsonPath =
|
|
564
|
+
const directPackageJsonPath = path.join(directory, 'package.json');
|
|
485
565
|
try {
|
|
486
|
-
await
|
|
566
|
+
await fs.access(directPackageJsonPath);
|
|
487
567
|
// Check if this package should be excluded
|
|
488
568
|
if (!shouldExclude(directPackageJsonPath, excludedPatterns)) {
|
|
489
569
|
packageJsonPaths.push(directPackageJsonPath);
|
|
@@ -495,15 +575,15 @@ const scanForPackageJsonFiles = async (directory, excludedPatterns = [])=>{
|
|
|
495
575
|
// No package.json in the root of this directory, that's fine
|
|
496
576
|
}
|
|
497
577
|
// Then scan subdirectories for package.json files
|
|
498
|
-
const entries = await
|
|
578
|
+
const entries = await fs.readdir(directory, {
|
|
499
579
|
withFileTypes: true
|
|
500
580
|
});
|
|
501
581
|
for (const entry of entries){
|
|
502
582
|
if (entry.isDirectory()) {
|
|
503
|
-
const subDirPath =
|
|
504
|
-
const packageJsonPath =
|
|
583
|
+
const subDirPath = path.join(directory, entry.name);
|
|
584
|
+
const packageJsonPath = path.join(subDirPath, 'package.json');
|
|
505
585
|
try {
|
|
506
|
-
await
|
|
586
|
+
await fs.access(packageJsonPath);
|
|
507
587
|
// Check if this package should be excluded
|
|
508
588
|
if (shouldExclude(packageJsonPath, excludedPatterns)) {
|
|
509
589
|
logger.verbose(`Excluding package.json at: ${packageJsonPath} (matches exclusion pattern)`);
|
|
@@ -550,7 +630,7 @@ const parsePackageJson = async (packageJsonPath)=>{
|
|
|
550
630
|
return {
|
|
551
631
|
name: packageJson.name,
|
|
552
632
|
version: packageJson.version || '0.0.0',
|
|
553
|
-
path:
|
|
633
|
+
path: path.dirname(packageJsonPath),
|
|
554
634
|
dependencies,
|
|
555
635
|
localDependencies: new Set() // Will be populated later
|
|
556
636
|
};
|
|
@@ -678,8 +758,8 @@ const executePackage = async (packageName, packageInfo, commandToRun, runConfig,
|
|
|
678
758
|
try {
|
|
679
759
|
// Validate package directory exists before changing to it
|
|
680
760
|
try {
|
|
681
|
-
await
|
|
682
|
-
const stat = await
|
|
761
|
+
await fs.access(packageDir);
|
|
762
|
+
const stat = await fs.stat(packageDir);
|
|
683
763
|
if (!stat.isDirectory()) {
|
|
684
764
|
throw new Error(`Path is not a directory: ${packageDir}`);
|
|
685
765
|
}
|
|
@@ -690,13 +770,22 @@ const executePackage = async (packageName, packageInfo, commandToRun, runConfig,
|
|
|
690
770
|
if (runConfig.debug) {
|
|
691
771
|
packageLogger.debug(`Changed to directory: ${packageDir}`);
|
|
692
772
|
}
|
|
693
|
-
// Handle
|
|
694
|
-
if (!isDryRun && isBuiltInCommand && commandToRun.includes('publish')
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
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) {
|
|
698
787
|
// Commit the dependency updates using kodrdriv commit
|
|
699
|
-
packageLogger.info('Committing
|
|
788
|
+
packageLogger.info('Committing dependency updates...');
|
|
700
789
|
packageLogger.info('⏱️ This step may take a few minutes as it generates a commit message using AI...');
|
|
701
790
|
// Add timeout wrapper around commit execution
|
|
702
791
|
const commitTimeoutMs = 300000; // 5 minutes
|
|
@@ -718,14 +807,14 @@ const executePackage = async (packageName, packageInfo, commandToRun, runConfig,
|
|
|
718
807
|
commitPromise,
|
|
719
808
|
timeoutPromise
|
|
720
809
|
]);
|
|
721
|
-
packageLogger.info('✅
|
|
810
|
+
packageLogger.info('✅ Dependency updates committed successfully');
|
|
722
811
|
} catch (commitError) {
|
|
723
812
|
if (commitError.message.includes('timed out')) {
|
|
724
813
|
packageLogger.error(`❌ Commit operation timed out after ${commitTimeoutMs / 1000} seconds`);
|
|
725
814
|
packageLogger.error('This usually indicates an issue with the AI service or very large changes');
|
|
726
815
|
packageLogger.error('You may need to manually commit the dependency updates');
|
|
727
816
|
} else {
|
|
728
|
-
packageLogger.warn(`Failed to commit
|
|
817
|
+
packageLogger.warn(`Failed to commit dependency updates: ${commitError.message}`);
|
|
729
818
|
}
|
|
730
819
|
// Continue with publish anyway - the updates are still in place
|
|
731
820
|
} finally{
|
|
@@ -733,8 +822,6 @@ const executePackage = async (packageName, packageInfo, commandToRun, runConfig,
|
|
|
733
822
|
clearInterval(progressInterval);
|
|
734
823
|
}
|
|
735
824
|
}
|
|
736
|
-
} else {
|
|
737
|
-
packageLogger.info('No inter-project dependency updates needed');
|
|
738
825
|
}
|
|
739
826
|
}
|
|
740
827
|
if (runConfig.debug || runConfig.verbose) {
|
|
@@ -1080,7 +1167,7 @@ const execute = async (runConfig)=>{
|
|
|
1080
1167
|
// Resolve the actual package name (can be package name or directory name)
|
|
1081
1168
|
let startPackageName = null;
|
|
1082
1169
|
for (const [pkgName, pkgInfo] of dependencyGraph.packages){
|
|
1083
|
-
const dirName =
|
|
1170
|
+
const dirName = path.basename(pkgInfo.path);
|
|
1084
1171
|
if (dirName === startFrom || pkgName === startFrom) {
|
|
1085
1172
|
startPackageName = pkgName;
|
|
1086
1173
|
break;
|
|
@@ -1097,7 +1184,7 @@ const execute = async (runConfig)=>{
|
|
|
1097
1184
|
for (const packageJsonPath of allPackageJsonPathsForCheck){
|
|
1098
1185
|
try {
|
|
1099
1186
|
const packageInfo = await parsePackageJson(packageJsonPath);
|
|
1100
|
-
const dirName =
|
|
1187
|
+
const dirName = path.basename(packageInfo.path);
|
|
1101
1188
|
if (dirName === startFrom || packageInfo.name === startFrom) {
|
|
1102
1189
|
// Check if this package was excluded
|
|
1103
1190
|
if (shouldExclude(packageJsonPath, excludedPatterns)) {
|
|
@@ -1115,7 +1202,7 @@ const execute = async (runConfig)=>{
|
|
|
1115
1202
|
} else {
|
|
1116
1203
|
const availablePackages = buildOrder.map((name)=>{
|
|
1117
1204
|
const packageInfo = dependencyGraph.packages.get(name);
|
|
1118
|
-
return `${
|
|
1205
|
+
return `${path.basename(packageInfo.path)} (${name})`;
|
|
1119
1206
|
}).join(', ');
|
|
1120
1207
|
throw new Error(`Package directory '${startFrom}' not found. Available packages: ${availablePackages}`);
|
|
1121
1208
|
}
|
|
@@ -1137,7 +1224,7 @@ const execute = async (runConfig)=>{
|
|
|
1137
1224
|
// Find the package that matches the stopAt directory name
|
|
1138
1225
|
const stopIndex = buildOrder.findIndex((packageName)=>{
|
|
1139
1226
|
const packageInfo = dependencyGraph.packages.get(packageName);
|
|
1140
|
-
const dirName =
|
|
1227
|
+
const dirName = path.basename(packageInfo.path);
|
|
1141
1228
|
return dirName === stopAt || packageName === stopAt;
|
|
1142
1229
|
});
|
|
1143
1230
|
if (stopIndex === -1) {
|
|
@@ -1151,7 +1238,7 @@ const execute = async (runConfig)=>{
|
|
|
1151
1238
|
for (const packageJsonPath of allPackageJsonPathsForCheck){
|
|
1152
1239
|
try {
|
|
1153
1240
|
const packageInfo = await parsePackageJson(packageJsonPath);
|
|
1154
|
-
const dirName =
|
|
1241
|
+
const dirName = path.basename(packageInfo.path);
|
|
1155
1242
|
if (dirName === stopAt || packageInfo.name === stopAt) {
|
|
1156
1243
|
// Check if this package was excluded
|
|
1157
1244
|
if (shouldExclude(packageJsonPath, excludedPatterns)) {
|
|
@@ -1169,7 +1256,7 @@ const execute = async (runConfig)=>{
|
|
|
1169
1256
|
} else {
|
|
1170
1257
|
const availablePackages = buildOrder.map((name)=>{
|
|
1171
1258
|
const packageInfo = dependencyGraph.packages.get(name);
|
|
1172
|
-
return `${
|
|
1259
|
+
return `${path.basename(packageInfo.path)} (${name})`;
|
|
1173
1260
|
}).join(', ');
|
|
1174
1261
|
throw new Error(`Package directory '${stopAt}' not found. Available packages: ${availablePackages}`);
|
|
1175
1262
|
}
|
|
@@ -1214,7 +1301,7 @@ const execute = async (runConfig)=>{
|
|
|
1214
1301
|
for (const [packageName, packageInfo] of allPackages){
|
|
1215
1302
|
if (packageName === targetPackageName) continue;
|
|
1216
1303
|
try {
|
|
1217
|
-
const packageJsonPath =
|
|
1304
|
+
const packageJsonPath = path.join(packageInfo.path, 'package.json');
|
|
1218
1305
|
const packageJsonContent = await storage.readFile(packageJsonPath, 'utf-8');
|
|
1219
1306
|
const parsed = safeJsonParse(packageJsonContent, packageJsonPath);
|
|
1220
1307
|
const packageJson = validatePackageJson(parsed, packageJsonPath);
|