@eldrforge/kodrdriv 1.2.128 → 1.2.130

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 (32) hide show
  1. package/dist/commands/audio-commit.js +2 -2
  2. package/dist/commands/audio-commit.js.map +1 -1
  3. package/dist/commands/audio-review.js +2 -2
  4. package/dist/commands/audio-review.js.map +1 -1
  5. package/dist/commands/tree.js +4 -4
  6. package/dist/commands/tree.js.map +1 -1
  7. package/dist/constants.js +1 -1
  8. package/dist/util/general.js +3 -52
  9. package/dist/util/general.js.map +1 -1
  10. package/package.json +4 -1
  11. package/dist/execution/CommandValidator.js +0 -192
  12. package/dist/execution/CommandValidator.js.map +0 -1
  13. package/dist/execution/DependencyChecker.js +0 -102
  14. package/dist/execution/DependencyChecker.js.map +0 -1
  15. package/dist/execution/DynamicTaskPool.js +0 -661
  16. package/dist/execution/DynamicTaskPool.js.map +0 -1
  17. package/dist/execution/RecoveryManager.js +0 -584
  18. package/dist/execution/RecoveryManager.js.map +0 -1
  19. package/dist/execution/ResourceMonitor.js +0 -150
  20. package/dist/execution/ResourceMonitor.js.map +0 -1
  21. package/dist/execution/Scheduler.js +0 -98
  22. package/dist/execution/Scheduler.js.map +0 -1
  23. package/dist/execution/TreeExecutionAdapter.js +0 -225
  24. package/dist/execution/TreeExecutionAdapter.js.map +0 -1
  25. package/dist/ui/ProgressFormatter.js +0 -250
  26. package/dist/ui/ProgressFormatter.js.map +0 -1
  27. package/dist/util/checkpointManager.js +0 -166
  28. package/dist/util/checkpointManager.js.map +0 -1
  29. package/dist/util/countdown.js +0 -215
  30. package/dist/util/countdown.js.map +0 -1
  31. package/dist/util/dependencyGraph.js +0 -222
  32. package/dist/util/dependencyGraph.js.map +0 -1
package/dist/constants.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import os__default from 'os';
2
2
  import path__default from 'path';
3
3
 
4
- const VERSION = '1.2.128 (HEAD/3f5a98a T:v1.2.128 2025-12-25 22:03:53 -0800) linux x64 v22.21.1';
4
+ const VERSION = '1.2.130 (HEAD/6e04111 T:v1.2.130 2025-12-26 18:52:39 -0800) linux x64 v22.21.1';
5
5
  const PROGRAM_NAME = 'kodrdriv';
6
6
  const DEFAULT_OVERRIDES = false;
7
7
  const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS = 'YYYY-MM-DD-HHmmss.SSS';
@@ -1,8 +1,7 @@
1
1
  import path__default from 'path';
2
- import { incrementPatchVersion, validateVersionString, createStorage, convertToReleaseVersion, incrementPrereleaseVersion } from '@eldrforge/shared';
2
+ import { incrementPatchVersion, validateVersionString, convertToReleaseVersion, incrementPrereleaseVersion } from '@eldrforge/shared';
3
3
  export { calculateTargetVersion, convertToReleaseVersion, deepMerge, incrementMajorVersion, incrementMinorVersion, incrementPatchVersion, incrementPrereleaseVersion, stringifyJSON, validateVersionString } from '@eldrforge/shared';
4
4
  import { getLogger } from '../logging.js';
5
- import * as fs from 'fs';
6
5
 
