@eldrforge/kodrdriv 1.2.27 → 1.2.29

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 (80) hide show
  1. package/AI-FRIENDLY-LOGGING-GUIDE.md +237 -0
  2. package/AI-LOGGING-MIGRATION-COMPLETE.md +371 -0
  3. package/ALREADY-PUBLISHED-PACKAGES-FIX.md +264 -0
  4. package/AUDIT-BRANCHES-PROGRESS-FIX.md +90 -0
  5. package/AUDIT-EXAMPLE-OUTPUT.md +113 -0
  6. package/CHECKPOINT-RECOVERY-FIX.md +450 -0
  7. package/LOGGING-MIGRATION-STATUS.md +186 -0
  8. package/PARALLEL-PUBLISH-DEBUGGING-GUIDE.md +441 -0
  9. package/PARALLEL-PUBLISH-FIXES-IMPLEMENTED.md +405 -0
  10. package/PARALLEL-PUBLISH-LOGGING-FIXES.md +274 -0
  11. package/PARALLEL-PUBLISH-QUICK-REFERENCE.md +375 -0
  12. package/PARALLEL_EXECUTION_FIX.md +2 -2
  13. package/PUBLISH_IMPROVEMENTS_IMPLEMENTED.md +4 -5
  14. package/VERSION-AUDIT-FIX.md +333 -0
  15. package/dist/application.js +6 -6
  16. package/dist/application.js.map +1 -1
  17. package/dist/arguments.js +43 -13
  18. package/dist/arguments.js.map +1 -1
  19. package/dist/commands/audio-commit.js +18 -18
  20. package/dist/commands/audio-commit.js.map +1 -1
  21. package/dist/commands/audio-review.js +32 -32
  22. package/dist/commands/audio-review.js.map +1 -1
  23. package/dist/commands/clean.js +9 -9
  24. package/dist/commands/clean.js.map +1 -1
  25. package/dist/commands/commit.js +20 -20
  26. package/dist/commands/commit.js.map +1 -1
  27. package/dist/commands/development.js +88 -89
  28. package/dist/commands/development.js.map +1 -1
  29. package/dist/commands/link.js +36 -36
  30. package/dist/commands/link.js.map +1 -1
  31. package/dist/commands/publish.js +318 -220
  32. package/dist/commands/publish.js.map +1 -1
  33. package/dist/commands/release.js +14 -14
  34. package/dist/commands/release.js.map +1 -1
  35. package/dist/commands/review.js +15 -17
  36. package/dist/commands/review.js.map +1 -1
  37. package/dist/commands/select-audio.js +5 -5
  38. package/dist/commands/select-audio.js.map +1 -1
  39. package/dist/commands/tree.js +134 -39
  40. package/dist/commands/tree.js.map +1 -1
  41. package/dist/commands/unlink.js +39 -39
  42. package/dist/commands/unlink.js.map +1 -1
  43. package/dist/commands/updates.js +150 -14
  44. package/dist/commands/updates.js.map +1 -1
  45. package/dist/commands/versions.js +14 -13
  46. package/dist/commands/versions.js.map +1 -1
  47. package/dist/constants.js +1 -1
  48. package/dist/content/diff.js +5 -5
  49. package/dist/content/diff.js.map +1 -1
  50. package/dist/content/files.js +2 -2
  51. package/dist/content/files.js.map +1 -1
  52. package/dist/content/log.js +3 -3
  53. package/dist/content/log.js.map +1 -1
  54. package/dist/execution/CommandValidator.js +6 -6
  55. package/dist/execution/CommandValidator.js.map +1 -1
  56. package/dist/execution/DynamicTaskPool.js +129 -19
  57. package/dist/execution/DynamicTaskPool.js.map +1 -1
  58. package/dist/execution/RecoveryManager.js +99 -21
  59. package/dist/execution/RecoveryManager.js.map +1 -1
  60. package/dist/execution/TreeExecutionAdapter.js +23 -20
  61. package/dist/execution/TreeExecutionAdapter.js.map +1 -1
  62. package/dist/main.js +2 -2
  63. package/dist/main.js.map +1 -1
  64. package/dist/util/checkpointManager.js +4 -4
  65. package/dist/util/checkpointManager.js.map +1 -1
  66. package/dist/util/dependencyGraph.js +2 -2
  67. package/dist/util/dependencyGraph.js.map +1 -1
  68. package/dist/util/fileLock.js +1 -1
  69. package/dist/util/fileLock.js.map +1 -1
  70. package/dist/util/general.js +148 -15
  71. package/dist/util/general.js.map +1 -1
  72. package/dist/util/interactive.js +2 -2
  73. package/dist/util/interactive.js.map +1 -1
  74. package/dist/util/performance.js.map +1 -1
  75. package/dist/util/safety.js +13 -13
  76. package/dist/util/safety.js.map +1 -1
  77. package/dist/utils/branchState.js +567 -0
  78. package/dist/utils/branchState.js.map +1 -0
  79. package/package.json +4 -4
  80. package/scripts/update-test-log-assertions.js +73 -0
