@kb-labs/release-manager-changelog 2.85.0 → 2.87.0

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/index.js CHANGED
@@ -1222,6 +1222,16 @@ function listBuiltinTemplates() {
1222
1222
  }
1223
1223
 
1224
1224
  // src/changelog-generator.ts
1225
+ var CHANGELOG_LLM_TIMEOUT_MS = 45e3;
1226
+ async function renderWithTimeout(result) {
1227
+ if (typeof result === "string") return result;
1228
+ return Promise.race([
1229
+ result,
1230
+ new Promise(
1231
+ (_, reject) => setTimeout(() => reject(new Error("Changelog LLM render timeout after 45s")), CHANGELOG_LLM_TIMEOUT_MS)
1232
+ )
1233
+ ]);
1234
+ }
1225
1235
  async function generateChangelog(options) {
1226
1236
  const {
1227
1237
  repoRoot,
@@ -1359,8 +1369,7 @@ async function generateChangelog(options) {
1359
1369
  };
1360
1370
  onProgress?.("Enhancing lockstep changelog with template...");
1361
1371
  const templateData = packageToTemplateData(mergedRelease, locale, changelogConfig?.metadata, changelogConfig?.groups);
1362
- const result = template.render(templateData, platform);
1363
- const rendered = typeof result === "string" ? result : await result;
1372
+ const rendered = await renderWithTimeout(template.render(templateData, platform));
1364
1373
  const renderedLines = rendered.split("\n");
1365
1374
  let contentStartIdx = 0;
1366
1375
  for (let i = 0; i < renderedLines.length; i++) {
@@ -1383,8 +1392,7 @@ async function generateChangelog(options) {
1383
1392
  }
1384
1393
  onProgress?.(`Formatting changelog for ${pkg.name} (${i + 1}/${packageReleases.length})...`);
1385
1394
  const templateData = packageToTemplateData(pkg, locale, changelogConfig?.metadata, changelogConfig?.groups);
1386
- const result = template.render(templateData, platform);
1387
- const formatted = typeof result === "string" ? result : await result;
1395
+ const formatted = await renderWithTimeout(template.render(templateData, platform));
1388
1396
  formattedPackages.push(formatted);
1389
1397
  }
1390
1398
  markdown = formattedPackages.join("\n\n");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/parser.ts","../src/cache.ts","../src/git-range.ts","../src/versioning.ts","../src/providers.ts","../src/formatters/json.ts","../src/formatters/markdown.ts","../src/formatters/llm-markdown.ts","../src/templates/types.ts","../src/templates/loader.ts","../src/changelog-generator.ts"],"names":["simpleGit","t","groupChangesByType","__filename","__dirname","join","lines"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * High-performance commit parser with conventional commits support\n * Single git log traversal with streaming parse\n */\n\nimport simpleGit from 'simple-git';\nimport type { Change, CommitType, BreakingChange, Reference, Author, ParseOptions } from './types';\n\n/**\n * Parse commits from git history using single traversal\n * Performance: O(commits) - no N× git diff calls\n */\nexport async function parseCommits(options: ParseOptions): Promise<Change[]> {\n const {\n cwd,\n from,\n to = 'HEAD',\n packagePath,\n ignoreAuthors = [],\n includeTypes,\n excludeTypes,\n collapseMerges = true,\n collapseReverts = true,\n preferMergeSummary = true,\n } = options;\n\n const git = simpleGit(cwd);\n\n // Build git log command for single traversal\n // Format: SHA, author name, author email, author date (ISO), subject, body\n const format = '%H%x00%an%x00%ae%x00%ai%x00%s%x00%b%n--COMMIT_FOOTER--';\n\n // Get commits with --name-status for changed files info\n // NOTE: simple-git requires arguments as separate array elements for git.raw()\n // Special case: if from ends with ^, it might not exist (parent of first commit)\n // In this case, use --root to show all commits from beginning\n const useRoot = from.endsWith('^');\n const logArgs = useRoot\n ? ['log', '--no-merges', '--name-status', '--root', `--format=${format}`, to]\n : ['log', '--no-merges', '--name-status', `--format=${format}`, `${from}..${to}`];\n\n // Add package filter if specified\n if (packagePath) {\n logArgs.push('--', packagePath);\n }\n\n const logOutput = await git.raw(logArgs);\n\n return parseGitLogOutput(logOutput, {\n ignoreAuthors,\n includeTypes,\n excludeTypes,\n collapseMerges,\n collapseReverts,\n preferMergeSummary,\n });\n}\n\n/**\n * Parse raw git log output into Change objects\n */\nfunction parseGitLogOutput(\n output: string,\n options: {\n ignoreAuthors: string[];\n includeTypes?: string[];\n excludeTypes?: string[];\n collapseMerges: boolean;\n collapseReverts: boolean;\n preferMergeSummary: boolean;\n }\n): Change[] {\n const changes: Change[] = [];\n\n // Split by commit delimiter\n // Each commit block contains: header line + optional file changes\n // After --COMMIT_FOOTER-- there's a blank line, then file lines (D/M/A), then blank line before next commit\n const commits = output.split('--COMMIT_FOOTER--').filter(Boolean);\n\n for (let i = 0; i < commits.length; i++) {\n const commitBlock = commits[i];\n if (!commitBlock) {continue;}\n\n // After split by --COMMIT_FOOTER--, format is:\n // Block 0: \"SHA\\0author...\\0body\\n\"\n // Block 1: \"\\n\\nD\\tfile1\\nM\\tfile2\\nSHA\\0author...\\0body\\n\"\n // Block 2: \"\\n\\nA\\tfile3\\nSHA\\0...\\n\"\n //\n // So: header is at END of block, files are at BEGINNING of NEXT block\n\n const lines = commitBlock.split('\\n');\n\n // Find header line (contains \\0 separators) - should be first non-empty line\n let header = '';\n for (const line of lines) {\n if (line.trim() && line.includes('\\0')) {\n header = line;\n break;\n }\n }\n\n if (!header) {\n continue;\n }\n\n // File lines come from NEXT block (before next commit's header)\n const fileLines: string[] = [];\n if (i + 1 < commits.length) {\n const nextBlock = commits[i + 1];\n if (!nextBlock) {continue;}\n\n const nextLines = nextBlock.split('\\n');\n\n // Take lines until we hit next header (line with \\0)\n for (const line of nextLines) {\n if (line.trim() && line.includes('\\0')) {\n break; // This is next commit's header\n }\n if (line.trim()) {\n fileLines.push(line);\n }\n }\n }\n\n // Parse header: SHA\\0author\\0email\\0date\\0subject\\0body\n const [sha, authorName, authorEmail, authorDate, subject, body = ''] = header.split('\\0');\n\n if (!sha || sha.length !== 40 || !authorName || !authorEmail || !authorDate || !subject) {\n continue; // Invalid fields\n }\n\n // Ignore bot authors\n if (options.ignoreAuthors.some((pattern: string) => matchesGlob(authorName, pattern))) {\n continue;\n }\n\n // Parse conventional commit\n const convention = parseConventionalCommit(`${subject}\\n\\n${body || ''}`);\n\n // Skip filtered types\n if (shouldSkipCommit(convention.type, options.includeTypes, options.excludeTypes)) {\n continue;\n }\n\n // Extract files from --name-status output\n const filesChanged = parseFileChanges(fileLines);\n\n // Map files to packages (basic implementation, will be enhanced)\n const packages = extractPackagesFromFiles(filesChanged);\n\n // Build Change object\n const change: Change = {\n sha,\n type: convention.type,\n scope: convention.scope,\n subject: convention.subject,\n body: convention.body,\n breaking: convention.breaking,\n refs: extractReferences(convention.footers),\n author: {\n name: authorName,\n email: authorEmail,\n },\n coAuthors: extractCoAuthors(convention.footers),\n packages,\n filesChanged: filesChanged.map(f => f.path),\n timestamp: authorDate,\n isMerge: false,\n isRevert: convention.type === 'revert',\n revertOf: extractRevertOf(convention.body, convention.footers),\n cherryPickOf: extractCherryPickOf(convention.footers),\n };\n\n changes.push(change);\n }\n\n return changes;\n}\n\n/**\n * Parse conventional commit format\n */\nfunction parseConventionalCommit(commitMessage: string): {\n type: CommitType;\n scope?: string;\n subject: string;\n body?: string;\n breaking?: BreakingChange[];\n footers: string[];\n} {\n const lines = commitMessage.split('\\n');\n const header = lines[0] || '';\n const bodyLines = lines.slice(2); // Skip empty line after header\n const body = bodyLines.join('\\n').trim();\n\n // Parse header with conventional commits format: type(scope): subject or type(scope)!: subject\n const headerMatch = header.match(/^(\\w+)(?:\\(([^)]+)\\))?(!)?:\\s*(.+)$/);\n\n let parsedType: string | undefined;\n let parsedScope: string | undefined;\n let parsedSubject: string = '';\n let hasBreaking = false;\n\n if (headerMatch) {\n parsedType = headerMatch[1];\n parsedScope = headerMatch[2];\n hasBreaking = headerMatch[3] === '!';\n parsedSubject = headerMatch[4] || '';\n } else {\n // Fallback: treat whole header as subject\n parsedType = undefined;\n parsedSubject = header;\n }\n\n const type = normalizeType(parsedType);\n const breaking: BreakingChange[] = [];\n\n // Detect breaking changes from ! suffix in header\n if (hasBreaking) {\n breaking.push({ summary: parsedSubject });\n }\n\n // Extract footers (lines starting with keyword followed by :)\n const footers: string[] = [];\n const footerLines = body.split('\\n');\n for (const line of footerLines) {\n if (/^[A-Z-]+:\\s*/.test(line)) {\n footers.push(line);\n // Check for BREAKING CHANGE footer\n const breakingMatch = line.match(/^BREAKING CHANGE:\\s*(.+)/);\n if (breakingMatch && breakingMatch[1]) {\n breaking.push({ summary: breakingMatch[1] });\n }\n }\n }\n\n return {\n type,\n scope: parsedScope,\n subject: parsedSubject,\n body: body || undefined,\n breaking: breaking.length > 0 ? breaking : undefined,\n footers,\n };\n}\n\n/**\n * Normalize commit type\n */\nfunction normalizeType(type: string | undefined): CommitType {\n const normalized = (type || 'chore').toLowerCase();\n const validTypes: CommitType[] = ['feat', 'fix', 'perf', 'refactor', 'docs', 'build', 'ci', 'test', 'chore', 'revert', 'style'];\n return validTypes.includes(normalized as CommitType) ? (normalized as CommitType) : 'chore';\n}\n\n/**\n * Parse --name-status output into file changes\n */\ninterface FileChange {\n path: string;\n status: string;\n oldPath?: string;\n}\n\nfunction parseFileChanges(lines: string[]): FileChange[] {\n const changes: FileChange[] = [];\n \n for (const line of lines) {\n if (!line.trim() || line.trim().startsWith('diff --git')) {continue;}\n \n // Parse status + file: \"A\\tpath/to/file\" or \"R100\\told\\to/new\"\n const match = line.match(/^([ADMRT])\\t(.*?)$/);\n if (!match) {continue;}\n\n const [, status, path] = match;\n if (!path || !status) {continue;}\n \n if (status === 'R' || status === 'C') {\n // Rename/Copy: path contains old\\tnew\n const [oldPath, newPath] = path.split('\\t');\n if (newPath) {\n changes.push({ path: newPath, status, oldPath });\n }\n if (oldPath) {\n changes.push({ path: oldPath, status: 'D' });\n }\n } else {\n changes.push({ path, status });\n }\n }\n\n return changes;\n}\n\n/**\n * Extract package names from file paths\n * Basic implementation - will be enhanced with devlink graph\n */\nfunction extractPackagesFromFiles(files: FileChange[]): string[] {\n const packages = new Set<string>();\n \n for (const file of files) {\n // Match patterns like: packages/pkg-name/...\n const match = file.path.match(/^packages\\/([^/]+)/);\n if (match) {\n packages.add(`packages/${match[1]}`);\n }\n }\n\n return Array.from(packages);\n}\n\n/**\n * Extract references from footers (Closes #123, etc.)\n */\nfunction extractReferences(footers: string[]): Reference[] {\n const refs: Reference[] = [];\n\n for (const footer of footers) {\n // Match: Closes #123, Fixes #456, Refs #789\n const match = footer.match(/(?:Closes|Fixes|Refs)\\s+#(\\d+)/i);\n if (match && match[1]) {\n refs.push({\n type: footer.toLowerCase().includes('closes') || footer.toLowerCase().includes('fixes') ? 'issue' : 'pr',\n id: match[1],\n });\n }\n }\n\n return refs;\n}\n\n/**\n * Extract co-authors from footers\n */\nfunction extractCoAuthors(footers: string[]): Author[] {\n const coAuthors: Author[] = [];\n\n for (const footer of footers) {\n const match = footer.match(/^Co-authored-by:\\s*(.+?)\\s*<(.+?)>$/i);\n if (match && match[1] && match[2]) {\n coAuthors.push({\n name: match[1].trim(),\n email: match[2].trim(),\n });\n }\n }\n\n return coAuthors;\n}\n\n/**\n * Extract revert target SHA\n */\nfunction extractRevertOf(body: string | undefined, footers: string[]): string | undefined {\n if (!body) {return undefined;}\n\n const match = body.match(/revert (?:of\\s+)?([0-9a-f]{40})/i);\n return match ? match[1] : undefined;\n}\n\n/**\n * Extract cherry-pick source SHA\n */\nfunction extractCherryPickOf(footers: string[]): string | undefined {\n for (const footer of footers) {\n const match = footer.match(/cherry picked from (.+)/i);\n if (match && match[1]) {return match[1].trim();}\n }\n return undefined;\n}\n\n/**\n * Check if commit should be skipped based on type filters\n */\nfunction shouldSkipCommit(\n type: string,\n includeTypes?: string[],\n excludeTypes?: string[]\n): boolean {\n if (includeTypes && !includeTypes.includes(type)) {\n return true;\n }\n if (excludeTypes && excludeTypes.includes(type)) {\n return true;\n }\n return false;\n}\n\n/**\n * Match glob pattern (simplified implementation)\n */\nfunction matchesGlob(text: string, pattern: string): boolean {\n // Handle wildcards: *[bot] matches any[bot], renovate* matches renovate-*\n const regexPattern = pattern\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.');\n \n const regex = new RegExp(`^${regexPattern}$`, 'i');\n return regex.test(text);\n}\n\n","/**\n * Persistent cache for parsed commits and metadata\n * Includes graph hash invalidation and lockfile support\n */\n\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { Change, ChangeCache } from './types';\n\nconst CACHE_FILE = 'cache.json';\nconst GRAPH_FILE = 'graph.json';\nconst LOCK_FILE = '.cache.lock';\n\n/**\n * Load cache from disk\n */\nexport async function loadCache(cacheDir: string): Promise<ChangeCache | null> {\n const cachePath = join(cacheDir, CACHE_FILE);\n \n try {\n if (!existsSync(cachePath)) {\n return null;\n }\n \n const content = await readFile(cachePath, 'utf-8');\n return JSON.parse(content) as ChangeCache;\n } catch (error) {\n // Corrupted cache, return null to rebuild\n return null;\n }\n}\n\n/**\n * Save cache to disk\n */\nexport async function saveCache(cacheDir: string, cache: ChangeCache): Promise<void> {\n const cachePath = join(cacheDir, CACHE_FILE);\n \n try {\n await mkdir(cacheDir, { recursive: true });\n await writeFile(cachePath, JSON.stringify(cache, null, 2), 'utf-8');\n } catch (error) {\n // Non-critical error, just log and continue\n console.warn(`Failed to save cache: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * Get cached commit if exists\n */\nexport function getCachedChange(cache: ChangeCache | null, sha: string): Change | null {\n if (!cache) {return null;}\n \n return cache.commits[sha] || null;\n}\n\n/**\n * Update cache with new commits\n */\nexport function updateCache(cache: ChangeCache | null, commits: Change[]): ChangeCache {\n if (!cache) {\n cache = {\n meta: {\n graphHash: '',\n HEAD: '',\n },\n commits: {},\n lastTags: {},\n };\n }\n \n for (const commit of commits) {\n cache.commits[commit.sha] = commit;\n }\n \n return cache;\n}\n\n/**\n * Save devlink graph snapshot\n */\nexport async function saveGraphSnapshot(\n cacheDir: string,\n graphHash: string\n): Promise<void> {\n const graphPath = join(cacheDir, GRAPH_FILE);\n \n try {\n await mkdir(cacheDir, { recursive: true });\n const content = JSON.stringify({ hash: graphHash, timestamp: new Date().toISOString() }, null, 2);\n await writeFile(graphPath, content, 'utf-8');\n \n // Also update cache meta\n const cache = await loadCache(cacheDir);\n if (cache) {\n cache.meta.graphHash = graphHash;\n await saveCache(cacheDir, cache);\n }\n } catch (error) {\n console.warn(`Failed to save graph snapshot: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * Update HEAD reference in cache\n */\nexport async function updateHead(cacheDir: string, head: string): Promise<void> {\n const cache = await loadCache(cacheDir);\n if (cache) {\n cache.meta.HEAD = head;\n await saveCache(cacheDir, cache);\n }\n}\n\n/**\n * Update last tag for a package\n */\nexport async function updateLastTag(\n cacheDir: string,\n packageName: string,\n tag: string,\n sha: string\n): Promise<void> {\n const cache = await loadCache(cacheDir);\n const updatedCache = updateCache(cache, []);\n updatedCache.lastTags[packageName] = { tag, sha };\n await saveCache(cacheDir, updatedCache);\n}\n\n/**\n * Get last tag for a package\n */\nexport function getLastTag(\n cache: ChangeCache | null,\n packageName: string\n): { tag: string; sha: string } | null {\n if (!cache) {return null;}\n \n return cache.lastTags[packageName] || null;\n}\n\n/**\n * Check if cache is valid for given range\n * Invalidates if graph hash or HEAD changed outside range\n */\nexport async function isCacheValid(\n cacheDir: string,\n from: string,\n to: string,\n currentGraphHash?: string,\n currentHead?: string\n): Promise<boolean> {\n const cache = await loadCache(cacheDir);\n if (!cache) {return false;}\n \n // Check graph hash\n if (currentGraphHash && cache.meta.graphHash && cache.meta.graphHash !== currentGraphHash) {\n return false;\n }\n \n // Check HEAD (should be >= 'to' for cache to be valid)\n if (currentHead && cache.meta.HEAD && !isCommitValid(cache.meta.HEAD, from, to)) {\n return false;\n }\n \n return true;\n}\n\n/**\n * Check if commit is within range\n */\nfunction isCommitValid(commit: string, from: string, to: string): boolean {\n // Simplified check - in real implementation would use git rev-list to compare\n // For now, just ensure commit exists between from and to\n return true;\n}\n\n/**\n * Acquire lockfile for cache operations\n */\nexport async function acquireLock(cacheDir: string): Promise<() => Promise<void>> {\n const lockPath = join(cacheDir, LOCK_FILE);\n \n // Check if lock exists\n if (existsSync(lockPath)) {\n throw new Error('Cache lock already acquired. Another process may be running.');\n }\n \n // Create lock\n await mkdir(cacheDir, { recursive: true });\n await writeFile(lockPath, JSON.stringify({\n pid: process.pid,\n timestamp: new Date().toISOString(),\n }), 'utf-8');\n \n // Return release function\n return async () => {\n if (existsSync(lockPath)) {\n try {\n await writeFile(lockPath, '', 'utf-8');\n } catch {\n // Ignore cleanup errors\n }\n }\n };\n}\n\n\n","/**\n * Git history range resolution with tag discovery and shallow clone detection\n */\n\nimport simpleGit from 'simple-git';\nimport type { GitRange } from './types';\n\n/**\n * Resolve git range from various sources (tags, refs, dates)\n */\nexport async function resolveGitRange(options: {\n cwd: string;\n from?: string;\n to?: string;\n sinceTag?: string;\n autoUnshallow?: boolean;\n requireSignedTags?: boolean;\n}): Promise<GitRange> {\n const { cwd, from, to = 'HEAD', sinceTag, autoUnshallow, requireSignedTags } = options;\n \n const git = simpleGit(cwd);\n \n // Handle shallow clone detection\n if (sinceTag || from) {\n await ensureHistoryDepth(git, sinceTag || from || 'HEAD', 'HEAD', autoUnshallow);\n }\n \n // Resolve 'from' ref\n // For first release (no tags), use first commit instead of HEAD~1\n const lastTag = await findLastTag(git, requireSignedTags);\n const fromRef = sinceTag || from || lastTag || await findFirstCommit(git);\n const toRef = to;\n\n return { from: fromRef, to: toRef };\n}\n\n/**\n * Find first commit in repository history\n * Returns parent of first commit (non-existent) to include first commit in range\n */\nasync function findFirstCommit(git: ReturnType<typeof simpleGit>): Promise<string> {\n try {\n // Get first commit hash using rev-list\n const result = await git.raw(['rev-list', '--max-parents=0', 'HEAD']);\n const firstCommit = result.trim();\n // Return parent notation to include first commit in git log range\n // first^ means \"parent of first commit\" which doesn't exist, so git log first^..HEAD includes first commit\n return `${firstCommit}^`;\n } catch (error) {\n // Fallback to HEAD~1 if we can't find first commit\n return 'HEAD~1';\n }\n}\n\n/**\n * Find last release tag\n */\nexport async function findLastTag(\n git: ReturnType<typeof simpleGit>,\n requireSigned?: boolean\n): Promise<string | null> {\n try {\n const tags = await git.tags();\n \n // Filter signed tags if required\n const candidateTags = requireSigned\n ? await filterSignedTags(git, tags.all)\n : tags.all;\n \n // Find most recent tag (sorted by version or date)\n const recentTag = candidateTags\n .sort()\n .reverse()[0];\n \n return recentTag || null;\n } catch (error) {\n // No tags or error, return null\n return null;\n }\n}\n\n/**\n * Find last tag for specific package\n */\nexport async function findPackageTag(\n git: ReturnType<typeof simpleGit>,\n packageName: string,\n requireSigned?: boolean\n): Promise<string | null> {\n try {\n const tags = await git.tags();\n \n // Match package tag patterns: @scope/package@1.0.0 or @pkg@1.0.0\n const packageRegex = new RegExp(`@${packageName.replace('@', '')}@v?\\\\d+\\\\.\\\\d+\\\\.\\\\d+`);\n \n const packageTags = tags.all.filter(tag => packageRegex.test(tag));\n \n const candidateTags = requireSigned\n ? await filterSignedTags(git, packageTags)\n : packageTags;\n \n return candidateTags\n .sort()\n .reverse()[0] || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Filter to only signed tags\n */\nasync function filterSignedTags(\n git: ReturnType<typeof simpleGit>,\n tags: string[]\n): Promise<string[]> {\n const signed: string[] = [];\n \n for (const tag of tags) {\n try {\n // Check if tag is signed: git cat-file tag <tag> contains PGP signature\n const content = await git.raw(['cat-file', 'tag', tag]);\n if (content.includes('-----BEGIN PGP SIGNATURE-----')) {\n signed.push(tag);\n }\n } catch {\n // Invalid tag or not signed, skip\n }\n }\n \n return signed;\n}\n\n/**\n * Ensure we have full git history (detect and fix shallow clones)\n */\nasync function ensureHistoryDepth(\n git: ReturnType<typeof simpleGit>,\n from: string,\n to: string,\n autoUnshallow?: boolean\n): Promise<void> {\n try {\n // Try to get commit count between from and to\n await git.raw(['rev-list', '--count', `${from}..${to}`]);\n } catch (error) {\n // Shallow clone detected - commits not available\n if (autoUnshallow) {\n console.log('⚠️ Shallow clone detected. Fetching full history...');\n try {\n await git.fetch(['--prune', '--unshallow', '--tags']);\n } catch (fetchError) {\n throw new Error(\n 'Shallow clone detected. Full history fetch failed. ' +\n 'Run manually: git fetch --unshallow --tags'\n );\n }\n } else {\n throw new Error(\n 'Shallow clone detected. Use --auto-unshallow flag or run: ' +\n 'git fetch --unshallow --tags'\n );\n }\n }\n}\n\n/**\n * Parse git URL to extract host/owner/repo\n */\nexport function parseGitUrl(url: string): {\n host: string;\n owner: string;\n repo: string;\n} | null {\n // Match: https://github.com/owner/repo.git\n // Match: git@github.com:owner/repo.git\n const match = url.match(/(?:https:\\/\\/([^/]+)|git@([^:]+):)(?:.*?\\/)?([^/]+)\\/([^/]+)(?:\\.git)?$/);\n \n if (!match) {return null;}\n \n const host = match[1] || match[2] || '';\n const owner = match[3] || '';\n const repo = match[4] || '';\n \n return { host, owner, repo };\n}\n\n\n","/**\n * Version bump detection and SemVer policy implementation\n * Supports independent, ripple, and lockstep strategies\n */\n\nimport semver from 'semver';\nimport type { Change, VersionBump } from './types';\n\n/**\n * Compute version bump from changes\n */\nexport function computeBump(changes: Change[]): VersionBump {\n const hasBreaking = changes.some(c => c.breaking && c.breaking.length > 0);\n const hasFeature = changes.some(c => c.type === 'feat');\n const hasFix = changes.some(c => ['fix', 'perf', 'refactor'].includes(c.type));\n \n if (hasBreaking) {return 'major';}\n if (hasFeature) {return 'minor';}\n if (hasFix) {return 'patch';}\n return 'none';\n}\n\n/**\n * Compute next version with optional pre-release\n */\nexport function computeNextVersion(\n currentVersion: string,\n bump: VersionBump,\n preid?: string\n): string {\n if (bump === 'none') {\n return currentVersion;\n }\n \n if (preid) {\n // Pre-release version: 1.0.0 -> 1.1.0-rc.1\n const nextVersion = semver.inc(currentVersion, bump === 'major' ? 'major' : bump === 'minor' ? 'minor' : 'patch');\n if (!nextVersion) {return currentVersion;}\n \n // Check if already pre-release\n const prerelease = semver.prerelease(nextVersion);\n if (prerelease && prerelease[0] === preid) {\n // Increment pre-release number\n const number = prerelease[1] as number;\n return semver.inc(nextVersion, 'prerelease', preid) || nextVersion;\n }\n \n return `${nextVersion}-${preid}.1`;\n }\n \n return semver.inc(currentVersion, bump) || currentVersion;\n}\n\n/**\n * Get package impact reasons\n */\nexport function getImpactReason(changes: Change[]): {\n reason: 'breaking' | 'feat' | 'fix' | 'perf' | 'ripple' | 'manual';\n details?: string;\n} {\n if (changes.some(c => c.breaking && c.breaking.length > 0)) {\n return { reason: 'breaking', details: 'Contains breaking changes' };\n }\n if (changes.some(c => c.type === 'feat')) {\n return { reason: 'feat', details: 'New features added' };\n }\n if (changes.some(c => c.type === 'fix')) {\n return { reason: 'fix', details: 'Bug fixes included' };\n }\n if (changes.some(c => c.type === 'perf')) {\n return { reason: 'perf', details: 'Performance improvements' };\n }\n return { reason: 'manual', details: 'Manual version bump' };\n}\n\n/**\n * Get ripple dependencies for a package\n */\nexport function getRipplePackages(\n packageName: string,\n dependencyGraph: Record<string, string[]>,\n visited: Set<string> = new Set()\n): string[] {\n const ripple: string[] = [];\n \n if (visited.has(packageName)) {\n return ripple;\n }\n \n visited.add(packageName);\n \n // Find all packages that depend on this one\n for (const [pkg, deps] of Object.entries(dependencyGraph)) {\n if (deps.includes(packageName) && pkg !== packageName) {\n if (!ripple.includes(pkg)) {\n ripple.push(pkg);\n }\n \n // Recurse to find transitive dependencies\n const transitive = getRipplePackages(pkg, dependencyGraph, visited);\n for (const t of transitive) {\n if (!ripple.includes(t)) {\n ripple.push(t);\n }\n }\n }\n }\n \n return ripple;\n}\n\n/**\n * Apply version policy (independent, ripple, or lockstep)\n */\nexport function applyVersionPolicy(\n changes: Change[],\n affectedPackages: string[],\n currentVersions: Record<string, string>,\n policy: 'independent' | 'ripple' | 'lockstep',\n dependencyGraph?: Record<string, string[]>\n): Record<string, {\n nextVersion: string;\n bump: VersionBump;\n reason: 'breaking' | 'feat' | 'fix' | 'perf' | 'ripple' | 'manual';\n rippleFrom?: string[];\n}> {\n const result: Record<string, any> = {};\n \n // Group changes by package\n const changesByPackage: Record<string, Change[]> = {};\n for (const change of changes) {\n for (const pkg of change.packages) {\n if (!changesByPackage[pkg]) {\n changesByPackage[pkg] = [];\n }\n changesByPackage[pkg].push(change);\n }\n }\n \n if (policy === 'independent') {\n // Each package versions independently\n for (const pkg of affectedPackages) {\n const pkgChanges = changesByPackage[pkg] || [];\n const bump = computeBump(pkgChanges);\n const reasonInfo = getImpactReason(pkgChanges);\n const currentVersion = currentVersions[pkg] || '0.0.0';\n const nextVersion = computeNextVersion(currentVersion, bump);\n \n result[pkg] = {\n nextVersion,\n bump,\n reason: reasonInfo.reason,\n };\n }\n } else if (policy === 'ripple' && dependencyGraph) {\n // Ripple bump dependent packages\n const ripplePackages = new Set<string>();\n \n for (const pkg of affectedPackages) {\n const pkgChanges = changesByPackage[pkg] || [];\n const bump = computeBump(pkgChanges);\n const reasonInfo = getImpactReason(pkgChanges);\n const currentVersion = currentVersions[pkg] || '0.0.0';\n const nextVersion = computeNextVersion(currentVersion, bump);\n \n result[pkg] = {\n nextVersion,\n bump,\n reason: reasonInfo.reason,\n };\n \n // Find ripple dependents\n const ripple = getRipplePackages(pkg, dependencyGraph);\n for (const rpkg of ripple) {\n ripplePackages.add(rpkg);\n }\n }\n \n // Apply ripple bumps\n for (const pkg of ripplePackages) {\n if (!result[pkg]) {\n const currentVersion = currentVersions[pkg] || '0.0.0';\n const nextVersion = computeNextVersion(currentVersion, 'patch');\n \n result[pkg] = {\n nextVersion,\n bump: 'patch' as VersionBump,\n reason: 'ripple' as const,\n rippleFrom: Array.from(affectedPackages),\n };\n }\n }\n } else if (policy === 'lockstep') {\n // All packages share same version\n const allChanges = Object.values(changesByPackage).flat();\n const bump = computeBump(allChanges);\n const reasonInfo = getImpactReason(allChanges);\n \n // Find highest current version\n let highestVersion = '0.0.0';\n for (const version of Object.values(currentVersions)) {\n if (semver.gt(version, highestVersion)) {\n highestVersion = version;\n }\n }\n \n const nextVersion = computeNextVersion(highestVersion, bump);\n \n for (const pkg of affectedPackages) {\n result[pkg] = {\n nextVersion,\n bump,\n reason: reasonInfo.reason,\n };\n }\n }\n \n return result;\n}\n\n/**\n * Get affected packages from changes\n */\nexport function getAffectedPackages(changes: Change[]): string[] {\n const packages = new Set<string>();\n \n for (const change of changes) {\n for (const pkg of change.packages) {\n packages.add(pkg);\n }\n }\n \n return Array.from(packages);\n}\n\n\n","/**\n * Git provider detection and link formatting\n * Supports GitHub, GitLab, and self-hosted instances\n */\n\nimport simpleGit from 'simple-git';\nimport { parseGitUrl } from './git-range';\nimport type { Change, GitProvider } from './types';\n\n/**\n * Auto-detect git provider from remote\n */\nexport async function detectProvider(cwd: string, baseUrl?: string | null): Promise<GitProvider> {\n if (baseUrl) {\n // Explicit base URL provided\n return {\n type: inferProviderType(baseUrl),\n baseUrl,\n };\n }\n \n const git = simpleGit(cwd);\n \n try {\n const remotes = await git.getRemotes(true);\n const url = remotes[0]?.refs?.fetch || remotes[0]?.refs?.push;\n \n if (!url) {\n return { type: 'generic', baseUrl: null };\n }\n \n const parsed = parseGitUrl(url);\n if (!parsed) {\n return { type: 'generic', baseUrl: null };\n }\n \n const providerUrl = `https://${parsed.host}/${parsed.owner}/${parsed.repo}`;\n \n return {\n type: inferProviderType(providerUrl),\n baseUrl: providerUrl,\n };\n } catch (error) {\n return { type: 'generic', baseUrl: null };\n }\n}\n\n/**\n * Infer provider type from URL\n */\nfunction inferProviderType(url: string): 'github' | 'gitlab' | 'generic' {\n if (url.includes('github.com') || url.includes('githubusercontent.com')) {\n return 'github';\n }\n if (url.includes('gitlab.com') || url.includes('gitlab')) {\n return 'gitlab';\n }\n return 'generic';\n}\n\n/**\n * Format commit link\n */\nexport function formatCommitLink(provider: GitProvider, sha: string): string | undefined {\n if (!provider.baseUrl) {return undefined;}\n \n if (provider.type === 'github') {\n return `${provider.baseUrl}/commit/${sha}`;\n }\n if (provider.type === 'gitlab') {\n return `${provider.baseUrl}/-/commit/${sha}`;\n }\n \n return undefined;\n}\n\n/**\n * Format PR link\n */\nexport function formatPrLink(provider: GitProvider, prNumber: string): string | undefined {\n if (!provider.baseUrl) {return undefined;}\n \n if (provider.type === 'github') {\n return `${provider.baseUrl}/pull/${prNumber}`;\n }\n if (provider.type === 'gitlab') {\n return `${provider.baseUrl}/-/merge_requests/${prNumber}`;\n }\n \n return undefined;\n}\n\n/**\n * Format issue link\n */\nexport function formatIssueLink(provider: GitProvider, issueNumber: string): string | undefined {\n if (!provider.baseUrl) {return undefined;}\n \n if (provider.type === 'github') {\n return `${provider.baseUrl}/issues/${issueNumber}`;\n }\n if (provider.type === 'gitlab') {\n return `${provider.baseUrl}/-/issues/${issueNumber}`;\n }\n \n return undefined;\n}\n\n/**\n * Enhance change with provider links\n */\nexport function enhanceChangeWithLinks(change: Change, provider: GitProvider): Change {\n const providerLinks: Change['providerLinks'] = {\n commit: formatCommitLink(provider, change.sha),\n pr: [],\n issues: [],\n };\n \n for (const ref of change.refs) {\n if (ref.type === 'pr') {\n const link = formatPrLink(provider, ref.id);\n if (link) {\n providerLinks.pr!.push(link);\n ref.url = link;\n }\n } else if (ref.type === 'issue') {\n const link = formatIssueLink(provider, ref.id);\n if (link) {\n providerLinks.issues!.push(link);\n ref.url = link;\n }\n }\n }\n \n if (!providerLinks.pr!.length) {delete providerLinks.pr;}\n if (!providerLinks.issues!.length) {delete providerLinks.issues;}\n \n return {\n ...change,\n providerLinks,\n };\n}\n\n\n","/**\n * JSON manifest formatter with integrity hashes\n */\n\nimport { createHash } from 'node:crypto';\nimport type { ReleaseManifest, PackageRelease } from '../types';\n\n/**\n * Format ReleaseManifest as JSON string with integrity hashes\n */\nexport function formatAsJson(\n manifest: ReleaseManifest,\n additionalContent?: Record<string, string>\n): string {\n // Calculate integrity hashes\n const integrity: Record<string, string> = {};\n \n for (const [key, content] of Object.entries(additionalContent || {})) {\n integrity[key] = calculateSha256(content);\n }\n \n const manifestWithIntegrity = {\n ...manifest,\n integrity: Object.keys(integrity).length > 0 ? integrity : undefined,\n };\n \n return JSON.stringify(manifestWithIntegrity, null, 2);\n}\n\n/**\n * Create ReleaseManifest from data\n */\nexport function createReleaseManifest(\n range: { from: string; to: string },\n packages: PackageRelease[],\n timestamp?: string\n): ReleaseManifest {\n const byType: Record<string, number> = {};\n let breakingCount = 0;\n \n for (const pkg of packages) {\n // Count breaking changes\n breakingCount += pkg.breaking.length;\n \n // Count by type\n for (const change of pkg.changes) {\n byType[change.type] = (byType[change.type] || 0) + 1;\n }\n }\n \n return {\n schemaVersion: '1.0',\n range,\n timestamp: timestamp || new Date().toISOString(),\n packages,\n workspace: {\n breakingCount,\n byType,\n },\n };\n}\n\n/**\n * Calculate SHA256 hash\n */\nfunction calculateSha256(content: string): string {\n return createHash('sha256').update(content).digest('hex');\n}\n\n\n","/**\n * Markdown changelog formatter with i18n support and rendering levels\n */\n\nimport type { PackageRelease, Change, CommitType } from '../types';\n\nexport type RenderingLevel = 'compact' | 'standard' | 'detailed';\n\n/**\n * Format package release as markdown\n */\nexport function formatPackageAsMarkdown(\n pkg: PackageRelease,\n level: RenderingLevel = 'standard',\n locale: 'en' | 'ru' = 'en'\n): string {\n const lines: string[] = [];\n \n // Header: ## [version] - YYYY-MM-DD (package name as subheading if not obvious from context)\n const date = new Date().toISOString().split('T')[0]!;\n lines.push(`## [${pkg.next}] - ${date}`);\n lines.push('');\n\n // Version bump context (subtle, not a full redundant header)\n const reasonLabel = formatReasonLabel(pkg.reason, locale);\n lines.push(`> **${pkg.name}** ${pkg.prev} → ${pkg.next} (${reasonLabel})`);\n lines.push('');\n\n // Breaking changes\n if (pkg.breaking && pkg.breaking.length > 0) {\n lines.push('### ' + t('breaking_changes', locale));\n lines.push('');\n for (const breaking of pkg.breaking) {\n lines.push(`- **${breaking.summary}**`);\n if (breaking.notes) {\n lines.push(` ${breaking.notes}`);\n }\n }\n lines.push('');\n }\n\n // Group changes by type\n const groupedChanges = groupChangesByType(pkg.changes);\n\n // Render by type groups\n for (const [type, changes] of Object.entries(groupedChanges)) {\n if (changes.length === 0) {continue;}\n\n const sectionTitle = formatSectionTitle(type as CommitType, locale);\n lines.push(`### ${sectionTitle}`);\n lines.push('');\n\n for (const change of changes) {\n lines.push(formatChangeLine(change, level));\n }\n lines.push('');\n }\n\n return lines.join('\\n').trimEnd();\n}\n\n/**\n * Format change line based on rendering level\n */\nfunction formatChangeLine(change: Change, level: RenderingLevel): string {\n const bullet = '-';\n let line = `${bullet} **${change.scope || 'global'}**: ${change.subject}`;\n \n if (level === 'compact') {\n return line;\n }\n \n // Standard: add links\n const links: string[] = [];\n \n if (change.providerLinks?.commit) {\n links.push(`[${change.sha.substring(0, 7)}](${change.providerLinks.commit})`);\n }\n \n if (change.providerLinks?.pr && change.providerLinks.pr.length > 0) {\n for (const prLink of change.providerLinks.pr) {\n const match = prLink.match(/[^/]+$/);\n links.push(`[${match && match[0] ? match[0] : 'PR'}](${prLink})`);\n }\n }\n \n if (links.length > 0) {\n line += ` (${links.join(', ')})`;\n }\n \n // Detailed: add authors, file counts\n if (level === 'detailed') {\n const details: string[] = [];\n if (change.author) {\n details.push(`@${change.author.name}`);\n }\n if (change.coAuthors && change.coAuthors.length > 0) {\n details.push(...change.coAuthors.map(a => `@${a.name}`));\n }\n if (change.filesChanged && change.filesChanged.length > 0) {\n details.push(`${change.filesChanged.length} files`);\n }\n if (details.length > 0) {\n line += ` — ${details.join(', ')}`;\n }\n }\n \n return line;\n}\n\n/**\n * Group changes by type\n */\nfunction groupChangesByType(changes: Change[]): Record<string, Change[]> {\n const grouped: Record<string, Change[]> = {};\n \n for (const change of changes) {\n const type = change.type;\n if (!grouped[type]) {\n grouped[type] = [];\n }\n grouped[type].push(change);\n }\n \n return grouped;\n}\n\n/**\n * Format section title based on locale\n */\nfunction formatSectionTitle(type: CommitType, locale: 'en' | 'ru'): string {\n const titles: Record<string, Record<'en' | 'ru', string>> = {\n feat: { en: 'Features', ru: 'Новые возможности' },\n fix: { en: 'Bug Fixes', ru: 'Исправления' },\n perf: { en: 'Performance', ru: 'Производительность' },\n refactor: { en: 'Refactoring', ru: 'Рефакторинг' },\n docs: { en: 'Documentation', ru: 'Документация' },\n build: { en: 'Build', ru: 'Сборка' },\n ci: { en: 'CI/CD', ru: 'CI/CD' },\n test: { en: 'Tests', ru: 'Тесты' },\n chore: { en: 'Chores', ru: 'Обслуживание' },\n revert: { en: 'Reverts', ru: 'Откаты' },\n };\n \n return titles[type]?.[locale] || type;\n}\n\n/**\n * Format reason as a short human label\n */\nfunction formatReasonLabel(reason: string, locale: 'en' | 'ru'): string {\n const labels: Record<string, Record<'en' | 'ru', string>> = {\n breaking: { en: 'major — breaking changes', ru: 'major — критические изменения' },\n feat: { en: 'minor — new features', ru: 'minor — новая функциональность' },\n fix: { en: 'patch — bug fixes', ru: 'patch — исправления' },\n perf: { en: 'patch — performance', ru: 'patch — производительность' },\n ripple: { en: 'patch — dependency update', ru: 'patch — обновление зависимостей' },\n manual: { en: 'manual', ru: 'ручное' },\n };\n return labels[reason]?.[locale] ?? reason;\n}\n\n/**\n * Simple translation helper\n */\nfunction t(key: string, locale: 'en' | 'ru'): string {\n const translations: Record<string, Record<'en' | 'ru', string>> = {\n breaking_changes: { en: 'BREAKING CHANGES', ru: 'КРИТИЧЕСКИЕ ИЗМЕНЕНИЯ' },\n };\n\n return translations[key]?.[locale] ?? key;\n}\n\n/**\n * Format a lockstep monorepo release as a single consolidated changelog entry.\n *\n * All packages share the same nextVersion, so instead of N separate ## sections\n * we produce one version header, a packages table, and merged change lists.\n *\n * Example output:\n * ## [1.2.0] - 2026-03-01\n *\n * **17 packages** bumped to v1.2.0\n *\n * | Package | Previous | Bump |\n * ...\n *\n * ### ✨ Features\n * - **scope** (pkg): subject\n */\nexport function formatLockstepChangelog(\n packages: PackageRelease[],\n version: string,\n locale: 'en' | 'ru' = 'en',\n): string {\n const lines: string[] = [];\n const date = new Date().toISOString().split('T')[0]!;\n\n // Header\n lines.push(`## [${version}] - ${date}`);\n lines.push('');\n\n const pkgCount = packages.length;\n const pkgWord = locale === 'ru' ? 'пакетов' : pkgCount === 1 ? 'package' : 'packages';\n lines.push(`**${pkgCount} ${pkgWord}** bumped to v${version}`);\n lines.push('');\n\n // Packages table — only show packages that actually changed (bump !== 'none')\n const changed = packages.filter(p => p.bump !== 'none');\n if (changed.length > 0) {\n const colPkg = locale === 'ru' ? 'Пакет' : 'Package';\n const colPrev = locale === 'ru' ? 'Предыдущая' : 'Previous';\n const colBump = locale === 'ru' ? 'Тип' : 'Bump';\n lines.push(`| ${colPkg} | ${colPrev} | ${colBump} |`);\n lines.push(`|---------|----------|------|`);\n for (const pkg of changed) {\n lines.push(`| \\`${pkg.name}\\` | ${pkg.prev} | ${pkg.bump} |`);\n }\n lines.push('');\n }\n\n // Breaking changes (all packages combined, deduplicated by summary)\n const allBreaking = deduplicateBySummary(\n packages.flatMap(p => (p.breaking || []).map(b => ({ ...b, _pkg: p.name })))\n );\n if (allBreaking.length > 0) {\n lines.push(`### ${t('breaking_changes', locale)}`);\n lines.push('');\n for (const b of allBreaking) {\n lines.push(`- **${b.summary}**`);\n if (b.notes) {lines.push(` ${b.notes}`);}\n }\n lines.push('');\n }\n\n // Collect all non-chore changes, deduplicated by SHA\n const seenShas = new Set<string>();\n const allChanges: Array<{ change: Change; packageName: string }> = [];\n\n for (const pkg of packages) {\n for (const change of pkg.changes) {\n if (seenShas.has(change.sha)) {continue;}\n if (['chore', 'build', 'ci', 'style', 'test'].includes(change.type)) {continue;}\n seenShas.add(change.sha);\n allChanges.push({ change, packageName: pkg.name });\n }\n }\n\n // Group by type\n const grouped = new Map<CommitType, Array<{ change: Change; packageName: string }>>();\n for (const item of allChanges) {\n const type = item.change.type;\n if (!grouped.has(type)) {grouped.set(type, []);}\n grouped.get(type)!.push(item);\n }\n\n // Render grouped changes\n const typeOrder: CommitType[] = ['feat', 'fix', 'perf', 'refactor', 'docs', 'revert'];\n for (const type of typeOrder) {\n const items = grouped.get(type);\n if (!items || items.length === 0) {continue;}\n\n lines.push(`### ${formatSectionTitle(type, locale)}`);\n lines.push('');\n for (const { change, packageName } of items) {\n const scopePart = change.scope ? `**${change.scope}**` : '**global**';\n // Show package name in parentheses when scope doesn't identify the package\n const pkgHint = change.scope === packageName || allChanges.filter(i => i.change.sha === change.sha).length === 1\n ? ''\n : ` *(${packageName})*`;\n lines.push(`- ${scopePart}: ${change.subject}${pkgHint}`);\n }\n lines.push('');\n }\n\n if (allChanges.length === 0) {\n const noChanges = locale === 'ru' ? 'Без функциональных изменений.' : 'No functional changes.';\n lines.push(`*${noChanges}*`);\n lines.push('');\n }\n\n return lines.join('\\n').trimEnd();\n}\n\nfunction deduplicateBySummary<T extends { summary: string }>(items: T[]): T[] {\n const seen = new Set<string>();\n return items.filter(item => {\n if (seen.has(item.summary)) {return false;}\n seen.add(item.summary);\n return true;\n });\n}\n","/**\n * LLM-powered changelog formatter with graceful degradation\n * Corporate style like OpenAI/GitHub/Microsoft releases\n */\n\nimport type { PackageRelease, Change } from '../types';\nimport type { ILLM } from '@kb-labs/sdk';\nimport { formatPackageAsMarkdown } from './markdown';\n\n/**\n * Minimal platform interface (duck-typing)\n * Avoids circular dependency on plugin-runtime\n */\ninterface PlatformLike {\n llm?: ILLM;\n isConfigured?(service: string): boolean;\n}\n\n/**\n * Format changelog with LLM (corporate style) or fallback to conventional\n */\nexport async function formatPackageWithLLM(\n platform: PlatformLike | undefined,\n pkg: PackageRelease,\n locale: 'en' | 'ru' = 'en'\n): Promise<string> {\n // 1. Check if LLM is available (simple presence check, no isConfigured needed)\n const llmAvailable = !!platform?.llm;\n\n if (!llmAvailable) {\n // GRACEFUL DEGRADATION: fallback to conventional formatter\n return formatPackageAsMarkdown(pkg, 'standard', locale);\n }\n\n try {\n // TypeScript guard: we already checked llmAvailable above\n const llm = platform.llm!;\n\n // 2. Filter substantial changes (skip chore/build/ci)\n const substantialChanges = pkg.changes.filter(c =>\n !['chore', 'build', 'ci', 'style', 'test'].includes(c.type)\n );\n\n if (substantialChanges.length === 0) {\n return ''; // No substantial changes\n }\n\n // 3. Prepare context for LLM (group by type)\n const grouped = groupByType(substantialChanges);\n const changesContext = Object.entries(grouped)\n .map(([type, changes]) => {\n const items = changes.map(c => ` - ${c.scope ? c.scope + ': ' : ''}${c.subject}`).join('\\n');\n return `${type}:\\n${items}`;\n })\n .join('\\n\\n');\n\n // 4. Corporate-style prompt (OpenAI/GitHub format)\n const prompt = buildCorporatePrompt(pkg, changesContext, locale);\n\n // 5. Call LLM\n const systemPrompt = locale === 'ru'\n ? 'Ты технический писатель, создающий changelog для крупной компании. Пиши профессионально, структурировано и понятно.'\n : 'You are a technical writer creating changelogs for a major company. Write professionally, structured, and clearly.';\n\n const response = await llm.complete(prompt, {\n systemPrompt,\n temperature: 0.7,\n maxTokens: 1500,\n });\n\n // 6. MANDATORY VALIDATION: Verify LLM output\n const formatted = formatLLMResponse(pkg, response.content, locale);\n const validationResult = validateLLMChangelog(formatted, substantialChanges);\n\n if (!validationResult.valid) {\n console.warn(`LLM changelog validation failed: ${validationResult.errors.join(', ')}. Falling back to conventional format.`);\n return formatPackageAsMarkdown(pkg, 'standard', locale);\n }\n\n return formatted;\n\n } catch (error) {\n // GRACEFUL DEGRADATION on LLM error\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.warn(`LLM changelog failed, falling back to conventional: ${errorMessage}`);\n return formatPackageAsMarkdown(pkg, 'standard', locale);\n }\n}\n\n/**\n * Build corporate-style prompt\n */\nfunction buildCorporatePrompt(pkg: PackageRelease, changes: string, locale: 'en' | 'ru'): string {\n const lang = locale === 'ru' ? 'Russian' : 'English';\n\n return `Generate a professional changelog entry for package \"${pkg.name}\" version ${pkg.prev} → ${pkg.next}.\n\nChanges made:\n${changes}\n\nRequirements:\n- Write in ${lang}\n- Professional corporate tone (like OpenAI, GitHub, Microsoft releases)\n- Start with a brief summary paragraph explaining WHAT changed and WHY it matters to users\n- Group changes by category (Features, Improvements, Bug Fixes, etc)\n- Focus on USER IMPACT, not technical details\n- Explain WHY changes matter, not just WHAT changed\n- Use clear, non-technical language when possible\n- Include emoji for readability: ✨ Features, 🐛 Fixes, ⚡ Performance, 📝 Documentation\n\nFormat:\n## ${pkg.name} ${pkg.next}\n\n[1-2 sentence summary paragraph]\n\n### ✨ New Features\n- Clear description of feature and why it's useful\n\n### 🐛 Bug Fixes\n- What was fixed and how it helps users\n\n### ⚡ Performance Improvements\n- What's faster and by how much\n\nDO NOT:\n- List commit SHAs or PR numbers\n- Use technical jargon unnecessarily\n- Mention internal refactoring unless user-facing\n- Include chore/build/ci changes\n\nOutput ONLY the markdown changelog, no explanations.`;\n}\n\n/**\n * Format LLM response with professional footer\n */\nfunction formatLLMResponse(pkg: PackageRelease, llmContent: string, locale: 'en' | 'ru'): string {\n // Add package version header if LLM didn't include it\n let formatted = llmContent;\n if (!formatted.includes(`## ${pkg.name}`)) {\n const header = `## ${pkg.name} ${pkg.next}\\n\\n`;\n formatted = header + formatted;\n }\n\n // Add professional footer\n const footer = buildChangelogFooter(locale);\n formatted = formatted.trimEnd() + '\\n\\n' + footer;\n\n return formatted;\n}\n\n/**\n * Build professional changelog footer\n */\nfunction buildChangelogFooter(locale: 'en' | 'ru'): string {\n const year = new Date().getFullYear();\n\n if (locale === 'ru') {\n return `---\n\n*Сгенерировано автоматически с помощью [**@kb-labs/release-manager**](https://github.com/kb-labs/kb-labs)*\n*Часть экосистемы **KB Labs Platform** — профессиональные инструменты для разработки*\n\n<sub>© ${year} KB Labs. Released under KB Public License v1.1</sub>`;\n }\n\n return `---\n\n*Generated automatically by [**@kb-labs/release-manager**](https://github.com/kb-labs/kb-labs)*\n*Part of the **KB Labs Platform** — Professional developer tools ecosystem*\n\n<sub>© ${year} KB Labs. Released under KB Public License v1.1</sub>`;\n}\n\n/**\n * Group changes by type\n */\nfunction groupByType(changes: Change[]): Record<string, Change[]> {\n const grouped: Record<string, Change[]> = {};\n for (const change of changes) {\n if (!grouped[change.type]) {grouped[change.type] = [];}\n grouped[change.type]!.push(change);\n }\n return grouped;\n}\n\n/**\n * MANDATORY VALIDATION: Verify LLM output is valid and doesn't hallucinate\n *\n * Anti-hallucination checks:\n * 1. Output is not empty\n * 2. Has markdown structure (headers)\n * 3. Doesn't mention commits/changes that don't exist in source data\n * 4. Doesn't invent fake SHAs, PRs, or issues\n */\ninterface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\nfunction validateLLMChangelog(llmOutput: string, sourceChanges: Change[]): ValidationResult {\n const errors: string[] = [];\n\n // 1. Check not empty\n if (!llmOutput || llmOutput.trim().length === 0) {\n errors.push('Empty output');\n return { valid: false, errors };\n }\n\n // 2. Check has markdown structure (at least one header)\n if (!llmOutput.includes('#')) {\n errors.push('No markdown headers found');\n }\n\n // 3. Extract all subjects from source changes (ground truth)\n const sourceSubjects = new Set(sourceChanges.map(c => c.subject.toLowerCase().trim()));\n const sourceScopes = new Set(sourceChanges.map(c => c.scope?.toLowerCase().trim()).filter(Boolean));\n\n // 4. Check for hallucinated SHAs (40-char hex that don't exist)\n const shaPattern = /\\b[0-9a-f]{7,40}\\b/gi;\n const mentionedShas = llmOutput.match(shaPattern) || [];\n const sourceShas = new Set(sourceChanges.map(c => c.sha.toLowerCase()));\n\n for (const sha of mentionedShas) {\n const lowerSha = sha.toLowerCase();\n // Check if this SHA prefix matches any source SHA\n const isValid = Array.from(sourceShas).some(sourceSha => sourceSha.startsWith(lowerSha));\n if (!isValid) {\n errors.push(`Hallucinated SHA: ${sha}`);\n }\n }\n\n // 5. Check for hallucinated PR/issue numbers (should only mention real ones)\n const prPattern = /#(\\d+)/g;\n const mentionedPRs = new Set<string>();\n let match;\n while ((match = prPattern.exec(llmOutput)) !== null) {\n mentionedPRs.add(match[1]!);\n }\n\n const sourceRefs = new Set(sourceChanges.flatMap(c => c.refs.map(r => r.id)));\n for (const pr of mentionedPRs) {\n if (!sourceRefs.has(pr)) {\n errors.push(`Hallucinated PR/issue: #${pr}`);\n }\n }\n\n // 6. Validate line count is reasonable (not truncated, not too verbose)\n const lineCount = llmOutput.split('\\n').length;\n if (lineCount < 3) {\n errors.push('Output too short (< 3 lines)');\n }\n if (lineCount > 200) {\n errors.push('Output too verbose (> 200 lines)');\n }\n\n // 7. Check output doesn't include forbidden patterns (signs of hallucination)\n const forbiddenPatterns = [\n /\\[REDACTED\\]/i,\n /\\[PLACEHOLDER\\]/i,\n /\\[TODO\\]/i,\n /\\[EXAMPLE\\]/i,\n ];\n\n for (const pattern of forbiddenPatterns) {\n if (pattern.test(llmOutput)) {\n errors.push(`Forbidden pattern found: ${pattern.source}`);\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n","/**\n * Template system types for changelog customization\n */\n\nimport type { PackageRelease, Change, CommitType, BreakingChange, VersionBump } from '../types';\nimport type { ILLM, ILogger, IAnalytics } from '@kb-labs/sdk';\n\n/**\n * Changelog group definition — maps scopes to a named section\n */\nexport interface ChangelogGroup {\n title: string;\n emoji?: string;\n scopes: string[];\n}\n\n/**\n * Template data structure passed to render function\n */\nexport interface TemplateData {\n package: {\n name: string;\n prev: string;\n next: string;\n bump: VersionBump;\n reason: 'breaking' | 'feat' | 'fix' | 'perf' | 'ripple' | 'manual';\n rippleFrom?: string[];\n };\n breaking: BreakingChange[];\n changes: Partial<Record<CommitType, Change[]>>;\n locale: 'en' | 'ru';\n metadata?: Record<string, unknown>; // Custom user metadata from config\n /** Groups config from changelog.groups — if present, template should render by groups instead of by type */\n groups?: ChangelogGroup[];\n}\n\n/**\n * Minimal platform interface for LLM access, logging, and analytics\n */\nexport interface PlatformLike {\n llm?: ILLM;\n logger?: ILogger;\n analytics?: IAnalytics;\n}\n\n/**\n * Template contract - all templates must implement this interface\n *\n * Templates can be sync (fast) or async (with LLM enhancement)\n */\nexport interface ChangelogTemplate {\n /**\n * Template API version (semver major)\n * Current: '1.0'\n */\n version: '1.0';\n\n /**\n * Render changelog for a package\n * @param data Template data with package info, changes, etc\n * @param platform Optional platform for LLM access\n * @returns Markdown-formatted changelog string (sync or async)\n */\n render(data: TemplateData, platform?: PlatformLike): string | Promise<string>;\n}\n\n/**\n * Helper to group changes by type\n */\nexport function groupChangesByType(changes: Change[]): Partial<Record<CommitType, Change[]>> {\n const grouped: Partial<Record<CommitType, Change[]>> = {};\n\n for (const change of changes) {\n const type = change.type;\n if (!grouped[type]) {\n grouped[type] = [];\n }\n grouped[type]!.push(change);\n }\n\n return grouped;\n}\n\n/**\n * Convert PackageRelease to TemplateData\n */\nexport function packageToTemplateData(\n pkg: PackageRelease,\n locale: 'en' | 'ru' = 'en',\n metadata?: Record<string, unknown>,\n groups?: ChangelogGroup[]\n): TemplateData {\n return {\n package: {\n name: pkg.name,\n prev: pkg.prev,\n next: pkg.next,\n bump: pkg.bump,\n reason: pkg.reason,\n rippleFrom: pkg.rippleFrom,\n },\n breaking: pkg.breaking,\n changes: groupChangesByType(pkg.changes),\n locale,\n metadata,\n groups,\n };\n}\n","/**\n * Template loader with validation\n *\n * Loads built-in or custom user templates from filesystem\n */\n\nimport { pathToFileURL, fileURLToPath } from 'node:url';\nimport { join, isAbsolute, dirname } from 'node:path';\nimport { access } from 'node:fs/promises';\nimport type { ChangelogTemplate } from './types';\n\n// Get current file directory in ESM\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Built-in template names\n */\nexport const BUILTIN_TEMPLATES = ['corporate', 'corporate-ai', 'technical', 'compact'] as const;\nexport type BuiltinTemplate = typeof BUILTIN_TEMPLATES[number];\n\n/**\n * Load a changelog template\n *\n * @param templateName Template name (builtin) or path (custom)\n * @param cwd Current working directory (for resolving relative paths)\n * @returns Loaded and validated template\n */\nexport async function loadTemplate(\n templateName: string,\n cwd: string\n): Promise<ChangelogTemplate> {\n // Check if builtin template\n if (isBuiltinTemplate(templateName)) {\n return loadBuiltinTemplate(templateName);\n }\n\n // Load custom template from filesystem\n return loadCustomTemplate(templateName, cwd);\n}\n\n/**\n * Check if template name is a built-in template\n */\nfunction isBuiltinTemplate(name: string): name is BuiltinTemplate {\n return (BUILTIN_TEMPLATES as readonly string[]).includes(name);\n}\n\n/**\n * Load built-in template\n */\nasync function loadBuiltinTemplate(name: BuiltinTemplate): Promise<ChangelogTemplate> {\n try {\n // Use absolute path from current module directory\n // loader.ts is in src/templates/, compiled to dist/index.js\n // templates are in dist/templates/builtin/\n const templatePath = join(__dirname, 'templates', 'builtin', `${name}.js`);\n const templateUrl = pathToFileURL(templatePath).href;\n const module = await import(templateUrl);\n return validateTemplate(module, name);\n } catch (error) {\n throw new Error(\n `Failed to load built-in template \"${name}\": ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Load custom template from filesystem\n */\nasync function loadCustomTemplate(templatePath: string, cwd: string): Promise<ChangelogTemplate> {\n // Resolve path (relative or absolute)\n const fullPath = isAbsolute(templatePath) ? templatePath : join(cwd, templatePath);\n\n // Check if file exists\n try {\n await access(fullPath);\n } catch {\n throw new Error(`Template file not found: ${fullPath}`);\n }\n\n // Load module (supports .ts, .js, .mjs)\n try {\n // Convert to file:// URL for dynamic import\n const fileUrl = pathToFileURL(fullPath).href;\n const module = await import(fileUrl);\n\n return validateTemplate(module, templatePath);\n } catch (error) {\n throw new Error(\n `Failed to load custom template \"${templatePath}\": ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Validate template module\n */\nfunction validateTemplate(module: any, templateName: string): ChangelogTemplate {\n // Check version field\n if (!module.version || module.version !== '1.0') {\n throw new Error(\n `Template \"${templateName}\" has invalid version (expected \"1.0\", got \"${module.version || 'undefined'}\")`\n );\n }\n\n // Check render function\n if (typeof module.render !== 'function') {\n throw new Error(`Template \"${templateName}\" must export a render() function`);\n }\n\n return module as ChangelogTemplate;\n}\n\n/**\n * List available built-in templates with descriptions\n */\nexport function listBuiltinTemplates(): Array<{ name: string; description: string }> {\n return [\n {\n name: 'corporate',\n description: 'Professional changelog with emoji and grouped sections (sync, fast)',\n },\n {\n name: 'corporate-ai',\n description: 'Corporate format with AI-enhanced descriptions (async, smart)',\n },\n {\n name: 'technical',\n description: 'Developer-focused with commit SHAs, authors, and all commit types',\n },\n {\n name: 'compact',\n description: 'Minimal one-line format for quick release notes',\n },\n ];\n}\n","/**\n * Changelog Generator - Reusable changelog generation logic\n * Used by both release:run and release:changelog commands\n */\n\nimport type { Change, PackageRelease, ReleaseManifest, GitRange } from './types';\nimport type { ILLM, ILogger, IAnalytics } from '@kb-labs/sdk';\nimport { resolveGitRange } from './git-range';\nimport { parseCommits } from './parser';\nimport { detectProvider, enhanceChangeWithLinks } from './providers';\nimport { createReleaseManifest, formatAsJson } from './formatters/json';\nimport { loadTemplate, packageToTemplateData } from './templates';\n\n/**\n * Package info for changelog generation\n */\nexport interface ChangelogPackageInfo {\n name: string;\n path: string;\n currentVersion: string;\n nextVersion: string;\n bump: 'patch' | 'minor' | 'major' | 'none';\n}\n\n/**\n * Changelog generation options\n */\nexport interface GenerateChangelogOptions {\n /** Root directory of the repository */\n repoRoot: string;\n /** Git working directory (for submodule support) */\n gitCwd?: string;\n /** Packages to generate changelog for */\n packages: ChangelogPackageInfo[];\n /** Git range options */\n range?: {\n from?: string;\n to?: string;\n sinceTag?: string;\n };\n /** Changelog configuration */\n changelog?: {\n template?: string;\n locale?: 'en' | 'ru';\n metadata?: Record<string, unknown>;\n ignoreAuthors?: string[];\n includeTypes?: string[];\n excludeTypes?: string[];\n collapseMerges?: boolean;\n collapseReverts?: boolean;\n preferMergeSummary?: boolean;\n groups?: Array<{ title: string; emoji?: string; scopes: string[] }>;\n };\n /** Git configuration */\n git?: {\n autoUnshallow?: boolean;\n requireSignedTags?: boolean;\n baseUrl?: string;\n };\n /** Platform services for AI-powered formatting, logging, and analytics */\n platform?: { llm?: ILLM; logger?: ILogger; analytics?: IAnalytics };\n /** Progress callback */\n onProgress?: (message: string) => void;\n}\n\n/**\n * Changelog generation result\n */\nexport interface GenerateChangelogResult {\n /** Generated markdown content */\n markdown: string;\n /** Release manifest (JSON structure) */\n manifest: ReleaseManifest;\n /** Parsed and enhanced changes */\n changes: Change[];\n /** Git range used */\n range: GitRange;\n /** Package releases */\n packages: PackageRelease[];\n}\n\n/**\n * Generate changelog for packages\n *\n * This is the main reusable function for changelog generation.\n * Used by both release:run and release:changelog commands.\n */\nexport async function generateChangelog(\n options: GenerateChangelogOptions\n): Promise<GenerateChangelogResult> {\n const {\n repoRoot,\n gitCwd = repoRoot,\n packages,\n range: rangeOptions,\n changelog: changelogConfig,\n git: gitConfig,\n platform,\n onProgress,\n } = options;\n\n const locale = changelogConfig?.locale || 'en';\n\n // Step 1: Resolve git range\n onProgress?.('Resolving git range...');\n const range = await resolveGitRange({\n cwd: gitCwd,\n from: rangeOptions?.from,\n to: rangeOptions?.to || 'HEAD',\n sinceTag: rangeOptions?.sinceTag,\n autoUnshallow: gitConfig?.autoUnshallow,\n requireSignedTags: gitConfig?.requireSignedTags,\n });\n\n // Step 2: Detect git provider\n onProgress?.('Detecting git provider...');\n const provider = await detectProvider(gitCwd, gitConfig?.baseUrl);\n\n // Step 3: Parse commits\n onProgress?.('Parsing commits...');\n const changes = await parseCommits({\n cwd: gitCwd,\n from: range.from,\n to: range.to,\n ignoreAuthors: changelogConfig?.ignoreAuthors || [],\n includeTypes: changelogConfig?.includeTypes,\n excludeTypes: changelogConfig?.excludeTypes,\n collapseMerges: changelogConfig?.collapseMerges,\n collapseReverts: changelogConfig?.collapseReverts,\n preferMergeSummary: changelogConfig?.preferMergeSummary,\n });\n\n // Step 4: Enhance changes with provider links\n onProgress?.('Enhancing changes with links...');\n const enhancedChanges = changes.map(change => enhanceChangeWithLinks(change, provider));\n\n // Step 5: Build package releases\n onProgress?.('Building package releases...');\n\n // Normalize a package path to a relative-from-gitCwd prefix for matching against\n // filesChanged entries (which git reports relative to gitCwd).\n function normalizePkgPath(pkgPath: string): string {\n // Prefer normalizing relative to gitCwd (where git was run from),\n // then fall back to repoRoot.\n let rel: string;\n if (pkgPath.startsWith(gitCwd)) {\n rel = pkgPath.slice(gitCwd.length).replace(/^\\/+/, '');\n } else if (pkgPath.startsWith(repoRoot)) {\n rel = pkgPath.slice(repoRoot.length).replace(/^\\/+/, '');\n } else {\n rel = pkgPath.replace(/^\\/+/, '');\n }\n return rel.endsWith('/') ? rel : rel + '/';\n }\n\n const packageReleases: PackageRelease[] = packages.map(pkg => {\n const pkgPrefix = normalizePkgPath(pkg.path);\n\n // Filter changes that touched at least one file inside this package's directory.\n // Falls back to all changes when the package sits at repo root (monorepo root release).\n const isRoot = pkgPrefix === '/' || pkgPrefix === '' || pkgPrefix === './';\n const pkgChanges = isRoot\n ? enhancedChanges\n : enhancedChanges.filter(c =>\n !c.filesChanged || c.filesChanged.length === 0\n ? true // keep commits with no file info (e.g. merge commits, empty commits)\n : c.filesChanged.some(f => f.startsWith(pkgPrefix))\n );\n\n const hasBreaking = pkgChanges.some(c => c.breaking && c.breaking.length > 0);\n const hasFeat = pkgChanges.some(c => c.type === 'feat');\n const hasFix = pkgChanges.some(c => c.type === 'fix');\n const hasPerf = pkgChanges.some(c => c.type === 'perf');\n\n let reason: 'breaking' | 'feat' | 'fix' | 'perf' | 'ripple' | 'manual' = 'manual';\n if (hasBreaking) {reason = 'breaking';}\n else if (hasFeat) {reason = 'feat';}\n else if (hasFix) {reason = 'fix';}\n else if (hasPerf) {reason = 'perf';}\n\n return {\n name: pkg.name,\n prev: pkg.currentVersion,\n next: pkg.nextVersion,\n bump: pkg.bump,\n reason,\n breaking: pkgChanges.filter(c => c.breaking && c.breaking.length > 0).flatMap(c => c.breaking!),\n changes: pkgChanges,\n };\n });\n\n // Step 6: Create release manifest\n const manifest = createReleaseManifest(range, packageReleases);\n\n // Step 7: Detect lockstep — all packages share the same next version\n const uniqueNextVersions = new Set(packageReleases.map(p => p.next));\n const isLockstep = packageReleases.length > 1 && uniqueNextVersions.size === 1;\n\n let markdown: string;\n\n // Step 8: Load template and format\n const templateName = changelogConfig?.template || 'corporate-ai';\n onProgress?.(`Loading template \"${templateName}\"...`);\n const template = await loadTemplate(templateName, repoRoot);\n\n if (isLockstep) {\n // Consolidated changelog for lockstep monorepo releases:\n // Merge all packages into one virtual release and render through template\n onProgress?.('Formatting consolidated lockstep changelog...');\n const sharedVersion = packageReleases[0]!.next;\n const sharedPrev = packageReleases[0]!.prev;\n\n // Use ALL parsed changes (not just package-filtered ones) for lockstep changelog.\n // Package filtering can miss root-level commits (e.g. config, CI, docs) that don't\n // touch files inside packages/ directories but are still part of the release.\n const mergedChanges = enhancedChanges;\n\n // Merge breaking changes from all commits\n const seenBreaking = new Set<string>();\n const mergedBreaking = enhancedChanges\n .filter(c => c.breaking && c.breaking.length > 0)\n .flatMap(c => c.breaking!)\n .filter(b => {\n if (seenBreaking.has(b.summary)) {return false;}\n seenBreaking.add(b.summary);\n return true;\n });\n\n // Determine overall reason from merged changes\n const hasBreaking = mergedBreaking.length > 0;\n const hasFeat = mergedChanges.some(c => c.type === 'feat');\n const hasFix = mergedChanges.some(c => c.type === 'fix');\n const hasPerf = mergedChanges.some(c => c.type === 'perf');\n let reason: 'breaking' | 'feat' | 'fix' | 'perf' | 'ripple' | 'manual' = 'manual';\n if (hasBreaking) {reason = 'breaking';}\n else if (hasFeat) {reason = 'feat';}\n else if (hasFix) {reason = 'fix';}\n else if (hasPerf) {reason = 'perf';}\n\n // Build scope display name\n const scopeName = packages.length > 0 ? packages[0]!.name.replace(/\\/[^/]+$/, '') : 'monorepo';\n\n // Build lockstep header with packages table\n const date = new Date().toISOString().split('T')[0]!;\n const pkgWord = locale === 'ru' ? 'пакетов' : packages.length === 1 ? 'package' : 'packages';\n const headerLines: string[] = [\n `## [${sharedVersion}] - ${date}`,\n '',\n `**${packageReleases.length} ${pkgWord}** bumped to v${sharedVersion}`,\n '',\n `| ${locale === 'ru' ? 'Пакет' : 'Package'} | ${locale === 'ru' ? 'Предыдущая' : 'Previous'} | ${locale === 'ru' ? 'Тип' : 'Bump'} |`,\n `|---------|----------|------|`,\n ...packageReleases.filter(p => p.bump !== 'none').map(p => `| \\`${p.name}\\` | ${p.prev} | ${p.bump} |`),\n '',\n ];\n\n // Render merged changes through template (gets LLM enhancement)\n const mergedRelease: PackageRelease = {\n name: scopeName,\n prev: sharedPrev,\n next: sharedVersion,\n bump: packageReleases[0]!.bump,\n reason,\n breaking: mergedBreaking,\n changes: mergedChanges,\n };\n\n onProgress?.('Enhancing lockstep changelog with template...');\n const templateData = packageToTemplateData(mergedRelease, locale, changelogConfig?.metadata, changelogConfig?.groups);\n const result = template.render(templateData, platform);\n const rendered = typeof result === 'string' ? result : await result;\n\n // Strip the template's own header (## [version] - date + blockquote) — we use lockstep header instead\n const renderedLines = rendered.split('\\n');\n let contentStartIdx = 0;\n for (let i = 0; i < renderedLines.length; i++) {\n const line = renderedLines[i]!;\n // Skip header lines: ## [version], empty lines, and > blockquote\n if (line.startsWith('## [') || line.startsWith('> **') || line.trim() === '') {\n contentStartIdx = i + 1;\n } else {\n break;\n }\n }\n const contentBody = renderedLines.slice(contentStartIdx).join('\\n').trim();\n\n markdown = headerLines.join('\\n') + (contentBody ? '\\n' + contentBody : `\\n*${locale === 'ru' ? 'Без функциональных изменений.' : 'No functional changes.'}*`);\n } else {\n // Format each package separately through template\n const formattedPackages: string[] = [];\n for (let i = 0; i < packageReleases.length; i++) {\n const pkg = packageReleases[i];\n if (!pkg) {continue;}\n\n onProgress?.(`Formatting changelog for ${pkg.name} (${i + 1}/${packageReleases.length})...`);\n\n const templateData = packageToTemplateData(pkg, locale, changelogConfig?.metadata, changelogConfig?.groups);\n const result = template.render(templateData, platform);\n const formatted = typeof result === 'string' ? result : await result;\n\n formattedPackages.push(formatted);\n }\n\n markdown = formattedPackages.join('\\n\\n');\n }\n\n return {\n markdown,\n manifest: JSON.parse(formatAsJson(manifest)),\n changes: enhancedChanges,\n range,\n packages: packageReleases,\n };\n}\n\n/**\n * Generate simple fallback changelog (no LLM, no templates)\n */\nexport function generateSimpleChangelog(\n packages: ChangelogPackageInfo[],\n locale: 'en' | 'ru' = 'en'\n): string {\n const date = new Date().toISOString().split('T')[0]!;\n\n // Detect lockstep (all packages share same next version)\n const uniqueVersions = new Set(packages.map(p => p.nextVersion));\n const isLockstep = packages.length > 1 && uniqueVersions.size === 1;\n\n if (isLockstep) {\n const version = packages[0]!.nextVersion;\n const title = locale === 'ru' ? 'Релиз' : 'Release';\n const pkgWord = locale === 'ru' ? 'пакетов' : packages.length === 1 ? 'package' : 'packages';\n const lines: string[] = [\n `## [${version}] - ${date}`,\n '',\n `**${packages.length} ${pkgWord}** bumped to v${version}`,\n '',\n `| Package | Previous | Bump |`,\n `|---------|----------|------|`,\n ...packages.map(p => `| \\`${p.name}\\` | ${p.currentVersion} | ${p.bump} |`),\n ];\n return lines.join('\\n');\n }\n\n const title = locale === 'ru' ? 'Релиз' : 'Release';\n const lines: string[] = [`## [${date}] ${title}\\n\\n`];\n\n for (const pkg of packages) {\n lines.push(`- **${pkg.name}**: ${pkg.currentVersion} → ${pkg.nextVersion}`);\n }\n\n return lines.join('\\n');\n}\n"]}
