@eldrforge/kodrdriv 1.2.14 → 1.2.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/publish.js +4 -56
- package/dist/commands/publish.js.map +1 -1
- package/dist/constants.js +5 -2
- package/dist/constants.js.map +1 -1
- package/dist/prompt/commit.js +3 -0
- package/dist/prompt/commit.js.map +1 -1
- package/dist/prompt/instructions/commit.md +87 -68
- package/dist/prompt/instructions/release.md +67 -21
- package/dist/util/git.js +91 -21
- package/dist/util/git.js.map +1 -1
- package/dist/util/openai.js +17 -2
- package/dist/util/openai.js.map +1 -1
- package/package.json +1 -1
package/dist/util/git.js
CHANGED
|
@@ -64,13 +64,14 @@ import { safeJsonParse, validatePackageJson } from './validation.js';
|
|
|
64
64
|
// Parse current version first to validate it
|
|
65
65
|
const currentSemver = semver.parse(currentVersion);
|
|
66
66
|
if (!currentSemver) {
|
|
67
|
-
logger.
|
|
67
|
+
logger.warn(`❌ Invalid version format: ${currentVersion}`);
|
|
68
68
|
return null;
|
|
69
69
|
}
|
|
70
|
-
logger.
|
|
70
|
+
logger.info(`🔍 findPreviousReleaseTag: Looking for tags matching "${tagPattern}" < ${currentVersion}`);
|
|
71
71
|
// Get all tags - try sorted first, fallback to unsorted
|
|
72
72
|
let tags;
|
|
73
73
|
try {
|
|
74
|
+
logger.info(` Running: git tag -l "${tagPattern}" --sort=-version:refname`);
|
|
74
75
|
const { stdout } = await runSecure('git', [
|
|
75
76
|
'tag',
|
|
76
77
|
'-l',
|
|
@@ -78,16 +79,21 @@ import { safeJsonParse, validatePackageJson } from './validation.js';
|
|
|
78
79
|
'--sort=-version:refname'
|
|
79
80
|
]);
|
|
80
81
|
tags = stdout.trim().split('\n').filter((tag)=>tag.length > 0);
|
|
81
|
-
logger.
|
|
82
|
-
|
|
82
|
+
logger.info(` ✅ Found ${tags.length} tags matching pattern "${tagPattern}"`);
|
|
83
|
+
if (tags.length > 0) {
|
|
84
|
+
logger.info(` 📋 Tags (newest first): ${tags.slice(0, 15).join(', ')}${tags.length > 15 ? ` ... (${tags.length - 15} more)` : ''}`);
|
|
85
|
+
}
|
|
86
|
+
} catch (sortError) {
|
|
83
87
|
// Fallback for older git versions that don't support --sort
|
|
84
|
-
logger.
|
|
88
|
+
logger.info(` ⚠️ Git tag --sort failed: ${sortError.message}`);
|
|
89
|
+
logger.info(` Falling back to manual sorting...`);
|
|
85
90
|
const { stdout } = await runSecure('git', [
|
|
86
91
|
'tag',
|
|
87
92
|
'-l',
|
|
88
93
|
tagPattern
|
|
89
94
|
]);
|
|
90
95
|
tags = stdout.trim().split('\n').filter((tag)=>tag.length > 0);
|
|
96
|
+
logger.info(` Found ${tags.length} tags (unsorted) matching pattern "${tagPattern}"`);
|
|
91
97
|
// Manual semantic version sorting
|
|
92
98
|
tags.sort((a, b)=>{
|
|
93
99
|
const aMatch = a.match(/v?(\d+\.\d+\.\d+.*?)$/);
|
|
@@ -98,12 +104,16 @@ import { safeJsonParse, validatePackageJson } from './validation.js';
|
|
|
98
104
|
if (!aSemver || !bSemver) return 0;
|
|
99
105
|
return semver.rcompare(aSemver, bSemver);
|
|
100
106
|
});
|
|
107
|
+
logger.info(` ✅ Sorted ${tags.length} tags manually`);
|
|
101
108
|
}
|
|
102
109
|
if (tags.length === 0) {
|
|
103
|
-
logger.
|
|
110
|
+
logger.warn('');
|
|
111
|
+
logger.warn(`❌ NO TAGS FOUND matching pattern "${tagPattern}"`);
|
|
112
|
+
logger.warn(` To verify, run: git tag -l '${tagPattern}'`);
|
|
113
|
+
logger.warn('');
|
|
104
114
|
return null;
|
|
105
115
|
}
|
|
106
|
-
logger.
|
|
116
|
+
logger.info(` 🔬 Processing ${tags.length} tags to find the highest version < ${currentVersion}...`);
|
|
107
117
|
// Find the highest version that is less than the current version
|
|
108
118
|
let previousTag = null;
|
|
109
119
|
let previousVersion = null;
|
|
@@ -113,33 +123,46 @@ import { safeJsonParse, validatePackageJson } from './validation.js';
|
|
|
113
123
|
// Extract version from tag - handle "v1.2.13", "1.2.13", and "working/v1.2.13"
|
|
114
124
|
const versionMatch = tag.match(/v?(\d+\.\d+\.\d+.*?)$/);
|
|
115
125
|
if (!versionMatch) {
|
|
116
|
-
logger.debug(`
|
|
126
|
+
logger.debug(` ⏭️ Skipping tag "${tag}" (doesn't match version pattern)`);
|
|
117
127
|
continue;
|
|
118
128
|
}
|
|
119
129
|
const versionString = versionMatch[1];
|
|
120
130
|
const tagSemver = semver.parse(versionString);
|
|
121
131
|
if (tagSemver) {
|
|
122
132
|
validTags++;
|
|
123
|
-
logger.debug(`Comparing tag ${tag} (${versionString}) with current ${currentVersion}`);
|
|
124
133
|
// Check if this tag version is less than current version
|
|
125
134
|
if (semver.lt(tagSemver, currentSemver)) {
|
|
126
135
|
// If we don't have a previous version yet, or this one is higher than our current previous
|
|
127
136
|
if (!previousVersion || semver.gt(tagSemver, previousVersion)) {
|
|
128
137
|
previousVersion = tagSemver;
|
|
129
138
|
previousTag = tag; // Keep the original tag format
|
|
130
|
-
logger.
|
|
139
|
+
logger.info(` ✅ New best candidate: ${tag} (${versionString} < ${currentVersion})`);
|
|
140
|
+
} else {
|
|
141
|
+
logger.debug(` ⏭️ ${tag} (${versionString}) is < current but not better than ${previousTag}`);
|
|
131
142
|
}
|
|
132
143
|
} else {
|
|
133
144
|
skippedTags++;
|
|
145
|
+
logger.debug(` ⏭️ ${tag} (${versionString}) >= current (${currentVersion}), skipping`);
|
|
134
146
|
}
|
|
135
147
|
}
|
|
136
148
|
}
|
|
137
|
-
logger.
|
|
149
|
+
logger.info('');
|
|
150
|
+
logger.info(` 📊 Tag analysis results:`);
|
|
151
|
+
logger.info(` - Total tags examined: ${tags.length}`);
|
|
152
|
+
logger.info(` - Valid semver tags: ${validTags}`);
|
|
153
|
+
logger.info(` - Tags >= current version (skipped): ${skippedTags}`);
|
|
154
|
+
logger.info(` - Best match: ${previousTag || 'none'}`);
|
|
155
|
+
logger.info('');
|
|
138
156
|
if (previousTag) {
|
|
139
|
-
logger.
|
|
157
|
+
logger.info(`✅ SUCCESS: Found previous tag: ${previousTag}`);
|
|
158
|
+
logger.info(` Version comparison: ${previousVersion === null || previousVersion === void 0 ? void 0 : previousVersion.version} < ${currentVersion}`);
|
|
159
|
+
logger.info('');
|
|
140
160
|
return previousTag;
|
|
141
161
|
}
|
|
142
|
-
logger.
|
|
162
|
+
logger.warn(`❌ FAILED: No previous tag found for version ${currentVersion}`);
|
|
163
|
+
logger.warn(` Pattern searched: "${tagPattern}"`);
|
|
164
|
+
logger.warn(` Reason: All ${validTags} valid tags were >= ${currentVersion}`);
|
|
165
|
+
logger.warn('');
|
|
143
166
|
return null;
|
|
144
167
|
} catch (error) {
|
|
145
168
|
logger.debug(`Error finding previous release tag: ${error.message}`);
|
|
@@ -201,28 +224,75 @@ import { safeJsonParse, validatePackageJson } from './validation.js';
|
|
|
201
224
|
* @throws Error if no valid reference can be found
|
|
202
225
|
*/ const getDefaultFromRef = async (forceMainBranch = false, currentBranch)=>{
|
|
203
226
|
const logger = getLogger();
|
|
227
|
+
logger.info('');
|
|
228
|
+
logger.info('═══════════════════════════════════════════════════════════');
|
|
229
|
+
logger.info('🔍 DETECTING DEFAULT --from REFERENCE FOR RELEASE NOTES');
|
|
230
|
+
logger.info('═══════════════════════════════════════════════════════════');
|
|
231
|
+
logger.info(`📋 Input parameters:`);
|
|
232
|
+
logger.info(` - forceMainBranch: ${forceMainBranch}`);
|
|
233
|
+
logger.info(` - currentBranch: "${currentBranch}"`);
|
|
234
|
+
logger.info('');
|
|
204
235
|
// If forced to use main branch, skip tag detection
|
|
205
236
|
if (forceMainBranch) {
|
|
206
|
-
logger.
|
|
237
|
+
logger.info('⚡ Forced to use main branch, skipping tag detection');
|
|
207
238
|
} else {
|
|
208
239
|
// If on working branch, look for working branch tags first
|
|
240
|
+
logger.info(`🎯 Branch check: currentBranch="${currentBranch}", isWorking=${currentBranch === 'working'}`);
|
|
209
241
|
if (currentBranch && currentBranch === 'working') {
|
|
242
|
+
logger.info('');
|
|
243
|
+
logger.info('📍 DETECTED WORKING BRANCH - Searching for working branch tags...');
|
|
244
|
+
logger.info('───────────────────────────────────────────────────────────');
|
|
210
245
|
try {
|
|
211
246
|
const currentVersion = await getCurrentVersion();
|
|
247
|
+
logger.info(`📦 Current version from package.json: ${currentVersion}`);
|
|
212
248
|
if (currentVersion) {
|
|
213
|
-
logger.
|
|
249
|
+
logger.info(`🔍 Searching for tags matching pattern: "working/v*"`);
|
|
250
|
+
logger.info(` (Looking for tags < ${currentVersion})`);
|
|
251
|
+
logger.info('');
|
|
214
252
|
const previousTag = await findPreviousReleaseTag(currentVersion, 'working/v*');
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
logger.info(
|
|
218
|
-
|
|
253
|
+
logger.info(`🎯 findPreviousReleaseTag result: ${previousTag || 'null (no tag found)'}`);
|
|
254
|
+
if (previousTag) {
|
|
255
|
+
logger.info(`🔬 Validating tag reference: "${previousTag}"`);
|
|
256
|
+
const isValid = await isValidGitRef(previousTag);
|
|
257
|
+
logger.info(` Tag is valid git ref: ${isValid}`);
|
|
258
|
+
if (isValid) {
|
|
259
|
+
logger.info('');
|
|
260
|
+
logger.info(`✅ SUCCESS: Using previous working branch tag '${previousTag}'`);
|
|
261
|
+
logger.info(` This shows commits added since the last release`);
|
|
262
|
+
logger.info('═══════════════════════════════════════════════════════════');
|
|
263
|
+
logger.info('');
|
|
264
|
+
return previousTag;
|
|
265
|
+
} else {
|
|
266
|
+
logger.warn('');
|
|
267
|
+
logger.warn(`⚠️ VALIDATION FAILED: Tag "${previousTag}" exists but is not a valid git reference`);
|
|
268
|
+
logger.warn(` This should not happen - the tag might be corrupted`);
|
|
269
|
+
}
|
|
219
270
|
} else {
|
|
220
|
-
logger.
|
|
271
|
+
logger.warn('');
|
|
272
|
+
logger.warn('❌ NO WORKING BRANCH TAG FOUND matching pattern "working/v*"');
|
|
273
|
+
logger.warn(` Current version: ${currentVersion}`);
|
|
274
|
+
logger.warn(' 💡 To create working branch tags for past releases, run:');
|
|
275
|
+
logger.warn(' kodrdriv development --create-retroactive-tags');
|
|
276
|
+
logger.warn('');
|
|
277
|
+
logger.warn(' Falling back to regular tag search...');
|
|
221
278
|
}
|
|
279
|
+
} else {
|
|
280
|
+
logger.warn('');
|
|
281
|
+
logger.warn('❌ CANNOT READ VERSION from package.json');
|
|
282
|
+
logger.warn(' Cannot search for working branch tags without current version');
|
|
222
283
|
}
|
|
223
284
|
} catch (error) {
|
|
224
|
-
logger.
|
|
285
|
+
logger.warn('');
|
|
286
|
+
logger.warn(`❌ ERROR while searching for working branch tag: ${error.message}`);
|
|
287
|
+
logger.debug(`Full error stack: ${error.stack}`);
|
|
288
|
+
logger.warn(' Falling back to regular tag search...');
|
|
225
289
|
}
|
|
290
|
+
logger.info('───────────────────────────────────────────────────────────');
|
|
291
|
+
logger.info('');
|
|
292
|
+
} else {
|
|
293
|
+
logger.info(`ℹ️ Not on "working" branch - skipping working tag search`);
|
|
294
|
+
logger.info(` (Only search for working/v* tags when on working branch)`);
|
|
295
|
+
logger.info('');
|
|
226
296
|
}
|
|
227
297
|
// First, try to find the previous release tag
|
|
228
298
|
try {
|
package/dist/util/git.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.js","sources":["../../src/util/git.ts"],"sourcesContent":["import { getLogger } from '../logging';\nimport { run, runSecure, validateGitRef } from './child';\nimport fs from 'fs/promises';\nimport path from 'path';\nimport { exec } from 'child_process';\nimport util from 'util';\nimport * as semver from 'semver';\nimport { safeJsonParse, validatePackageJson } from './validation';\n\n/**\n * Tests if a git reference exists and is valid (silent version that doesn't log errors)\n */\nconst isValidGitRefSilent = async (ref: string): Promise<boolean> => {\n try {\n // Validate the ref first to prevent injection\n if (!validateGitRef(ref)) {\n return false;\n }\n await runSecure('git', ['rev-parse', '--verify', ref], { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n};\n\n/**\n * Tests if a git reference exists and is valid\n */\nexport const isValidGitRef = async (ref: string): Promise<boolean> => {\n const logger = getLogger();\n try {\n // Validate the ref first to prevent injection\n if (!validateGitRef(ref)) {\n logger.debug(`Git reference '${ref}' contains invalid characters`);\n return false;\n }\n await runSecure('git', ['rev-parse', '--verify', ref], { stdio: 'ignore' });\n logger.debug(`Git reference '${ref}' is valid`);\n return true;\n } catch (error) {\n logger.debug(`Git reference '${ref}' is not valid: ${error}`);\n return false;\n }\n};\n\n/**\n * Finds the previous release tag based on the current version using semantic versioning.\n * Returns the highest version tag that is less than the current version.\n *\n * @param currentVersion The current version (e.g., \"1.2.3\", \"2.0.0\")\n * @param tagPattern The pattern to match tags (e.g., \"v*\", \"working/v*\")\n * @returns The previous release tag or null if none found\n */\nexport const findPreviousReleaseTag = async (\n currentVersion: string,\n tagPattern: string = 'v*'\n): Promise<string | null> => {\n const logger = getLogger();\n\n try {\n // Parse current version first to validate it\n const currentSemver = semver.parse(currentVersion);\n if (!currentSemver) {\n logger.debug(`Invalid version format: ${currentVersion}`);\n return null;\n }\n\n logger.debug(`Looking for previous release tag matching ${tagPattern} for version ${currentVersion}`);\n\n // Get all tags - try sorted first, fallback to unsorted\n let tags: string[];\n try {\n const { stdout } = await runSecure('git', ['tag', '-l', tagPattern, '--sort=-version:refname']);\n tags = stdout.trim().split('\\n').filter(tag => tag.length > 0);\n logger.debug(`Found ${tags.length} tags matching ${tagPattern}`);\n } catch {\n // Fallback for older git versions that don't support --sort\n logger.debug('Git tag --sort failed, falling back to manual sorting');\n const { stdout } = await runSecure('git', ['tag', '-l', tagPattern]);\n tags = stdout.trim().split('\\n').filter(tag => tag.length > 0);\n\n // Manual semantic version sorting\n tags.sort((a, b) => {\n const aMatch = a.match(/v?(\\d+\\.\\d+\\.\\d+.*?)$/);\n const bMatch = b.match(/v?(\\d+\\.\\d+\\.\\d+.*?)$/);\n if (!aMatch || !bMatch) return 0;\n\n const aSemver = semver.parse(aMatch[1]);\n const bSemver = semver.parse(bMatch[1]);\n if (!aSemver || !bSemver) return 0;\n\n return semver.rcompare(aSemver, bSemver);\n });\n }\n\n if (tags.length === 0) {\n logger.debug('No tags found in repository');\n return null;\n }\n\n logger.debug(`Found ${tags.length} tags in repository`);\n\n // Find the highest version that is less than the current version\n let previousTag: string | null = null;\n let previousVersion: semver.SemVer | null = null;\n let validTags = 0;\n let skippedTags = 0;\n\n for (const tag of tags) {\n // Extract version from tag - handle \"v1.2.13\", \"1.2.13\", and \"working/v1.2.13\"\n const versionMatch = tag.match(/v?(\\d+\\.\\d+\\.\\d+.*?)$/);\n if (!versionMatch) {\n logger.debug(`Tag ${tag} doesn't match version pattern, skipping`);\n continue;\n }\n\n const versionString = versionMatch[1];\n const tagSemver = semver.parse(versionString);\n\n if (tagSemver) {\n validTags++;\n logger.debug(`Comparing tag ${tag} (${versionString}) with current ${currentVersion}`);\n\n // Check if this tag version is less than current version\n if (semver.lt(tagSemver, currentSemver)) {\n // If we don't have a previous version yet, or this one is higher than our current previous\n if (!previousVersion || semver.gt(tagSemver, previousVersion)) {\n previousVersion = tagSemver;\n previousTag = tag; // Keep the original tag format\n logger.debug(`Found candidate previous tag: ${tag} (${versionString})`);\n }\n } else {\n skippedTags++;\n }\n }\n }\n\n logger.debug(`Processed ${validTags} valid semantic version tags, skipped ${skippedTags} tags >= current version`);\n\n if (previousTag) {\n logger.debug(`Found previous tag: ${previousTag} (${previousVersion?.version} < ${currentVersion})`);\n return previousTag;\n }\n\n logger.debug(`No previous tag found for ${currentVersion} matching ${tagPattern}`);\n return null;\n } catch (error: any) {\n logger.debug(`Error finding previous release tag: ${error.message}`);\n return null;\n }\n};\n\n/**\n * Gets the current version from package.json\n *\n * @returns The current version string or null if not found\n */\nexport const getCurrentVersion = async (): Promise<string | null> => {\n const logger = getLogger();\n\n try {\n // First try to get from committed version in HEAD\n const { stdout } = await runSecure('git', ['show', 'HEAD:package.json']);\n const packageJson = safeJsonParse(stdout, 'package.json');\n const validated = validatePackageJson(packageJson, 'package.json');\n\n if (validated.version) {\n logger.debug(`Current version from HEAD:package.json: ${validated.version}`);\n return validated.version;\n }\n\n return null;\n } catch (error: any) {\n logger.debug(`Could not read version from HEAD:package.json: ${error.message}`);\n\n // Fallback to reading from working directory\n try {\n const packageJsonPath = path.join(process.cwd(), 'package.json');\n const content = await fs.readFile(packageJsonPath, 'utf-8');\n const packageJson = safeJsonParse(content, 'package.json');\n const validated = validatePackageJson(packageJson, 'package.json');\n\n if (validated.version) {\n logger.debug(`Current version from working directory package.json: ${validated.version}`);\n return validated.version;\n }\n\n return null;\n } catch (fallbackError: any) {\n logger.debug(`Error reading current version from filesystem: ${fallbackError.message}`);\n return null;\n }\n }\n};\n\n/**\n * Gets a reliable default for the --from parameter by trying multiple fallbacks\n *\n * Tries in order:\n * 1. Previous working branch tag (if on working branch)\n * 2. Previous release tag (if current version can be determined)\n * 3. main (local main branch - typical release comparison base)\n * 4. master (local master branch - legacy default)\n * 5. origin/main (remote main branch fallback)\n * 6. origin/master (remote master branch fallback)\n *\n * @param forceMainBranch If true, skip tag detection and use main branch\n * @param currentBranch Current branch name for branch-aware tag detection\n * @returns A valid git reference to use as the default from parameter\n * @throws Error if no valid reference can be found\n */\nexport const getDefaultFromRef = async (\n forceMainBranch: boolean = false,\n currentBranch?: string\n): Promise<string> => {\n const logger = getLogger();\n\n // If forced to use main branch, skip tag detection\n if (forceMainBranch) {\n logger.debug('Forced to use main branch, skipping tag detection');\n } else {\n // If on working branch, look for working branch tags first\n if (currentBranch && currentBranch === 'working') {\n try {\n const currentVersion = await getCurrentVersion();\n if (currentVersion) {\n logger.debug(`Looking for previous working branch tag (current version: ${currentVersion})`);\n const previousTag = await findPreviousReleaseTag(\n currentVersion,\n 'working/v*'\n );\n if (previousTag && await isValidGitRef(previousTag)) {\n logger.info(`Using previous working branch tag '${previousTag}' as default --from reference`);\n logger.info(` This shows commits added since the last release`);\n return previousTag;\n } else {\n logger.debug('No valid previous working tag found, will try regular tags');\n }\n }\n } catch (error: any) {\n logger.debug(`Could not determine previous working tag: ${error.message}`);\n }\n }\n\n // First, try to find the previous release tag\n try {\n const currentVersion = await getCurrentVersion();\n if (currentVersion) {\n const previousTag = await findPreviousReleaseTag(currentVersion);\n if (previousTag && await isValidGitRef(previousTag)) {\n logger.info(`Using previous release tag '${previousTag}' as default --from reference`);\n return previousTag;\n }\n }\n } catch (error: any) {\n logger.debug(`Could not determine previous release tag: ${error.message}`);\n }\n }\n\n // Fallback to branch-based references\n const candidates = [\n 'main',\n 'master',\n 'origin/main',\n 'origin/master'\n ];\n\n for (const candidate of candidates) {\n logger.debug(`Testing git reference candidate: ${candidate}`);\n if (await isValidGitRef(candidate)) {\n if (forceMainBranch) {\n logger.info(`Using '${candidate}' as forced main branch reference`);\n } else {\n logger.info(`Using '${candidate}' as fallback --from reference (no previous release tag found)`);\n }\n return candidate;\n }\n }\n\n // If we get here, something is seriously wrong with the git repository\n throw new Error(\n 'Could not find a valid default git reference for --from parameter. ' +\n 'Please specify --from explicitly or check your git repository configuration. ' +\n `Tried: ${forceMainBranch ? 'main branch only' : 'previous release tag'}, ${candidates.join(', ')}`\n );\n};\n\n/**\n * Gets the default branch name from the remote repository\n */\nexport const getRemoteDefaultBranch = async (): Promise<string | null> => {\n const logger = getLogger();\n try {\n // Try to get the symbolic reference for origin/HEAD\n const { stdout } = await run('git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null || echo \"\"');\n if (stdout.trim()) {\n // Extract branch name from refs/remotes/origin/branch-name\n const match = stdout.trim().match(/refs\\/remotes\\/origin\\/(.+)$/);\n if (match) {\n const branchName = match[1];\n logger.debug(`Remote default branch is: ${branchName}`);\n return branchName;\n }\n }\n\n // Fallback: try to get it from ls-remote\n const { stdout: lsRemoteOutput } = await run('git ls-remote --symref origin HEAD');\n const symrefMatch = lsRemoteOutput.match(/ref: refs\\/heads\\/(.+)\\s+HEAD/);\n if (symrefMatch) {\n const branchName = symrefMatch[1];\n logger.debug(`Remote default branch from ls-remote: ${branchName}`);\n return branchName;\n }\n\n logger.debug('Could not determine remote default branch');\n return null;\n } catch (error) {\n logger.debug(`Failed to get remote default branch: ${error}`);\n return null;\n }\n};\n\n/**\n * Checks if a local branch exists\n */\nexport const localBranchExists = async (branchName: string): Promise<boolean> => {\n const logger = getLogger();\n const result = await isValidGitRefSilent(`refs/heads/${branchName}`);\n if (result) {\n logger.debug(`Local branch '${branchName}' exists`);\n } else {\n logger.debug(`Local branch '${branchName}' does not exist`);\n }\n return result;\n};\n\n/**\n * Checks if a remote branch exists\n */\nexport const remoteBranchExists = async (branchName: string, remote: string = 'origin'): Promise<boolean> => {\n const logger = getLogger();\n const result = await isValidGitRefSilent(`refs/remotes/${remote}/${branchName}`);\n if (result) {\n logger.debug(`Remote branch '${remote}/${branchName}' exists`);\n } else {\n logger.debug(`Remote branch '${remote}/${branchName}' does not exist`);\n }\n return result;\n};\n\n/**\n * Gets the commit SHA for a given branch (local or remote)\n */\nexport const getBranchCommitSha = async (branchRef: string): Promise<string> => {\n // Validate the ref first to prevent injection\n if (!validateGitRef(branchRef)) {\n throw new Error(`Invalid git reference: ${branchRef}`);\n }\n const { stdout } = await runSecure('git', ['rev-parse', branchRef]);\n return stdout.trim();\n};\n\n/**\n * Checks if a local branch is in sync with its remote counterpart\n */\nexport const isBranchInSyncWithRemote = async (branchName: string, remote: string = 'origin'): Promise<{\n inSync: boolean;\n localSha?: string;\n remoteSha?: string;\n localExists: boolean;\n remoteExists: boolean;\n error?: string;\n}> => {\n const logger = getLogger();\n\n try {\n // Validate inputs first to prevent injection\n if (!validateGitRef(branchName)) {\n throw new Error(`Invalid branch name: ${branchName}`);\n }\n if (!validateGitRef(remote)) {\n throw new Error(`Invalid remote name: ${remote}`);\n }\n\n // First, fetch latest remote refs without affecting working directory\n await runSecure('git', ['fetch', remote, '--quiet']);\n\n const localExists = await localBranchExists(branchName);\n const remoteExists = await remoteBranchExists(branchName, remote);\n\n if (!localExists) {\n return {\n inSync: false,\n localExists: false,\n remoteExists,\n error: `Local branch '${branchName}' does not exist`\n };\n }\n\n if (!remoteExists) {\n return {\n inSync: false,\n localExists: true,\n remoteExists: false,\n error: `Remote branch '${remote}/${branchName}' does not exist`\n };\n }\n\n // Both branches exist, compare their SHAs\n const localSha = await getBranchCommitSha(`refs/heads/${branchName}`);\n const remoteSha = await getBranchCommitSha(`refs/remotes/${remote}/${branchName}`);\n\n const inSync = localSha === remoteSha;\n\n logger.debug(`Branch sync check for '${branchName}': local=${localSha.substring(0, 8)}, remote=${remoteSha.substring(0, 8)}, inSync=${inSync}`);\n\n return {\n inSync,\n localSha,\n remoteSha,\n localExists: true,\n remoteExists: true\n };\n\n } catch (error: any) {\n logger.debug(`Failed to check branch sync for '${branchName}': ${error.message}`);\n return {\n inSync: false,\n localExists: false,\n remoteExists: false,\n error: `Failed to check branch sync: ${error.message}`\n };\n }\n};\n\n/**\n * Attempts to safely sync a local branch with its remote counterpart\n * Returns true if successful, false if conflicts exist that require manual resolution\n */\nexport const safeSyncBranchWithRemote = async (branchName: string, remote: string = 'origin'): Promise<{\n success: boolean;\n error?: string;\n conflictResolutionRequired?: boolean;\n}> => {\n const logger = getLogger();\n\n try {\n // Validate inputs first to prevent injection\n if (!validateGitRef(branchName)) {\n throw new Error(`Invalid branch name: ${branchName}`);\n }\n if (!validateGitRef(remote)) {\n throw new Error(`Invalid remote name: ${remote}`);\n }\n\n // Check current branch to restore later if needed\n const { stdout: currentBranch } = await runSecure('git', ['branch', '--show-current']);\n const originalBranch = currentBranch.trim();\n\n // Fetch latest remote refs\n await runSecure('git', ['fetch', remote, '--quiet']);\n\n // Check if local branch exists\n const localExists = await localBranchExists(branchName);\n const remoteExists = await remoteBranchExists(branchName, remote);\n\n if (!remoteExists) {\n return {\n success: false,\n error: `Remote branch '${remote}/${branchName}' does not exist`\n };\n }\n\n if (!localExists) {\n // Create local branch tracking the remote\n await runSecure('git', ['branch', branchName, `${remote}/${branchName}`]);\n logger.debug(`Created local branch '${branchName}' tracking '${remote}/${branchName}'`);\n return { success: true };\n }\n\n // Check if we need to switch to the target branch\n const needToSwitch = originalBranch !== branchName;\n\n if (needToSwitch) {\n // Check for uncommitted changes before switching\n const { stdout: statusOutput } = await runSecure('git', ['status', '--porcelain']);\n if (statusOutput.trim()) {\n return {\n success: false,\n error: `Cannot switch to branch '${branchName}' because you have uncommitted changes. Please commit or stash your changes first.`\n };\n }\n\n // Switch to target branch\n await runSecure('git', ['checkout', branchName]);\n }\n\n try {\n // Try to pull with fast-forward only\n await runSecure('git', ['pull', remote, branchName, '--ff-only']);\n logger.debug(`Successfully synced '${branchName}' with '${remote}/${branchName}'`);\n\n // Switch back to original branch if we switched\n if (needToSwitch && originalBranch) {\n await runSecure('git', ['checkout', originalBranch]);\n }\n\n return { success: true };\n\n } catch (pullError: any) {\n // Switch back to original branch if we switched\n if (needToSwitch && originalBranch) {\n try {\n await runSecure('git', ['checkout', originalBranch]);\n } catch (checkoutError) {\n logger.warn(`Failed to switch back to original branch '${originalBranch}': ${checkoutError}`);\n }\n }\n\n // Check if this is a merge conflict or diverged branches\n if (pullError.message.includes('diverged') ||\n pullError.message.includes('non-fast-forward') ||\n pullError.message.includes('conflict') ||\n pullError.message.includes('CONFLICT')) {\n return {\n success: false,\n conflictResolutionRequired: true,\n error: `Branch '${branchName}' has diverged from '${remote}/${branchName}' and requires manual conflict resolution`\n };\n }\n\n return {\n success: false,\n error: `Failed to sync branch '${branchName}': ${pullError.message}`\n };\n }\n\n } catch (error: any) {\n return {\n success: false,\n error: `Failed to sync branch '${branchName}': ${error.message}`\n };\n }\n};\n\n/**\n * Gets the current branch name\n */\nexport const getCurrentBranch = async (): Promise<string> => {\n const { stdout } = await runSecure('git', ['branch', '--show-current']);\n return stdout.trim();\n};\n\n/**\n * Gets git status summary including unstaged files, uncommitted changes, and unpushed commits\n */\nexport const getGitStatusSummary = async (workingDir?: string): Promise<{\n branch: string;\n hasUnstagedFiles: boolean;\n hasUncommittedChanges: boolean;\n hasUnpushedCommits: boolean;\n unstagedCount: number;\n uncommittedCount: number;\n unpushedCount: number;\n status: string; // summary status string\n}> => {\n const logger = getLogger();\n\n try {\n const originalCwd = process.cwd();\n if (workingDir) {\n process.chdir(workingDir);\n }\n\n try {\n // Get current branch\n const branch = await getCurrentBranch();\n\n // Get git status for unstaged and uncommitted changes\n const { stdout: statusOutput } = await runSecure('git', ['status', '--porcelain']);\n const statusLines = statusOutput.trim().split('\\n').filter(line => line.trim());\n\n // Count different types of changes\n let unstagedCount = 0;\n let uncommittedCount = 0;\n\n for (const line of statusLines) {\n const statusCode = line.substring(0, 2);\n\n // For untracked files (??) count as unstaged only once\n if (statusCode === '??') {\n unstagedCount++;\n continue;\n }\n\n // Check for unstaged changes (working directory changes)\n // Second character represents working tree status\n if (statusCode[1] !== ' ' && statusCode[1] !== '') {\n unstagedCount++;\n }\n\n // Check for uncommitted changes (staged changes)\n // First character represents index status\n if (statusCode[0] !== ' ' && statusCode[0] !== '') {\n uncommittedCount++;\n }\n }\n\n // Check for unpushed commits by comparing with remote\n let unpushedCount = 0;\n let hasUnpushedCommits = false;\n\n try {\n // First fetch to get latest remote refs\n await runSecure('git', ['fetch', 'origin', '--quiet']);\n\n // Check if remote branch exists\n const remoteExists = await remoteBranchExists(branch);\n\n if (remoteExists) {\n // Get count of commits ahead of remote (branch already validated in calling function)\n const { stdout: aheadOutput } = await runSecure('git', ['rev-list', '--count', `origin/${branch}..HEAD`]);\n unpushedCount = parseInt(aheadOutput.trim()) || 0;\n hasUnpushedCommits = unpushedCount > 0;\n }\n } catch (error) {\n logger.debug(`Could not check for unpushed commits: ${error}`);\n // Remote might not exist or other issues - not critical for status\n }\n\n const hasUnstagedFiles = unstagedCount > 0;\n const hasUncommittedChanges = uncommittedCount > 0;\n\n // Build status summary\n const statusParts: string[] = [];\n\n if (hasUnstagedFiles) {\n statusParts.push(`${unstagedCount} unstaged`);\n }\n if (hasUncommittedChanges) {\n statusParts.push(`${uncommittedCount} uncommitted`);\n }\n if (hasUnpushedCommits) {\n statusParts.push(`${unpushedCount} unpushed`);\n }\n\n const status = statusParts.length > 0 ? statusParts.join(', ') : 'clean';\n\n return {\n branch,\n hasUnstagedFiles,\n hasUncommittedChanges,\n hasUnpushedCommits,\n unstagedCount,\n uncommittedCount,\n unpushedCount,\n status\n };\n\n } finally {\n if (workingDir) {\n process.chdir(originalCwd);\n }\n }\n\n } catch (error: any) {\n logger.debug(`Failed to get git status summary: ${error.message}`);\n return {\n branch: 'unknown',\n hasUnstagedFiles: false,\n hasUncommittedChanges: false,\n hasUnpushedCommits: false,\n unstagedCount: 0,\n uncommittedCount: 0,\n unpushedCount: 0,\n status: 'error'\n };\n }\n};\n\n/**\n * Gets the list of globally linked packages (packages available to be linked to)\n */\nexport const getGloballyLinkedPackages = async (): Promise<Set<string>> => {\n const execPromise = util.promisify(exec);\n\n try {\n const { stdout } = await execPromise('npm ls --link -g --json');\n const result = safeJsonParse(stdout, 'npm ls global output');\n\n if (result.dependencies && typeof result.dependencies === 'object') {\n return new Set(Object.keys(result.dependencies));\n }\n\n return new Set();\n } catch (error: any) {\n // Try to parse from error stdout if available\n if (error.stdout) {\n try {\n const result = safeJsonParse(error.stdout, 'npm ls global error output');\n if (result.dependencies && typeof result.dependencies === 'object') {\n return new Set(Object.keys(result.dependencies));\n }\n } catch {\n // If JSON parsing fails, return empty set\n }\n }\n\n return new Set();\n }\n};\n\n/**\n * Gets the list of packages that this package is actively linking to (consuming linked packages)\n */\nexport const getLinkedDependencies = async (packageDir: string): Promise<Set<string>> => {\n const execPromise = util.promisify(exec);\n\n try {\n const { stdout } = await execPromise('npm ls --link --json', { cwd: packageDir });\n const result = safeJsonParse(stdout, 'npm ls local output');\n\n if (result.dependencies && typeof result.dependencies === 'object') {\n return new Set(Object.keys(result.dependencies));\n }\n\n return new Set();\n } catch (error: any) {\n // npm ls --link often exits with non-zero code but still provides valid JSON in stdout\n if (error.stdout) {\n try {\n const result = safeJsonParse(error.stdout, 'npm ls local error output');\n if (result.dependencies && typeof result.dependencies === 'object') {\n return new Set(Object.keys(result.dependencies));\n }\n } catch {\n // If JSON parsing fails, return empty set\n }\n }\n\n return new Set();\n }\n};\n\n/**\n * Checks for actual semantic version compatibility issues between linked packages and their consumers\n * Returns a set of dependency names that have real compatibility problems\n *\n * This function ignores npm's strict prerelease handling and focuses on actual compatibility:\n * - \"^4.4\" is compatible with \"4.4.53-dev.0\" (prerelease of compatible minor version)\n * - \"^4.4\" is incompatible with \"4.5.3\" (different minor version)\n */\nexport const getLinkCompatibilityProblems = async (\n packageDir: string,\n allPackagesInfo?: Map<string, { name: string; version: string; path: string }>\n): Promise<Set<string>> => {\n try {\n // Read the consumer package.json\n const packageJsonPath = path.join(packageDir, 'package.json');\n const packageJsonContent = await fs.readFile(packageJsonPath, 'utf-8');\n const parsed = safeJsonParse(packageJsonContent, packageJsonPath);\n const packageJson = validatePackageJson(parsed, packageJsonPath);\n\n const problemDependencies = new Set<string>();\n\n // Get linked dependencies\n const linkedDeps = await getLinkedDependencies(packageDir);\n\n // Check each dependency type\n const dependencyTypes = ['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies'];\n\n for (const depType of dependencyTypes) {\n const deps = packageJson[depType];\n if (!deps || typeof deps !== 'object') continue;\n\n for (const [depName, versionRange] of Object.entries(deps)) {\n // Only check dependencies that are currently linked\n if (!linkedDeps.has(depName)) continue;\n\n // Skip if version range is not a string or is invalid\n if (typeof versionRange !== 'string') continue;\n\n try {\n let linkedVersion: string | undefined;\n\n // If we have package info provided, use it\n if (allPackagesInfo) {\n const packageInfo = allPackagesInfo.get(depName);\n if (packageInfo) {\n linkedVersion = packageInfo.version;\n }\n }\n\n // If we don't have version from package info, try to read it from the linked package\n if (!linkedVersion) {\n try {\n // Get the linked package path and read its version\n const nodeModulesPath = path.join(packageDir, 'node_modules', depName, 'package.json');\n const linkedPackageJson = await fs.readFile(nodeModulesPath, 'utf-8');\n const linkedParsed = safeJsonParse(linkedPackageJson, nodeModulesPath);\n const linkedValidated = validatePackageJson(linkedParsed, nodeModulesPath);\n linkedVersion = linkedValidated.version;\n } catch {\n // Could not read linked package version, skip this dependency\n continue;\n }\n }\n\n if (!linkedVersion) continue;\n\n // Check compatibility with custom logic for prerelease versions\n if (!isVersionCompatibleWithRange(linkedVersion, versionRange)) {\n problemDependencies.add(depName);\n }\n } catch {\n // Skip dependencies we can't process\n continue;\n }\n }\n }\n\n return problemDependencies;\n } catch {\n // If we can't read the package.json or process it, return empty set\n return new Set();\n }\n};\n\n/**\n * Custom semver compatibility check that handles prerelease versions more intelligently\n * than npm's strict checking, with stricter caret range handling\n *\n * Examples:\n * - isVersionCompatibleWithRange(\"4.4.53-dev.0\", \"^4.4\") => true\n * - isVersionCompatibleWithRange(\"4.5.3\", \"^4.4\") => false\n * - isVersionCompatibleWithRange(\"4.4.1\", \"^4.4\") => true\n */\nconst isVersionCompatibleWithRange = (version: string, range: string): boolean => {\n try {\n const parsedVersion = semver.parse(version);\n if (!parsedVersion) return false;\n\n // Parse the range to understand what we're comparing against\n const rangeObj = semver.validRange(range);\n if (!rangeObj) return false;\n\n // For caret ranges like \"^4.4\", we want more strict checking than semver's default\n if (range.startsWith('^')) {\n const rangeVersion = range.substring(1); // Remove the ^\n\n // Try to parse as a complete version first\n let parsedRange = semver.parse(rangeVersion);\n\n // If that fails, try to coerce it (handles cases like \"4.4\" -> \"4.4.0\")\n if (!parsedRange) {\n const coercedRange = semver.coerce(rangeVersion);\n if (coercedRange) {\n parsedRange = coercedRange;\n } else {\n return false;\n }\n }\n\n // For prerelease versions, check if the base version (without prerelease)\n // matches the major.minor from the range\n if (parsedVersion.prerelease.length > 0) {\n return parsedVersion.major === parsedRange.major &&\n parsedVersion.minor === parsedRange.minor;\n }\n\n // For regular versions with caret ranges, be strict about minor version\n // ^4.4 should only accept 4.4.x, not 4.5.x\n return parsedVersion.major === parsedRange.major &&\n parsedVersion.minor === parsedRange.minor;\n }\n\n // For other range types (exact, tilde, etc.), use standard semver checking\n if (parsedVersion.prerelease.length > 0) {\n const baseVersion = `${parsedVersion.major}.${parsedVersion.minor}.${parsedVersion.patch}`;\n return semver.satisfies(baseVersion, range);\n }\n\n return semver.satisfies(version, range);\n } catch {\n // If semver parsing fails, assume incompatible\n return false;\n }\n};\n\n/**\n * Checks for npm link problems (version mismatches) in a package directory\n * Returns a set of dependency names that have link problems\n *\n * @deprecated Use getLinkCompatibilityProblems instead for better prerelease version handling\n */\nexport const getLinkProblems = async (packageDir: string): Promise<Set<string>> => {\n const execPromise = util.promisify(exec);\n\n try {\n const { stdout } = await execPromise('npm ls --link --json', { cwd: packageDir });\n const result = safeJsonParse(stdout, 'npm ls troubleshoot output');\n\n const problemDependencies = new Set<string>();\n\n // Check if there are any problems reported\n if (result.problems && Array.isArray(result.problems)) {\n // Parse problems array to extract dependency names\n for (const problem of result.problems) {\n if (typeof problem === 'string' && problem.includes('invalid:')) {\n // Extract package name from problem string like \"invalid: @fjell/eslint-config@1.1.20-dev.0 ...\"\n // Handle both scoped (@scope/name) and unscoped (name) packages\n const match = problem.match(/invalid:\\s+(@[^/]+\\/[^@\\s]+|[^@\\s]+)@/);\n if (match) {\n problemDependencies.add(match[1]);\n }\n }\n }\n }\n\n // Also check individual dependencies for problems\n if (result.dependencies && typeof result.dependencies === 'object') {\n for (const [depName, depInfo] of Object.entries(result.dependencies)) {\n if (depInfo && typeof depInfo === 'object') {\n const dep = depInfo as any;\n // Check if this dependency has problems or is marked as invalid\n if ((dep.problems && Array.isArray(dep.problems) && dep.problems.length > 0) ||\n dep.invalid) {\n problemDependencies.add(depName);\n }\n }\n }\n }\n\n return problemDependencies;\n } catch (error: any) {\n // npm ls --link often exits with non-zero code when there are problems\n // but still provides valid JSON in stdout\n if (error.stdout) {\n try {\n const result = safeJsonParse(error.stdout, 'npm ls troubleshoot error output');\n const problemDependencies = new Set<string>();\n\n // Check if there are any problems reported\n if (result.problems && Array.isArray(result.problems)) {\n for (const problem of result.problems) {\n if (typeof problem === 'string' && problem.includes('invalid:')) {\n const match = problem.match(/invalid:\\s+(@[^/]+\\/[^@\\s]+|[^@\\s]+)@/);\n if (match) {\n problemDependencies.add(match[1]);\n }\n }\n }\n }\n\n // Also check individual dependencies for problems\n if (result.dependencies && typeof result.dependencies === 'object') {\n for (const [depName, depInfo] of Object.entries(result.dependencies)) {\n if (depInfo && typeof depInfo === 'object') {\n const dep = depInfo as any;\n if ((dep.problems && Array.isArray(dep.problems) && dep.problems.length > 0) ||\n dep.invalid) {\n problemDependencies.add(depName);\n }\n }\n }\n }\n\n return problemDependencies;\n } catch {\n // If JSON parsing fails, return empty set\n return new Set();\n }\n }\n\n return new Set();\n }\n};\n\n/**\n * Checks if a package directory is npm linked (has a global symlink)\n */\nexport const isNpmLinked = async (packageDir: string): Promise<boolean> => {\n const logger = getLogger();\n\n try {\n // Read package.json to get the package name\n const packageJsonPath = path.join(packageDir, 'package.json');\n\n try {\n await fs.access(packageJsonPath);\n } catch {\n // No package.json found\n return false;\n }\n\n const packageJsonContent = await fs.readFile(packageJsonPath, 'utf-8');\n const packageJson = safeJsonParse(packageJsonContent, packageJsonPath);\n const packageName = packageJson.name;\n\n if (!packageName) {\n return false;\n }\n\n // Check if the package is globally linked by running npm ls -g --depth=0\n try {\n const { stdout } = await runSecure('npm', ['ls', '-g', '--depth=0', '--json']);\n const globalPackages = safeJsonParse(stdout, 'npm ls global depth check output');\n\n // Check if our package is in the global dependencies\n if (globalPackages.dependencies && globalPackages.dependencies[packageName]) {\n // Verify the symlink actually points to our directory\n const globalPath = globalPackages.dependencies[packageName].resolved;\n if (globalPath && globalPath.startsWith('file:')) {\n const linkedPath = globalPath.replace('file:', '');\n const realPackageDir = await fs.realpath(packageDir);\n const realLinkedPath = await fs.realpath(linkedPath);\n return realPackageDir === realLinkedPath;\n }\n }\n } catch (error) {\n // If npm ls fails, try alternative approach\n logger.debug(`npm ls failed for ${packageName}, trying alternative check: ${error}`);\n\n // Alternative: check if there's a symlink in npm's global node_modules\n try {\n const { stdout: npmPrefix } = await run('npm prefix -g');\n const globalNodeModules = path.join(npmPrefix.trim(), 'node_modules', packageName);\n\n const stat = await fs.lstat(globalNodeModules);\n if (stat.isSymbolicLink()) {\n const realGlobalPath = await fs.realpath(globalNodeModules);\n const realPackageDir = await fs.realpath(packageDir);\n return realGlobalPath === realPackageDir;\n }\n } catch {\n // If all else fails, assume not linked\n return false;\n }\n }\n\n return false;\n } catch (error) {\n logger.debug(`Error checking npm link status for ${packageDir}: ${error}`);\n return false;\n }\n};\n"],"names":["isValidGitRefSilent","ref","validateGitRef","runSecure","stdio","isValidGitRef","logger","getLogger","debug","error","findPreviousReleaseTag","currentVersion","tagPattern","currentSemver","semver","parse","tags","stdout","trim","split","filter","tag","length","sort","a","b","aMatch","match","bMatch","aSemver","bSemver","rcompare","previousTag","previousVersion","validTags","skippedTags","versionMatch","versionString","tagSemver","lt","gt","version","message","getCurrentVersion","packageJson","safeJsonParse","validated","validatePackageJson","packageJsonPath","path","join","process","cwd","content","fs","readFile","fallbackError","getDefaultFromRef","forceMainBranch","currentBranch","info","candidates","candidate","Error","localBranchExists","branchName","result","remoteBranchExists","remote","getBranchCommitSha","branchRef","isBranchInSyncWithRemote","localExists","remoteExists","inSync","localSha","remoteSha","substring","safeSyncBranchWithRemote","originalBranch","success","needToSwitch","statusOutput","pullError","checkoutError","warn","includes","conflictResolutionRequired","getCurrentBranch","getGitStatusSummary","workingDir","originalCwd","chdir","branch","statusLines","line","unstagedCount","uncommittedCount","statusCode","unpushedCount","hasUnpushedCommits","aheadOutput","parseInt","hasUnstagedFiles","hasUncommittedChanges","statusParts","push","status","getGloballyLinkedPackages","execPromise","util","promisify","exec","dependencies","Set","Object","keys","getLinkedDependencies","packageDir","getLinkCompatibilityProblems","allPackagesInfo","packageJsonContent","parsed","problemDependencies","linkedDeps","dependencyTypes","depType","deps","depName","versionRange","entries","has","linkedVersion","packageInfo","get","nodeModulesPath","linkedPackageJson","linkedParsed","linkedValidated","isVersionCompatibleWithRange","add","range","parsedVersion","rangeObj","validRange","startsWith","rangeVersion","parsedRange","coercedRange","coerce","prerelease","major","minor","baseVersion","patch","satisfies"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"git.js","sources":["../../src/util/git.ts"],"sourcesContent":["import { getLogger } from '../logging';\nimport { run, runSecure, validateGitRef } from './child';\nimport fs from 'fs/promises';\nimport path from 'path';\nimport { exec } from 'child_process';\nimport util from 'util';\nimport * as semver from 'semver';\nimport { safeJsonParse, validatePackageJson } from './validation';\n\n/**\n * Tests if a git reference exists and is valid (silent version that doesn't log errors)\n */\nconst isValidGitRefSilent = async (ref: string): Promise<boolean> => {\n try {\n // Validate the ref first to prevent injection\n if (!validateGitRef(ref)) {\n return false;\n }\n await runSecure('git', ['rev-parse', '--verify', ref], { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n};\n\n/**\n * Tests if a git reference exists and is valid\n */\nexport const isValidGitRef = async (ref: string): Promise<boolean> => {\n const logger = getLogger();\n try {\n // Validate the ref first to prevent injection\n if (!validateGitRef(ref)) {\n logger.debug(`Git reference '${ref}' contains invalid characters`);\n return false;\n }\n await runSecure('git', ['rev-parse', '--verify', ref], { stdio: 'ignore' });\n logger.debug(`Git reference '${ref}' is valid`);\n return true;\n } catch (error) {\n logger.debug(`Git reference '${ref}' is not valid: ${error}`);\n return false;\n }\n};\n\n/**\n * Finds the previous release tag based on the current version using semantic versioning.\n * Returns the highest version tag that is less than the current version.\n *\n * @param currentVersion The current version (e.g., \"1.2.3\", \"2.0.0\")\n * @param tagPattern The pattern to match tags (e.g., \"v*\", \"working/v*\")\n * @returns The previous release tag or null if none found\n */\nexport const findPreviousReleaseTag = async (\n currentVersion: string,\n tagPattern: string = 'v*'\n): Promise<string | null> => {\n const logger = getLogger();\n\n try {\n // Parse current version first to validate it\n const currentSemver = semver.parse(currentVersion);\n if (!currentSemver) {\n logger.warn(`❌ Invalid version format: ${currentVersion}`);\n return null;\n }\n\n logger.info(`🔍 findPreviousReleaseTag: Looking for tags matching \"${tagPattern}\" < ${currentVersion}`);\n\n // Get all tags - try sorted first, fallback to unsorted\n let tags: string[];\n try {\n logger.info(` Running: git tag -l \"${tagPattern}\" --sort=-version:refname`);\n const { stdout } = await runSecure('git', ['tag', '-l', tagPattern, '--sort=-version:refname']);\n tags = stdout.trim().split('\\n').filter(tag => tag.length > 0);\n logger.info(` ✅ Found ${tags.length} tags matching pattern \"${tagPattern}\"`);\n if (tags.length > 0) {\n logger.info(` 📋 Tags (newest first): ${tags.slice(0, 15).join(', ')}${tags.length > 15 ? ` ... (${tags.length - 15} more)` : ''}`);\n }\n } catch (sortError: any) {\n // Fallback for older git versions that don't support --sort\n logger.info(` ⚠️ Git tag --sort failed: ${sortError.message}`);\n logger.info(` Falling back to manual sorting...`);\n const { stdout } = await runSecure('git', ['tag', '-l', tagPattern]);\n tags = stdout.trim().split('\\n').filter(tag => tag.length > 0);\n logger.info(` Found ${tags.length} tags (unsorted) matching pattern \"${tagPattern}\"`);\n\n // Manual semantic version sorting\n tags.sort((a, b) => {\n const aMatch = a.match(/v?(\\d+\\.\\d+\\.\\d+.*?)$/);\n const bMatch = b.match(/v?(\\d+\\.\\d+\\.\\d+.*?)$/);\n if (!aMatch || !bMatch) return 0;\n\n const aSemver = semver.parse(aMatch[1]);\n const bSemver = semver.parse(bMatch[1]);\n if (!aSemver || !bSemver) return 0;\n\n return semver.rcompare(aSemver, bSemver);\n });\n logger.info(` ✅ Sorted ${tags.length} tags manually`);\n }\n\n if (tags.length === 0) {\n logger.warn('');\n logger.warn(`❌ NO TAGS FOUND matching pattern \"${tagPattern}\"`);\n logger.warn(` To verify, run: git tag -l '${tagPattern}'`);\n logger.warn('');\n return null;\n }\n\n logger.info(` 🔬 Processing ${tags.length} tags to find the highest version < ${currentVersion}...`);\n\n // Find the highest version that is less than the current version\n let previousTag: string | null = null;\n let previousVersion: semver.SemVer | null = null;\n let validTags = 0;\n let skippedTags = 0;\n\n for (const tag of tags) {\n // Extract version from tag - handle \"v1.2.13\", \"1.2.13\", and \"working/v1.2.13\"\n const versionMatch = tag.match(/v?(\\d+\\.\\d+\\.\\d+.*?)$/);\n if (!versionMatch) {\n logger.debug(` ⏭️ Skipping tag \"${tag}\" (doesn't match version pattern)`);\n continue;\n }\n\n const versionString = versionMatch[1];\n const tagSemver = semver.parse(versionString);\n\n if (tagSemver) {\n validTags++;\n\n // Check if this tag version is less than current version\n if (semver.lt(tagSemver, currentSemver)) {\n // If we don't have a previous version yet, or this one is higher than our current previous\n if (!previousVersion || semver.gt(tagSemver, previousVersion)) {\n previousVersion = tagSemver;\n previousTag = tag; // Keep the original tag format\n logger.info(` ✅ New best candidate: ${tag} (${versionString} < ${currentVersion})`);\n } else {\n logger.debug(` ⏭️ ${tag} (${versionString}) is < current but not better than ${previousTag}`);\n }\n } else {\n skippedTags++;\n logger.debug(` ⏭️ ${tag} (${versionString}) >= current (${currentVersion}), skipping`);\n }\n }\n }\n\n logger.info('');\n logger.info(` 📊 Tag analysis results:`);\n logger.info(` - Total tags examined: ${tags.length}`);\n logger.info(` - Valid semver tags: ${validTags}`);\n logger.info(` - Tags >= current version (skipped): ${skippedTags}`);\n logger.info(` - Best match: ${previousTag || 'none'}`);\n logger.info('');\n\n if (previousTag) {\n logger.info(`✅ SUCCESS: Found previous tag: ${previousTag}`);\n logger.info(` Version comparison: ${previousVersion?.version} < ${currentVersion}`);\n logger.info('');\n return previousTag;\n }\n\n logger.warn(`❌ FAILED: No previous tag found for version ${currentVersion}`);\n logger.warn(` Pattern searched: \"${tagPattern}\"`);\n logger.warn(` Reason: All ${validTags} valid tags were >= ${currentVersion}`);\n logger.warn('');\n return null;\n } catch (error: any) {\n logger.debug(`Error finding previous release tag: ${error.message}`);\n return null;\n }\n};\n\n/**\n * Gets the current version from package.json\n *\n * @returns The current version string or null if not found\n */\nexport const getCurrentVersion = async (): Promise<string | null> => {\n const logger = getLogger();\n\n try {\n // First try to get from committed version in HEAD\n const { stdout } = await runSecure('git', ['show', 'HEAD:package.json']);\n const packageJson = safeJsonParse(stdout, 'package.json');\n const validated = validatePackageJson(packageJson, 'package.json');\n\n if (validated.version) {\n logger.debug(`Current version from HEAD:package.json: ${validated.version}`);\n return validated.version;\n }\n\n return null;\n } catch (error: any) {\n logger.debug(`Could not read version from HEAD:package.json: ${error.message}`);\n\n // Fallback to reading from working directory\n try {\n const packageJsonPath = path.join(process.cwd(), 'package.json');\n const content = await fs.readFile(packageJsonPath, 'utf-8');\n const packageJson = safeJsonParse(content, 'package.json');\n const validated = validatePackageJson(packageJson, 'package.json');\n\n if (validated.version) {\n logger.debug(`Current version from working directory package.json: ${validated.version}`);\n return validated.version;\n }\n\n return null;\n } catch (fallbackError: any) {\n logger.debug(`Error reading current version from filesystem: ${fallbackError.message}`);\n return null;\n }\n }\n};\n\n/**\n * Gets a reliable default for the --from parameter by trying multiple fallbacks\n *\n * Tries in order:\n * 1. Previous working branch tag (if on working branch)\n * 2. Previous release tag (if current version can be determined)\n * 3. main (local main branch - typical release comparison base)\n * 4. master (local master branch - legacy default)\n * 5. origin/main (remote main branch fallback)\n * 6. origin/master (remote master branch fallback)\n *\n * @param forceMainBranch If true, skip tag detection and use main branch\n * @param currentBranch Current branch name for branch-aware tag detection\n * @returns A valid git reference to use as the default from parameter\n * @throws Error if no valid reference can be found\n */\nexport const getDefaultFromRef = async (\n forceMainBranch: boolean = false,\n currentBranch?: string\n): Promise<string> => {\n const logger = getLogger();\n\n logger.info('');\n logger.info('═══════════════════════════════════════════════════════════');\n logger.info('🔍 DETECTING DEFAULT --from REFERENCE FOR RELEASE NOTES');\n logger.info('═══════════════════════════════════════════════════════════');\n logger.info(`📋 Input parameters:`);\n logger.info(` - forceMainBranch: ${forceMainBranch}`);\n logger.info(` - currentBranch: \"${currentBranch}\"`);\n logger.info('');\n\n // If forced to use main branch, skip tag detection\n if (forceMainBranch) {\n logger.info('⚡ Forced to use main branch, skipping tag detection');\n } else {\n // If on working branch, look for working branch tags first\n logger.info(`🎯 Branch check: currentBranch=\"${currentBranch}\", isWorking=${currentBranch === 'working'}`);\n if (currentBranch && currentBranch === 'working') {\n logger.info('');\n logger.info('📍 DETECTED WORKING BRANCH - Searching for working branch tags...');\n logger.info('───────────────────────────────────────────────────────────');\n try {\n const currentVersion = await getCurrentVersion();\n logger.info(`📦 Current version from package.json: ${currentVersion}`);\n if (currentVersion) {\n logger.info(`🔍 Searching for tags matching pattern: \"working/v*\"`);\n logger.info(` (Looking for tags < ${currentVersion})`);\n logger.info('');\n const previousTag = await findPreviousReleaseTag(\n currentVersion,\n 'working/v*'\n );\n logger.info(`🎯 findPreviousReleaseTag result: ${previousTag || 'null (no tag found)'}`);\n\n if (previousTag) {\n logger.info(`🔬 Validating tag reference: \"${previousTag}\"`);\n const isValid = await isValidGitRef(previousTag);\n logger.info(` Tag is valid git ref: ${isValid}`);\n\n if (isValid) {\n logger.info('');\n logger.info(`✅ SUCCESS: Using previous working branch tag '${previousTag}'`);\n logger.info(` This shows commits added since the last release`);\n logger.info('═══════════════════════════════════════════════════════════');\n logger.info('');\n return previousTag;\n } else {\n logger.warn('');\n logger.warn(`⚠️ VALIDATION FAILED: Tag \"${previousTag}\" exists but is not a valid git reference`);\n logger.warn(` This should not happen - the tag might be corrupted`);\n }\n } else {\n logger.warn('');\n logger.warn('❌ NO WORKING BRANCH TAG FOUND matching pattern \"working/v*\"');\n logger.warn(` Current version: ${currentVersion}`);\n logger.warn(' 💡 To create working branch tags for past releases, run:');\n logger.warn(' kodrdriv development --create-retroactive-tags');\n logger.warn('');\n logger.warn(' Falling back to regular tag search...');\n }\n } else {\n logger.warn('');\n logger.warn('❌ CANNOT READ VERSION from package.json');\n logger.warn(' Cannot search for working branch tags without current version');\n }\n } catch (error: any) {\n logger.warn('');\n logger.warn(`❌ ERROR while searching for working branch tag: ${error.message}`);\n logger.debug(`Full error stack: ${error.stack}`);\n logger.warn(' Falling back to regular tag search...');\n }\n logger.info('───────────────────────────────────────────────────────────');\n logger.info('');\n } else {\n logger.info(`ℹ️ Not on \"working\" branch - skipping working tag search`);\n logger.info(` (Only search for working/v* tags when on working branch)`);\n logger.info('');\n }\n\n // First, try to find the previous release tag\n try {\n const currentVersion = await getCurrentVersion();\n if (currentVersion) {\n const previousTag = await findPreviousReleaseTag(currentVersion);\n if (previousTag && await isValidGitRef(previousTag)) {\n logger.info(`Using previous release tag '${previousTag}' as default --from reference`);\n return previousTag;\n }\n }\n } catch (error: any) {\n logger.debug(`Could not determine previous release tag: ${error.message}`);\n }\n }\n\n // Fallback to branch-based references\n const candidates = [\n 'main',\n 'master',\n 'origin/main',\n 'origin/master'\n ];\n\n for (const candidate of candidates) {\n logger.debug(`Testing git reference candidate: ${candidate}`);\n if (await isValidGitRef(candidate)) {\n if (forceMainBranch) {\n logger.info(`Using '${candidate}' as forced main branch reference`);\n } else {\n logger.info(`Using '${candidate}' as fallback --from reference (no previous release tag found)`);\n }\n return candidate;\n }\n }\n\n // If we get here, something is seriously wrong with the git repository\n throw new Error(\n 'Could not find a valid default git reference for --from parameter. ' +\n 'Please specify --from explicitly or check your git repository configuration. ' +\n `Tried: ${forceMainBranch ? 'main branch only' : 'previous release tag'}, ${candidates.join(', ')}`\n );\n};\n\n/**\n * Gets the default branch name from the remote repository\n */\nexport const getRemoteDefaultBranch = async (): Promise<string | null> => {\n const logger = getLogger();\n try {\n // Try to get the symbolic reference for origin/HEAD\n const { stdout } = await run('git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null || echo \"\"');\n if (stdout.trim()) {\n // Extract branch name from refs/remotes/origin/branch-name\n const match = stdout.trim().match(/refs\\/remotes\\/origin\\/(.+)$/);\n if (match) {\n const branchName = match[1];\n logger.debug(`Remote default branch is: ${branchName}`);\n return branchName;\n }\n }\n\n // Fallback: try to get it from ls-remote\n const { stdout: lsRemoteOutput } = await run('git ls-remote --symref origin HEAD');\n const symrefMatch = lsRemoteOutput.match(/ref: refs\\/heads\\/(.+)\\s+HEAD/);\n if (symrefMatch) {\n const branchName = symrefMatch[1];\n logger.debug(`Remote default branch from ls-remote: ${branchName}`);\n return branchName;\n }\n\n logger.debug('Could not determine remote default branch');\n return null;\n } catch (error) {\n logger.debug(`Failed to get remote default branch: ${error}`);\n return null;\n }\n};\n\n/**\n * Checks if a local branch exists\n */\nexport const localBranchExists = async (branchName: string): Promise<boolean> => {\n const logger = getLogger();\n const result = await isValidGitRefSilent(`refs/heads/${branchName}`);\n if (result) {\n logger.debug(`Local branch '${branchName}' exists`);\n } else {\n logger.debug(`Local branch '${branchName}' does not exist`);\n }\n return result;\n};\n\n/**\n * Checks if a remote branch exists\n */\nexport const remoteBranchExists = async (branchName: string, remote: string = 'origin'): Promise<boolean> => {\n const logger = getLogger();\n const result = await isValidGitRefSilent(`refs/remotes/${remote}/${branchName}`);\n if (result) {\n logger.debug(`Remote branch '${remote}/${branchName}' exists`);\n } else {\n logger.debug(`Remote branch '${remote}/${branchName}' does not exist`);\n }\n return result;\n};\n\n/**\n * Gets the commit SHA for a given branch (local or remote)\n */\nexport const getBranchCommitSha = async (branchRef: string): Promise<string> => {\n // Validate the ref first to prevent injection\n if (!validateGitRef(branchRef)) {\n throw new Error(`Invalid git reference: ${branchRef}`);\n }\n const { stdout } = await runSecure('git', ['rev-parse', branchRef]);\n return stdout.trim();\n};\n\n/**\n * Checks if a local branch is in sync with its remote counterpart\n */\nexport const isBranchInSyncWithRemote = async (branchName: string, remote: string = 'origin'): Promise<{\n inSync: boolean;\n localSha?: string;\n remoteSha?: string;\n localExists: boolean;\n remoteExists: boolean;\n error?: string;\n}> => {\n const logger = getLogger();\n\n try {\n // Validate inputs first to prevent injection\n if (!validateGitRef(branchName)) {\n throw new Error(`Invalid branch name: ${branchName}`);\n }\n if (!validateGitRef(remote)) {\n throw new Error(`Invalid remote name: ${remote}`);\n }\n\n // First, fetch latest remote refs without affecting working directory\n await runSecure('git', ['fetch', remote, '--quiet']);\n\n const localExists = await localBranchExists(branchName);\n const remoteExists = await remoteBranchExists(branchName, remote);\n\n if (!localExists) {\n return {\n inSync: false,\n localExists: false,\n remoteExists,\n error: `Local branch '${branchName}' does not exist`\n };\n }\n\n if (!remoteExists) {\n return {\n inSync: false,\n localExists: true,\n remoteExists: false,\n error: `Remote branch '${remote}/${branchName}' does not exist`\n };\n }\n\n // Both branches exist, compare their SHAs\n const localSha = await getBranchCommitSha(`refs/heads/${branchName}`);\n const remoteSha = await getBranchCommitSha(`refs/remotes/${remote}/${branchName}`);\n\n const inSync = localSha === remoteSha;\n\n logger.debug(`Branch sync check for '${branchName}': local=${localSha.substring(0, 8)}, remote=${remoteSha.substring(0, 8)}, inSync=${inSync}`);\n\n return {\n inSync,\n localSha,\n remoteSha,\n localExists: true,\n remoteExists: true\n };\n\n } catch (error: any) {\n logger.debug(`Failed to check branch sync for '${branchName}': ${error.message}`);\n return {\n inSync: false,\n localExists: false,\n remoteExists: false,\n error: `Failed to check branch sync: ${error.message}`\n };\n }\n};\n\n/**\n * Attempts to safely sync a local branch with its remote counterpart\n * Returns true if successful, false if conflicts exist that require manual resolution\n */\nexport const safeSyncBranchWithRemote = async (branchName: string, remote: string = 'origin'): Promise<{\n success: boolean;\n error?: string;\n conflictResolutionRequired?: boolean;\n}> => {\n const logger = getLogger();\n\n try {\n // Validate inputs first to prevent injection\n if (!validateGitRef(branchName)) {\n throw new Error(`Invalid branch name: ${branchName}`);\n }\n if (!validateGitRef(remote)) {\n throw new Error(`Invalid remote name: ${remote}`);\n }\n\n // Check current branch to restore later if needed\n const { stdout: currentBranch } = await runSecure('git', ['branch', '--show-current']);\n const originalBranch = currentBranch.trim();\n\n // Fetch latest remote refs\n await runSecure('git', ['fetch', remote, '--quiet']);\n\n // Check if local branch exists\n const localExists = await localBranchExists(branchName);\n const remoteExists = await remoteBranchExists(branchName, remote);\n\n if (!remoteExists) {\n return {\n success: false,\n error: `Remote branch '${remote}/${branchName}' does not exist`\n };\n }\n\n if (!localExists) {\n // Create local branch tracking the remote\n await runSecure('git', ['branch', branchName, `${remote}/${branchName}`]);\n logger.debug(`Created local branch '${branchName}' tracking '${remote}/${branchName}'`);\n return { success: true };\n }\n\n // Check if we need to switch to the target branch\n const needToSwitch = originalBranch !== branchName;\n\n if (needToSwitch) {\n // Check for uncommitted changes before switching\n const { stdout: statusOutput } = await runSecure('git', ['status', '--porcelain']);\n if (statusOutput.trim()) {\n return {\n success: false,\n error: `Cannot switch to branch '${branchName}' because you have uncommitted changes. Please commit or stash your changes first.`\n };\n }\n\n // Switch to target branch\n await runSecure('git', ['checkout', branchName]);\n }\n\n try {\n // Try to pull with fast-forward only\n await runSecure('git', ['pull', remote, branchName, '--ff-only']);\n logger.debug(`Successfully synced '${branchName}' with '${remote}/${branchName}'`);\n\n // Switch back to original branch if we switched\n if (needToSwitch && originalBranch) {\n await runSecure('git', ['checkout', originalBranch]);\n }\n\n return { success: true };\n\n } catch (pullError: any) {\n // Switch back to original branch if we switched\n if (needToSwitch && originalBranch) {\n try {\n await runSecure('git', ['checkout', originalBranch]);\n } catch (checkoutError) {\n logger.warn(`Failed to switch back to original branch '${originalBranch}': ${checkoutError}`);\n }\n }\n\n // Check if this is a merge conflict or diverged branches\n if (pullError.message.includes('diverged') ||\n pullError.message.includes('non-fast-forward') ||\n pullError.message.includes('conflict') ||\n pullError.message.includes('CONFLICT')) {\n return {\n success: false,\n conflictResolutionRequired: true,\n error: `Branch '${branchName}' has diverged from '${remote}/${branchName}' and requires manual conflict resolution`\n };\n }\n\n return {\n success: false,\n error: `Failed to sync branch '${branchName}': ${pullError.message}`\n };\n }\n\n } catch (error: any) {\n return {\n success: false,\n error: `Failed to sync branch '${branchName}': ${error.message}`\n };\n }\n};\n\n/**\n * Gets the current branch name\n */\nexport const getCurrentBranch = async (): Promise<string> => {\n const { stdout } = await runSecure('git', ['branch', '--show-current']);\n return stdout.trim();\n};\n\n/**\n * Gets git status summary including unstaged files, uncommitted changes, and unpushed commits\n */\nexport const getGitStatusSummary = async (workingDir?: string): Promise<{\n branch: string;\n hasUnstagedFiles: boolean;\n hasUncommittedChanges: boolean;\n hasUnpushedCommits: boolean;\n unstagedCount: number;\n uncommittedCount: number;\n unpushedCount: number;\n status: string; // summary status string\n}> => {\n const logger = getLogger();\n\n try {\n const originalCwd = process.cwd();\n if (workingDir) {\n process.chdir(workingDir);\n }\n\n try {\n // Get current branch\n const branch = await getCurrentBranch();\n\n // Get git status for unstaged and uncommitted changes\n const { stdout: statusOutput } = await runSecure('git', ['status', '--porcelain']);\n const statusLines = statusOutput.trim().split('\\n').filter(line => line.trim());\n\n // Count different types of changes\n let unstagedCount = 0;\n let uncommittedCount = 0;\n\n for (const line of statusLines) {\n const statusCode = line.substring(0, 2);\n\n // For untracked files (??) count as unstaged only once\n if (statusCode === '??') {\n unstagedCount++;\n continue;\n }\n\n // Check for unstaged changes (working directory changes)\n // Second character represents working tree status\n if (statusCode[1] !== ' ' && statusCode[1] !== '') {\n unstagedCount++;\n }\n\n // Check for uncommitted changes (staged changes)\n // First character represents index status\n if (statusCode[0] !== ' ' && statusCode[0] !== '') {\n uncommittedCount++;\n }\n }\n\n // Check for unpushed commits by comparing with remote\n let unpushedCount = 0;\n let hasUnpushedCommits = false;\n\n try {\n // First fetch to get latest remote refs\n await runSecure('git', ['fetch', 'origin', '--quiet']);\n\n // Check if remote branch exists\n const remoteExists = await remoteBranchExists(branch);\n\n if (remoteExists) {\n // Get count of commits ahead of remote (branch already validated in calling function)\n const { stdout: aheadOutput } = await runSecure('git', ['rev-list', '--count', `origin/${branch}..HEAD`]);\n unpushedCount = parseInt(aheadOutput.trim()) || 0;\n hasUnpushedCommits = unpushedCount > 0;\n }\n } catch (error) {\n logger.debug(`Could not check for unpushed commits: ${error}`);\n // Remote might not exist or other issues - not critical for status\n }\n\n const hasUnstagedFiles = unstagedCount > 0;\n const hasUncommittedChanges = uncommittedCount > 0;\n\n // Build status summary\n const statusParts: string[] = [];\n\n if (hasUnstagedFiles) {\n statusParts.push(`${unstagedCount} unstaged`);\n }\n if (hasUncommittedChanges) {\n statusParts.push(`${uncommittedCount} uncommitted`);\n }\n if (hasUnpushedCommits) {\n statusParts.push(`${unpushedCount} unpushed`);\n }\n\n const status = statusParts.length > 0 ? statusParts.join(', ') : 'clean';\n\n return {\n branch,\n hasUnstagedFiles,\n hasUncommittedChanges,\n hasUnpushedCommits,\n unstagedCount,\n uncommittedCount,\n unpushedCount,\n status\n };\n\n } finally {\n if (workingDir) {\n process.chdir(originalCwd);\n }\n }\n\n } catch (error: any) {\n logger.debug(`Failed to get git status summary: ${error.message}`);\n return {\n branch: 'unknown',\n hasUnstagedFiles: false,\n hasUncommittedChanges: false,\n hasUnpushedCommits: false,\n unstagedCount: 0,\n uncommittedCount: 0,\n unpushedCount: 0,\n status: 'error'\n };\n }\n};\n\n/**\n * Gets the list of globally linked packages (packages available to be linked to)\n */\nexport const getGloballyLinkedPackages = async (): Promise<Set<string>> => {\n const execPromise = util.promisify(exec);\n\n try {\n const { stdout } = await execPromise('npm ls --link -g --json');\n const result = safeJsonParse(stdout, 'npm ls global output');\n\n if (result.dependencies && typeof result.dependencies === 'object') {\n return new Set(Object.keys(result.dependencies));\n }\n\n return new Set();\n } catch (error: any) {\n // Try to parse from error stdout if available\n if (error.stdout) {\n try {\n const result = safeJsonParse(error.stdout, 'npm ls global error output');\n if (result.dependencies && typeof result.dependencies === 'object') {\n return new Set(Object.keys(result.dependencies));\n }\n } catch {\n // If JSON parsing fails, return empty set\n }\n }\n\n return new Set();\n }\n};\n\n/**\n * Gets the list of packages that this package is actively linking to (consuming linked packages)\n */\nexport const getLinkedDependencies = async (packageDir: string): Promise<Set<string>> => {\n const execPromise = util.promisify(exec);\n\n try {\n const { stdout } = await execPromise('npm ls --link --json', { cwd: packageDir });\n const result = safeJsonParse(stdout, 'npm ls local output');\n\n if (result.dependencies && typeof result.dependencies === 'object') {\n return new Set(Object.keys(result.dependencies));\n }\n\n return new Set();\n } catch (error: any) {\n // npm ls --link often exits with non-zero code but still provides valid JSON in stdout\n if (error.stdout) {\n try {\n const result = safeJsonParse(error.stdout, 'npm ls local error output');\n if (result.dependencies && typeof result.dependencies === 'object') {\n return new Set(Object.keys(result.dependencies));\n }\n } catch {\n // If JSON parsing fails, return empty set\n }\n }\n\n return new Set();\n }\n};\n\n/**\n * Checks for actual semantic version compatibility issues between linked packages and their consumers\n * Returns a set of dependency names that have real compatibility problems\n *\n * This function ignores npm's strict prerelease handling and focuses on actual compatibility:\n * - \"^4.4\" is compatible with \"4.4.53-dev.0\" (prerelease of compatible minor version)\n * - \"^4.4\" is incompatible with \"4.5.3\" (different minor version)\n */\nexport const getLinkCompatibilityProblems = async (\n packageDir: string,\n allPackagesInfo?: Map<string, { name: string; version: string; path: string }>\n): Promise<Set<string>> => {\n try {\n // Read the consumer package.json\n const packageJsonPath = path.join(packageDir, 'package.json');\n const packageJsonContent = await fs.readFile(packageJsonPath, 'utf-8');\n const parsed = safeJsonParse(packageJsonContent, packageJsonPath);\n const packageJson = validatePackageJson(parsed, packageJsonPath);\n\n const problemDependencies = new Set<string>();\n\n // Get linked dependencies\n const linkedDeps = await getLinkedDependencies(packageDir);\n\n // Check each dependency type\n const dependencyTypes = ['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies'];\n\n for (const depType of dependencyTypes) {\n const deps = packageJson[depType];\n if (!deps || typeof deps !== 'object') continue;\n\n for (const [depName, versionRange] of Object.entries(deps)) {\n // Only check dependencies that are currently linked\n if (!linkedDeps.has(depName)) continue;\n\n // Skip if version range is not a string or is invalid\n if (typeof versionRange !== 'string') continue;\n\n try {\n let linkedVersion: string | undefined;\n\n // If we have package info provided, use it\n if (allPackagesInfo) {\n const packageInfo = allPackagesInfo.get(depName);\n if (packageInfo) {\n linkedVersion = packageInfo.version;\n }\n }\n\n // If we don't have version from package info, try to read it from the linked package\n if (!linkedVersion) {\n try {\n // Get the linked package path and read its version\n const nodeModulesPath = path.join(packageDir, 'node_modules', depName, 'package.json');\n const linkedPackageJson = await fs.readFile(nodeModulesPath, 'utf-8');\n const linkedParsed = safeJsonParse(linkedPackageJson, nodeModulesPath);\n const linkedValidated = validatePackageJson(linkedParsed, nodeModulesPath);\n linkedVersion = linkedValidated.version;\n } catch {\n // Could not read linked package version, skip this dependency\n continue;\n }\n }\n\n if (!linkedVersion) continue;\n\n // Check compatibility with custom logic for prerelease versions\n if (!isVersionCompatibleWithRange(linkedVersion, versionRange)) {\n problemDependencies.add(depName);\n }\n } catch {\n // Skip dependencies we can't process\n continue;\n }\n }\n }\n\n return problemDependencies;\n } catch {\n // If we can't read the package.json or process it, return empty set\n return new Set();\n }\n};\n\n/**\n * Custom semver compatibility check that handles prerelease versions more intelligently\n * than npm's strict checking, with stricter caret range handling\n *\n * Examples:\n * - isVersionCompatibleWithRange(\"4.4.53-dev.0\", \"^4.4\") => true\n * - isVersionCompatibleWithRange(\"4.5.3\", \"^4.4\") => false\n * - isVersionCompatibleWithRange(\"4.4.1\", \"^4.4\") => true\n */\nconst isVersionCompatibleWithRange = (version: string, range: string): boolean => {\n try {\n const parsedVersion = semver.parse(version);\n if (!parsedVersion) return false;\n\n // Parse the range to understand what we're comparing against\n const rangeObj = semver.validRange(range);\n if (!rangeObj) return false;\n\n // For caret ranges like \"^4.4\", we want more strict checking than semver's default\n if (range.startsWith('^')) {\n const rangeVersion = range.substring(1); // Remove the ^\n\n // Try to parse as a complete version first\n let parsedRange = semver.parse(rangeVersion);\n\n // If that fails, try to coerce it (handles cases like \"4.4\" -> \"4.4.0\")\n if (!parsedRange) {\n const coercedRange = semver.coerce(rangeVersion);\n if (coercedRange) {\n parsedRange = coercedRange;\n } else {\n return false;\n }\n }\n\n // For prerelease versions, check if the base version (without prerelease)\n // matches the major.minor from the range\n if (parsedVersion.prerelease.length > 0) {\n return parsedVersion.major === parsedRange.major &&\n parsedVersion.minor === parsedRange.minor;\n }\n\n // For regular versions with caret ranges, be strict about minor version\n // ^4.4 should only accept 4.4.x, not 4.5.x\n return parsedVersion.major === parsedRange.major &&\n parsedVersion.minor === parsedRange.minor;\n }\n\n // For other range types (exact, tilde, etc.), use standard semver checking\n if (parsedVersion.prerelease.length > 0) {\n const baseVersion = `${parsedVersion.major}.${parsedVersion.minor}.${parsedVersion.patch}`;\n return semver.satisfies(baseVersion, range);\n }\n\n return semver.satisfies(version, range);\n } catch {\n // If semver parsing fails, assume incompatible\n return false;\n }\n};\n\n/**\n * Checks for npm link problems (version mismatches) in a package directory\n * Returns a set of dependency names that have link problems\n *\n * @deprecated Use getLinkCompatibilityProblems instead for better prerelease version handling\n */\nexport const getLinkProblems = async (packageDir: string): Promise<Set<string>> => {\n const execPromise = util.promisify(exec);\n\n try {\n const { stdout } = await execPromise('npm ls --link --json', { cwd: packageDir });\n const result = safeJsonParse(stdout, 'npm ls troubleshoot output');\n\n const problemDependencies = new Set<string>();\n\n // Check if there are any problems reported\n if (result.problems && Array.isArray(result.problems)) {\n // Parse problems array to extract dependency names\n for (const problem of result.problems) {\n if (typeof problem === 'string' && problem.includes('invalid:')) {\n // Extract package name from problem string like \"invalid: @fjell/eslint-config@1.1.20-dev.0 ...\"\n // Handle both scoped (@scope/name) and unscoped (name) packages\n const match = problem.match(/invalid:\\s+(@[^/]+\\/[^@\\s]+|[^@\\s]+)@/);\n if (match) {\n problemDependencies.add(match[1]);\n }\n }\n }\n }\n\n // Also check individual dependencies for problems\n if (result.dependencies && typeof result.dependencies === 'object') {\n for (const [depName, depInfo] of Object.entries(result.dependencies)) {\n if (depInfo && typeof depInfo === 'object') {\n const dep = depInfo as any;\n // Check if this dependency has problems or is marked as invalid\n if ((dep.problems && Array.isArray(dep.problems) && dep.problems.length > 0) ||\n dep.invalid) {\n problemDependencies.add(depName);\n }\n }\n }\n }\n\n return problemDependencies;\n } catch (error: any) {\n // npm ls --link often exits with non-zero code when there are problems\n // but still provides valid JSON in stdout\n if (error.stdout) {\n try {\n const result = safeJsonParse(error.stdout, 'npm ls troubleshoot error output');\n const problemDependencies = new Set<string>();\n\n // Check if there are any problems reported\n if (result.problems && Array.isArray(result.problems)) {\n for (const problem of result.problems) {\n if (typeof problem === 'string' && problem.includes('invalid:')) {\n const match = problem.match(/invalid:\\s+(@[^/]+\\/[^@\\s]+|[^@\\s]+)@/);\n if (match) {\n problemDependencies.add(match[1]);\n }\n }\n }\n }\n\n // Also check individual dependencies for problems\n if (result.dependencies && typeof result.dependencies === 'object') {\n for (const [depName, depInfo] of Object.entries(result.dependencies)) {\n if (depInfo && typeof depInfo === 'object') {\n const dep = depInfo as any;\n if ((dep.problems && Array.isArray(dep.problems) && dep.problems.length > 0) ||\n dep.invalid) {\n problemDependencies.add(depName);\n }\n }\n }\n }\n\n return problemDependencies;\n } catch {\n // If JSON parsing fails, return empty set\n return new Set();\n }\n }\n\n return new Set();\n }\n};\n\n/**\n * Checks if a package directory is npm linked (has a global symlink)\n */\nexport const isNpmLinked = async (packageDir: string): Promise<boolean> => {\n const logger = getLogger();\n\n try {\n // Read package.json to get the package name\n const packageJsonPath = path.join(packageDir, 'package.json');\n\n try {\n await fs.access(packageJsonPath);\n } catch {\n // No package.json found\n return false;\n }\n\n const packageJsonContent = await fs.readFile(packageJsonPath, 'utf-8');\n const packageJson = safeJsonParse(packageJsonContent, packageJsonPath);\n const packageName = packageJson.name;\n\n if (!packageName) {\n return false;\n }\n\n // Check if the package is globally linked by running npm ls -g --depth=0\n try {\n const { stdout } = await runSecure('npm', ['ls', '-g', '--depth=0', '--json']);\n const globalPackages = safeJsonParse(stdout, 'npm ls global depth check output');\n\n // Check if our package is in the global dependencies\n if (globalPackages.dependencies && globalPackages.dependencies[packageName]) {\n // Verify the symlink actually points to our directory\n const globalPath = globalPackages.dependencies[packageName].resolved;\n if (globalPath && globalPath.startsWith('file:')) {\n const linkedPath = globalPath.replace('file:', '');\n const realPackageDir = await fs.realpath(packageDir);\n const realLinkedPath = await fs.realpath(linkedPath);\n return realPackageDir === realLinkedPath;\n }\n }\n } catch (error) {\n // If npm ls fails, try alternative approach\n logger.debug(`npm ls failed for ${packageName}, trying alternative check: ${error}`);\n\n // Alternative: check if there's a symlink in npm's global node_modules\n try {\n const { stdout: npmPrefix } = await run('npm prefix -g');\n const globalNodeModules = path.join(npmPrefix.trim(), 'node_modules', packageName);\n\n const stat = await fs.lstat(globalNodeModules);\n if (stat.isSymbolicLink()) {\n const realGlobalPath = await fs.realpath(globalNodeModules);\n const realPackageDir = await fs.realpath(packageDir);\n return realGlobalPath === realPackageDir;\n }\n } catch {\n // If all else fails, assume not linked\n return false;\n }\n }\n\n return false;\n } catch (error) {\n logger.debug(`Error checking npm link status for ${packageDir}: ${error}`);\n return false;\n }\n};\n"],"names":["isValidGitRefSilent","ref","validateGitRef","runSecure","stdio","isValidGitRef","logger","getLogger","debug","error","findPreviousReleaseTag","currentVersion","tagPattern","currentSemver","semver","parse","warn","info","tags","stdout","trim","split","filter","tag","length","slice","join","sortError","message","sort","a","b","aMatch","match","bMatch","aSemver","bSemver","rcompare","previousTag","previousVersion","validTags","skippedTags","versionMatch","versionString","tagSemver","lt","gt","version","getCurrentVersion","packageJson","safeJsonParse","validated","validatePackageJson","packageJsonPath","path","process","cwd","content","fs","readFile","fallbackError","getDefaultFromRef","forceMainBranch","currentBranch","isValid","stack","candidates","candidate","Error","localBranchExists","branchName","result","remoteBranchExists","remote","getBranchCommitSha","branchRef","isBranchInSyncWithRemote","localExists","remoteExists","inSync","localSha","remoteSha","substring","safeSyncBranchWithRemote","originalBranch","success","needToSwitch","statusOutput","pullError","checkoutError","includes","conflictResolutionRequired","getCurrentBranch","getGitStatusSummary","workingDir","originalCwd","chdir","branch","statusLines","line","unstagedCount","uncommittedCount","statusCode","unpushedCount","hasUnpushedCommits","aheadOutput","parseInt","hasUnstagedFiles","hasUncommittedChanges","statusParts","push","status","getGloballyLinkedPackages","execPromise","util","promisify","exec","dependencies","Set","Object","keys","getLinkedDependencies","packageDir","getLinkCompatibilityProblems","allPackagesInfo","packageJsonContent","parsed","problemDependencies","linkedDeps","dependencyTypes","depType","deps","depName","versionRange","entries","has","linkedVersion","packageInfo","get","nodeModulesPath","linkedPackageJson","linkedParsed","linkedValidated","isVersionCompatibleWithRange","add","range","parsedVersion","rangeObj","validRange","startsWith","rangeVersion","parsedRange","coercedRange","coerce","prerelease","major","minor","baseVersion","patch","satisfies"],"mappings":"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"}
|
package/dist/util/openai.js
CHANGED
|
@@ -136,7 +136,14 @@ async function createCompletion(messages, options = {
|
|
|
136
136
|
timeout: timeoutMs
|
|
137
137
|
});
|
|
138
138
|
const modelToUse = options.model || "gpt-4o-mini";
|
|
139
|
-
|
|
139
|
+
// Calculate request size
|
|
140
|
+
const requestSize = JSON.stringify(messages).length;
|
|
141
|
+
const requestSizeKB = (requestSize / 1024).toFixed(2);
|
|
142
|
+
// Log model, reasoning level, and request size
|
|
143
|
+
const reasoningInfo = options.openaiReasoning ? ` | Reasoning: ${options.openaiReasoning}` : '';
|
|
144
|
+
logger.info('🤖 Making request to OpenAI');
|
|
145
|
+
logger.info(' Model: %s%s', modelToUse, reasoningInfo);
|
|
146
|
+
logger.info(' Request size: %s KB (%s bytes)', requestSizeKB, requestSize.toLocaleString());
|
|
140
147
|
logger.debug('Sending prompt to OpenAI: %j', messages);
|
|
141
148
|
var _options_openaiMaxOutputTokens, _ref;
|
|
142
149
|
// Use openaiMaxOutputTokens if specified (highest priority), otherwise fall back to maxTokens, or default to 10000
|
|
@@ -164,7 +171,6 @@ async function createCompletion(messages, options = {
|
|
|
164
171
|
// Add reasoning parameter if specified and model supports it
|
|
165
172
|
if (options.openaiReasoning && (modelToUse.includes('gpt-5') || modelToUse.includes('o3'))) {
|
|
166
173
|
apiOptions.reasoning_effort = options.openaiReasoning;
|
|
167
|
-
logger.debug('Using OpenAI reasoning level: %s', options.openaiReasoning);
|
|
168
174
|
}
|
|
169
175
|
// Add timeout wrapper to the OpenAI API call
|
|
170
176
|
const completionPromise = openai.chat.completions.create(apiOptions);
|
|
@@ -196,6 +202,15 @@ async function createCompletion(messages, options = {
|
|
|
196
202
|
if (!response) {
|
|
197
203
|
throw new OpenAIError('No response received from OpenAI');
|
|
198
204
|
}
|
|
205
|
+
// Calculate and log response size
|
|
206
|
+
const responseSize = response.length;
|
|
207
|
+
const responseSizeKB = (responseSize / 1024).toFixed(2);
|
|
208
|
+
logger.info(' Response size: %s KB (%s bytes)', responseSizeKB, responseSize.toLocaleString());
|
|
209
|
+
// Log token usage if available
|
|
210
|
+
if (completion.usage) {
|
|
211
|
+
var _completion_usage_prompt_tokens, _completion_usage_completion_tokens, _completion_usage_total_tokens;
|
|
212
|
+
logger.info(' Token usage: %s prompt + %s completion = %s total', ((_completion_usage_prompt_tokens = completion.usage.prompt_tokens) === null || _completion_usage_prompt_tokens === void 0 ? void 0 : _completion_usage_prompt_tokens.toLocaleString()) || '?', ((_completion_usage_completion_tokens = completion.usage.completion_tokens) === null || _completion_usage_completion_tokens === void 0 ? void 0 : _completion_usage_completion_tokens.toLocaleString()) || '?', ((_completion_usage_total_tokens = completion.usage.total_tokens) === null || _completion_usage_total_tokens === void 0 ? void 0 : _completion_usage_total_tokens.toLocaleString()) || '?');
|
|
213
|
+
}
|
|
199
214
|
logger.debug('Received response from OpenAI: %s...', response.substring(0, 30));
|
|
200
215
|
if (options.responseFormat) {
|
|
201
216
|
return safeJsonParse(response, 'OpenAI API response');
|