@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.
- package/WORKFLOW-PRECHECK-IMPLEMENTATION.md +239 -0
- package/WORKFLOW-SKIP-SUMMARY.md +121 -0
- package/dist/application.js +6 -2
- package/dist/application.js.map +1 -1
- 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 +31 -20
- 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 +87 -34
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/release.js +32 -19
- package/dist/commands/release.js.map +1 -1
- package/dist/commands/review.js +36 -30
- 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 +154 -38
- 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/error/CommandErrors.js +1 -65
- package/dist/error/CommandErrors.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 +6 -4
- package/test_output.txt +3 -3
- package/INTEGRATION-SUMMARY.md +0 -232
- package/TEST-STATUS.md +0 -168
- package/dist/content/issues.js +0 -331
- package/dist/content/issues.js.map +0 -1
- package/dist/content/releaseNotes.js +0 -90
- package/dist/content/releaseNotes.js.map +0 -1
- 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/github.js +0 -1071
- package/dist/util/github.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,8 +1,8 @@
|
|
|
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
|
-
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 =
|
|
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');
|
|
@@ -305,19 +385,48 @@ const validateScripts = async (packages, scripts)=>{
|
|
|
305
385
|
missingScripts
|
|
306
386
|
};
|
|
307
387
|
};
|
|
308
|
-
// Extract published version from
|
|
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 =
|
|
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:
|
|
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(
|
|
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 =
|
|
448
|
-
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));
|
|
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 =
|
|
564
|
+
const directPackageJsonPath = path.join(directory, 'package.json');
|
|
456
565
|
try {
|
|
457
|
-
await
|
|
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
|
|
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 =
|
|
475
|
-
const packageJsonPath =
|
|
583
|
+
const subDirPath = path.join(directory, entry.name);
|
|
584
|
+
const packageJsonPath = path.join(subDirPath, 'package.json');
|
|
476
585
|
try {
|
|
477
|
-
await
|
|
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:
|
|
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
|
|
653
|
-
const stat = await
|
|
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
|
|
665
|
-
if (!isDryRun && isBuiltInCommand && commandToRun.includes('publish')
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
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
|
|
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('✅
|
|
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
|
|
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 =
|
|
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 =
|
|
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 `${
|
|
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 =
|
|
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 =
|
|
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 `${
|
|
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 =
|
|
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);
|