7
6
  /**
8
7
  * Get version from a specific branch's package.json
@@ -241,55 +240,7 @@ const getTimestampedReviewFilename = ()=>{
241
240
  const getTimestampedReviewNotesFilename = ()=>{
242
241
  return getTimestampedFilename('review-notes', '.md');
243
242
  };
244
- const getTimestampedArchivedAudioFilename = (originalExtension = '.wav')=>{
245
- return getTimestampedFilename('review-audio', originalExtension);
246
- };
247
- const getTimestampedArchivedTranscriptFilename = ()=>{
248
- return getTimestampedFilename('review-transcript', '.md');
249
- };
250
- /**
251
- * Archives an audio file and its transcription to the output/kodrdriv directory
252
- * @param originalAudioPath - Path to the original audio file
253
- * @param transcriptionText - The raw transcription text
254
- * @param outputDirectory - Base output directory (default: 'output')
255
- * @returns Object containing the paths where files were archived
256
- */ const archiveAudio = async (originalAudioPath, transcriptionText, outputDirectory = 'output')=>{
257
- const logger = getLogger();
258
- const storage = createStorage();
259
- try {
260
- // Ensure the output directory exists (should already be output/kodrdriv)
261
- await storage.ensureDirectory(outputDirectory);
262
- // Get file extension from original audio file
263
- const originalExtension = path__default.extname(originalAudioPath);
264
- // Generate timestamped filenames
265
- const archivedAudioFilename = getTimestampedArchivedAudioFilename(originalExtension);
266
- const archivedTranscriptFilename = getTimestampedArchivedTranscriptFilename();
267
- // Full paths for archived files - directly in the output directory
268
- const archivedAudioPath = path__default.join(outputDirectory, archivedAudioFilename);
269
- const archivedTranscriptPath = path__default.join(outputDirectory, archivedTranscriptFilename);
270
- // Copy audio file if it exists
271
- if (await storage.isFileReadable(originalAudioPath)) {
272
- // Read original audio file as buffer using fs directly for binary files
273
- const audioBuffer = await fs.promises.readFile(originalAudioPath);
274
- await storage.writeFile(archivedAudioPath, audioBuffer, 'binary');
275
- logger.debug('Archived audio file to: %s', archivedAudioPath);
276
- } else {
277
- logger.warn('AUDIO_FILE_NOT_FOUND: Original audio file not accessible | Path: %s | Impact: Cannot archive original', originalAudioPath);
278
- }
279
- // Save transcription text
280
- const transcriptContent = `# Audio Transcription Archive\n\n**Original Audio File:** ${originalAudioPath}\n**Archived:** ${new Date().toISOString()}\n\n## Transcription\n\n${transcriptionText}`;
281
- await storage.writeFile(archivedTranscriptPath, transcriptContent, 'utf8');
282
- logger.debug('Archived transcription to: %s', archivedTranscriptPath);
283
- logger.info('AUDIO_ARCHIVED: Audio and transcript archived successfully | Audio: %s | Transcript: %s | Status: archived', archivedAudioFilename, archivedTranscriptFilename);
284
- return {
285
- audioPath: archivedAudioPath,
286
- transcriptPath: archivedTranscriptPath
287
- };
288
- } catch (error) {
289
- logger.error('AUDIO_ARCHIVE_FAILED: Failed to archive audio files | Error: %s | Impact: Audio not preserved', error.message);
290
- throw new Error(`Audio archiving failed: ${error.message}`);
291
- }
292
- };
243
+ // archiveAudio function moved to @eldrforge/audio-tools
293
244
  /**
294
245
  * Query npm registry for published version of a package
295
246
  * Returns null if package is not published or on error
@@ -424,5 +375,5 @@ const getTimestampedArchivedTranscriptFilename = ()=>{
424
375
  };
425
376
  };
426
377
 
427
- export { archiveAudio, calculateBranchDependentVersion, checkIfTagExists, confirmVersionInteractively, findDevelopmentBranch, getExpectedVersionPattern, getNpmPublishedVersion, getOutputPath, getTagInfo, getTimestampedArchivedAudioFilename, getTimestampedArchivedTranscriptFilename, getTimestampedAudioFilename, getTimestampedCommitFilename, getTimestampedFilename, getTimestampedReleaseNotesFilename, getTimestampedRequestFilename, getTimestampedResponseFilename, getTimestampedReviewFilename, getTimestampedReviewNotesFilename, getVersionFromBranch, isDevelopmentVersion, validateVersionForBranch };
378
+ export { calculateBranchDependentVersion, checkIfTagExists, confirmVersionInteractively, findDevelopmentBranch, getExpectedVersionPattern, getNpmPublishedVersion, getOutputPath, getTagInfo, getTimestampedAudioFilename, getTimestampedCommitFilename, getTimestampedFilename, getTimestampedReleaseNotesFilename, getTimestampedRequestFilename, getTimestampedResponseFilename, getTimestampedReviewFilename, getTimestampedReviewNotesFilename, getVersionFromBranch, isDevelopmentVersion, validateVersionForBranch };
428
379
  //# sourceMappingURL=general.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"general.js","sources":["../../src/util/general.ts"],"sourcesContent":["import path from 'path';\nimport { createStorage, deepMerge, stringifyJSON, incrementPatchVersion, incrementMinorVersion, incrementMajorVersion, validateVersionString, calculateTargetVersion, incrementPrereleaseVersion, convertToReleaseVersion } from '@eldrforge/shared';\nimport { getLogger } from '../logging';\n// eslint-disable-next-line no-restricted-imports\nimport * as fs from 'fs';\n\n/**\n * Get version from a specific branch's package.json\n */\nexport const getVersionFromBranch = async (branchName: string): Promise<string | null> => {\n const { runSecure, validateGitRef, safeJsonParse, validatePackageJson } = await import('@eldrforge/git-tools');\n\n try {\n // Validate branch name to prevent injection\n if (!validateGitRef(branchName)) {\n throw new Error(`Invalid branch name: ${branchName}`);\n }\n // Cast to any to avoid type mismatch with node_modules version\n const { stdout } = await (runSecure as any)('git', ['show', `${branchName}:package.json`], { suppressErrorLogging: true });\n const packageJson = safeJsonParse(stdout, 'package.json');\n const validated = validatePackageJson(packageJson, 'package.json');\n return validated.version;\n } catch {\n // Return null if we can't get the version (branch may not exist or no package.json)\n return null;\n }\n};\n\n/**\n * Calculate target version based on branch configuration\n * SEMANTICS: The version config specifies what version should be ON the target branch\n */\nexport const calculateBranchDependentVersion = async (\n currentVersion: string,\n currentBranch: string,\n branchesConfig: any,\n targetBranch?: string\n): Promise<{ version: string; targetBranch: string }> => {\n const { getLogger } = await import('../logging');\n const logger = getLogger();\n\n // Look up the source branch to find the target branch\n if (!branchesConfig || !branchesConfig[currentBranch]) {\n // Use default configuration from constants\n const { KODRDRIV_DEFAULTS } = await import('../constants');\n const defaultConfig = KODRDRIV_DEFAULTS.branches as any;\n\n if (defaultConfig && defaultConfig[currentBranch]) {\n const sourceConfig = defaultConfig[currentBranch];\n const finalTargetBranch = sourceConfig.targetBranch || targetBranch || 'main';\n\n // Look at target branch's version config to determine what version it should have\n const targetConfig = defaultConfig[finalTargetBranch];\n\n logger.info(`VERSION_BRANCH_DEFAULT: Using default branch configuration | Source Branch: ${currentBranch} | Target Branch: ${finalTargetBranch} | Source: default config`);\n\n if (!targetConfig?.version) {\n const defaultVersion = incrementPatchVersion(currentVersion);\n logger.debug(`No version config for target branch '${finalTargetBranch}', using default increment`);\n return { version: defaultVersion, targetBranch: finalTargetBranch };\n }\n\n return calculateVersionFromTargetConfig(currentVersion, finalTargetBranch, targetConfig.version, logger);\n }\n\n // No config at all, use traditional defaults\n const defaultTargetBranch = targetBranch || 'main';\n const defaultVersion = incrementPatchVersion(currentVersion);\n logger.debug(`No branch-specific config found for '${currentBranch}', using defaults`);\n return { version: defaultVersion, targetBranch: defaultTargetBranch };\n }\n\n const sourceConfig = branchesConfig[currentBranch];\n const finalTargetBranch = sourceConfig.targetBranch || targetBranch || 'main';\n\n // Look at target branch's version config to determine what version it should have\n const targetConfig = branchesConfig[finalTargetBranch];\n\n logger.info(`VERSION_BRANCH_DEPENDENT: Using branch-dependent targeting | Source Branch: ${currentBranch} | Target Branch: ${finalTargetBranch} | Source: branch config`);\n\n if (!targetConfig?.version) {\n // No version config for target, use default increment\n const defaultVersion = incrementPatchVersion(currentVersion);\n logger.debug(`No version config for target branch '${finalTargetBranch}', using default increment`);\n return { version: defaultVersion, targetBranch: finalTargetBranch };\n }\n\n return calculateVersionFromTargetConfig(currentVersion, finalTargetBranch, targetConfig.version, logger);\n};\n\n/**\n * Calculate version based on target branch configuration\n */\nconst calculateVersionFromTargetConfig = async (\n currentVersion: string,\n targetBranch: string,\n versionConfig: any,\n logger: any\n): Promise<{ version: string; targetBranch: string }> => {\n if (versionConfig.type === 'release') {\n // Convert to release version (remove prerelease tags)\n const releaseVersion = convertToReleaseVersion(currentVersion);\n logger.info(`VERSION_RELEASE_CONVERSION: Converting prerelease to release version | Current: ${currentVersion} | Release: ${releaseVersion} | Action: Remove prerelease tag`);\n return { version: releaseVersion, targetBranch };\n } else if (versionConfig.type === 'prerelease') {\n if (!versionConfig.tag) {\n throw new Error(`Prerelease version type requires a tag in branch configuration`);\n }\n\n const tag = versionConfig.tag;\n\n if (versionConfig.increment) {\n // Check if there's already a version with this tag in the target branch\n const targetBranchVersion = await getVersionFromBranch(targetBranch);\n\n if (targetBranchVersion) {\n // Use the target branch version as the base and increment\n const newVersion = incrementPrereleaseVersion(targetBranchVersion, tag);\n logger.info(`VERSION_PRERELEASE_INCREMENT: Incrementing prerelease version | Current: ${targetBranchVersion} | New: ${newVersion} | Action: Increment prerelease number`);\n return { version: newVersion, targetBranch };\n } else {\n // No version in target branch, use current version as base\n const newVersion = incrementPrereleaseVersion(currentVersion, tag);\n logger.info(`VERSION_PRERELEASE_CREATE: Creating new prerelease version | Current: ${currentVersion} | New: ${newVersion} | Action: Add prerelease tag`);\n return { version: newVersion, targetBranch };\n }\n } else {\n // Just add/change the prerelease tag without incrementing\n const baseVersion = convertToReleaseVersion(currentVersion);\n const newVersion = `${baseVersion}-${tag}.0`;\n logger.info(`VERSION_PRERELEASE_TAG: Setting prerelease tag | Current: ${currentVersion} | New: ${newVersion} | Tag: ${versionConfig.tag}`);\n return { version: newVersion, targetBranch };\n }\n }\n\n throw new Error(`Invalid version type: ${versionConfig.type}`);\n};\n\n\n/**\n * Find the development branch from branches configuration\n * Returns the branch marked with developmentBranch: true\n */\nexport const findDevelopmentBranch = (branchesConfig: any): string | null => {\n if (!branchesConfig || typeof branchesConfig !== 'object') {\n return null;\n }\n\n for (const [branchName, branchConfig] of Object.entries(branchesConfig)) {\n if (branchConfig && typeof branchConfig === 'object' && (branchConfig as any).developmentBranch === true) {\n return branchName;\n }\n }\n\n return null;\n};\n\n/**\n * Check if two prerelease versions have the same tag\n * Examples:\n * - haveSamePrereleaseTag(\"1.2.3-dev.0\", \"1.2.3-dev.5\") => true\n * - haveSamePrereleaseTag(\"1.2.3-dev.0\", \"1.2.3-test.0\") => false\n * - haveSamePrereleaseTag(\"1.2.3\", \"1.2.3-dev.0\") => false\n */\nexport const haveSamePrereleaseTag = (version1: string, version2: string): boolean => {\n const extractTag = (version: string): string | null => {\n const cleanVersion = version.startsWith('v') ? version.slice(1) : version;\n const parts = cleanVersion.split('.');\n if (parts.length < 3) return null;\n\n const patchAndPrerelease = parts.slice(2).join('.');\n const patchComponents = patchAndPrerelease.split('-');\n\n if (patchComponents.length > 1) {\n const prereleaseString = patchComponents.slice(1).join('-');\n const prereleaseComponents = prereleaseString.split('.');\n return prereleaseComponents[0] || null;\n }\n\n return null;\n };\n\n const tag1 = extractTag(version1);\n const tag2 = extractTag(version2);\n\n return tag1 !== null && tag2 !== null && tag1 === tag2;\n};\n\nexport const checkIfTagExists = async (tagName: string): Promise<boolean> => {\n const { runSecure, validateGitRef } = await import('@eldrforge/git-tools');\n try {\n // Validate tag name to prevent injection\n if (!validateGitRef(tagName)) {\n throw new Error(`Invalid tag name: ${tagName}`);\n }\n const { stdout } = await runSecure('git', ['tag', '-l', tagName]);\n return stdout.trim() === tagName;\n } catch {\n // If git command fails, assume tag doesn't exist\n return false;\n }\n};\n\nexport const confirmVersionInteractively = async (currentVersion: string, proposedVersion: string, targetVersionInput?: string): Promise<string> => {\n const { getUserChoice, getUserTextInput, requireTTY } = await import('./interactive');\n const { getLogger } = await import('../logging');\n\n requireTTY('Interactive version confirmation requires a terminal.');\n\n const logger = getLogger();\n logger.info(`\\nVERSION_CONFIRMATION: Version confirmation required | Current: ${currentVersion} | Proposed: ${proposedVersion}`);\n logger.info(`VERSION_CURRENT: Current package version | Version: ${currentVersion}`);\n logger.info(`VERSION_PROPOSED: Proposed new version | Version: ${proposedVersion}`);\n if (targetVersionInput) {\n logger.info(`VERSION_TARGET_INPUT: Target version provided | Input: ${targetVersionInput}`);\n }\n\n const choices = [\n { key: 'c', label: `Confirm ${proposedVersion}` },\n { key: 'e', label: 'Enter custom version' },\n { key: 'a', label: 'Abort publish' }\n ];\n\n const choice = await getUserChoice('\\n🤔 Confirm the version for this release:', choices);\n\n switch (choice) {\n case 'c':\n return proposedVersion;\n case 'e': {\n const customVersion = await getUserTextInput('\\n📝 Enter the version number (e.g., \"4.30.0\"):');\n if (!validateVersionString(customVersion)) {\n throw new Error(`Invalid version format: ${customVersion}. Expected format: \"x.y.z\"`);\n }\n const cleanCustomVersion = customVersion.startsWith('v') ? customVersion.slice(1) : customVersion;\n logger.info(`VERSION_CUSTOM_SELECTED: Using custom version from user input | Version: ${cleanCustomVersion} | Source: interactive input`);\n return cleanCustomVersion;\n }\n case 'a':\n throw new Error('Release aborted by user');\n default:\n throw new Error(`Unexpected choice: ${choice}`);\n }\n};\n\nexport const getOutputPath = (outputDirectory: string, filename: string): string => {\n return path.join(outputDirectory, filename);\n};\n\nexport const getTimestampedFilename = (baseName: string, extension: string = '.json'): string => {\n const now = new Date();\n\n // Format as YYMMdd-HHmm (e.g., 250701-1030)\n const yy = now.getFullYear().toString().slice(-2);\n const mm = (now.getMonth() + 1).toString().padStart(2, '0');\n const dd = now.getDate().toString().padStart(2, '0');\n const hh = now.getHours().toString().padStart(2, '0');\n const min = now.getMinutes().toString().padStart(2, '0');\n\n const timestamp = `${yy}${mm}${dd}-${hh}${min}`;\n\n return `${timestamp}-${baseName}${extension}`;\n};\n\nexport const getTimestampedRequestFilename = (baseName: string): string => {\n return getTimestampedFilename(baseName, '.request.json');\n};\n\nexport const getTimestampedResponseFilename = (baseName: string): string => {\n return getTimestampedFilename(baseName, '.response.json');\n};\n\nexport const getTimestampedCommitFilename = (): string => {\n return getTimestampedFilename('commit-message', '.md');\n};\n\nexport const getTimestampedReleaseNotesFilename = (): string => {\n return getTimestampedFilename('release-notes', '.md');\n};\n\nexport const getTimestampedAudioFilename = (): string => {\n return getTimestampedFilename('audio-recording', '.wav');\n};\n\nexport const getTimestampedTranscriptFilename = (): string => {\n return getTimestampedFilename('audio-transcript', '.md');\n};\n\nexport const getTimestampedReviewFilename = (): string => {\n return getTimestampedFilename('review-analysis', '.md');\n};\n\nexport const getTimestampedReviewNotesFilename = (): string => {\n return getTimestampedFilename('review-notes', '.md');\n};\n\nexport const getTimestampedArchivedAudioFilename = (originalExtension: string = '.wav'): string => {\n return getTimestampedFilename('review-audio', originalExtension);\n};\n\nexport const getTimestampedArchivedTranscriptFilename = (): string => {\n return getTimestampedFilename('review-transcript', '.md');\n};\n\n/**\n * Archives an audio file and its transcription to the output/kodrdriv directory\n * @param originalAudioPath - Path to the original audio file\n * @param transcriptionText - The raw transcription text\n * @param outputDirectory - Base output directory (default: 'output')\n * @returns Object containing the paths where files were archived\n */\nexport const archiveAudio = async (\n originalAudioPath: string,\n transcriptionText: string,\n outputDirectory: string = 'output'\n): Promise<{ audioPath: string; transcriptPath: string }> => {\n const logger = getLogger();\n const storage = createStorage();\n\n try {\n // Ensure the output directory exists (should already be output/kodrdriv)\n await storage.ensureDirectory(outputDirectory);\n\n // Get file extension from original audio file\n const originalExtension = path.extname(originalAudioPath);\n\n // Generate timestamped filenames\n const archivedAudioFilename = getTimestampedArchivedAudioFilename(originalExtension);\n const archivedTranscriptFilename = getTimestampedArchivedTranscriptFilename();\n\n // Full paths for archived files - directly in the output directory\n const archivedAudioPath = path.join(outputDirectory, archivedAudioFilename);\n const archivedTranscriptPath = path.join(outputDirectory, archivedTranscriptFilename);\n\n // Copy audio file if it exists\n if (await storage.isFileReadable(originalAudioPath)) {\n // Read original audio file as buffer using fs directly for binary files\n const audioBuffer = await fs.promises.readFile(originalAudioPath);\n await storage.writeFile(archivedAudioPath, audioBuffer, 'binary');\n logger.debug('Archived audio file to: %s', archivedAudioPath);\n } else {\n logger.warn('AUDIO_FILE_NOT_FOUND: Original audio file not accessible | Path: %s | Impact: Cannot archive original', originalAudioPath);\n }\n\n // Save transcription text\n const transcriptContent = `# Audio Transcription Archive\\n\\n**Original Audio File:** ${originalAudioPath}\\n**Archived:** ${new Date().toISOString()}\\n\\n## Transcription\\n\\n${transcriptionText}`;\n await storage.writeFile(archivedTranscriptPath, transcriptContent, 'utf8');\n logger.debug('Archived transcription to: %s', archivedTranscriptPath);\n\n logger.info('AUDIO_ARCHIVED: Audio and transcript archived successfully | Audio: %s | Transcript: %s | Status: archived', archivedAudioFilename, archivedTranscriptFilename);\n\n return {\n audioPath: archivedAudioPath,\n transcriptPath: archivedTranscriptPath\n };\n\n } catch (error: any) {\n logger.error('AUDIO_ARCHIVE_FAILED: Failed to archive audio files | Error: %s | Impact: Audio not preserved', error.message);\n throw new Error(`Audio archiving failed: ${error.message}`);\n }\n};\n\n/**\n * Query npm registry for published version of a package\n * Returns null if package is not published or on error\n */\nexport const getNpmPublishedVersion = async (packageName: string): Promise<string | null> => {\n const logger = getLogger();\n try {\n const { runSecure } = await import('@eldrforge/git-tools');\n\n // Use npm view to get the latest published version\n // --json flag ensures parseable output\n const { stdout } = await runSecure('npm', ['view', packageName, 'version', '--json']);\n\n if (!stdout || stdout.trim() === '') {\n logger.verbose(`Package ${packageName} not found on npm registry`);\n return null;\n }\n\n // npm view returns just the version string for a single version\n const version = stdout.trim().replace(/^[\"']|[\"']$/g, ''); // Remove quotes if present\n logger.verbose(`Found ${packageName}@${version} on npm registry`);\n return version;\n } catch (error: any) {\n // Package not found or network error\n logger.verbose(`Could not query npm for ${packageName}: ${error.message}`);\n return null;\n }\n};\n\n/**\n * Check if a package version already exists on npm registry\n */\nexport const isVersionPublishedOnNpm = async (packageName: string, version: string): Promise<boolean> => {\n const logger = getLogger();\n try {\n const { runSecure } = await import('@eldrforge/git-tools');\n\n // Use npm view to check for specific version\n const { stdout } = await runSecure('npm', ['view', `${packageName}@${version}`, 'version', '--json']);\n\n if (!stdout || stdout.trim() === '') {\n logger.verbose(`Version ${packageName}@${version} not found on npm registry`);\n return false;\n }\n\n logger.verbose(`Version ${packageName}@${version} exists on npm registry`);\n return true;\n } catch (error: any) {\n // Version not found\n logger.verbose(`Version ${packageName}@${version} not published: ${error.message}`);\n return false;\n }\n};\n\n/**\n * Get detailed info about a tag including the version it points to\n */\nexport const getTagInfo = async (tagName: string): Promise<{ exists: boolean; commit?: string; version?: string } | null> => {\n try {\n const { runSecure, validateGitRef } = await import('@eldrforge/git-tools');\n\n if (!validateGitRef(tagName)) {\n throw new Error(`Invalid tag name: ${tagName}`);\n }\n\n // Check if tag exists\n const { stdout: tagList } = await runSecure('git', ['tag', '-l', tagName]);\n if (tagList.trim() !== tagName) {\n return { exists: false };\n }\n\n // Get the commit the tag points to\n const { stdout: commit } = await runSecure('git', ['rev-list', '-n', '1', tagName]);\n\n // Extract version from tag name (assumes format like v1.2.3 or working/v1.2.3)\n const versionMatch = tagName.match(/v?(\\d+\\.\\d+\\.\\d+(?:-[a-zA-Z0-9.-]+)?)/);\n const version = versionMatch ? versionMatch[1] : undefined;\n\n return {\n exists: true,\n commit: commit.trim(),\n version\n };\n } catch {\n return null;\n }\n};\n\n/**\n * Check if a version is a development/prerelease version (has prerelease tag)\n */\nexport const isDevelopmentVersion = (version: string): boolean => {\n // Development versions have prerelease tags: 1.2.3-dev.0, 1.2.3-alpha.1, etc.\n return version.includes('-');\n};\n\n/**\n * Check if a version is a release version (no prerelease tag)\n */\nexport const isReleaseVersion = (version: string): boolean => {\n // Release versions are X.Y.Z without any suffix\n return /^\\d+\\.\\d+\\.\\d+$/.test(version);\n};\n\n/**\n * Get expected version pattern for a branch\n */\nexport const getExpectedVersionPattern = (branchName: string): { pattern: RegExp; description: string; isDevelopment: boolean } => {\n // Development/working branches should have prerelease versions\n const devBranchPatterns = /^(working|development|dev|feature\\/|wip\\/)/i;\n\n if (devBranchPatterns.test(branchName)) {\n return {\n pattern: /^\\d+\\.\\d+\\.\\d+-[a-zA-Z0-9.-]+$/,\n description: 'X.Y.Z-<tag> (e.g., 1.2.3-dev.0)',\n isDevelopment: true\n };\n }\n\n // Main/master/production branches should have release versions\n const releaseBranchPatterns = /^(main|master|production|release\\/)/i;\n\n if (releaseBranchPatterns.test(branchName)) {\n return {\n pattern: /^\\d+\\.\\d+\\.\\d+$/,\n description: 'X.Y.Z (e.g., 1.2.3)',\n isDevelopment: false\n };\n }\n\n // For other branches, allow both but prefer release versions\n return {\n pattern: /^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?$/,\n description: 'X.Y.Z or X.Y.Z-<tag>',\n isDevelopment: false\n };\n};\n\n/**\n * Validate version against branch expectations\n */\nexport const validateVersionForBranch = (version: string, branchName: string): {\n valid: boolean;\n issue?: string;\n fix?: string;\n} => {\n const expected = getExpectedVersionPattern(branchName);\n\n if (!expected.pattern.test(version)) {\n return {\n valid: false,\n issue: `Invalid version format for branch '${branchName}'`,\n fix: `Version should match ${expected.description}`\n };\n }\n\n const isDevVersion = isDevelopmentVersion(version);\n\n // Development branches should have development versions\n if (expected.isDevelopment && !isDevVersion) {\n return {\n valid: false,\n issue: `Release version on development branch '${branchName}'`,\n fix: 'Run kodrdriv development to update to development version'\n };\n }\n\n // Release branches should NOT have development versions\n if (!expected.isDevelopment && branchName.match(/^(main|master|production|release\\/)/) && isDevVersion) {\n return {\n valid: false,\n issue: `Development version on release branch '${branchName}'`,\n fix: 'Do not commit development versions to release branches'\n };\n }\n\n return { valid: true };\n};\n\n// Re-export shared utilities for backwards compatibility\nexport { deepMerge, stringifyJSON, incrementPatchVersion, incrementMinorVersion, incrementMajorVersion, validateVersionString, calculateTargetVersion, incrementPrereleaseVersion, convertToReleaseVersion };\n"],"names":["getVersionFromBranch","branchName","runSecure","validateGitRef","safeJsonParse","validatePackageJson","Error","stdout","suppressErrorLogging","packageJson","validated","version","calculateBranchDependentVersion","currentVersion","currentBranch","branchesConfig","targetBranch","getLogger","logger","KODRDRIV_DEFAULTS","defaultConfig","branches","sourceConfig","finalTargetBranch","targetConfig","info","defaultVersion","incrementPatchVersion","debug","calculateVersionFromTargetConfig","defaultTargetBranch","versionConfig","type","releaseVersion","convertToReleaseVersion","tag","increment","targetBranchVersion","newVersion","incrementPrereleaseVersion","baseVersion","findDevelopmentBranch","branchConfig","Object","entries","developmentBranch","checkIfTagExists","tagName","trim","confirmVersionInteractively","proposedVersion","targetVersionInput","getUserChoice","getUserTextInput","requireTTY","choices","key","label","choice","customVersion","validateVersionString","cleanCustomVersion","startsWith","slice","getOutputPath","outputDirectory","filename","path","join","getTimestampedFilename","baseName","extension","now","Date","yy","getFullYear","toString","mm","getMonth","padStart","dd","getDate","hh","getHours","min","getMinutes","timestamp","getTimestampedRequestFilename","getTimestampedResponseFilename","getTimestampedCommitFilename","getTimestampedReleaseNotesFilename","getTimestampedAudioFilename","getTimestampedReviewFilename","getTimestampedReviewNotesFilename","getTimestampedArchivedAudioFilename","originalExtension","getTimestampedArchivedTranscriptFilename","archiveAudio","originalAudioPath","transcriptionText","storage","createStorage","ensureDirectory","extname","archivedAudioFilename","archivedTranscriptFilename","archivedAudioPath","archivedTranscriptPath","isFileReadable","audioBuffer","fs","promises","readFile","writeFile","warn","transcriptContent","toISOString","audioPath","transcriptPath","error","message","getNpmPublishedVersion","packageName","verbose","replace","getTagInfo","tagList","exists","commit","versionMatch","match","undefined","isDevelopmentVersion","includes","getExpectedVersionPattern","devBranchPatterns","test","pattern","description","isDevelopment","releaseBranchPatterns","validateVersionForBranch","expected","valid","issue","fix","isDevVersion"],"mappings":"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"}
1
+ {"version":3,"file":"general.js","sources":["../../src/util/general.ts"],"sourcesContent":["import path from 'path';\nimport { deepMerge, stringifyJSON, incrementPatchVersion, incrementMinorVersion, incrementMajorVersion, validateVersionString, calculateTargetVersion, incrementPrereleaseVersion, convertToReleaseVersion } from '@eldrforge/shared';\nimport { getLogger } from '../logging';\n\n/**\n * Get version from a specific branch's package.json\n */\nexport const getVersionFromBranch = async (branchName: string): Promise<string | null> => {\n const { runSecure, validateGitRef, safeJsonParse, validatePackageJson } = await import('@eldrforge/git-tools');\n\n try {\n // Validate branch name to prevent injection\n if (!validateGitRef(branchName)) {\n throw new Error(`Invalid branch name: ${branchName}`);\n }\n // Cast to any to avoid type mismatch with node_modules version\n const { stdout } = await (runSecure as any)('git', ['show', `${branchName}:package.json`], { suppressErrorLogging: true });\n const packageJson = safeJsonParse(stdout, 'package.json');\n const validated = validatePackageJson(packageJson, 'package.json');\n return validated.version;\n } catch {\n // Return null if we can't get the version (branch may not exist or no package.json)\n return null;\n }\n};\n\n/**\n * Calculate target version based on branch configuration\n * SEMANTICS: The version config specifies what version should be ON the target branch\n */\nexport const calculateBranchDependentVersion = async (\n currentVersion: string,\n currentBranch: string,\n branchesConfig: any,\n targetBranch?: string\n): Promise<{ version: string; targetBranch: string }> => {\n const { getLogger } = await import('../logging');\n const logger = getLogger();\n\n // Look up the source branch to find the target branch\n if (!branchesConfig || !branchesConfig[currentBranch]) {\n // Use default configuration from constants\n const { KODRDRIV_DEFAULTS } = await import('../constants');\n const defaultConfig = KODRDRIV_DEFAULTS.branches as any;\n\n if (defaultConfig && defaultConfig[currentBranch]) {\n const sourceConfig = defaultConfig[currentBranch];\n const finalTargetBranch = sourceConfig.targetBranch || targetBranch || 'main';\n\n // Look at target branch's version config to determine what version it should have\n const targetConfig = defaultConfig[finalTargetBranch];\n\n logger.info(`VERSION_BRANCH_DEFAULT: Using default branch configuration | Source Branch: ${currentBranch} | Target Branch: ${finalTargetBranch} | Source: default config`);\n\n if (!targetConfig?.version) {\n const defaultVersion = incrementPatchVersion(currentVersion);\n logger.debug(`No version config for target branch '${finalTargetBranch}', using default increment`);\n return { version: defaultVersion, targetBranch: finalTargetBranch };\n }\n\n return calculateVersionFromTargetConfig(currentVersion, finalTargetBranch, targetConfig.version, logger);\n }\n\n // No config at all, use traditional defaults\n const defaultTargetBranch = targetBranch || 'main';\n const defaultVersion = incrementPatchVersion(currentVersion);\n logger.debug(`No branch-specific config found for '${currentBranch}', using defaults`);\n return { version: defaultVersion, targetBranch: defaultTargetBranch };\n }\n\n const sourceConfig = branchesConfig[currentBranch];\n const finalTargetBranch = sourceConfig.targetBranch || targetBranch || 'main';\n\n // Look at target branch's version config to determine what version it should have\n const targetConfig = branchesConfig[finalTargetBranch];\n\n logger.info(`VERSION_BRANCH_DEPENDENT: Using branch-dependent targeting | Source Branch: ${currentBranch} | Target Branch: ${finalTargetBranch} | Source: branch config`);\n\n if (!targetConfig?.version) {\n // No version config for target, use default increment\n const defaultVersion = incrementPatchVersion(currentVersion);\n logger.debug(`No version config for target branch '${finalTargetBranch}', using default increment`);\n return { version: defaultVersion, targetBranch: finalTargetBranch };\n }\n\n return calculateVersionFromTargetConfig(currentVersion, finalTargetBranch, targetConfig.version, logger);\n};\n\n/**\n * Calculate version based on target branch configuration\n */\nconst calculateVersionFromTargetConfig = async (\n currentVersion: string,\n targetBranch: string,\n versionConfig: any,\n logger: any\n): Promise<{ version: string; targetBranch: string }> => {\n if (versionConfig.type === 'release') {\n // Convert to release version (remove prerelease tags)\n const releaseVersion = convertToReleaseVersion(currentVersion);\n logger.info(`VERSION_RELEASE_CONVERSION: Converting prerelease to release version | Current: ${currentVersion} | Release: ${releaseVersion} | Action: Remove prerelease tag`);\n return { version: releaseVersion, targetBranch };\n } else if (versionConfig.type === 'prerelease') {\n if (!versionConfig.tag) {\n throw new Error(`Prerelease version type requires a tag in branch configuration`);\n }\n\n const tag = versionConfig.tag;\n\n if (versionConfig.increment) {\n // Check if there's already a version with this tag in the target branch\n const targetBranchVersion = await getVersionFromBranch(targetBranch);\n\n if (targetBranchVersion) {\n // Use the target branch version as the base and increment\n const newVersion = incrementPrereleaseVersion(targetBranchVersion, tag);\n logger.info(`VERSION_PRERELEASE_INCREMENT: Incrementing prerelease version | Current: ${targetBranchVersion} | New: ${newVersion} | Action: Increment prerelease number`);\n return { version: newVersion, targetBranch };\n } else {\n // No version in target branch, use current version as base\n const newVersion = incrementPrereleaseVersion(currentVersion, tag);\n logger.info(`VERSION_PRERELEASE_CREATE: Creating new prerelease version | Current: ${currentVersion} | New: ${newVersion} | Action: Add prerelease tag`);\n return { version: newVersion, targetBranch };\n }\n } else {\n // Just add/change the prerelease tag without incrementing\n const baseVersion = convertToReleaseVersion(currentVersion);\n const newVersion = `${baseVersion}-${tag}.0`;\n logger.info(`VERSION_PRERELEASE_TAG: Setting prerelease tag | Current: ${currentVersion} | New: ${newVersion} | Tag: ${versionConfig.tag}`);\n return { version: newVersion, targetBranch };\n }\n }\n\n throw new Error(`Invalid version type: ${versionConfig.type}`);\n};\n\n\n/**\n * Find the development branch from branches configuration\n * Returns the branch marked with developmentBranch: true\n */\nexport const findDevelopmentBranch = (branchesConfig: any): string | null => {\n if (!branchesConfig || typeof branchesConfig !== 'object') {\n return null;\n }\n\n for (const [branchName, branchConfig] of Object.entries(branchesConfig)) {\n if (branchConfig && typeof branchConfig === 'object' && (branchConfig as any).developmentBranch === true) {\n return branchName;\n }\n }\n\n return null;\n};\n\n/**\n * Check if two prerelease versions have the same tag\n * Examples:\n * - haveSamePrereleaseTag(\"1.2.3-dev.0\", \"1.2.3-dev.5\") => true\n * - haveSamePrereleaseTag(\"1.2.3-dev.0\", \"1.2.3-test.0\") => false\n * - haveSamePrereleaseTag(\"1.2.3\", \"1.2.3-dev.0\") => false\n */\nexport const haveSamePrereleaseTag = (version1: string, version2: string): boolean => {\n const extractTag = (version: string): string | null => {\n const cleanVersion = version.startsWith('v') ? version.slice(1) : version;\n const parts = cleanVersion.split('.');\n if (parts.length < 3) return null;\n\n const patchAndPrerelease = parts.slice(2).join('.');\n const patchComponents = patchAndPrerelease.split('-');\n\n if (patchComponents.length > 1) {\n const prereleaseString = patchComponents.slice(1).join('-');\n const prereleaseComponents = prereleaseString.split('.');\n return prereleaseComponents[0] || null;\n }\n\n return null;\n };\n\n const tag1 = extractTag(version1);\n const tag2 = extractTag(version2);\n\n return tag1 !== null && tag2 !== null && tag1 === tag2;\n};\n\nexport const checkIfTagExists = async (tagName: string): Promise<boolean> => {\n const { runSecure, validateGitRef } = await import('@eldrforge/git-tools');\n try {\n // Validate tag name to prevent injection\n if (!validateGitRef(tagName)) {\n throw new Error(`Invalid tag name: ${tagName}`);\n }\n const { stdout } = await runSecure('git', ['tag', '-l', tagName]);\n return stdout.trim() === tagName;\n } catch {\n // If git command fails, assume tag doesn't exist\n return false;\n }\n};\n\nexport const confirmVersionInteractively = async (currentVersion: string, proposedVersion: string, targetVersionInput?: string): Promise<string> => {\n const { getUserChoice, getUserTextInput, requireTTY } = await import('./interactive');\n const { getLogger } = await import('../logging');\n\n requireTTY('Interactive version confirmation requires a terminal.');\n\n const logger = getLogger();\n logger.info(`\\nVERSION_CONFIRMATION: Version confirmation required | Current: ${currentVersion} | Proposed: ${proposedVersion}`);\n logger.info(`VERSION_CURRENT: Current package version | Version: ${currentVersion}`);\n logger.info(`VERSION_PROPOSED: Proposed new version | Version: ${proposedVersion}`);\n if (targetVersionInput) {\n logger.info(`VERSION_TARGET_INPUT: Target version provided | Input: ${targetVersionInput}`);\n }\n\n const choices = [\n { key: 'c', label: `Confirm ${proposedVersion}` },\n { key: 'e', label: 'Enter custom version' },\n { key: 'a', label: 'Abort publish' }\n ];\n\n const choice = await getUserChoice('\\n🤔 Confirm the version for this release:', choices);\n\n switch (choice) {\n case 'c':\n return proposedVersion;\n case 'e': {\n const customVersion = await getUserTextInput('\\n📝 Enter the version number (e.g., \"4.30.0\"):');\n if (!validateVersionString(customVersion)) {\n throw new Error(`Invalid version format: ${customVersion}. Expected format: \"x.y.z\"`);\n }\n const cleanCustomVersion = customVersion.startsWith('v') ? customVersion.slice(1) : customVersion;\n logger.info(`VERSION_CUSTOM_SELECTED: Using custom version from user input | Version: ${cleanCustomVersion} | Source: interactive input`);\n return cleanCustomVersion;\n }\n case 'a':\n throw new Error('Release aborted by user');\n default:\n throw new Error(`Unexpected choice: ${choice}`);\n }\n};\n\nexport const getOutputPath = (outputDirectory: string, filename: string): string => {\n return path.join(outputDirectory, filename);\n};\n\nexport const getTimestampedFilename = (baseName: string, extension: string = '.json'): string => {\n const now = new Date();\n\n // Format as YYMMdd-HHmm (e.g., 250701-1030)\n const yy = now.getFullYear().toString().slice(-2);\n const mm = (now.getMonth() + 1).toString().padStart(2, '0');\n const dd = now.getDate().toString().padStart(2, '0');\n const hh = now.getHours().toString().padStart(2, '0');\n const min = now.getMinutes().toString().padStart(2, '0');\n\n const timestamp = `${yy}${mm}${dd}-${hh}${min}`;\n\n return `${timestamp}-${baseName}${extension}`;\n};\n\nexport const getTimestampedRequestFilename = (baseName: string): string => {\n return getTimestampedFilename(baseName, '.request.json');\n};\n\nexport const getTimestampedResponseFilename = (baseName: string): string => {\n return getTimestampedFilename(baseName, '.response.json');\n};\n\nexport const getTimestampedCommitFilename = (): string => {\n return getTimestampedFilename('commit-message', '.md');\n};\n\nexport const getTimestampedReleaseNotesFilename = (): string => {\n return getTimestampedFilename('release-notes', '.md');\n};\n\nexport const getTimestampedAudioFilename = (): string => {\n return getTimestampedFilename('audio-recording', '.wav');\n};\n\nexport const getTimestampedTranscriptFilename = (): string => {\n return getTimestampedFilename('audio-transcript', '.md');\n};\n\nexport const getTimestampedReviewFilename = (): string => {\n return getTimestampedFilename('review-analysis', '.md');\n};\n\nexport const getTimestampedReviewNotesFilename = (): string => {\n return getTimestampedFilename('review-notes', '.md');\n};\n\nexport const getTimestampedArchivedAudioFilename = (originalExtension: string = '.wav'): string => {\n return getTimestampedFilename('review-audio', originalExtension);\n};\n\nexport const getTimestampedArchivedTranscriptFilename = (): string => {\n return getTimestampedFilename('review-transcript', '.md');\n};\n\n// archiveAudio function moved to @eldrforge/audio-tools\n\n/**\n * Query npm registry for published version of a package\n * Returns null if package is not published or on error\n */\nexport const getNpmPublishedVersion = async (packageName: string): Promise<string | null> => {\n const logger = getLogger();\n try {\n const { runSecure } = await import('@eldrforge/git-tools');\n\n // Use npm view to get the latest published version\n // --json flag ensures parseable output\n const { stdout } = await runSecure('npm', ['view', packageName, 'version', '--json']);\n\n if (!stdout || stdout.trim() === '') {\n logger.verbose(`Package ${packageName} not found on npm registry`);\n return null;\n }\n\n // npm view returns just the version string for a single version\n const version = stdout.trim().replace(/^[\"']|[\"']$/g, ''); // Remove quotes if present\n logger.verbose(`Found ${packageName}@${version} on npm registry`);\n return version;\n } catch (error: any) {\n // Package not found or network error\n logger.verbose(`Could not query npm for ${packageName}: ${error.message}`);\n return null;\n }\n};\n\n/**\n * Check if a package version already exists on npm registry\n */\nexport const isVersionPublishedOnNpm = async (packageName: string, version: string): Promise<boolean> => {\n const logger = getLogger();\n try {\n const { runSecure } = await import('@eldrforge/git-tools');\n\n // Use npm view to check for specific version\n const { stdout } = await runSecure('npm', ['view', `${packageName}@${version}`, 'version', '--json']);\n\n if (!stdout || stdout.trim() === '') {\n logger.verbose(`Version ${packageName}@${version} not found on npm registry`);\n return false;\n }\n\n logger.verbose(`Version ${packageName}@${version} exists on npm registry`);\n return true;\n } catch (error: any) {\n // Version not found\n logger.verbose(`Version ${packageName}@${version} not published: ${error.message}`);\n return false;\n }\n};\n\n/**\n * Get detailed info about a tag including the version it points to\n */\nexport const getTagInfo = async (tagName: string): Promise<{ exists: boolean; commit?: string; version?: string } | null> => {\n try {\n const { runSecure, validateGitRef } = await import('@eldrforge/git-tools');\n\n if (!validateGitRef(tagName)) {\n throw new Error(`Invalid tag name: ${tagName}`);\n }\n\n // Check if tag exists\n const { stdout: tagList } = await runSecure('git', ['tag', '-l', tagName]);\n if (tagList.trim() !== tagName) {\n return { exists: false };\n }\n\n // Get the commit the tag points to\n const { stdout: commit } = await runSecure('git', ['rev-list', '-n', '1', tagName]);\n\n // Extract version from tag name (assumes format like v1.2.3 or working/v1.2.3)\n const versionMatch = tagName.match(/v?(\\d+\\.\\d+\\.\\d+(?:-[a-zA-Z0-9.-]+)?)/);\n const version = versionMatch ? versionMatch[1] : undefined;\n\n return {\n exists: true,\n commit: commit.trim(),\n version\n };\n } catch {\n return null;\n }\n};\n\n/**\n * Check if a version is a development/prerelease version (has prerelease tag)\n */\nexport const isDevelopmentVersion = (version: string): boolean => {\n // Development versions have prerelease tags: 1.2.3-dev.0, 1.2.3-alpha.1, etc.\n return version.includes('-');\n};\n\n/**\n * Check if a version is a release version (no prerelease tag)\n */\nexport const isReleaseVersion = (version: string): boolean => {\n // Release versions are X.Y.Z without any suffix\n return /^\\d+\\.\\d+\\.\\d+$/.test(version);\n};\n\n/**\n * Get expected version pattern for a branch\n */\nexport const getExpectedVersionPattern = (branchName: string): { pattern: RegExp; description: string; isDevelopment: boolean } => {\n // Development/working branches should have prerelease versions\n const devBranchPatterns = /^(working|development|dev|feature\\/|wip\\/)/i;\n\n if (devBranchPatterns.test(branchName)) {\n return {\n pattern: /^\\d+\\.\\d+\\.\\d+-[a-zA-Z0-9.-]+$/,\n description: 'X.Y.Z-<tag> (e.g., 1.2.3-dev.0)',\n isDevelopment: true\n };\n }\n\n // Main/master/production branches should have release versions\n const releaseBranchPatterns = /^(main|master|production|release\\/)/i;\n\n if (releaseBranchPatterns.test(branchName)) {\n return {\n pattern: /^\\d+\\.\\d+\\.\\d+$/,\n description: 'X.Y.Z (e.g., 1.2.3)',\n isDevelopment: false\n };\n }\n\n // For other branches, allow both but prefer release versions\n return {\n pattern: /^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?$/,\n description: 'X.Y.Z or X.Y.Z-<tag>',\n isDevelopment: false\n };\n};\n\n/**\n * Validate version against branch expectations\n */\nexport const validateVersionForBranch = (version: string, branchName: string): {\n valid: boolean;\n issue?: string;\n fix?: string;\n} => {\n const expected = getExpectedVersionPattern(branchName);\n\n if (!expected.pattern.test(version)) {\n return {\n valid: false,\n issue: `Invalid version format for branch '${branchName}'`,\n fix: `Version should match ${expected.description}`\n };\n }\n\n const isDevVersion = isDevelopmentVersion(version);\n\n // Development branches should have development versions\n if (expected.isDevelopment && !isDevVersion) {\n return {\n valid: false,\n issue: `Release version on development branch '${branchName}'`,\n fix: 'Run kodrdriv development to update to development version'\n };\n }\n\n // Release branches should NOT have development versions\n if (!expected.isDevelopment && branchName.match(/^(main|master|production|release\\/)/) && isDevVersion) {\n return {\n valid: false,\n issue: `Development version on release branch '${branchName}'`,\n fix: 'Do not commit development versions to release branches'\n };\n }\n\n return { valid: true };\n};\n\n// Re-export shared utilities for backwards compatibility\nexport { deepMerge, stringifyJSON, incrementPatchVersion, incrementMinorVersion, incrementMajorVersion, validateVersionString, calculateTargetVersion, incrementPrereleaseVersion, convertToReleaseVersion };\n"],"names":["getVersionFromBranch","branchName","runSecure","validateGitRef","safeJsonParse","validatePackageJson","Error","stdout","suppressErrorLogging","packageJson","validated","version","calculateBranchDependentVersion","currentVersion","currentBranch","branchesConfig","targetBranch","getLogger","logger","KODRDRIV_DEFAULTS","defaultConfig","branches","sourceConfig","finalTargetBranch","targetConfig","info","defaultVersion","incrementPatchVersion","debug","calculateVersionFromTargetConfig","defaultTargetBranch","versionConfig","type","releaseVersion","convertToReleaseVersion","tag","increment","targetBranchVersion","newVersion","incrementPrereleaseVersion","baseVersion","findDevelopmentBranch","branchConfig","Object","entries","developmentBranch","checkIfTagExists","tagName","trim","confirmVersionInteractively","proposedVersion","targetVersionInput","getUserChoice","getUserTextInput","requireTTY","choices","key","label","choice","customVersion","validateVersionString","cleanCustomVersion","startsWith","slice","getOutputPath","outputDirectory","filename","path","join","getTimestampedFilename","baseName","extension","now","Date","yy","getFullYear","toString","mm","getMonth","padStart","dd","getDate","hh","getHours","min","getMinutes","timestamp","getTimestampedRequestFilename","getTimestampedResponseFilename","getTimestampedCommitFilename","getTimestampedReleaseNotesFilename","getTimestampedAudioFilename","getTimestampedReviewFilename","getTimestampedReviewNotesFilename","getNpmPublishedVersion","packageName","verbose","replace","error","message","getTagInfo","tagList","exists","commit","versionMatch","match","undefined","isDevelopmentVersion","includes","getExpectedVersionPattern","devBranchPatterns","test","pattern","description","isDevelopment","releaseBranchPatterns","validateVersionForBranch","expected","valid","issue","fix","isDevVersion"],"mappings":";;;;;AAIA;;IAGO,MAAMA,oBAAAA,GAAuB,OAAOC,UAAAA,GAAAA;AACvC,IAAA,MAAM,EAAEC,SAAS,EAAEC,cAAc,EAAEC,aAAa,EAAEC,mBAAmB,EAAE,GAAG,MAAM,OAAO,sBAAA,CAAA;IAEvF,IAAI;;QAEA,IAAI,CAACF,eAAeF,UAAAA,CAAAA,EAAa;AAC7B,YAAA,MAAM,IAAIK,KAAAA,CAAM,CAAC,qBAAqB,EAAEL,UAAAA,CAAAA,CAAY,CAAA;AACxD,QAAA;;AAEA,QAAA,MAAM,EAAEM,MAAM,EAAE,GAAG,MAAOL,UAAkB,KAAA,EAAO;AAAC,YAAA,MAAA;YAAQ,CAAA,EAAGD,UAAAA,CAAW,aAAa;SAAE,EAAE;YAAEO,oBAAAA,EAAsB;AAAK,SAAA,CAAA;QACxH,MAAMC,WAAAA,GAAcL,cAAcG,MAAAA,EAAQ,cAAA,CAAA;QAC1C,MAAMG,SAAAA,GAAYL,oBAAoBI,WAAAA,EAAa,cAAA,CAAA;AACnD,QAAA,OAAOC,UAAUC,OAAO;AAC5B,IAAA,CAAA,CAAE,OAAM;;QAEJ,OAAO,IAAA;AACX,IAAA;AACJ;AAEA;;;AAGC,IACM,MAAMC,+BAAAA,GAAkC,OAC3CC,cAAAA,EACAC,eACAC,cAAAA,EACAC,YAAAA,GAAAA;AAEA,IAAA,MAAM,EAAEC,SAAS,EAAE,GAAG,MAAM,OAAO,eAAA,CAAA;AACnC,IAAA,MAAMC,MAAAA,GAASD,SAAAA,EAAAA;;AAGf,IAAA,IAAI,CAACF,cAAAA,IAAkB,CAACA,cAAc,CAACD,cAAc,EAAE;;AAEnD,QAAA,MAAM,EAAEK,iBAAiB,EAAE,GAAG,MAAM,OAAO,iBAAA,CAAA;QAC3C,MAAMC,aAAAA,GAAgBD,kBAAkBE,QAAQ;AAEhD,QAAA,IAAID,aAAAA,IAAiBA,aAAa,CAACN,aAAAA,CAAc,EAAE;YAC/C,MAAMQ,YAAAA,GAAeF,aAAa,CAACN,aAAAA,CAAc;AACjD,YAAA,MAAMS,iBAAAA,GAAoBD,YAAAA,CAAaN,YAAY,IAAIA,YAAAA,IAAgB,MAAA;;YAGvE,MAAMQ,YAAAA,GAAeJ,aAAa,CAACG,iBAAAA,CAAkB;YAErDL,MAAAA,CAAOO,IAAI,CAAC,CAAC,4EAA4E,EAAEX,cAAc,kBAAkB,EAAES,iBAAAA,CAAkB,yBAAyB,CAAC,CAAA;AAEzK,YAAA,IAAI,EAACC,YAAAA,KAAAA,IAAAA,IAAAA,YAAAA,KAAAA,MAAAA,GAAAA,MAAAA,GAAAA,YAAAA,CAAcb,OAAO,CAAA,EAAE;AACxB,gBAAA,MAAMe,iBAAiBC,qBAAAA,CAAsBd,cAAAA,CAAAA;AAC7CK,gBAAAA,MAAAA,CAAOU,KAAK,CAAC,CAAC,qCAAqC,EAAEL,iBAAAA,CAAkB,0BAA0B,CAAC,CAAA;gBAClG,OAAO;oBAAEZ,OAAAA,EAASe,cAAAA;oBAAgBV,YAAAA,EAAcO;AAAkB,iBAAA;AACtE,YAAA;AAEA,YAAA,OAAOM,gCAAAA,CAAiChB,cAAAA,EAAgBU,iBAAAA,EAAmBC,YAAAA,CAAab,OAAO,EAAEO,MAAAA,CAAAA;AACrG,QAAA;;AAGA,QAAA,MAAMY,sBAAsBd,YAAAA,IAAgB,MAAA;AAC5C,QAAA,MAAMU,iBAAiBC,qBAAAA,CAAsBd,cAAAA,CAAAA;AAC7CK,QAAAA,MAAAA,CAAOU,KAAK,CAAC,CAAC,qCAAqC,EAAEd,aAAAA,CAAc,iBAAiB,CAAC,CAAA;QACrF,OAAO;YAAEH,OAAAA,EAASe,cAAAA;YAAgBV,YAAAA,EAAcc;AAAoB,SAAA;AACxE,IAAA;IAEA,MAAMR,YAAAA,GAAeP,cAAc,CAACD,aAAAA,CAAc;AAClD,IAAA,MAAMS,iBAAAA,GAAoBD,YAAAA,CAAaN,YAAY,IAAIA,YAAAA,IAAgB,MAAA;;IAGvE,MAAMQ,YAAAA,GAAeT,cAAc,CAACQ,iBAAAA,CAAkB;IAEtDL,MAAAA,CAAOO,IAAI,CAAC,CAAC,4EAA4E,EAAEX,cAAc,kBAAkB,EAAES,iBAAAA,CAAkB,wBAAwB,CAAC,CAAA;AAExK,IAAA,IAAI,EAACC,YAAAA,KAAAA,IAAAA,IAAAA,YAAAA,KAAAA,MAAAA,GAAAA,MAAAA,GAAAA,YAAAA,CAAcb,OAAO,CAAA,EAAE;;AAExB,QAAA,MAAMe,iBAAiBC,qBAAAA,CAAsBd,cAAAA,CAAAA;AAC7CK,QAAAA,MAAAA,CAAOU,KAAK,CAAC,CAAC,qCAAqC,EAAEL,iBAAAA,CAAkB,0BAA0B,CAAC,CAAA;QAClG,OAAO;YAAEZ,OAAAA,EAASe,cAAAA;YAAgBV,YAAAA,EAAcO;AAAkB,SAAA;AACtE,IAAA;AAEA,IAAA,OAAOM,gCAAAA,CAAiChB,cAAAA,EAAgBU,iBAAAA,EAAmBC,YAAAA,CAAab,OAAO,EAAEO,MAAAA,CAAAA;AACrG;AAEA;;AAEC,IACD,MAAMW,gCAAAA,GAAmC,OACrChB,cAAAA,EACAG,cACAe,aAAAA,EACAb,MAAAA,GAAAA;IAEA,IAAIa,aAAAA,CAAcC,IAAI,KAAK,SAAA,EAAW;;AAElC,QAAA,MAAMC,iBAAiBC,uBAAAA,CAAwBrB,cAAAA,CAAAA;QAC/CK,MAAAA,CAAOO,IAAI,CAAC,CAAC,gFAAgF,EAAEZ,eAAe,YAAY,EAAEoB,cAAAA,CAAe,gCAAgC,CAAC,CAAA;QAC5K,OAAO;YAAEtB,OAAAA,EAASsB,cAAAA;AAAgBjB,YAAAA;AAAa,SAAA;AACnD,IAAA,CAAA,MAAO,IAAIe,aAAAA,CAAcC,IAAI,KAAK,YAAA,EAAc;QAC5C,IAAI,CAACD,aAAAA,CAAcI,GAAG,EAAE;AACpB,YAAA,MAAM,IAAI7B,KAAAA,CAAM,CAAC,8DAA8D,CAAC,CAAA;AACpF,QAAA;QAEA,MAAM6B,GAAAA,GAAMJ,cAAcI,GAAG;QAE7B,IAAIJ,aAAAA,CAAcK,SAAS,EAAE;;YAEzB,MAAMC,mBAAAA,GAAsB,MAAMrC,oBAAAA,CAAqBgB,YAAAA,CAAAA;AAEvD,YAAA,IAAIqB,mBAAAA,EAAqB;;gBAErB,MAAMC,UAAAA,GAAaC,2BAA2BF,mBAAAA,EAAqBF,GAAAA,CAAAA;gBACnEjB,MAAAA,CAAOO,IAAI,CAAC,CAAC,yEAAyE,EAAEY,oBAAoB,QAAQ,EAAEC,UAAAA,CAAW,sCAAsC,CAAC,CAAA;gBACxK,OAAO;oBAAE3B,OAAAA,EAAS2B,UAAAA;AAAYtB,oBAAAA;AAAa,iBAAA;YAC/C,CAAA,MAAO;;gBAEH,MAAMsB,UAAAA,GAAaC,2BAA2B1B,cAAAA,EAAgBsB,GAAAA,CAAAA;gBAC9DjB,MAAAA,CAAOO,IAAI,CAAC,CAAC,sEAAsE,EAAEZ,eAAe,QAAQ,EAAEyB,UAAAA,CAAW,6BAA6B,CAAC,CAAA;gBACvJ,OAAO;oBAAE3B,OAAAA,EAAS2B,UAAAA;AAAYtB,oBAAAA;AAAa,iBAAA;AAC/C,YAAA;QACJ,CAAA,MAAO;;AAEH,YAAA,MAAMwB,cAAcN,uBAAAA,CAAwBrB,cAAAA,CAAAA;AAC5C,YAAA,MAAMyB,aAAa,CAAA,EAAGE,WAAAA,CAAY,CAAC,EAAEL,GAAAA,CAAI,EAAE,CAAC;AAC5CjB,YAAAA,MAAAA,CAAOO,IAAI,CAAC,CAAC,0DAA0D,EAAEZ,cAAAA,CAAe,QAAQ,EAAEyB,UAAAA,CAAW,QAAQ,EAAEP,aAAAA,CAAcI,GAAG,CAAA,CAAE,CAAA;YAC1I,OAAO;gBAAExB,OAAAA,EAAS2B,UAAAA;AAAYtB,gBAAAA;AAAa,aAAA;AAC/C,QAAA;AACJ,IAAA;AAEA,IAAA,MAAM,IAAIV,KAAAA,CAAM,CAAC,sBAAsB,EAAEyB,aAAAA,CAAcC,IAAI,CAAA,CAAE,CAAA;AACjE,CAAA;AAGA;;;IAIO,MAAMS,qBAAAA,GAAwB,CAAC1B,cAAAA,GAAAA;AAClC,IAAA,IAAI,CAACA,cAAAA,IAAkB,OAAOA,cAAAA,KAAmB,QAAA,EAAU;QACvD,OAAO,IAAA;AACX,IAAA;IAEA,KAAK,MAAM,CAACd,UAAAA,EAAYyC,YAAAA,CAAa,IAAIC,MAAAA,CAAOC,OAAO,CAAC7B,cAAAA,CAAAA,CAAiB;QACrE,IAAI2B,YAAAA,IAAgB,OAAOA,YAAAA,KAAiB,QAAA,IAAY,YAACA,CAAqBG,iBAAiB,KAAK,IAAA,EAAM;YACtG,OAAO5C,UAAAA;AACX,QAAA;AACJ,IAAA;IAEA,OAAO,IAAA;AACX;AAiCO,MAAM6C,mBAAmB,OAAOC,OAAAA,GAAAA;IACnC,MAAM,EAAE7C,SAAS,EAAEC,cAAc,EAAE,GAAG,MAAM,OAAO,sBAAA,CAAA;IACnD,IAAI;;QAEA,IAAI,CAACA,eAAe4C,OAAAA,CAAAA,EAAU;AAC1B,YAAA,MAAM,IAAIzC,KAAAA,CAAM,CAAC,kBAAkB,EAAEyC,OAAAA,CAAAA,CAAS,CAAA;AAClD,QAAA;AACA,QAAA,MAAM,EAAExC,MAAM,EAAE,GAAG,MAAML,UAAU,KAAA,EAAO;AAAC,YAAA,KAAA;AAAO,YAAA,IAAA;AAAM6C,YAAAA;AAAQ,SAAA,CAAA;QAChE,OAAOxC,MAAAA,CAAOyC,IAAI,EAAA,KAAOD,OAAAA;AAC7B,IAAA,CAAA,CAAE,OAAM;;QAEJ,OAAO,KAAA;AACX,IAAA;AACJ;AAEO,MAAME,2BAAAA,GAA8B,OAAOpC,cAAAA,EAAwBqC,eAAAA,EAAyBC,kBAAAA,GAAAA;IAC/F,MAAM,EAAEC,aAAa,EAAEC,gBAAgB,EAAEC,UAAU,EAAE,GAAG,MAAM,OAAO,kBAAA,CAAA;AACrE,IAAA,MAAM,EAAErC,SAAS,EAAE,GAAG,MAAM,OAAO,eAAA,CAAA;IAEnCqC,UAAAA,CAAW,uDAAA,CAAA;AAEX,IAAA,MAAMpC,MAAAA,GAASD,SAAAA,EAAAA;IACfC,MAAAA,CAAOO,IAAI,CAAC,CAAC,iEAAiE,EAAEZ,cAAAA,CAAe,aAAa,EAAEqC,eAAAA,CAAAA,CAAiB,CAAA;AAC/HhC,IAAAA,MAAAA,CAAOO,IAAI,CAAC,CAAC,oDAAoD,EAAEZ,cAAAA,CAAAA,CAAgB,CAAA;AACnFK,IAAAA,MAAAA,CAAOO,IAAI,CAAC,CAAC,kDAAkD,EAAEyB,eAAAA,CAAAA,CAAiB,CAAA;AAClF,IAAA,IAAIC,kBAAAA,EAAoB;AACpBjC,QAAAA,MAAAA,CAAOO,IAAI,CAAC,CAAC,uDAAuD,EAAE0B,kBAAAA,CAAAA,CAAoB,CAAA;AAC9F,IAAA;AAEA,IAAA,MAAMI,OAAAA,GAAU;AACZ,QAAA;YAAEC,GAAAA,EAAK,GAAA;YAAKC,KAAAA,EAAO,CAAC,QAAQ,EAAEP,eAAAA,CAAAA;AAAkB,SAAA;AAChD,QAAA;YAAEM,GAAAA,EAAK,GAAA;YAAKC,KAAAA,EAAO;AAAuB,SAAA;AAC1C,QAAA;YAAED,GAAAA,EAAK,GAAA;YAAKC,KAAAA,EAAO;AAAgB;AACtC,KAAA;IAED,MAAMC,MAAAA,GAAS,MAAMN,aAAAA,CAAc,4CAAA,EAA8CG,OAAAA,CAAAA;IAEjF,OAAQG,MAAAA;QACJ,KAAK,GAAA;YACD,OAAOR,eAAAA;QACX,KAAK,GAAA;AAAK,YAAA;gBACN,MAAMS,aAAAA,GAAgB,MAAMN,gBAAAA,CAAiB,iDAAA,CAAA;gBAC7C,IAAI,CAACO,sBAAsBD,aAAAA,CAAAA,EAAgB;AACvC,oBAAA,MAAM,IAAIrD,KAAAA,CAAM,CAAC,wBAAwB,EAAEqD,aAAAA,CAAc,0BAA0B,CAAC,CAAA;AACxF,gBAAA;gBACA,MAAME,kBAAAA,GAAqBF,cAAcG,UAAU,CAAC,OAAOH,aAAAA,CAAcI,KAAK,CAAC,CAAA,CAAA,GAAKJ,aAAAA;AACpFzC,gBAAAA,MAAAA,CAAOO,IAAI,CAAC,CAAC,yEAAyE,EAAEoC,kBAAAA,CAAmB,4BAA4B,CAAC,CAAA;gBACxI,OAAOA,kBAAAA;AACX,YAAA;QACA,KAAK,GAAA;AACD,YAAA,MAAM,IAAIvD,KAAAA,CAAM,yBAAA,CAAA;AACpB,QAAA;AACI,YAAA,MAAM,IAAIA,KAAAA,CAAM,CAAC,mBAAmB,EAAEoD,MAAAA,CAAAA,CAAQ,CAAA;AACtD;AACJ;AAEO,MAAMM,aAAAA,GAAgB,CAACC,eAAAA,EAAyBC,QAAAA,GAAAA;IACnD,OAAOC,aAAAA,CAAKC,IAAI,CAACH,eAAAA,EAAiBC,QAAAA,CAAAA;AACtC;AAEO,MAAMG,sBAAAA,GAAyB,CAACC,QAAAA,EAAkBC,YAAoB,OAAO,GAAA;AAChF,IAAA,MAAMC,MAAM,IAAIC,IAAAA,EAAAA;;IAGhB,MAAMC,EAAAA,GAAKF,IAAIG,WAAW,EAAA,CAAGC,QAAQ,EAAA,CAAGb,KAAK,CAAC,EAAC,CAAA;AAC/C,IAAA,MAAMc,EAAAA,GAAML,CAAAA,GAAAA,CAAIM,QAAQ,EAAA,GAAK,CAAA,EAAGF,QAAQ,EAAA,CAAGG,QAAQ,CAAC,CAAA,EAAG,GAAA,CAAA;IACvD,MAAMC,EAAAA,GAAKR,IAAIS,OAAO,EAAA,CAAGL,QAAQ,EAAA,CAAGG,QAAQ,CAAC,CAAA,EAAG,GAAA,CAAA;IAChD,MAAMG,EAAAA,GAAKV,IAAIW,QAAQ,EAAA,CAAGP,QAAQ,EAAA,CAAGG,QAAQ,CAAC,CAAA,EAAG,GAAA,CAAA;IACjD,MAAMK,GAAAA,GAAMZ,IAAIa,UAAU,EAAA,CAAGT,QAAQ,EAAA,CAAGG,QAAQ,CAAC,CAAA,EAAG,GAAA,CAAA;IAEpD,MAAMO,SAAAA,GAAY,GAAGZ,EAAAA,CAAAA,EAAKG,EAAAA,CAAAA,EAAKG,GAAG,CAAC,EAAEE,KAAKE,GAAAA,CAAAA,CAAK;AAE/C,IAAA,OAAO,CAAA,EAAGE,SAAAA,CAAU,CAAC,EAAEhB,WAAWC,SAAAA,CAAAA,CAAW;AACjD;AAEO,MAAMgB,gCAAgC,CAACjB,QAAAA,GAAAA;AAC1C,IAAA,OAAOD,uBAAuBC,QAAAA,EAAU,eAAA,CAAA;AAC5C;AAEO,MAAMkB,iCAAiC,CAAClB,QAAAA,GAAAA;AAC3C,IAAA,OAAOD,uBAAuBC,QAAAA,EAAU,gBAAA,CAAA;AAC5C;MAEamB,4BAAAA,GAA+B,IAAA;AACxC,IAAA,OAAOpB,uBAAuB,gBAAA,EAAkB,KAAA,CAAA;AACpD;MAEaqB,kCAAAA,GAAqC,IAAA;AAC9C,IAAA,OAAOrB,uBAAuB,eAAA,EAAiB,KAAA,CAAA;AACnD;MAEasB,2BAAAA,GAA8B,IAAA;AACvC,IAAA,OAAOtB,uBAAuB,iBAAA,EAAmB,MAAA,CAAA;AACrD;MAMauB,4BAAAA,GAA+B,IAAA;AACxC,IAAA,OAAOvB,uBAAuB,iBAAA,EAAmB,KAAA,CAAA;AACrD;MAEawB,iCAAAA,GAAoC,IAAA;AAC7C,IAAA,OAAOxB,uBAAuB,cAAA,EAAgB,KAAA,CAAA;AAClD;AAUA;AAEA;;;IAIO,MAAMyB,sBAAAA,GAAyB,OAAOC,WAAAA,GAAAA;AACzC,IAAA,MAAM7E,MAAAA,GAASD,SAAAA,EAAAA;IACf,IAAI;AACA,QAAA,MAAM,EAAEf,SAAS,EAAE,GAAG,MAAM,OAAO,sBAAA,CAAA;;;AAInC,QAAA,MAAM,EAAEK,MAAM,EAAE,GAAG,MAAML,UAAU,KAAA,EAAO;AAAC,YAAA,MAAA;AAAQ6F,YAAAA,WAAAA;AAAa,YAAA,SAAA;AAAW,YAAA;AAAS,SAAA,CAAA;AAEpF,QAAA,IAAI,CAACxF,MAAAA,IAAUA,MAAAA,CAAOyC,IAAI,OAAO,EAAA,EAAI;AACjC9B,YAAAA,MAAAA,CAAO8E,OAAO,CAAC,CAAC,QAAQ,EAAED,WAAAA,CAAY,0BAA0B,CAAC,CAAA;YACjE,OAAO,IAAA;AACX,QAAA;;QAGA,MAAMpF,OAAAA,GAAUJ,OAAOyC,IAAI,EAAA,CAAGiD,OAAO,CAAC,cAAA,EAAgB;QACtD/E,MAAAA,CAAO8E,OAAO,CAAC,CAAC,MAAM,EAAED,YAAY,CAAC,EAAEpF,OAAAA,CAAQ,gBAAgB,CAAC,CAAA;QAChE,OAAOA,OAAAA;AACX,IAAA,CAAA,CAAE,OAAOuF,KAAAA,EAAY;;QAEjBhF,MAAAA,CAAO8E,OAAO,CAAC,CAAC,wBAAwB,EAAED,YAAY,EAAE,EAAEG,KAAAA,CAAMC,OAAO,CAAA,CAAE,CAAA;QACzE,OAAO,IAAA;AACX,IAAA;AACJ;AA2BA;;IAGO,MAAMC,UAAAA,GAAa,OAAOrD,OAAAA,GAAAA;IAC7B,IAAI;QACA,MAAM,EAAE7C,SAAS,EAAEC,cAAc,EAAE,GAAG,MAAM,OAAO,sBAAA,CAAA;QAEnD,IAAI,CAACA,eAAe4C,OAAAA,CAAAA,EAAU;AAC1B,YAAA,MAAM,IAAIzC,KAAAA,CAAM,CAAC,kBAAkB,EAAEyC,OAAAA,CAAAA,CAAS,CAAA;AAClD,QAAA;;AAGA,QAAA,MAAM,EAAExC,MAAAA,EAAQ8F,OAAO,EAAE,GAAG,MAAMnG,UAAU,KAAA,EAAO;AAAC,YAAA,KAAA;AAAO,YAAA,IAAA;AAAM6C,YAAAA;AAAQ,SAAA,CAAA;QACzE,IAAIsD,OAAAA,CAAQrD,IAAI,EAAA,KAAOD,OAAAA,EAAS;YAC5B,OAAO;gBAAEuD,MAAAA,EAAQ;AAAM,aAAA;AAC3B,QAAA;;AAGA,QAAA,MAAM,EAAE/F,MAAAA,EAAQgG,MAAM,EAAE,GAAG,MAAMrG,UAAU,KAAA,EAAO;AAAC,YAAA,UAAA;AAAY,YAAA,IAAA;AAAM,YAAA,GAAA;AAAK6C,YAAAA;AAAQ,SAAA,CAAA;;QAGlF,MAAMyD,YAAAA,GAAezD,OAAAA,CAAQ0D,KAAK,CAAC,uCAAA,CAAA;AACnC,QAAA,MAAM9F,OAAAA,GAAU6F,YAAAA,GAAeA,YAAY,CAAC,EAAE,GAAGE,SAAAA;QAEjD,OAAO;YACHJ,MAAAA,EAAQ,IAAA;AACRC,YAAAA,MAAAA,EAAQA,OAAOvD,IAAI,EAAA;AACnBrC,YAAAA;AACJ,SAAA;AACJ,IAAA,CAAA,CAAE,OAAM;QACJ,OAAO,IAAA;AACX,IAAA;AACJ;AAEA;;IAGO,MAAMgG,oBAAAA,GAAuB,CAAChG,OAAAA,GAAAA;;IAEjC,OAAOA,OAAAA,CAAQiG,QAAQ,CAAC,GAAA,CAAA;AAC5B;AAUA;;IAGO,MAAMC,yBAAAA,GAA4B,CAAC5G,UAAAA,GAAAA;;AAEtC,IAAA,MAAM6G,iBAAAA,GAAoB,6CAAA;IAE1B,IAAIA,iBAAAA,CAAkBC,IAAI,CAAC9G,UAAAA,CAAAA,EAAa;QACpC,OAAO;YACH+G,OAAAA,EAAS,gCAAA;YACTC,WAAAA,EAAa,iCAAA;YACbC,aAAAA,EAAe;AACnB,SAAA;AACJ,IAAA;;AAGA,IAAA,MAAMC,qBAAAA,GAAwB,sCAAA;IAE9B,IAAIA,qBAAAA,CAAsBJ,IAAI,CAAC9G,UAAAA,CAAAA,EAAa;QACxC,OAAO;YACH+G,OAAAA,EAAS,iBAAA;YACTC,WAAAA,EAAa,qBAAA;YACbC,aAAAA,EAAe;AACnB,SAAA;AACJ,IAAA;;IAGA,OAAO;QACHF,OAAAA,EAAS,mCAAA;QACTC,WAAAA,EAAa,sBAAA;QACbC,aAAAA,EAAe;AACnB,KAAA;AACJ;AAEA;;AAEC,IACM,MAAME,wBAAAA,GAA2B,CAACzG,OAAAA,EAAiBV,UAAAA,GAAAA;AAKtD,IAAA,MAAMoH,WAAWR,yBAAAA,CAA0B5G,UAAAA,CAAAA;AAE3C,IAAA,IAAI,CAACoH,QAAAA,CAASL,OAAO,CAACD,IAAI,CAACpG,OAAAA,CAAAA,EAAU;QACjC,OAAO;YACH2G,KAAAA,EAAO,KAAA;AACPC,YAAAA,KAAAA,EAAO,CAAC,mCAAmC,EAAEtH,UAAAA,CAAW,CAAC,CAAC;AAC1DuH,YAAAA,GAAAA,EAAK,CAAC,qBAAqB,EAAEH,QAAAA,CAASJ,WAAW,CAAA;AACrD,SAAA;AACJ,IAAA;AAEA,IAAA,MAAMQ,eAAed,oBAAAA,CAAqBhG,OAAAA,CAAAA;;AAG1C,IAAA,IAAI0G,QAAAA,CAASH,aAAa,IAAI,CAACO,YAAAA,EAAc;QACzC,OAAO;YACHH,KAAAA,EAAO,KAAA;AACPC,YAAAA,KAAAA,EAAO,CAAC,uCAAuC,EAAEtH,UAAAA,CAAW,CAAC,CAAC;YAC9DuH,GAAAA,EAAK;AACT,SAAA;AACJ,IAAA;;IAGA,IAAI,CAACH,SAASH,aAAa,IAAIjH,WAAWwG,KAAK,CAAC,0CAA0CgB,YAAAA,EAAc;QACpG,OAAO;YACHH,KAAAA,EAAO,KAAA;AACPC,YAAAA,KAAAA,EAAO,CAAC,uCAAuC,EAAEtH,UAAAA,CAAW,CAAC,CAAC;YAC9DuH,GAAAA,EAAK;AACT,SAAA;AACJ,IAAA;IAEA,OAAO;QAAEF,KAAAA,EAAO;AAAK,KAAA;AACzB;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eldrforge/kodrdriv",
3
- "version": "1.2.128",
3
+ "version": "1.2.130",
4
4
  "description": "Create Intelligent Release Notes or Change Logs from Git",
5
5
  "main": "dist/main.js",
6
6
  "type": "module",
@@ -39,9 +39,12 @@
39
39
  "license": "Apache-2.0",
40
40
  "dependencies": {
41
41
  "@eldrforge/ai-service": "^0.1.13",
42
+ "@eldrforge/audio-tools": "^0.1.7",
42
43
  "@eldrforge/git-tools": "^0.1.13",
43
44
  "@eldrforge/github-tools": "^0.1.15",
44
45
  "@eldrforge/shared": "^0.1.2",
46
+ "@eldrforge/tree-core": "^0.1.1",
47
+ "@eldrforge/tree-execution": "^0.1.1",
45
48
  "@octokit/rest": "^22.0.0",
46
49
  "@riotprompt/riotprompt": "^0.0.8",
47
50
  "@theunwalked/cardigantime": "^0.0.16",
@@ -1,192 +0,0 @@
1
- import { getLogger } from '../logging.js';
2
-
3
- function _define_property(obj, key, value) {
4
- if (key in obj) {
5
- Object.defineProperty(obj, key, {
6
- value: value,
7
- enumerable: true,
8
- configurable: true,
9
- writable: true
10
- });
11
- } else {
12
- obj[key] = value;
13
- }
14
- return obj;
15
- }
16
- /**
17
- * CommandValidator checks if commands are safe for parallel execution
18
- */ class CommandValidator {
19
- /**
20
- * Validate a command for parallel execution
21
- */ static validateForParallel(command, builtInCommand) {
22
- const issues = [];
23
- const warnings = [];
24
- const recommendations = [];
25
- // Check for inherently unsafe operations
26
- const unsafePatterns = [
27
- {
28
- pattern: /git\s+checkout/,
29
- message: 'Branch switching is not safe for parallel execution'
30
- },
31
- {
32
- pattern: /git\s+switch/,
33
- message: 'Branch switching is not safe for parallel execution'
34
- },
35
- {
36
- pattern: /git\s+rebase/,
37
- message: 'Rebase operations should not run in parallel'
38
- },
39
- {
40
- pattern: /git\s+merge/,
41
- message: 'Merge operations should not run in parallel'
42
- },
43
- {
44
- pattern: /rm\s+-rf\s+\//,
45
- message: 'Dangerous deletion commands detected'
46
- },
47
- {
48
- pattern: /sudo/,
49
- message: 'Sudo commands should not run in parallel'
50
- },
51
- {
52
- pattern: /format/,
53
- message: 'Format commands may be destructive'
54
- }
55
- ];
56
- for (const { pattern, message } of unsafePatterns){
57
- if (pattern.test(command)) {
58
- issues.push(message);
59
- }
60
- }
61
- // Check for potentially problematic operations
62
- const warningPatterns = [
63
- {
64
- pattern: /npm\s+(link|unlink)/,
65
- message: 'npm link/unlink may conflict in parallel execution'
66
- },
67
- {
68
- pattern: /npm\s+install/,
69
- message: 'npm install in parallel may cause lock file conflicts'
70
- },
71
- {
72
- pattern: /npm\s+ci/,
73
- message: 'npm ci in parallel may cause lock file conflicts'
74
- },
75
- {
76
- pattern: /package-lock\.json/,
77
- message: 'Operations modifying package-lock.json may conflict'
78
- },
79
- {
80
- pattern: /node_modules/,
81
- message: 'Operations in node_modules may conflict'
82
- }
83
- ];
84
- for (const { pattern, message } of warningPatterns){
85
- if (pattern.test(command)) {
86
- warnings.push(message);
87
- }
88
- }
89
- // Built-in command specific checks
90
- if (builtInCommand === 'commit') {
91
- warnings.push('Parallel commits: Recommend max concurrency of 2 to avoid conflicts');
92
- recommendations.push('Use: --max-concurrency 2');
93
- }
94
- if (builtInCommand === 'publish') {
95
- warnings.push('Parallel publish: PR checks may take significant time');
96
- warnings.push('Version propagation happens automatically between dependency levels');
97
- recommendations.push('Use: --max-concurrency 2-3 for publish operations');
98
- recommendations.push('Monitor with: kodrdriv tree --status-parallel');
99
- }
100
- if (builtInCommand === 'link' || builtInCommand === 'unlink') {
101
- warnings.push('Link operations may have filesystem race conditions');
102
- recommendations.push('Consider sequential execution for link/unlink');
103
- }
104
- // Check for output redirection
105
- if (command.includes('>') || command.includes('>>')) {
106
- warnings.push('Output redirection in parallel may interleave output');
107
- }
108
- return {
109
- valid: issues.length === 0,
110
- issues,
111
- warnings,
112
- recommendations
113
- };
114
- }
115
- /**
116
- * Log validation results
117
- */ static logValidation(result) {
118
- if (!result.valid) {
119
- this.logger.error('VALIDATOR_FAILED: Command validation failed for parallel execution | Error Count: ' + result.issues.length + ' | Impact: Cannot proceed safely');
120
- for (const issue of result.issues){
121
- this.logger.error(`VALIDATOR_ERROR_DETAIL: Validation issue | Issue: ${issue}`);
122
- }
123
- }
124
- if (result.warnings.length > 0) {
125
- this.logger.warn('VALIDATOR_WARNINGS: Command validation warnings for parallel execution | Warning Count: ' + result.warnings.length + ' | Impact: May cause issues');
126
- for (const warning of result.warnings){
127
- this.logger.warn(`VALIDATOR_WARNING_DETAIL: Validation warning | Warning: ${warning}`);
128
- }
129
- }
130
- if (result.recommendations.length > 0 && this.logger.verbose) {
131
- this.logger.info('VALIDATOR_RECOMMENDATIONS: Command validation recommendations | Count: ' + result.recommendations.length + ' | Purpose: Improve parallel execution');
132
- for (const rec of result.recommendations){
133
- this.logger.info(`VALIDATOR_RECOMMENDATION_DETAIL: ${rec}`);
134
- }
135
- }
136
- }
137
- /**
138
- * Get recommended concurrency for a command type
139
- */ static getRecommendedConcurrency(builtInCommand, cpuCount = 4, command) {
140
- // If command is provided, check for memory-intensive patterns
141
- if (command) {
142
- const memoryIntensivePatterns = [
143
- {
144
- pattern: /npm\s+test/,
145
- message: 'Test execution is memory intensive'
146
- },
147
- {
148
- pattern: /npm\s+run\s+test/,
149
- message: 'Test execution is memory intensive'
150
- },
151
- {
152
- pattern: /vitest/,
153
- message: 'Vitest execution is memory intensive'
154
- },
155
- {
156
- pattern: /coverage/,
157
- message: 'Coverage generation is memory intensive'
158
- },
159
- {
160
- pattern: /npm\s+run\s+precommit/,
161
- message: 'Precommit tasks (build+lint+test) are resource intensive'
162
- }
163
- ];
164
- for (const { pattern } of memoryIntensivePatterns){
165
- if (pattern.test(command)) {
166
- // Return lower concurrency for memory intensive tasks: 25% of CPUs, min 2, max 4
167
- const recommended = Math.max(2, Math.min(4, Math.floor(cpuCount * 0.25)));
168
- return Math.min(recommended, cpuCount);
169
- }
170
- }
171
- }
172
- switch(builtInCommand){
173
- case 'commit':
174
- // Lower concurrency for commit to reduce conflicts
175
- return Math.min(2, cpuCount);
176
- case 'publish':
177
- // Moderate concurrency for publish (long-running)
178
- return Math.max(2, Math.floor(cpuCount / 2));
179
- case 'link':
180
- case 'unlink':
181
- // Very conservative for link operations
182
- return 1; // Sequential recommended
183
- default:
184
- // Full concurrency for general commands
185
- return cpuCount;
186
- }
187
- }
188
- }
189
- _define_property(CommandValidator, "logger", getLogger());
190
-
191
- export { CommandValidator };
192
- //# sourceMappingURL=CommandValidator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CommandValidator.js","sources":["../../src/execution/CommandValidator.ts"],"sourcesContent":["import { getLogger } from '../logging';\n\nexport interface ValidationResult {\n valid: boolean;\n issues: string[];\n warnings: string[];\n recommendations: string[];\n}\n\n/**\n * CommandValidator checks if commands are safe for parallel execution\n */\nexport class CommandValidator {\n private static logger = getLogger();\n\n /**\n * Validate a command for parallel execution\n */\n static validateForParallel(command: string, builtInCommand?: string): ValidationResult {\n const issues: string[] = [];\n const warnings: string[] = [];\n const recommendations: string[] = [];\n\n // Check for inherently unsafe operations\n const unsafePatterns = [\n { pattern: /git\\s+checkout/, message: 'Branch switching is not safe for parallel execution' },\n { pattern: /git\\s+switch/, message: 'Branch switching is not safe for parallel execution' },\n { pattern: /git\\s+rebase/, message: 'Rebase operations should not run in parallel' },\n { pattern: /git\\s+merge/, message: 'Merge operations should not run in parallel' },\n { pattern: /rm\\s+-rf\\s+\\//, message: 'Dangerous deletion commands detected' },\n { pattern: /sudo/, message: 'Sudo commands should not run in parallel' },\n { pattern: /format/, message: 'Format commands may be destructive' }\n ];\n\n for (const { pattern, message } of unsafePatterns) {\n if (pattern.test(command)) {\n issues.push(message);\n }\n }\n\n // Check for potentially problematic operations\n const warningPatterns = [\n { pattern: /npm\\s+(link|unlink)/, message: 'npm link/unlink may conflict in parallel execution' },\n { pattern: /npm\\s+install/, message: 'npm install in parallel may cause lock file conflicts' },\n { pattern: /npm\\s+ci/, message: 'npm ci in parallel may cause lock file conflicts' },\n { pattern: /package-lock\\.json/, message: 'Operations modifying package-lock.json may conflict' },\n { pattern: /node_modules/, message: 'Operations in node_modules may conflict' }\n ];\n\n for (const { pattern, message } of warningPatterns) {\n if (pattern.test(command)) {\n warnings.push(message);\n }\n }\n\n // Built-in command specific checks\n if (builtInCommand === 'commit') {\n warnings.push('Parallel commits: Recommend max concurrency of 2 to avoid conflicts');\n recommendations.push('Use: --max-concurrency 2');\n }\n\n if (builtInCommand === 'publish') {\n warnings.push('Parallel publish: PR checks may take significant time');\n warnings.push('Version propagation happens automatically between dependency levels');\n recommendations.push('Use: --max-concurrency 2-3 for publish operations');\n recommendations.push('Monitor with: kodrdriv tree --status-parallel');\n }\n\n if (builtInCommand === 'link' || builtInCommand === 'unlink') {\n warnings.push('Link operations may have filesystem race conditions');\n recommendations.push('Consider sequential execution for link/unlink');\n }\n\n // Check for output redirection\n if (command.includes('>') || command.includes('>>')) {\n warnings.push('Output redirection in parallel may interleave output');\n }\n\n return {\n valid: issues.length === 0,\n issues,\n warnings,\n recommendations\n };\n }\n\n /**\n * Log validation results\n */\n static logValidation(result: ValidationResult): void {\n if (!result.valid) {\n this.logger.error('VALIDATOR_FAILED: Command validation failed for parallel execution | Error Count: ' + result.issues.length + ' | Impact: Cannot proceed safely');\n for (const issue of result.issues) {\n this.logger.error(`VALIDATOR_ERROR_DETAIL: Validation issue | Issue: ${issue}`);\n }\n }\n\n if (result.warnings.length > 0) {\n this.logger.warn('VALIDATOR_WARNINGS: Command validation warnings for parallel execution | Warning Count: ' + result.warnings.length + ' | Impact: May cause issues');\n for (const warning of result.warnings) {\n this.logger.warn(`VALIDATOR_WARNING_DETAIL: Validation warning | Warning: ${warning}`);\n }\n }\n\n if (result.recommendations.length > 0 && (this.logger as any).verbose) {\n this.logger.info('VALIDATOR_RECOMMENDATIONS: Command validation recommendations | Count: ' + result.recommendations.length + ' | Purpose: Improve parallel execution');\n for (const rec of result.recommendations) {\n this.logger.info(`VALIDATOR_RECOMMENDATION_DETAIL: ${rec}`);\n }\n }\n }\n\n /**\n * Get recommended concurrency for a command type\n */\n static getRecommendedConcurrency(builtInCommand?: string, cpuCount: number = 4, command?: string): number {\n // If command is provided, check for memory-intensive patterns\n if (command) {\n const memoryIntensivePatterns = [\n { pattern: /npm\\s+test/, message: 'Test execution is memory intensive' },\n { pattern: /npm\\s+run\\s+test/, message: 'Test execution is memory intensive' },\n { pattern: /vitest/, message: 'Vitest execution is memory intensive' },\n { pattern: /coverage/, message: 'Coverage generation is memory intensive' },\n { pattern: /npm\\s+run\\s+precommit/, message: 'Precommit tasks (build+lint+test) are resource intensive' }\n ];\n\n for (const { pattern } of memoryIntensivePatterns) {\n if (pattern.test(command)) {\n // Return lower concurrency for memory intensive tasks: 25% of CPUs, min 2, max 4\n const recommended = Math.max(2, Math.min(4, Math.floor(cpuCount * 0.25)));\n return Math.min(recommended, cpuCount);\n }\n }\n }\n\n switch (builtInCommand) {\n case 'commit':\n // Lower concurrency for commit to reduce conflicts\n return Math.min(2, cpuCount);\n\n case 'publish':\n // Moderate concurrency for publish (long-running)\n return Math.max(2, Math.floor(cpuCount / 2));\n\n case 'link':\n case 'unlink':\n // Very conservative for link operations\n return 1; // Sequential recommended\n\n default:\n // Full concurrency for general commands\n return cpuCount;\n }\n }\n}\n"],"names":["CommandValidator","validateForParallel","command","builtInCommand","issues","warnings","recommendations","unsafePatterns","pattern","message","test","push","warningPatterns","includes","valid","length","logValidation","result","logger","error","issue","warn","warning","verbose","info","rec","getRecommendedConcurrency","cpuCount","memoryIntensivePatterns","recommended","Math","max","min","floor","getLogger"],"mappings":"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"}
@@ -1,102 +0,0 @@
1
- function _define_property(obj, key, value) {
2
- if (key in obj) {
3
- Object.defineProperty(obj, key, {
4
- value: value,
5
- enumerable: true,
6
- configurable: true,
7
- writable: true
8
- });
9
- } else {
10
- obj[key] = value;
11
- }
12
- return obj;
13
- }
14
- /**
15
- * DependencyChecker validates package readiness and provides dependency information
16
- * for the task pool scheduler.
17
- */ class DependencyChecker {
18
- /**
19
- * Check if a package is ready to execute
20
- * A package is ready when all its dependencies are completed and none have failed
21
- */ isReady(packageName, state) {
22
- const dependencies = this.graph.edges.get(packageName) || new Set();
23
- for (const dep of dependencies){
24
- // If any dependency is not completed, not ready
25
- if (!state.completed.includes(dep)) {
26
- return false;
27
- }
28
- // If any dependency failed, should be skipped (not ready)
29
- if (state.failed.some((f)=>f.name === dep)) {
30
- return false;
31
- }
32
- }
33
- return true;
34
- }
35
- /**
36
- * Get count of packages that depend on this one
37
- * Higher count = higher priority (unlocks more packages)
38
- */ getDependentCount(packageName) {
39
- return (this.graph.reverseEdges.get(packageName) || new Set()).size;
40
- }
41
- /**
42
- * Get depth of package in dependency tree
43
- * Depth = longest path from a root package (package with no dependencies)
44
- * Lower depth = higher priority (can unlock dependent packages sooner)
45
- */ getDepth(packageName) {
46
- const visited = new Set();
47
- const calculateDepth = (pkg)=>{
48
- if (visited.has(pkg)) return 0;
49
- visited.add(pkg);
50
- const deps = this.graph.edges.get(pkg) || new Set();
51
- if (deps.size === 0) return 0;
52
- return 1 + Math.max(...Array.from(deps).map((dep)=>calculateDepth(dep)));
53
- };
54
- return calculateDepth(packageName);
55
- }
56
- /**
57
- * Get all dependencies for a package
58
- */ getDependencies(packageName) {
59
- return this.graph.edges.get(packageName) || new Set();
60
- }
61
- /**
62
- * Get all dependents (packages that depend on this one)
63
- */ getDependents(packageName) {
64
- return this.graph.reverseEdges.get(packageName) || new Set();
65
- }
66
- /**
67
- * Check if package has any dependencies
68
- */ hasDependencies(packageName) {
69
- const deps = this.graph.edges.get(packageName);
70
- return deps !== undefined && deps.size > 0;
71
- }
72
- /**
73
- * Check if package has any dependents
74
- */ hasDependents(packageName) {
75
- const dependents = this.graph.reverseEdges.get(packageName);
76
- return dependents !== undefined && dependents.size > 0;
77
- }
78
- /**
79
- * Get packages that are blocked by a failed package
80
- */ getBlockedPackages(failedPackage, state) {
81
- const blocked = new Set();
82
- // Add all pending and ready packages that depend on the failed package
83
- const allPending = [
84
- ...state.pending,
85
- ...state.ready
86
- ];
87
- for (const pkg of allPending){
88
- const deps = this.graph.edges.get(pkg) || new Set();
89
- if (deps.has(failedPackage)) {
90
- blocked.add(pkg);
91
- }
92
- }
93
- return blocked;
94
- }
95
- constructor(graph){
96
- _define_property(this, "graph", void 0);
97
- this.graph = graph;
98
- }
99
- }
100
-
101
- export { DependencyChecker };
102
- //# sourceMappingURL=DependencyChecker.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DependencyChecker.js","sources":["../../src/execution/DependencyChecker.ts"],"sourcesContent":["import { DependencyGraph } from '../util/dependencyGraph';\nimport { ExecutionState } from '../types/parallelExecution';\n\n/**\n * DependencyChecker validates package readiness and provides dependency information\n * for the task pool scheduler.\n */\nexport class DependencyChecker {\n private graph: DependencyGraph;\n\n constructor(graph: DependencyGraph) {\n this.graph = graph;\n }\n\n /**\n * Check if a package is ready to execute\n * A package is ready when all its dependencies are completed and none have failed\n */\n isReady(packageName: string, state: ExecutionState): boolean {\n const dependencies = this.graph.edges.get(packageName) || new Set();\n\n for (const dep of dependencies) {\n // If any dependency is not completed, not ready\n if (!state.completed.includes(dep)) {\n return false;\n }\n\n // If any dependency failed, should be skipped (not ready)\n if (state.failed.some(f => f.name === dep)) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Get count of packages that depend on this one\n * Higher count = higher priority (unlocks more packages)\n */\n getDependentCount(packageName: string): number {\n return (this.graph.reverseEdges.get(packageName) || new Set()).size;\n }\n\n /**\n * Get depth of package in dependency tree\n * Depth = longest path from a root package (package with no dependencies)\n * Lower depth = higher priority (can unlock dependent packages sooner)\n */\n getDepth(packageName: string): number {\n const visited = new Set<string>();\n\n const calculateDepth = (pkg: string): number => {\n if (visited.has(pkg)) return 0;\n visited.add(pkg);\n\n const deps = this.graph.edges.get(pkg) || new Set();\n if (deps.size === 0) return 0;\n\n return 1 + Math.max(...Array.from(deps).map(dep => calculateDepth(dep)));\n };\n\n return calculateDepth(packageName);\n }\n\n /**\n * Get all dependencies for a package\n */\n getDependencies(packageName: string): Set<string> {\n return this.graph.edges.get(packageName) || new Set();\n }\n\n /**\n * Get all dependents (packages that depend on this one)\n */\n getDependents(packageName: string): Set<string> {\n return this.graph.reverseEdges.get(packageName) || new Set();\n }\n\n /**\n * Check if package has any dependencies\n */\n hasDependencies(packageName: string): boolean {\n const deps = this.graph.edges.get(packageName);\n return deps !== undefined && deps.size > 0;\n }\n\n /**\n * Check if package has any dependents\n */\n hasDependents(packageName: string): boolean {\n const dependents = this.graph.reverseEdges.get(packageName);\n return dependents !== undefined && dependents.size > 0;\n }\n\n /**\n * Get packages that are blocked by a failed package\n */\n getBlockedPackages(failedPackage: string, state: ExecutionState): Set<string> {\n const blocked = new Set<string>();\n\n // Add all pending and ready packages that depend on the failed package\n const allPending = [...state.pending, ...state.ready];\n\n for (const pkg of allPending) {\n const deps = this.graph.edges.get(pkg) || new Set();\n if (deps.has(failedPackage)) {\n blocked.add(pkg);\n }\n }\n\n return blocked;\n }\n}\n"],"names":["DependencyChecker","isReady","packageName","state","dependencies","graph","edges","get","Set","dep","completed","includes","failed","some","f","name","getDependentCount","reverseEdges","size","getDepth","visited","calculateDepth","pkg","has","add","deps","Math","max","Array","from","map","getDependencies","getDependents","hasDependencies","undefined","hasDependents","dependents","getBlockedPackages","failedPackage","blocked","allPending","pending","ready"],"mappings":"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"}