@@ -1 +1 @@
1
- {"version":3,"file":"general.js","sources":["../../src/util/general.ts"],"sourcesContent":["import path from 'path';\nimport * as Storage from './storage';\nimport { getLogger } from '../logging';\n// eslint-disable-next-line no-restricted-imports\nimport * as fs from 'fs';\n\n// Utility function for deep merging two objects.\nexport function deepMerge(target: any, source: any): any {\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n if (key === \"__proto__\" || key === \"constructor\") {\n continue; // Skip prototype-polluting keys\n }\n if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) {\n if (!target[key]) {\n target[key] = {};\n }\n deepMerge(target[key], source[key]);\n } else {\n target[key] = source[key];\n }\n }\n }\n return target;\n}\n\n//Recursive implementation of jSON.stringify;\nexport const stringifyJSON = function (obj: any, options: { depth: number } = { depth: 0 }): string {\n\n if (options.depth > 10) {\n return '{\"error\": \"Maximum depth reached\"}';\n }\n\n const arrOfKeyVals: string[] = [];\n const arrVals: string[] = [];\n let objKeys: string[] = [];\n\n /*********CHECK FOR PRIMITIVE TYPES**********/\n if (typeof obj === 'number' || typeof obj === 'boolean' || obj === null)\n return '' + obj;\n else if (typeof obj === 'string')\n return '\"' + obj + '\"';\n\n /*********CHECK FOR ARRAY**********/\n else if (Array.isArray(obj)) {\n //check for empty array\n if (obj[0] === undefined)\n return '[]';\n else {\n obj.forEach(function (el) {\n arrVals.push(stringifyJSON(el, { depth: options.depth + 1 }));\n });\n return '[' + arrVals + ']';\n }\n }\n /*********CHECK FOR OBJECT**********/\n else if (obj instanceof Object) {\n //get object keys\n objKeys = Object.keys(obj);\n //set key output;\n objKeys.forEach(function (key) {\n const keyOut = '\"' + key + '\":';\n const keyValOut = obj[key];\n //skip functions and undefined properties\n if (keyValOut instanceof Function || keyValOut === undefined)\n arrOfKeyVals.push('');\n else if (typeof keyValOut === 'string')\n arrOfKeyVals.push(keyOut + '\"' + keyValOut + '\"');\n else if (typeof keyValOut === 'boolean' || typeof keyValOut === 'number' || keyValOut === null)\n arrOfKeyVals.push(keyOut + keyValOut);\n //check for nested objects, call recursively until no more objects\n else if (keyValOut instanceof Object) {\n arrOfKeyVals.push(keyOut + stringifyJSON(keyValOut, { depth: options.depth + 1 }));\n }\n });\n return '{' + arrOfKeyVals + '}';\n }\n return '';\n};\n\nexport const incrementPatchVersion = (version: string): string => {\n // Remove 'v' prefix if present\n const cleanVersion = version.startsWith('v') ? version.slice(1) : version;\n\n // Split into major.minor.patch and handle pre-release identifiers\n const parts = cleanVersion.split('.');\n if (parts.length < 3) {\n throw new Error(`Invalid version string: ${version}`);\n }\n\n // Handle pre-release versions like \"4.6.24-dev.0\"\n // Split the patch part on '-' to separate patch number from pre-release\n const patchPart = parts[2];\n let patchNumber: number;\n let originalPatchString: string;\n let hasPrerelease = false;\n\n if (patchPart.startsWith('-')) {\n // Handle negative patch numbers like \"-1\" or \"-5\" or \"-1-dev.0\"\n const negativeComponents = patchPart.split('-');\n // For \"-1-dev.0\", negativeComponents will be ['', '1', 'dev.0']\n if (negativeComponents.length > 2) {\n // This is a negative number with pre-release like \"-1-dev.0\"\n originalPatchString = `-${negativeComponents[1]}`;\n patchNumber = parseInt(`-${negativeComponents[1]}`, 10);\n hasPrerelease = true;\n } else {\n // This is just a negative number like \"-1\"\n patchNumber = parseInt(patchPart, 10);\n originalPatchString = patchPart;\n }\n } else {\n // Handle normal patch numbers with possible pre-release like \"24-dev.0\"\n const patchComponents = patchPart.split('-');\n originalPatchString = patchComponents[0];\n patchNumber = parseInt(patchComponents[0], 10);\n hasPrerelease = patchComponents.length > 1;\n }\n\n if (isNaN(patchNumber)) {\n throw new Error(`Invalid patch version: ${patchPart}`);\n }\n\n // For pre-release versions, graduate to the base version (drop pre-release identifier)\n // For stable versions, increment the patch number\n const newPatchNumber = hasPrerelease ? originalPatchString : (patchNumber + 1).toString();\n\n // Create clean release version\n const newVersion = `${parts[0]}.${parts[1]}.${newPatchNumber}`;\n\n return newVersion;\n};\n\nexport const incrementMinorVersion = (version: string): string => {\n // Remove 'v' prefix if present\n const cleanVersion = version.startsWith('v') ? version.slice(1) : version;\n\n // Split into major.minor.patch and handle pre-release identifiers\n const parts = cleanVersion.split('.');\n if (parts.length < 3) {\n throw new Error(`Invalid version string: ${version}`);\n }\n\n const majorNumber = parseInt(parts[0], 10);\n const minorPart = parts[1];\n\n // Handle pre-release versions on minor like \"23-dev.0\"\n const minorComponents = minorPart.split('-');\n const minorNumber = parseInt(minorComponents[0], 10);\n\n if (isNaN(majorNumber) || isNaN(minorNumber)) {\n throw new Error(`Invalid version numbers in: ${version}`);\n }\n\n // Increment the minor number and reset patch to 0\n const newMinorNumber = minorNumber + 1;\n const newVersion = `${majorNumber}.${newMinorNumber}.0`;\n\n return newVersion;\n};\n\nexport const incrementMajorVersion = (version: string): string => {\n // Remove 'v' prefix if present\n const cleanVersion = version.startsWith('v') ? version.slice(1) : version;\n\n // Split into major.minor.patch and handle pre-release identifiers\n const parts = cleanVersion.split('.');\n if (parts.length < 3) {\n throw new Error(`Invalid version string: ${version}`);\n }\n\n const majorPart = parts[0];\n\n // Handle pre-release versions on major like \"4-dev.0\"\n const majorComponents = majorPart.split('-');\n const majorNumber = parseInt(majorComponents[0], 10);\n\n if (isNaN(majorNumber)) {\n throw new Error(`Invalid major version number in: ${version}`);\n }\n\n // Increment the major number and reset minor and patch to 0\n const newMajorNumber = majorNumber + 1;\n const newVersion = `${newMajorNumber}.0.0`;\n\n return newVersion;\n};\n\nexport const validateVersionString = (version: string): boolean => {\n // Remove 'v' prefix if present\n const cleanVersion = version.startsWith('v') ? version.slice(1) : version;\n\n // Basic semver regex pattern\n const semverPattern = /^\\d+\\.\\d+\\.\\d+$/;\n return semverPattern.test(cleanVersion);\n};\n\nexport const calculateTargetVersion = (currentVersion: string, targetVersion: string): string => {\n switch (targetVersion.toLowerCase()) {\n case 'patch':\n return incrementPatchVersion(currentVersion);\n case 'minor':\n return incrementMinorVersion(currentVersion);\n case 'major':\n return incrementMajorVersion(currentVersion);\n default:\n // Explicit version provided\n if (!validateVersionString(targetVersion)) {\n throw new Error(`Invalid version format: ${targetVersion}. Expected format: \"x.y.z\" or one of: \"patch\", \"minor\", \"major\"`);\n }\n return targetVersion.startsWith('v') ? targetVersion.slice(1) : targetVersion;\n }\n};\n\n/**\n * Increment prerelease version with a specific tag\n * Examples:\n * - incrementPrereleaseVersion(\"1.2.3-dev.0\", \"dev\") => \"1.2.3-dev.1\"\n * - incrementPrereleaseVersion(\"1.2.3\", \"dev\") => \"1.2.3-dev.0\"\n * - incrementPrereleaseVersion(\"1.2.3-dev.5\", \"test\") => \"1.2.3-test.0\"\n */\nexport const incrementPrereleaseVersion = (version: string, tag: string): string => {\n const cleanVersion = version.startsWith('v') ? version.slice(1) : version;\n\n // Split on dots but only use first 3 parts for major.minor.patch\n // This handles cases like \"1.2.3-dev.5\" correctly\n const dotParts = cleanVersion.split('.');\n if (dotParts.length < 3) {\n throw new Error(`Invalid version string: ${version}`);\n }\n\n const major = dotParts[0];\n const minor = dotParts[1];\n\n // Reconstruct the patch part - everything after the second dot\n const patchAndPrerelease = dotParts.slice(2).join('.');\n const patchComponents = patchAndPrerelease.split('-');\n const patchNumber = patchComponents[0];\n\n if (patchComponents.length > 1) {\n // Already has prerelease (e.g., \"3-dev.0\" or \"3-test.2\")\n const prereleaseString = patchComponents.slice(1).join('-'); // Handle multiple dashes\n const prereleaseComponents = prereleaseString.split('.');\n const existingTag = prereleaseComponents[0];\n const existingPrereleaseVersion = prereleaseComponents[1];\n\n if (existingTag === tag) {\n // Same tag, increment the prerelease version\n const prereleaseNumber = parseInt(existingPrereleaseVersion) || 0;\n return `${major}.${minor}.${patchNumber}-${tag}.${prereleaseNumber + 1}`;\n } else {\n // Different tag, start at 0\n return `${major}.${minor}.${patchNumber}-${tag}.0`;\n }\n } else {\n // No prerelease yet, add it\n return `${major}.${minor}.${patchNumber}-${tag}.0`;\n }\n};\n\n/**\n * Convert prerelease version to release version\n * Examples:\n * - convertToReleaseVersion(\"1.2.3-dev.5\") => \"1.2.3\"\n * - convertToReleaseVersion(\"1.2.3-test.2\") => \"1.2.3\"\n * - convertToReleaseVersion(\"1.2.3\") => \"1.2.3\"\n */\nexport const convertToReleaseVersion = (version: string): string => {\n const cleanVersion = version.startsWith('v') ? version.slice(1) : version;\n\n // Split on dots but only use first 3 parts for major.minor.patch\n const dotParts = cleanVersion.split('.');\n if (dotParts.length < 3) {\n throw new Error(`Invalid version string: ${version}`);\n }\n\n const major = dotParts[0];\n const minor = dotParts[1];\n\n // Reconstruct the patch part - everything after the second dot\n const patchAndPrerelease = dotParts.slice(2).join('.');\n const patchComponents = patchAndPrerelease.split('-');\n const patchNumber = patchComponents[0];\n\n return `${major}.${minor}.${patchNumber}`;\n};\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 const { stdout } = await runSecure('git', ['show', `${branchName}:package.json`]);\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(`🎯 Using default branch configuration: ${currentBranch} → ${finalTargetBranch}`);\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(`🎯 Using branch-dependent targeting: ${currentBranch} → ${finalTargetBranch}`);\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(`📦 Converting to release version: ${currentVersion} → ${releaseVersion}`);\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(`📦 Incrementing prerelease in target branch: ${targetBranchVersion} → ${newVersion}`);\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(`📦 Creating new prerelease version: ${currentVersion} → ${newVersion}`);\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(`📦 Setting prerelease tag: ${currentVersion} → ${newVersion}`);\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(`\\n📦 Version Confirmation:`);\n logger.info(` Current version: ${currentVersion}`);\n logger.info(` Proposed version: ${proposedVersion}`);\n if (targetVersionInput) {\n logger.info(` Target 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(`✅ Using custom version: ${cleanCustomVersion}`);\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 = Storage.create({ log: logger.debug });\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('Original audio file not found or not readable: %s', 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 successfully - Audio: %s, Transcript: %s', archivedAudioFilename, archivedTranscriptFilename);\n\n return {\n audioPath: archivedAudioPath,\n transcriptPath: archivedTranscriptPath\n };\n\n } catch (error: any) {\n logger.error('Failed to archive audio: %s', error.message);\n throw new Error(`Audio archiving failed: ${error.message}`);\n }\n};\n"],"names":["stringifyJSON","obj","options","depth","arrOfKeyVals","arrVals","objKeys","Array","isArray","undefined","forEach","el","push","Object","keys","key","keyOut","keyValOut","Function","incrementPatchVersion","version","cleanVersion","startsWith","slice","parts","split","length","Error","patchPart","patchNumber","originalPatchString","hasPrerelease","negativeComponents","parseInt","patchComponents","isNaN","newPatchNumber","toString","newVersion","incrementMinorVersion","majorNumber","minorPart","minorComponents","minorNumber","newMinorNumber","incrementMajorVersion","majorPart","majorComponents","newMajorNumber","validateVersionString","semverPattern","test","calculateTargetVersion","currentVersion","targetVersion","toLowerCase","incrementPrereleaseVersion","tag","dotParts","major","minor","patchAndPrerelease","join","prereleaseString","prereleaseComponents","existingTag","existingPrereleaseVersion","prereleaseNumber","convertToReleaseVersion","getVersionFromBranch","branchName","runSecure","validateGitRef","safeJsonParse","validatePackageJson","stdout","packageJson","validated","calculateBranchDependentVersion","currentBranch","branchesConfig","targetBranch","getLogger","logger","KODRDRIV_DEFAULTS","defaultConfig","branches","sourceConfig","finalTargetBranch","targetConfig","info","defaultVersion","debug","calculateVersionFromTargetConfig","defaultTargetBranch","versionConfig","type","releaseVersion","increment","targetBranchVersion","baseVersion","findDevelopmentBranch","branchConfig","entries","developmentBranch","checkIfTagExists","tagName","trim","confirmVersionInteractively","proposedVersion","targetVersionInput","getUserChoice","getUserTextInput","requireTTY","choices","label","choice","customVersion","cleanCustomVersion","getOutputPath","outputDirectory","filename","path","getTimestampedFilename","baseName","extension","now","Date","yy","getFullYear","mm","getMonth","padStart","dd","getDate","hh","getHours","min","getMinutes","timestamp","getTimestampedRequestFilename","getTimestampedResponseFilename","getTimestampedCommitFilename","getTimestampedReleaseNotesFilename","getTimestampedAudioFilename","getTimestampedReviewFilename","getTimestampedReviewNotesFilename","getTimestampedArchivedAudioFilename","originalExtension","getTimestampedArchivedTranscriptFilename","archiveAudio","originalAudioPath","transcriptionText","storage","Storage","log","ensureDirectory","extname","archivedAudioFilename","archivedTranscriptFilename","archivedAudioPath","archivedTranscriptPath","isFileReadable","audioBuffer","fs","promises","readFile","writeFile","warn","transcriptContent","toISOString","audioPath","transcriptPath","error","message"],"mappings":"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"}
1
+ {"version":3,"file":"general.js","sources":["../../src/util/general.ts"],"sourcesContent":["import path from 'path';\nimport * as Storage from './storage';\nimport { getLogger } from '../logging';\n// eslint-disable-next-line no-restricted-imports\nimport * as fs from 'fs';\n\n// Utility function for deep merging two objects.\nexport function deepMerge(target: any, source: any): any {\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n if (key === \"__proto__\" || key === \"constructor\") {\n continue; // Skip prototype-polluting keys\n }\n if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) {\n if (!target[key]) {\n target[key] = {};\n }\n deepMerge(target[key], source[key]);\n } else {\n target[key] = source[key];\n }\n }\n }\n return target;\n}\n\n//Recursive implementation of jSON.stringify;\nexport const stringifyJSON = function (obj: any, options: { depth: number } = { depth: 0 }): string {\n\n if (options.depth > 10) {\n return '{\"error\": \"Maximum depth reached\"}';\n }\n\n const arrOfKeyVals: string[] = [];\n const arrVals: string[] = [];\n let objKeys: string[] = [];\n\n /*********CHECK FOR PRIMITIVE TYPES**********/\n if (typeof obj === 'number' || typeof obj === 'boolean' || obj === null)\n return '' + obj;\n else if (typeof obj === 'string')\n return '\"' + obj + '\"';\n\n /*********CHECK FOR ARRAY**********/\n else if (Array.isArray(obj)) {\n //check for empty array\n if (obj[0] === undefined)\n return '[]';\n else {\n obj.forEach(function (el) {\n arrVals.push(stringifyJSON(el, { depth: options.depth + 1 }));\n });\n return '[' + arrVals + ']';\n }\n }\n /*********CHECK FOR OBJECT**********/\n else if (obj instanceof Object) {\n //get object keys\n objKeys = Object.keys(obj);\n //set key output;\n objKeys.forEach(function (key) {\n const keyOut = '\"' + key + '\":';\n const keyValOut = obj[key];\n //skip functions and undefined properties\n if (keyValOut instanceof Function || keyValOut === undefined)\n arrOfKeyVals.push('');\n else if (typeof keyValOut === 'string')\n arrOfKeyVals.push(keyOut + '\"' + keyValOut + '\"');\n else if (typeof keyValOut === 'boolean' || typeof keyValOut === 'number' || keyValOut === null)\n arrOfKeyVals.push(keyOut + keyValOut);\n //check for nested objects, call recursively until no more objects\n else if (keyValOut instanceof Object) {\n arrOfKeyVals.push(keyOut + stringifyJSON(keyValOut, { depth: options.depth + 1 }));\n }\n });\n return '{' + arrOfKeyVals + '}';\n }\n return '';\n};\n\nexport const incrementPatchVersion = (version: string): string => {\n // Remove 'v' prefix if present\n const cleanVersion = version.startsWith('v') ? version.slice(1) : version;\n\n // Split into major.minor.patch and handle pre-release identifiers\n const parts = cleanVersion.split('.');\n if (parts.length < 3) {\n throw new Error(`Invalid version string: ${version}`);\n }\n\n // Handle pre-release versions like \"4.6.24-dev.0\"\n // Split the patch part on '-' to separate patch number from pre-release\n const patchPart = parts[2];\n let patchNumber: number;\n let originalPatchString: string;\n let hasPrerelease = false;\n\n if (patchPart.startsWith('-')) {\n // Handle negative patch numbers like \"-1\" or \"-5\" or \"-1-dev.0\"\n const negativeComponents = patchPart.split('-');\n // For \"-1-dev.0\", negativeComponents will be ['', '1', 'dev.0']\n if (negativeComponents.length > 2) {\n // This is a negative number with pre-release like \"-1-dev.0\"\n originalPatchString = `-${negativeComponents[1]}`;\n patchNumber = parseInt(`-${negativeComponents[1]}`, 10);\n hasPrerelease = true;\n } else {\n // This is just a negative number like \"-1\"\n patchNumber = parseInt(patchPart, 10);\n originalPatchString = patchPart;\n }\n } else {\n // Handle normal patch numbers with possible pre-release like \"24-dev.0\"\n const patchComponents = patchPart.split('-');\n originalPatchString = patchComponents[0];\n patchNumber = parseInt(patchComponents[0], 10);\n hasPrerelease = patchComponents.length > 1;\n }\n\n if (isNaN(patchNumber)) {\n throw new Error(`Invalid patch version: ${patchPart}`);\n }\n\n // For pre-release versions, graduate to the base version (drop pre-release identifier)\n // For stable versions, increment the patch number\n const newPatchNumber = hasPrerelease ? originalPatchString : (patchNumber + 1).toString();\n\n // Create clean release version\n const newVersion = `${parts[0]}.${parts[1]}.${newPatchNumber}`;\n\n return newVersion;\n};\n\nexport const incrementMinorVersion = (version: string): string => {\n // Remove 'v' prefix if present\n const cleanVersion = version.startsWith('v') ? version.slice(1) : version;\n\n // Split into major.minor.patch and handle pre-release identifiers\n const parts = cleanVersion.split('.');\n if (parts.length < 3) {\n throw new Error(`Invalid version string: ${version}`);\n }\n\n const majorNumber = parseInt(parts[0], 10);\n const minorPart = parts[1];\n\n // Handle pre-release versions on minor like \"23-dev.0\"\n const minorComponents = minorPart.split('-');\n const minorNumber = parseInt(minorComponents[0], 10);\n\n if (isNaN(majorNumber) || isNaN(minorNumber)) {\n throw new Error(`Invalid version numbers in: ${version}`);\n }\n\n // Increment the minor number and reset patch to 0\n const newMinorNumber = minorNumber + 1;\n const newVersion = `${majorNumber}.${newMinorNumber}.0`;\n\n return newVersion;\n};\n\nexport const incrementMajorVersion = (version: string): string => {\n // Remove 'v' prefix if present\n const cleanVersion = version.startsWith('v') ? version.slice(1) : version;\n\n // Split into major.minor.patch and handle pre-release identifiers\n const parts = cleanVersion.split('.');\n if (parts.length < 3) {\n throw new Error(`Invalid version string: ${version}`);\n }\n\n const majorPart = parts[0];\n\n // Handle pre-release versions on major like \"4-dev.0\"\n const majorComponents = majorPart.split('-');\n const majorNumber = parseInt(majorComponents[0], 10);\n\n if (isNaN(majorNumber)) {\n throw new Error(`Invalid major version number in: ${version}`);\n }\n\n // Increment the major number and reset minor and patch to 0\n const newMajorNumber = majorNumber + 1;\n const newVersion = `${newMajorNumber}.0.0`;\n\n return newVersion;\n};\n\nexport const validateVersionString = (version: string): boolean => {\n // Remove 'v' prefix if present\n const cleanVersion = version.startsWith('v') ? version.slice(1) : version;\n\n // Basic semver regex pattern\n const semverPattern = /^\\d+\\.\\d+\\.\\d+$/;\n return semverPattern.test(cleanVersion);\n};\n\nexport const calculateTargetVersion = (currentVersion: string, targetVersion: string): string => {\n switch (targetVersion.toLowerCase()) {\n case 'patch':\n return incrementPatchVersion(currentVersion);\n case 'minor':\n return incrementMinorVersion(currentVersion);\n case 'major':\n return incrementMajorVersion(currentVersion);\n default:\n // Explicit version provided\n if (!validateVersionString(targetVersion)) {\n throw new Error(`Invalid version format: ${targetVersion}. Expected format: \"x.y.z\" or one of: \"patch\", \"minor\", \"major\"`);\n }\n return targetVersion.startsWith('v') ? targetVersion.slice(1) : targetVersion;\n }\n};\n\n/**\n * Increment prerelease version with a specific tag\n * Examples:\n * - incrementPrereleaseVersion(\"1.2.3-dev.0\", \"dev\") => \"1.2.3-dev.1\"\n * - incrementPrereleaseVersion(\"1.2.3\", \"dev\") => \"1.2.3-dev.0\"\n * - incrementPrereleaseVersion(\"1.2.3-dev.5\", \"test\") => \"1.2.3-test.0\"\n */\nexport const incrementPrereleaseVersion = (version: string, tag: string): string => {\n const cleanVersion = version.startsWith('v') ? version.slice(1) : version;\n\n // Split on dots but only use first 3 parts for major.minor.patch\n // This handles cases like \"1.2.3-dev.5\" correctly\n const dotParts = cleanVersion.split('.');\n if (dotParts.length < 3) {\n throw new Error(`Invalid version string: ${version}`);\n }\n\n const major = dotParts[0];\n const minor = dotParts[1];\n\n // Reconstruct the patch part - everything after the second dot\n const patchAndPrerelease = dotParts.slice(2).join('.');\n const patchComponents = patchAndPrerelease.split('-');\n const patchNumber = patchComponents[0];\n\n if (patchComponents.length > 1) {\n // Already has prerelease (e.g., \"3-dev.0\" or \"3-test.2\")\n const prereleaseString = patchComponents.slice(1).join('-'); // Handle multiple dashes\n const prereleaseComponents = prereleaseString.split('.');\n const existingTag = prereleaseComponents[0];\n const existingPrereleaseVersion = prereleaseComponents[1];\n\n if (existingTag === tag) {\n // Same tag, increment the prerelease version\n const prereleaseNumber = parseInt(existingPrereleaseVersion) || 0;\n return `${major}.${minor}.${patchNumber}-${tag}.${prereleaseNumber + 1}`;\n } else {\n // Different tag, start at 0\n return `${major}.${minor}.${patchNumber}-${tag}.0`;\n }\n } else {\n // No prerelease yet, add it\n return `${major}.${minor}.${patchNumber}-${tag}.0`;\n }\n};\n\n/**\n * Convert prerelease version to release version\n * Examples:\n * - convertToReleaseVersion(\"1.2.3-dev.5\") => \"1.2.3\"\n * - convertToReleaseVersion(\"1.2.3-test.2\") => \"1.2.3\"\n * - convertToReleaseVersion(\"1.2.3\") => \"1.2.3\"\n */\nexport const convertToReleaseVersion = (version: string): string => {\n const cleanVersion = version.startsWith('v') ? version.slice(1) : version;\n\n // Split on dots but only use first 3 parts for major.minor.patch\n const dotParts = cleanVersion.split('.');\n if (dotParts.length < 3) {\n throw new Error(`Invalid version string: ${version}`);\n }\n\n const major = dotParts[0];\n const minor = dotParts[1];\n\n // Reconstruct the patch part - everything after the second dot\n const patchAndPrerelease = dotParts.slice(2).join('.');\n const patchComponents = patchAndPrerelease.split('-');\n const patchNumber = patchComponents[0];\n\n return `${major}.${minor}.${patchNumber}`;\n};\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 const { stdout } = await runSecure('git', ['show', `${branchName}:package.json`]);\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 = Storage.create({ log: logger.debug });\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"],"names":["stringifyJSON","obj","options","depth","arrOfKeyVals","arrVals","objKeys","Array","isArray","undefined","forEach","el","push","Object","keys","key","keyOut","keyValOut","Function","incrementPatchVersion","version","cleanVersion","startsWith","slice","parts","split","length","Error","patchPart","patchNumber","originalPatchString","hasPrerelease","negativeComponents","parseInt","patchComponents","isNaN","newPatchNumber","toString","newVersion","incrementMinorVersion","majorNumber","minorPart","minorComponents","minorNumber","newMinorNumber","incrementMajorVersion","majorPart","majorComponents","newMajorNumber","validateVersionString","semverPattern","test","calculateTargetVersion","currentVersion","targetVersion","toLowerCase","incrementPrereleaseVersion","tag","dotParts","major","minor","patchAndPrerelease","join","prereleaseString","prereleaseComponents","existingTag","existingPrereleaseVersion","prereleaseNumber","convertToReleaseVersion","getVersionFromBranch","branchName","runSecure","validateGitRef","safeJsonParse","validatePackageJson","stdout","packageJson","validated","calculateBranchDependentVersion","currentBranch","branchesConfig","targetBranch","getLogger","logger","KODRDRIV_DEFAULTS","defaultConfig","branches","sourceConfig","finalTargetBranch","targetConfig","info","defaultVersion","debug","calculateVersionFromTargetConfig","defaultTargetBranch","versionConfig","type","releaseVersion","increment","targetBranchVersion","baseVersion","findDevelopmentBranch","branchConfig","entries","developmentBranch","checkIfTagExists","tagName","trim","confirmVersionInteractively","proposedVersion","targetVersionInput","getUserChoice","getUserTextInput","requireTTY","choices","label","choice","customVersion","cleanCustomVersion","getOutputPath","outputDirectory","filename","path","getTimestampedFilename","baseName","extension","now","Date","yy","getFullYear","mm","getMonth","padStart","dd","getDate","hh","getHours","min","getMinutes","timestamp","getTimestampedRequestFilename","getTimestampedResponseFilename","getTimestampedCommitFilename","getTimestampedReleaseNotesFilename","getTimestampedAudioFilename","getTimestampedReviewFilename","getTimestampedReviewNotesFilename","getTimestampedArchivedAudioFilename","originalExtension","getTimestampedArchivedTranscriptFilename","archiveAudio","originalAudioPath","transcriptionText","storage","Storage","log","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","isDevelopmentVersion","includes","getExpectedVersionPattern","devBranchPatterns","pattern","description","isDevelopment","releaseBranchPatterns","validateVersionForBranch","expected","valid","issue","fix","isDevVersion"],"mappings":"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"}
@@ -17,14 +17,14 @@ export { STANDARD_CHOICES, SecureTempFile, cleanupTempFile, createSecureTempFile
17
17
  * @returns Promise resolving to the improved content
18
18
  */ async function improveContentWithLLM(currentContent, runConfig, promptConfig, promptContext, outputDirectory, improvementConfig) {
19
19
  const logger = getDryRunLogger(false);
20
- logger.info(`🤖 Requesting LLM to improve the ${improvementConfig.contentType}...`);
20
+ logger.info(`INTERACTIVE_LLM_IMPROVING: Requesting LLM to improve content | Content Type: ${improvementConfig.contentType} | Service: AI | Purpose: Enhance quality`);
21
21
  // Create the improved prompt using the provided function
22
22
  const improvedPromptResult = await improvementConfig.createImprovedPrompt(promptConfig, currentContent, promptContext);
23
23
  // Call the LLM with the improved prompt
24
24
  const improvedResponse = await improvementConfig.callLLM(improvedPromptResult, runConfig, outputDirectory);
25
25
  // Process the response if a processor is provided
26
26
  const finalResult = improvementConfig.processResponse ? improvementConfig.processResponse(improvedResponse) : improvedResponse;
27
- logger.info(`✅ LLM has provided improved ${improvementConfig.contentType}`);
27
+ logger.info(`INTERACTIVE_LLM_IMPROVED: LLM provided improved content | Content Type: ${improvementConfig.contentType} | Status: enhanced`);
28
28
  return finalResult;
29
29
  }
30
30
 
@@ -1 +1 @@
1
- {"version":3,"file":"interactive.js","sources":["../../src/util/interactive.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * Kodrdriv-specific interactive utilities\n *\n * This module contains application-specific interactive workflows that build on\n * top of the generic interactive functions from @eldrforge/ai-service.\n *\n * Re-exports from ai-service for convenience, plus kodrdriv-specific functions.\n */\n\nimport { getDryRunLogger } from '../logging';\n\n// Re-export everything from ai-service for backwards compatibility\nexport {\n getUserChoice,\n getUserTextInput,\n editContentInEditor,\n getLLMFeedbackInEditor,\n requireTTY,\n SecureTempFile,\n createSecureTempFile,\n cleanupTempFile,\n STANDARD_CHOICES,\n type Choice,\n type InteractiveOptions,\n type EditorResult,\n} from '@eldrforge/ai-service';\n\n// Kodrdriv-specific types and functions below\n\nexport interface LLMImprovementConfig {\n /** The type of content being improved (for filenames and logging) */\n contentType: string;\n /** Function that creates a prompt for improvement */\n createImprovedPrompt: (\n promptConfig: any,\n improvementContent: any,\n promptContext: any\n ) => Promise<any>;\n /** Function that calls LLM with the improved prompt */\n callLLM: (\n request: any,\n runConfig: any,\n outputDirectory: string\n ) => Promise<any>;\n /** Function that validates/processes the LLM response */\n processResponse?: (response: any) => any;\n}\n\n/**\n * Generic LLM improvement function that can be configured for different content types\n *\n * This is kodrdriv-specific orchestration logic that combines multiple ai-service\n * primitives into a higher-level workflow.\n *\n * @param currentContent The current content to improve\n * @param runConfig Runtime configuration\n * @param promptConfig Prompt configuration\n * @param promptContext Prompt context\n * @param outputDirectory Output directory for debug files\n * @param improvementConfig Configuration for this specific improvement type\n * @returns Promise resolving to the improved content\n */\nexport async function improveContentWithLLM<T>(\n currentContent: T,\n runConfig: any,\n promptConfig: any,\n promptContext: any,\n outputDirectory: string,\n improvementConfig: LLMImprovementConfig\n): Promise<T> {\n const logger = getDryRunLogger(false);\n\n logger.info(`🤖 Requesting LLM to improve the ${improvementConfig.contentType}...`);\n\n // Create the improved prompt using the provided function\n const improvedPromptResult = await improvementConfig.createImprovedPrompt(\n promptConfig,\n currentContent,\n promptContext\n );\n\n // Call the LLM with the improved prompt\n const improvedResponse = await improvementConfig.callLLM(improvedPromptResult, runConfig, outputDirectory);\n\n // Process the response if a processor is provided\n const finalResult = improvementConfig.processResponse\n ? improvementConfig.processResponse(improvedResponse)\n : improvedResponse;\n\n logger.info(`✅ LLM has provided improved ${improvementConfig.contentType}`);\n return finalResult;\n}\n"],"names":["improveContentWithLLM","currentContent","runConfig","promptConfig","promptContext","outputDirectory","improvementConfig","logger","getDryRunLogger","info","contentType","improvedPromptResult","createImprovedPrompt","improvedResponse","callLLM","finalResult","processResponse"],"mappings":"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"}
1
+ {"version":3,"file":"interactive.js","sources":["../../src/util/interactive.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * Kodrdriv-specific interactive utilities\n *\n * This module contains application-specific interactive workflows that build on\n * top of the generic interactive functions from @eldrforge/ai-service.\n *\n * Re-exports from ai-service for convenience, plus kodrdriv-specific functions.\n */\n\nimport { getDryRunLogger } from '../logging';\n\n// Re-export everything from ai-service for backwards compatibility\nexport {\n getUserChoice,\n getUserTextInput,\n editContentInEditor,\n getLLMFeedbackInEditor,\n requireTTY,\n SecureTempFile,\n createSecureTempFile,\n cleanupTempFile,\n STANDARD_CHOICES,\n type Choice,\n type InteractiveOptions,\n type EditorResult,\n} from '@eldrforge/ai-service';\n\n// Kodrdriv-specific types and functions below\n\nexport interface LLMImprovementConfig {\n /** The type of content being improved (for filenames and logging) */\n contentType: string;\n /** Function that creates a prompt for improvement */\n createImprovedPrompt: (\n promptConfig: any,\n improvementContent: any,\n promptContext: any\n ) => Promise<any>;\n /** Function that calls LLM with the improved prompt */\n callLLM: (\n request: any,\n runConfig: any,\n outputDirectory: string\n ) => Promise<any>;\n /** Function that validates/processes the LLM response */\n processResponse?: (response: any) => any;\n}\n\n/**\n * Generic LLM improvement function that can be configured for different content types\n *\n * This is kodrdriv-specific orchestration logic that combines multiple ai-service\n * primitives into a higher-level workflow.\n *\n * @param currentContent The current content to improve\n * @param runConfig Runtime configuration\n * @param promptConfig Prompt configuration\n * @param promptContext Prompt context\n * @param outputDirectory Output directory for debug files\n * @param improvementConfig Configuration for this specific improvement type\n * @returns Promise resolving to the improved content\n */\nexport async function improveContentWithLLM<T>(\n currentContent: T,\n runConfig: any,\n promptConfig: any,\n promptContext: any,\n outputDirectory: string,\n improvementConfig: LLMImprovementConfig\n): Promise<T> {\n const logger = getDryRunLogger(false);\n\n logger.info(`INTERACTIVE_LLM_IMPROVING: Requesting LLM to improve content | Content Type: ${improvementConfig.contentType} | Service: AI | Purpose: Enhance quality`);\n\n // Create the improved prompt using the provided function\n const improvedPromptResult = await improvementConfig.createImprovedPrompt(\n promptConfig,\n currentContent,\n promptContext\n );\n\n // Call the LLM with the improved prompt\n const improvedResponse = await improvementConfig.callLLM(improvedPromptResult, runConfig, outputDirectory);\n\n // Process the response if a processor is provided\n const finalResult = improvementConfig.processResponse\n ? improvementConfig.processResponse(improvedResponse)\n : improvedResponse;\n\n logger.info(`INTERACTIVE_LLM_IMPROVED: LLM provided improved content | Content Type: ${improvementConfig.contentType} | Status: enhanced`);\n return finalResult;\n}\n"],"names":["improveContentWithLLM","currentContent","runConfig","promptConfig","promptContext","outputDirectory","improvementConfig","logger","getDryRunLogger","info","contentType","improvedPromptResult","createImprovedPrompt","improvedResponse","callLLM","finalResult","processResponse"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"performance.js","sources":["../../src/util/performance.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\nimport path from 'path';\nimport { getLogger } from '../logging';\nimport { safeJsonParse, validatePackageJson } from '@eldrforge/git-tools';\n\n// Performance timing helper\nexport class PerformanceTimer {\n private startTime: number;\n private logger: any;\n\n constructor(logger: any) {\n this.logger = logger;\n this.startTime = Date.now();\n }\n\n static start(logger: any, operation: string): PerformanceTimer {\n logger.verbose(`⏱️ Starting: ${operation}`);\n return new PerformanceTimer(logger);\n }\n\n end(operation: string): number {\n const duration = Date.now() - this.startTime;\n this.logger.verbose(`⏱️ Completed: ${operation} (${duration}ms)`);\n return duration;\n }\n}\n\nexport interface PackageJson {\n name?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n}\n\nexport interface PackageJsonLocation {\n path: string;\n packageJson: PackageJson;\n relativePath: string;\n}\n\nconst EXCLUDED_DIRECTORIES = [\n 'node_modules',\n 'dist',\n 'build',\n 'coverage',\n '.git',\n '.next',\n '.nuxt',\n 'out',\n 'public',\n 'static',\n 'assets'\n];\n\n// Batch read multiple package.json files in parallel\nexport const batchReadPackageJsonFiles = async (\n packageJsonPaths: string[],\n storage: any,\n rootDir: string\n): Promise<PackageJsonLocation[]> => {\n const logger = getLogger();\n const timer = PerformanceTimer.start(logger, `Batch reading ${packageJsonPaths.length} package.json files`);\n\n const readPromises = packageJsonPaths.map(async (packageJsonPath): Promise<PackageJsonLocation | null> => {\n try {\n const packageJsonContent = await storage.readFile(packageJsonPath, 'utf-8');\n const parsed = safeJsonParse(packageJsonContent, packageJsonPath);\n const packageJson = validatePackageJson(parsed, packageJsonPath, false);\n const relativePath = path.relative(rootDir, path.dirname(packageJsonPath));\n\n return {\n path: packageJsonPath,\n packageJson,\n relativePath: relativePath || '.'\n };\n } catch (error: any) {\n logger.debug(`Skipped invalid package.json at ${packageJsonPath}: ${error.message}`);\n return null;\n }\n });\n\n const results = await Promise.all(readPromises);\n const validResults = results.filter((result): result is PackageJsonLocation => result !== null);\n\n timer.end(`Successfully read ${validResults.length}/${packageJsonPaths.length} package.json files`);\n return validResults;\n};\n\n// Optimized recursive package.json finder with parallel processing\nexport const findAllPackageJsonFiles = async (rootDir: string, storage: any): Promise<PackageJsonLocation[]> => {\n const logger = getLogger();\n const timer = PerformanceTimer.start(logger, 'Optimized scanning for package.json files');\n\n // Phase 1: Find all package.json file paths in parallel\n const packageJsonPaths: string[] = [];\n\n const scanForPaths = async (currentDir: string, depth: number = 0): Promise<string[]> => {\n // Prevent infinite recursion and overly deep scanning\n if (depth > 5) {\n return [];\n }\n\n try {\n if (!await storage.exists(currentDir) || !await storage.isDirectory(currentDir)) {\n return [];\n }\n\n const items = await storage.listFiles(currentDir);\n const foundPaths: string[] = [];\n\n // Check for package.json in current directory\n if (items.includes('package.json')) {\n const packageJsonPath = path.join(currentDir, 'package.json');\n foundPaths.push(packageJsonPath);\n }\n\n // Process subdirectories in parallel\n const subdirPromises: Promise<string[]>[] = [];\n for (const item of items) {\n if (EXCLUDED_DIRECTORIES.includes(item)) {\n continue;\n }\n\n const itemPath = path.join(currentDir, item);\n subdirPromises.push(\n (async () => {\n try {\n if (await storage.isDirectory(itemPath)) {\n return await scanForPaths(itemPath, depth + 1);\n }\n } catch (error: any) {\n logger.debug(`Skipped directory ${itemPath}: ${error.message}`);\n }\n return [];\n })()\n );\n }\n\n if (subdirPromises.length > 0) {\n const subdirResults = await Promise.all(subdirPromises);\n for (const subdirPaths of subdirResults) {\n foundPaths.push(...subdirPaths);\n }\n }\n\n return foundPaths;\n } catch (error: any) {\n logger.debug(`Failed to scan directory ${currentDir}: ${error.message}`);\n return [];\n }\n };\n\n const pathsTimer = PerformanceTimer.start(logger, 'Finding all package.json paths');\n const allPaths = await scanForPaths(rootDir);\n pathsTimer.end(`Found ${allPaths.length} package.json file paths`);\n\n // Phase 2: Batch read all package.json files in parallel\n const packageJsonFiles = await batchReadPackageJsonFiles(allPaths, storage, rootDir);\n\n timer.end(`Found ${packageJsonFiles.length} valid package.json files`);\n return packageJsonFiles;\n};\n\n// Optimized package scanning with parallel processing\nexport const scanDirectoryForPackages = async (rootDir: string, storage: any): Promise<Map<string, string>> => {\n const logger = getLogger();\n const timer = PerformanceTimer.start(logger, `Optimized package scanning: ${rootDir}`);\n const packageMap = new Map<string, string>(); // packageName -> relativePath\n\n const absoluteRootDir = path.resolve(process.cwd(), rootDir);\n logger.verbose(`Scanning directory for packages: ${absoluteRootDir}`);\n\n try {\n // Quick existence and directory check\n const existsTimer = PerformanceTimer.start(logger, `Checking directory: ${absoluteRootDir}`);\n if (!await storage.exists(absoluteRootDir) || !await storage.isDirectory(absoluteRootDir)) {\n existsTimer.end(`Directory not found or not a directory: ${absoluteRootDir}`);\n timer.end(`Directory invalid: ${rootDir}`);\n return packageMap;\n }\n existsTimer.end(`Directory verified: ${absoluteRootDir}`);\n\n // Get all items and process in parallel\n const listTimer = PerformanceTimer.start(logger, `Listing contents: ${absoluteRootDir}`);\n const items = await storage.listFiles(absoluteRootDir);\n listTimer.end(`Listed ${items.length} items`);\n\n // Create batched promises for better performance\n const BATCH_SIZE = 10; // Process directories in batches to avoid overwhelming filesystem\n const batches = [];\n\n for (let i = 0; i < items.length; i += BATCH_SIZE) {\n const batch = items.slice(i, i + BATCH_SIZE);\n batches.push(batch);\n }\n\n const processTimer = PerformanceTimer.start(logger, `Processing ${batches.length} batches of directories`);\n\n for (const batch of batches) {\n const batchPromises = batch.map(async (item: string) => {\n const itemPath = path.join(absoluteRootDir, item);\n try {\n if (await storage.isDirectory(itemPath)) {\n const packageJsonPath = path.join(itemPath, 'package.json');\n\n if (await storage.exists(packageJsonPath)) {\n const packageJsonContent = await storage.readFile(packageJsonPath, 'utf-8');\n const parsed = safeJsonParse(packageJsonContent, packageJsonPath);\n const packageJson = validatePackageJson(parsed, packageJsonPath);\n\n if (packageJson.name) {\n const relativePath = path.relative(process.cwd(), itemPath);\n return { name: packageJson.name, path: relativePath };\n }\n }\n }\n } catch (error: any) {\n logger.debug(`Skipped ${itemPath}: ${error.message || error}`);\n }\n return null;\n });\n\n const batchResults = await Promise.all(batchPromises);\n\n for (const result of batchResults) {\n if (result) {\n packageMap.set(result.name, result.path);\n logger.debug(`Found package: ${result.name} at ${result.path}`);\n }\n }\n }\n\n processTimer.end(`Processed ${items.length} directories in ${batches.length} batches`);\n logger.verbose(`Found ${packageMap.size} packages in ${items.length} subdirectories`);\n } catch (error) {\n logger.warn(`Failed to read directory ${absoluteRootDir}: ${error}`);\n }\n\n timer.end(`Found ${packageMap.size} packages in: ${rootDir}`);\n return packageMap;\n};\n\n// Parallel scope processing for better performance\nexport const findPackagesByScope = async (\n dependencies: Record<string, string>,\n scopeRoots: Record<string, string>,\n storage: any\n): Promise<Map<string, string>> => {\n const logger = getLogger();\n const timer = PerformanceTimer.start(logger, 'Finding packages by scope (optimized)');\n const workspacePackages = new Map<string, string>();\n\n logger.silly(`Checking dependencies against scope roots: ${JSON.stringify(scopeRoots)}`);\n\n // Process all scopes in parallel for maximum performance\n const scopeTimer = PerformanceTimer.start(logger, 'Parallel scope scanning');\n const scopePromises = Object.entries(scopeRoots).map(async ([scope, rootDir]) => {\n logger.verbose(`Scanning scope ${scope} at root directory: ${rootDir}`);\n const scopePackages = await scanDirectoryForPackages(rootDir, storage);\n\n // Filter packages that match the scope\n const matchingPackages: Array<[string, string]> = [];\n for (const [packageName, packagePath] of scopePackages) {\n if (packageName.startsWith(scope)) {\n matchingPackages.push([packageName, packagePath]);\n logger.debug(`Registered package: ${packageName} -> ${packagePath}`);\n }\n }\n return { scope, packages: matchingPackages };\n });\n\n const allScopeResults = await Promise.all(scopePromises);\n\n // Aggregate all packages from all scopes\n const allPackages = new Map<string, string>();\n for (const { scope, packages } of allScopeResults) {\n for (const [packageName, packagePath] of packages) {\n allPackages.set(packageName, packagePath);\n }\n }\n\n scopeTimer.end(`Scanned ${Object.keys(scopeRoots).length} scope roots, found ${allPackages.size} packages`);\n\n // Match dependencies to available packages\n const matchTimer = PerformanceTimer.start(logger, 'Matching dependencies to packages');\n for (const [depName, depVersion] of Object.entries(dependencies)) {\n logger.debug(`Processing dependency: ${depName}@${depVersion}`);\n\n if (allPackages.has(depName)) {\n const packagePath = allPackages.get(depName)!;\n workspacePackages.set(depName, packagePath);\n logger.verbose(`Found sibling package: ${depName} at ${packagePath}`);\n }\n }\n matchTimer.end(`Matched ${workspacePackages.size} dependencies to workspace packages`);\n\n timer.end(`Found ${workspacePackages.size} packages to link`);\n return workspacePackages;\n};\n\n// Utility to collect all dependencies from package.json files efficiently\nexport const collectAllDependencies = (packageJsonFiles: PackageJsonLocation[]): Record<string, string> => {\n const logger = getLogger();\n const timer = PerformanceTimer.start(logger, 'Collecting all dependencies');\n\n const allDependencies: Record<string, string> = {};\n for (const { packageJson } of packageJsonFiles) {\n Object.assign(allDependencies, packageJson.dependencies);\n Object.assign(allDependencies, packageJson.devDependencies);\n Object.assign(allDependencies, packageJson.peerDependencies);\n }\n\n timer.end(`Collected ${Object.keys(allDependencies).length} unique dependencies`);\n return allDependencies;\n};\n\n// Utility to check for file: dependencies\nexport const checkForFileDependencies = (packageJsonFiles: PackageJsonLocation[]): void => {\n const logger = getLogger();\n const timer = PerformanceTimer.start(logger, 'Checking for file: dependencies');\n const filesWithFileDepedencies: Array<{path: string, dependencies: string[]}> = [];\n\n for (const { path: packagePath, packageJson, relativePath } of packageJsonFiles) {\n const fileDeps: string[] = [];\n\n // Check all dependency types for file: paths\n const allDeps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n ...packageJson.peerDependencies\n };\n\n for (const [name, version] of Object.entries(allDeps)) {\n if (version.startsWith('file:')) {\n fileDeps.push(`${name}: ${version}`);\n }\n }\n\n if (fileDeps.length > 0) {\n filesWithFileDepedencies.push({\n path: relativePath,\n dependencies: fileDeps\n });\n }\n }\n\n if (filesWithFileDepedencies.length > 0) {\n logger.warn('⚠️ WARNING: Found file: dependencies that should not be committed:');\n for (const file of filesWithFileDepedencies) {\n logger.warn(` 📄 ${file.path}:`);\n for (const dep of file.dependencies) {\n logger.warn(` - ${dep}`);\n }\n }\n logger.warn('');\n logger.warn('💡 Remember to run \"kodrdriv unlink\" before committing to restore registry versions!');\n logger.warn(' Or add a pre-commit hook to prevent accidental commits of linked dependencies.');\n }\n\n timer.end(`Checked ${packageJsonFiles.length} files, found ${filesWithFileDepedencies.length} with file: dependencies`);\n};\n"],"names":["PerformanceTimer","start","logger","operation","verbose","end","duration","Date","now","startTime","EXCLUDED_DIRECTORIES","batchReadPackageJsonFiles","packageJsonPaths","storage","rootDir","getLogger","timer","length","readPromises","map","packageJsonPath","packageJsonContent","readFile","parsed","safeJsonParse","packageJson","validatePackageJson","relativePath","path","relative","dirname","error","debug","message","results","Promise","all","validResults","filter","result","findAllPackageJsonFiles","scanForPaths","currentDir","depth","exists","isDirectory","items","listFiles","foundPaths","includes","join","push","subdirPromises","item","itemPath","subdirResults","subdirPaths","pathsTimer","allPaths","packageJsonFiles"],"mappings":"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"}
1
+ {"version":3,"file":"performance.js","sources":["../../src/util/performance.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\nimport path from 'path';\nimport { getLogger } from '../logging';\nimport { safeJsonParse, validatePackageJson } from '@eldrforge/git-tools';\n\n// Performance timing helper\nexport class PerformanceTimer {\n private startTime: number;\n private logger: any;\n\n constructor(logger: any) {\n this.logger = logger;\n this.startTime = Date.now();\n }\n\n static start(logger: any, operation: string): PerformanceTimer {\n logger.verbose(`⏱️ Starting: ${operation}`);\n return new PerformanceTimer(logger);\n }\n\n end(operation: string): number {\n const duration = Date.now() - this.startTime;\n this.logger.verbose(`⏱️ Completed: ${operation} (${duration}ms)`);\n return duration;\n }\n}\n\nexport interface PackageJson {\n name?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n}\n\nexport interface PackageJsonLocation {\n path: string;\n packageJson: PackageJson;\n relativePath: string;\n}\n\nconst EXCLUDED_DIRECTORIES = [\n 'node_modules',\n 'dist',\n 'build',\n 'coverage',\n '.git',\n '.next',\n '.nuxt',\n 'out',\n 'public',\n 'static',\n 'assets'\n];\n\n// Batch read multiple package.json files in parallel\nexport const batchReadPackageJsonFiles = async (\n packageJsonPaths: string[],\n storage: any,\n rootDir: string\n): Promise<PackageJsonLocation[]> => {\n const logger = getLogger();\n const timer = PerformanceTimer.start(logger, `Batch reading ${packageJsonPaths.length} package.json files`);\n\n const readPromises = packageJsonPaths.map(async (packageJsonPath): Promise<PackageJsonLocation | null> => {\n try {\n const packageJsonContent = await storage.readFile(packageJsonPath, 'utf-8');\n const parsed = safeJsonParse(packageJsonContent, packageJsonPath);\n const packageJson = validatePackageJson(parsed, packageJsonPath, false);\n const relativePath = path.relative(rootDir, path.dirname(packageJsonPath));\n\n return {\n path: packageJsonPath,\n packageJson,\n relativePath: relativePath || '.'\n };\n } catch (error: any) {\n logger.debug(`Skipped invalid package.json at ${packageJsonPath}: ${error.message}`);\n return null;\n }\n });\n\n const results = await Promise.all(readPromises);\n const validResults = results.filter((result): result is PackageJsonLocation => result !== null);\n\n timer.end(`Successfully read ${validResults.length}/${packageJsonPaths.length} package.json files`);\n return validResults;\n};\n\n// Optimized recursive package.json finder with parallel processing\nexport const findAllPackageJsonFiles = async (rootDir: string, storage: any): Promise<PackageJsonLocation[]> => {\n const logger = getLogger();\n const timer = PerformanceTimer.start(logger, 'Optimized scanning for package.json files');\n\n // Phase 1: Find all package.json file paths in parallel\n const packageJsonPaths: string[] = [];\n\n const scanForPaths = async (currentDir: string, depth: number = 0): Promise<string[]> => {\n // Prevent infinite recursion and overly deep scanning\n if (depth > 5) {\n return [];\n }\n\n try {\n if (!await storage.exists(currentDir) || !await storage.isDirectory(currentDir)) {\n return [];\n }\n\n const items = await storage.listFiles(currentDir);\n const foundPaths: string[] = [];\n\n // Check for package.json in current directory\n if (items.includes('package.json')) {\n const packageJsonPath = path.join(currentDir, 'package.json');\n foundPaths.push(packageJsonPath);\n }\n\n // Process subdirectories in parallel\n const subdirPromises: Promise<string[]>[] = [];\n for (const item of items) {\n if (EXCLUDED_DIRECTORIES.includes(item)) {\n continue;\n }\n\n const itemPath = path.join(currentDir, item);\n subdirPromises.push(\n (async () => {\n try {\n if (await storage.isDirectory(itemPath)) {\n return await scanForPaths(itemPath, depth + 1);\n }\n } catch (error: any) {\n logger.debug(`Skipped directory ${itemPath}: ${error.message}`);\n }\n return [];\n })()\n );\n }\n\n if (subdirPromises.length > 0) {\n const subdirResults = await Promise.all(subdirPromises);\n for (const subdirPaths of subdirResults) {\n foundPaths.push(...subdirPaths);\n }\n }\n\n return foundPaths;\n } catch (error: any) {\n logger.debug(`Failed to scan directory ${currentDir}: ${error.message}`);\n return [];\n }\n };\n\n const pathsTimer = PerformanceTimer.start(logger, 'Finding all package.json paths');\n const allPaths = await scanForPaths(rootDir);\n pathsTimer.end(`Found ${allPaths.length} package.json file paths`);\n\n // Phase 2: Batch read all package.json files in parallel\n const packageJsonFiles = await batchReadPackageJsonFiles(allPaths, storage, rootDir);\n\n timer.end(`Found ${packageJsonFiles.length} valid package.json files`);\n return packageJsonFiles;\n};\n\n// Optimized package scanning with parallel processing\nexport const scanDirectoryForPackages = async (rootDir: string, storage: any): Promise<Map<string, string>> => {\n const logger = getLogger();\n const timer = PerformanceTimer.start(logger, `Optimized package scanning: ${rootDir}`);\n const packageMap = new Map<string, string>(); // packageName -> relativePath\n\n const absoluteRootDir = path.resolve(process.cwd(), rootDir);\n logger.verbose(`Scanning directory for packages: ${absoluteRootDir}`);\n\n try {\n // Quick existence and directory check\n const existsTimer = PerformanceTimer.start(logger, `Checking directory: ${absoluteRootDir}`);\n if (!await storage.exists(absoluteRootDir) || !await storage.isDirectory(absoluteRootDir)) {\n existsTimer.end(`Directory not found or not a directory: ${absoluteRootDir}`);\n timer.end(`Directory invalid: ${rootDir}`);\n return packageMap;\n }\n existsTimer.end(`Directory verified: ${absoluteRootDir}`);\n\n // Get all items and process in parallel\n const listTimer = PerformanceTimer.start(logger, `Listing contents: ${absoluteRootDir}`);\n const items = await storage.listFiles(absoluteRootDir);\n listTimer.end(`Listed ${items.length} items`);\n\n // Create batched promises for better performance\n const BATCH_SIZE = 10; // Process directories in batches to avoid overwhelming filesystem\n const batches = [];\n\n for (let i = 0; i < items.length; i += BATCH_SIZE) {\n const batch = items.slice(i, i + BATCH_SIZE);\n batches.push(batch);\n }\n\n const processTimer = PerformanceTimer.start(logger, `Processing ${batches.length} batches of directories`);\n\n for (const batch of batches) {\n const batchPromises = batch.map(async (item: string) => {\n const itemPath = path.join(absoluteRootDir, item);\n try {\n if (await storage.isDirectory(itemPath)) {\n const packageJsonPath = path.join(itemPath, 'package.json');\n\n if (await storage.exists(packageJsonPath)) {\n const packageJsonContent = await storage.readFile(packageJsonPath, 'utf-8');\n const parsed = safeJsonParse(packageJsonContent, packageJsonPath);\n const packageJson = validatePackageJson(parsed, packageJsonPath);\n\n if (packageJson.name) {\n const relativePath = path.relative(process.cwd(), itemPath);\n return { name: packageJson.name, path: relativePath };\n }\n }\n }\n } catch (error: any) {\n logger.debug(`Skipped ${itemPath}: ${error.message || error}`);\n }\n return null;\n });\n\n const batchResults = await Promise.all(batchPromises);\n\n for (const result of batchResults) {\n if (result) {\n packageMap.set(result.name, result.path);\n logger.debug(`Found package: ${result.name} at ${result.path}`);\n }\n }\n }\n\n processTimer.end(`Processed ${items.length} directories in ${batches.length} batches`);\n logger.verbose(`Found ${packageMap.size} packages in ${items.length} subdirectories`);\n } catch (error) {\n logger.warn(`PERFORMANCE_DIR_READ_FAILED: Unable to read directory | Directory: ${absoluteRootDir} | Error: ${error}`);\n }\n\n timer.end(`Found ${packageMap.size} packages in: ${rootDir}`);\n return packageMap;\n};\n\n// Parallel scope processing for better performance\nexport const findPackagesByScope = async (\n dependencies: Record<string, string>,\n scopeRoots: Record<string, string>,\n storage: any\n): Promise<Map<string, string>> => {\n const logger = getLogger();\n const timer = PerformanceTimer.start(logger, 'Finding packages by scope (optimized)');\n const workspacePackages = new Map<string, string>();\n\n logger.silly(`Checking dependencies against scope roots: ${JSON.stringify(scopeRoots)}`);\n\n // Process all scopes in parallel for maximum performance\n const scopeTimer = PerformanceTimer.start(logger, 'Parallel scope scanning');\n const scopePromises = Object.entries(scopeRoots).map(async ([scope, rootDir]) => {\n logger.verbose(`Scanning scope ${scope} at root directory: ${rootDir}`);\n const scopePackages = await scanDirectoryForPackages(rootDir, storage);\n\n // Filter packages that match the scope\n const matchingPackages: Array<[string, string]> = [];\n for (const [packageName, packagePath] of scopePackages) {\n if (packageName.startsWith(scope)) {\n matchingPackages.push([packageName, packagePath]);\n logger.debug(`Registered package: ${packageName} -> ${packagePath}`);\n }\n }\n return { scope, packages: matchingPackages };\n });\n\n const allScopeResults = await Promise.all(scopePromises);\n\n // Aggregate all packages from all scopes\n const allPackages = new Map<string, string>();\n for (const { scope, packages } of allScopeResults) {\n for (const [packageName, packagePath] of packages) {\n allPackages.set(packageName, packagePath);\n }\n }\n\n scopeTimer.end(`Scanned ${Object.keys(scopeRoots).length} scope roots, found ${allPackages.size} packages`);\n\n // Match dependencies to available packages\n const matchTimer = PerformanceTimer.start(logger, 'Matching dependencies to packages');\n for (const [depName, depVersion] of Object.entries(dependencies)) {\n logger.debug(`Processing dependency: ${depName}@${depVersion}`);\n\n if (allPackages.has(depName)) {\n const packagePath = allPackages.get(depName)!;\n workspacePackages.set(depName, packagePath);\n logger.verbose(`Found sibling package: ${depName} at ${packagePath}`);\n }\n }\n matchTimer.end(`Matched ${workspacePackages.size} dependencies to workspace packages`);\n\n timer.end(`Found ${workspacePackages.size} packages to link`);\n return workspacePackages;\n};\n\n// Utility to collect all dependencies from package.json files efficiently\nexport const collectAllDependencies = (packageJsonFiles: PackageJsonLocation[]): Record<string, string> => {\n const logger = getLogger();\n const timer = PerformanceTimer.start(logger, 'Collecting all dependencies');\n\n const allDependencies: Record<string, string> = {};\n for (const { packageJson } of packageJsonFiles) {\n Object.assign(allDependencies, packageJson.dependencies);\n Object.assign(allDependencies, packageJson.devDependencies);\n Object.assign(allDependencies, packageJson.peerDependencies);\n }\n\n timer.end(`Collected ${Object.keys(allDependencies).length} unique dependencies`);\n return allDependencies;\n};\n\n// Utility to check for file: dependencies\nexport const checkForFileDependencies = (packageJsonFiles: PackageJsonLocation[]): void => {\n const logger = getLogger();\n const timer = PerformanceTimer.start(logger, 'Checking for file: dependencies');\n const filesWithFileDepedencies: Array<{path: string, dependencies: string[]}> = [];\n\n for (const { path: packagePath, packageJson, relativePath } of packageJsonFiles) {\n const fileDeps: string[] = [];\n\n // Check all dependency types for file: paths\n const allDeps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n ...packageJson.peerDependencies\n };\n\n for (const [name, version] of Object.entries(allDeps)) {\n if (version.startsWith('file:')) {\n fileDeps.push(`${name}: ${version}`);\n }\n }\n\n if (fileDeps.length > 0) {\n filesWithFileDepedencies.push({\n path: relativePath,\n dependencies: fileDeps\n });\n }\n }\n\n if (filesWithFileDepedencies.length > 0) {\n logger.warn('FILE_DEPS_WARNING: Found file: dependencies that should not be committed | Count: ' + filesWithFileDepedencies.length + ' | Impact: May cause build issues');\n for (const file of filesWithFileDepedencies) {\n logger.warn(`FILE_DEPS_PACKAGE: Package with file dependencies | Path: ${file.path}`);\n for (const dep of file.dependencies) {\n logger.warn(`FILE_DEPS_DETAIL: File dependency detected | Dependency: ${dep}`);\n }\n }\n logger.warn('');\n logger.warn('FILE_DEPS_RESOLUTION: Action required before committing | Command: kodrdriv unlink | Purpose: Restore registry versions');\n logger.warn('FILE_DEPS_PREVENTION: Alternative option | Action: Add pre-commit hook | Purpose: Prevent accidental commits of linked dependencies');\n }\n\n timer.end(`Checked ${packageJsonFiles.length} files, found ${filesWithFileDepedencies.length} with file: dependencies`);\n};\n"],"names":["PerformanceTimer","start","logger","operation","verbose","end","duration","Date","now","startTime","EXCLUDED_DIRECTORIES","batchReadPackageJsonFiles","packageJsonPaths","storage","rootDir","getLogger","timer","length","readPromises","map","packageJsonPath","packageJsonContent","readFile","parsed","safeJsonParse","packageJson","validatePackageJson","relativePath","path","relative","dirname","error","debug","message","results","Promise","all","validResults","filter","result","findAllPackageJsonFiles","scanForPaths","currentDir","depth","exists","isDirectory","items","listFiles","foundPaths","includes","join","push","subdirPromises","item","itemPath","subdirResults","subdirPaths","pathsTimer","allPaths","packageJsonFiles"],"mappings":"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"}
@@ -131,11 +131,11 @@ const findAllPackageJsonFiles = async (rootDir, storage)=>{
131
131
  if (issues.length === 0) {
132
132
  return;
133
133
  }
134
- logger.warn(`⚠️ WARNING: Found file: dependencies that should not be committed during ${context}:`);
134
+ logger.warn(`FILE_DEPS_WARNING: Found file: dependencies that should not be committed | Context: ${context} | Count: ${issues.length} | Impact: May cause build issues`);
135
135
  for (const issue of issues){
136
- logger.warn(` 📄 ${issue.packagePath}:`);
136
+ logger.warn(`FILE_DEPS_PACKAGE: Package with file dependencies | Package: ${issue.packagePath}`);
137
137
  for (const dep of issue.dependencies){
138
- logger.warn(` - ${dep.name}: ${dep.version} (${dep.dependencyType})`);
138
+ logger.warn(`FILE_DEPS_DETAIL: Dependency details | Name: ${dep.name} | Version: ${dep.version} | Type: ${dep.dependencyType}`);
139
139
  }
140
140
  }
141
141
  logger.warn('');
@@ -145,20 +145,20 @@ const findAllPackageJsonFiles = async (rootDir, storage)=>{
145
145
  * @param hasUnlinkCapability Whether the current context supports unlinking
146
146
  */ const logFileDependencySuggestions = (hasUnlinkCapability = true)=>{
147
147
  const logger = getLogger();
148
- logger.warn('💡 To resolve this:');
148
+ logger.warn('FILE_DEPS_RESOLUTION: Steps to resolve file dependency issues:');
149
149
  if (hasUnlinkCapability) {
150
- logger.warn(' 1. Run "kodrdriv unlink" to restore registry versions');
151
- logger.warn(' 2. Complete your commit');
152
- logger.warn(' 3. Run "kodrdriv link" again for local development');
150
+ logger.warn(' STEP_1: Restore registry versions | Command: kodrdriv unlink');
151
+ logger.warn(' STEP_2: Complete commit operation | Command: git commit');
152
+ logger.warn(' STEP_3: Restore local development links | Command: kodrdriv link');
153
153
  } else {
154
- logger.warn(' 1. Manually restore registry versions in package.json files');
155
- logger.warn(' 2. Complete your commit');
156
- logger.warn(' 3. Re-link your local dependencies');
154
+ logger.warn(' STEP_1: Manually restore registry versions in package.json files');
155
+ logger.warn(' STEP_2: Complete commit operation | Command: git commit');
156
+ logger.warn(' STEP_3: Re-link local dependencies for development');
157
157
  }
158
158
  logger.warn('');
159
- logger.warn(' Or to bypass this check:');
160
- logger.warn(' - Add --skip-file-check flag to your command');
161
- logger.warn(' - Or use git commit --no-verify to skip all hooks');
159
+ logger.warn('FILE_DEPS_BYPASS: Alternative bypass options:');
160
+ logger.warn(' OPTION_1: Skip file check | Flag: --skip-file-check');
161
+ logger.warn(' OPTION_2: Skip all hooks | Command: git commit --no-verify');
162
162
  logger.warn('');
163
163
  };
164
164
 
@@ -1 +1 @@
1
- {"version":3,"file":"safety.js","sources":["../../src/util/safety.ts"],"sourcesContent":["import path from 'path';\nimport { getLogger } from '../logging';\nimport { safeJsonParse, validatePackageJson } from '@eldrforge/git-tools';\n\ninterface PackageJson {\n name?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n}\n\ninterface PackageJsonLocation {\n path: string;\n packageJson: PackageJson;\n relativePath: string;\n}\n\ninterface FileDependencyIssue {\n packagePath: string;\n dependencies: Array<{\n name: string;\n version: string;\n dependencyType: 'dependencies' | 'devDependencies' | 'peerDependencies';\n }>;\n}\n\nconst EXCLUDED_DIRECTORIES = [\n 'node_modules',\n 'dist',\n 'build',\n 'coverage',\n '.git',\n '.next',\n '.nuxt',\n 'out',\n 'public',\n 'static',\n 'assets'\n];\n\nconst findAllPackageJsonFiles = async (rootDir: string, storage: any): Promise<PackageJsonLocation[]> => {\n const logger = getLogger();\n const packageJsonFiles: PackageJsonLocation[] = [];\n\n const scanDirectory = async (currentDir: string, depth: number = 0): Promise<void> => {\n // Prevent infinite recursion and overly deep scanning\n if (depth > 5) {\n return;\n }\n\n try {\n if (!await storage.exists(currentDir) || !await storage.isDirectory(currentDir)) {\n return;\n }\n\n const items = await storage.listFiles(currentDir);\n\n // Check for package.json in current directory\n if (items.includes('package.json')) {\n const packageJsonPath = path.join(currentDir, 'package.json');\n try {\n const packageJsonContent = await storage.readFile(packageJsonPath, 'utf-8');\n const parsed = safeJsonParse(packageJsonContent, packageJsonPath);\n const packageJson = validatePackageJson(parsed, packageJsonPath);\n const relativePath = path.relative(rootDir, currentDir);\n\n packageJsonFiles.push({\n path: packageJsonPath,\n packageJson,\n relativePath: relativePath || '.'\n });\n\n logger.debug(`Found package.json at: ${relativePath || '.'}`);\n } catch (error: any) {\n logger.debug(`Skipped invalid package.json at ${packageJsonPath}: ${error.message}`);\n }\n }\n\n // Scan subdirectories, excluding build/generated directories\n for (const item of items) {\n if (EXCLUDED_DIRECTORIES.includes(item)) {\n continue;\n }\n\n const itemPath = path.join(currentDir, item);\n try {\n if (await storage.isDirectory(itemPath)) {\n await scanDirectory(itemPath, depth + 1);\n }\n } catch (error: any) {\n // Skip directories that can't be accessed\n logger.debug(`Skipped directory ${itemPath}: ${error.message}`);\n continue;\n }\n }\n } catch (error: any) {\n logger.debug(`Failed to scan directory ${currentDir}: ${error.message}`);\n }\n };\n\n await scanDirectory(rootDir);\n\n logger.debug(`Found ${packageJsonFiles.length} package.json file(s) in directory tree`);\n return packageJsonFiles;\n};\n\n/**\n * Checks for file: dependencies in package.json files that should not be committed\n * @param storage Storage utility instance\n * @param rootDir Root directory to scan (defaults to current working directory)\n * @returns Array of issues found, empty array if no issues\n */\nexport const checkForFileDependencies = async (storage: any, rootDir: string = process.cwd()): Promise<FileDependencyIssue[]> => {\n const logger = getLogger();\n const issues: FileDependencyIssue[] = [];\n\n try {\n const packageJsonFiles = await findAllPackageJsonFiles(rootDir, storage);\n\n for (const { packageJson, relativePath } of packageJsonFiles) {\n const fileDeps: Array<{name: string, version: string, dependencyType: 'dependencies' | 'devDependencies' | 'peerDependencies'}> = [];\n\n // Check all dependency types for file: paths\n const dependencyChecks = [\n { deps: packageJson.dependencies, type: 'dependencies' as const },\n { deps: packageJson.devDependencies, type: 'devDependencies' as const },\n { deps: packageJson.peerDependencies, type: 'peerDependencies' as const }\n ];\n\n for (const { deps, type } of dependencyChecks) {\n if (deps) {\n for (const [name, version] of Object.entries(deps)) {\n if (version.startsWith('file:')) {\n fileDeps.push({ name, version, dependencyType: type });\n }\n }\n }\n }\n\n if (fileDeps.length > 0) {\n issues.push({\n packagePath: relativePath,\n dependencies: fileDeps\n });\n }\n }\n } catch (error: any) {\n logger.debug(`Failed to check for file dependencies: ${error.message}`);\n }\n\n return issues;\n};\n\n/**\n * Logs file dependency issues in a user-friendly format\n * @param issues Array of file dependency issues\n * @param context Context for the warning (e.g., 'commit', 'link check')\n */\nexport const logFileDependencyWarning = (issues: FileDependencyIssue[], context: string = 'operation'): void => {\n const logger = getLogger();\n\n if (issues.length === 0) {\n return;\n }\n\n logger.warn(`⚠️ WARNING: Found file: dependencies that should not be committed during ${context}:`);\n for (const issue of issues) {\n logger.warn(` 📄 ${issue.packagePath}:`);\n for (const dep of issue.dependencies) {\n logger.warn(` - ${dep.name}: ${dep.version} (${dep.dependencyType})`);\n }\n }\n logger.warn('');\n};\n\n/**\n * Provides suggestions for resolving file dependency issues\n * @param hasUnlinkCapability Whether the current context supports unlinking\n */\nexport const logFileDependencySuggestions = (hasUnlinkCapability: boolean = true): void => {\n const logger = getLogger();\n\n logger.warn('💡 To resolve this:');\n if (hasUnlinkCapability) {\n logger.warn(' 1. Run \"kodrdriv unlink\" to restore registry versions');\n logger.warn(' 2. Complete your commit');\n logger.warn(' 3. Run \"kodrdriv link\" again for local development');\n } else {\n logger.warn(' 1. Manually restore registry versions in package.json files');\n logger.warn(' 2. Complete your commit');\n logger.warn(' 3. Re-link your local dependencies');\n }\n logger.warn('');\n logger.warn(' Or to bypass this check:');\n logger.warn(' - Add --skip-file-check flag to your command');\n logger.warn(' - Or use git commit --no-verify to skip all hooks');\n logger.warn('');\n};\n"],"names":["EXCLUDED_DIRECTORIES","findAllPackageJsonFiles","rootDir","storage","logger","getLogger","packageJsonFiles","scanDirectory","currentDir","depth","exists","isDirectory","items","listFiles","includes","packageJsonPath","path","join","packageJsonContent","readFile","parsed","safeJsonParse","packageJson","validatePackageJson","relativePath","relative","push","debug","error","message","item","itemPath","length","checkForFileDependencies","process","cwd","issues","fileDeps","dependencyChecks","deps","dependencies","type","devDependencies","peerDependencies","name","version","Object","entries","startsWith","dependencyType","packagePath","logFileDependencyWarning","context","warn","issue","dep","logFileDependencySuggestions","hasUnlinkCapability"],"mappings":";;;;AA0BA,MAAMA,oBAAAA,GAAuB;AACzB,IAAA,cAAA;AACA,IAAA,MAAA;AACA,IAAA,OAAA;AACA,IAAA,UAAA;AACA,IAAA,MAAA;AACA,IAAA,OAAA;AACA,IAAA,OAAA;AACA,IAAA,KAAA;AACA,IAAA,QAAA;AACA,IAAA,QAAA;AACA,IAAA;AACH,CAAA;AAED,MAAMC,uBAAAA,GAA0B,OAAOC,OAAAA,EAAiBC,OAAAA,GAAAA;AACpD,IAAA,MAAMC,MAAAA,GAASC,SAAAA,EAAAA;AACf,IAAA,MAAMC,mBAA0C,EAAE;AAElD,IAAA,MAAMC,aAAAA,GAAgB,OAAOC,UAAAA,EAAoBC,KAAAA,GAAgB,CAAC,GAAA;;AAE9D,QAAA,IAAIA,QAAQ,CAAA,EAAG;AACX,YAAA;AACJ,QAAA;QAEA,IAAI;YACA,IAAI,CAAC,MAAMN,OAAAA,CAAQO,MAAM,CAACF,UAAAA,CAAAA,IAAe,CAAC,MAAML,OAAAA,CAAQQ,WAAW,CAACH,UAAAA,CAAAA,EAAa;AAC7E,gBAAA;AACJ,YAAA;AAEA,YAAA,MAAMI,KAAAA,GAAQ,MAAMT,OAAAA,CAAQU,SAAS,CAACL,UAAAA,CAAAA;;YAGtC,IAAII,KAAAA,CAAME,QAAQ,CAAC,cAAA,CAAA,EAAiB;AAChC,gBAAA,MAAMC,eAAAA,GAAkBC,aAAAA,CAAKC,IAAI,CAACT,UAAAA,EAAY,cAAA,CAAA;gBAC9C,IAAI;AACA,oBAAA,MAAMU,kBAAAA,GAAqB,MAAMf,OAAAA,CAAQgB,QAAQ,CAACJ,eAAAA,EAAiB,OAAA,CAAA;oBACnE,MAAMK,MAAAA,GAASC,cAAcH,kBAAAA,EAAoBH,eAAAA,CAAAA;oBACjD,MAAMO,WAAAA,GAAcC,oBAAoBH,MAAAA,EAAQL,eAAAA,CAAAA;AAChD,oBAAA,MAAMS,YAAAA,GAAeR,aAAAA,CAAKS,QAAQ,CAACvB,OAAAA,EAASM,UAAAA,CAAAA;AAE5CF,oBAAAA,gBAAAA,CAAiBoB,IAAI,CAAC;wBAClBV,IAAAA,EAAMD,eAAAA;AACNO,wBAAAA,WAAAA;AACAE,wBAAAA,YAAAA,EAAcA,YAAAA,IAAgB;AAClC,qBAAA,CAAA;AAEApB,oBAAAA,MAAAA,CAAOuB,KAAK,CAAC,CAAC,uBAAuB,EAAEH,gBAAgB,GAAA,CAAA,CAAK,CAAA;AAChE,gBAAA,CAAA,CAAE,OAAOI,KAAAA,EAAY;oBACjBxB,MAAAA,CAAOuB,KAAK,CAAC,CAAC,gCAAgC,EAAEZ,gBAAgB,EAAE,EAAEa,KAAAA,CAAMC,OAAO,CAAA,CAAE,CAAA;AACvF,gBAAA;AACJ,YAAA;;YAGA,KAAK,MAAMC,QAAQlB,KAAAA,CAAO;gBACtB,IAAIZ,oBAAAA,CAAqBc,QAAQ,CAACgB,IAAAA,CAAAA,EAAO;AACrC,oBAAA;AACJ,gBAAA;AAEA,gBAAA,MAAMC,QAAAA,GAAWf,aAAAA,CAAKC,IAAI,CAACT,UAAAA,EAAYsB,IAAAA,CAAAA;gBACvC,IAAI;AACA,oBAAA,IAAI,MAAM3B,OAAAA,CAAQQ,WAAW,CAACoB,QAAAA,CAAAA,EAAW;wBACrC,MAAMxB,aAAAA,CAAcwB,UAAUtB,KAAAA,GAAQ,CAAA,CAAA;AAC1C,oBAAA;AACJ,gBAAA,CAAA,CAAE,OAAOmB,KAAAA,EAAY;;oBAEjBxB,MAAAA,CAAOuB,KAAK,CAAC,CAAC,kBAAkB,EAAEI,SAAS,EAAE,EAAEH,KAAAA,CAAMC,OAAO,CAAA,CAAE,CAAA;AAC9D,oBAAA;AACJ,gBAAA;AACJ,YAAA;AACJ,QAAA,CAAA,CAAE,OAAOD,KAAAA,EAAY;YACjBxB,MAAAA,CAAOuB,KAAK,CAAC,CAAC,yBAAyB,EAAEnB,WAAW,EAAE,EAAEoB,KAAAA,CAAMC,OAAO,CAAA,CAAE,CAAA;AAC3E,QAAA;AACJ,IAAA,CAAA;AAEA,IAAA,MAAMtB,aAAAA,CAAcL,OAAAA,CAAAA;IAEpBE,MAAAA,CAAOuB,KAAK,CAAC,CAAC,MAAM,EAAErB,gBAAAA,CAAiB0B,MAAM,CAAC,uCAAuC,CAAC,CAAA;IACtF,OAAO1B,gBAAAA;AACX,CAAA;AAEA;;;;;UAMa2B,wBAAAA,GAA2B,OAAO9B,SAAcD,OAAAA,GAAkBgC,OAAAA,CAAQC,GAAG,EAAE,GAAA;AACxF,IAAA,MAAM/B,MAAAA,GAASC,SAAAA,EAAAA;AACf,IAAA,MAAM+B,SAAgC,EAAE;IAExC,IAAI;QACA,MAAM9B,gBAAAA,GAAmB,MAAML,uBAAAA,CAAwBC,OAAAA,EAASC,OAAAA,CAAAA;AAEhE,QAAA,KAAK,MAAM,EAAEmB,WAAW,EAAEE,YAAY,EAAE,IAAIlB,gBAAAA,CAAkB;AAC1D,YAAA,MAAM+B,WAA4H,EAAE;;AAGpI,YAAA,MAAMC,gBAAAA,GAAmB;AACrB,gBAAA;AAAEC,oBAAAA,IAAAA,EAAMjB,YAAYkB,YAAY;oBAAEC,IAAAA,EAAM;AAAwB,iBAAA;AAChE,gBAAA;AAAEF,oBAAAA,IAAAA,EAAMjB,YAAYoB,eAAe;oBAAED,IAAAA,EAAM;AAA2B,iBAAA;AACtE,gBAAA;AAAEF,oBAAAA,IAAAA,EAAMjB,YAAYqB,gBAAgB;oBAAEF,IAAAA,EAAM;AAA4B;AAC3E,aAAA;AAED,YAAA,KAAK,MAAM,EAAEF,IAAI,EAAEE,IAAI,EAAE,IAAIH,gBAAAA,CAAkB;AAC3C,gBAAA,IAAIC,IAAAA,EAAM;oBACN,KAAK,MAAM,CAACK,IAAAA,EAAMC,OAAAA,CAAQ,IAAIC,MAAAA,CAAOC,OAAO,CAACR,IAAAA,CAAAA,CAAO;wBAChD,IAAIM,OAAAA,CAAQG,UAAU,CAAC,OAAA,CAAA,EAAU;AAC7BX,4BAAAA,QAAAA,CAASX,IAAI,CAAC;AAAEkB,gCAAAA,IAAAA;AAAMC,gCAAAA,OAAAA;gCAASI,cAAAA,EAAgBR;AAAK,6BAAA,CAAA;AACxD,wBAAA;AACJ,oBAAA;AACJ,gBAAA;AACJ,YAAA;YAEA,IAAIJ,QAAAA,CAASL,MAAM,GAAG,CAAA,EAAG;AACrBI,gBAAAA,MAAAA,CAAOV,IAAI,CAAC;oBACRwB,WAAAA,EAAa1B,YAAAA;oBACbgB,YAAAA,EAAcH;AAClB,iBAAA,CAAA;AACJ,YAAA;AACJ,QAAA;AACJ,IAAA,CAAA,CAAE,OAAOT,KAAAA,EAAY;AACjBxB,QAAAA,MAAAA,CAAOuB,KAAK,CAAC,CAAC,uCAAuC,EAAEC,KAAAA,CAAMC,OAAO,CAAA,CAAE,CAAA;AAC1E,IAAA;IAEA,OAAOO,MAAAA;AACX;AAEA;;;;AAIC,IACM,MAAMe,wBAAAA,GAA2B,CAACf,MAAAA,EAA+BgB,UAAkB,WAAW,GAAA;AACjG,IAAA,MAAMhD,MAAAA,GAASC,SAAAA,EAAAA;IAEf,IAAI+B,MAAAA,CAAOJ,MAAM,KAAK,CAAA,EAAG;AACrB,QAAA;AACJ,IAAA;AAEA5B,IAAAA,MAAAA,CAAOiD,IAAI,CAAC,CAAC,0EAA0E,EAAED,OAAAA,CAAQ,CAAC,CAAC,CAAA;IACnG,KAAK,MAAME,SAASlB,MAAAA,CAAQ;QACxBhC,MAAAA,CAAOiD,IAAI,CAAC,CAAC,KAAK,EAAEC,KAAAA,CAAMJ,WAAW,CAAC,CAAC,CAAC,CAAA;AACxC,QAAA,KAAK,MAAMK,GAAAA,IAAOD,KAAAA,CAAMd,YAAY,CAAE;AAClCpC,YAAAA,MAAAA,CAAOiD,IAAI,CAAC,CAAC,MAAM,EAAEE,GAAAA,CAAIX,IAAI,CAAC,EAAE,EAAEW,GAAAA,CAAIV,OAAO,CAAC,EAAE,EAAEU,IAAIN,cAAc,CAAC,CAAC,CAAC,CAAA;AAC3E,QAAA;AACJ,IAAA;AACA7C,IAAAA,MAAAA,CAAOiD,IAAI,CAAC,EAAA,CAAA;AAChB;AAEA;;;AAGC,IACM,MAAMG,4BAAAA,GAA+B,CAACC,sBAA+B,IAAI,GAAA;AAC5E,IAAA,MAAMrD,MAAAA,GAASC,SAAAA,EAAAA;AAEfD,IAAAA,MAAAA,CAAOiD,IAAI,CAAC,qBAAA,CAAA;AACZ,IAAA,IAAII,mBAAAA,EAAqB;AACrBrD,QAAAA,MAAAA,CAAOiD,IAAI,CAAC,0DAAA,CAAA;AACZjD,QAAAA,MAAAA,CAAOiD,IAAI,CAAC,4BAAA,CAAA;AACZjD,QAAAA,MAAAA,CAAOiD,IAAI,CAAC,uDAAA,CAAA;IAChB,CAAA,MAAO;AACHjD,QAAAA,MAAAA,CAAOiD,IAAI,CAAC,gEAAA,CAAA;AACZjD,QAAAA,MAAAA,CAAOiD,IAAI,CAAC,4BAAA,CAAA;AACZjD,QAAAA,MAAAA,CAAOiD,IAAI,CAAC,uCAAA,CAAA;AAChB,IAAA;AACAjD,IAAAA,MAAAA,CAAOiD,IAAI,CAAC,EAAA,CAAA;AACZjD,IAAAA,MAAAA,CAAOiD,IAAI,CAAC,6BAAA,CAAA;AACZjD,IAAAA,MAAAA,CAAOiD,IAAI,CAAC,iDAAA,CAAA;AACZjD,IAAAA,MAAAA,CAAOiD,IAAI,CAAC,sDAAA,CAAA;AACZjD,IAAAA,MAAAA,CAAOiD,IAAI,CAAC,EAAA,CAAA;AAChB;;;;"}
1
+ {"version":3,"file":"safety.js","sources":["../../src/util/safety.ts"],"sourcesContent":["import path from 'path';\nimport { getLogger } from '../logging';\nimport { safeJsonParse, validatePackageJson } from '@eldrforge/git-tools';\n\ninterface PackageJson {\n name?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n}\n\ninterface PackageJsonLocation {\n path: string;\n packageJson: PackageJson;\n relativePath: string;\n}\n\ninterface FileDependencyIssue {\n packagePath: string;\n dependencies: Array<{\n name: string;\n version: string;\n dependencyType: 'dependencies' | 'devDependencies' | 'peerDependencies';\n }>;\n}\n\nconst EXCLUDED_DIRECTORIES = [\n 'node_modules',\n 'dist',\n 'build',\n 'coverage',\n '.git',\n '.next',\n '.nuxt',\n 'out',\n 'public',\n 'static',\n 'assets'\n];\n\nconst findAllPackageJsonFiles = async (rootDir: string, storage: any): Promise<PackageJsonLocation[]> => {\n const logger = getLogger();\n const packageJsonFiles: PackageJsonLocation[] = [];\n\n const scanDirectory = async (currentDir: string, depth: number = 0): Promise<void> => {\n // Prevent infinite recursion and overly deep scanning\n if (depth > 5) {\n return;\n }\n\n try {\n if (!await storage.exists(currentDir) || !await storage.isDirectory(currentDir)) {\n return;\n }\n\n const items = await storage.listFiles(currentDir);\n\n // Check for package.json in current directory\n if (items.includes('package.json')) {\n const packageJsonPath = path.join(currentDir, 'package.json');\n try {\n const packageJsonContent = await storage.readFile(packageJsonPath, 'utf-8');\n const parsed = safeJsonParse(packageJsonContent, packageJsonPath);\n const packageJson = validatePackageJson(parsed, packageJsonPath);\n const relativePath = path.relative(rootDir, currentDir);\n\n packageJsonFiles.push({\n path: packageJsonPath,\n packageJson,\n relativePath: relativePath || '.'\n });\n\n logger.debug(`Found package.json at: ${relativePath || '.'}`);\n } catch (error: any) {\n logger.debug(`Skipped invalid package.json at ${packageJsonPath}: ${error.message}`);\n }\n }\n\n // Scan subdirectories, excluding build/generated directories\n for (const item of items) {\n if (EXCLUDED_DIRECTORIES.includes(item)) {\n continue;\n }\n\n const itemPath = path.join(currentDir, item);\n try {\n if (await storage.isDirectory(itemPath)) {\n await scanDirectory(itemPath, depth + 1);\n }\n } catch (error: any) {\n // Skip directories that can't be accessed\n logger.debug(`Skipped directory ${itemPath}: ${error.message}`);\n continue;\n }\n }\n } catch (error: any) {\n logger.debug(`Failed to scan directory ${currentDir}: ${error.message}`);\n }\n };\n\n await scanDirectory(rootDir);\n\n logger.debug(`Found ${packageJsonFiles.length} package.json file(s) in directory tree`);\n return packageJsonFiles;\n};\n\n/**\n * Checks for file: dependencies in package.json files that should not be committed\n * @param storage Storage utility instance\n * @param rootDir Root directory to scan (defaults to current working directory)\n * @returns Array of issues found, empty array if no issues\n */\nexport const checkForFileDependencies = async (storage: any, rootDir: string = process.cwd()): Promise<FileDependencyIssue[]> => {\n const logger = getLogger();\n const issues: FileDependencyIssue[] = [];\n\n try {\n const packageJsonFiles = await findAllPackageJsonFiles(rootDir, storage);\n\n for (const { packageJson, relativePath } of packageJsonFiles) {\n const fileDeps: Array<{name: string, version: string, dependencyType: 'dependencies' | 'devDependencies' | 'peerDependencies'}> = [];\n\n // Check all dependency types for file: paths\n const dependencyChecks = [\n { deps: packageJson.dependencies, type: 'dependencies' as const },\n { deps: packageJson.devDependencies, type: 'devDependencies' as const },\n { deps: packageJson.peerDependencies, type: 'peerDependencies' as const }\n ];\n\n for (const { deps, type } of dependencyChecks) {\n if (deps) {\n for (const [name, version] of Object.entries(deps)) {\n if (version.startsWith('file:')) {\n fileDeps.push({ name, version, dependencyType: type });\n }\n }\n }\n }\n\n if (fileDeps.length > 0) {\n issues.push({\n packagePath: relativePath,\n dependencies: fileDeps\n });\n }\n }\n } catch (error: any) {\n logger.debug(`Failed to check for file dependencies: ${error.message}`);\n }\n\n return issues;\n};\n\n/**\n * Logs file dependency issues in a user-friendly format\n * @param issues Array of file dependency issues\n * @param context Context for the warning (e.g., 'commit', 'link check')\n */\nexport const logFileDependencyWarning = (issues: FileDependencyIssue[], context: string = 'operation'): void => {\n const logger = getLogger();\n\n if (issues.length === 0) {\n return;\n }\n\n logger.warn(`FILE_DEPS_WARNING: Found file: dependencies that should not be committed | Context: ${context} | Count: ${issues.length} | Impact: May cause build issues`);\n for (const issue of issues) {\n logger.warn(`FILE_DEPS_PACKAGE: Package with file dependencies | Package: ${issue.packagePath}`);\n for (const dep of issue.dependencies) {\n logger.warn(`FILE_DEPS_DETAIL: Dependency details | Name: ${dep.name} | Version: ${dep.version} | Type: ${dep.dependencyType}`);\n }\n }\n logger.warn('');\n};\n\n/**\n * Provides suggestions for resolving file dependency issues\n * @param hasUnlinkCapability Whether the current context supports unlinking\n */\nexport const logFileDependencySuggestions = (hasUnlinkCapability: boolean = true): void => {\n const logger = getLogger();\n\n logger.warn('FILE_DEPS_RESOLUTION: Steps to resolve file dependency issues:');\n if (hasUnlinkCapability) {\n logger.warn(' STEP_1: Restore registry versions | Command: kodrdriv unlink');\n logger.warn(' STEP_2: Complete commit operation | Command: git commit');\n logger.warn(' STEP_3: Restore local development links | Command: kodrdriv link');\n } else {\n logger.warn(' STEP_1: Manually restore registry versions in package.json files');\n logger.warn(' STEP_2: Complete commit operation | Command: git commit');\n logger.warn(' STEP_3: Re-link local dependencies for development');\n }\n logger.warn('');\n logger.warn('FILE_DEPS_BYPASS: Alternative bypass options:');\n logger.warn(' OPTION_1: Skip file check | Flag: --skip-file-check');\n logger.warn(' OPTION_2: Skip all hooks | Command: git commit --no-verify');\n logger.warn('');\n};\n"],"names":["EXCLUDED_DIRECTORIES","findAllPackageJsonFiles","rootDir","storage","logger","getLogger","packageJsonFiles","scanDirectory","currentDir","depth","exists","isDirectory","items","listFiles","includes","packageJsonPath","path","join","packageJsonContent","readFile","parsed","safeJsonParse","packageJson","validatePackageJson","relativePath","relative","push","debug","error","message","item","itemPath","length","checkForFileDependencies","process","cwd","issues","fileDeps","dependencyChecks","deps","dependencies","type","devDependencies","peerDependencies","name","version","Object","entries","startsWith","dependencyType","packagePath","logFileDependencyWarning","context","warn","issue","dep","logFileDependencySuggestions","hasUnlinkCapability"],"mappings":"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"}