1
+ {"version":3,"sources":["../src/parser.ts","../src/cache.ts","../src/git-range.ts","../src/versioning.ts","../src/providers.ts","../src/formatters/json.ts","../src/formatters/markdown.ts","../src/formatters/llm-markdown.ts","../src/templates/types.ts","../src/templates/loader.ts","../src/changelog-generator.ts"],"names":["simpleGit","t","groupChangesByType","__filename","__dirname","join","lines"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * High-performance commit parser with conventional commits support\n * Single git log traversal with streaming parse\n */\n\nimport simpleGit from 'simple-git';\nimport type { Change, CommitType, BreakingChange, Reference, Author, ParseOptions } from './types';\n\n/**\n * Parse commits from git history using single traversal\n * Performance: O(commits) - no N× git diff calls\n */\nexport async function parseCommits(options: ParseOptions): Promise<Change[]> {\n const {\n cwd,\n from,\n to = 'HEAD',\n packagePath,\n ignoreAuthors = [],\n includeTypes,\n excludeTypes,\n collapseMerges = true,\n collapseReverts = true,\n preferMergeSummary = true,\n } = options;\n\n const git = simpleGit(cwd);\n\n // Build git log command for single traversal\n // Format: SHA, author name, author email, author date (ISO), subject, body\n const format = '%H%x00%an%x00%ae%x00%ai%x00%s%x00%b%n--COMMIT_FOOTER--';\n\n // Get commits with --name-status for changed files info\n // NOTE: simple-git requires arguments as separate array elements for git.raw()\n // Special case: if from ends with ^, it might not exist (parent of first commit)\n // In this case, use --root to show all commits from beginning\n const useRoot = from.endsWith('^');\n const logArgs = useRoot\n ? ['log', '--no-merges', '--name-status', '--root', `--format=${format}`, to]\n : ['log', '--no-merges', '--name-status', `--format=${format}`, `${from}..${to}`];\n\n // Add package filter if specified\n if (packagePath) {\n logArgs.push('--', packagePath);\n }\n\n const logOutput = await git.raw(logArgs);\n\n return parseGitLogOutput(logOutput, {\n ignoreAuthors,\n includeTypes,\n excludeTypes,\n collapseMerges,\n collapseReverts,\n preferMergeSummary,\n });\n}\n\n/**\n * Parse raw git log output into Change objects\n */\nfunction parseGitLogOutput(\n output: string,\n options: {\n ignoreAuthors: string[];\n includeTypes?: string[];\n excludeTypes?: string[];\n collapseMerges: boolean;\n collapseReverts: boolean;\n preferMergeSummary: boolean;\n }\n): Change[] {\n const changes: Change[] = [];\n\n // Split by commit delimiter\n // Each commit block contains: header line + optional file changes\n // After --COMMIT_FOOTER-- there's a blank line, then file lines (D/M/A), then blank line before next commit\n const commits = output.split('--COMMIT_FOOTER--').filter(Boolean);\n\n for (let i = 0; i < commits.length; i++) {\n const commitBlock = commits[i];\n if (!commitBlock) {continue;}\n\n // After split by --COMMIT_FOOTER--, format is:\n // Block 0: \"SHA\\0author...\\0body\\n\"\n // Block 1: \"\\n\\nD\\tfile1\\nM\\tfile2\\nSHA\\0author...\\0body\\n\"\n // Block 2: \"\\n\\nA\\tfile3\\nSHA\\0...\\n\"\n //\n // So: header is at END of block, files are at BEGINNING of NEXT block\n\n const lines = commitBlock.split('\\n');\n\n // Find header line (contains \\0 separators) - should be first non-empty line\n let header = '';\n for (const line of lines) {\n if (line.trim() && line.includes('\\0')) {\n header = line;\n break;\n }\n }\n\n if (!header) {\n continue;\n }\n\n // File lines come from NEXT block (before next commit's header)\n const fileLines: string[] = [];\n if (i + 1 < commits.length) {\n const nextBlock = commits[i + 1];\n if (!nextBlock) {continue;}\n\n const nextLines = nextBlock.split('\\n');\n\n // Take lines until we hit next header (line with \\0)\n for (const line of nextLines) {\n if (line.trim() && line.includes('\\0')) {\n break; // This is next commit's header\n }\n if (line.trim()) {\n fileLines.push(line);\n }\n }\n }\n\n // Parse header: SHA\\0author\\0email\\0date\\0subject\\0body\n const [sha, authorName, authorEmail, authorDate, subject, body = ''] = header.split('\\0');\n\n if (!sha || sha.length !== 40 || !authorName || !authorEmail || !authorDate || !subject) {\n continue; // Invalid fields\n }\n\n // Ignore bot authors\n if (options.ignoreAuthors.some((pattern: string) => matchesGlob(authorName, pattern))) {\n continue;\n }\n\n // Parse conventional commit\n const convention = parseConventionalCommit(`${subject}\\n\\n${body || ''}`);\n\n // Skip filtered types\n if (shouldSkipCommit(convention.type, options.includeTypes, options.excludeTypes)) {\n continue;\n }\n\n // Extract files from --name-status output\n const filesChanged = parseFileChanges(fileLines);\n\n // Map files to packages (basic implementation, will be enhanced)\n const packages = extractPackagesFromFiles(filesChanged);\n\n // Build Change object\n const change: Change = {\n sha,\n type: convention.type,\n scope: convention.scope,\n subject: convention.subject,\n body: convention.body,\n breaking: convention.breaking,\n refs: extractReferences(convention.footers),\n author: {\n name: authorName,\n email: authorEmail,\n },\n coAuthors: extractCoAuthors(convention.footers),\n packages,\n filesChanged: filesChanged.map(f => f.path),\n timestamp: authorDate,\n isMerge: false,\n isRevert: convention.type === 'revert',\n revertOf: extractRevertOf(convention.body, convention.footers),\n cherryPickOf: extractCherryPickOf(convention.footers),\n };\n\n changes.push(change);\n }\n\n return changes;\n}\n\n/**\n * Parse conventional commit format\n */\nfunction parseConventionalCommit(commitMessage: string): {\n type: CommitType;\n scope?: string;\n subject: string;\n body?: string;\n breaking?: BreakingChange[];\n footers: string[];\n} {\n const lines = commitMessage.split('\\n');\n const header = lines[0] || '';\n const bodyLines = lines.slice(2); // Skip empty line after header\n const body = bodyLines.join('\\n').trim();\n\n // Parse header with conventional commits format: type(scope): subject or type(scope)!: subject\n const headerMatch = header.match(/^(\\w+)(?:\\(([^)]+)\\))?(!)?:\\s*(.+)$/);\n\n let parsedType: string | undefined;\n let parsedScope: string | undefined;\n let parsedSubject: string = '';\n let hasBreaking = false;\n\n if (headerMatch) {\n parsedType = headerMatch[1];\n parsedScope = headerMatch[2];\n hasBreaking = headerMatch[3] === '!';\n parsedSubject = headerMatch[4] || '';\n } else {\n // Fallback: treat whole header as subject\n parsedType = undefined;\n parsedSubject = header;\n }\n\n const type = normalizeType(parsedType);\n const breaking: BreakingChange[] = [];\n\n // Detect breaking changes from ! suffix in header\n if (hasBreaking) {\n breaking.push({ summary: parsedSubject });\n }\n\n // Extract footers (lines starting with keyword followed by :)\n const footers: string[] = [];\n const footerLines = body.split('\\n');\n for (const line of footerLines) {\n if (/^[A-Z-]+:\\s*/.test(line)) {\n footers.push(line);\n // Check for BREAKING CHANGE footer\n const breakingMatch = line.match(/^BREAKING CHANGE:\\s*(.+)/);\n if (breakingMatch && breakingMatch[1]) {\n breaking.push({ summary: breakingMatch[1] });\n }\n }\n }\n\n return {\n type,\n scope: parsedScope,\n subject: parsedSubject,\n body: body || undefined,\n breaking: breaking.length > 0 ? breaking : undefined,\n footers,\n };\n}\n\n/**\n * Normalize commit type\n */\nfunction normalizeType(type: string | undefined): CommitType {\n const normalized = (type || 'chore').toLowerCase();\n const validTypes: CommitType[] = ['feat', 'fix', 'perf', 'refactor', 'docs', 'build', 'ci', 'test', 'chore', 'revert', 'style'];\n return validTypes.includes(normalized as CommitType) ? (normalized as CommitType) : 'chore';\n}\n\n/**\n * Parse --name-status output into file changes\n */\ninterface FileChange {\n path: string;\n status: string;\n oldPath?: string;\n}\n\nfunction parseFileChanges(lines: string[]): FileChange[] {\n const changes: FileChange[] = [];\n \n for (const line of lines) {\n if (!line.trim() || line.trim().startsWith('diff --git')) {continue;}\n \n // Parse status + file: \"A\\tpath/to/file\" or \"R100\\told\\to/new\"\n const match = line.match(/^([ADMRT])\\t(.*?)$/);\n if (!match) {continue;}\n\n const [, status, path] = match;\n if (!path || !status) {continue;}\n \n if (status === 'R' || status === 'C') {\n // Rename/Copy: path contains old\\tnew\n const [oldPath, newPath] = path.split('\\t');\n if (newPath) {\n changes.push({ path: newPath, status, oldPath });\n }\n if (oldPath) {\n changes.push({ path: oldPath, status: 'D' });\n }\n } else {\n changes.push({ path, status });\n }\n }\n\n return changes;\n}\n\n/**\n * Extract package names from file paths\n * Basic implementation - will be enhanced with devlink graph\n */\nfunction extractPackagesFromFiles(files: FileChange[]): string[] {\n const packages = new Set<string>();\n \n for (const file of files) {\n // Match patterns like: packages/pkg-name/...\n const match = file.path.match(/^packages\\/([^/]+)/);\n if (match) {\n packages.add(`packages/${match[1]}`);\n }\n }\n\n return Array.from(packages);\n}\n\n/**\n * Extract references from footers (Closes #123, etc.)\n */\nfunction extractReferences(footers: string[]): Reference[] {\n const refs: Reference[] = [];\n\n for (const footer of footers) {\n // Match: Closes #123, Fixes #456, Refs #789\n const match = footer.match(/(?:Closes|Fixes|Refs)\\s+#(\\d+)/i);\n if (match && match[1]) {\n refs.push({\n type: footer.toLowerCase().includes('closes') || footer.toLowerCase().includes('fixes') ? 'issue' : 'pr',\n id: match[1],\n });\n }\n }\n\n return refs;\n}\n\n/**\n * Extract co-authors from footers\n */\nfunction extractCoAuthors(footers: string[]): Author[] {\n const coAuthors: Author[] = [];\n\n for (const footer of footers) {\n const match = footer.match(/^Co-authored-by:\\s*(.+?)\\s*<(.+?)>$/i);\n if (match && match[1] && match[2]) {\n coAuthors.push({\n name: match[1].trim(),\n email: match[2].trim(),\n });\n }\n }\n\n return coAuthors;\n}\n\n/**\n * Extract revert target SHA\n */\nfunction extractRevertOf(body: string | undefined, footers: string[]): string | undefined {\n if (!body) {return undefined;}\n\n const match = body.match(/revert (?:of\\s+)?([0-9a-f]{40})/i);\n return match ? match[1] : undefined;\n}\n\n/**\n * Extract cherry-pick source SHA\n */\nfunction extractCherryPickOf(footers: string[]): string | undefined {\n for (const footer of footers) {\n const match = footer.match(/cherry picked from (.+)/i);\n if (match && match[1]) {return match[1].trim();}\n }\n return undefined;\n}\n\n/**\n * Check if commit should be skipped based on type filters\n */\nfunction shouldSkipCommit(\n type: string,\n includeTypes?: string[],\n excludeTypes?: string[]\n): boolean {\n if (includeTypes && !includeTypes.includes(type)) {\n return true;\n }\n if (excludeTypes && excludeTypes.includes(type)) {\n return true;\n }\n return false;\n}\n\n/**\n * Match glob pattern (simplified implementation)\n */\nfunction matchesGlob(text: string, pattern: string): boolean {\n // Handle wildcards: *[bot] matches any[bot], renovate* matches renovate-*\n const regexPattern = pattern\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.');\n \n const regex = new RegExp(`^${regexPattern}$`, 'i');\n return regex.test(text);\n}\n\n","/**\n * Persistent cache for parsed commits and metadata\n * Includes graph hash invalidation and lockfile support\n */\n\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { Change, ChangeCache } from './types';\n\nconst CACHE_FILE = 'cache.json';\nconst GRAPH_FILE = 'graph.json';\nconst LOCK_FILE = '.cache.lock';\n\n/**\n * Load cache from disk\n */\nexport async function loadCache(cacheDir: string): Promise<ChangeCache | null> {\n const cachePath = join(cacheDir, CACHE_FILE);\n \n try {\n if (!existsSync(cachePath)) {\n return null;\n }\n \n const content = await readFile(cachePath, 'utf-8');\n return JSON.parse(content) as ChangeCache;\n } catch (error) {\n // Corrupted cache, return null to rebuild\n return null;\n }\n}\n\n/**\n * Save cache to disk\n */\nexport async function saveCache(cacheDir: string, cache: ChangeCache): Promise<void> {\n const cachePath = join(cacheDir, CACHE_FILE);\n \n try {\n await mkdir(cacheDir, { recursive: true });\n await writeFile(cachePath, JSON.stringify(cache, null, 2), 'utf-8');\n } catch (error) {\n // Non-critical error, just log and continue\n console.warn(`Failed to save cache: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * Get cached commit if exists\n */\nexport function getCachedChange(cache: ChangeCache | null, sha: string): Change | null {\n if (!cache) {return null;}\n \n return cache.commits[sha] || null;\n}\n\n/**\n * Update cache with new commits\n */\nexport function updateCache(cache: ChangeCache | null, commits: Change[]): ChangeCache {\n if (!cache) {\n cache = {\n meta: {\n graphHash: '',\n HEAD: '',\n },\n commits: {},\n lastTags: {},\n };\n }\n \n for (const commit of commits) {\n cache.commits[commit.sha] = commit;\n }\n \n return cache;\n}\n\n/**\n * Save devlink graph snapshot\n */\nexport async function saveGraphSnapshot(\n cacheDir: string,\n graphHash: string\n): Promise<void> {\n const graphPath = join(cacheDir, GRAPH_FILE);\n \n try {\n await mkdir(cacheDir, { recursive: true });\n const content = JSON.stringify({ hash: graphHash, timestamp: new Date().toISOString() }, null, 2);\n await writeFile(graphPath, content, 'utf-8');\n \n // Also update cache meta\n const cache = await loadCache(cacheDir);\n if (cache) {\n cache.meta.graphHash = graphHash;\n await saveCache(cacheDir, cache);\n }\n } catch (error) {\n console.warn(`Failed to save graph snapshot: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * Update HEAD reference in cache\n */\nexport async function updateHead(cacheDir: string, head: string): Promise<void> {\n const cache = await loadCache(cacheDir);\n if (cache) {\n cache.meta.HEAD = head;\n await saveCache(cacheDir, cache);\n }\n}\n\n/**\n * Update last tag for a package\n */\nexport async function updateLastTag(\n cacheDir: string,\n packageName: string,\n tag: string,\n sha: string\n): Promise<void> {\n const cache = await loadCache(cacheDir);\n const updatedCache = updateCache(cache, []);\n updatedCache.lastTags[packageName] = { tag, sha };\n await saveCache(cacheDir, updatedCache);\n}\n\n/**\n * Get last tag for a package\n */\nexport function getLastTag(\n cache: ChangeCache | null,\n packageName: string\n): { tag: string; sha: string } | null {\n if (!cache) {return null;}\n \n return cache.lastTags[packageName] || null;\n}\n\n/**\n * Check if cache is valid for given range\n * Invalidates if graph hash or HEAD changed outside range\n */\nexport async function isCacheValid(\n cacheDir: string,\n from: string,\n to: string,\n currentGraphHash?: string,\n currentHead?: string\n): Promise<boolean> {\n const cache = await loadCache(cacheDir);\n if (!cache) {return false;}\n \n // Check graph hash\n if (currentGraphHash && cache.meta.graphHash && cache.meta.graphHash !== currentGraphHash) {\n return false;\n }\n \n // Check HEAD (should be >= 'to' for cache to be valid)\n if (currentHead && cache.meta.HEAD && !isCommitValid(cache.meta.HEAD, from, to)) {\n return false;\n }\n \n return true;\n}\n\n/**\n * Check if commit is within range\n */\nfunction isCommitValid(commit: string, from: string, to: string): boolean {\n // Simplified check - in real implementation would use git rev-list to compare\n // For now, just ensure commit exists between from and to\n return true;\n}\n\n/**\n * Acquire lockfile for cache operations\n */\nexport async function acquireLock(cacheDir: string): Promise<() => Promise<void>> {\n const lockPath = join(cacheDir, LOCK_FILE);\n \n // Check if lock exists\n if (existsSync(lockPath)) {\n throw new Error('Cache lock already acquired. Another process may be running.');\n }\n \n // Create lock\n await mkdir(cacheDir, { recursive: true });\n await writeFile(lockPath, JSON.stringify({\n pid: process.pid,\n timestamp: new Date().toISOString(),\n }), 'utf-8');\n \n // Return release function\n return async () => {\n if (existsSync(lockPath)) {\n try {\n await writeFile(lockPath, '', 'utf-8');\n } catch {\n // Ignore cleanup errors\n }\n }\n };\n}\n\n\n","/**\n * Git history range resolution with tag discovery and shallow clone detection\n */\n\nimport simpleGit from 'simple-git';\nimport type { GitRange } from './types';\n\n/**\n * Resolve git range from various sources (tags, refs, dates)\n */\nexport async function resolveGitRange(options: {\n cwd: string;\n from?: string;\n to?: string;\n sinceTag?: string;\n autoUnshallow?: boolean;\n requireSignedTags?: boolean;\n}): Promise<GitRange> {\n const { cwd, from, to = 'HEAD', sinceTag, autoUnshallow, requireSignedTags } = options;\n \n const git = simpleGit(cwd);\n \n // Handle shallow clone detection\n if (sinceTag || from) {\n await ensureHistoryDepth(git, sinceTag || from || 'HEAD', 'HEAD', autoUnshallow);\n }\n \n // Resolve 'from' ref\n // For first release (no tags), use first commit instead of HEAD~1\n const lastTag = await findLastTag(git, requireSignedTags);\n const fromRef = sinceTag || from || lastTag || await findFirstCommit(git);\n const toRef = to;\n\n return { from: fromRef, to: toRef };\n}\n\n/**\n * Find first commit in repository history\n * Returns parent of first commit (non-existent) to include first commit in range\n */\nasync function findFirstCommit(git: ReturnType<typeof simpleGit>): Promise<string> {\n try {\n // Get first commit hash using rev-list\n const result = await git.raw(['rev-list', '--max-parents=0', 'HEAD']);\n const firstCommit = result.trim();\n // Return parent notation to include first commit in git log range\n // first^ means \"parent of first commit\" which doesn't exist, so git log first^..HEAD includes first commit\n return `${firstCommit}^`;\n } catch (error) {\n // Fallback to HEAD~1 if we can't find first commit\n return 'HEAD~1';\n }\n}\n\n/**\n * Find last release tag\n */\nexport async function findLastTag(\n git: ReturnType<typeof simpleGit>,\n requireSigned?: boolean\n): Promise<string | null> {\n try {\n const tags = await git.tags();\n \n // Filter signed tags if required\n const candidateTags = requireSigned\n ? await filterSignedTags(git, tags.all)\n : tags.all;\n \n // Find most recent tag (sorted by version or date)\n const recentTag = candidateTags\n .sort()\n .reverse()[0];\n \n return recentTag || null;\n } catch (error) {\n // No tags or error, return null\n return null;\n }\n}\n\n/**\n * Find last tag for specific package\n */\nexport async function findPackageTag(\n git: ReturnType<typeof simpleGit>,\n packageName: string,\n requireSigned?: boolean\n): Promise<string | null> {\n try {\n const tags = await git.tags();\n \n // Match package tag patterns: @scope/package@1.0.0 or @pkg@1.0.0\n const packageRegex = new RegExp(`@${packageName.replace('@', '')}@v?\\\\d+\\\\.\\\\d+\\\\.\\\\d+`);\n \n const packageTags = tags.all.filter(tag => packageRegex.test(tag));\n \n const candidateTags = requireSigned\n ? await filterSignedTags(git, packageTags)\n : packageTags;\n \n return candidateTags\n .sort()\n .reverse()[0] || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Filter to only signed tags\n */\nasync function filterSignedTags(\n git: ReturnType<typeof simpleGit>,\n tags: string[]\n): Promise<string[]> {\n const signed: string[] = [];\n \n for (const tag of tags) {\n try {\n // Check if tag is signed: git cat-file tag <tag> contains PGP signature\n const content = await git.raw(['cat-file', 'tag', tag]);\n if (content.includes('-----BEGIN PGP SIGNATURE-----')) {\n signed.push(tag);\n }\n } catch {\n // Invalid tag or not signed, skip\n }\n }\n \n return signed;\n}\n\n/**\n * Ensure we have full git history (detect and fix shallow clones)\n */\nasync function ensureHistoryDepth(\n git: ReturnType<typeof simpleGit>,\n from: string,\n to: string,\n autoUnshallow?: boolean\n): Promise<void> {\n try {\n // Try to get commit count between from and to\n await git.raw(['rev-list', '--count', `${from}..${to}`]);\n } catch (error) {\n // Shallow clone detected - commits not available\n if (autoUnshallow) {\n console.log('⚠️ Shallow clone detected. Fetching full history...');\n try {\n await git.fetch(['--prune', '--unshallow', '--tags']);\n } catch (fetchError) {\n throw new Error(\n 'Shallow clone detected. Full history fetch failed. ' +\n 'Run manually: git fetch --unshallow --tags'\n );\n }\n } else {\n throw new Error(\n 'Shallow clone detected. Use --auto-unshallow flag or run: ' +\n 'git fetch --unshallow --tags'\n );\n }\n }\n}\n\n/**\n * Parse git URL to extract host/owner/repo\n */\nexport function parseGitUrl(url: string): {\n host: string;\n owner: string;\n repo: string;\n} | null {\n // Match: https://github.com/owner/repo.git\n // Match: git@github.com:owner/repo.git\n const match = url.match(/(?:https:\\/\\/([^/]+)|git@([^:]+):)(?:.*?\\/)?([^/]+)\\/([^/]+)(?:\\.git)?$/);\n \n if (!match) {return null;}\n \n const host = match[1] || match[2] || '';\n const owner = match[3] || '';\n const repo = match[4] || '';\n \n return { host, owner, repo };\n}\n\n\n","/**\n * Version bump detection and SemVer policy implementation\n * Supports independent, ripple, and lockstep strategies\n */\n\nimport semver from 'semver';\nimport type { Change, VersionBump } from './types';\n\n/**\n * Compute version bump from changes\n */\nexport function computeBump(changes: Change[]): VersionBump {\n const hasBreaking = changes.some(c => c.breaking && c.breaking.length > 0);\n const hasFeature = changes.some(c => c.type === 'feat');\n const hasFix = changes.some(c => ['fix', 'perf', 'refactor'].includes(c.type));\n \n if (hasBreaking) {return 'major';}\n if (hasFeature) {return 'minor';}\n if (hasFix) {return 'patch';}\n return 'none';\n}\n\n/**\n * Compute next version with optional pre-release\n */\nexport function computeNextVersion(\n currentVersion: string,\n bump: VersionBump,\n preid?: string\n): string {\n if (bump === 'none') {\n return currentVersion;\n }\n \n if (preid) {\n // Pre-release version: 1.0.0 -> 1.1.0-rc.1\n const nextVersion = semver.inc(currentVersion, bump === 'major' ? 'major' : bump === 'minor' ? 'minor' : 'patch');\n if (!nextVersion) {return currentVersion;}\n \n // Check if already pre-release\n const prerelease = semver.prerelease(nextVersion);\n if (prerelease && prerelease[0] === preid) {\n // Increment pre-release number\n const number = prerelease[1] as number;\n return semver.inc(nextVersion, 'prerelease', preid) || nextVersion;\n }\n \n return `${nextVersion}-${preid}.1`;\n }\n \n return semver.inc(currentVersion, bump) || currentVersion;\n}\n\n/**\n * Get package impact reasons\n */\nexport function getImpactReason(changes: Change[]): {\n reason: 'breaking' | 'feat' | 'fix' | 'perf' | 'ripple' | 'manual';\n details?: string;\n} {\n if (changes.some(c => c.breaking && c.breaking.length > 0)) {\n return { reason: 'breaking', details: 'Contains breaking changes' };\n }\n if (changes.some(c => c.type === 'feat')) {\n return { reason: 'feat', details: 'New features added' };\n }\n if (changes.some(c => c.type === 'fix')) {\n return { reason: 'fix', details: 'Bug fixes included' };\n }\n if (changes.some(c => c.type === 'perf')) {\n return { reason: 'perf', details: 'Performance improvements' };\n }\n return { reason: 'manual', details: 'Manual version bump' };\n}\n\n/**\n * Get ripple dependencies for a package\n */\nexport function getRipplePackages(\n packageName: string,\n dependencyGraph: Record<string, string[]>,\n visited: Set<string> = new Set()\n): string[] {\n const ripple: string[] = [];\n \n if (visited.has(packageName)) {\n return ripple;\n }\n \n visited.add(packageName);\n \n // Find all packages that depend on this one\n for (const [pkg, deps] of Object.entries(dependencyGraph)) {\n if (deps.includes(packageName) && pkg !== packageName) {\n if (!ripple.includes(pkg)) {\n ripple.push(pkg);\n }\n \n // Recurse to find transitive dependencies\n const transitive = getRipplePackages(pkg, dependencyGraph, visited);\n for (const t of transitive) {\n if (!ripple.includes(t)) {\n ripple.push(t);\n }\n }\n }\n }\n \n return ripple;\n}\n\n/**\n * Apply version policy (independent, ripple, or lockstep)\n */\nexport function applyVersionPolicy(\n changes: Change[],\n affectedPackages: string[],\n currentVersions: Record<string, string>,\n policy: 'independent' | 'ripple' | 'lockstep',\n dependencyGraph?: Record<string, string[]>\n): Record<string, {\n nextVersion: string;\n bump: VersionBump;\n reason: 'breaking' | 'feat' | 'fix' | 'perf' | 'ripple' | 'manual';\n rippleFrom?: string[];\n}> {\n const result: Record<string, any> = {};\n \n // Group changes by package\n const changesByPackage: Record<string, Change[]> = {};\n for (const change of changes) {\n for (const pkg of change.packages) {\n if (!changesByPackage[pkg]) {\n changesByPackage[pkg] = [];\n }\n changesByPackage[pkg].push(change);\n }\n }\n \n if (policy === 'independent') {\n // Each package versions independently\n for (const pkg of affectedPackages) {\n const pkgChanges = changesByPackage[pkg] || [];\n const bump = computeBump(pkgChanges);\n const reasonInfo = getImpactReason(pkgChanges);\n const currentVersion = currentVersions[pkg] || '0.0.0';\n const nextVersion = computeNextVersion(currentVersion, bump);\n \n result[pkg] = {\n nextVersion,\n bump,\n reason: reasonInfo.reason,\n };\n }\n } else if (policy === 'ripple' && dependencyGraph) {\n // Ripple bump dependent packages\n const ripplePackages = new Set<string>();\n \n for (const pkg of affectedPackages) {\n const pkgChanges = changesByPackage[pkg] || [];\n const bump = computeBump(pkgChanges);\n const reasonInfo = getImpactReason(pkgChanges);\n const currentVersion = currentVersions[pkg] || '0.0.0';\n const nextVersion = computeNextVersion(currentVersion, bump);\n \n result[pkg] = {\n nextVersion,\n bump,\n reason: reasonInfo.reason,\n };\n \n // Find ripple dependents\n const ripple = getRipplePackages(pkg, dependencyGraph);\n for (const rpkg of ripple) {\n ripplePackages.add(rpkg);\n }\n }\n \n // Apply ripple bumps\n for (const pkg of ripplePackages) {\n if (!result[pkg]) {\n const currentVersion = currentVersions[pkg] || '0.0.0';\n const nextVersion = computeNextVersion(currentVersion, 'patch');\n \n result[pkg] = {\n nextVersion,\n bump: 'patch' as VersionBump,\n reason: 'ripple' as const,\n rippleFrom: Array.from(affectedPackages),\n };\n }\n }\n } else if (policy === 'lockstep') {\n // All packages share same version\n const allChanges = Object.values(changesByPackage).flat();\n const bump = computeBump(allChanges);\n const reasonInfo = getImpactReason(allChanges);\n \n // Find highest current version\n let highestVersion = '0.0.0';\n for (const version of Object.values(currentVersions)) {\n if (semver.gt(version, highestVersion)) {\n highestVersion = version;\n }\n }\n \n const nextVersion = computeNextVersion(highestVersion, bump);\n \n for (const pkg of affectedPackages) {\n result[pkg] = {\n nextVersion,\n bump,\n reason: reasonInfo.reason,\n };\n }\n }\n \n return result;\n}\n\n/**\n * Get affected packages from changes\n */\nexport function getAffectedPackages(changes: Change[]): string[] {\n const packages = new Set<string>();\n \n for (const change of changes) {\n for (const pkg of change.packages) {\n packages.add(pkg);\n }\n }\n \n return Array.from(packages);\n}\n\n\n","/**\n * Git provider detection and link formatting\n * Supports GitHub, GitLab, and self-hosted instances\n */\n\nimport simpleGit from 'simple-git';\nimport { parseGitUrl } from './git-range';\nimport type { Change, GitProvider } from './types';\n\n/**\n * Auto-detect git provider from remote\n */\nexport async function detectProvider(cwd: string, baseUrl?: string | null): Promise<GitProvider> {\n if (baseUrl) {\n // Explicit base URL provided\n return {\n type: inferProviderType(baseUrl),\n baseUrl,\n };\n }\n \n const git = simpleGit(cwd);\n \n try {\n const remotes = await git.getRemotes(true);\n const url = remotes[0]?.refs?.fetch || remotes[0]?.refs?.push;\n \n if (!url) {\n return { type: 'generic', baseUrl: null };\n }\n \n const parsed = parseGitUrl(url);\n if (!parsed) {\n return { type: 'generic', baseUrl: null };\n }\n \n const providerUrl = `https://${parsed.host}/${parsed.owner}/${parsed.repo}`;\n \n return {\n type: inferProviderType(providerUrl),\n baseUrl: providerUrl,\n };\n } catch (error) {\n return { type: 'generic', baseUrl: null };\n }\n}\n\n/**\n * Infer provider type from URL\n */\nfunction inferProviderType(url: string): 'github' | 'gitlab' | 'generic' {\n if (url.includes('github.com') || url.includes('githubusercontent.com')) {\n return 'github';\n }\n if (url.includes('gitlab.com') || url.includes('gitlab')) {\n return 'gitlab';\n }\n return 'generic';\n}\n\n/**\n * Format commit link\n */\nexport function formatCommitLink(provider: GitProvider, sha: string): string | undefined {\n if (!provider.baseUrl) {return undefined;}\n \n if (provider.type === 'github') {\n return `${provider.baseUrl}/commit/${sha}`;\n }\n if (provider.type === 'gitlab') {\n return `${provider.baseUrl}/-/commit/${sha}`;\n }\n \n return undefined;\n}\n\n/**\n * Format PR link\n */\nexport function formatPrLink(provider: GitProvider, prNumber: string): string | undefined {\n if (!provider.baseUrl) {return undefined;}\n \n if (provider.type === 'github') {\n return `${provider.baseUrl}/pull/${prNumber}`;\n }\n if (provider.type === 'gitlab') {\n return `${provider.baseUrl}/-/merge_requests/${prNumber}`;\n }\n \n return undefined;\n}\n\n/**\n * Format issue link\n */\nexport function formatIssueLink(provider: GitProvider, issueNumber: string): string | undefined {\n if (!provider.baseUrl) {return undefined;}\n \n if (provider.type === 'github') {\n return `${provider.baseUrl}/issues/${issueNumber}`;\n }\n if (provider.type === 'gitlab') {\n return `${provider.baseUrl}/-/issues/${issueNumber}`;\n }\n \n return undefined;\n}\n\n/**\n * Enhance change with provider links\n */\nexport function enhanceChangeWithLinks(change: Change, provider: GitProvider): Change {\n const providerLinks: Change['providerLinks'] = {\n commit: formatCommitLink(provider, change.sha),\n pr: [],\n issues: [],\n };\n \n for (const ref of change.refs) {\n if (ref.type === 'pr') {\n const link = formatPrLink(provider, ref.id);\n if (link) {\n providerLinks.pr!.push(link);\n ref.url = link;\n }\n } else if (ref.type === 'issue') {\n const link = formatIssueLink(provider, ref.id);\n if (link) {\n providerLinks.issues!.push(link);\n ref.url = link;\n }\n }\n }\n \n if (!providerLinks.pr!.length) {delete providerLinks.pr;}\n if (!providerLinks.issues!.length) {delete providerLinks.issues;}\n \n return {\n ...change,\n providerLinks,\n };\n}\n\n\n","/**\n * JSON manifest formatter with integrity hashes\n */\n\nimport { createHash } from 'node:crypto';\nimport type { ReleaseManifest, PackageRelease } from '../types';\n\n/**\n * Format ReleaseManifest as JSON string with integrity hashes\n */\nexport function formatAsJson(\n manifest: ReleaseManifest,\n additionalContent?: Record<string, string>\n): string {\n // Calculate integrity hashes\n const integrity: Record<string, string> = {};\n \n for (const [key, content] of Object.entries(additionalContent || {})) {\n integrity[key] = calculateSha256(content);\n }\n \n const manifestWithIntegrity = {\n ...manifest,\n integrity: Object.keys(integrity).length > 0 ? integrity : undefined,\n };\n \n return JSON.stringify(manifestWithIntegrity, null, 2);\n}\n\n/**\n * Create ReleaseManifest from data\n */\nexport function createReleaseManifest(\n range: { from: string; to: string },\n packages: PackageRelease[],\n timestamp?: string\n): ReleaseManifest {\n const byType: Record<string, number> = {};\n let breakingCount = 0;\n \n for (const pkg of packages) {\n // Count breaking changes\n breakingCount += pkg.breaking.length;\n \n // Count by type\n for (const change of pkg.changes) {\n byType[change.type] = (byType[change.type] || 0) + 1;\n }\n }\n \n return {\n schemaVersion: '1.0',\n range,\n timestamp: timestamp || new Date().toISOString(),\n packages,\n workspace: {\n breakingCount,\n byType,\n },\n };\n}\n\n/**\n * Calculate SHA256 hash\n */\nfunction calculateSha256(content: string): string {\n return createHash('sha256').update(content).digest('hex');\n}\n\n\n","/**\n * Markdown changelog formatter with i18n support and rendering levels\n */\n\nimport type { PackageRelease, Change, CommitType } from '../types';\n\nexport type RenderingLevel = 'compact' | 'standard' | 'detailed';\n\n/**\n * Format package release as markdown\n */\nexport function formatPackageAsMarkdown(\n pkg: PackageRelease,\n level: RenderingLevel = 'standard',\n locale: 'en' | 'ru' = 'en'\n): string {\n const lines: string[] = [];\n \n // Header: ## [version] - YYYY-MM-DD (package name as subheading if not obvious from context)\n const date = new Date().toISOString().split('T')[0]!;\n lines.push(`## [${pkg.next}] - ${date}`);\n lines.push('');\n\n // Version bump context (subtle, not a full redundant header)\n const reasonLabel = formatReasonLabel(pkg.reason, locale);\n lines.push(`> **${pkg.name}** ${pkg.prev} → ${pkg.next} (${reasonLabel})`);\n lines.push('');\n\n // Breaking changes\n if (pkg.breaking && pkg.breaking.length > 0) {\n lines.push('### ' + t('breaking_changes', locale));\n lines.push('');\n for (const breaking of pkg.breaking) {\n lines.push(`- **${breaking.summary}**`);\n if (breaking.notes) {\n lines.push(` ${breaking.notes}`);\n }\n }\n lines.push('');\n }\n\n // Group changes by type\n const groupedChanges = groupChangesByType(pkg.changes);\n\n // Render by type groups\n for (const [type, changes] of Object.entries(groupedChanges)) {\n if (changes.length === 0) {continue;}\n\n const sectionTitle = formatSectionTitle(type as CommitType, locale);\n lines.push(`### ${sectionTitle}`);\n lines.push('');\n\n for (const change of changes) {\n lines.push(formatChangeLine(change, level));\n }\n lines.push('');\n }\n\n return lines.join('\\n').trimEnd();\n}\n\n/**\n * Format change line based on rendering level\n */\nfunction formatChangeLine(change: Change, level: RenderingLevel): string {\n const bullet = '-';\n let line = `${bullet} **${change.scope || 'global'}**: ${change.subject}`;\n \n if (level === 'compact') {\n return line;\n }\n \n // Standard: add links\n const links: string[] = [];\n \n if (change.providerLinks?.commit) {\n links.push(`[${change.sha.substring(0, 7)}](${change.providerLinks.commit})`);\n }\n \n if (change.providerLinks?.pr && change.providerLinks.pr.length > 0) {\n for (const prLink of change.providerLinks.pr) {\n const match = prLink.match(/[^/]+$/);\n links.push(`[${match && match[0] ? match[0] : 'PR'}](${prLink})`);\n }\n }\n \n if (links.length > 0) {\n line += ` (${links.join(', ')})`;\n }\n \n // Detailed: add authors, file counts\n if (level === 'detailed') {\n const details: string[] = [];\n if (change.author) {\n details.push(`@${change.author.name}`);\n }\n if (change.coAuthors && change.coAuthors.length > 0) {\n details.push(...change.coAuthors.map(a => `@${a.name}`));\n }\n if (change.filesChanged && change.filesChanged.length > 0) {\n details.push(`${change.filesChanged.length} files`);\n }\n if (details.length > 0) {\n line += ` — ${details.join(', ')}`;\n }\n }\n \n return line;\n}\n\n/**\n * Group changes by type\n */\nfunction groupChangesByType(changes: Change[]): Record<string, Change[]> {\n const grouped: Record<string, Change[]> = {};\n \n for (const change of changes) {\n const type = change.type;\n if (!grouped[type]) {\n grouped[type] = [];\n }\n grouped[type].push(change);\n }\n \n return grouped;\n}\n\n/**\n * Format section title based on locale\n */\nfunction formatSectionTitle(type: CommitType, locale: 'en' | 'ru'): string {\n const titles: Record<string, Record<'en' | 'ru', string>> = {\n feat: { en: 'Features', ru: 'Новые возможности' },\n fix: { en: 'Bug Fixes', ru: 'Исправления' },\n perf: { en: 'Performance', ru: 'Производительность' },\n refactor: { en: 'Refactoring', ru: 'Рефакторинг' },\n docs: { en: 'Documentation', ru: 'Документация' },\n build: { en: 'Build', ru: 'Сборка' },\n ci: { en: 'CI/CD', ru: 'CI/CD' },\n test: { en: 'Tests', ru: 'Тесты' },\n chore: { en: 'Chores', ru: 'Обслуживание' },\n revert: { en: 'Reverts', ru: 'Откаты' },\n };\n \n return titles[type]?.[locale] || type;\n}\n\n/**\n * Format reason as a short human label\n */\nfunction formatReasonLabel(reason: string, locale: 'en' | 'ru'): string {\n const labels: Record<string, Record<'en' | 'ru', string>> = {\n breaking: { en: 'major — breaking changes', ru: 'major — критические изменения' },\n feat: { en: 'minor — new features', ru: 'minor — новая функциональность' },\n fix: { en: 'patch — bug fixes', ru: 'patch — исправления' },\n perf: { en: 'patch — performance', ru: 'patch — производительность' },\n ripple: { en: 'patch — dependency update', ru: 'patch — обновление зависимостей' },\n manual: { en: 'manual', ru: 'ручное' },\n };\n return labels[reason]?.[locale] ?? reason;\n}\n\n/**\n * Simple translation helper\n */\nfunction t(key: string, locale: 'en' | 'ru'): string {\n const translations: Record<string, Record<'en' | 'ru', string>> = {\n breaking_changes: { en: 'BREAKING CHANGES', ru: 'КРИТИЧЕСКИЕ ИЗМЕНЕНИЯ' },\n };\n\n return translations[key]?.[locale] ?? key;\n}\n\n/**\n * Format a lockstep monorepo release as a single consolidated changelog entry.\n *\n * All packages share the same nextVersion, so instead of N separate ## sections\n * we produce one version header, a packages table, and merged change lists.\n *\n * Example output:\n * ## [1.2.0] - 2026-03-01\n *\n * **17 packages** bumped to v1.2.0\n *\n * | Package | Previous | Bump |\n * ...\n *\n * ### ✨ Features\n * - **scope** (pkg): subject\n */\nexport function formatLockstepChangelog(\n packages: PackageRelease[],\n version: string,\n locale: 'en' | 'ru' = 'en',\n): string {\n const lines: string[] = [];\n const date = new Date().toISOString().split('T')[0]!;\n\n // Header\n lines.push(`## [${version}] - ${date}`);\n lines.push('');\n\n const pkgCount = packages.length;\n const pkgWord = locale === 'ru' ? 'пакетов' : pkgCount === 1 ? 'package' : 'packages';\n lines.push(`**${pkgCount} ${pkgWord}** bumped to v${version}`);\n lines.push('');\n\n // Packages table — only show packages that actually changed (bump !== 'none')\n const changed = packages.filter(p => p.bump !== 'none');\n if (changed.length > 0) {\n const colPkg = locale === 'ru' ? 'Пакет' : 'Package';\n const colPrev = locale === 'ru' ? 'Предыдущая' : 'Previous';\n const colBump = locale === 'ru' ? 'Тип' : 'Bump';\n lines.push(`| ${colPkg} | ${colPrev} | ${colBump} |`);\n lines.push(`|---------|----------|------|`);\n for (const pkg of changed) {\n lines.push(`| \\`${pkg.name}\\` | ${pkg.prev} | ${pkg.bump} |`);\n }\n lines.push('');\n }\n\n // Breaking changes (all packages combined, deduplicated by summary)\n const allBreaking = deduplicateBySummary(\n packages.flatMap(p => (p.breaking || []).map(b => ({ ...b, _pkg: p.name })))\n );\n if (allBreaking.length > 0) {\n lines.push(`### ${t('breaking_changes', locale)}`);\n lines.push('');\n for (const b of allBreaking) {\n lines.push(`- **${b.summary}**`);\n if (b.notes) {lines.push(` ${b.notes}`);}\n }\n lines.push('');\n }\n\n // Collect all non-chore changes, deduplicated by SHA\n const seenShas = new Set<string>();\n const allChanges: Array<{ change: Change; packageName: string }> = [];\n\n for (const pkg of packages) {\n for (const change of pkg.changes) {\n if (seenShas.has(change.sha)) {continue;}\n if (['chore', 'build', 'ci', 'style', 'test'].includes(change.type)) {continue;}\n seenShas.add(change.sha);\n allChanges.push({ change, packageName: pkg.name });\n }\n }\n\n // Group by type\n const grouped = new Map<CommitType, Array<{ change: Change; packageName: string }>>();\n for (const item of allChanges) {\n const type = item.change.type;\n if (!grouped.has(type)) {grouped.set(type, []);}\n grouped.get(type)!.push(item);\n }\n\n // Render grouped changes\n const typeOrder: CommitType[] = ['feat', 'fix', 'perf', 'refactor', 'docs', 'revert'];\n for (const type of typeOrder) {\n const items = grouped.get(type);\n if (!items || items.length === 0) {continue;}\n\n lines.push(`### ${formatSectionTitle(type, locale)}`);\n lines.push('');\n for (const { change, packageName } of items) {\n const scopePart = change.scope ? `**${change.scope}**` : '**global**';\n // Show package name in parentheses when scope doesn't identify the package\n const pkgHint = change.scope === packageName || allChanges.filter(i => i.change.sha === change.sha).length === 1\n ? ''\n : ` *(${packageName})*`;\n lines.push(`- ${scopePart}: ${change.subject}${pkgHint}`);\n }\n lines.push('');\n }\n\n if (allChanges.length === 0) {\n const noChanges = locale === 'ru' ? 'Без функциональных изменений.' : 'No functional changes.';\n lines.push(`*${noChanges}*`);\n lines.push('');\n }\n\n return lines.join('\\n').trimEnd();\n}\n\nfunction deduplicateBySummary<T extends { summary: string }>(items: T[]): T[] {\n const seen = new Set<string>();\n return items.filter(item => {\n if (seen.has(item.summary)) {return false;}\n seen.add(item.summary);\n return true;\n });\n}\n","/**\n * LLM-powered changelog formatter with graceful degradation\n * Corporate style like OpenAI/GitHub/Microsoft releases\n */\n\nimport type { PackageRelease, Change } from '../types';\nimport type { ILLM } from '@kb-labs/sdk';\nimport { formatPackageAsMarkdown } from './markdown';\n\n/**\n * Minimal platform interface (duck-typing)\n * Avoids circular dependency on plugin-runtime\n */\ninterface PlatformLike {\n llm?: ILLM;\n isConfigured?(service: string): boolean;\n}\n\n/**\n * Format changelog with LLM (corporate style) or fallback to conventional\n */\nexport async function formatPackageWithLLM(\n platform: PlatformLike | undefined,\n pkg: PackageRelease,\n locale: 'en' | 'ru' = 'en'\n): Promise<string> {\n // 1. Check if LLM is available (simple presence check, no isConfigured needed)\n const llmAvailable = !!platform?.llm;\n\n if (!llmAvailable) {\n // GRACEFUL DEGRADATION: fallback to conventional formatter\n return formatPackageAsMarkdown(pkg, 'standard', locale);\n }\n\n try {\n // TypeScript guard: we already checked llmAvailable above\n const llm = platform.llm!;\n\n // 2. Filter substantial changes (skip chore/build/ci)\n const substantialChanges = pkg.changes.filter(c =>\n !['chore', 'build', 'ci', 'style', 'test'].includes(c.type)\n );\n\n if (substantialChanges.length === 0) {\n return ''; // No substantial changes\n }\n\n // 3. Prepare context for LLM (group by type)\n const grouped = groupByType(substantialChanges);\n const changesContext = Object.entries(grouped)\n .map(([type, changes]) => {\n const items = changes.map(c => ` - ${c.scope ? c.scope + ': ' : ''}${c.subject}`).join('\\n');\n return `${type}:\\n${items}`;\n })\n .join('\\n\\n');\n\n // 4. Corporate-style prompt (OpenAI/GitHub format)\n const prompt = buildCorporatePrompt(pkg, changesContext, locale);\n\n // 5. Call LLM\n const systemPrompt = locale === 'ru'\n ? 'Ты технический писатель, создающий changelog для крупной компании. Пиши профессионально, структурировано и понятно.'\n : 'You are a technical writer creating changelogs for a major company. Write professionally, structured, and clearly.';\n\n const response = await llm.complete(prompt, {\n systemPrompt,\n temperature: 0.7,\n maxTokens: 1500,\n });\n\n // 6. MANDATORY VALIDATION: Verify LLM output\n const formatted = formatLLMResponse(pkg, response.content, locale);\n const validationResult = validateLLMChangelog(formatted, substantialChanges);\n\n if (!validationResult.valid) {\n console.warn(`LLM changelog validation failed: ${validationResult.errors.join(', ')}. Falling back to conventional format.`);\n return formatPackageAsMarkdown(pkg, 'standard', locale);\n }\n\n return formatted;\n\n } catch (error) {\n // GRACEFUL DEGRADATION on LLM error\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.warn(`LLM changelog failed, falling back to conventional: ${errorMessage}`);\n return formatPackageAsMarkdown(pkg, 'standard', locale);\n }\n}\n\n/**\n * Build corporate-style prompt\n */\nfunction buildCorporatePrompt(pkg: PackageRelease, changes: string, locale: 'en' | 'ru'): string {\n const lang = locale === 'ru' ? 'Russian' : 'English';\n\n return `Generate a professional changelog entry for package \"${pkg.name}\" version ${pkg.prev} → ${pkg.next}.\n\nChanges made:\n${changes}\n\nRequirements:\n- Write in ${lang}\n- Professional corporate tone (like OpenAI, GitHub, Microsoft releases)\n- Start with a brief summary paragraph explaining WHAT changed and WHY it matters to users\n- Group changes by category (Features, Improvements, Bug Fixes, etc)\n- Focus on USER IMPACT, not technical details\n- Explain WHY changes matter, not just WHAT changed\n- Use clear, non-technical language when possible\n- Include emoji for readability: ✨ Features, 🐛 Fixes, ⚡ Performance, 📝 Documentation\n\nFormat:\n## ${pkg.name} ${pkg.next}\n\n[1-2 sentence summary paragraph]\n\n### ✨ New Features\n- Clear description of feature and why it's useful\n\n### 🐛 Bug Fixes\n- What was fixed and how it helps users\n\n### ⚡ Performance Improvements\n- What's faster and by how much\n\nDO NOT:\n- List commit SHAs or PR numbers\n- Use technical jargon unnecessarily\n- Mention internal refactoring unless user-facing\n- Include chore/build/ci changes\n\nOutput ONLY the markdown changelog, no explanations.`;\n}\n\n/**\n * Format LLM response with professional footer\n */\nfunction formatLLMResponse(pkg: PackageRelease, llmContent: string, locale: 'en' | 'ru'): string {\n // Add package version header if LLM didn't include it\n let formatted = llmContent;\n if (!formatted.includes(`## ${pkg.name}`)) {\n const header = `## ${pkg.name} ${pkg.next}\\n\\n`;\n formatted = header + formatted;\n }\n\n // Add professional footer\n const footer = buildChangelogFooter(locale);\n formatted = formatted.trimEnd() + '\\n\\n' + footer;\n\n return formatted;\n}\n\n/**\n * Build professional changelog footer\n */\nfunction buildChangelogFooter(locale: 'en' | 'ru'): string {\n const year = new Date().getFullYear();\n\n if (locale === 'ru') {\n return `---\n\n*Сгенерировано автоматически с помощью [**@kb-labs/release-manager**](https://github.com/kb-labs/kb-labs)*\n*Часть экосистемы **KB Labs Platform** — профессиональные инструменты для разработки*\n\n<sub>© ${year} KB Labs. Released under KB Public License v1.1</sub>`;\n }\n\n return `---\n\n*Generated automatically by [**@kb-labs/release-manager**](https://github.com/kb-labs/kb-labs)*\n*Part of the **KB Labs Platform** — Professional developer tools ecosystem*\n\n<sub>© ${year} KB Labs. Released under KB Public License v1.1</sub>`;\n}\n\n/**\n * Group changes by type\n */\nfunction groupByType(changes: Change[]): Record<string, Change[]> {\n const grouped: Record<string, Change[]> = {};\n for (const change of changes) {\n if (!grouped[change.type]) {grouped[change.type] = [];}\n grouped[change.type]!.push(change);\n }\n return grouped;\n}\n\n/**\n * MANDATORY VALIDATION: Verify LLM output is valid and doesn't hallucinate\n *\n * Anti-hallucination checks:\n * 1. Output is not empty\n * 2. Has markdown structure (headers)\n * 3. Doesn't mention commits/changes that don't exist in source data\n * 4. Doesn't invent fake SHAs, PRs, or issues\n */\ninterface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\nfunction validateLLMChangelog(llmOutput: string, sourceChanges: Change[]): ValidationResult {\n const errors: string[] = [];\n\n // 1. Check not empty\n if (!llmOutput || llmOutput.trim().length === 0) {\n errors.push('Empty output');\n return { valid: false, errors };\n }\n\n // 2. Check has markdown structure (at least one header)\n if (!llmOutput.includes('#')) {\n errors.push('No markdown headers found');\n }\n\n // 3. Extract all subjects from source changes (ground truth)\n const sourceSubjects = new Set(sourceChanges.map(c => c.subject.toLowerCase().trim()));\n const sourceScopes = new Set(sourceChanges.map(c => c.scope?.toLowerCase().trim()).filter(Boolean));\n\n // 4. Check for hallucinated SHAs (40-char hex that don't exist)\n const shaPattern = /\\b[0-9a-f]{7,40}\\b/gi;\n const mentionedShas = llmOutput.match(shaPattern) || [];\n const sourceShas = new Set(sourceChanges.map(c => c.sha.toLowerCase()));\n\n for (const sha of mentionedShas) {\n const lowerSha = sha.toLowerCase();\n // Check if this SHA prefix matches any source SHA\n const isValid = Array.from(sourceShas).some(sourceSha => sourceSha.startsWith(lowerSha));\n if (!isValid) {\n errors.push(`Hallucinated SHA: ${sha}`);\n }\n }\n\n // 5. Check for hallucinated PR/issue numbers (should only mention real ones)\n const prPattern = /#(\\d+)/g;\n const mentionedPRs = new Set<string>();\n let match;\n while ((match = prPattern.exec(llmOutput)) !== null) {\n mentionedPRs.add(match[1]!);\n }\n\n const sourceRefs = new Set(sourceChanges.flatMap(c => c.refs.map(r => r.id)));\n for (const pr of mentionedPRs) {\n if (!sourceRefs.has(pr)) {\n errors.push(`Hallucinated PR/issue: #${pr}`);\n }\n }\n\n // 6. Validate line count is reasonable (not truncated, not too verbose)\n const lineCount = llmOutput.split('\\n').length;\n if (lineCount < 3) {\n errors.push('Output too short (< 3 lines)');\n }\n if (lineCount > 200) {\n errors.push('Output too verbose (> 200 lines)');\n }\n\n // 7. Check output doesn't include forbidden patterns (signs of hallucination)\n const forbiddenPatterns = [\n /\\[REDACTED\\]/i,\n /\\[PLACEHOLDER\\]/i,\n /\\[TODO\\]/i,\n /\\[EXAMPLE\\]/i,\n ];\n\n for (const pattern of forbiddenPatterns) {\n if (pattern.test(llmOutput)) {\n errors.push(`Forbidden pattern found: ${pattern.source}`);\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n","/**\n * Template system types for changelog customization\n */\n\nimport type { PackageRelease, Change, CommitType, BreakingChange, VersionBump } from '../types';\nimport type { ILLM, ILogger, IAnalytics } from '@kb-labs/sdk';\n\n/**\n * Changelog group definition — maps scopes to a named section\n */\nexport interface ChangelogGroup {\n title: string;\n emoji?: string;\n scopes: string[];\n}\n\n/**\n * Template data structure passed to render function\n */\nexport interface TemplateData {\n package: {\n name: string;\n prev: string;\n next: string;\n bump: VersionBump;\n reason: 'breaking' | 'feat' | 'fix' | 'perf' | 'ripple' | 'manual';\n rippleFrom?: string[];\n };\n breaking: BreakingChange[];\n changes: Partial<Record<CommitType, Change[]>>;\n locale: 'en' | 'ru';\n metadata?: Record<string, unknown>; // Custom user metadata from config\n /** Groups config from changelog.groups — if present, template should render by groups instead of by type */\n groups?: ChangelogGroup[];\n}\n\n/**\n * Minimal platform interface for LLM access, logging, and analytics\n */\nexport interface PlatformLike {\n llm?: ILLM;\n logger?: ILogger;\n analytics?: IAnalytics;\n}\n\n/**\n * Template contract - all templates must implement this interface\n *\n * Templates can be sync (fast) or async (with LLM enhancement)\n */\nexport interface ChangelogTemplate {\n /**\n * Template API version (semver major)\n * Current: '1.0'\n */\n version: '1.0';\n\n /**\n * Render changelog for a package\n * @param data Template data with package info, changes, etc\n * @param platform Optional platform for LLM access\n * @returns Markdown-formatted changelog string (sync or async)\n */\n render(data: TemplateData, platform?: PlatformLike): string | Promise<string>;\n}\n\n/**\n * Helper to group changes by type\n */\nexport function groupChangesByType(changes: Change[]): Partial<Record<CommitType, Change[]>> {\n const grouped: Partial<Record<CommitType, Change[]>> = {};\n\n for (const change of changes) {\n const type = change.type;\n if (!grouped[type]) {\n grouped[type] = [];\n }\n grouped[type]!.push(change);\n }\n\n return grouped;\n}\n\n/**\n * Convert PackageRelease to TemplateData\n */\nexport function packageToTemplateData(\n pkg: PackageRelease,\n locale: 'en' | 'ru' = 'en',\n metadata?: Record<string, unknown>,\n groups?: ChangelogGroup[]\n): TemplateData {\n return {\n package: {\n name: pkg.name,\n prev: pkg.prev,\n next: pkg.next,\n bump: pkg.bump,\n reason: pkg.reason,\n rippleFrom: pkg.rippleFrom,\n },\n breaking: pkg.breaking,\n changes: groupChangesByType(pkg.changes),\n locale,\n metadata,\n groups,\n };\n}\n","/**\n * Template loader with validation\n *\n * Loads built-in or custom user templates from filesystem\n */\n\nimport { pathToFileURL, fileURLToPath } from 'node:url';\nimport { join, isAbsolute, dirname } from 'node:path';\nimport { access } from 'node:fs/promises';\nimport type { ChangelogTemplate } from './types';\n\n// Get current file directory in ESM\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Built-in template names\n */\nexport const BUILTIN_TEMPLATES = ['corporate', 'corporate-ai', 'technical', 'compact'] as const;\nexport type BuiltinTemplate = typeof BUILTIN_TEMPLATES[number];\n\n/**\n * Load a changelog template\n *\n * @param templateName Template name (builtin) or path (custom)\n * @param cwd Current working directory (for resolving relative paths)\n * @returns Loaded and validated template\n */\nexport async function loadTemplate(\n templateName: string,\n cwd: string\n): Promise<ChangelogTemplate> {\n // Check if builtin template\n if (isBuiltinTemplate(templateName)) {\n return loadBuiltinTemplate(templateName);\n }\n\n // Load custom template from filesystem\n return loadCustomTemplate(templateName, cwd);\n}\n\n/**\n * Check if template name is a built-in template\n */\nfunction isBuiltinTemplate(name: string): name is BuiltinTemplate {\n return (BUILTIN_TEMPLATES as readonly string[]).includes(name);\n}\n\n/**\n * Load built-in template\n */\nasync function loadBuiltinTemplate(name: BuiltinTemplate): Promise<ChangelogTemplate> {\n try {\n // Use absolute path from current module directory\n // loader.ts is in src/templates/, compiled to dist/index.js\n // templates are in dist/templates/builtin/\n const templatePath = join(__dirname, 'templates', 'builtin', `${name}.js`);\n const templateUrl = pathToFileURL(templatePath).href;\n const module = await import(templateUrl);\n return validateTemplate(module, name);\n } catch (error) {\n throw new Error(\n `Failed to load built-in template \"${name}\": ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Load custom template from filesystem\n */\nasync function loadCustomTemplate(templatePath: string, cwd: string): Promise<ChangelogTemplate> {\n // Resolve path (relative or absolute)\n const fullPath = isAbsolute(templatePath) ? templatePath : join(cwd, templatePath);\n\n // Check if file exists\n try {\n await access(fullPath);\n } catch {\n throw new Error(`Template file not found: ${fullPath}`);\n }\n\n // Load module (supports .ts, .js, .mjs)\n try {\n // Convert to file:// URL for dynamic import\n const fileUrl = pathToFileURL(fullPath).href;\n const module = await import(fileUrl);\n\n return validateTemplate(module, templatePath);\n } catch (error) {\n throw new Error(\n `Failed to load custom template \"${templatePath}\": ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Validate template module\n */\nfunction validateTemplate(module: any, templateName: string): ChangelogTemplate {\n // Check version field\n if (!module.version || module.version !== '1.0') {\n throw new Error(\n `Template \"${templateName}\" has invalid version (expected \"1.0\", got \"${module.version || 'undefined'}\")`\n );\n }\n\n // Check render function\n if (typeof module.render !== 'function') {\n throw new Error(`Template \"${templateName}\" must export a render() function`);\n }\n\n return module as ChangelogTemplate;\n}\n\n/**\n * List available built-in templates with descriptions\n */\nexport function listBuiltinTemplates(): Array<{ name: string; description: string }> {\n return [\n {\n name: 'corporate',\n description: 'Professional changelog with emoji and grouped sections (sync, fast)',\n },\n {\n name: 'corporate-ai',\n description: 'Corporate format with AI-enhanced descriptions (async, smart)',\n },\n {\n name: 'technical',\n description: 'Developer-focused with commit SHAs, authors, and all commit types',\n },\n {\n name: 'compact',\n description: 'Minimal one-line format for quick release notes',\n },\n ];\n}\n","/**\n * Changelog Generator - Reusable changelog generation logic\n * Used by both release:run and release:changelog commands\n */\n\nimport type { Change, PackageRelease, ReleaseManifest, GitRange } from './types';\nimport type { ILLM, ILogger, IAnalytics } from '@kb-labs/sdk';\nimport { resolveGitRange } from './git-range';\nimport { parseCommits } from './parser';\nimport { detectProvider, enhanceChangeWithLinks } from './providers';\nimport { createReleaseManifest, formatAsJson } from './formatters/json';\nimport { loadTemplate, packageToTemplateData } from './templates';\n\nconst CHANGELOG_LLM_TIMEOUT_MS = 45_000;\n\nasync function renderWithTimeout(result: string | Promise<string>): Promise<string> {\n if (typeof result === 'string') return result;\n return Promise.race([\n result,\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error('Changelog LLM render timeout after 45s')), CHANGELOG_LLM_TIMEOUT_MS)\n ),\n ]);\n}\n\n/**\n * Package info for changelog generation\n */\nexport interface ChangelogPackageInfo {\n name: string;\n path: string;\n currentVersion: string;\n nextVersion: string;\n bump: 'patch' | 'minor' | 'major' | 'none';\n}\n\n/**\n * Changelog generation options\n */\nexport interface GenerateChangelogOptions {\n /** Root directory of the repository */\n repoRoot: string;\n /** Git working directory (for submodule support) */\n gitCwd?: string;\n /** Packages to generate changelog for */\n packages: ChangelogPackageInfo[];\n /** Git range options */\n range?: {\n from?: string;\n to?: string;\n sinceTag?: string;\n };\n /** Changelog configuration */\n changelog?: {\n template?: string;\n locale?: 'en' | 'ru';\n metadata?: Record<string, unknown>;\n ignoreAuthors?: string[];\n includeTypes?: string[];\n excludeTypes?: string[];\n collapseMerges?: boolean;\n collapseReverts?: boolean;\n preferMergeSummary?: boolean;\n groups?: Array<{ title: string; emoji?: string; scopes: string[] }>;\n };\n /** Git configuration */\n git?: {\n autoUnshallow?: boolean;\n requireSignedTags?: boolean;\n baseUrl?: string;\n };\n /** Platform services for AI-powered formatting, logging, and analytics */\n platform?: { llm?: ILLM; logger?: ILogger; analytics?: IAnalytics };\n /** Progress callback */\n onProgress?: (message: string) => void;\n}\n\n/**\n * Changelog generation result\n */\nexport interface GenerateChangelogResult {\n /** Generated markdown content */\n markdown: string;\n /** Release manifest (JSON structure) */\n manifest: ReleaseManifest;\n /** Parsed and enhanced changes */\n changes: Change[];\n /** Git range used */\n range: GitRange;\n /** Package releases */\n packages: PackageRelease[];\n}\n\n/**\n * Generate changelog for packages\n *\n * This is the main reusable function for changelog generation.\n * Used by both release:run and release:changelog commands.\n */\nexport async function generateChangelog(\n options: GenerateChangelogOptions\n): Promise<GenerateChangelogResult> {\n const {\n repoRoot,\n gitCwd = repoRoot,\n packages,\n range: rangeOptions,\n changelog: changelogConfig,\n git: gitConfig,\n platform,\n onProgress,\n } = options;\n\n const locale = changelogConfig?.locale || 'en';\n\n // Step 1: Resolve git range\n onProgress?.('Resolving git range...');\n const range = await resolveGitRange({\n cwd: gitCwd,\n from: rangeOptions?.from,\n to: rangeOptions?.to || 'HEAD',\n sinceTag: rangeOptions?.sinceTag,\n autoUnshallow: gitConfig?.autoUnshallow,\n requireSignedTags: gitConfig?.requireSignedTags,\n });\n\n // Step 2: Detect git provider\n onProgress?.('Detecting git provider...');\n const provider = await detectProvider(gitCwd, gitConfig?.baseUrl);\n\n // Step 3: Parse commits\n onProgress?.('Parsing commits...');\n const changes = await parseCommits({\n cwd: gitCwd,\n from: range.from,\n to: range.to,\n ignoreAuthors: changelogConfig?.ignoreAuthors || [],\n includeTypes: changelogConfig?.includeTypes,\n excludeTypes: changelogConfig?.excludeTypes,\n collapseMerges: changelogConfig?.collapseMerges,\n collapseReverts: changelogConfig?.collapseReverts,\n preferMergeSummary: changelogConfig?.preferMergeSummary,\n });\n\n // Step 4: Enhance changes with provider links\n onProgress?.('Enhancing changes with links...');\n const enhancedChanges = changes.map(change => enhanceChangeWithLinks(change, provider));\n\n // Step 5: Build package releases\n onProgress?.('Building package releases...');\n\n // Normalize a package path to a relative-from-gitCwd prefix for matching against\n // filesChanged entries (which git reports relative to gitCwd).\n function normalizePkgPath(pkgPath: string): string {\n // Prefer normalizing relative to gitCwd (where git was run from),\n // then fall back to repoRoot.\n let rel: string;\n if (pkgPath.startsWith(gitCwd)) {\n rel = pkgPath.slice(gitCwd.length).replace(/^\\/+/, '');\n } else if (pkgPath.startsWith(repoRoot)) {\n rel = pkgPath.slice(repoRoot.length).replace(/^\\/+/, '');\n } else {\n rel = pkgPath.replace(/^\\/+/, '');\n }\n return rel.endsWith('/') ? rel : rel + '/';\n }\n\n const packageReleases: PackageRelease[] = packages.map(pkg => {\n const pkgPrefix = normalizePkgPath(pkg.path);\n\n // Filter changes that touched at least one file inside this package's directory.\n // Falls back to all changes when the package sits at repo root (monorepo root release).\n const isRoot = pkgPrefix === '/' || pkgPrefix === '' || pkgPrefix === './';\n const pkgChanges = isRoot\n ? enhancedChanges\n : enhancedChanges.filter(c =>\n !c.filesChanged || c.filesChanged.length === 0\n ? true // keep commits with no file info (e.g. merge commits, empty commits)\n : c.filesChanged.some(f => f.startsWith(pkgPrefix))\n );\n\n const hasBreaking = pkgChanges.some(c => c.breaking && c.breaking.length > 0);\n const hasFeat = pkgChanges.some(c => c.type === 'feat');\n const hasFix = pkgChanges.some(c => c.type === 'fix');\n const hasPerf = pkgChanges.some(c => c.type === 'perf');\n\n let reason: 'breaking' | 'feat' | 'fix' | 'perf' | 'ripple' | 'manual' = 'manual';\n if (hasBreaking) {reason = 'breaking';}\n else if (hasFeat) {reason = 'feat';}\n else if (hasFix) {reason = 'fix';}\n else if (hasPerf) {reason = 'perf';}\n\n return {\n name: pkg.name,\n prev: pkg.currentVersion,\n next: pkg.nextVersion,\n bump: pkg.bump,\n reason,\n breaking: pkgChanges.filter(c => c.breaking && c.breaking.length > 0).flatMap(c => c.breaking!),\n changes: pkgChanges,\n };\n });\n\n // Step 6: Create release manifest\n const manifest = createReleaseManifest(range, packageReleases);\n\n // Step 7: Detect lockstep — all packages share the same next version\n const uniqueNextVersions = new Set(packageReleases.map(p => p.next));\n const isLockstep = packageReleases.length > 1 && uniqueNextVersions.size === 1;\n\n let markdown: string;\n\n // Step 8: Load template and format\n const templateName = changelogConfig?.template || 'corporate-ai';\n onProgress?.(`Loading template \"${templateName}\"...`);\n const template = await loadTemplate(templateName, repoRoot);\n\n if (isLockstep) {\n // Consolidated changelog for lockstep monorepo releases:\n // Merge all packages into one virtual release and render through template\n onProgress?.('Formatting consolidated lockstep changelog...');\n const sharedVersion = packageReleases[0]!.next;\n const sharedPrev = packageReleases[0]!.prev;\n\n // Use ALL parsed changes (not just package-filtered ones) for lockstep changelog.\n // Package filtering can miss root-level commits (e.g. config, CI, docs) that don't\n // touch files inside packages/ directories but are still part of the release.\n const mergedChanges = enhancedChanges;\n\n // Merge breaking changes from all commits\n const seenBreaking = new Set<string>();\n const mergedBreaking = enhancedChanges\n .filter(c => c.breaking && c.breaking.length > 0)\n .flatMap(c => c.breaking!)\n .filter(b => {\n if (seenBreaking.has(b.summary)) {return false;}\n seenBreaking.add(b.summary);\n return true;\n });\n\n // Determine overall reason from merged changes\n const hasBreaking = mergedBreaking.length > 0;\n const hasFeat = mergedChanges.some(c => c.type === 'feat');\n const hasFix = mergedChanges.some(c => c.type === 'fix');\n const hasPerf = mergedChanges.some(c => c.type === 'perf');\n let reason: 'breaking' | 'feat' | 'fix' | 'perf' | 'ripple' | 'manual' = 'manual';\n if (hasBreaking) {reason = 'breaking';}\n else if (hasFeat) {reason = 'feat';}\n else if (hasFix) {reason = 'fix';}\n else if (hasPerf) {reason = 'perf';}\n\n // Build scope display name\n const scopeName = packages.length > 0 ? packages[0]!.name.replace(/\\/[^/]+$/, '') : 'monorepo';\n\n // Build lockstep header with packages table\n const date = new Date().toISOString().split('T')[0]!;\n const pkgWord = locale === 'ru' ? 'пакетов' : packages.length === 1 ? 'package' : 'packages';\n const headerLines: string[] = [\n `## [${sharedVersion}] - ${date}`,\n '',\n `**${packageReleases.length} ${pkgWord}** bumped to v${sharedVersion}`,\n '',\n `| ${locale === 'ru' ? 'Пакет' : 'Package'} | ${locale === 'ru' ? 'Предыдущая' : 'Previous'} | ${locale === 'ru' ? 'Тип' : 'Bump'} |`,\n `|---------|----------|------|`,\n ...packageReleases.filter(p => p.bump !== 'none').map(p => `| \\`${p.name}\\` | ${p.prev} | ${p.bump} |`),\n '',\n ];\n\n // Render merged changes through template (gets LLM enhancement)\n const mergedRelease: PackageRelease = {\n name: scopeName,\n prev: sharedPrev,\n next: sharedVersion,\n bump: packageReleases[0]!.bump,\n reason,\n breaking: mergedBreaking,\n changes: mergedChanges,\n };\n\n onProgress?.('Enhancing lockstep changelog with template...');\n const templateData = packageToTemplateData(mergedRelease, locale, changelogConfig?.metadata, changelogConfig?.groups);\n const rendered = await renderWithTimeout(template.render(templateData, platform));\n\n // Strip the template's own header (## [version] - date + blockquote) — we use lockstep header instead\n const renderedLines = rendered.split('\\n');\n let contentStartIdx = 0;\n for (let i = 0; i < renderedLines.length; i++) {\n const line = renderedLines[i]!;\n // Skip header lines: ## [version], empty lines, and > blockquote\n if (line.startsWith('## [') || line.startsWith('> **') || line.trim() === '') {\n contentStartIdx = i + 1;\n } else {\n break;\n }\n }\n const contentBody = renderedLines.slice(contentStartIdx).join('\\n').trim();\n\n markdown = headerLines.join('\\n') + (contentBody ? '\\n' + contentBody : `\\n*${locale === 'ru' ? 'Без функциональных изменений.' : 'No functional changes.'}*`);\n } else {\n // Format each package separately through template\n const formattedPackages: string[] = [];\n for (let i = 0; i < packageReleases.length; i++) {\n const pkg = packageReleases[i];\n if (!pkg) {continue;}\n\n onProgress?.(`Formatting changelog for ${pkg.name} (${i + 1}/${packageReleases.length})...`);\n\n const templateData = packageToTemplateData(pkg, locale, changelogConfig?.metadata, changelogConfig?.groups);\n const formatted = await renderWithTimeout(template.render(templateData, platform));\n\n formattedPackages.push(formatted);\n }\n\n markdown = formattedPackages.join('\\n\\n');\n }\n\n return {\n markdown,\n manifest: JSON.parse(formatAsJson(manifest)),\n changes: enhancedChanges,\n range,\n packages: packageReleases,\n };\n}\n\n/**\n * Generate simple fallback changelog (no LLM, no templates)\n */\nexport function generateSimpleChangelog(\n packages: ChangelogPackageInfo[],\n locale: 'en' | 'ru' = 'en'\n): string {\n const date = new Date().toISOString().split('T')[0]!;\n\n // Detect lockstep (all packages share same next version)\n const uniqueVersions = new Set(packages.map(p => p.nextVersion));\n const isLockstep = packages.length > 1 && uniqueVersions.size === 1;\n\n if (isLockstep) {\n const version = packages[0]!.nextVersion;\n const title = locale === 'ru' ? 'Релиз' : 'Release';\n const pkgWord = locale === 'ru' ? 'пакетов' : packages.length === 1 ? 'package' : 'packages';\n const lines: string[] = [\n `## [${version}] - ${date}`,\n '',\n `**${packages.length} ${pkgWord}** bumped to v${version}`,\n '',\n `| Package | Previous | Bump |`,\n `|---------|----------|------|`,\n ...packages.map(p => `| \\`${p.name}\\` | ${p.currentVersion} | ${p.bump} |`),\n ];\n return lines.join('\\n');\n }\n\n const title = locale === 'ru' ? 'Релиз' : 'Release';\n const lines: string[] = [`## [${date}] ${title}\\n\\n`];\n\n for (const pkg of packages) {\n lines.push(`- **${pkg.name}**: ${pkg.currentVersion} → ${pkg.nextVersion}`);\n }\n\n return lines.join('\\n');\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kb-labs/release-manager-changelog",
3
3
  "description": "KB Labs Release Manager - conventional commits parser and changelog generator",
4
- "version": "2.85.0",
4
+ "version": "2.87.0",
5
5
  "type": "module",
6
6
  "author": {
7
7
  "name": "Kirill Baranov",
@@ -36,7 +36,7 @@
36
36
  "tsup": "^8.5.0",
37
37
  "typescript": "^5.6.3",
38
38
  "vitest": "^3.2.4",
39
- "@kb-labs/devkit": "2.85.0"
39
+ "@kb-labs/devkit": "2.87.0"
40
40
  },
41
41
  "engines": {
42
42
  "node": ">=20.0.0",